home *** CD-ROM | disk | FTP | other *** search
/ synchro.net / synchro.net.tar / synchro.net / main / BBS / D32_01.ZIP / FOS_COM.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1999-11-25  |  14.2 KB  |  547 lines

  1. unit FOS_COM;
  2. (*
  3. **
  4. ** Serial and TCP/IP communication routines for DOS, OS/2 and Win9x/NT.
  5. ** Tested with: TurboPascal   v7.0,    (DOS)
  6. **              VirtualPascal v2.0,    (OS/2, Win32)
  7. **              FreePascal    v0.99.12 (DOS, Win32)
  8. **              Delphi        v4.0.    (Win32)
  9. **
  10. ** Version : 1.01
  11. ** Created : 21-May-1998
  12. ** Last update : 07-Apr-1999
  13. **
  14. ** Note: (c) 1998-1999 by Maarten Bekers
  15. **
  16. *)
  17.  
  18. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  19.  INTERFACE
  20. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  21.  
  22. uses Combase;
  23.  
  24. type TFossilObj = Object(TCommObj)
  25.         constructor Init;
  26.         destructor Done;
  27.  
  28.         function  Com_Open(Comport: Byte; BaudRate: Longint; DataBits: Byte;
  29.                            Parity: Char; StopBits: Byte): Boolean; virtual;
  30.         function  Com_OpenKeep(Comport: Byte): Boolean; virtual;
  31.         function  Com_GetChar: Char; virtual;
  32.         function  Com_CharAvail: Boolean; virtual;
  33.         function  Com_Carrier: Boolean; virtual;
  34.         function  Com_SendChar(C: Char): Boolean; virtual;
  35.         function  Com_ReadyToSend(BlockLen: Longint): Boolean; virtual;
  36.         function  Com_GetBPSrate: Longint; virtual;
  37.         function  Com_GetDriverInfo: String; virtual;
  38.         function  Com_GetHandle: longint; virtual;
  39.  
  40.         procedure Com_OpenQuick(Handle: Longint); virtual;
  41.         procedure Com_Close; virtual;
  42.         procedure Com_SendBlock(var Block; BlockLen: Longint; var Written: Longint); virtual;
  43.         procedure Com_SendWait(var Block; BlockLen: Longint; var Written: Longint; Slice: SliceProc); virtual;
  44.         procedure Com_ReadBlock(var Block; BlockLen: Longint; var Reads: Longint); virtual;
  45.         procedure Com_GetBufferStatus(var InFree, OutFree, InUsed, OutUsed: Longint); virtual;
  46.         procedure Com_SetDtr(State: Boolean); virtual;
  47.         procedure Com_GetModemStatus(var LineStatus, ModemStatus: Byte); virtual;
  48.         procedure Com_SetLine(BpsRate: longint; Parity: Char; DataBits, Stopbits: Byte); virtual;
  49.         procedure Com_PurgeInBuffer; virtual;
  50.         procedure Com_PurgeOutBuffer; virtual;
  51.         procedure Com_SetFlow(SoftTX, SoftRX, Hard: Boolean); virtual;
  52.      end; { object TFossilObj }
  53.  
  54. Type PFossilObj = ^TFossilObj;
  55.  
  56. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  57.  IMPLEMENTATION
  58. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  59.  
  60. uses Dos, Strings
  61.        {$IFDEF GO32V2}
  62.          ,Go32
  63.        {$ENDIF} ;
  64.  
  65. var Regs   : Registers;
  66.     FosPort: Byte;
  67.  
  68. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  69.  
  70. procedure DosAlloc(var Selector: Word; var SegMent: Word; Size: Longint);
  71. var Res: Longint;
  72. begin
  73.   {$IFDEF GO32V2}
  74.     Res := Global_DOS_Alloc(Size);
  75.     Selector := Word(Res);
  76.  
  77.     Segment := Word(RES SHR 16);
  78.   {$ENDIF}
  79. end; { proc. DosAlloc }
  80.  
  81. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  82.  
  83. procedure DosFree(Selector: Word);
  84. begin
  85.   {$IFDEF GO32V2}
  86.     Global_DOS_Free(Selector);
  87.   {$ENDIF}
  88. end; { proc. DosFree }
  89.  
  90. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  91.  
  92. constructor TFossilObj.Init;
  93. begin
  94.   inherited Init;
  95. end; { constructor Init }
  96.  
  97. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  98.  
  99. destructor TFossilObj.Done;
  100. begin
  101.   inherited Done;
  102. end; { destructor Done }
  103.  
  104. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  105.  
  106. procedure FossilIntr(var Regs: Registers);
  107. begin
  108.   Intr($14, Regs);
  109. end; { proc. FossilIntr }
  110.  
  111. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  112.  
  113. function TFossilObj.Com_Open(Comport: Byte; BaudRate: Longint; DataBits: Byte;
  114.                              Parity: Char; StopBits: Byte): Boolean;
  115. begin
  116.   {-------------------------- Open the comport -----------------------------}
  117.   FosPort := (ComPort - 01);
  118.  
  119.   Regs.AH := $04;
  120.   Regs.DX := FosPort;
  121.   Regs.BX := $4F50;
  122.  
  123.   FossilIntr(Regs);
  124.  
  125.   Com_Open := (Regs.AX = $1954);
  126.   InitFailed := (Regs.AX <> $1954);
  127.   Com_SetLine(BaudRate, Parity, DataBits, StopBits);
  128. end; { func. TFossilObj.Com_OpenCom }
  129.  
  130. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  131.  
  132. function TFossilObj.Com_OpenKeep(Comport: Byte): Boolean;
  133. begin
  134.   FosPort := (ComPort - 01);
  135.  
  136.   Regs.AH := $04;
  137.   Regs.DX := FosPort;
  138.   Regs.BX := $4F50;
  139.  
  140.   FossilIntr(Regs);
  141.  
  142.   Com_OpenKeep := (Regs.AX = $1954);
  143.   InitFailed := (Regs.AX <> $1954);
  144. end; { func. Com_OpenKeep }
  145.  
  146. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  147.  
  148. procedure TFossilObj.Com_OpenQuick(Handle: Longint);
  149. begin
  150.   {-------------------------- Open the comport -----------------------------}
  151.   FosPort := (Handle - 01);
  152.  
  153.   Regs.AH := $04;
  154.   Regs.DX := FosPort;
  155.   Regs.BX := $4F50;
  156.  
  157.   FossilIntr(Regs);
  158.   InitFailed := (Regs.AX <> $1954);
  159. end; { proc. Com_OpenQuick }
  160.  
  161. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  162.  
  163. procedure TFossilObj.Com_SetLine(BpsRate: longint; Parity: Char; DataBits, Stopbits: Byte);
  164. var BPS: Byte;
  165. begin
  166.   Case BpsRate of
  167.     1200  : BPS := 128;
  168.     2400  : BPS := 160;
  169.     4800  : BPS := 192;
  170.     9600  : BPS := 224;
  171.     19200 : BPS := 0
  172.      else BPS := 32;
  173.    end; { case }
  174.  
  175.   if DataBits in [6..8] then
  176.     BPS := BPS + (DataBits - 5);
  177.  
  178.   if Parity = 'O' then BPS := BPS + 8 else
  179.    If Parity = 'E' then BPS := BPS + 24;
  180.  
  181.   if StopBits = 2 then BPS := BPS + 04;
  182.  
  183.   Regs.AH := $00;
  184.   Regs.AL := BPS;
  185.   Regs.DX := FosPort;
  186.   FossilIntr(Regs);
  187. end; { proc. TFossilObj.Com_SetLine }
  188.  
  189. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  190.  
  191. function TFossilObj.Com_GetBPSrate: Longint;
  192. begin
  193.   Com_GetBpsRate := 115200;
  194. end; { func. TFossilObj.Com_GetBpsRate }
  195.  
  196. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  197.  
  198. procedure TFossilObj.Com_Close;
  199. begin
  200.   if Dontclose then EXIT;
  201.  
  202.   Regs.AH := $05;
  203.   Regs.DX := FosPort;
  204.   FossilIntr(Regs);
  205. end; { proc. TFossilObj.Com_Close }
  206.  
  207. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  208.  
  209. function TFossilObj.Com_SendChar(C: Char): Boolean;
  210. var Written: Longint;
  211. begin
  212.   Com_SendWait(C, SizeOf(c), Written, nil);
  213.  
  214.   Com_SendChar := (Written = SizeOf(c));
  215. end; { proc. TFossilObj.Com_SendChar }
  216.  
  217. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  218.  
  219. function TFossilObj.Com_GetChar: Char;
  220. begin
  221.   Regs.AH := $02;
  222.   Regs.DX := FosPort;
  223.   FossilIntr(Regs);
  224.  
  225.   Com_GetChar := Chr(Regs.AL);
  226. end; { proc. TFossilObj.Com_ReadChar }
  227.  
  228. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  229.  
  230. procedure TFossilObj.Com_ReadBlock(var Block; BlockLen: Longint; var Reads: Longint);
  231. {$IFDEF GO32V2}
  232. var Selector,
  233.     Segment   : Word;
  234. {$ENDIF}
  235. begin
  236.   {$IFDEF MSDOS}
  237.     Regs.AH := $18;
  238.     Regs.DX := FosPort;
  239.     Regs.CX := Blocklen;
  240.     Regs.ES := Seg(Block);
  241.     Regs.DI := Ofs(Block);
  242.     FossilIntr(Regs);
  243.  
  244.     Reads := Regs.AX;
  245.   {$ENDIF}
  246.  
  247.   {$IFDEF GO32V2}
  248.     DosAlloc(Selector, Segment, BlockLen);
  249.  
  250.     if Int31Error <> 0 then EXIT;
  251.     DosmemPut(Segment, 0, Block, BlockLen);
  252.  
  253.     Regs.AH := $18;
  254.     Regs.DX := FosPort;
  255.     Regs.CX := Blocklen;
  256.     Regs.ES := Segment;
  257.     Regs.DI := 0;
  258.     FossilIntr(Regs);
  259.  
  260.     Reads := Regs.AX;
  261.  
  262.     DosMemGet(Segment, 0, Block, BlockLen);
  263.     DosFree(Selector);
  264.   {$ENDIF}
  265. end; { proc. TFossilObj.Com_ReadBlock }
  266.  
  267. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  268.  
  269. procedure TFossilObj.Com_SendBlock(var Block; BlockLen: Longint; var Written: Longint);
  270. {$IFDEF GO32V2}
  271. var Selector,
  272.     Segment   : Word;
  273. {$ENDIF}
  274. begin
  275.   {$IFDEF MSDOS}
  276.     Regs.AH := $19;
  277.     Regs.DX := FosPort;
  278.     Regs.CX := Blocklen;
  279.     Regs.ES := Seg(Block);
  280.     Regs.DI := Ofs(Block);
  281.     FossilIntr(Regs);
  282.  
  283.     Written := Regs.AX;
  284.   {$ENDIF}
  285.  
  286.   {$IFDEF GO32V2}
  287.     DosAlloc(Selector, Segment, BlockLen);
  288.  
  289.     if Int31Error <> 0 then EXIT;
  290.     DosmemPut(Segment, 0, Block, BlockLen);
  291.  
  292.     Regs.AH := $19;
  293.     Regs.DX := FosPort;
  294.     Regs.CX := Blocklen;
  295.     Regs.ES := Segment;
  296.     Regs.DI := 0;
  297.     FossilIntr(Regs);
  298.  
  299.     Written := Regs.AX;
  300.  
  301.     DosMemGet(Segment, 0, Block, BlockLen);
  302.     DosFree(Selector);
  303.   {$ENDIF}
  304. end; { proc. TFossilObj.Com_SendBlock }
  305.  
  306. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  307.  
  308. function TFossilObj.Com_CharAvail: Boolean;
  309. begin
  310.   Regs.AH := $03;
  311.   Regs.DX := FosPort;
  312.   FossilIntr(Regs);
  313.  
  314.   Com_CharAvail := (Regs.AH AND 01) <> 00;
  315. end;  { func. TFossilObj.Com_CharAvail }
  316.  
  317. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  318.  
  319. function  TFossilObj.Com_ReadyToSend(BlockLen: Longint): Boolean;
  320. begin
  321.   Regs.AH := $03;
  322.   Regs.DX := FosPort;
  323.   FossilIntr(Regs);
  324.  
  325.   Com_ReadyToSend := (Regs.AH AND $20) = $20;
  326. end; { func. TFossilObj.Com_ReadyToSend }
  327.  
  328. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  329.  
  330. function TFossilObj.Com_Carrier: Boolean;
  331. begin
  332.   Regs.AH := $03;
  333.   Regs.DX := FosPort;
  334.   FossilIntr(Regs);
  335.  
  336.   Com_Carrier := (Regs.AL AND 128) <> 00;
  337. end; { func. TFossilObj.Com_Carrier }
  338.  
  339. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  340.  
  341. procedure TFossilObj.Com_SetDtr(State: Boolean);
  342. begin
  343.   Regs.AH := $06;
  344.   Regs.AL := Byte(State);
  345.   Regs.DX := Fosport;
  346.   FossilIntr(Regs);
  347. end; { proc. TFossilObj.Com_SetDtr }
  348.  
  349. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  350.  
  351. procedure TFossilObj.Com_GetModemStatus(var LineStatus, ModemStatus: Byte);
  352. begin
  353.   Regs.AH := $03;
  354.   Regs.DX := FosPort;
  355.   FossilIntr(Regs);
  356.  
  357.   ModemStatus := Regs.AL;
  358.   LineStatus := Regs.AH;
  359. end; { proc. TFossilObj.Com_GetModemStatus }
  360.  
  361. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  362.  
  363. procedure TFossilObj.Com_GetBufferStatus(var InFree, OutFree, InUsed, OutUsed: Longint);
  364. type
  365.   FosRec = record
  366.     Size      : Word;
  367.     Spec      : Byte;
  368.     Rev       : Byte;
  369.     ID        : Pointer;
  370.     InSize    : Word;
  371.     InFree    : Word;
  372.     OutSize   : Word;
  373.     OutFree   : Word;
  374.     SWidth    : Byte;
  375.     SHeight   : Byte;
  376.     BaudMask  : Byte;
  377.     Junk      : Word;
  378.   end;
  379.  
  380. var Com_Info: FosRec;
  381.  
  382.     Selector,
  383.     Segment : Word;
  384. begin
  385.   {$IFDEF MSDOS}
  386.     Regs.AH := $1B;
  387.     Regs.DX := FosPort;
  388.     Regs.ES := Seg(Com_Info);
  389.     Regs.DI := Ofs(Com_Info);
  390.     Regs.CX := SizeOf(Com_Info);
  391.   {$ENDIF}
  392.  
  393.   {$IFDEF GO32V2}
  394.     DosAlloc(Selector, Segment, SizeOf(Com_Info));
  395.     if Int31Error <> 0 then EXIT;
  396.  
  397.     DosmemPut(Segment, 0, Com_Info, SizeOf(Com_Info));
  398.  
  399.     Regs.AH := $1B;
  400.     Regs.DX := FosPort;
  401.     Regs.ES := Segment;
  402.     Regs.DI := 0;
  403.     Regs.CX := SizeOf(Com_Info);
  404.     FossilIntr(Regs);
  405.  
  406.     DosMemGet(Segment, 0, Com_Info, SizeOf(Com_Info));
  407.     DosFree(Selector);
  408.   {$ENDIF}
  409.  
  410.   FossilIntr(Regs);
  411.  
  412.   InFree := Com_Info.InFree;
  413.   InUsed := Com_Info.InSize - Com_Info.InFree;
  414.  
  415.   OutFree := Com_Info.OutFree;
  416.   OutUsed := Com_Info.OutSize - Com_Info.OutFree;
  417. end; { proc. TFossilObj.Com_GetBufferStatus }
  418.  
  419. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  420.  
  421. function TFossilObj.Com_GetDriverInfo: String;
  422. type
  423.   FosRec = record
  424.     Size      : Word;
  425.     Spec      : Byte;
  426.     Rev       : Byte;
  427.     ID        : PChar;
  428.     InSize    : Word;
  429.     InFree    : Word;
  430.     OutSize   : Word;
  431.     OutFree   : Word;
  432.     SWidth    : Byte;
  433.     SHeight   : Byte;
  434.     BaudMask  : Byte;
  435.     Junk      : Word;
  436.   end;
  437.  
  438. var Com_Info: FosRec;
  439.     Segment,
  440.     Selector: Word;
  441. begin
  442.   FillChar(Com_Info, SizeOf(FosRec), #00);
  443.  
  444.   {$IFDEF MSDOS}
  445.     Regs.AH := $1B;
  446.     Regs.DX := FosPort;
  447.     Regs.ES := Seg(Com_Info);
  448.     Regs.DI := Ofs(Com_Info);
  449.     Regs.CX := SizeOf(Com_Info);
  450.   {$ENDIF}
  451.  
  452.   {$IFDEF GO32V2}
  453.     DosAlloc(Selector, Segment, SizeOf(Com_Info));
  454.     if Int31Error <> 0 then EXIT;
  455.  
  456.     DosmemPut(Segment, 0, Com_Info, SizeOf(Com_Info));
  457.  
  458.     Regs.AH := $1B;
  459.     Regs.DX := FosPort;
  460.     Regs.ES := Segment;
  461.     Regs.DI := 0;
  462.     Regs.CX := SizeOf(Com_Info);
  463.     FossilIntr(Regs);
  464.  
  465.     DosMemGet(Segment, 0, Com_Info, SizeOf(Com_Info));
  466.     DosFree(Selector);
  467.   {$ENDIF}
  468.  
  469.   FossilIntr(Regs);
  470.   Com_GetDriverInfo := StrPas(Com_Info.ID);
  471. end; { proc. TFossilObj.Com_GetDriverInfo }
  472.  
  473. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  474.  
  475. procedure TFossilObj.Com_PurgeInBuffer;
  476. begin
  477.   Regs.AH := $0A;
  478.   Regs.DX := FosPort;
  479.  
  480.   FossilIntr(Regs);
  481. end; { proc. TFossilObj.Com_PurgeInBuffer }
  482.  
  483. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  484.  
  485. procedure TFossilObj.Com_PurgeOutBuffer;
  486. begin
  487.   Regs.AH := $09;
  488.   Regs.DX := FosPort;
  489.  
  490.   FossilIntr(Regs);
  491. end; { proc. TFossilObj.Com_PurgeOutBuffer }
  492.  
  493. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  494.  
  495. function TFossilObj.Com_GetHandle: longint;
  496. begin
  497.   Com_GetHandle := FosPort;
  498. end; { func. Com_GetHandle }
  499.  
  500. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  501.  
  502. procedure TFossilObj.Com_SendWait(var Block; BlockLen: Longint; var Written: Longint; Slice: SliceProc);
  503. var RestLen : Longint;
  504.     Temp    : Array[0..(1024 * 50)] of Char ABSOLUTE Block;
  505.     MaxTries: Longint;
  506. begin
  507.   RestLen := BlockLen;
  508.   MaxTries := (Com_GetBpsRate div 8);
  509.  
  510.   repeat
  511.     Com_SendBlock(Temp[BlockLen - RestLen], RestLen, Written);
  512.  
  513.     Dec(RestLen, Written);
  514.     Dec(MaxTries);
  515.  
  516.     if RestLen <> 0 then
  517.      if @Slice <> nil then
  518.        Slice;
  519.   until (RestLen <= 0) OR (NOT COM_Carrier) OR (MaxTries < 0);
  520.  
  521.   Written := (BlockLen - RestLen);
  522. end; { proc. Com_SendWait }
  523.  
  524. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  525.  
  526. procedure TFossilObj.Com_SetFlow(SoftTX, SoftRX, Hard: Boolean);
  527. begin
  528.   Regs.AH := $0F;
  529.  
  530.   if SoftTX then
  531.     Regs.AL := $01
  532.      else Regs.AL := $00;
  533.  
  534.   if SoftRX then
  535.     Regs.AL := Regs.AL OR $08;
  536.  
  537.   if Hard then
  538.     Regs.AL := Regs.AL OR $02;
  539.  
  540.   Regs.DX := FosPort;
  541.   FossilIntr(Regs);
  542. end; { proc. Com_SetFlow }
  543.  
  544. (*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-+-*-*)
  545.  
  546. end. { unit FOS_COM }
  547.