*/
Stuck? Need help? Ask questions on our forums.
*/

View \SERIAL.PAS

This unit is designed to allow the user to use a FOSSIL driver

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


Unit Serial;

{     SERIAL.PAS - 14 Jan 91
                   15 Jan 91 (Last Modification)

      This unit is designed to allow the user to use a FOSSIL driver for
      a serial unit that is event-driven aware.  To do this, the input
      from the modem is given an event status number just like the mouse or
      keyboard.  All input is then routed directly through the event driver
      for all your dialogs to use.  The output to the modem is in the form
      of a series of events that you can use or direct calls via an object.
      Note that these calls are the basics and do not halt for buffer
      overruns in either Tx or Rx.  Your application program will have to
      monitor the serCarrier and serTxBuffer events to keep track if there
      is a carrier or if there is room in the TX buffer for more to be
      sent.

      Note that this unit was written to take advantage of many of the
      FOSSIL drivers out on the market such as X00.SYS or BNU.COM.  If
      the system does not detect a FOSSIL driver in memory, then it
      resorts to standard interrupt driven serial I/O without the ability
      to open up more than one port at a time. (Currently... This may
      change in the future)

      ----------------
      REVISION HISTORY
      ----------------

      01-14-91  Designed and created the test version of the FOSSIL only
                version.  The internal serial routines have not yet been
      written to be used with this Unit.  Created the Event evSerial.
      Added a bunch of BASIC routines to the serial driver and made sure
      that the FSerial.Idle routine was passing the correct stuff!

      01-15-91  Added Event checks for Carrier and Transmission Buffer
                overflow.

      01-22-91  Rearranged the LSList system as a TCollection to improve
                the disposal procedure.  Also created the serCarrierReq and
      serTxBufferReq events so that the user can request a port status in
      case for some reason he missed the toggle event.

      01-27-91  Created a command entry to return a string if the receive
                buffer has several characters in it insted of trying to send
      each and every one via an event.  Also changed the SERIAL.PAS activated
      events to seperate procedures so that you can call them directly if you
      inherit the Object or use it seperatly.  There is also a procedure to
      disable this system from creating Command events.  You can use it
      either way now...

}

{$F+,O+,R-,S-}

{$DEFINE FOSSILDRIVER} {This will check if a FOSSIL driver is in place and
                        will install a standard serial port if the driver
                        is not in memory. If this is undefined, then the
                        FOSSIL routines are not compiled in and you use the
                        standard Serial routines regardless}


{ DEFINE SERIALDRIVER} {If this is undefined, then all the standard serial
                        routines are left out. If the FOSSIL driver is not
                        in memory then you are out of luck...}


Interface

Uses Dos, Drivers, Views, Objects;

{----------------------------------------------------------------------------}

CONST evSerial      = $8000;   {Define a Serial Event Message}

      stDupSerial   = 195;     {Duplicate Port Requested}
      stOpenError   = 194;     {Error opening the port}
      stInvalidPort = 193;     {Invalid port number}
      stInvalidBaud = 192;     {Invalid selected baud rate}
      stCharUnavail = 191;     {Tried to read a char, but none available}

      serBaud       = 7100;    {Set Baud Rate       (Port,Baud)}
                               {Fmt:  InfoByte=Port, InfoLong=+Baud SHL 16}
      serSend       = 7101;    {Send a char         (Port,Byte)}
                               {Fmt:  InfoByte=Port, InfoWord=+Byte SHL 8}
      serInit       = 7104;    {Initialize a port   (Port)}
      serDeInit     = 7105;    {Remove a port       (Port)}
      serRaiseDTR   = 7106;    {Raise the DTR       (Port)}
      serLowerDTR   = 7107;    {Lower the DTR       (Port)}
      serPurgeRx    = 7108;    {Purge the Recv buf  (Port)}
      serPurgeTx    = 7109;    {Purge output buf    (Port)}
      serFlow       = 7115;    {Set Flow Control    (Port,Flow)}
                               {Fmt:  InfoByte=Port, InfoWord=+Flow SHL 8}
      serCarrierReq = 7116;    {Request the Carrier Status (Port)}
      serTxBufferReq= 7117;    {Request Tx Buffer Status (Port)}

      serEventGenOn = 7118;    {Turn on Serial Event Generation}
      serEventGenOff= 7119;    {Turn off Serial Event Generation}

      serCarrier    = 7120;    {Carrier Status      (Port,Status)}
      serTxBuffer   = 7121;    {TxBuffer Status     (Port,Status)}
      serRecvChar   = 7122;    {Received a char     (Port,Byte)}
      serRecvLine   = 7123;    {Received a line     (Port,Ptr -> String)}

{----------------------------------------------------------------------------}

TYPE  FossilList = RECORD
                      strsiz  : WORD;
                      majver  : BYTE;
                      minver  : BYTE;
                      ident   : POINTER;
                      ibufr   : WORD;
                      ifree   : WORD;
                      obufr   : WORD;
                      ofree   : WORD;
                      swidth  : BYTE;
                      sheight : BYTE;
                      baud    : BYTE;
                   END;

TYPE  PTypes = (SerNone,SerStd,SerFossil);
      PSList = ^LSList;
      LSList = OBJECT(TObject)
                  SerialPort  : BYTE;
                  PortType    : PTypes;
                  BaudBits    : BYTE;
                  FlowControl : BYTE;
                  Carrier     : BOOLEAN;
                  TxBuffer    : BOOLEAN;
                  CONSTRUCTOR Init(Port : BYTE);
                  CONSTRUCTOR Load(VAR S : TStream);
                  PROCEDURE Store(VAR S : TStream);
                  DESTRUCTOR Done; VIRTUAL;
               END;

      RecvRec = RECORD
                   Port : BYTE;
                   St   : STRING
                END;

TYPE  PSerial = ^FSerial;
      FSerial = OBJECT(TView)
                   OpenPorts     : PCollection;
                   LastPort      : BYTE;
                   EventGenerate : BOOLEAN;
{$IFDEF FOSSILDRIVER}
                   FossilUsed    : BOOLEAN;
                   FossilInfo    : FossilList;
{$ENDIF}
                   ErrorInfo     : INTEGER;
                   CONSTRUCTOR Init;
                   CONSTRUCTOR Load(VAR S : TStream);
                   PROCEDURE Store(VAR S : TStream);

                   PROCEDURE InitPort(Port : BYTE);
                   PROCEDURE RemovePort(Port : BYTE);
                   PROCEDURE SetBaud(Port : BYTE; Baud : WORD);
                   PROCEDURE PurgeOutputBuf(Port : BYTE);
                   PROCEDURE PurgeInputBuf(Port : BYTE);
                   PROCEDURE SendChar(Port : BYTE; Ch : BYTE);
                   PROCEDURE SendLine(Port : BYTE; Ln : STRING);
                   FUNCTION  RecvChar(Port : BYTE) : CHAR;
                   PROCEDURE DTRState(Port : BYTE; UpDown : BOOLEAN);
                   PROCEDURE FlowControl(Port : BYTE; Item : BYTE);
                   PROCEDURE SerialRequest(ReqType : WORD; Port : BYTE);
                   PROCEDURE GenerateEvents(Action : BOOLEAN);

                   PROCEDURE Reset;
                   DESTRUCTOR Done; VIRTUAL;
                   PROCEDURE Idle; VIRTUAL;
                   PROCEDURE HandleEvent(VAR Event : TEvent); VIRTUAL;
                END;

CONST RSerial: TStreamRec = (
         ObjType: 7100;
         VmtLink: Ofs(TypeOf(FSerial)^);
         Load:    @FSerial.Load;
         Store:   @FSerial.Store
      );

      RSList: TStreamRec = (
         ObjType: 7101;
         VmtLink: Ofs(TypeOf(LSList)^);
         Load:    @LSList.Load;
         Store:   @LSList.Store
      );

PROCEDURE RegisterSerial;

VAR   SerialSys : PSerial;

Implementation

CONST Fossil   = $14;
      MaxPorts = 4;
      Bauds    : ARRAY [0..7] OF WORD
               = (19200,38400,300,600,1200,2400,4800,9600);
VAR   Regs          : REGISTERS;
      FossilPresent : BOOLEAN;
      RecvBuf       : RecvRec;

{----------------------------------------------------------------------------}

CONSTRUCTOR LSList.Init;
BEGIN
   IF (Port < 0) OR (Port >= MaxPorts) THEN
      FAIL;

   SerialPort  := Port;
   PortType    := serNone;
   BaudBits    := $03;
   FlowControl := $01;
   Carrier     := FALSE;
   TxBuffer    := FALSE;

{$IFDEF FOSSILDRIVER}
   IF FossilPresent THEN
      BEGIN
         Regs.AH := $04;
         Regs.BX := $0000;
         Regs.DX := Port;
         INTR(Fossil,Regs);
         IF Regs.AX = $1954 THEN
            BEGIN
               PortType := SerFossil;
               Regs.AH := $0F;      {Set for Xon/Xoff processing}
               Regs.AL := FlowControl;
               INTR(Fossil,Regs)
            END
      END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
   IF PortType = SerNone THEN
      BEGIN

      {Set up standard port with PortType=SerStd}

      END;
{$ENDIF}
   IF PortType = SerNone THEN
      FAIL
END;

{----------------------------------------------------------------------------}

CONSTRUCTOR LSList.Load;
BEGIN
   S.Read(SerialPort,SIZEOF(SerialPort));
   S.Read(PortType,SIZEOF(PortType));
   S.Read(BaudBits,SIZEOF(BaudBits));
   S.Read(FlowControl,SIZEOF(FlowControl));
   S.Read(Carrier,SIZEOF(Carrier));
   S.Read(TxBuffer,SIZEOF(TxBuffer))
END;

{----------------------------------------------------------------------------}

PROCEDURE LSList.Store;
BEGIN
   S.Write(SerialPort,SIZEOF(SerialPort));
   S.Write(PortType,SIZEOF(PortType));
   S.Write(BaudBits,SIZEOF(BaudBits));
   S.Write(FlowControl,SIZEOF(FlowControl));
   S.Write(Carrier,SIZEOF(Carrier));
   S.Write(TxBuffer,SIZEOF(TxBuffer))
END;

{----------------------------------------------------------------------------}

DESTRUCTOR LSList.Done;
BEGIN
{$IFDEF FOSSILDRIVER}
   IF PortType = SerFossil THEN
      BEGIN
         Regs.AH := $05;
         Regs.DX := SerialPort;
         INTR(Fossil,Regs);
         PortType := SerNone
      END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
   IF PortType = SerStd THEN
      BEGIN
         {Take out our port!}

         PortType := SerNone
      END;
{$ENDIF}
END;

{----------------------------------------------------------------------------}

FUNCTION ScanPorts(p : PCollection; Port : BYTE) : PSList;

   FUNCTION TestPort(p : PSList) : BOOLEAN ; FAR;
   BEGIN
      TestPort := (Port = p^.SerialPort)
   END;

BEGIN
   ScanPorts := p^.FirstThat(@TestPort)
END;

{----------------------------------------------------------------------------}

CONSTRUCTOR FSerial.Init;
VAR   R : TRect;
BEGIN
   GetExtent(R);
   TView.Init(R);
   SetState(sfVisible,FALSE);
   EventMask := evSerial;
   EventGenerate := FALSE;
   OpenPorts := NEW(PCollection,Init(4,4));
{$IFDEF FOSSILDRIVER}
   FILLCHAR(FossilInfo,SIZEOF(FossilInfo),0);
   Regs.AH := $1B;
   Regs.CX := SIZEOF(FossilInfo);
   Regs.DX := 1;
   Regs.ES := SEG(FossilInfo);
   Regs.DI := OFS(FossilInfo);
   INTR(Fossil,Regs);
   FossilPresent := (FossilInfo.majver >= 4) AND (FossilInfo.strsiz > 4);
{$ENDIF}
   Reset
END;

{----------------------------------------------------------------------------}

CONSTRUCTOR FSerial.Load;
BEGIN
   TView.Load(S);

END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.Store;
BEGIN
   TView.Store(S);

END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.InitPort;
VAR   p : PSList;
BEGIN
   Reset;
   IF (Port < 0) OR (Port >= MaxPorts) THEN
      BEGIN
         ErrorInfo := stInvalidPort;
         EXIT
      END;

   IF ScanPorts(OpenPorts,Port) = NIL THEN
      p := NEW(PSList,Init(Port))
   ELSE
      BEGIN
         ErrorInfo := stDupSerial;
         EXIT
      END;

   IF p = NIL THEN
      ErrorInfo := stOpenError
   ELSE
      OpenPorts^.Insert(p)
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.RemovePort;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      OpenPorts^.Free(p)
   ELSE
      ErrorInfo := stInvalidPort;
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.SetBaud;
VAR   BaudMask : BYTE;
      p        : PSList;
BEGIN
   Reset;
   BaudMask := 0;
   WHILE (Bauds[BaudMask] <> Baud) AND (BaudMask < 8) DO
      INC(BaudMask);
   IF BaudMask > 7 THEN
      BEGIN
         ErrorInfo := stInvalidBaud;
         EXIT
      END;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               p^.BaudBits := BaudMask SHL 5 + p^.BaudBits AND $1F;
               Regs.AH := $00;
               Regs.AL := p^.BaudBits;
               Regs.DX := Port;
               INTR(Fossil,Regs)
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
               {Change Our Baud Rate!}

            END
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.PurgeOutputBuf;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $09;
               Regs.DX := p^.SerialPort;
               INTR(Fossil,Regs)
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.PurgeInputBuf;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $0A;
               Regs.DX := p^.SerialPort;
               INTR(Fossil,Regs)
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.SendChar;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $01;
               Regs.AL := ch;
               Regs.DX := Port;
               INTR(Fossil,Regs);   {Check AX returns....}
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.SendLine;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF (p^.PortType = SerFossil) AND (LENGTH(Ln) > 0) THEN
            BEGIN
               Regs.AH := $19;
               Regs.CX := LENGTH(Ln);
               Regs.DX := Port;
               Regs.ES := SEG(Ln[1]);
               Regs.DI := OFS(Ln[1]);
               INTR(Fossil,Regs);   {Check AX returns....}
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.DTRState;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $06;
               Regs.AL := BYTE(UpDown);
               Regs.DX := Port;
               INTR(Fossil,Regs)
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.FlowControl;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $0F;
               Regs.AL := Item;
               Regs.DX := p^.SerialPort;
               INTR(Fossil,Regs)
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.SerialRequest;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      CASE ReqType OF
         serCarrierReq  : p^.Carrier := NOT p^.Carrier;
         serTxBufferReq : p^.TxBuffer := NOT p^.TxBuffer
      END
   ELSE
      ErrorInfo := stInvalidPort
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.GenerateEvents;
BEGIN
   EventGenerate := Action
END;

{----------------------------------------------------------------------------}

FUNCTION FSerial.RecvChar;
VAR   p : PSList;
BEGIN
   Reset;
   p := ScanPorts(OpenPorts,Port);
   IF p <> NIL THEN
      BEGIN
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $03;
               Regs.DX := p^.SerialPort;
               INTR(Fossil,Regs);
               IF Regs.AH AND $01 = $01 THEN
                  BEGIN
                     Regs.AH := $02;
                     INTR(Fossil,Regs);
                     RecvChar := CHAR(Regs.AL)
                  END
               ELSE
                  BEGIN
                     RecvChar := #0;
                     ErrorInfo := stCharUnavail
                  END
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN
            END;
{$ENDIF}
      END
   ELSE
      BEGIN
         RecvChar := #0;
         ErrorInfo := stInvalidPort
      END
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.Reset;
BEGIN
   ErrorInfo := stOk
END;

{----------------------------------------------------------------------------}

DESTRUCTOR FSerial.Done;
BEGIN
   DISPOSE(OpenPorts,Done);
   TView.Done;
END;

{----------------------------------------------------------------------------}
{  NOTE:  The returned event that is created by the IDLE routine consists of }
{         two major parts. First is the identification that this is a serial }
{         event or type whatever (serCarrier,serTxBuffer,serRecv).  The      }
{         second part is the InfoWord with the high byte being the port that }
{         this message came in from and the low order being what the actual  }
{         value was.  For Instance:                                          }
{                                                                            }
{         serCarrier  :=  HI(InfoWord) = 1  -> Carrier                       }
{                         HI(InfoWord) = 0  -> No Carrier                    }
{                                                                            }
{         serTxBuffer :=  HI(InfoWord) = 1 -> Room Avail in output buffer    }
{                         HI(InfoWord) = 0 -> No Room Avail in output buffer }
{                                                                            }
{         serRecvChar :=  HI(InfoWord)   -> Character Received               }
{                                                                            }
{         serRecvLine :=  InfoPointer    -> Points to a port/string record   }
{                                                                            }
{                         InfoByte       -> For all, gives the port number   }
{ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}

PROCEDURE FSerial.Idle;
VAR   Event : TEvent;
      p     : PSList;
BEGIN
   IF (OpenPorts^.Count <> 0) THEN
      BEGIN
         LastPort := (LastPort + 1) MOD OpenPorts^.Count;
         Event.What := evSerial;
         p := OpenPorts^.AT(LastPort);
{$IFDEF FOSSILDRIVER}
         IF p^.PortType = SerFossil THEN
            BEGIN
               Regs.AH := $03;
               Regs.DX := p^.SerialPort;
               Event.InfoByte := Regs.DX;
               INTR(Fossil,Regs);
               IF p^.Carrier XOR (Regs.AL AND $80 = $80) THEN
                  BEGIN
                     p^.Carrier := NOT p^.Carrier;
                     Event.Command := serCarrier;
                     INC(Event.InfoWord,BYTE(p^.Carrier) SHL 8);
                     IF EventGenerate THEN
                        PutEvent(Event);
                     EXIT
                  END;
               IF p^.TxBuffer XOR (Regs.AH AND $20 = $20) THEN
                  BEGIN
                     p^.TxBuffer := NOT p^.TxBuffer;
                     Event.Command := serTxBuffer;
                     INC(Event.InfoWord,BYTE(p^.TxBuffer) SHL 8);
                     IF EventGenerate THEN
                        PutEvent(Event);
                     EXIT
                  END;
               IF EventGenerate AND (Regs.AH AND $01 = $01) THEN
                  BEGIN
                     Regs.AH := $18;
                     Regs.CX := 255;
                     Regs.ES := SEG(RecvBuf.St[1]);
                     Regs.DI := OFS(RecvBuf.St[1]);
                     INTR(Fossil,Regs);
                     IF Regs.AX = 1 THEN
                        BEGIN
                           Event.Command := serRecvChar;
                           INC(Event.InfoWord,BYTE(RecvBuf.St[1]) SHL 8);
                           PutEvent(Event)
                        END;
                     IF Regs.AX > 1 THEN
                        BEGIN
                           Event.Command := serRecvLine;
                           Event.InfoPtr := ADDR(RecvBuf);
                           RecvBuf.Port := p^.SerialPort;
                           RecvBuf.St[0] := CHAR(Regs.AX);
                           PutEvent(Event)
                        END
                  END
            END;
{$ENDIF}
{$IFDEF SERIALDRIVER}
         IF p^.PortType = SerStd THEN
            BEGIN

            END
{$ENDIF}
      END
END;

{----------------------------------------------------------------------------}

PROCEDURE FSerial.HandleEvent;
BEGIN
   TView.HandleEvent(Event);
   IF Event.What = evSerial THEN
      CASE Event.Command OF
         serBaud        : SetBaud(Event.InfoByte,Event.InfoLong SHR 16);
         serSend        : SendChar(Event.InfoByte,HI(Event.InfoWord));
         serInit        : InitPort(Event.InfoByte);
         serDeInit      : RemovePort(Event.InfoByte);
         serRaiseDTR    : DTRState(Event.InfoByte,TRUE);
         serLowerDTR    : DTRState(Event.InfoByte,FALSE);
         serPurgeTx     : PurgeOutputBuf(Event.InfoByte);
         serPurgeRx     : PurgeInputBuf(Event.InfoByte);
         serFlow        : FlowControl(Event.InfoByte,HI(Event.InfoWord));
         serCarrierReq  : SerialRequest(serCarrierReq,Event.InfoByte);
         serTxBufferReq : SerialRequest(serTxBufferReq,Event.InfoByte);
         serEventGenOn  : GenerateEvents(TRUE);
         serEventGenOff : GenerateEvents(FALSE);
         ELSE       EXIT;
      END
   ELSE
      EXIT;
   ClearEvent(Event)
END;

{----------------------------------------------------------------------------}

PROCEDURE RegisterSerial;
BEGIN
   RegisterType(RSerial);
   RegisterType(RSList);
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.