home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
sonderh1
/
dfmasch2.inc
< prev
next >
Wrap
Text File
|
1987-06-10
|
4KB
|
142 lines
(*---------------------------------------------------------------------------*)
(* 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 *)
(*---------------------------------------------------------------------------*)