Z80-CPU - FLAG-Dokumentation |
![]() |
![]() |
Letztmalig dran rumgefummelt: 05.07.20 18:51:06 |
![]() |
Und hier nun die knallharten Programmierwerkzeuge, ohne die kein sinnvolles Programmieren möglich ist. Das FLAG-Register und seine Wirkungen auf Befehle ist entscheidend für den Programm Ablauf. Nur mit seiner Hilfe ist es möglich, logische und numerische Operationen auszuwerten. Punkt 0 hilft schon für 96 % aller Fälle, welche beim Programmieren in Assembler so anfallen. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
0. Allgemeine FLAG-Wirkung 1. 8-Bit-Ladebefehle 2. 16-Bit-Ladebefehle 3. PUSH- und POP-Befehle 4. Austauschbefehle 5. Blocktransferbefehle 6. Comparebefehle 7. 8-Bit Arithmetik und Logik 8. Allgemeine Arithmetik und Z80-Steuerung 9. 16-Bit-Arithmeitk |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
Quelle: LC-80 Handbuch S. 166
0. Allgemeine FLAG-Wirkung |
![]() |
![]() |
![]() |
Aufbau des FLAG-Registers Bits mit X haben keine oder umstrittene Wirkung
Befehl | FLAG
|
Bemerkungen | ||||||||
ADD s, ADC s |
|
8-Bit-Addition oder Addition mit Übertrag | ||||||||
SUB s, SBC s, CMP s, NEG |
|
8-Bit-Subtraktion, Subtraktion mit Übertrag, Vergleich und Negation des Akkumulators | ||||||||
AND s |
|
Logisches AND - Register mit Akkumulator | ||||||||
OR s, XOR s |
|
Logisches OR bzw. XOR - Register mit Akkumulator | ||||||||
INC s |
|
Register - Erhöhung | ||||||||
DEC s |
|
Register - Erniedrigung | ||||||||
ADD HL,dd |
|
16-Bit-Addition | ||||||||
ADC HL,dd |
|
16-Bit-Addition mit Übertrag | ||||||||
SBC HL,dd |
|
16-Bit-Subtrakion mit Übertrag | ||||||||
RLA, RLCA, RRA, RRCA |
|
zyklische Verschiebung - Akkumulator | ||||||||
RL s, RLC s, RR s, RRCs |
|
zyklische Verschiebung - Speicherplatz s | ||||||||
SLA s, SRA s, SRL s |
|
Verschiebung - Speicherplatz s | ||||||||
RLD, RRD |
|
zyklische Verschiebung - Zahl links und rechts | ||||||||
DDA |
|
Dezimalkorrektur des Akkumulators | ||||||||
CPL |
|
Komplement des Akkumulators | ||||||||
SCF |
|
Setzen des Übertrages | ||||||||
CCF |
|
Komplement des Übertrages | ||||||||
IN r, INF |
|
Einlesen der Peripherie mit indirekter Registeradresse | ||||||||
INI, IND, OUTI, OUTD |
|
Block Ein- und Ausgabe, Z =0 wenn B <>0, sonst Z = 1 | ||||||||
INIR, INRD, OTIR, OTDR |
|
wiederholte Block Ein- und Ausgabe, Z =0 wenn B <>0, sonst Z = 1 | ||||||||
LDI, LDD |
|
Blocktransferbefehle | ||||||||
LDIR, LDDR |
|
P/V =1 wenn BC <> 0, sonst P/V = 0 | ||||||||
CPI, CPIR, CPD, CPDR |
|
Block-Suchbefehle, Z = 1 wenn A = (HL), sonst Z =0; P/V = 1 wenn BC <> 0, sonst P/V = 0 | ||||||||
LD A, I, LD A,R |
|
Inhalt des Interrptannahme-FF 2 (IFF2) ins P/V-Flag übernommen | ||||||||
Bit b,s |
|
Zustand des Bits b im Speicherplatz s ins Z-Flag überführt |
Quelle: LC-80 Handbuch S. 167
1. 8-Bit-Ladebefehle |
![]() |
![]() |
![]() |
![]() |
8 Bit Ladebefehle schreiben definierte Werte in eine 8-Bit-Ergebniszelle. Dies kann ein Register oder aber auch eine Speicherzelle der Breite von 8 Bit sein. Flags werden bis auf die Ausnahmen des des Interrupt-FlipFlops bei Ladebefehlen mit den Registern R bzw. I nicht gesetzt. |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
8-Bit-Ladebefehle | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2. 16-Bit-Ladebefehle |
![]() |
![]() |
![]() |
![]() |
16 Bit Ladebefehle schreiben definierte Werte in eine 16-Bit-Ergebniszelle. Dies kann ein Register paar oder aber auch zwei aufeinanderfolgende Speicherzellen der Breite von 8 Bit sein. Flags werden hierbei grundsätzlich nicht gesetzt. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
16-Bit-Ladebefehle | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
3. PUSH- und POP-Befehle |
![]() |
![]() |
![]() |
![]() |
Registerrettungs- sowie Wiederherstellungsbefehle sind die Mutter aller Unterprogrammtechnik, aber auch die Grundlage jeglicher Interruptservice-Routine. Wann immer die Anzahl der verfügbaren Register zu klein ist (und sie ist immer zu klein), helfen uns diese Befehle, den Vorrat an Registern ins faktisch Unendliche zu erhöhen, wenn denn der RAM-Bereich unendlich wäre ;-) |
|
|||||||||||||||||
PUSH- und POP Operationen |
PUSH qq | (SP-2)![]() (SP-1) ![]() SP ![]() |
|
|
1 | 3 | 11 |
|
|||||||||||||||||||
PUSH IX | (SP-2)![]() (SP-1) ![]() SP ![]() |
|
|
2 | 4 | 15 |
qq ist eines der Registerpaare AF, BC, DE, HL |
|||||||||||||||||||
PUSH IY | (SP-2)![]() (SP-1) ![]() SP ![]() |
|
|
2 | 4 | 15 |
(Paar) H bzw. (Paar)L bezieht sich auf dei oberen bzw. unteren 8 Bit des entsprechenden Registerpaares, d.h. BCL = C, AFH = A |
|||||||||||||||||||
POP qq | qqH![]() qqL ![]() SP ![]() |
|
|
1 | 3 | 10 | ||||||||||||||||||||
POP IX | IXH![]() IXL ![]() SP ![]() |
|
|
2 | 4 | 14 | ||||||||||||||||||||
POP IY | IYH![]() IYL ![]() SP ![]() |
|
|
2 | 4 | 14 |
4. Austauschbefehle |
![]() |
![]() |
![]() |
![]() |
Austauschoperationen sind die kleinen Geschwister der Stapeloperationen. Unter Anwendung des Alternativregistersatzes sind sie einfach schneller als alle alternativen Zugriffe. Allerdings wird vorausgesetzt, dass nur eine kleine Anzahl freier Register für die jeweils aktuelle Operation benötigt wird. |
|
|||||||||||||||||
Exchange-Befehle - Registeraustausch |
EX DE,HL | DE![]() |
|
|
1 | 1 | 4 |
Vertauschung des Registersatzes DE mit HL |
||||||||||||
EXAF | AF![]() |
|
|
1 | 1 | 4 |
Vertauschung der Registers A und F mit den entsprechenden Registern Alternativregistersatz |
||||||||||||
EXX | BC![]() DE ![]() HL ![]() |
|
|
1 | 1 | 4 |
Vertauschung des Registersatzes mit dem Alternativregistersatz |
||||||||||||
EX (SP),HL | H![]() L ![]() |
|
|
1 | 5 | 19 | |||||||||||||
EX (SP),IX | IXH![]() IXL ![]() |
|
|
2 | 6 | 23 | |||||||||||||
EX (SP),IY | IYH![]() IYL ![]() |
|
2 | 6 | 23 |
5. Blocktransferbefehle |
![]() |
![]() |
![]() |
![]() |
Mit dieser Gruppe laden wir Speicherbereiche mit vordefinierten Werten - vor allem dann, wenn eine größere Menge von Daten zu verschieben ist (z. B. beim Laden von Urladersystemen). Bei extrem großen Datenmengen (wie zum Beispiel beim Einlesen von Dateien mit externen Datenträgern als Quelle) erledigen so etwas heute DMA-Controller, da solche Prozesse auf heutigen Computern in Masse ablaufen. |
|
Blocktransfer |
LDI | (DE)![]() DE ![]() HL ![]() BC ![]() |
|
|
2 | 4 | 16 | |||||||||||||||||||
LDIR | (DE)![]() DE ![]() HL ![]() BC ![]() Wiederholung bis BC=0 |
|
|
2 2 |
5 4 |
21 16 |
wenn BC≠0 |
||||||||||||||||||
LDD | (DE)![]() DE ![]() HL ![]() BC ![]() |
|
|
2 | 4 | 16 | |||||||||||||||||||
LDDR | (DE)![]() DE ![]() HL ![]() BC ![]() Wiederholung bis BC=0 |
|
|
2 2 |
5 4 |
21 16 |
wenn BC≠0 |
6. Compare- oder Such- und Vergleichsbefehle |
![]() |
![]() |
![]() |
![]() |
Mit dieser Gruppe von Befehlen vergleichen wir Speicherplätze oder Speicherbereiche mit vordefinierten Werten. Auch vor allem dann, wenn eine größere Menge von Daten zu vergleichen sind. Beispielsweise das Decodieren von Tastaturtabellen aus einzelnen Peripheriebausteinen kann mit ihrer Hilfe schnell und zweckmäßig erledigt werden. |
|
Blocktransfer |
CPI | A![]() HL ![]() BC ![]() |
|
|
2 | 4 | 16 |
|
||||||||||||||||||
CPIR | A![]() HL ![]() BC ![]() Wiederholung bis BC=0 oder A=(HL) |
|
|
2 2 |
5 4 |
21 16 |
wenn BC≠0 |
||||||||||||||||||
CPD | A![]() HL ![]() BC ![]() |
|
|
2 | 4 | 16 | |||||||||||||||||||
CPDR | A![]() HL ![]() BC ![]() Wiederholung bis BC=0 oder A = (HL) |
|
|
2 2 |
5 4 |
21 16 |
wenn BC≠0 |
7. 8-Bit Arithmetik und Logikbefehle |
![]() |
![]() |
![]() |
![]() |
Ziel aller hier aufgeführten Operationen ist das Akkumulator-Register oder das Registerpaar HL bzw. eines der Indexregister. Meist ist es auch Quelle für einen der Operanden. Flags werden hier entsprechend dem Ergebnis der Operation sowie ihrer Funktion folgend gestellt. |
|
8-Bit Arithmetik |
ADD r | A![]() |
|
|
1 | 1 | 4 |
|
|||||||||||||||||||||||||
ADD n | A![]() |
|
|
2 | 2 | 7 | ||||||||||||||||||||||||||
ADD (HL) | A![]() |
|
|
1 | 2 | 7 | ||||||||||||||||||||||||||
ADD (IX+d) | A![]() |
|
|
3 | 5 | 19 | ||||||||||||||||||||||||||
ADD (IY+d) | A![]() |
|
|
3 | 5 | 19 | ||||||||||||||||||||||||||
ADC s | A![]() |
|
|
s ist eines der r, n, (HL), (IX+d), (IY+d) wie beim ADD-Befehl |
||||||||||||||||||||||||||||
SUB s | A![]() |
|
|
|||||||||||||||||||||||||||||
SBC s | A![]() |
|
|
|||||||||||||||||||||||||||||
Logik | ||||||||||||||||||||||||||||||||
AND s | A![]() |
|
|
|||||||||||||||||||||||||||||
OR s | A![]() |
|
|
|||||||||||||||||||||||||||||
XOR s | A![]() |
|
|
|||||||||||||||||||||||||||||
CMP s | A - s |
|
|
|||||||||||||||||||||||||||||
INC r | r![]() |
|
|
1 | 1 | 4 | ||||||||||||||||||||||||||
INC (HL) | (HL)![]() |
|
|
1 | 3 | 11 | ||||||||||||||||||||||||||
INC (IX+d) | (IX+d)![]() |
|
|
3 | 6 | 23 | ||||||||||||||||||||||||||
INC (IY+d) | (IY+d)![]() |
|
|
3 | 6 | 23 | ||||||||||||||||||||||||||
DEC f | f![]() |
|
|
1 | 1 | 4 |
f ist eines der r, n, (HL), (IX+d), (IY+d) wie bei INC 100 durch 101 im OP-Code ersetzen |
8. Allgemeine Arithmetik und Steuerbefehle |
![]() |
![]() |
![]() |
![]() |
Ziel der hier aufgeführten Operationen ist das Akkumulator-Register und/oder das CARRY-Flag. Es auch Quelle und Ziel für für die Operation. Flags werden hier entsprechend dem Ergebnis der Operation sowie ihrer Funktion folgend gestellt. |
|
Allgemeine Arithmetikbefehle |
DAA |
Wandelt Akkumulator Inhalt in gepacktes BCD-Format nach Addition oder Subtraktion von gepackten BCD-Zahlen |
|
|
1 | 1 | 4 |
Dezimalkorrektur des Akkumulators |
||||||||||||
CPL | A![]() |
|
|
1 | 1 | 4 |
Einerkomplement des Akkumulators |
||||||||||||
NEG | A![]() |
|
|
1 | 2 | 7 |
Zweierkomplement des Akkumulators |
||||||||||||
CCF | CF![]() |
|
|
1 | 1 | 4 |
Komplement des CARRY-Flags |
||||||||||||
SCF | CF![]() |
|
|
1 | 1 | 4 |
Setzen des CARRY-Flags |
||||||||||||
Steuerbefehle | |||||||||||||||||||
NOP | keine Operation |
|
|
1 | 1 | 4 | |||||||||||||
HALT | Z80-CPU im HALT-Zustand |
|
|
1 | 1 | 4 | |||||||||||||
DI | IFF1![]() IFF2 ![]() |
|
|
1 | 1 | 4 | |||||||||||||
EI | IFF1![]() IFF2 ![]() |
|
|
1 | 1 | 4 | |||||||||||||
IM0 | Setzen des Interrupt-Mode 0 |
|
|
2 | 2 | 8 | |||||||||||||
IM1 | Setzen des Interrupt-Mode 1 |
|
|
2 | 2 | 8 | |||||||||||||
IM2 | Setzen des Interrupt-Mode 2 |
|
|
2 | 2 | 8 |
9. 16-Bit Arithmetik |
![]() |
![]() |
![]() |
![]() |
Ziel aller hier aufgeführten Operationen mit Flag-Beeinflussung sind die Indexregister sowie das Registerpaar HL. Auch die verbleibenden Registerpaare lassen sich einsetzen, jedoch nicht mit Auswertung der Flags. Die Z80-CPU verfügt eben lediglich über Ansätze einer 16-Bitverarbeitung - eigentlich passiert alles Wichtige auf 8 Bit und wird sauber via Software in den Bitstellen erweitert. |
|
8-Bit Arithmetik |
ADD HL,dd | HL![]() |
|
|
1 | 3 | 11 |
dd ist eines der Registerpaare BC, DE, HL, SP |
||||||||||||||||||||||
ADC HL,dd | HL![]() |
|
|
2 | 4 | 15 | |||||||||||||||||||||||
SBC HL,dd | HL![]() |
|
|
2 | 4 | 15 | |||||||||||||||||||||||
ADD IX,pp | IX![]() |
|
|
2 | 4 | 15 |
pp ist eines der Registerpaare BC, DE, IX, SP |
||||||||||||||||||||||
ADD IY,pp | IY![]() |
|
|
2 | 4 | 15 |
pp ist eines der Registerpaare BC, DE, IX, SP |
||||||||||||||||||||||
INC dd | dd![]() |
|
|
1 | 1 | 6 | |||||||||||||||||||||||
INC IX | IX![]() |
|
|
2 | 2 | 10 | |||||||||||||||||||||||
INC IY | IY![]() |
|
|
2 | 2 | 10 | |||||||||||||||||||||||
DEC dd | dd![]() |
|
|
1 | 1 | 6 | |||||||||||||||||||||||
DEC IX | IX![]() |
|
|
2 | 2 | 10 | |||||||||||||||||||||||
DEC IY | IY![]() |
|
|
2 | 2 | 10 |
![]() zur Hauptseite |
© Samuel-von-Pufendorf-Gymnasium Flöha | © Frank Rost im März 2001 |
... dieser Text wurde nach den Regeln irgendeiner Rechtschreibreform verfasst - ich hab' irgendwann einmal beschlossen, an diesem Zirkus nicht mehr teilzunehmen ;-) „Dieses Land braucht eine Steuerreform, dieses Land braucht eine Rentenreform - wir schreiben Schiffahrt mit drei „f“!“ Diddi Hallervorden, dt. Komiker und Kabarettist |