Know a good article or link that we're missing? Submit it!

View \FOS.PAS

Modem Protocol Source Codes (Pascal).

Submitted By: WEBMASTER
Rating: (Not rated) (Rate It)


(*
    FOS.PAS - Communications subroutines for the ibm pc
    Fossil.pas (12/24/91)
    Modified Send() to use with Sealink.  Sends CHAR not byte.

FUNCTION  Com_Baud          - Returns baudrate of connection. (getfosinfo 1st)
FUNCTION  Carrier           - Returns status of Carrier on PortNumber.
FUNCTION  CK                - Returns status if user hit Ctrl-C/Ctrl-K.
PROCEDURE CloseFossil       - Terminates output to the Fossil.
FUNCTION  Com_              - General Purpose Comm function.
FUNCTION  Com_Data          - Returns data bits (getfosinfo 1st)
FUNCTION  Com_Parity        - Returns Parity as char (N,E,O) (getfosinfo 1st)
FUNCTION  Com_Stop          - Returns stop bits (getfosinfo 1st)
PROCEDURE Comm_Set_Baud     - Set Baud, Parity, Data Bits, Stop Bits.
FUNCTION  Comm_Transmit     - Returns STATUS bits of a transmit with wait.
PROCEDURE FlushBuff         - Flush Outbound buffer (fossil).
PROCEDURE FlowControl       - Establish flow control.
FUNCTION  FPresent          - Checks if Fossil installed (no init).
PROCEDURE GetFosInfo        - Fills the FosInfo structure variable.
PROCEDURE HangUpPhone       - Hangs up the telephone - fossil.
FUNCTION  KeyChar           - Checks if char is available from keyboard.
PROCEDURE ModemPut          - Sends commands to the modem.  Like BINKLEYTERM
FUNCTION  OpenFossil        - Checks to see if Fossil installed.
FUNCTION  OutEmpty          - Returns TRUE if output buffer is empty.
PROCEDURE PurgeLine         - Purge the receive buffer.
PROCEDURE PurgeOutput       - Purges the output (transmit) buffer.
PROCEDURE ReadBlk           - Reads a block from the communications port.
FUNCTION  ReadLine          - Return ORD of char received or TIMEOUT.
FUNCTION  Receive           - Fossil receive a character.
PROCEDURE Send              - Fossil transfer a character.
PROCEDURE SendBlk           - Send a block of chars through port.
PROCEDURE SendText          - Sends a string to the modem
FUNCTION  SerialChar        - Checks if char is available from PortNum.
PROCEDURE SetBaudRate       - Change baud rate of communications port. N-8-1
PROCEDURE SetCheck          - Turns Ctrl-C/Ctrl-K checking on/off.
PROCEDURE SetDTR            - Toggles status of DTR.
*)


UNIT Fos;

interface

type  FosData = record
         ssize    : word;
         version  : byte;
         revision : byte;
         segment  : word{ id : longint }
         offset   : word;
         rcvbuf   : word;
         i_avail  : word;
         sndbuf   : word;
         o_avail  : word;
         width    : byte;
         height   : byte;
         baud     : byte;
      end;

const loopspersec = 6500;
      timeout  = 256;

var PortNum : word;
    BaudRate: word;
    Parity  : Char;
    DataBits: Byte;
    StopBits: Byte;
    FosInfo : FosData;
    FossilIDStr : string;

function  carrier : boolean;
function  ck : boolean;
procedure closefossil;
function  com_baud(baud:byte) : word;
function  com_data(baud:byte):byte;
function  com_parity(baud:byte):char;
function  com_stop(baud:byte):byte;
procedure comm_set_baud( baud:word; parity : char; data, stop : byte);
procedure flushbuff;
procedure flowcontrol(kind:byte);
function  fpresent : boolean;
procedure getfosinfo( var fosinfo : fosdata);
procedure hangupphone;
function  keychar : boolean;
procedure modemput(initstr:string);
function  openfossil : boolean;
function  outempty : boolean;
procedure purgeline;
procedure purgeoutput;
procedure readblk(segment,offset,count:word);
function  readline(seconds:integer): integer;
function  receive : char;
procedure send(letter : char);
procedure setbaudrate ( baud : word);
procedure setcheck( on : boolean);
procedure setdtr( a : boolean);
function  serialchar : boolean;
procedure sendtext(initstr : string);
procedure sendblk( Seg_Ment, Off_Set, count:word);

implementation

uses crt,
     dos;

type
    ptrmask = record   { segment:offset mask for address pointers }
       poff : word;
       pseg : word;
    end;

var regs : registers;

{---------------------------- ASCIIZ to string ----------------------------}
function Asc2Str(var s; max: byte): string;
{ Converts an ASCIIZ string to a Turbo Pascal string with a max length: max. }
var starray  : array[1..255] of char absolute s;
    len      : integer;
begin
     len        := pos(#0,starray)-1;                       { Get the length }
     if (len > max) or (len < 0) then               { length exceeds maximum }
       len      := max;                                  { so set to maximum }
     Asc2Str    := starray;
     Asc2Str[0] := chr(len);                                    { Set length }
end{ Asc2Str }

function com_baud(baud:byte):word;
begin
  baud := baud shr 5;
  case baud of
    $02 : com_baud :=   300;
    $03 : com_baud :=   600;
    $04 : com_baud :=  1200;
    $05 : com_baud :=  2400;
    $06 : com_baud :=  4800;
    $07 : com_baud :=  9600;
    $00 : com_baud := 19200;
    $01 : com_baud := 38400;
  else
    com_baud := 1200;
  end;
end;


function fpresent : boolean;             (* FOSSIL there? *)
Var Int14Vec : Pointer;
begin
  GetIntVec($14, Int14Vec);
  FPresent := (MemW[Seg(Int14Vec^):Ofs(Int14Vec^) + 6] = $1954);
end;


function openfossil : boolean;
begin
  regs.ah := $04;
  regs.dx := PortNum;
  Intr($14,regs); { TPX00( regs) ; }
  OpenFossil := (Regs.AX = $1954);
end;


function ck : boolean;
begin
   ck := FALSE;
   if keypressed then
      ck := (readkey in [#3,#11])
   else if serialchar then ck := (receive in [#3,#11]);
end;


procedure closefossil;
begin
  asm
     mov ah, 5
     mov dx, portnum
     int 14h
  end;
end;


function com_data(baud:byte):byte; { pass it: FossInfo.baud }
var p : boolean;
begin
    p := (baud and $03) = $03;
    if p then com_data := 8 else com_data := 7;
end;


function com_parity(baud:byte):char; { pass it: FossInfo.baud }
var p : boolean;
begin
    p := (baud and $18) = $18;
    if p then com_parity := 'E' else begin
       p := (baud and $08) = $08;
       if p then com_parity := 'O' else com_parity := 'N';
    end;
end;


function com_stop(baud:byte):byte; { pass it: FossInfo.baud }
begin
  com_stop := (baud and $04) + 1;
end;


procedure comm_set_baud( baud : word; parity : char; data, stop : byte);
var value : byte;
begin
   Regs.AH := 0;
   Regs.DX := PortNum;
   value := $60;
   case baud of
       300 : value:=$40;
       600 : value:=$60;
      1200 : value:=$80;
      2400 : value:=$A0;
      4800 : value:=$C0;
      9600 : value:=$E0;
     19200 : value:=$00;
     38400 : value:=$20;
   end;
   case upcase(parity) of
   {  'N': value := value OR $10; }
     'E': value := value + $18;
     'O': value := value + $08;
   end;
   case data of
     7 : value := value + $02;
     8 : value := value + $03;
   end;
   case stop of
     2 : value := value + $04;
   end;
   regs.al := value;
   Intr($14,regs);
end;


procedure flowcontrol(kind:byte);
{
call must be 'intelligent', ie. you know what you want.
things are additive.  bits set  0 - enable remote restraint via xon/xoff
                                1 - cts/rts
                                2 - fossil can restrain remote via xon/xoff
}

begin
   asm
     mov AH, 0FH        { Enable/Disable ComPort Flow Control }
     mov AL, kind       { Type of flow control as above       }
     mov DX, Portnum
     int 14H
   end;
end;


procedure setbaudrate ( baud : word); { issues N-8-1 }
begin
   case baud of
       300 : Regs.AL:=$43;
       600 : Regs.AL:=$63;
      1200 : Regs.AL:=$83;
      2400 : Regs.AL:=$A3;
      4800 : Regs.AL:=$C3;
      9600 : Regs.AL:=$E3;
     19200 : Regs.AL:=$03;
     38400 : Regs.AL:=$23;
   else
      regs.al := $63;
   end;
   regs.ah := $00;
   regs.dx := Portnum;
   Intr($14, regs);
end;


function carrier : boolean;
begin
asm
      mov  dx, PortNum
      mov  ah, 3
      int  14H
      xor  dl, dl
      and  al, 80H
      jz   @2
      inc  dl
@2:   mov  @Result, DL
end;
end;


function keychar : boolean;
begin
  asm
       mov  ah, 0DH
       mov  dx, Portnum
       int  14H
       xor  dl, dl
       inc  ax
       jz   @1
       mov  dl, 1
  @1:  mov @Result, dl
  end;
end;


procedure setdtr( A : Boolean); assembler;
asm
     mov ah, 6
     mov dx, Portnum
     mov al, a
     int 14H
end;


function serialchar : boolean;
begin
   asm
       mov  dx, Portnum
       mov  ah, 0CH
       int  14H          { $FF if no characters }
       xor  dl, dl
       inc  ax
       jz   @l1          { would be zero if no characters here }
       inc  dl           { There is one! }
  @l1: mov  @Result, DL
  end;
end;


function receive : char;
begin
   asm
      mov ah, 2
      mov dx, Portnum
      int 14H
      mov @result, al
   end;
end;


function outempty : boolean;
begin
asm
     mov  ah, 3
     mov  dx, PortNum
     int  14H
     xor  dl, dl
     and  ah, 40H
     jz   @l1
     inc  dl
@l1: mov  @Result, DL
end;
end;


procedure send(Letter : char);
Begin
  while not outempty do;
  asm
       mov AH, 01H
       mov AL, Letter
       mov dx, PortNum
       int 14H
  end;
end;


procedure flushbuff; assembler;
asm
   mov ah, 8
   mov dx, portnum
   int 14h
end;


procedure getfosinfo( var fosinfo : fosdata);
{ Must issue call to OpenFossil before running this procedure.}
var  p    : ^byte;
     s    : string;
begin
   regs.ah := $1B;
   regs.cx := SizeOf(fosinfo);
   regs.es := Seg(fosinfo);
   regs.di := Ofs(fosinfo);
   regs.dx := PortNum;
   intr($14,regs);
   p := ptr(fosinfo.offset,fosinfo.segment);
   s := Asc2Str(p^ , 255);
   FossilIdStr := s;
end;


procedure modemput( initstr : String); { send a command to modem }
var i: integer;
begin
  for i := 1 to length(initstr) do begin
    case initstr[i] of
      '-' : begin end;      { Hyphen        Stripped            }
      '.' : send(',');      { Period        Translated to Comma }
      '^' : setdtr(TRUE);   { Carat         Raise DTR Line      }
      '`' : delay(50);      { Accent Mark   1/20th Second Delay }
      'v' : setdtr(FALSE){ Lower Case V  Lower DTR Line      }
      '|' : send(#13);       { Pipe,Bar      Carriage Return Sent}
      '~' : delay(1000);    { Tilde         1 Second Delay      }
    else Send(initstr[i]);
    end; { case }
    delay(10);
  end; { for }
  {FlushBuff;}
  Delay(500);
end;


function readline(seconds:integer): integer;
var j : integer;
begin
    j := loopspersec * seconds;
    repeat
      dec(j)
    until SerialChar OR (j = 0);
    IF j = 0 THEN
       READLINE := timeout
    ELSE READLINE := ORD(Receive);
end;


procedure purgeline; assembler;
asm
    mov ah, 0aH
    mov dx, Portnum
    Int 14H
end;


procedure purgeoutput; assembler;
asm
   mov ah, 9
   mov dx, PortNum
   int 14H
end;


procedure setcheck( on : boolean); assembler;
asm
    mov ah,  10H
    mov dx,  Portnum
    mov al,  on
    int 14H
end;


procedure sendtext(initstr: string);
var i: integer;
begin
   for i := 1 to ord(initstr[0]) DO send(initstr[i]);
end;


procedure hangupphone;
var i : integer;
    regs : Registers;
begin
  setdtr(false);
  delay(1000);
  repeat
     delay(500);
     inc(i);
  until (not carrier) OR (i >= 5);
  if carrier then write(#07+#07+#07+#07,'*Hangup Manually*');
  setdtr(true);
end;


PROCEDURE SendBlk(Seg_Ment, Off_Set, count : word);
begin
(*
   regs.es := seg_ment;
   while (count > 0) do
   begin
      regs.ah := $19;
      regs.di := off_set;
      regs.cx := count;
      regs.dx := PortNum;
      intr($14,regs);
      count := count - regs.ax;
      off_set := off_set + regs.ax;
   end;
*)

asm
      mov ES, Seg_Ment
 @1:  mov CX, Count
      mov AH, 19H
      mov DI, Off_Set
      mov DX, PortNum
      int 14H
      sub Count, AX
      add Off_Set, AX
      cmp Count, 0
      jnz @1
end;
end;


PROCEDURE ReadBlk(segment,offset,count : word );
begin
   regs.es := segment;
   while (count > 0) do begin
      regs.ah := $18;
      regs.di := offset;
      regs.cx := count;
      regs.dx := PortNum;
      intr($14,regs);
      count := count - regs.ax;            { # of chars to go }
      offset := offset + regs.ax;
   end;
end;

end.

corner
© 1996-2008 CommunityHeaven LLC. All rights reserved. Reproduction in whole or in part, in any form or medium without express written permission is prohibited.
Violators of this policy may be subject to legal action. Please read our Terms Of Use and Privacy Statement for more information.
North American business development: Nicolai Wadstrom. Publisher: Lars Hagelin.