Z80-CPU FLAG-Dokumentation history menue Letztmalig dran rumgefummelt: 28.03.05 23:06:54
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
10. Verschiebebefehle
11. Bit Setzten, Löschen und Testen
12. Sprungbefehle
13. Unterprogrammaufruf
14. Ein- und Ausgabebefehle
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

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 P/V S N H
Bemerkungen
ADD s, ADC s
V 0
8-Bit-Addition oder Addition mit Übertrag
SUB s, SBC s, CMP s, NEG
V 1
8-Bit-Subtraktion, Subtraktion mit Übertrag, Vergleich und Negation des Akkumulators
AND s
0 P 0 1
Logisches AND - Register mit Akkumulator
OR s, XOR s
0 P 0 0
Logisches OR bzw. XOR - Register mit Akkumulator
INC s

·

P

0

Register - Erhöhung
DEC s
·

P

0

Register - Erniedrigung
ADD HL,dd

· · · 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
· X X 0 1
Zustand des  Bits b im Speicherplatz s ins Z-Flag überführt

Quelle: LC-80 Handbuch S. 167


10. Rotations- und Schiebebefehle history menue scroll up
Hierbei werden Bitmuster verschoben, woraus sich interessante mathematische Effekte ergeben. Die Befehle unterscheiden sich hauptsächlich in der Realisierung des einfließenden bzw. herausfallenden Bits. Das CARRY-Bit ist bei fast allen Operationen einbezogen.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Rotationsbefehle 
RLCA
A
· · · 0 0
00 000 111
1 1 4 Linksrotation A über CARRY
RLA
A
· · · 0 0
00 010 111
1 1 4 Linksrotation A durch CARRY
RRCA
A
· · · 0 0
00 111 010
1 1 4 Rechtsrotation A über CARRY
RRA
A
· · · 0 0
00 000 010
1 1 4 Rechtsrotation A durch CARRY
RLC r
r
P 0 0
11 001 011
00 000 r
2 2 8 Linksrotation über Register bzw. Speicherplatz
r Register
000 B
001 C
010 D
011 E
100 H
101 L
111 A
RLC (HL)
(HL)
P 0 0
11 001 011
00 000 110
2 4 15
RLC (IX+d)
(IX+d) 
P 0 0
11 011 101
11 001 011
- d -
00 000 110
4 6 23
RLC (IY+d)
(IY+d) 
P 0 0
11 111 101
11 001 011
- d -
00 000 110
4 6 23
RL  s
s=r, (HL), (IX+d), (IY+d)
P 0 0
010
Befehlsformat und Zustände wie bei RLC s; im Operationscode 000 durch die umrandeten Bits ersetzen
RRC s
s=r, (HL), (IX+d), IY+d)
P 0 0
001

s=r, (HL), (IX+d), (IY+d)
P 0 0

011

Arithmetisches Schieben
SLA s
s=r, (HL), (IX+d), (IY+d)
P 0 0

100

SRA s
s=r, (HL), (IX+d), (IY+d)
P 0 0

101

SRL s
s=r, (HL), (IX+d), (IY+d)
P 0 0

111

Logisches Schieben
RLD
· P 0 0
11 101 101
01 101 111
2 5 18 Rotation links bzw. rechts zwischen AC und (HL); der Inhalt der oberen Hälfte AC wird nicht beeinflusst
RRD
· P 0 0
11 101 101
01 100 111
2 5 18

11. Bit-Setzen, Löschen und Testen 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
Bittesten 
BIT b,r Zrb

·

X

X

0

1

11 001 011
01 b r
2 2

8

r Register
000 B
001 C
010 D
011 E
100 H
101 L
111 A

 

b getestetes Bit
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
BIT b,(HL) ZMb
· X X 0 1
11 001 011
01 001 011
2 3 12
BIT b,(IX+d) Z(IX+D)b
· X X 0 1
11 111 101
11 001 001
- d -
4 5 20
BIT b,(IY+d) Z(IY+D)b
· X X 0 1
11 111 101
11 001 011
- d -
34 5 20
SET b,r rb1
· · · · · ·
11 001 011
11 b r
2 2 8
SET b,(HL) (HL)b1
· · · · · ·
11 001 011
11 b 110
2 4 15
SET b,(IX+d) (IX+d)b1
· · · · · ·
11 011 101
11 001 011
- d -
11 b 110
4 6 23
SET b,(IY+d) (IY+d)b1
· · · · · ·
11 111 101
11 001 011
- d -
11 b 110
4 6 23
RES b,r rb0
· · · · · ·
11 001 011
10 b r
2 2 8

RES b,(HL) (HL)b0
· · · · · ·
11 001 011
10 b 110
2 4 15
RES b,(IX+d) (IX+d)b0
· · · · · ·
11 011 101
11 001 011
- d -
10 b 011
4 6 23
RES b,(IY+d) (IY+d)b0
· · · · · ·
11 111 101
11 001 011
- d -
10 b 110
4 56 23

12. Sprungbefehle history menue scroll up
Hauptaufgabe ist das neu Berechnen und Einstellen des Programmzählers. Der nächste abzuarbeitende Befehl wird dann von dieser neuen Adresse gebildet. Die Mehrheit der Befehle wertet die Flags aus. Vorteilhaft lassen sich relative Sprünge einsetzen.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
unbedingte sowie bedingte Sprünge absolut und relativ 
JMP nn PCnn
· · · · · ·
11 000 011
- n -
- n -
3 3 10
cc Bedingung
000 NZ - nicht 0
001 Z Null
010 NC kein Übertrag
011 C Übertrag
100 PO unpaarig
101 PE paarig
110 P Vorzeichen positiv
111 M Vorzeichen negativ
JP cc nn

wenn Bedingung cc wahr, dann PCnn, sonst weiter

· · · · · ·
11 cc 010
- n -
- n -
3 3 10
JR e PCPC+e
· · · · · ·
00 011 000
- e-2 -
2 3 12
JRC e wenn C=0, dann
kein Sprung
wenn C=1
PCPC+e
· · · · · ·
00 111 000
- e-2 -
2

2

2

3

7

12

Bedingung nicht erfüllt

Bedingung erfüllt

JRNC e wenn C=1, dann
kein Sprung
wenn C=0
PCPC+e
· · · · · ·
00 110 000
- e-2 -
2

2

2

3

7

12

Bedingung nicht erfüllt

Bedingung erfüllt

JRZ e wenn Z=0, dann
kein Sprung
wenn Z=1
PCPC+e
· · · · · ·
00 101 000
- e-2 -
2 4 14

Bedingung nicht erfüllt

Bedingung erfüllt

 

JRNZ e wenn Z=1, dann
kein Sprung
wenn Z=0
PCPC+e
· · · · · ·
00 100 000
- e-2 -
2

2

2

3

7

12

Bedingung nicht erfüllt

Bedingung erfüllt

JMP (HL) PC(HL)
· · · · · ·
11 101 001
1 1 4
JMP (IX) PCIX
· · · · · ·
11 011 101
11 101 001
2 2 8
JMP (IY) PCIY
· · · · · ·
11 111 101
11 101 001
2 2 8
DJNZ e BB-1
wenn B=0 kein Sprung
wenn B<>0 PCPC+e
· · · · · ·
00 010 000
- e-2 -
2

2

2

2

8

13

wenn B=0

wenn B0


13. Unterprgrammaufrufe history menue scroll up
Unterprogramme  sind für die Assemblerprogrammierung die Möglichkeit, effektiv den verfügbaren Speicherraum zu nutzen. Dabei gilt besonderes Augenmerk der Stapelverwaltung sowie der Datenrettung in Registern bzw. externen RAM-Bereichen.
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
CALL-Befehle - Unterprogrammtechnik
CALL nn (SP-1)PCH
(SP-2)PCL
PCnn
SP
SP-2
· · · · · ·
11 001 101
- n -
- n -
3 5 17
CA cc nn wenn Bedingung falsch ist, kein Sprung,
sonst wie CALL
· · · · · ·
11 cc 100
- n -
- n -
3

3

3

5

10

17

Bedingung nicht erfüllt

Bedingung erfüllt

RET PCL(SP)
PCH(SP+1)
SPSP+2
· · · · · ·
11 001 001
1 3 10
cc Bedingung
000 NZ nicht Null
001 Z Null
010 NC
011 C Übertrag
100 PO unpaarig
101 PE paarig
110 M Vorzeichen positiv
111 M Vorzeichen negativ
R cc wenn Bedingung falsch ist, keine Rückkehr,
sonst wie RET
· · · · · ·
11 cc 000
1 5 5
RETI Rücksprung vom Interrupt
PCL(SP)
PCH(SP+1)
SPSP+2
· · · · · ·
11 101 101
01 001 101
2 4 14
RETN Rücksprung vom NMI
PCL(SP)
PCH(SP+1)
SPSP+2
· · · · · ·
11 101 101
01 000 101
2 4 14
RST p (SP-1)PCH
(SP-2)PCL
PCH0
PCLp
SPSP-2
· · · · · ·
11 t 111
1 3 11
t p
000 00H
001 08H
010 10H
011 18H
100 20H
101 28H
110 30H
111 38H

14. Ein- und Ausgabebefehle history menue scroll up
Hier nun greifen wir auf die peripheren Bauelemente zurück. Byteweise können die einzelnen Kanäle der Geräte eingelesen werden - und dies auch am Block. Register C fungiert hier liebenswerterweise als Adresse (Index) für den gewählten Kanal (... das sollte dann auch schon mal 'ne Datenadresse sein) - B zählt die Transferzugriffe und (HL) fungiert als Quelle oder Zieladresse im RAM
Assemblersprache symbolische Operation

Flags

CY Z P/V S N H
Operationskode
76 543 210
Bytes M1-Zyklen Takte Bemerkungen
Blocktransfer
IN n A(n)
· · · · · ·
11 011 011
- n -
2 3 11

n zu A0 bis A7
AC zu A8 bis A15

IN r r(C)
· P 0 0
11 101 101
01 r 000
2 3 12

C zu A0 bis A7
B zu A8 bis A15

INF F(C)
wenn r=110 werden nur Flags gestellt
· P 0 0
01 r 000
2 3 12

C zu A0 bis A7
B zu A8 bis A15

INI (HL)(C)
BB-1
HLHL+1
· X X 1 X
11 101 101
10 100 010
2 4 16

C zu A0 bis A7
B zu A8 bis A15

INIR (HL)(C)
BB-1
HLHL+1
Wiederholung bis B=0
· 1 X X 1 X
11 101 101
10 110 010
2 wenn B≠0

2 wenn B=0

5 wenn B≠0

4 wenn B=0

21 wenn B≠0

16 wenn B=0

C zu A0 bis A7
B zu A8 bis A15

IND (HL)(C)
BB-1
HLHL-1
· X X 1 X
11 101 101
10 101 010
2 4 16

C zu A0 bis A7
B zu A8 bis A15

INDR (HL)(C)
BB-1
HLHL-1
Wiederholung bis B=0
· 1 X X 1 X
11 101 101
10 111 010
2 wenn B≠0

2 wenn B=0

5 wenn B≠0

4 wenn B=0

21 wenn B≠0

16 wenn B=0

C zu A0 bis A7
B zu A8 bis A15

OUT n (n)A
· · · · · ·
11 010 011
- n -
2 3 11

n zu A0 bis A7
AC zu A8 bis A15

OUT r (C)r
· · · · · ·
11 101 101
01 r 001
2 3 12

C zu A0 bis A7
B zu A8 bis A15

OUTI (C)(HL)
BB-1
HLHL+1
· X X 1 X
11 101 101
10 100 011
2 4 16

C zu A0 bis A7
B zu A8 bis A15

OTIR (C)(HL)
BB-1
HLHL+1
Wiederholung bis B=0
· X X 1 X
11 101 101
10 110 011
2 wenn B≠0

2 wenn B=0

5 wenn B≠0

4 wenn B=0

21 wenn B≠0

16 wenn B=0

C zu A0 bis A7
B zu A8 bis A15

OUTD (C)(HL)
BB-1
HLHL-1
· X X 1 1
11 101 101
10 101 011
2 4 16

C zu A0 bis A7
B zu A8 bis A15

OTDR (C)(HL)
BB-1
HLHL-1
Wiederholung bis B=0
· 1 X X 1 X
11 101 101
10 111 011
2 wenn B≠0

2 wenn B=0

5 wenn B≠0

4 wenn B=0

21 wenn B≠0

16 wenn B=0

C zu A0 bis A7
B zu A8 bis A15