[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]


(*    ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
      Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û
      Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û
      Û°°°°°°°ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ°°°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ                                         ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ °°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ °°°°°°°ÛÛÛÛÛÛ°°°°ÛÛÛÛÛÛÛ°°°ÛÛÛÛÛÛÛ°°ÛÛ°°ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛÛÛÛÛÛ°°Û      Û°°°Û       °°Û       °ÛÛ °ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ      °Û °°°°°Û °°ÛÛÛÛÛÛÛ °°ÛÛÛÛÛÛÛ °ÛÛ °ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ °°°°°°Û °°°°°Û °°°     Û °°°     Û °ÛÛ °ÛÛ °°°°°°°°°°°°Û
      Û°°°°°°°ÛÛ °°°°°°°ÛÛÛÛÛÛ  °°ÛÛÛÛÛÛÛ °°ÛÛÛÛÛÛÛ °ÛÛ °ÛÛÛÛÛÛÛÛ°°°°°°°Û
      Û°°°°°°°°  °°°°°°°°      °°°°       °°°       °°  °         °°°°°°Û
      Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û
      Û°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°°Û
      ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
   þ  FIDO/OPUS/SEADOG/Standard Interface Layer  þ           Version 1.02

      Interface for X00 and BNU Fossil Driver(s)

      Written by: Mike Whitaker  *)

{$R-,S-,I-,D-,F+,V-,B-,N-}

Unit Fossil;

Interface

Uses Dos, Crt;

Const  CTS_RTS  = 2;    { To Control Flow Control }
       XON_XOFF = 9;

Type Fossil_Struct = Record
       StructSize : Word;
       MajorVer   : Byte;
       MinVer     : Byte;
       FOS_ID     : Array [1..2] of Word;
       Inp_Buffer : Word;
       Recv_Bytes : Word;
       Out_Buffer : Word;
       Send_Bytes : Word;
       SWidth     : Byte;
       SHeight    : Byte;
       BaudRate   : Byte
     End;

Var FosPort  : Byte;


Function  Install_Fossil (ComPort:Byte):Boolean;
Procedure Close_Fossil (ComPort:Byte);
Procedure Set_Fossil (ComPort:Byte; BaudRate:LongInt; DataBits:Byte;
                     Parity:Char; StopBits:Byte);
Procedure SendChar (K:Char);
Procedure SendString (S:String);
Function  GetChar:Char;
Function  Fossil_Chars:Boolean;
Function  Fossil_Carrier:Boolean;
Procedure Fossil_DTR (ComPort:Byte; State:Boolean);
Procedure Hangup;
Procedure Fossil_Timer (Var Tick_Int, Ints_Sec:Byte; MS_Tics:Integer);
Procedure Fossil_OutPut_FLUSH (ComPort:Byte);
Procedure Fossil_Nuke_Input   (ComPort:Byte);
Procedure Fossil_Nuke_OutPut  (ComPort:Byte);
Function  NoWait_Send (K:Char):Boolean;
Function  Fossil_Peek:Char;
{Function  Fossil_GetChar:Char;}
Function  Fossil_Wait:Char;
Procedure Fossil_FLOW (State:Byte);
Procedure Set_CtrlC (ComPort, State:Byte);
Function  CtrlC_Check (ComPort:Byte):Boolean;
Procedure Fossil_GotoXY (X,Y:Byte);
Procedure Fossil_Position (Var X,Y:Byte);
Function  Fossil_WhereX:Byte;
Function  Fossil_WhereY:Byte;
Procedure ANSI_Write (K:Char);
Procedure WatchDog (Status:Boolean);
Procedure BIOS_Write (K:Char);
Function  Add_Fossil_Proc    (Var P):Boolean;
Function  Delete_Fossil_Proc (Var P):Boolean;
Procedure WarmBoot;
Procedure ColdBoot;
Function  Fossil_BlockRead  (Bytes:Word; Var Buffer):Integer;
Function  Fossil_BlockWrite (Bytes:Word; Var Buffer):Integer;
Function  Fossil_Descrip (ComPort:Byte):String;
Function  Fos_Ringing: Boolean;
Implementation



Var R:Registers;

Procedure Delay (I:Integer);
Begin
  R.Ah := $86;
  Move (I,R.Cx,2);
  Intr ($15,R)
End;

Function Install_Fossil (ComPort:Byte):Boolean;
Begin                                   { Initializes the Specified  }
  R.Ah := $04;                          { Communications Port        }
  R.Dx := ComPort - 1;                  { Sets FOSPORT to COMPORT    }
  R.Bx := $4F50;
  Intr ($14,R);
  Install_Fossil := R.Ax = $1954;
  FosPort := ComPort - 1
End;

Procedure Close_Fossil (ComPort:Byte);  { Closes the Initialized     }
Begin                                   { Communications Port        }
  R.Ah := $05;
  R.Dx := ComPort - 1;
  Intr ($14,R);
  FosPort := 255
End;


Procedure Set_Fossil (ComPort:Byte; BaudRate:LongInt; DataBits:Byte;
                      Parity:Char; StopBits:Byte);
Var Baud,Code:Byte;                     { Sets the to the COMPORT    }
Begin                                   { The BaudRate, DataBits,    }
  Case BaudRate of                      { The Parity, And StopBits   }
   1200  : Baud := 128;                 { Sets FOSPORT to COMPORT    }
   2400  : Baud := 160;
   4800  : Baud := 192;
   9600  : Baud := 224;
   19200 : Baud := 0
   Else If BaudRate = 38400 Then Baud := 32
  End;
  Case DataBits of
 { 5 : Baud := Baud + 0; }
   6 : Baud := Baud + 1;
   7 : Baud := Baud + 2;
   8 : Baud := Baud + 3
  End;
  Case Parity of
 { 'N' : Baud := Baud + 0; }
   'O' : Baud := Baud + 8;
   'E' : Baud := Baud + 24
  End;
  Case StopBits of
   1 : Baud := Baud + 0;
   2 : Baud := Baud + 4
  End;
  R.Ah := 0;
  R.Al := Baud;
  R.Dx := ComPort - 1;
  Intr ($14,R);
  FosPort := ComPort - 1
End;

Function Fos_Ringing: Boolean;
var
  CC : Char;
begin
  Fos_Ringing := False;
  R.Ah := $0C;
  R.Dx := fosport;
  Intr($14, R);
  if r.ax = $FFFF then
    Fos_ringing := false
  else
  begin
    cc := chr(r.al);
    if cc = #13 then
      Fos_ringing := true;
  end;
end;



Procedure SendChar (K:Char);            { Transmitts a Character     }
Begin                                   { through FOSPORT Comm Port  }
  R.Ah := $01;                          { and then Waits.            }
  R.Al := Ord(K);
  R.Dx := FosPort;
  Intr ($14,R)
End;


Procedure SendString (S:String);        { Sends a String through the }
Var I:Integer;
Begin
  I:=Fossil_BlockWrite (Length(S),S)
End;


Function GetChar:Char;                  { Gets a Character from the  }
Begin                                   { FOSPORT Communications Port}
  R.Ah := $02;
  R.Dx := FosPort;
  Intr ($14,R);
  GetChar := Chr(R.Al)
End;

Function Fossil_Chars:Boolean;
Begin
  R.Ah := $03;
  R.Dx := FosPort;
  Intr ($14,R);
  Fossil_Chars := (R.Ah And 1) = 1
End;

Function Fossil_Carrier:Boolean;        { Detects whether a Carrier  }
Begin                                   { is on FOSPORT Port         }
  R.Ah := $03;
  R.Dx := FosPort;
  Intr ($14,R);
  Fossil_Carrier := (R.Al And 128) = 128
End;

Procedure Fossil_DTR (ComPort:Byte; State:Boolean);
Begin                                   { Lowers/Raises the DTR on   }
  R.Ah := $06;                          { COMPORT                    }
  R.Al := Byte(State);
  R.Dx := ComPort - 1;
  Intr ($14,R)
End;


Procedure Hangup;
Begin
  If Not Fossil_Carrier Then Exit;
  Fossil_DTR (FosPort + 1,False);
  Delay (700);
  Fossil_DTR (FosPort + 1,True);
  If Fossil_Carrier Then SendString ('+++')
End;

Procedure Fossil_Timer (Var Tick_Int, Ints_Sec:Byte; MS_Tics:Integer);
Begin
  R.Ah := $07;
  Intr ($14,R);
  Tick_Int := R.Al;
  Ints_Sec := R.Ah;
  MS_Tics  := R.Dx
End;


Procedure Fossil_OutPut_FLUSH (ComPort:Byte);
Begin                                   { Forecs the OutPut Chars    }
  R.Ah := $08;                          { out of the Buffer          }
  R.Dx := ComPort - 1;
  Intr ($14,R)
End;

Procedure Fossil_Nuke_OutPut (ComPort:Byte);
Begin                                   { Purges the OutPut Buffer   }
  R.Ah := $09;
  R.Dx := ComPort - 1;
  Intr ($14,R)
End;

Procedure Fossil_Nuke_Input (ComPort:Byte);
Begin                                   { Purges the Input Buffer    }
  R.Ah := $0A;
  R.Dx := ComPort - 1;
  Intr ($14,R)
End;

Function NoWait_Send (K:Char):Boolean;
Begin
  R.Ah := $0B;
  R.Al := Ord(K);
  R.Dx := FosPort;
  Intr ($14,R);
  NoWait_Send := Boolean(R.Ax)
End;

Function Fossil_Peek:Char;              { Checks out what the Next   }
Begin                                   { Character is in FOSPORT    }
  R.Ah := $0C;                          { Without Taking it out of   }
  R.Dx := FosPort;                      { the Bufffer                }
  Intr ($14,R);
  Fossil_Peek := Chr(R.Al)
End;

Function Fossil_GetChar:Char;         { Gets Character from Input Buffer }
Begin                                 { $FFFF if none: HIGH Byte is Scan }
  R.Ah := $0D;                        { code                             }
  R.Dx := FosPort;
  Intr ($14,R);
  Fossil_GetChar := Chr(R.Al)
End;

Function Fossil_Wait:Char;            { Waits until a Character has been }
Begin                                 { Receieved                        }
  R.Ah := $0E;
  R.Dx := FosPort;
  Intr ($14,R);
  Fossil_Wait := Chr(R.Al)
End;

Procedure Fossil_FLOW (State:Byte);   { Sets Flow Control    }
Begin                                 { 0 = Disabled         }
  R.Ah := $0F;                        { Bit 0 & 3 = XON/XOFF } { Chars }
  R.Al := State;                      { Bit 1     = CTS/RTS  } { Signals * }
  R.Dx := FosPort;                    { Call using the defined Constants }
  Intr ($14,R)
End;


Procedure Set_CtrlC (ComPort,State:Byte);
Begin
  R.Ah := $10;
  R.Al := State;
  R.Dx := ComPort - 1;
  Intr ($14,R)
End;

Function CtrlC_Check (ComPort:Byte):Boolean;
Begin
  R.Ah := $10;
  R.Al := 2;
  R.Dx := ComPort - 1;
  Intr ($14,R);
  CtrlC_Check := Boolean(R.Ax)
End;

Procedure Fossil_GotoXY (X,Y:Byte);
Begin
  R.Ah := $11;
  R.Dh := Y - 1;
  R.Dl := X - 1;
  Intr ($14,R)
End;

Procedure Fossil_Position (Var X,Y:Byte);
Begin
  R.Ah := $12;
  Intr ($14,R);
  X := R.Dl + 1;
  Y := R.Dh + 1
End;

Function Fossil_WhereX:Byte;
Begin
  R.Ah := $12;
  Intr ($14,R);
  Fossil_WhereX := R.Dl + 1
End;

Function Fossil_WhereY:Byte;
Begin
  R.Ah := $12;
  Intr ($14,R);
  Fossil_WhereY := R.Dh + 1
End;

Procedure ANSI_Write (K:Char);        { Projects Character to Screen   }
Begin                                 { through ANSI.SYS               }
  R.Ah := $13;
  R.Al := Ord(K);
  R.Dx := FosPort;
  Intr ($14,R)
End;

Procedure WatchDog (Status:Boolean);  { Sets WatchDOG = ON/OFF        }
Begin                                 { If ON then Reboots on Carrier }
  R.Ah := $14;                        { Loss!                         }
  R.Al := Byte(Status);
  R.Dx := FosPort;
  Intr ($14,R)
End;

Procedure BIOS_Write (K:Char);        { Writes a Character to the     }
Begin                                 { Screen Using BIOS Screen Write}
  R.Ah := $15;
  R.Al := Ord(K);
  R.Dx := FosPort;
  Intr ($14,R)
End;

Function Add_Fossil_Proc (Var P):Boolean;
Begin
  R.Ah := $16;
  R.Al := $01;
  R.ES := Seg (P);
  R.DX := Ofs (P);
  Intr ($14,R);
  Add_Fossil_Proc := R.Ax = 0
End;

Function Delete_Fossil_Proc (Var P):Boolean;
Begin
  R.Ah := $16;
  R.Al := $00;
  R.ES := Seg (P);
  R.DX := Ofs (P);
  Intr ($14,R);
  Delete_Fossil_Proc := R.Ax = 0
End;

Procedure ColdBoot;                   { Does a Cold Reboot            }
Begin
  R.Ah := $17;
  R.Al := $00;
  Intr ($14,R)
End;

Procedure WarmBoot;                   { Does a Warm Reboot            }
Begin
  R.Ah := $17;
  R.Al := $01;
  Intr ($14,R)
End;

Function Fossil_BlockRead (Bytes:Word; Var Buffer):Integer;
Begin                                 { BUFFER is an Array, and BYTES is  }
  R.Ah := $18;                        { the size of the Array.            }
  R.Dx := FosPort;                    { It Returns the number of recieved }
  R.Cx := Bytes;                      { Characters.                       }
  R.ES := Seg (Buffer);
  R.DI := Ofs (Buffer);
  Intr ($14,R);
  Fossil_BlockRead := R.Ax
End;

Function Fossil_BlockWrite (Bytes:Word; Var Buffer):Integer;
Begin                                 { Writes an Array of BYTES Chars    }
  R.Ah := $19;                        { to the FOSPORT from BUFFER        }
  R.Dx := FosPort;                    { Returns the number of characters  }
  R.Cx := Bytes;                      { sent.                             }
  R.ES := Seg (Buffer);
  R.DI := Ofs (Buffer);
  Intr ($14,R);
  Fossil_BlockWrite := R.Ax
End;


Function Fossil_Descrip (ComPort:Byte):String;
Var Cnt:Integer;                      { Returns the Communications FOSSIL }
    Fos_Arry:Fossil_Struct;           { Driver Utilizing the COMPORT      }
    First,Second:Word;                { Communications Port               }
    Kar:Char;                         { Returns the FOSSIL Driver         }
    S:String;                         { Description.                      }
Begin
  R.Ah := $1B;
  R.Dx := ComPort - 1;
  R.ES := Seg (Fos_Arry);
  R.DI := Ofs (Fos_Arry);
  R.CX := SizeOf (Fos_Arry);
  Intr ($14,R);
  First  := Fos_Arry.FOS_ID[2];
  Second := Fos_Arry.FOS_ID[1];
  S   := '';
  Kar := #26;
  While Kar <> #0 Do Begin
    Kar:=Chr (Mem[First:Second]);
    S := S + Kar;
    Second:=Second + 1
  End;
  Fossil_Descrip:=S
End;

Begin
End.

[Back to COMM SWAG index]  [Back to Main SWAG index]  [Original]