home *** CD-ROM | disk | FTP | other *** search
- (*---------------------------------------------------------------------------*)
- (* DFMASCH2.INC *)
- (* serielle Schnittstelle mit MS-DOS *)
- (* BIOS-Funktion 20 UND PORTZUGRIFFEN bedienen *)
-
- (* Es folgen die Funktionen InpStatus(Boolean) und InpSIO(Char),
- InpStatus ist TRUE, wenn ein Zeichen an der seriellen Schnitt-
- stelle vorliegt, InpSIO liefert ein Zeichen von der SIO. *)
-
- FUNCTION InpSIO : CHAR;
-
- VAR Regs : RECORD
- AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
- END;
-
- BEGIN
- Regs.AX := 512;
- Regs.DX := 0;
- Intr(20,Regs);
- IF Regs.AX DIV 256 <> 0 THEN (* Highbyte enthaelt Fehlermeldung *)
- InpSIO := Chr(0)
- ELSE
- InpSIO := Chr(Regs.AX MOD 256) (* Lowbyte enthaelt Zeichen *)
- END;
-
-
-
- FUNCTION InpStatus : BOOLEAN;
-
- VAR Regs : RECORD
- AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
- END;
- AH : INTEGER;
-
- BEGIN
- Regs.AX := 768;
- Regs.DX := 0;
- Intr(20,Regs);
- AH := Regs.AX DIV 256;
- InpStatus := ((AH AND 1) <> 0)
- END;
-
-
-
- (* Die Funktionen OutStatus(BOOLEAN) und die Prozedur OutSIO(CHAR) liefern
- den Status des Sio-Outkanals und senden ein Zeichen (siehe auch oben). *)
-
- FUNCTION OutStatus : BOOLEAN;
-
- VAR Regs : RECORD
- AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
- END;
- AL : INTEGER;
-
- BEGIN
- Regs.AX := 768;
- Regs.DX := 0;
- Intr(20,Regs);
- AL := Regs.AX MOD 256;
- OutStatus := NOT ((AL AND 16) <> 0)
- END;
-
-
-
- PROCEDURE OutSIO(Zeichen : CHAR) ;
-
- (* Dieser auskommentierte Teil benutzt zum Zeichensenden einen MS-DOS *)
- (* Betriebssystemaufruf. Aus noch nicht geklaerten Gruenden funktioniert *)
- (* diese Version auf den zur Verfuegung stehenden MS-DOS Rechnern nicht. *)
- (* Daher die Version, die direkt ueber einen Portzugriff ein Zeichen *)
- (* hinausschreibt. *)
- (* *)
- (* VAR Regs : RECORD *)
- (* AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER *)
- (* END; *)
- (* AL : INTEGER; *)
- (* *)
- (* BEGIN *)
- (* Regs.AX := 256 + ord(Zeichen); *)
- (* Regs.DX := 0; *)
- (* Intr(20,Regs) *)
- (* END; *)
-
- CONST
- DataPort = $3F8 ; (* TxD, RxD *)
- LineStatus = $3FD ; (* Rechner-Bus-Signale des UARTs *)
- TransmEmpty = $20 ; (* Senderegister bereit *)
-
- BEGIN
- WHILE NOT ((Port[LineStatus] AND TransmEmpty) = TransmEmpty) DO (* warten *);
- Port[DataPort] := Ord(Zeichen)
- END;
-
-
-
- (* Die Prozedur Parameter fragt die zu setzenden Parameter ab,
- Setze_Parameter stellt dann die SIO ein. *)
-
- PROCEDURE Setze_Parameter;
-
-
- VAR Regs : RECORD
- AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
- END;
- Wert : INTEGER;
-
- BEGIN
- Wert := 2;
- CASE Param[1] OF
- 1 : Wert := Wert + 64;
- 2 : Wert := Wert + 32;
- 3 : Wert := Wert + 96;
- 4 : Wert := Wert + 128
- END;
- CASE Param[2] OF
- 1 : Wert := Wert + 1;
- 2 :
- END;
- CASE Param[3] OF
- 1 : ;
- 2 : Wert := Wert + 4
- END;
- CASE Param[4] OF
- 1 : ;
- 2 : Wert := Wert + 24;
- 3 : Wert := Wert + 8
- END;
- VollDuplex := (Param[5] = 1);
- LineFeed := (Param[6] = 2);
- CASE Param[7] OF
- 1 : Zeit := 0;
- 2 : Zeit := 10;
- 3 : Zeit := 100
- END;
- Regs.AX := Wert;
- Regs.DX := 0;
- Intr(20,Regs)
- END;
-
-
- (* Ende DFMASCH2.INC *)
- (*---------------------------------------------------------------------------*)