home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* DFMASCH0.INC *)
- (* Maschinennahe Routinen zur Ansteuerung der seriellen *)
- (* Schnittstelle fuer Rechner der Schneider CPC Baureihe *)
-
- (* 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.
- InputSIO wird von anderen Teilen des Treibers benoetig. *)
-
- FUNCTION InputSIO : CHAR;
-
- BEGIN
- INLINE (
- (* .Z80 *)
- (* ; *)
- (* PLATZ EQU 40H *)
- (* SIO EQU 0FFC5H *)
- (* ; *)
- $F3/ (* DI *)
- $C5/ (* PUSH BC *)
- $01/$C5/$FF/ (* LD BC,SIO *)
- $ED/$78/ (* IN A,(C) *)
- $C1/ (* POP BC *)
- $32/$40/$00/ (* LD (PLATZ),A *)
- $FB/ (* EI *)
- (* END *)
- $00);
- InputSIO := CHAR(Mem[$40])
- END;
-
-
-
- FUNCTION InpSIO : CHAR;
-
- BEGIN
- INLINE (
- (* .Z80 *)
- (* ; *)
- (* PLATZ EQU 40H *)
- (* SIOD EQU 0FFC4H *)
- (* ; *)
- $F3/ (* DI *)
- $C5/ (* PUSH BC *)
- $01/$C4/$FF/ (* LD BC,SIOD *)
- $ED/$78/ (* IN A,(C) *)
- $C1/ (* POP BC *)
- $32/$40/$00/ (* LD (PLATZ),A *)
- $FB/ (* EI *)
- (* END *)
- $00);
- InpSIO := CHAR(Mem[$40])
- END;
-
-
-
- FUNCTION InpStatus : BOOLEAN;
-
- BEGIN
- InpStatus := ((Ord(InputSIO) 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;
-
- BEGIN
- OutStatus := ((Ord(InputSIO) AND 4) <> 0)
- END;
-
-
-
- PROCEDURE OutSIO (Zeichen: CHAR);
-
- CONST adat = $FFC4;
-
- BEGIN
- Port[adat] := Ord(Zeichen)
- END;
-
-
-
- (* Die Prozedur Parameter fragt die zu setzenden Parameter ab,
- Setze_Parameter stellt dann die SIO ein. *)
-
- PROCEDURE Setze_Parameter;
-
- CONST c0tc = $ffc0;
- c1tc = $ffc1;
- c2tc = $ffc2;
- c3tc = $ffc3;
- asio = $ffc5;
- adat = $ffc4;
-
-
- VAR Timer, Schreib1, Schreib2 : INTEGER;
-
- BEGIN
- Schreib1 := $4c;
- Schreib2 := $ea;
- CASE Param[1] OF
- 1 : Timer := 128;
- 2 : Timer := 0;
- 3 : Timer := 64;
- 4 : Timer := 32
- END;
- Port[c0tc] := 87; Port[c0tc] := Timer;
- Port[c1tc] := 87; Port[c1tc] := Timer;
- Port[c2tc] := 87; Port[c2tc] := Timer;
- Port[c3tc] := 87; Port[c3tc] := Timer;
- Port[asio] := 24;
- CASE Param[2] OF
- 1 : Schreib2 := ((Schreib2 AND $9f) OR $60);
- 2 : Schreib2 := ((Schreib2 AND $9f) OR $20)
- END;
- CASE Param[3] OF
- 1 : Schreib1 := ((Schreib1 AND $f3) OR $4);
- 2 : Schreib1 := ((Schreib1 AND $f3) OR $c)
- END;
- CASE Param[4] OF
- 1 : Schreib1 := ((Schreib1 AND $fc) OR $0);
- 2 : Schreib1 := ((Schreib1 AND $fc) OR $3);
- 3 : Schreib1 := ((Schreib1 AND $fc) OR $1)
- END;
- VollDuplex := (Param[5] = 1);
- LineFeed := (Param[6] = 2);
- CASE Param[7] OF
- 1 : Zeit := 0;
- 2 : Zeit := 10;
- 3 : Zeit := 100
- END;
- Port[asio] := 1; Port[asio] := 0;
- Port[asio] := 3; Port[asio] := $c1;
- Port[asio] := 4; Port[asio] := Schreib1;
- Port[asio] := 5; Port[asio] := Schreib2
- END;
-
- (*-------------------------------------------------------------------------*)
- (* Ende DFMASCH0.INC *)