|
@@ -16,25 +16,23 @@
|
|
|
|
|
|
unit serial;
|
|
|
|
|
|
-INTERFACE
|
|
|
+interface
|
|
|
+{$PACKRECORDS 2}
|
|
|
|
|
|
-uses exec;
|
|
|
+uses
|
|
|
+ exec;
|
|
|
|
|
|
+type
|
|
|
|
|
|
-Type
|
|
|
+ // array of termination char's to use,see serial.doc setparams
|
|
|
+ PIOTArray = ^TIOTArray;
|
|
|
+ TIOTArray = record
|
|
|
+ TermArray0: LongWord;
|
|
|
+ TermArray1: LongWord;
|
|
|
+ end;
|
|
|
|
|
|
- { array of termination char's }
|
|
|
- { to use,see serial.doc setparams }
|
|
|
-
|
|
|
- pIOTArray = ^tIOTArray;
|
|
|
- tIOTArray = record
|
|
|
- TermArray0 : ULONG;
|
|
|
- TermArray1 : ULONG;
|
|
|
- end;
|
|
|
-
|
|
|
-Const
|
|
|
-
|
|
|
- SER_DEFAULT_CTLCHAR = $11130000; { default chars for xON,xOFF }
|
|
|
+const
|
|
|
+ SER_DEFAULT_CTLCHAR = $11130000; // default chars for xON,xOFF
|
|
|
|
|
|
{ You may change these via SETPARAMS. At this time, parity is not
|
|
|
calculated for xON/xOFF characters. You must supply them with the
|
|
@@ -45,151 +43,123 @@ Const
|
|
|
IOExtSer-sized structure or you may overlay innocent memory !! }
|
|
|
{****************************************************************}
|
|
|
|
|
|
-Type
|
|
|
-
|
|
|
- pIOExtSer = ^tIOExtSer;
|
|
|
- tIOExtSer = record
|
|
|
- IOSer : tIOStdReq;
|
|
|
-
|
|
|
-{ STRUCT MsgNode
|
|
|
-* 0 APTR Succ
|
|
|
-* 4 APTR Pred
|
|
|
-* 8 UBYTE Type
|
|
|
-* 9 UBYTE Pri
|
|
|
-* A APTR Name
|
|
|
-* E APTR ReplyPort
|
|
|
-* 12 UWORD MNLength
|
|
|
-* STRUCT IOExt
|
|
|
-* 14 APTR io_Device
|
|
|
-* 18 APTR io_Unit
|
|
|
-* 1C UWORD io_Command
|
|
|
-* 1E UBYTE io_Flags
|
|
|
-* 1F UBYTE io_Error
|
|
|
-* STRUCT IOStdExt
|
|
|
-* 20 ULONG io_Actual
|
|
|
-* 24 ULONG io_Length
|
|
|
-* 28 APTR io_Data
|
|
|
-* 2C ULONG io_Offset
|
|
|
-*
|
|
|
-* 30 }
|
|
|
-
|
|
|
- io_CtlChar : ULONG; { control char's (order = xON,xOFF,INQ,ACK) }
|
|
|
- io_RBufLen : ULONG; { length in bytes of serial port's read buffer }
|
|
|
- io_ExtFlags : ULONG; { additional serial flags (see bitdefs below) }
|
|
|
- io_Baud : ULONG; { baud rate requested (true baud) }
|
|
|
- io_BrkTime : ULONG; { duration of break signal in MICROseconds }
|
|
|
- io_TermArray : tIOTArray; { termination character array }
|
|
|
- io_ReadLen : Byte; { bits per read character (# of bits) }
|
|
|
- io_WriteLen : Byte; { bits per write character (# of bits) }
|
|
|
- io_StopBits : Byte; { stopbits for read (# of bits) }
|
|
|
- io_SerFlags : Byte; { see SerFlags bit definitions below }
|
|
|
- io_Status : Word;
|
|
|
- end;
|
|
|
-
|
|
|
- { status of serial port, as follows:
|
|
|
-* BIT ACTIVE FUNCTION
|
|
|
-* 0 --- reserved
|
|
|
-* 1 --- reserved
|
|
|
-* 2 high Connected to parallel "select" on the A1000.
|
|
|
-* Connected to both the parallel "select" and
|
|
|
-* serial "ring indicator" pins on the A500 &
|
|
|
-* A2000. Take care when making cables.
|
|
|
-* 3 low Data Set Ready
|
|
|
-* 4 low Clear To Send
|
|
|
-* 5 low Carrier Detect
|
|
|
-* 6 low Ready To Send
|
|
|
-* 7 low Data Terminal Ready
|
|
|
-* 8 high read overrun
|
|
|
-* 9 high break sent
|
|
|
-* 10 high break received
|
|
|
-* 11 high transmit x-OFFed
|
|
|
-* 12 high receive x-OFFed
|
|
|
-* 13-15 reserved
|
|
|
-}
|
|
|
-
|
|
|
-Const
|
|
|
-
|
|
|
- SDCMD_QUERY = CMD_NONSTD;
|
|
|
- SDCMD_BREAK = CMD_NONSTD + 1;
|
|
|
- SDCMD_SETPARAMS = CMD_NONSTD + 2;
|
|
|
-
|
|
|
-
|
|
|
- SERB_XDISABLED = 7; { io_SerFlags xOn-xOff feature disabled bit }
|
|
|
- SERF_XDISABLED = 128; { " xOn-xOff feature disabled mask }
|
|
|
- SERB_EOFMODE = 6; { " EOF mode enabled bit }
|
|
|
- SERF_EOFMODE = 64; { " EOF mode enabled mask }
|
|
|
- SERB_SHARED = 5; { " non-exclusive access bit }
|
|
|
- SERF_SHARED = 32; { " non-exclusive access mask }
|
|
|
- SERB_RAD_BOOGIE = 4; { " high-speed mode active bit }
|
|
|
- SERF_RAD_BOOGIE = 16; { " high-speed mode active mask }
|
|
|
- SERB_QUEUEDBRK = 3; { " queue this Break ioRqst }
|
|
|
- SERF_QUEUEDBRK = 8; { " queue this Break ioRqst }
|
|
|
- SERB_7WIRE = 2; { " RS232 7-wire protocol }
|
|
|
- SERF_7WIRE = 4; { " RS232 7-wire protocol }
|
|
|
- SERB_PARTY_ODD = 1; { " parity feature enabled bit }
|
|
|
- SERF_PARTY_ODD = 2; { " parity feature enabled mask }
|
|
|
- SERB_PARTY_ON = 0; { " parity-enabled bit }
|
|
|
- SERF_PARTY_ON = 1; { " parity-enabled mask }
|
|
|
-
|
|
|
-{ These now refect the actual bit positions in the io_Status UWORD }
|
|
|
-
|
|
|
- IO_STATB_XOFFREAD = 12; { io_Status receive currently xOFF'ed bit }
|
|
|
- IO_STATF_XOFFREAD = $1000; { " receive currently xOFF'ed mask }
|
|
|
- IO_STATB_XOFFWRITE = 11; { " transmit currently xOFF'ed bit }
|
|
|
- IO_STATF_XOFFWRITE = $0800; { " transmit currently xOFF'ed mask }
|
|
|
- IO_STATB_READBREAK = 10; { " break was latest input bit }
|
|
|
- IO_STATF_READBREAK = $0400; { " break was latest input mask }
|
|
|
- IO_STATB_WROTEBREAK = 9; { " break was latest output bit }
|
|
|
- IO_STATF_WROTEBREAK = $0200; { " break was latest output mask }
|
|
|
- IO_STATB_OVERRUN = 8; { " status word RBF overrun bit }
|
|
|
- IO_STATF_OVERRUN = $0100; { " status word RBF overrun mask }
|
|
|
-
|
|
|
-
|
|
|
- SEXTB_MSPON = 1; { io_ExtFlags. Use mark-space parity, }
|
|
|
- { instead of odd-even. }
|
|
|
- SEXTF_MSPON = 2; { " mark-space parity mask }
|
|
|
- SEXTB_MARK = 0; { " if mark-space, use mark }
|
|
|
- SEXTF_MARK = 1; { " if mark-space, use mark mask }
|
|
|
-
|
|
|
-
|
|
|
- SerErr_DevBusy = 1;
|
|
|
- SerErr_BaudMismatch = 2; { baud rate not supported by hardware }
|
|
|
- SerErr_BufErr = 4; { Failed to allocate new read buffer }
|
|
|
- SerErr_InvParam = 5;
|
|
|
- SerErr_LineErr = 6;
|
|
|
- SerErr_ParityErr = 9;
|
|
|
- SerErr_TimerErr = 11; {(See the serial/OpenDevice autodoc)}
|
|
|
- SerErr_BufOverflow = 12;
|
|
|
- SerErr_NoDSR = 13;
|
|
|
- SerErr_DetectedBreak = 15;
|
|
|
+type
|
|
|
+ TIOExtSer = record
|
|
|
+ IOSer: TIOStdReq;
|
|
|
+ io_CtlChar: LongWord; // control characters
|
|
|
+ io_RBufLen: LongWord; // length in bytes of serial read buffer
|
|
|
+ io_ExtFlags: LongWord; // additional serial flags (SEXTB_*)
|
|
|
+ io_Baud: LongWord; // baud rate
|
|
|
+ io_BrkTime: LongWord; // duration of break in microseconds
|
|
|
+ io_TermArray: TIOTArray; // termination character array
|
|
|
+ io_ReadLen: Byte; // number of bits per read character
|
|
|
+ io_WriteLen: Byte; // number of bits per write character
|
|
|
+ io_StopBits: Byte; // number of stopbits for read
|
|
|
+ io_SerFlags: Byte; // serial device flags (SERB_*)
|
|
|
+ io_Status: Word; // status of serial port and lines (IO_STATF_*, IOSTF_*)
|
|
|
+ end;
|
|
|
+ PIOExtSer = ^TIOExtSer;
|
|
|
+
|
|
|
+ { status of serial port, as follows:
|
|
|
+ BIT ACTIVE FUNCTION
|
|
|
+ 0 --- reserved
|
|
|
+ 1 --- reserved
|
|
|
+ 2 high Connected to parallel "select" on the A1000.
|
|
|
+ Connected to both the parallel "select" and
|
|
|
+ serial "ring indicator" pins on the A500 &
|
|
|
+ A2000. Take care when making cables.
|
|
|
+ 3 low Data Set Ready
|
|
|
+ 4 low Clear To Send
|
|
|
+ 5 low Carrier Detect
|
|
|
+ 6 low Ready To Send
|
|
|
+ 7 low Data Terminal Ready
|
|
|
+ 8 high read overrun
|
|
|
+ 9 high break sent
|
|
|
+ 10 high break received
|
|
|
+ 11 high transmit x-OFFed
|
|
|
+ 12 high receive x-OFFed
|
|
|
+ 13-15 reserved}
|
|
|
+
|
|
|
+const
|
|
|
+ SDCMD_QUERY = CMD_NONSTD;
|
|
|
+ SDCMD_BREAK = CMD_NONSTD + 1;
|
|
|
+ SDCMD_SETPARAMS = CMD_NONSTD + 2;
|
|
|
+
|
|
|
+ // flags of TIOExtSer.io_SerFlags
|
|
|
+ SERB_XDISABLED = 7; // xOn-xOff feature disabled
|
|
|
+ SERF_XDISABLED = 1 shl SERB_XDISABLED;
|
|
|
+ SERB_EOFMODE = 6; // EOF mode enabled
|
|
|
+ SERF_EOFMODE = 1 shl SERB_EOFMODE;
|
|
|
+ SERB_SHARED = 5; // non-exclusive access
|
|
|
+ SERF_SHARED = 1 shl SERB_SHARED;
|
|
|
+ SERB_RAD_BOOGIE = 4; // high-speed mode active
|
|
|
+ SERF_RAD_BOOGIE = 1 shl SERB_RAD_BOOGIE;
|
|
|
+ SERB_QUEUEDBRK = 3; // queue this Break ioRqst
|
|
|
+ SERF_QUEUEDBRK = 1 shl SERB_QUEUEDBRK;
|
|
|
+ SERB_7WIRE = 2; // RS232 7-wire protocol
|
|
|
+ SERF_7WIRE = 1 shl SERB_7WIRE;
|
|
|
+ SERB_PARTY_ODD = 1; // parity feature enabled
|
|
|
+ SERF_PARTY_ODD = 1 shl SERB_PARTY_ODD;
|
|
|
+ SERB_PARTY_ON = 0; // parity-enabled
|
|
|
+ SERF_PARTY_ON = 1 shl SERB_PARTY_ON;
|
|
|
+
|
|
|
+// These now refect the actual bit positions in the TIOExtSer.io_Status LongWord
|
|
|
+ IO_STATB_XOFFREAD = 12; // receive currently xOFF'ed
|
|
|
+ IO_STATF_XOFFREAD = 1 shl IO_STATB_XOFFREAD;
|
|
|
+ IO_STATB_XOFFWRITE = 11; // transmit currently xOFF'ed
|
|
|
+ IO_STATF_XOFFWRITE = 1 shl IO_STATB_XOFFWRITE;
|
|
|
+ IO_STATB_READBREAK = 10; // break was latest input
|
|
|
+ IO_STATF_READBREAK = 1 shl IO_STATB_READBREAK;
|
|
|
+ IO_STATB_WROTEBREAK = 9; // break was latest output
|
|
|
+ IO_STATF_WROTEBREAK = 1 shl IO_STATB_WROTEBREAK;
|
|
|
+ IO_STATB_OVERRUN = 8; // status word RBF overrun
|
|
|
+ IO_STATF_OVERRUN = 1 shl IO_STATB_OVERRUN;
|
|
|
+
|
|
|
+// TIOExtSer.io_ExtFlags
|
|
|
+ SEXTB_MSPON = 1; // Use mark-space parity, instead of odd-even.
|
|
|
+ SEXTF_MSPON = 1 shl SEXTB_MSPON;
|
|
|
+ SEXTB_MARK = 0; // if mark-space, use mark
|
|
|
+ SEXTF_MARK = 1 shl SEXTB_MARK;
|
|
|
+
|
|
|
+ SerErr_DevBusy = 1;
|
|
|
+ SerErr_BaudMismatch = 2; // baud rate not supported by hardware
|
|
|
+ SerErr_BufErr = 4; // Failed to allocate new read buffer
|
|
|
+ SerErr_InvParam = 5;
|
|
|
+ SerErr_LineErr = 6;
|
|
|
+ SerErr_ParityErr = 9;
|
|
|
+ SerErr_TimerErr = 11; // (See the serial/OpenDevice autodoc)
|
|
|
+ SerErr_BufOverflow = 12;
|
|
|
+ SerErr_NoDSR = 13;
|
|
|
+ SerErr_DetectedBreak = 15;
|
|
|
|
|
|
|
|
|
{ These defines refer to the HIGH ORDER byte of io_Status. They have
|
|
|
been replaced by the new, corrected ones above }
|
|
|
- IOSTB_XOFFREAD = 4; { iost_hob receive currently xOFF'ed bit }
|
|
|
- IOSTF_XOFFREAD = 16; { " receive currently xOFF'ed mask }
|
|
|
- IOSTB_XOFFWRITE = 3; { " transmit currently xOFF'ed bit }
|
|
|
- IOSTF_XOFFWRITE = 8; { " transmit currently xOFF'ed mask }
|
|
|
- IOSTB_READBREAK = 2; { " break was latest input bit }
|
|
|
- IOSTF_READBREAK = 4; { " break was latest input mask }
|
|
|
- IOSTB_WROTEBREAK= 1; { " break was latest output bit }
|
|
|
- IOSTF_WROTEBREAK= 2; { " break was latest output mask }
|
|
|
- IOSTB_OVERRUN = 0; { " status word RBF overrun bit }
|
|
|
- IOSTF_OVERRUN = 1; { " status word RBF overrun mask }
|
|
|
-
|
|
|
- IOSERB_BUFRREAD = 7 ; { io_Flags from read buffer bit }
|
|
|
- IOSERF_BUFRREAD = 128; { " from read buffer mask }
|
|
|
- IOSERB_QUEUED = 6 ; { " rqst-queued bit }
|
|
|
- IOSERF_QUEUED = 64 ; { " rqst-queued mask }
|
|
|
- IOSERB_ABORT = 5 ; { " rqst-aborted bit }
|
|
|
- IOSERF_ABORT = 32 ; { " rqst-aborted mask }
|
|
|
- IOSERB_ACTIVE = 4 ; { " rqst-qued-OR-current bit }
|
|
|
- IOSERF_ACTIVE = 16 ; { " rqst-qued-OR-current mask }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- SERIALNAME : PChar = 'serial.device';
|
|
|
-
|
|
|
-IMPLEMENTATION
|
|
|
+ IOSTB_XOFFREAD = 4; // receive currently xOFF'ed
|
|
|
+ IOSTF_XOFFREAD = 1 shl IOSTB_XOFFREAD;
|
|
|
+ IOSTB_XOFFWRITE = 3; // transmit currently xOFF'ed
|
|
|
+ IOSTF_XOFFWRITE = 1 shl IOSTB_XOFFWRITE;
|
|
|
+ IOSTB_READBREAK = 2; // break was latest input
|
|
|
+ IOSTF_READBREAK = 1 shl IOSTB_READBREAK;
|
|
|
+ IOSTB_WROTEBREAK= 1; // break was latest output
|
|
|
+ IOSTF_WROTEBREAK= 1 shl IOSTB_WROTEBREAK;
|
|
|
+ IOSTB_OVERRUN = 0; // status word RBF overrun
|
|
|
+ IOSTF_OVERRUN = 1 shl IOSTB_OVERRUN;
|
|
|
+
|
|
|
+// TIOExtSer.io_Flags
|
|
|
+ IOSERB_BUFRREAD = 7; // from read buffer
|
|
|
+ IOSERF_BUFRREAD = 1 shl IOSERB_BUFRREAD;
|
|
|
+ IOSERB_QUEUED = 6; // rqst-queued
|
|
|
+ IOSERF_QUEUED = 1 shl IOSERB_QUEUED;
|
|
|
+ IOSERB_ABORT = 5; // rqst-aborted
|
|
|
+ IOSERF_ABORT = 1 shl IOSERB_ABORT;
|
|
|
+ IOSERB_ACTIVE = 4; // rqst-qued-OR-current
|
|
|
+ IOSERF_ACTIVE = 1 shl IOSERB_ACTIVE;
|
|
|
+
|
|
|
+ SERIALNAME: PChar = 'serial.device';
|
|
|
+
|
|
|
+implementation
|
|
|
+
|
|
|
+
|
|
|
|
|
|
end.
|