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

  1. (*-------------------------------------------------------------------------*)
  2. (*                           DFMASCH0.INC                                  *)
  3. (*           Maschinennahe Routinen zur Ansteuerung der seriellen          *)
  4. (*           Schnittstelle fuer Rechner der Schneider CPC Baureihe         *)
  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.    InputSIO wird von anderen Teilen des Treibers benoetig.          *)
  10.  
  11. FUNCTION InputSIO : CHAR;
  12.  
  13. BEGIN
  14.   INLINE (
  15.                    (*         .Z80                                   *)
  16.                    (* ;                                              *)
  17.                    (* PLATZ EQU 40H                                  *)
  18.                    (* SIO EQU 0FFC5H                                 *)
  19.                    (* ;                                              *)
  20.   $F3/             (* DI                                             *)
  21.   $C5/             (* PUSH BC                                        *)
  22.   $01/$C5/$FF/     (* LD BC,SIO                                      *)
  23.   $ED/$78/         (* IN A,(C)                                       *)
  24.   $C1/             (* POP BC                                         *)
  25.   $32/$40/$00/     (* LD (PLATZ),A                                   *)
  26.   $FB/             (* EI                                             *)
  27.                    (* END                                            *)
  28.   $00);
  29.   InputSIO := CHAR(Mem[$40])
  30. END;
  31.  
  32.  
  33.  
  34. FUNCTION InpSIO : CHAR;
  35.  
  36. BEGIN
  37.   INLINE (
  38.                    (*         .Z80                                   *)
  39.                    (* ;                                              *)
  40.                    (* PLATZ EQU 40H                                  *)
  41.                    (* SIOD EQU 0FFC4H                                *)
  42.                    (* ;                                              *)
  43.   $F3/             (* DI                                             *)
  44.   $C5/             (* PUSH BC                                        *)
  45.   $01/$C4/$FF/     (* LD BC,SIOD                                     *)
  46.   $ED/$78/         (* IN A,(C)                                       *)
  47.   $C1/             (* POP BC                                         *)
  48.   $32/$40/$00/     (* LD (PLATZ),A                                   *)
  49.   $FB/             (* EI                                             *)
  50.                    (* END                                            *)
  51.   $00);
  52.   InpSIO := CHAR(Mem[$40])
  53. END;
  54.  
  55.  
  56.  
  57. FUNCTION InpStatus : BOOLEAN;
  58.  
  59. BEGIN
  60.   InpStatus := ((Ord(InputSIO) AND 1) <> 0)
  61. END;
  62.  
  63.  
  64.  
  65. (* Die Funktionen OutStatus (BOOLEAN) und die Prozedur OutSIO (CHAR)
  66.    liefern den Status des SIO-Outkanals und senden ein Zeichen (siehe
  67.    auch oben).                                                           *)
  68.  
  69. FUNCTION OutStatus : BOOLEAN;
  70.  
  71. BEGIN
  72.   OutStatus := ((Ord(InputSIO) AND 4) <> 0)
  73. END;
  74.  
  75.  
  76.  
  77. PROCEDURE OutSIO (Zeichen: CHAR);
  78.  
  79. CONST adat = $FFC4;
  80.  
  81. BEGIN
  82.   Port[adat] := Ord(Zeichen)
  83. END;
  84.  
  85.  
  86.  
  87. (* Die Prozedur Parameter fragt die zu setzenden Parameter ab,
  88.   Setze_Parameter stellt dann die SIO ein.                              *)
  89.  
  90. PROCEDURE Setze_Parameter;
  91.  
  92. CONST c0tc = $ffc0;
  93.       c1tc = $ffc1;
  94.       c2tc = $ffc2;
  95.       c3tc = $ffc3;
  96.       asio = $ffc5;
  97.       adat = $ffc4;
  98.  
  99.  
  100. VAR Timer, Schreib1, Schreib2 : INTEGER;
  101.  
  102. BEGIN
  103.   Schreib1 := $4c;
  104.   Schreib2 := $ea;
  105.   CASE Param[1] OF
  106.     1 : Timer := 128;
  107.     2 : Timer := 0;
  108.     3 : Timer := 64;
  109.     4 : Timer := 32
  110.    END;
  111.    Port[c0tc] := 87;  Port[c0tc] := Timer;
  112.    Port[c1tc] := 87;  Port[c1tc] := Timer;
  113.    Port[c2tc] := 87;  Port[c2tc] := Timer;
  114.    Port[c3tc] := 87;  Port[c3tc] := Timer;
  115.    Port[asio] := 24;
  116.    CASE Param[2] OF
  117.      1 : Schreib2 := ((Schreib2 AND $9f) OR $60);
  118.      2 : Schreib2 := ((Schreib2 AND $9f) OR $20)
  119.    END;
  120.    CASE Param[3] OF
  121.      1 : Schreib1 := ((Schreib1 AND $f3) OR $4);
  122.      2 : Schreib1 := ((Schreib1 AND $f3) OR $c)
  123.    END;
  124.    CASE Param[4] OF
  125.      1 : Schreib1 := ((Schreib1 AND $fc) OR $0);
  126.      2 : Schreib1 := ((Schreib1 AND $fc) OR $3);
  127.      3 : Schreib1 := ((Schreib1 AND $fc) OR $1)
  128.    END;
  129.    VollDuplex := (Param[5] = 1);
  130.    LineFeed := (Param[6] = 2);
  131.    CASE Param[7] OF
  132.      1 : Zeit := 0;
  133.      2 : Zeit := 10;
  134.      3 : Zeit := 100
  135.    END;
  136.    Port[asio] := 1;  Port[asio] := 0;
  137.    Port[asio] := 3;  Port[asio] := $c1;
  138.    Port[asio] := 4;  Port[asio] := Schreib1;
  139.    Port[asio] := 5;  Port[asio] := Schreib2
  140. END;
  141.  
  142. (*-------------------------------------------------------------------------*)
  143. (*                           Ende DFMASCH0.INC                             *)