home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
progm
/
pibasy.zip
/
PIBASYNC.GLO
< prev
next >
Wrap
Text File
|
1987-11-11
|
8KB
|
150 lines
(*----------------------------------------------------------------------*)
(* *)
(* COMMUNICATIONS HARDWARE ADDRESSES *)
(* *)
(* These are specific to IBM PCs and close compatibles. *)
(* *)
(*----------------------------------------------------------------------*)
CONST
UART_THR = $00; (* offset from base of UART Registers for IBM PC *)
UART_RBR = $00;
UART_IER = $01;
UART_IIR = $02;
UART_LCR = $03;
UART_MCR = $04;
UART_LSR = $05;
UART_MSR = $06;
I8088_IMR = $21; (* port address of the Interrupt Mask Register *)
COM1_Base = $03F8; (* port addresses for the UART *)
COM2_Base = $02F8;
COM3_Base = $03E8;
COM4_Base = $02E8;
COM1_Irq = 4; (* Interrupt line for the UART *)
COM2_Irq = 3;
COM3_Irq = 4;
COM4_Irq = 3;
RS232_Base = $0400 (* Address of RS 232 com port pointer *);
MaxComPorts = 4 (* Four ports allowed by this code *);
(* STRUCTURED *) CONST
(* Port addresses of each com port *)
Default_Com_Base : ARRAY[1..MaxComPorts] OF WORD =
( COM1_Base, COM2_Base, COM3_Base, COM4_Base );
(* IRQ line for each port *)
Default_Com_Irq : ARRAY[1..MaxComPorts] OF INTEGER =
( COM1_Irq, COM2_Irq, COM3_Irq, COM4_Irq );
(*----------------------------------------------------------------------*)
(* *)
(* COMMUNICATIONS BUFFER VARIABLES *)
(* *)
(* The communications buffers are implemented as circular (ring) *)
(* buffers, or double-ended queues. The asynchronous I/O routines *)
(* enter characters in the receive buffer as they arrive at the *)
(* serial port. Higher-level routines may extract characters from *)
(* the receive buffer at leisure. Higher-level routines insert *)
(* characters into the send buffer. The asynchronous I/O routines *)
(* then send characters out the serial port when possible. *)
(* *)
(*----------------------------------------------------------------------*)
CONST
TimeOut = 256 (* TimeOut value *);
Async_XON = ^Q (* XON character *);
Async_XOFF = ^S (* XOFF character *);
Async_Overrun_Error = 2 (* overrun *);
Async_Parity_Error = 4 (* parity error *);
Async_Framing_Error = 8 (* framing error *);
Async_Break_Found = 16 (* break interrupt *);
Async_CTS = $10 (* Clear to send *);
Async_DSR = $20 (* Data set ready *);
TYPE
(* I/O buffer type for serial port *)
Async_Buffer_Type = ARRAY[0..1] OF CHAR;
Async_Ptr = ^Async_Buffer_Type;
VAR (* Port addresses for serial ports *)
Com_Base : ARRAY[1..MaxComPorts] OF WORD;
(* IRQ line for each serial port *)
Com_Irq : ARRAY[1..MaxComPorts] OF INTEGER;
VAR
Async_Buffer_Ptr : Async_Ptr (* Input buffer address *);
Async_OBuffer_Ptr : Async_Ptr (* Output buffer address *);
Async_Open_Flag : BOOLEAN (* true if port opened *);
Async_Port : INTEGER (* current open port number (1 -- 4) *);
Async_Base : INTEGER (* base for current open port *);
Async_Irq : INTEGER (* IRQ for current open port *);
Async_RS232 : INTEGER (* RS232 address for current port *);
Async_Buffer_Overflow : BOOLEAN (* True if buffer overflow has happened *);
Async_Buffer_Used : INTEGER (* Amount of input buffer used so far *);
Async_MaxBufferUsed : INTEGER (* Maximum amount of input buffer used *);
(* Async_Buffer empty if Head = Tail *)
Async_Buffer_Head : INTEGER (* Loc in Async_Buffer to put next char *);
Async_Buffer_Tail : INTEGER (* Loc in Async_Buffer to get next char *);
Async_Buffer_NewTail : INTEGER (* For updating tail value *);
Async_OBuffer_Overflow : BOOLEAN (* True if buffer overflow has happened *);
Async_OBuffer_Used : INTEGER (* Amount of output buffer used *);
Async_MaxOBufferUsed : INTEGER (* Max amount of output buffer used *);
(* Async_Buffer empty if Head = Tail *)
Async_OBuffer_Head : INTEGER (* Loc in Async_Buffer to put next char *);
Async_OBuffer_Tail : INTEGER (* Loc in Async_Buffer to get next char *);
Async_OBuffer_NewTail : INTEGER (* For updating tail value *);
Async_Buffer_Low : INTEGER (* Low point in receive buffer for XON *);
Async_Buffer_High : INTEGER (* High point in receive buffer for XOFF*);
Async_Buffer_High_2 : INTEGER (* Emergency point for XOFF *);
Async_XOFF_Sent : BOOLEAN (* If XOFF sent *);
Async_Send_XOFF : BOOLEAN (* TRUE to send XOFF ASAP *);
Async_XOFF_Received : BOOLEAN (* If XOFF received *);
Async_XOFF_Rec_Display : BOOLEAN (* If XOFF received *);
Async_XON_Rec_Display : BOOLEAN (* If XOFF received *);
Async_Baud_Rate : WORD (* Current baud rate *);
(* Save previous serial interrupt status *)
Async_Save_IAddr : POINTER;
Async_Do_CTS : BOOLEAN (* TRUE to do clear-to-send checking *);
Async_Do_DSR : BOOLEAN (* TRUE to do data-set-ready checking *);
Async_Do_XonXoff : BOOLEAN (* TRUE to do XON/XOFF flow checking *);
Async_Hard_Wired_On : BOOLEAN (* TRUE if hard-wired connection *);
Async_Break_Length : INTEGER (* Length of break in 1/10 seconds *);
Async_Line_Status : BYTE (* Line Status Reg at interrupt *);
Async_Modem_Status : BYTE (* Modem Status Reg at interrupt *);
Async_Line_Error_Flags : BYTE (* Line status bits accumulated *);
Async_Buffer_Size : INTEGER (* Stores input buffer size *);
Async_OBuffer_Size : INTEGER (* Stores output buffer size *);
Async_Uart_IER : INTEGER (* Interrupt enable register address *);
Async_Uart_IIR : INTEGER (* Interrupt ID register address *);
Async_Uart_MSR : INTEGER (* Modem status register address *);
Async_Uart_LSR : INTEGER (* Line status register address *);
Async_Output_Delay : INTEGER (* Delay in ms when output buffer full *);
Async_OneMSDelay : INTEGER (* Loop count value to effect 1 ms delay*);
(* Pointer to Async_Send routine *)
Async_Send_Addr : Async_Ptr;