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