unit modem;
interface
uses crt,dos;
const RBR=$3F8; THR=$3F8; DLL=$3F8; DLM=$3F9; IER=$3F9;
IIR=$3FA; LCR=$3FB; MCR=$3FC; LSR=$3FD; MSR=$3FE;
intnum=255;
var icomoffset:integer;
procedure mfunc (var r:registers; ahval,alval:byte);
procedure sendchar (k:char);
function numchars:integer;
function getchar:char;
procedure hangup;
procedure setoutbuffer (size:integer);
procedure setparam (comnum:byte; baud:integer; parity:boolean);
function carrier:boolean;
function driverpresent:boolean;
procedure setterminalready (b:boolean);
implementation
procedure mfunc (var r:registers; ahval,alval:byte);
begin
r.ax:=alval+(ahval shl 8);
intr (intnum,r)
end;
procedure sendchar (k:char);
var r:registers;
begin
mfunc (r,3,ord(k))
end;
function numchars:integer;
var r:registers;
begin
mfunc (r,1,0);
numchars:=r.ax
end;
function getchar:char;
var r:registers;
begin
mfunc (r,2,0);
getchar:=chr(r.ax and 255)
end;
procedure hangup;
var r:registers;
begin
mfunc (r,6,0);
delay (200)
end;
procedure setoutbuffer (size:integer);
var r:registers;
begin
r.bx:=size;
mfunc (r,8,0)
end;
procedure setparam (comnum:byte; baud:integer; parity:boolean);
var r:registers;
p:byte;
begin
mfunc (r,0,comnum);
r.bx:=baud;
if parity then p:=1 else p:=0;
mfunc (r,7,p);
setoutbuffer (baud div 30);
case comnum of
1:icomoffset:=0;
2:icomoffset:=-256
end
end;
function carrier:boolean;
begin
carrier:=(port[msr+icomoffset] and 128)=128
end;
function driverpresent:boolean;
begin
driverpresent:=memw[memw[0:intnum*4+2]:memw[0:intnum*4]]=7686
end;
procedure setterminalready (b:boolean);
begin
port [icomoffset+mcr]:=ord(b) or 8
end;
begin
end.