Pascal Modem

Modem

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.