Z80-CPU FLAG-Dokumentation | ![]() |
![]() |
Letztmalig dran rumgefummelt: 05.10.20 18:37:53 |
![]() |
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 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
![]() |
|
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
10. Rotations- und Schiebebefehle | ![]() |
![]() |
![]() |
![]() |
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. |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rotationsbefehle | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
11. Bit-Setzen, Löschen und Testen | ![]() |
![]() |
![]() |
![]() |
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. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Bittesten | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
12. Sprungbefehle | ![]() |
![]() |
![]() |
![]() |
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. |
|
|||||||||||||||||
unbedingte sowie bedingte Sprünge absolut und relativ |
JMP nn | PC![]() |
|
|
3 | 3 | 10 |
|
|||||||||||||||||||||||||||||||||
JP cc nn |
wenn Bedingung cc wahr, dann PC |
|
|
3 | 3 | 10 | ||||||||||||||||||||||||||||||||||
JR e | PC![]() |
|
|
2 | 3 | 12 | ||||||||||||||||||||||||||||||||||
JRC e | wenn C=0, dann kein Sprung wenn C=1 PC ![]() |
|
|
2
2 |
2
3 |
7
12 |
Bedingung nicht erfüllt Bedingung erfüllt |
|||||||||||||||||||||||||||||||||
JRNC e | wenn C=1, dann kein Sprung wenn C=0 PC ![]() |
|
|
2
2 |
2
3 |
7
12 |
Bedingung nicht erfüllt Bedingung erfüllt |
|||||||||||||||||||||||||||||||||
JRZ e | wenn Z=0, dann kein Sprung wenn Z=1 PC ![]() |
|
|
2 | 4 | 14 |
Bedingung nicht erfüllt Bedingung erfüllt
|
|||||||||||||||||||||||||||||||||
JRNZ e | wenn Z=1, dann kein Sprung wenn Z=0 PC ![]() |
|
|
2
2 |
2
3 |
7
12 |
Bedingung nicht erfüllt Bedingung erfüllt |
|||||||||||||||||||||||||||||||||
JMP (HL) |
PC![]() |
|
|
1 | 1 | 4 | ||||||||||||||||||||||||||||||||||
JMP (IX) |
PC![]() |
|
|
2 | 2 | 8 | ||||||||||||||||||||||||||||||||||
JMP (IY) |
PC![]() |
|
|
2 | 2 | 8 | ||||||||||||||||||||||||||||||||||
DJNZ e | B![]() wenn B=0 kein Sprung wenn B<>0 PC ![]() |
|
|
2
2 |
2
2 |
8
13 |
wenn B=0 wenn B≠0 |
13. Unterprgrammaufrufe | ![]() |
![]() |
![]() |
![]() |
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. |
|
|||||||||||||||||
CALL-Befehle - Unterprogrammtechnik |
CALL nn | (SP-1)![]() (SP-2) ![]() PC ![]() SP ![]() |
|
|
3 | 5 | 17 | ||||||||||||||||||||||||||||
CA cc nn | wenn Bedingung falsch
ist, kein Sprung, sonst wie CALL |
|
|
3
3 |
3
5 |
10
17 |
Bedingung nicht erfüllt Bedingung erfüllt |
|||||||||||||||||||||||||||
RET | PCL![]() PCH ![]() SP ![]() |
|
|
1 | 3 | 10 |
|
|||||||||||||||||||||||||||
R cc | wenn Bedingung falsch
ist, keine Rückkehr, sonst wie RET |
|
|
1 | 5 | 5 | ||||||||||||||||||||||||||||
RETI | Rücksprung vom
Interrupt PCL ![]() PCH ![]() SP ![]() |
|
|
2 | 4 | 14 | ||||||||||||||||||||||||||||
RETN | Rücksprung vom NMI PCL ![]() PCH ![]() SP ![]() |
|
|
2 | 4 | 14 | ||||||||||||||||||||||||||||
RST p | (SP-1)![]() (SP-2) ![]() PCH ![]() PCL ![]() SP ![]() |
|
|
1 | 3 | 11 |
|
14. Ein- und Ausgabebefehle | ![]() |
![]() |
![]() |
![]() |
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 |
|
Blocktransfer |
IN n | A![]() |
|
|
2 | 3 | 11 |
n zu A0 bis A7 |
||||||||||||
IN r | r![]() |
|
|
2 | 3 | 12 |
C zu A0 bis A7 |
||||||||||||
INF | F![]() wenn r=110 werden nur Flags gestellt |
|
|
2 | 3 | 12 |
C zu A0 bis A7 |
||||||||||||
INI | (HL)![]() B ![]() HL ![]() |
|
|
2 | 4 | 16 |
C zu A0 bis A7 |
||||||||||||
INIR | (HL)![]() B ![]() HL ![]() Wiederholung bis B=0 |
|
|
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 |
||||||||||||
IND | (HL)![]() B ![]() HL ![]() |
|
|
2 | 4 | 16 |
C zu A0 bis A7 |
||||||||||||
INDR | (HL)![]() B ![]() HL ![]() Wiederholung bis B=0 |
|
|
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 |
||||||||||||
OUT n | (n)![]() |
|
|
2 | 3 | 11 |
n zu A0 bis A7 |
||||||||||||
OUT r | (C)![]() |
|
|
2 | 3 | 12 |
C zu A0 bis A7 |
||||||||||||
OUTI | (C)![]() B ![]() HL ![]() |
|
|
2 | 4 | 16 |
C zu A0 bis A7 |
||||||||||||
OTIR | (C)![]() B ![]() HL ![]() Wiederholung bis B=0 |
|
|
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 |
||||||||||||
OUTD | (C)![]() B ![]() HL ![]() |
|
|
2 | 4 | 16 |
C zu A0 bis A7 |
||||||||||||
OTDR | (C)![]() B ![]() HL ![]() Wiederholung bis B=0 |
|
|
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 |