*/
Are you blogging on PH? Get your free blog.
*/

View \DDIGI.PAS

DDPLUS 7.1 Turbo Pascal 7.0 Door Kit

Submitted By: WEBMASTER
Rating: starstarstarstar (Rate It)


unit ddigi;
{$S-,V-,R-}

interface
uses dos;

type
 Idarray = array[1..8] of char;

var
 AsyncStat:word;
 dport_num: integer;
 nameptr : ^idarray;
 OutReady:boolean;

function  digi_Init_driver : boolean;
function  digi_deinit_driver: boolean;
function  digi_buffer_check: boolean;
procedure digi_send(c: char);
function  digi_receive(var c: char): boolean;
function  digi_carrier_present : boolean;
procedure digi_set_modem;
function  digi_set_baud(n:longint;WordSize:Byte; Parity:Char; StopBits:Byte): boolean;
procedure digi_flush_io;
procedure digi_flush_input;
procedure digi_flush_output;
procedure digi_Get_Info(var drivername:string);
procedure EnableTimeOutError;
procedure Digi_Break(StatusCode : Word);

implementation
const
  dtrmask = 1;
  rtsmask = 2;
type
  BytePtr = ^Byte;
var
  EBIOSok,DTRok,RTSok    : boolean;
  CharReadyP : BytePtr;

function digi_Init_driver : boolean;
var
 regs: registers;
begin;
 with regs do                         { Get Channel Parameters }
   begin
     ah:=$0C;
     dx:=dport_num;
   end;
 intr($14,regs);
 if regs.ah=$FF then
   digi_init_driver :=false
 else
   digi_init_driver :=true;
                                  { Checks for extended Bios }
 asm
   mov ah,$F4
   mov al,$00
   mov dx,dport_num
   int $14
 end;
 If regs.ax=$000 then
   EbiosOk:=true
 else
   EbiosOk:=false;

 with regs do                         { checks modem dtr/rts status }
   begin
     ah:=$05;
     al:=$00;
     dx:=dport_num;
   end;
 intr($14,regs);
 if (regs.bl and DTRmask)<>$00 then
   DTRok:=true
 else
   DTRok:=false;
 if (regs.bl and RTSmask)<>$00 then
   RTSok:=true
 else
   RTSok:=false;

 OutReady:=false;
end;

function  digi_deinit_driver;  { A do nada routine, no deinit calls exist. }
begin
 digi_deinit_driver:=true;
end;

function digi_buffer_check: boolean;
var
 regs: registers;
begin;
 with regs do
   begin
     ah:=$03;
     dx:=dport_num;
   end;
 intr($14,regs);
 if (regs.ah and $01)<>$00 then   { data ready bit               }
   digi_buffer_check:=true        { checks if byte ready to send }
 else
   digi_buffer_check:=false;
end;

procedure digi_send(c: char);
var
 regs: registers;
begin;
 with regs do
  begin
    ah:=$01;
    al:=byte(c);
    dx:=dport_num;
  end;
 intr($14,regs);
                               { bit 5 set on = buffer space avail }
 if (regs.ah and $20)<>$00 then
   OutReady:=true
 else
   OutReady:=false;
end;

function digi_receive(var c: char): boolean;
var
 regs: registers;
begin;
 c:=#0;
 digi_receive:=false;
 if digi_buffer_check then
  begin
    with regs do
    begin
      ah:=$02;
      dx:=dport_num;
    end;
    intr($14,regs);
    if (regs.ah and $8E)=$00 then
      begin
        c:=chr(regs.al);
        digi_receive:=true;
      end;
  end;
end;

function digi_carrier_present: boolean;
var
 regs: registers;
begin;
 with regs do
   begin
     ah:=$03;
     dx:=dport_num;
   end;
 intr($14,regs);
 if (regs.al and $80)<>$00 then      { carrier present bit }
   digi_carrier_present:=true
 else
   digi_carrier_present:=false;
 if (regs.ah and $20)<>$00 then      { bit 5 set on = buffer space avail }
   OutReady:=true                    { thus can check if out buffer ready}
 else
   OutReady:=false;
end;

function ExtBaud(n:longint) : byte;
var
 b:byte;
 w:word;
begin
 b:=$00;
 w:=n;

 If n > 76800 then   { 115200 }
   b:=$0C
 else
 If n > 57600 then   {  76800 }
   b:=$0B
 else
   case w of
     300  : b:=$02;
     600  : b:=$03;
     1200 : b:=$04;
     1800 : b:=$11;
     2400 : b:=$05;
     4800 : b:=$06;
     4801..9600 :  b:=$07;
     9601..19200:  b:=$08;
     19201..38400: b:=$09;
     38401..57600: b:=$0A;
   end;
  ExtBaud:=b;
end;

procedure digi_set_modem;
var
  regs: registers;
begin
  with regs do
   begin
     dx:=dport_num;
     ah:=$05;
     al:=$01;
     If dtrok then bl:=bl or dtrmask;
     If rtsok then bl:=bl or rtsmask;
   end;
  intr($14,regs);
end;

{ This is included for completeness only }
{ Most sysops don't want a door to reinitiallize their board }
{ so this is by passed.                                      }
function digi_set_baud;      { new form digiboard init }
var
  regs: registers;
begin;

  with regs do
   begin
     ah:=$04;
     al:=$00;
     dx:=dport_num;
     case parity of
      'N' : bh:=$00;
      'O' : bh:=$01;
      'E' : bh:=$02;
     end;                  {0 = none/ 1 = odd / 2 = even }
     case stopbits of
       1 : bl:=$00;
       2 : bl:=$01;
     end;
     case wordsize of
       5 : ch:=$00;
       6 : ch:=$01;
       7 : ch:=$02;
       8 : ch:=$03;
     end;
     cl:=ExtBaud(n);      { set baud rate }
  end;
  intr($14,regs);
  if regs.ah=$FF then
    digi_set_baud:=false
  else
   begin
    digi_set_baud:=true;
    digi_set_modem;
   end;
end;

procedure digi_flush_io;
var
 regs: registers;
begin;
 regs.ah:=$09;
 regs.dx:=dport_num;
 intr($14,regs);
end;

procedure digi_flush_input;
var
 regs: registers;
begin;
 regs.ah:=$10;
 regs.dx:=dport_num;
 intr($14,regs);
end;

procedure digi_flush_output;
var
 regs: registers;
begin;
 regs.ah:=$11;
 regs.dx:=dport_num;
 intr($14,regs);
end;

procedure digi_Get_Info(var drivername:string);
const
 dname : array[1..5] of
  string [6] = ('COM/Xi','MC/Xi', 'PC/Xe', 'PC/Xi', 'PC/Xm' );
var
 i:byte;
 regs: registers;
 d,s,o:string;
 versno:word;
begin;
 versno:=0;
 d:='';s:='';o:=' ';
 with regs do
  begin
    ah:=$06;
    al:=$ff;
    dx:=dport_num;
  end;
 intr($14,regs);
 nameptr := ptr(regs.es,regs.bx);
 i := 1;
 while (i<8) and (nameptr^[i] <> #0)  do
   inc(i);
 move(nameptr^, d[1], i);
 d[0] := char(i);

 with regs do
  begin
    ah:=$06;
    al:=$01;
    dx:=dport_num;
  end;
 intr($14,regs);
 if regs.ah<>$ff then
  begin
    versno:=regs.bx;
    str(versno,o);
    s:=' Version['+o+'] : ';
    str(regs.ax,o);
  end;
 d:=d+s;

 s:='';

 with regs do
  begin
    ah:=$06;
    al:=$02;
    bx:=$000;
    dx:=dport_num;
  end;
 intr($14,regs);
 if regs.ah<>$ff then
   If regs.al in [$01..$05] then s:=dname[regs.al]
   else str(regs.al,s);
 drivername:=d+s+o;

end;

procedure EnableTimeOutError;
var
 regs: registers;
begin;
 with regs do
  begin
    ah:=$20;
    al:=$01;
    dx:=dport_num;
  end;
 intr($14,regs);
end;

procedure Digi_Break(StatusCode : Word){ send break }
var
 regs: registers;
begin;
 with regs do
  begin
    ah:=$07;
    al:=$00;       { defaults 250 millisecs }
    dx:=dport_num;
  end;
 intr($14,regs);
 AsyncStat := StatusCode;
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.