Mit den Input/Output-Befehlen wird der IO-Port des Z80-Mikroprozessors angesteuert. Obwohl bei jeder I/O-Operation auch die obere Hälfte des Adressbusses (Bit 8-15) angesprochen wird, sollte man für I/O-Operationen nur die untere Hälfte des Busses verwenden (Adresse 0-255). Die Adressierungsarten sind für die Input/Output-Befehle stark eingeschränkt und beschränken sich im Wesentlichen auf direkte und indirekte Adressierung.
Befehl |
Kurzbeschreibung |
Erläuterung |
Flags |
IN A,(nn) |
A <-- Port (nn) |
Der Akkumulator wird mit dem Wert von Port nn geladen. Dazu wird die Konstante nn auf der unteren Hälfte des Adressbusses (Bit 0-7) ausgegeben und der Akkumulator mit den Daten auf den Datenleitungen geladen |
unverändert |
IN r,(C) |
r <-- Port (C) |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt, der Inhalt von Register B auf die obere. Darauf wird der Datenbus in das Register r eingelesen. |
S=1, wenn gelesene Daten negativ, sonst S=0 |
Z=1, wenn gelesene Daten gleich null |
H=0 |
N=0 |
P/V=1, wenn Parität der Daten gerade |
INI |
(HL) <-- Port (C),
B <-- B-1,
HL <-- HL+1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der Datenleitungen in die Speicherzelle, die durch das Register HL adressiert wird, gelegt. Daraufhin wird das Register B um eins erniedrigt und HL um eins erhöht. Register B kann als Byte-Zähler verwendet werden. |
S unbestimmt |
Z=1, wenn B=0 wird |
H unbestimmt |
N=1 |
P/V unbestimmt |
INIR |
(HL) <-- Port (C),
B <-- B-1,
HL <-- HL+1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der Datenleitungen in die Speicherzelle, die durch das Register HL adressiert wird, gelegt. Daraufhin wird das Register B um eins erniedrigt und das Register HL um eins erhöht. Ist der Inhalt von Register B ungleich null, so wird dieser Vorgang so lange wiederholt, bis B gleich null ist. Mit diesem Befehl kann man mehrere Bytes vom I/O-Port in ein Speicherfeld, das durch HL adressiert wird, einlesen. |
S unbestimmt |
Z=1 |
H unbestimmt |
N=1 |
P/V unbestimmt |
IND |
(HL) <-- Port (C),
B <-- B-1,
HL <-- HL-1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der Datenleitungen in die Speicherzelle, die durch das Register HL adressiert wird, gelegt. Daraufhin werden die Register HL und B um eins erniedrigt. Register B kann als Byte-Zähler verwendet werden |
S unbestimmt |
Z=1, wenn B=0 wird |
H unbestimmt |
N=1 |
P/V unbestimmt |
INDR |
(HL) <-- Port (C),
B <-- B-1,
HL <-- HL-1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der Datenleitungen in die Speicherzelle, die durch das Register HL adressiert wird, gelegt. Daraufhin werden die Register HL und B um eins erniedrigt. Ist der Inhalt von Register B ungleich null, so wird dieser Vorgang so lange wiederholt, bis B gleich null ist. Mit diesem Befehl kann man mehrere Bytes vom I/O-Port in ein Speicherfeld, das durch HL adressiert wird, einlesen. |
S unbestimmt |
Z=1 |
H unbestimmt |
N=1 |
P/V unbestimmt |
OUT (nn),A |
Port (nn) <-- A |
Der Wert des Akkumulators wird auf dem Port nn ausgegeben. Dazu wird die Konstante nn auf der unteren Hälfte des Adressbusses (Bit 0-7) ausgegeben und der Wert des Akkumulators auf die Datenleitungen gelegt. |
unverändert |
OUT (C),r |
Port (C) <-- r |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt, der Inhalt von Register B auf die obere. Darauf wird der Inhalt des Registers r am Datenbus ausgegeben. |
unverändert |
OUTI |
Port (C) <-- (HL),
B <-- B-1,
HL <-- HL+1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Inhalt der durch HL adressierten Speicherzelle wird auf den Datenleitungen ausgegeben. Daraufhin wird das Register B um eins erniedrigt und HL um eins erhöht. Register B kann als Byte-Zähler verwendet werden. |
S unbestimmt |
Z=1, wenn B=0 wird |
H unbestimmt |
N=1 |
P/V unbestimmt |
OTIR |
Port (C) <-- (HL),
B <-- B-1,
HL <-- HL+1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der durch HL adressierten Speicherzelle auf dem Datenbus ausgegeben. Daraufhin wird das Register Bum eins erniedrigt und das Register HL um eins erhöht. Ist Register B ungleich null, so wird dieser Vorgang so lange wiederholt, bis B gleich null ist. Mit diesem Befehl kann man mehrere Bytes eines Speicherfeldes auf einem I/O-Port ausgeben. |
S unbestimmt |
Z=1 |
H unbestimmt |
N=1 |
P/V unbestimmt |
OUTD |
Port (C) <-- (HL),
B <-- B-1,
HL <-- HL-1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Inhalt der durch HL adressierten Speicherzelle wird auf den Datenleitungen ausgegeben. Daraufhin werden die Register B und HL um eins erniedrigt. Register B kann als Byte-Zähler verwendet werden. |
S unbestimmt |
Z=1, wenn B=0 wird |
H unbestimmt |
N=1 |
P/V unbestimmt |
OTDR |
Port (C) <-- (HL),
B <-- B-1,
HL <-- HL-1 |
Der Inhalt des Registers C wird auf die untere Hälfte des Adressbusses gelegt und der Wert der durch HL adressierten Speicherzelle auf dem Datenbus ausgegeben. Daraufhin werden die Register B und HL um eins erniedrigt. Ist Register B ungleich null, so wird dieser Vorgang so lange wiederholt, bis B gleich null ist. Mit diesem Befehl kann man mehrere Bytes eines Speicherfeldes auf einem I/O-Port ausgeben. |
S unbestimmt |
Z=1 |
H unbestimmt |
N=1 |
P/V unbestimmt |