Info
Sammeln
Dokumentation
Anleitungen
Schnittstellen
Prozessoren
Videochips
Soundchips
Computer
Videospiele


Zilog Z80
Beschreibung

Der Z-80 zählt zu den erfolgreichsten Prozessoren aller Zeiten. Der Hersteller Zilog nahm sich Intels 8080 zum Vorbild und verbesserte ihn sowohl von der Integrierbarkeit in Rechnersysteme als auch vom Maschinenbefehlssatz her. Dadurch entstand ein sehr leistungsfähiger Prozessor, der allerdings wegen seiner ausgesprochen komplexen Befehle auch mit deutlich höherem Takt als sein spartanischerer Hauptkonkurrent 6502 betrieben werden musste, um die gleiche Geschwindigkeit zu entwickeln. Die typische Taktfrequenz lag bei 3,5 - 4 MHz.

Der wichtigste Meilenstein bei der Verbreitung des Z-80 war wohl das Betriebssystem CP/M von Digital Research. Ähnlich wie heute Windows 95/98 nur auf Intel-CPUs und Kompatiblen läuft, war CP/M lange Zeit nur für den Z-80 zu bekommen. Dadurch entstand ein Quasi-Monopol für den Z-80 bei Bürocomputern der späten 70er und frühen 80er Jahre.

Später kamen auch etliche Homecomputer dazu, angefangen vom Sinclair ZX-80, ZX-81 und Spectrum, den Amstrad-Computern bis hin zu den Rechnern des in Europa wenig erfolgreichen MSX-Standards.

Pinbelegung

Der Z-80 freut durch seinen einfachen Aufbau jeden Entwickler, der einen Computer drumherum bauen soll. Der Adressbus ist voll aufgelegt, es wird nur eine Versorgungsspannung benötigt. Beim Steuerbus zeigen sich einige Unterschiede zum großen Konkurrenten 6502: Die Signalisierung von Lese- oder Schreibzugriffen ist durch getrennte Leitungen ausgeführt. Der größte Unterschied besteht jedoch in der Art des Zugriffes auf Peripheriechips:

Während deren Register beim 6502 als normale Speicherstellen angesprochen werden, kann der Z80 über eine eigene Leitung (IORQST) signalisieren, daß er nun auf ein I/O-Register zugreifen möchte. Der Vorteil liegt in der einfacheren Handhabung für Boardentwickler und in der Tatsache, daß der adressierbare Speicher nicht durch I/O-Bereiche zergliedert wird, wie das bei 6502-Rechnern üblich ist.

Mit der Leitung M1 teilt der Z80 mit, daß er nun einen neuen Maschinenbefehl zu lesen beabsichtigt.


Register

AAkkumulatorDient bei fast allen Rechenoperationen als Ergebnisspeicher
B,C,D,E,H,LRegisterverschiedene Aufgaben. B wird bei Schleifenbefehlen als Zähler verwendet.
BC,DE,HL16-Bit-Registerentstehen durch Zusammenfassung von je zwei der Register B-L. BC wird oft als Zählregister verwendet, HL zur indirekten Speicheradressierung
IX,IY16-Bit-Indexregisterzur indirekten Speicheradressierung, z.B. ADD A,(IX+5): Addiert zu A den Inhalt der Speicherstelle, auf die IX+5 zeigt und hinterlässt das Ergebnis in A.
SPStapelzeigerZeiger auf die Adresse des obersten Stapelelements. 16-Bit-Register, d.h. der Stapel kann den gesamten Speicher adressieren.
AF',BC',DE',HL'Sekundäre Registerzweiter Registersatz. AF' heißt Akku + Flags.
Ispez. Aufgaben(Hardware)
Rspez. Aufgaben(Hardware)


Zeichenerklärung

Um nicht alle Befehle in allen Adressierungsarten anführen zu müssen (das wären über 600!), wurden folgende Zusammenfassungen verwendet:
xSteht nach einem Befehl "x", so kann er in den folgenden Adressierungsarten verwendet werden:
A, B, C, D, E, H, L: Die normalen Register
n: fester Wert
rSoweit sinnvoll, sind folgende Adressierungsarten möglich:
BC, DE, HL: die normalen Register, paarweise zu 16-Bit-Registern
zusammengefasst
(HL): Der Inhalt des HL-Registers wird als Adresse interpretiert und
auf diese zugegriffen.
IX, IY: die Indexregister
(IX+d), (IY+d): Zum Inhalt des Indexregisters wird ein fester Wert addiert,
das Ergebnis als Adresse interpretiert und auf diese zugegriffen.
nn: fester Wert
(nn): feste Adresse
SP: Stapelzeiger
(SP): Speicherstelle, auf die der Stapelzeiger verweist
nn bestimmt eine Bitnummer, ist also ein Festwert zwischen 0 und 7.
Großbuchstaben stehen für Register.
Hinter jedem Befehl der Befehlsliste stehen die Buchstaben s, z, p und c (oder auch nicht). Diese Buchstaben stehen für die Prozessorflags:
sSign = Vorzeichen der letzten Operation
zZero = Nullflag; Wird gesetzt, wenn Ergebnis = 0.
pParity = Paritätsflag
cCarry = Übertrag; Wird gesetzt, wenn das Ergebnis außerhalb des verfügbaren Bereiches liegt, z.B. $80+$94=$14 mit c=1
Die in der Befehlsliste am Zeilenende stehenden Flags werden durch den entsprechenden Befehl verändert.


1. Arithmetikbefehle
Addition / Subtraktion
ADC A,xA=A+x+cAddition mit Übertragszpc
ADC HL,rHL=HL+r+c16-Bit-Addition mit Übertragszpc
ADD A,xA=A+xAddition ohne Übertragszpc
ADD HL,rHL=HL+r16-Bit-Addition ohne Übertragszpc
ADD IX,rIX=IX+r16-Bit-Addition im Indexregister IXszpc
ADD IY,rIY=IY+r16-Bit-Addition im Indexregister IYszpc
SBC A,xA=A-x-c+1Subtraktion mit Übertragszpc
SBC HL,rHL=HL-r-c+116-Bit-Subtraktion mit Übertragszpc
SUB xA=A-xSubtraktion ohne Übertragszpc
INC xx=x+1Registerinhalt inkrementierenszpc
INC rr=r+116-Bit-Registerinhalt inkrementieren
DEC xx=x-1Registerinhalt dekrementierenszpc
DEC rr=r-116-Bit-Registerinhalt dekrementieren
Binäre Verknüpfungen
AND xA = A AND xUND-Verknüpfungszpc=0
CPLA = A XOR $FFKomplementbildungszpc
OR xA = A OR xODER-Verknüpfungszpc=0
XOR xA = A XOR xExklusiv-ODER-Verknüpfungszpc=0
Rotier- und Schiebebefehle
RL xrotate left xBitweise Rotation nach linksszpc
RLArotate left ABitweise Rotation nach linksc
RLC xRL without cBitweise Rotation nach links ohne Übertragszpc
RLCARLA without cBitweise Rotation nach links ohne Übertragc
RLDrotate left decimal (A/HL)Nibble-Rotation nach linksszp
RR xrotate right xBitweise Rotation nach rechtsszpc
RRArotate right ABitweise Rotation nach rechtsc
RRC xRR without cBitweise Rotation nach rechts ohne Übertragszpc
RRCARRA without cBitweise Rotation nach rechts ohne Übertragc
RRDrotate right decimal (A/HL)Nibble-Rotation nach rechtsszp
SLA xshift left arith. xArithmetisches Linksschiebenszpc
SRA xshift right arith. xArithmetisches Rechtsschiebenszpc
SRL xshift right log. xLogisches Rechtsschiebenszpc
Vergleichsbefehle
CP xA=x -> z=1 ; A>x -> s=1 ; A<=x -> s=0 ; A<>x -> z=0Vergleich A mit x, Ergebnis wird über die Flags angezeigtszpc
CPDVergleich (HL) mit A, dann HL=HL-1, BC=BC-1; wenn BC=0, dann p=0szpc
CPDRwie CPD, jedoch wiederholt bis z=1 oder BC=0szpc
CPIwei CPD, allerdings HL=HL+1szpc
CPIRwei CPDR, allerdings HL=HL+1szpc
sonstige Arithmetikbefehle
BIT n,xInvertiert Bit n von x und schreibt es ins z-Flagszp
CCFcomplement carryc-Flag invertierenc=-c
SCFset carryc-Flag setzenc=1
SET n,xset bit n of xBit setzen
RES n,xreset bit n of xBit rücksetzen
NEGA = -AA negierenpc
DAAfalsche BCD-Ziffern korrigierenszpc
2. Registerbefehle
LD-Befehle
LD x1,x2
x1 = x2

Register kopieren
LD A,I
A = I

I-Register in Akku kopieren
szp
LD A,R
A = R

R-Register in Akku kopieren
szp
LD r,nn
r = nn

16-Bit-Regiter mit festem Wert laden
LD r,(nn)
r = (nn)

16-Bit-Regiter mit Inhalt einer Speicherstelle laden
LD I,A
I = A

Akku ins I-Register kopieren
LD R,A
R = A

Akku ins R-Register kopieren
LD SP,r
SP = r

Stapelzeiger setzen
sonstige Registerbefehle
EX AF,AF'
AF <=> AF'

AF und AF' vertauschen
EX DE,HL
DE <=> HL

DE und HL vertauschen
EX (SP),HL
(SP) <=> HL

16-Bit-Wert vom Stapel mit Inhalt von HL vertauschen
EX (SP),IX
(SP) <=> IX

16-Bit-Wert vom Stapel mit Inhalt von IX vertauschen
EX (SP),IY
(SP) <=> IY

16-Bit-Wert vom Stapel mit Inhalt von IY vertauschen
EXX
BC <=> BC', DE <=> DE', HL <=> HL'

Register mit Schattenregistern vertauschen
PUSH r
Inhalt eines 16-Bit-Registers auf Stapel ablegen
POP r
Inhalt eines 16-Bit-Registers vom Stapel holen
LDD
(DE)=(HL), HL=HL-1, DE=DE-1, BC=BC-1; wenn BC=0, dann p=0

Dient in Schleife zum Kopieren eines Speicherbereichs
p
LDDR
(DE)=(HL), HL=HL-1, DE=DE-1, BC=BC-1; wiederholen bis BC=0

Kopieren eines Speicherbereichs
p=0
LDI
(DE)=(HL), HL=HL+1, DE=DE+1, BC=BC-1; wenn BC=0, dann p=0

Dient in Schleife zum Kopieren eines Speicherbereichs
p
LDIR
(DE)=(HL), HL=HL+1, DE=DE+1, BC=BC-1; wiederholen bis BC=0

Kopieren eines Speicherbereichs
p=0
3. Sprungbefehle
Unbedingte Sprünge
JP nn
PC=nn

Sprung nach nn
JP r
PC=r

Sprung nach Adresse, die in r abgelegt ist
JR nn
PC=PC+nn

relativer Sprung
CALL nn
(SP)=PC; PC=nn

Unterprogrammaufruf
RST nn
PC=nn

Reset; nn=$00,$08,$10,...,$38
RET
PC=(SP)

Rückkehr aus Unterprogramm
RETI
PC=(SP)

Rückkehr aus Interrupt
RETN
PC=(SP)

Rückkehr aus nichtmaskierbarem Interrupt
Bedingte Sprünge
JP bed, nn
Sprung nach nn, wenn Bedingung zutrifft.
Bedingungen sind: C (c=1), M (s=1), NC (c=0), NZ (z=0), P (s=0), PE (p=1),
PO (p=0), Z (z=1)
Bedingte Sprünge
JR bed, nn
relativer Sprung nach nn, wenn Bedingung zutrifft.
CALL bed, nn
Unterprogrammaufruf, wenn Bedingung zutrifft.
RET bed
Rückkehr aus Unterprogramm, wenn Bedingung zutrifft.
DJNZ nn
B = B-1; relativer Sprung nach nn, wenn B = 0.
4. Ein-/Ausgabebefehle
Eingabe
IN x,(C)
Port, dessen Nr. in Register C steht einlesen und nach x schreiben
szp
IN A,(nn)
Port nn (8 Bit) einlesen und nach A schreiben
IND
Port C einlesen und nach (HL) schreiben. HL=HL-1; B=B-1
z
INDR
wie IND, wiederholen bis B=0
z=1
INI
Port C einlesen und nach (HL) schreiben. HL=HL+1; B=B-1
z
INIR
wie INI, wiederholen bis B=0
z=1
Ausgabe
OUT (C),x
Inhalt von x in den Port, dessen Nr. in Register C steht schreiben
OUT (nn),A
Inhalt des Akkus in Port nn (8 Bit) schreiben
OUTD
Inhalt von (HL) nach Port C schreiben. HL=HL-1; B=B-1
szp
OTDR
wie OUTD, wiederholen bis B=0
sz=1p
OUTI
Inhalt von (HL) nach Port C schreiben. HL=HL+1; B=B-1
szp
OTIR
wie OUTI, wiederholen bis B=0
sz=1p
5. Interruptbefehle
DI
disable irq

Interrupts abschalten
EI
enable irq

Interrupts einschalten
HALT
warten auf Interrupt
IM nn
interrupt mode

Interrupt-Modus nn wählen:
nn=0: Befehl auf Datenbus
nn=1: Sprung nach $38
nn=2: Sprung nach Adresse auf Datenbus, High-Byte in I
NOP
no operation

Nullbefehl