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

  1. (*---------------------------------------------------------------------------*)
  2. (*                          DFMASCH2.INC                                     *)
  3. (*                  serielle Schnittstelle mit MS-DOS                        *)
  4. (*              BIOS-Funktion 20 UND PORTZUGRIFFEN bedienen                  *)
  5.  
  6. (* Es folgen die Funktionen InpStatus(Boolean) und InpSIO(Char),
  7.    InpStatus ist TRUE, wenn ein Zeichen an der seriellen Schnitt-
  8.    stelle vorliegt, InpSIO liefert ein Zeichen von der SIO.               *)
  9.  
  10. FUNCTION InpSIO : CHAR;
  11.  
  12. VAR Regs : RECORD
  13.              AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
  14.            END;
  15.  
  16. BEGIN
  17.   Regs.AX := 512;
  18.   Regs.DX := 0;
  19.   Intr(20,Regs);
  20.   IF Regs.AX DIV 256 <> 0 THEN       (* Highbyte enthaelt Fehlermeldung *)
  21.     InpSIO := Chr(0)
  22.   ELSE
  23.     InpSIO := Chr(Regs.AX MOD 256)   (* Lowbyte enthaelt Zeichen        *)
  24. END;
  25.  
  26.  
  27.  
  28. FUNCTION InpStatus : BOOLEAN;
  29.  
  30. VAR Regs : RECORD
  31.              AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
  32.            END;
  33.     AH : INTEGER;
  34.  
  35. BEGIN
  36.   Regs.AX := 768;
  37.   Regs.DX := 0;
  38.   Intr(20,Regs);
  39.   AH := Regs.AX DIV 256;
  40.   InpStatus := ((AH AND 1) <> 0)
  41. END;
  42.  
  43.  
  44.  
  45. (* Die Funktionen OutStatus(BOOLEAN) und die Prozedur OutSIO(CHAR) liefern
  46.    den Status des Sio-Outkanals und senden ein Zeichen (siehe auch oben).  *)
  47.  
  48. FUNCTION OutStatus : BOOLEAN;
  49.  
  50. VAR Regs : RECORD
  51.              AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
  52.            END;
  53.       AL : INTEGER;
  54.  
  55. BEGIN
  56.   Regs.AX := 768;
  57.   Regs.DX := 0;
  58.   Intr(20,Regs);
  59.   AL := Regs.AX MOD 256;
  60.   OutStatus := NOT ((AL AND 16) <> 0)
  61. END;
  62.  
  63.  
  64.  
  65. PROCEDURE OutSIO(Zeichen : CHAR) ;
  66.  
  67.   (* Dieser auskommentierte Teil benutzt zum Zeichensenden einen MS-DOS      *)
  68.   (* Betriebssystemaufruf. Aus noch nicht geklaerten Gruenden funktioniert   *)
  69.   (* diese Version auf den zur Verfuegung stehenden MS-DOS Rechnern nicht.   *)
  70.   (* Daher die Version, die direkt ueber einen Portzugriff ein Zeichen       *)
  71.   (* hinausschreibt.                                                         *)
  72.   (*                                                                         *)
  73.   (* VAR Regs : RECORD                                                       *)
  74.   (*             AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER                  *)
  75.   (*            END;                                                         *)
  76.   (*     AL : INTEGER;                                                       *)
  77.   (*                                                                         *)
  78.   (* BEGIN                                                                   *)
  79.   (*   Regs.AX := 256 + ord(Zeichen);                                        *)
  80.   (*   Regs.DX := 0;                                                         *)
  81.   (*   Intr(20,Regs)                                                         *)
  82.   (* END;                                                                    *)
  83.  
  84. CONST
  85.   DataPort      = $3F8 ;     (* TxD, RxD *)
  86.   LineStatus    = $3FD ;     (* Rechner-Bus-Signale des UARTs *)
  87.     TransmEmpty = $20 ;      (* Senderegister bereit *)
  88.  
  89. BEGIN
  90.   WHILE NOT ((Port[LineStatus] AND TransmEmpty) = TransmEmpty) DO (* warten *);
  91.   Port[DataPort] := Ord(Zeichen)
  92. END;
  93.  
  94.  
  95.  
  96. (* Die Prozedur Parameter fragt die zu setzenden Parameter ab,
  97.   Setze_Parameter stellt dann die SIO ein.                     *)
  98.  
  99. PROCEDURE Setze_Parameter;
  100.  
  101.  
  102. VAR Regs : RECORD
  103.              AX,BX,CX,DX,BP,DI,SI,DS,ES,Flags : INTEGER
  104.            END;
  105.     Wert : INTEGER;
  106.  
  107. BEGIN
  108.   Wert := 2;
  109.   CASE Param[1] OF
  110.     1 : Wert := Wert + 64;
  111.     2 : Wert := Wert + 32;
  112.     3 : Wert := Wert + 96;
  113.     4 : Wert := Wert + 128
  114.   END;
  115.   CASE Param[2] OF
  116.     1 : Wert := Wert + 1;
  117.     2 :
  118.   END;
  119.   CASE Param[3] OF
  120.     1 : ;
  121.     2 : Wert := Wert + 4
  122.   END;
  123.   CASE Param[4] OF
  124.     1 : ;
  125.     2 : Wert := Wert + 24;
  126.     3 : Wert := Wert + 8
  127.   END;
  128.   VollDuplex := (Param[5] = 1);
  129.   LineFeed := (Param[6] = 2);
  130.   CASE Param[7] OF
  131.     1 : Zeit := 0;
  132.     2 : Zeit := 10;
  133.     3 : Zeit := 100
  134.   END;
  135.   Regs.AX := Wert;
  136.   Regs.DX := 0;
  137.   Intr(20,Regs)
  138. END;
  139.  
  140.  
  141. (*                           Ende DFMASCH2.INC                               *)
  142. (*---------------------------------------------------------------------------*)