home *** CD-ROM | disk | FTP | other *** search
- { Konstanten und Deklarationen für die V24-Units }
- { Peter Zwosta }
-
- Unit CommCons;
-
- INTERFACE { *********************************************************}
-
-
-
- type
- { Bei InitComPort - Communit zu verwendende BaudRaten }
- BaudType = (B300, B600, B1200, B2400, B4800, B9600,
- B19200, B38400);
-
- const
- { wird in InitComport - CommUnit verwendet: BaudTab[ord(Baud)] }
- BaudTab : array[0..7] of longint
- = (300, 600, 1200, 2400, 4800, 9600, 19200, 38400);
-
- PulsWahl = 'ATDP';
- TonWahl = 'ATDT';
-
- MaxPorts = 4; { max. unterstützte Ports }
-
- { COM-Ports }
- COM1 = $00;
- COM2 = $01;
- COM3 = $02;
- COM4 = $03;
- NoPort = $FF;
-
- PortString : array[0..3] of string
- = ('COM1', 'COM2', 'COM3', 'COM4');
-
- { Portadresse des Interrupt-Command Registers (ICR) des }
- { Programmable Interrupt Controllers (PIC) }
- PIC_ICR = $20;
- { Portadresse des Interrupt Mask Registers (IMR) des PIC }
- { Ist in diesem Register ein Bit = 1 (maskiert), }
- { dann werden ankommende IRQ's mit dieser Nummer }
- { NICHT weitergeleitet. }
- PIC_IMR = $21;
-
- { End of Interrupt - ist das Ereignis durch die Interrupt- }
- { Routine bearbeitet, dann muß sie dem PIC (über }
- { das ICR) mitteilen, daß sie jetzt fertig ist und }
- { der nächste IRQ bearbeitet werden kann. Dazu }
- { sendet die Interrupt-Routine ein EOI (End of }
- { Interrupt) an das ICR. }
- EOI = $20;
-
- { Basisadressen der COM-PORTS }
- ComBase : array[0..3] of word = ($03f8, $02f8, $03e8, $02e8);
- { erleichtert das wieder Zuweisen bei Änderungen }
- DefaultComBase
- : array[0..3] of word = ($03f8, $02f8, $03e8, $02e8);
- { IRQ's - Nummer des IRQ, den die COM-Ports verwenden. }
- { Beispiel: COMIRQ[COM1] := 4; }
- { Die Nummer des IRQ entspricht jeweils der Nummer des }
- { Bits in PIC_IMR . Für IRQ 3 muß PIC_IMR also }
- { xxxx 0xxx gesetzt werden. (Das vierte Bit von links }
- { hat die Nummer 3.) }
- COMIRQ : array[0..MaxPorts-1] of byte = (4, 3, 4, 3);
- DefaultCOMIRQ : array[0..MaxPorts-1] of byte = (4, 3, 4, 3);
-
- { Interrupts zu den IRQ's, ergeben sich normalerweise aus }
- { IRQ + 8 }
- COMINT : array[0..MaxPorts-1] of byte = (12, 11, 12, 11);
- DefaultCOMINT
- : array[0..MaxPorts-1] of byte = (12, 11, 12, 11);
-
- { Art des Handshake }
- NoHandShake = $0000; { keiner }
- RTS_CTS = $0001; { Hardwarehandshake }
- XON_XOFF = $0002; { Softwarehandshake }
-
- { Für Software-Handshake }
- XON = $11; { 17 }
- XOFF = $13; { 19 }
-
- { Adressen der Register relativ zu COM-Base }
- THR = 0; { Transmit Holding Register (senden) }
- RHR = 0; { Receive Holding Register (empfangenes Byte) }
- DLL = 0; { niederwertiges Byte des Divisor Latch Registers }
- { (Baudratenregister) }
- DLH = 1; { höherwertiges Byte des Divisor Latch Registers }
- IER = 1; { Interrupt Enable Register }
- { - Interruptfreigabe-Register }
- IIR = 2; { Interrupt Identification Register }
- { - Unterbrechungskennungs-Register }
- LCR = 3; { Line Control Register - Leitungssteuer-Register }
- MCR = 4; { Modem Control Register - Modemsteuer-Register }
- LSR = 5; { Line Status Register - Leitungsstatus-Register }
- MSR = 6; { Modem Status Register }
-
- {--------------------------------------------------------------}
- { Interruptfreigabe-Register (Interrupt Enable Register, IER) }
- { Bestimmt, bei welchen Ereignissen ein Interrupt }
- { ausgelöst werden soll. }
- { Bit Interrupt auslösen, wenn ... }
- { ------------------------------------------------------------ }
- { 0 Daten bereitstehen (in RHR) xxxx xxx1 }
- { 1 Transmit Holding Register leer xxxx xx1x }
- { 2 Fehler beim Datenempfang xxxx x1xx }
- { 3 sich das Modem Status Register ändert xxxx 1xxx }
- { 4-7 werden nicht verwendet XXXX xxxx }
-
- IER_RHR = $01; { Interrupt, wenn Daten bereitstehen xxxx xxx1 }
- IER_MSR = $08; { Interrupt, wenn sich der Modemstatus ändert }
- { xxxx 1xxx }
-
- {--------------------------------------------------------------}
- { Unterbrechungskennungs-Register (Interrupt Identification }
- { Register, IIR) }
- { Wurden im IER mehrere Ereignisse definiert, bei }
- { denen ein Interrupt ausgelöst werden soll, dann }
- { dient dieses Register dazu das Ereignis nach }
- { einem Interrupt zu identifizieren. }
- { Bit Ereignis }
- { ------------------------------------------------------------ }
- { 0 Interrupt wird gerade durchgeführt }
- { 1-2 Interrupt Identification Code }
- { 00 -> Modem Status Register geändert xxxx x00x }
- { 01 -> Transmitter Holding Register leer xxxx x01x }
- { 10 -> Daten stehen bereit (in RHR) xxxx x10x }
- { 11 -> Fehler beim Datenempfang oder Break entdeckt }
- { xxxx x11x }
- { 3-7 werden nicht verwendet }
- { ------------------------------------------------------------ }
- { Nur für 16550 }
- { ------------------------------------------------------------ }
- { Bei lesendem Zugriff }
- { 3 FIFO Timeout. Werden eine bestimmte Zeit lang keine }
- { weiteren Zeichen in den Puffer übertragen, dann wird }
- { ein Interrupt ausgelöst, der dazu auffordert, die }
- { angefallenen Zeichen abzuholen. xxxx 1xxx }
- { 6 FIFO ein (nur 16550A) x1xx xxxx }
- { 7 FIFO ein 1xxx xxxx }
- { Bei schreibendem Zugriff }
- { 0 FIFO Enable, FIFO aktivieren xxxx xxx1 }
- { 1 FIFO Reset Receive (Empf.Puffer löschen) xxxx xx1x }
- { 2 FIFO Reset Transmit (Sende.Puffer lösch.) xxxx x1xx }
- { 6-7 Trigger Level. Bestimmen nach wievielen eingegangen }
- { Zeichen ein Interrupt ausgelöst werden soll. }
- { 00: nach 1 Byte 00xx xxxx }
- { 01: nach 4 Bytes 01xx xxxx }
- { 10: nach 8 Bytes 10xx xxxx }
- { 11: nach 14 Bytes 11xx xxxx }
- { ------------------------------------------------------------ }
-
- IIR_DataReady = $04; { Daten stehen bereit xxxx x10x }
- IIR_DRMask = $07; { (..IIR and IIR_DRMask) = IIR_DataReady }
- { xxxx x111 }
- IIR_MSRMask = $06; { zum Prüfen, ob sich der Modemstatus }
- { geändert hat. }
-
-
- {--------------------------------------------------------------}
- { Leitungssteuer-Register (Line Control, LCR) }
- { - Anzahl der Datenbits Bit 0-1 --------------------------- }
- Databit5 = $00; { 5 Datenbits xxxx xx00 }
- Databit6 = $01; { 6 Datenbits xxxx xx01 }
- Databit7 = $02; { 7 Datenbits xxxx xx10 }
- Databit8 = $03; { 8 Datenbits xxxx xx11 }
-
- { - Anzahl der Stopbits Bit 2 ----------------------------- }
- Stopbit1 = $00; { 1 Stopbit xxxx x0xx }
- Stopbit2 = $04; { 1,5 Stopbits bei 5-Bit-Wörtern sonst 2 }
- { xxxx x1xx }
- { - Art der Parität Bit 3-4 --------------------------- }
- { Bit 3 0 -> Parität aus }
- { 1 -> Parität ein }
- { Bit 4 0 -> ungerade }
- { 1 -> gerade }
- NoParity = $00; { keine Parität xxxx 0xxx }
- OddParity = $08; { ungerade Parität xxxx 1xxx }
- EvenParity = $18; { gerade Parität xxx1 1xxx }
-
- { - Sticky Parity Bit 5 --------------------xxXx-xxxx }
- { - Set Break Bit 6 --------------------xXxx-xxxx }
- { - Divisor Latch Bit Bit 7 --------------------Xxxx-xxxx }
- DLAB = $80; { muß vor dem Setzen der Geschwindigkeit }
- { 1 gesetzt und danach wieder abgeschalten }
- { werden. }
-
- {------------------------------------------------------------- }
- { Modemsteuer-Register (Modem Control, MCR) }
- DTR = $01; { Data Terminal Ready xxxx xxx1 }
- RTS = $02; { Request To send xxxx xx1x }
- OT1 = $04; { Output 1 xxxx x1xx }
- OT2 = $08; { Output 2 (für Interrupts) xxxx 1xxx }
- LP = $10; { Loop - UART Ausgabe als Input zurückliefern }
- { xxx1 xxxx }
- { Die Bits 5-7 werden nicht verwendet XXXx xxxx }
-
- {--------------------------------------------------------------}
- { Leitungsstatus-Register (Line Status, LSR) }
- DataReady = $01; { Daten stehen bereit xxxx xxx1 }
- OverRunError = $02; { Datenreg. überschrieben xxxx xx1x }
- ParityError = $04; { Paritätsfehler, schlechte Übertragung }
- { xxxx x1xx }
- FramingError = $08; { kein Stopbit gefunden xxxx 1xxx }
- BreakInterrupt = $10; { Unterbrechung entdeckt xxx1 xxxx }
- THREmpty = $20; { Transmission-Hold-Reg. leer xx1x xxxx }
- TSREmpty = $40; { Transmission-Shift-Reg.leer x1xx xxxx }
- TimeOutError = $80; { Wartezeit für Verbind. überschritten }
- { 1xxx xxxx }
-
- {------------------------------------------------------------- }
- { Modemsstatus-Register (Modem Status, MSR) }
- DCTS = $01; { Delta Clear To Send, Zustand von CTS hat sich }
- { geändert xxxx xxx1 }
- DDSR = $02; { Delta Data Set Ready, Zustand von DSR hat sich }
- { geändert xxxx xx1x }
- DRI = $04; { Delta Ring Indicator, Zustand von RI hat sich }
- { geändert xxxx x1xx }
- DCD = $08; { Delta Carrier Detect, Zustand von CD hat sich }
- { geändert xxxx 1xxx }
- CTS = $10; { Clear To Send, Modem zum Senden bereit xxx1 xxxx }
- DSR = $20; { Data Set Ready, Modem ist angeschalten xx1x xxxx }
- RI = $40; { Ring Indicator, eigehender Anruf x1xx xxxx }
- CD = $80; { Carrier Detect, Verbindung aufgebaut 1xxx xxxx }
-
-
- IMPLEMENTATION {*****************************************************}
-
- END.