Z80-CPU - FLAG-Dokumentation history menue 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
Symbol

Bedeutung

C Übertrageflag. C = 1, wenn die Operation einen Übertrag vom MSB des Operanden oder des Ergebnisses erzeugt.
Z Null-Flag. Z = 1, wenn das Ergebnis der Operation Null ist
S Vorzeichen-Flag. S = 1, wenn das MSB des Ergebnissee eins ist
P/V Paritäts- oder Überlauf-Flag. Parität (P) und Überlauf (V) benutzen des gleiche -Flag. Logische Operationen beeinflussen das Flag entsprechend der Parität des Ergebnisses, arithmetische Operationen stellen dieses Flag entsprechend dem Überlauf des Ergebnisses. P/V = 1, wenn des Ergebnis paarig ist, P/V = 0,wenn das Ergebnis unpaarig ist. P/V = 1, wenn das Ergebnis 
einen Überlauf enthält.
H Halbbyte-Übertragsflag. H = 1, wenn Addition oder Subtraktion einen Übertrag innerhalb von 4 Akkumulatorbits erzeugen.
N Additions-/Subtraktionsflag. N = 1, wenn vorangegangene Operation eine Subtraktion war.
H- und N-Flags werden für die Dezimalkorrektur (DAA) benutzt, um das Ergebnis einer Addition oder Subtraktion von gepackten BCD-Zahlen in das Format gepackter BCD-Zahlen zu wandeln.
Flag wird entsprechend dem Ergebnis der Operation gestellt
· Flag wird durch die Operation nicht beeinflusst
0 Flag wird durch die Operation gelöscht
1 Flag wird durch die Operation gesetzt
X Flag unbestimmt
V P/V-Flog entspricht dem Ergebnis-Überlauf der Operation
P P/V-Flag entspricht der Parität des Ergebnisses der Operation
r eines der Z-80D - Register A,B,C,D,E,H,L
a ein 8-Hit-Speicherplatz, der durch eine der für den jeweiligen Befehl zulässigen Adressierungsarten definiert ist.
dd ein 16-Bit-Speicherplatz, der durch eine der für diesen Befehl zulässigen Adressierungsarten definiert ist.
ii eines der zwei Indexregister IX oder IY 
R Auffrischzähler
n 8-Bit im Bereich 0 - 255
nn 16-Bit im Bereich 0 - 65535
A P/V-Plag ist 0, wenn das Ergebnis von BC-1 = 0, sonst F/V = 1
B Z-Flag ist 1, wenn A = M, sonst Z = 0 
IFF1 Interrupt-Annehme-Flip-Flop
IFF2 Interrupt-Zwischenspeicher-Flip-Plop
e stellt die Abstandsangabe in der relativen Adressierungsart dar, bezogen auf das 1. Byte des Sprungbefehls, e ist ein Zweierkomplement mit Vorzeichen im Bereich -126 bis +129
e-2 ergibt im Operationscode die tatsächliche Adresse PC+e, da der Befehlszähler vor der Addition von e um 2 erhöht worden ist.
sb bezeichnet das Bit b (0...7) des Speicherplatzes s
e falls B-1 = 0, wird Z = 1 gesetzt, sonst Z = 0
NC Not Connected - Bit nicht ausgewertet

Quelle: LC-80 Handbuch S. 166


0. Allgemeine FLAG-Wirkung history menue scroll up

Aufbau des FLAG-Registers Bits mit X haben keine oder umstrittene Wirkung

Befehl FLAG
CY Z NC P/V NC S N H
Bemerkungen
ADD s, ADC s
NC V NC 0
8-Bit-Addition oder Addition mit Übertrag
SUB s, SBC s, CMP s, NEG
NC V NC 1
8-Bit-Subtraktion, Subtraktion mit Übertrag, Vergleich und Negation des Akkumulators
AND s
0 NC P NC 0 1
Logisches AND - Register mit Akkumulator
OR s, XOR s
0 NC P NC 0 0
Logisches OR bzw. XOR - Register mit Akkumulator
INC s

·

NC P NC

0
Register - Erhöhung
DEC s
·

NC

P

NC

0
Register - Erniedrigung
ADD HL,dd

· NC · NC · 0 X
16-Bit-Addition 
ADC HL,dd
V 0 X
16-Bit-Addition mit Übertrag
SBC HL,dd
V 0 X
16-Bit-Subtrakion mit Übertrag
RLA, RLCA, RRA, RRCA
· · · 0 0
zyklische Verschiebung - Akkumulator
RL s, RLC s, RR s, RRCs
P 0 0
zyklische Verschiebung - Speicherplatz s
SLA s, SRA s, SRL s
P 0 0
Verschiebung - Speicherplatz s
RLD, RRD
· P 0 0
zyklische Verschiebung - Zahl links und rechts
DDA
P ·
Dezimalkorrektur des Akkumulators
CPL
· · · · 1 1
Komplement des Akkumulators
SCF
1 · · · 0 0
Setzen des Übertrages
CCF
· · · 0 X
Komplement des Übertrages
IN r, INF
· P 0 0
Einlesen der Peripherie mit indirekter Registeradresse
INI, IND, OUTI, OUTD
· X X 1 X
Block Ein- und Ausgabe, Z =0 wenn B <>0, sonst Z = 1
INIR, INRD, OTIR, OTDR
· 1 X X 1 X
wiederholte Block Ein- und Ausgabe, Z =0 wenn B <>0, sonst Z = 1
LDI, LDD
· X X 0 0
Blocktransferbefehle
LDIR, LDDR
· X 0 X 0 0
P/V =1 wenn BC <> 0, sonst P/V = 0
CPI, CPIR, CPD, CPDR
· X 1 X
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
· IFF2 0 0
Inhalt des Interrptannahme-FF 2 (IFF2) ins P/V-Flag übernommen
Bit b,s
· NC X X 0 1
Zustand des  Bits b im Speicherplatz s ins Z-Flag überführt

Quelle: LC-80 Handbuch S. 167


1. 8-Bit-Ladebefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
8-Bit-Ladebefehle 
LD r1,r2 r1r2

·

·

·

·

·

·

01 r1 r2
1 1

4

r1,r2 Register
000 B
001 C
010 D
011 E
100 H
101 L
111 A
LD r rn
· · · · · ·
00 r 110
2 2 7
LD r,(M) rM
· · · · · ·
01 r 110
1 2 7
LD r,(IX+d) r(IX+d)
· · · · · ·
11 011 101
01 r 110
- d -
3 5 19
LD r,(IY+d) r(IY+d)
· · · · · ·
11 111 101
01 r 110
- d -
3 5 19
LD (M),r (M)n
· · · · · ·
00 110 110
- n -
2 3 10
LD (IX+d),n (IX+d)n
· · · · · ·
11 011 101
00 110 110
- d -
- n -
4 5 19
LD (IY+d),n (IY+d)n
· · · · · ·
11 111 101
00 110 110
- d -
- n -
4 5 19
LD A,(BC) A(BC)
· · · · · ·
00 001 010
1 2 7
LD A,(DE) A(DE)
· · · · · ·
00 011 010
1 2 7
LD A,(nn) A(nn)
· · · · · ·
00 111 010
- n -
- n -
3 4 13
LD (BC),A (BC)A
· · · · · ·
00 000 010
1 2 7
LD (DE),A (DE)A
· · · · · ·
00 010 010
1 2 7
LD (nn),A  (nn)A
· · · · · ·
00 110 010
- n -
- n -
3 4 13
LD A,I A
· IFF 0 0
11 101 101
01 010 111
2 2 9
LD A,R AR
· IFF 0 0
11 101 101
01 011 111
2 2 9
LD I,A IA
· · · · · ·
11 101 101
01 000 111
2 2 9
LD R,A RA
· · · · · ·
11 101 101
01 001 111
2 2 9

2. 16-Bit-Ladebefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
16-Bit-Ladebefehle 
LD dd,nn ddnn

·

·

·

·

·

·

00 dd 001
- n -
- n -
3 3

10

dd Paar
00 BC
01 DE
10 HL
11 SP
LD IX,nn IXnn
· · · · · ·
11 011 101
4 4 14
LD IY,nn IYnn
· · · · · ·
11 111 101
00 100 001
- n -
- n -
4 4 14
LD HL,(nn) H(nn+1)
L(nn)
· · · · · ·
11 011 101
01 r 110
- d -
3 5 16
LD dd,(nn) ddH(nn+1)
ddL(nn)
· · · · · ·
11 101 101
01 dd1 011
- n -
- n -
4 6 20
LD IX,(nn) IXH(nn+1)
IXL(nn)
· · · · · ·
11 011 101
00 101 01
- n -
- n -
4 6 20
LD IY,(nn) IYH(nn+1)
IYL(nn)
· · · · · ·
11 111 101
00 101 010
- n -
- n -
4 6 20
LD (nn),HL (nn+1)H
(nn)L
· · · · · ·
00 100 010
- n -
- n -
4 6 20
LD (nn),dd (nn+1)ddH
(nn)ddH
· · · · · ·
11 101 101
01 dd0 011
- n -
- n -
4 6 20

dd ist eines der Registerpaare BC, DE, HL, SP

LD (nn),IX (nn+1)IXH
(nn)IXL
· · · · · ·
11 011 101
00 100 010
- n -
- n -
4 6 20
LD (nn),IY (nn+1)IYH
(nn)IYL
· · · · · ·
11 111 101
00 10 010
- n -
- n -
4 6 20
LD SP,HL SPHL
· · · · · ·
11 111 001
1 1 6
LD SP,IX SPIX
· · · · · ·
11 011 101
11 111 001
2 2 10
LD SP,IY SPIY
· · · · · ·
11 111 101
11 111 001
2 2 10

3. PUSH- und POP-Befehle history menue scroll up
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 ;-)
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
PUSH- und POP Operationen 
PUSH qq (SP-2)qqL
(SP-1)qqH
SP
SP-2
· · · · · ·
11 qq0 101
1 3 11
qq Paar
00 BC
01 DE
10 HL
11 AF
PUSH IX (SP-2)IXL
(SP-1)IXH
SPSP-2
· · · · · ·
11 011 101
11 110 101
2 4 15

qq ist eines der Registerpaare AF, BC, DE, HL

PUSH IY (SP-2)IYL
(SP-1)IYH
SPSP-2
· · · · · ·
11 111 101
11 100 101
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(SP+1)
qqL(SP)
SPSP+2
· · · · · ·
11 qq0 001
1 3 10
POP IX IXH(SP+1)
IXL(SP)
SPSP+2
· · · · · ·
11 011 101
11 100 001
2 4 14
POP IY IYH(SP+1)
IYL(SP)
SPSP+2
· · · · · ·
11 111 101
11 100 001
2 4 14

4. Austauschbefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Exchange-Befehle - Registeraustausch
EX DE,HL DEHL
· · · · · ·
11 101 011
1 1 4

Vertauschung des Registersatzes DE mit HL

EXAF AFAF'
· · · · · ·
00 001 000
1 1 4

Vertauschung der Registers A und F mit den entsprechenden Registern Alternativregistersatz

EXX BCBC'
DEDE'
HLHL'
· · · · · ·
11 111 101
1 1 4

Vertauschung des Registersatzes mit dem Alternativregistersatz

EX (SP),HL H(SP+1)
L(SP)
· · · · · ·
11 100 011
1 5 19
EX (SP),IX IXH(SP+1)
IXL(SP)
· · · · · ·
11 011 101
11 100 011
2 6 23
EX (SP),IY IYH(SP+1)
IYL(SP)
11 111 101
11 100 011
2 6 23

5. Blocktransferbefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Blocktransfer
LDI (DE)(HL)
DEDE+1
HLHL+1
BCBC-1
· X X 0 0
A
11 101 101
10 100 000
2 4 16

LDIR (DE)(HL)
DEDE+1
HLHL+1
BCBC-1
Wiederholung bis BC=0
· X 0 X 0 0
11 011 101
10 110 000
2
2
5
4
21
16

wenn BC0
wenn BC
=0

LDD (DE)(HL)
DEDE-1
HLHL-1
BCBC-1
· X X 0 0
A
11 101 101
10 101 000
2 4 16
LDDR (DE)(HL)
DEDE-1
HLHL-1
BCBC-1
Wiederholung bis BC=0
· X 0 X 0 0
11 101 101
11 111 000
2
2
5
4
21
16

wenn BC0
wenn BC
=0


6. Compare- oder Such- und Vergleichsbefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Blocktransfer
CPI A(HL)
HLHL+1
BCBC-1
· X 1 X
B A
11 101 101
10 100 001
2 4 16

Vergleich

CPIR A(HL)
HLHL+1
BCBC-1
Wiederholung bis BC=0
oder A=(HL)
· X 1 X
11 101 101
10 110 001
2
2
5
4
21
16

wenn BC0
wenn BC
=0

CPD A(HL)
HLHL-1
BCBC-1
· X 1 X
B A
11 101 101
10 101 001
2 4 16
CPDR A(HL)
HLHL-1
BCBC-1
Wiederholung bis BC=0
oder A = (HL)
· X 0 X 0 0
11 101 101
11 111 000
2
2
5
4
21
16

wenn BC0
wenn BC
=0


7. 8-Bit Arithmetik und Logikbefehle history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
8-Bit Arithmetik
ADD r AA+r
V 0 X
10 000 r
1 1 4
r Register
000 B
001 C
010 D
011 E
100 H
101 L
111 A

 

ADD n AA+n
V 0 X
11 000 110
- n -
2 2 7
ADD (HL) AA+(HL)
V 0 X
10 000 110
1 2 7
ADD (IX+d) AA+(IX+d)
V 0 X
11 011 101
10 000 110
- d -
3 5 19
ADD (IY+d) AA+(IY+d)
V 0 X
11 111 101
10 000 110
- d -
3 5 19
ADC s AA+s+CY
V 0 X
001

s ist eines der r, n, (HL), (IX+d), (IY+d) wie beim ADD-Befehl

SUB s AA-s
V 1 X
010
SBC s AA-s-CY
V 1

011

Logik
AND s AA-s
0 P 0 0

100

OR s AA-s
0 P 0 0
110
XOR s AA-s
0 P 0 0
101
CMP s A - s
V 1
111
INC r rr+1
· V 0
00 r 100
1 1 4
INC (HL) (HL)(HL)+1
· V 0
00 110 100
1 3 11
INC (IX+d) (IX+d)(IX+d)+1
· V 0
11 011 101
00 110 100
- d -
3 6 23
INC (IY+d) (IY+d)(IY+d)+1
· V 0
11 111 101
00 110 100
- d -
3 6 23
DEC f ff-1
· V 1

101

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 history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Allgemeine Arithmetikbefehle
DAA

Wandelt Akkumulator Inhalt in gepacktes BCD-Format nach Addition oder Subtraktion von gepackten BCD-Zahlen

P · X
00 100 111
1 1 4

Dezimalkorrektur des Akkumulators

CPL AA
· · · · 1 1
00 101 111
1 1 4

Einerkomplement des Akkumulators

NEG AA+1
V 0 X
10 000 110
1 2 7

Zweierkomplement des Akkumulators

CCF CFCF
· · · 0 X
00 111 111
1 1 4

Komplement des CARRY-Flags

SCF CF1
1 · · · 0 0
00 110 111
1 1 4

Setzen des CARRY-Flags

Steuerbefehle
NOP keine Operation
· · · · · ·
00 000 000
1 1 4
HALT Z80-CPU im HALT-Zustand
· · · · · ·
01

110

110
1 1 4
DI IFF10
IFF20
· · · · · ·
11

110

011
1 1 4
EI IFF11
IFF21
· · · · · ·
11 111 011
1 1 4
IM0 Setzen des Interrupt-Mode 0
· · · · · ·
11 101 101
01 000 110
2 2 8
IM1 Setzen des Interrupt-Mode 1
· · · · · ·
11 101 101
01 010 110
2 2 8
IM2 Setzen des Interrupt-Mode 2
· · · · · ·
11 101 101
01 011 110
2 2 8

9. 16-Bit Arithmetik history menue scroll up
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.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
8-Bit Arithmetik
ADD HL,dd HLHL+dd
· · · 0 X
00 dd1 001
1 3 11
dd Register
00 BC
01 DE
10 HL
11 SP

dd ist eines der Registerpaare BC, DE, HL, SP

ADC HL,dd HLHL+dd+CY
V 0 X
11 101 101
01 dd1 010
2 4 15
SBC HL,dd HLHL-dd-CY
V 0 X
11 101 101
01 dd0 010
2 4 15
ADD IX,pp IXIX+pp
· · · 0 X
11 011 101
00 pp1 001
2 4 15
pp Register
00 BC
01 DE
10 IX
11 SP

pp ist eines der Registerpaare BC, DE, IX, SP

ADD IY,pp IYIY+pp
· · · 0 X
11 111 101
00 pp1 001
2 4 15
pp Register
00 BC
01 DE
10 IY
11 SP

pp ist eines der Registerpaare BC, DE, IX, SP

INC dd dddd+1
· · · · · ·
00 dd0 011
1 1 6
INC IX IXIX+1
· · · · · ·
11

011

101
00 100 011
2 2 10
INC IY IYIY+1
· · · · · ·
11 111 101
00 100 011
2 2 10
DEC dd dddd-1
· · · · · ·
00 dd1 011
1 1 6
DEC IX IXIX-1
· · · · · ·
11 011 101
00 101 011
2 2 10
DEC IY IYIY-1
· · · · · ·
11 111 101
00 101 011
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