Das eBook Angewandte Mikroelektronik wurde von Hans Lohninger zur Unterstützung verschiedener Lehrveranstaltungen geschrieben. Weitere Informationen finden sie hier.


Input/Output Befehle

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


Last Update: 2008-05-31