'===========================================================================
' Subject: COMMUNICATIONS LIBRARY FOR PB      Date: 03-06-99 (13:59)       
'  Author: Eran Meuhas                        Code: PB                     
'  Origin: meuhas@surfree.co.il             Packet: MODEM.ABC
'===========================================================================
'
dim BaseAddress as shared integer
'
port%=0
' port% is zero based (0=1, 1=2..)
BaseAddress%=GetComAddress(port%)
'
'
end
'
sub SendStr(byval s$)
    for i%=1 to len(s$)
        do: Status%=inp(BaseAddress%+5): loop until bit(Status%,5)=1
        out BaseAddress%, asc(mid$(s$,i%,1))
    next
    i%=0
    do: Status%=inp(BaseAddress%+5): incr i%: loop until bit(Status%,6)=1 or i%=32000
end sub

function Carrier%
    for i%=1 to 3000: next                                        'A small delay, for the modem
    function=inp(BaseAddress%+6) and &h80
end function

sub DropCarrier
    delay 0.1
    d%=inp(BaseAddress%+4)
    bit reset d%, 0
    out BaseAddess%+4, d%
    delay 0.3
    bit set d%, 0
    out BaseAddess%+4, d%
end sub

function GetBuff$
    s$=""
    do
        for i%=1 to 50: Status%=inp(BaseAddress%+5): next
        if bit(Status%,0)=1 then s$=s$+chr$(inp(BaseAddress%)) else exit do
    loop
    function=s$
end function

function DataWaiting%
    Status%=inp(BaseAddress%+5)
    function=bit(Status%,0)=1
end function

function BaudRate&
    'returns the current baud rate of current port
    BaudRate& = 0
    OUT BaseAddress% + 3, INP(BaseAddress% + 3) OR &H80
    LSB% = INP(BaseAddress%)
    MSB% = INP(BaseAddress% + 1)
    OUT BaseAddress% + 3, INP(BaseAddress% + 3) AND &H7F
    Divisor& = (MSB% * &H100) + LSB%
    IF Divisor& THEN BaudRate& = 115200 \ Divisor&
end function

function GetComAddress%(byval port%)
    p% = Port% * 2 + &H3FE
    DEF SEG = 0
    GetComAddress% = PEEKI(p%)
    '!   push    DS                      ; save DS for PowerBASIC
    '!   mov     BX, port%           ; put port number in BX
    '!   shl     BX, 1                    ; multiply it times 2
    '!   add     BX, &H3FE          ; add 3FEh to it
    '!   xor     DX, DX                 ; access bios data area
    '!   mov     DS, DX               ; put segment into DS
    '!   mov     AX, DS: [BX]       ; get port address
    '!   mov     FUNCTION, AX   ; return to calling program
    '!   pop     DS                       ; restore DS for PowerBASIC
end function

sub PurgeBuff
    if BaseAddress%>0 then
        do until DataWaiting%=0: s$=GetBuff$: loop
    end if
    do until inkey$="": loop
end sub
