Instructieset van 8080 en Z80
Onderstaande tabellen bevatten de instructieset van de Z80. De instructieset van de Intel 8080 is hiervan een deelverzameling.
De 8085 wordt hier niet behandeld. Hij heeft twee instructies (RIM en SIM) meer dan de 8080 en is daardoor niet geheel compatibel met de Z80. De 8085 heeft ook nog een aantal ongedocumenteerde instructies.
De mnemonische codes van Intel en Z80 zijn niet aan elkaar gelijk. Dat is vermoedelijk gedaan om het auteursrecht van Intel niet te schenden. De codes van Z80 worden echter door velen beschouwd als gemakkelijker te leren.
De Z280 is een uitbreiding van de Z80, met nog meer instructies dan de Z80.
Registers
bewerkenA | F | A' | F' |
B | C | B' | C' |
D | E | D' | E' |
H | L | H' | L' |
IX | IY | ||
SP | PC | ||
IFF1 (één bit) | IFF2 (één bit) | I | R |
Register F
bewerkenHet register F (flags of conditiecode) bestaat uit acht bits waarvan er zes gedocumenteerd zijn:
bit | naam | betekenis | test |
---|---|---|---|
0 | C (carry) | Bij optellen en aftrekken de overdracht uit hoogste bit Bij schuifinstructies het bit dat uit het register geschoven werd |
C, NC |
1 | N | 0 na optellen en INC, 1 na aftrekken en DEC | door DAA-instructie |
2 | PV (parity, overflow) | Na optellen en aftrekken de 2-complements overflow Na logische instructies de pariteit van het resultaat |
PE, PO |
3 | Niet gebruikt | ||
4 | H (half carry) | Bij optellen en aftrekken de overdracht uit bit 3 (bij 16-bits bewerkingen de overdracht uit bit 11) | door DAA-instructie |
5 | Niet gebruikt | ||
6 | Z (zero) | 1 als het resultaat van een bewerking nul is, anders 0 | Z, NZ |
7 | S (sign) | gelijk aan bit 7 van het resultaat van een bewerking, het teken van het resultaat | M, P |
Legenda
bewerken- n
- een byte die in de instructie is opgenomen
- nn
- twee bytes die in de instructie zijn opgenomen
- e
- een byte die een sprong over een beperkte afstand mogelijk maakt
- i
- IX of IY
Instructies zonder prefix en met prefix DD en FD
bewerkenIn elk vak staat boven de syntaxis van de Z80, daaronder van de 8080/8085. Is er maar een syntaxis vermeld, dan werkt de instructie niet op de 8080, resp 8085.
Een instructie die gebruik maakt van HL kan worden voorzien van het prefix DD of FD en werkt dan niet met HL maar met IX of IY.
Een instructie die gebruik maakt van (HL) kan worden voorzien van het prefix DD of FD en werkt dan niet met (HL) maar met (IX+n) of (IY+n). Deze instructies hebben dus nog een extra byte, die de waarde van n (de offset) bevat.
Het gebruik van deze prefixen met een instructie waarin niet met HL of (HL) wordt gewerkt is voor de Z80 niet gedocumenteerd, maar de Z280 heeft veel extra instructies die beginnen met DD of FD, ook instructies die niet met IX of IY werken.
Opmerking:
- De sprongopdracht JP (HL) heeft een inconsequente syntaxis. Het zou JP HL moeten zijn. Met een prefix verandert deze instructie dan ook in JP (IX) of JP (IY), zonder een extra byte bij te tellen.
laatste 3 bits: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
eerste 5 of 13 bits | ||||||||
00 | NOP NOP |
LD BC,nn LXI B,nn |
LD (BC),A STAX B |
INC BC INX B |
INC B INC B |
DEC B DCR B |
LD B,n MVI B,n |
RLCA RLC |
DD00 FD00 |
LDW (HL),nn |
INCW (HL) INCW (IX+nn) |
INC (SP+nn) INC (PC+nn) |
DEC (SP+nn) DEC (PC+nn) |
LD (SP+nn),n LD (PC+nn),nn |
|||
08 | EX AF,AF' |
ADD HL,BC DAD B |
LD A,(BC) LDAX B |
DEC BC DCX B |
INC C INC C |
DEC C DCR C |
LD C,n MVI C,n |
RRCA RRC |
DD08 FD08 |
ADD i,BC | DECW (HL) DECW (IX+nn) |
INC (HL+IX) INC (IX+nn) |
DEC (HL+IX) DEC (IX+nn) |
LD (HL+IX),n LD (IX+nn),n |
|||
10 | DJNZ e |
LD DE,nn LXI D,nn |
LD (DE),A STAX D |
INC DE INX D |
INC D INC D |
DEC D DCR D |
LD D,n MVI D,n |
RLA RAL |
DD10 FD10 |
LDW (nn),nn |
INCW (nn) INCW (IY+nn) |
INC (HL+IY) INC (IY+nn) |
DEC (HL+IY) DEC (IY+nn) |
LD (HL+IY),n LD (IY+nn),n |
|||
18 | JR e |
ADD HL,DE DAD D |
LD A,(DE) LDAX D |
DEC DE DCX D |
INC E INC E |
DEC E DCR E |
LD E,n MVI E,n |
RRA RAR |
DD18 FD18 |
ADD i,DE | DECW (nn) DECW (IY+nn) |
INC (IX+IY) INC (HL+nn) |
DEC (IX+IY) DEC (HL+nn) |
LD (IX+IY),n LD (HL+nn),n |
|||
20 | JR NZ,e RIM (8085) |
LD HL,nn LXI H,nn |
LD (nn),HL SHLD nn |
INC HL INX H |
INC H INC H |
DEC H DCR H |
LD H,n MVI H,n |
DAA DAA |
DD20 FD20 |
JAR (n) |
LD i,nn | LD (nn),i | INC i | INC iH | DEC iH | LD iH,n | |
28 | JR Z,e |
ADD HL,HL DAD H |
LD HL,(nn) LHLD nn |
DEC HL DCX H |
INC L INC L |
DEC L DCR L |
LD L,n MVI L,n |
CPL CPL |
DD28 FD28 |
JAF (n) |
ADD i,i | LD i,(nn) | DEC i | INC iL | DEC iL | LD iL,n | |
30 | JR NC,e SIM (8085) |
LD SP,nn LXI SP,nn |
LD (nn),A STA nn |
INC SP INX SP |
INC (HL) INC M |
DEC (HL) DCR M |
LD (HL),n MVI M,n |
SCF SCF |
DD30 FD30 |
LDW (PC+nn),nn |
INCW (PC+nn) |
INC (i+n) | DEC (i+n) | LD (i+n),n | |||
38 | JR C,e |
ADD HL,SP DAD SP |
LD A,(nn) LDA nn |
DEC SP DCX SP |
INC A INC A |
DEC A DCR A |
LD A,n MVI A,n |
CCF CCF |
DD38 FD38 |
ADD i,SP | DECW (PC+nn) |
INC (nn) |
DEC (nn) |
LD (nn),n |
|||
40 | LD B,B MOV B,B |
LD B,C MOV B,C |
LD B,D MOV B,D |
LD B,E MOV B,E |
LD B,H MOV B,H |
LD B,L MOV B,L |
LD B,(HL) MOV B,M |
LD B,A MOV B,A |
DD40-FD40 | LD B,iH | LD B,iL | LD B,(i+n) | |||||
48 | LD C,B MOV C,B |
LD C,C MOV C,C |
LD C,D MOV C,D |
LD C,E MOV C,E |
LD C,H MOV C,H |
LD C,L MOV C,L |
LD C,(HL) MOV C,M |
LD C,A MOV C,A |
DD48-FD48 | LD C,iH | LD C,iL | LD C,(i+n) | |||||
50 | LD D,B MOV D,B |
LD D,C MOV D,C |
LD D,D MOV D,D |
LD D,E MOV D,E |
LD D,H MOV D,H |
LD D,L MOV D,L |
LD D,(HL) MOV D,M |
LD D,A MOV D,A |
DD50-FD50 | LD D,iH | LD D,iL | LD D,(i+n) | |||||
58 | LD E,B MOV E,B |
LD E,C MOV E,C |
LD E,D MOV E,D |
LD E,E MOV E,E |
LD E,H MOV E,H |
LD E,L MOV E,L |
LD E,(HL) MOV E,M |
LD E,A MOV E,A |
DD58-FD58 | LD E,iH | LD E,iL | LD E,(i+n) | |||||
60 | LD H,B MOV H,B |
LD H,C MOV H,C |
LD H,D MOV H,D |
LD H,E MOV H,E |
LD H,H MOV H,H |
LD H,L MOV H,L |
LD H,(HL) MOV H,M |
LD H,A MOV H,A |
DD60-FD60 | LD iH,B | LD iH,C | LD iH,D | LD iH,E | LD iH,iL | LD H,(i+n) | LD iH,A | |
68 | LD L,B MOV L,B |
LD L,C MOV L,C |
LD L,D MOV L,D |
LD L,E MOV L,E |
LD L,H MOV L,H |
LD L,L MOV L,L |
LD L,(HL) MOV L,M |
LD L,A MOV L,A |
DD68-FD68 | LD iL,B | LD iL,C | LD iL,D | LD iL,E | LD iL,iH | LD L,(i+n) | LD iL,A | |
70 | LD (HL),B MOV M,B |
LD (HL),C MOV M,C |
LD (HL),D MOV M,D |
LD (HL),E MOV M,E |
LD (HL),H MOV M,H |
LD (HL),L MOV M,L |
HALT HLT |
LD (HL),A MOV M,A |
DD70-FD70 | LD (i+n),B | LD (i+n),C | LD (i+n),D | LD (i+n),E | LD (i+n),H | LD (i+n),L | LD (i+n),A | |
78 | LD A,B MOV A,B |
LD A,C MOV A,C |
LD A,D MOV A,D |
LD A,E MOV A,E |
LD A,H MOV A,H |
LD A,L MOV A,L |
LD A,(HL) MOV A,M |
LD A,A MOV A,A |
DD78 FD78 |
LD A,(SP+nn) LD A,(PC+nn) |
LD A,(HL+IX) LD A,(IX+nn) |
LD A,(HL+IY) LD A,(IY+nn) |
LD A,(IX+IY) LD A,(HL+nn) |
LD A,iH | LD A,iL | LD A,(i+n) | |
80 | ADD A,B ADD B |
ADD A,C ADD C |
ADD A,D ADD D |
ADD A,E ADD E |
ADD A,H ADD H |
ADD A,L ADD L |
ADD A,(HL) ADD M |
ADD A,A ADD A |
DD80 FD80 |
ADD A,(SP+nn) ADD A,(PC+nn) |
ADD A,(HL+IX) ADD A,(IX+nn) |
ADD A,(HL+IY) ADD A,(IY+nn) |
ADD A,(IX+IY) ADD A,(HL+nn) |
ADD A,iH | ADD A,iL | ADD A,(i+n) | ADD A,(nn) |
88 | ADC A,B ADC B |
ADC A,C ADC C |
ADC A,D ADC D |
ADC A,E ADC E |
ADC A,H ADC H |
ADC A,L ADC L |
ADC A,(HL) ADC M |
ADC A,A ADC A |
DD88 FD88 |
ADC A,(SP+nn) ADC A,(PC+nn) |
ADC A,(HL+IX) ADC A,(IX+nn) |
ADC A,(HL+IY) ADC A,(IY+nn) |
ADC A,(IX+IY) ADC A,(HL+nn) |
ADC A,iH | ADC A,iL | ADC A,(i+n) | ADC A,(nn) |
90 | SUB A,B SUB B |
SUB A,C SUB C |
SUB A,D SUB D |
SUB A,E SUB E |
SUB A,H SUB H |
SUB A,L SUB L |
SUB A,(HL) SUB M |
SUB A,A SUB A |
DD90 FD90 |
SUB A,(SP+nn) SUB A,(PC+nn) |
SUB A,(HL+IX) SUB A,(IX+nn) |
SUB A,(HL+IY) SUB A,(IY+nn) |
SUB A,(IX+IY) SUB A,(HL+nn) |
SUB A,iH | SUB A,iL | SUB A,(i+n) | SUB A,(nn) |
98 | SBC A,B SBC B |
SBC A,C SBC C |
SBC A,D SBC D |
SBC A,E SBC E |
SBC A,H SBC H |
SBC A,L SBC L |
SBC A,(HL) SBC M |
SBC A,A SBC A |
DD98 FD98 |
SBC A,(SP+nn) SBC A,(PC+nn) |
SBC A,(HL+IX) SBC A,(IX+nn) |
SBC A,(HL+IY) SBC A,(IY+nn) |
SBC A,(IX+IY) SBC A,(HL+nn) |
SBC A,iH | SBC A,iL | SBC A,(i+n) | SBC A,(nn) |
A0 | AND A,B AND B |
AND A,C AND C |
AND A,D AND D |
AND A,E AND E |
AND A,H AND H |
AND A,L AND L |
AND A,(HL) AND M |
AND A,A AND A |
DDA0 FDA0 |
AND A,(SP+nn) AND A,(PC+nn) |
AND A,(HL+IX) AND A,(IX+nn) |
AND A,(HL+IY) AND A,(IY+nn) |
AND A,(IX+IY) AND A,(HL+nn) |
AND A,iH | AND A,iL | AND A,(i+n) | AND A,(nn) |
A8 | XOR A,B XOR B |
XOR A,C XOR C |
XOR A,D XOR D |
XOR A,E XOR E |
XOR A,H XOR H |
XOR A,L XOR L |
XOR A,(HL) XOR M |
XOR A,A XOR A |
DDA8 FDA8 |
XOR A,(SP+nn) XOR A,(PC+nn) |
XOR A,(HL+IX) XOR A,(IX+nn) |
XOR A,(HL+IY) XOR A,(IY+nn) |
XOR A,(IX+IY) XOR A,(HL+nn) |
XOR A,iH | XOR A,iL | XOR A,(i+n) | XOR A,(nn) |
B0 | OR A,B OR B |
OR A,C OR C |
OR A,D OR D |
OR A,E OR E |
OR A,H OR H |
OR A,L OR L |
OR A,(HL) OR M |
OR A,A OR A |
DDB0 FDB0 |
OR A,(SP+nn) OR A,(PC+nn) |
OR A,(HL+IX) OR A,(IX+nn) |
OR A,(HL+IY) OR A,(IY+nn) |
OR A,(IX+IY) OR A,(HL+nn) |
OR A,iH | OR A,iL | OR A,(i+n) | OR A,(nn) |
B8 | CP A,B CP B |
CP A,C CP C |
CP A,D CP D |
CP A,E CP E |
CP A,H CP H |
CP A,L CP L |
CP A,(HL) CP M |
CP A,A CP A |
DDB8 FDB8 |
CP A,(SP+nn) CP A,(PC+nn) |
CP A,(HL+IX) CP A,(IX+nn) |
CP A,(HL+IY) CP A,(IY+nn) |
CP A,(IX+IY) CP A,(HL+nn) |
CP A,iH | CP A,iL | CP A,(i+n) | CP A,(nn) |
C0 | RET NZ RNZ |
POP BC POP B |
JP NZ,nn JNZ nn |
JP nn JMP nn |
CALL NZ,nn CNZ nn |
PUSH BC PUSH B |
ADD A,n ADI n |
RST 0 RST 0 |
DDC0 FDC0 |
POP (HL) |
JP NZ,(HL) JP NZ,PC+nn |
(zie E9) JP PC+nn |
CALL NZ,(HL) CALL NZ,PC+nn |
PUSH (HL) |
|||
C8 | RET Z RZ |
RET RET |
JP Z,nn JZ nn |
prefix |
CALL Z,nn CZ nn |
CALL nn CALL nn |
ADC A,n ACI n |
RST 8 RST 1 |
DDC8 FDC8 |
JP Z,(HL) JP Z,PC+nn |
prefix | CALL Z,(HL) CALL Z,PC+nn |
CALL (HL) CALL PC+nn |
||||
D0 | RET NC RNC |
POP DE POP D |
JP NC,nn JNC nn |
OUT (n),A OUT n |
CALL NC,nn CNC nn |
PUSH DE PUSH D |
SUB A,n SUI n |
RST 10h RST 2 |
DDD0 FDD0 |
POP (nn) |
JP NC,(HL) JP NC,PC+nn |
CALL NC,(HL) CALL NC,PC+nn |
PUSH (nn) |
||||
D8 | RET C RC |
EXX |
JP C,nn JC nn |
IN A,(n) IN n |
CALL C,nn CC nn |
prefix IX |
SBC A,n SBI n |
RST 18h RST 3 |
DDD8 FDD8 |
JP C,(HL) JP C,PC+nn |
CALL C,(HL) CALL C,PC+nn |
||||||
E0 | RET PO RPO |
POP HL POP H |
JP PO,nn JPO nn |
EX (SP),HL XTHL |
CALL PO,nn CPO nn |
PUSH HL PUSH H |
AND A,n ANI n |
RST 20h RST 4 |
DDE0 FDE0 |
POP i | JP PO,(HL) JP PO,PC+nn |
EX (SP),i | CALL PO,(HL) CALL PO,PC+nn |
PUSH i | |||
E8 | RET PE RPE |
JP (HL) PCHL |
JP PE,nn JPE nn |
EX DE,HL XCHG |
CALL PE,nn CPE nn |
prefix |
XOR A,n XRI n |
RST 28h RST 5 |
DDE8 FDE8 |
JP (i) | JP PE,(HL) JP PE,PC+nn |
EX i,HL | CALL PE,(HL) CALL PE,PC+nn |
||||
F0 | RET P RP |
POP AF POP PSW |
JP P,nn JP nn |
DI DI |
CALL P,nn CP nn |
PUSH AF PUSH PSW |
OR A,n ORI n |
RST 30h RST 6 |
DDF0 FDF0 |
POP (PC+nn) |
JP P,(HL) JP P,PC+nn |
CALL P,(HL) CALL P,PC+nn |
PUSH (PC+nn) PUSH nn |
||||
F8 | RET M RM |
LD SP,HL SPHL |
JP M,nn JM nn |
EI EI |
CALL M,nn CM nn |
prefix IY |
CP A,n CPI n |
RST 38h RST 7 |
DDF8 FDF8 |
LD SP,i | JP M,(HL) JP M,PC+nn |
CALL M,(HL) CALL M,PC+nn |
Z80-instructies beginnend met CB
bewerkenNa de opcode CB heeft de Z80 een aantal instructies voor bitmanipulaties.
Sommige van deze instructies zijn uitbreidingen van reeds bestaande instructies. Zo werkt RLC met elk 8-bitsregister, ook met A, hoewel RLCA reeds bestaat, maar uitsluitend met A. Er is echter meer verschil: RLC A verandert meer flags dan RLCA.
Opmerkelijk is dat de tweede byte van deze uitgebreide instructies gelijk is aan de opcode van de oorspronkelijke instructie. Bijvoorbeeld: RLCA is 07 en RLC A is CB07.
Een van de instructies is voor de Z80 niet gedocumenteerd. Hobbyisten die de instructie ontdekten gaven hem de opcode SLL of beter SL1. Men vermoedt dat de instructie een onbedoeld neveneffect is van het decoderen van de opcodes en dat de fabrikant niet dacht dat de instructie ergens nuttig voor zou zijn. Bij de latere Z280 is de opcode gebruikt voor de instructie TSET. De Z280 is dus niet geschikt voor een programma dat gebruik maakt van de ongedocumenteerde SL1.
De prefixen DD en FD kunnen gecombineerd worden met CB. Dit is alleen gedocumenteerd voor de instructies die (HL) gebruiken, en hierin wordt dus (IX+n) of (IY+n) gebruikt in plaats van (HL). Merkwaardig is dat in dit geval de laatste twee bytes van de instructie verwisseld worden. Na CB komt eerst de offset n en daarna de eigenlijke opcode. Vergelijk het volgende:
CB C6 SET 0,(HL) DD CB 03 C6 SET 0,(IX+3)
Men kan zich afvragen wat er gebeurt als de laatste drie bits van de vierde byte niet 110 zijn, wat niet gedocumenteerd is. Er is dan in principe geen offset nodig, maar dat kan de processor op dat moment nog niet weten. Bij onderzoek blijkt dat de bewerking met (IX+n) of (IY+n) wordt uitgevoerd en dat bovendien het resultaat wordt geladen in het register dat door de laatste drie bits wordt aangewezen. Dit is ongetwijfeld een onbedoeld neveneffect.
eerste 13 bits | eerste 10 bits | eerste 16 bits en laatste 8 bits | eerste 16 bits en laatste 8 bits | |||||||
---|---|---|---|---|---|---|---|---|---|---|
CB00 1100 1011 0000 0 |
RLC r | CB40 1100 1011 01 |
BIT b,r | DDCBnn06-FDCBnn06 | RLC (i+n) | DDCBnn46-FDCBnn46 | BIT b,(i+n) | |||
CB08 1100 1011 0000 1 |
RRC r | CB80 1100 1011 10 |
RES b,r | DDCBnn0E-FDCBnn0E | RRC (i+n) | DDCBnn86-FDCBnn86 | RES b,(i+n) | |||
CB10 1100 1011 0001 0 |
RL r | CBC0 1100 1011 11 |
SET b,r | DDCBnn16-FDCBnn16 | RL (i+n) | DDCBnnC6-FDCBnnC6 | SET b,(i+n) | |||
CB18 1100 1011 0001 1 |
RR r | DDCBnn1E-FDCBnn1E | RR (i+n) | |||||||
CB20 1100 1011 0010 0 |
SLA r | DDCBnn26-FDCBnn26 | SLA (i+n) | |||||||
CB28 1100 1011 0010 1 |
SRA r | DDCBnn2E-FDCBnn2E | SRA (i+n) | |||||||
CB30 1100 1011 0011 0 |
TSET r | DDCBnn30-FDCBnn30 | TSET (i+n) | |||||||
CB38 1100 1011 0011 1 |
SRL r | DDCBnn3E-FDCBnn3E | SRL (i+n) |
Z80-instructies beginnend met ED
bewerkenNa de opcode ED heeft de Z80 nog een aantal verschillende instructies. De latere processor Z280 heeft hier nog veel meer aan toegevoegd. Bovendien kent de Z280 combinaties van ED met DD en FD.
laatste 3 bits: | 0/8 | 1/9 | 2/A | 3/B | 4/C | 5/D | 6/E | 7/F |
---|---|---|---|---|---|---|---|---|
eerste 13 of 21 bits | ||||||||
ED00 | LDA HL,(SP+nn) | LD (SP+nn),A | LD HL,(SP+nn) | LD (SP+nn),HL | LD BC,(HL) | EX A,B | ||
DDED00 FDED00 |
LDA i,(SP+nn) | LD i,(SP+nn) | LD (SP+nn),i | LD BC, (i+n) | EX A,(SP+nn) EX A,(PC+nn) | |||
ED08 | LDA HL,(HL+IX) | LD (HL+IX),A | LD HL,(HL+IX) | LD (HL+IX),HL | LD (HL),BC | EX A,C | ||
DDED08 FDED08 |
LDA i,(HL+IX) | LD i,(HL+IX) | LD (HL+IX),i | LD (i+n),BC | EX A,(HL+IX) EX A,(IX+nn) | |||
ED10 | LDA HL,(HL+IY) | LD (HL+IY),A | LD HL,(HL+IY) | LD (HL+IY),HL | LD DE,(HL) | EX A,D | ||
DDED10 FDED10 |
LDA i,(HL+IY) | LD i,(HL+IY) | LD (HL+IY),i | LD DE,(i+n) | EX A,(HL+IY) EX A,(IY+nn) | |||
ED18 | LDA HL,(IX+IY) | LD (IX+IY),A | LD HL,(IX+IY) | LD (IX+IY),HL | LD (HL),DE | EX A,E | ||
DDED18 FDED18 |
LDA i,(IX+IY) | LD i,(IX+IY) | LD (IX+IY),i | LD (i+n),DE | EX A,(IX+IY) EX A,(HL+nn) | |||
ED20 | LDA HL,(PC+nn) | LD (PC+nn),A | LD HL,(PC+nn) | LD (PC+nn),HL | LD HL,(HL) | EX A,H | ||
DDED20-FDED20 | LDA i,(PC+nn) | LD i,(PC+nn) | LD (PC+nn),i | LD HL,(i+n) | EX A,iH | |||
ED28 | LDA HL,(IX+nn) | LD (IX+nn),A | LD HL,(IX+nn) | LD (IX+nn),HL | LD (HL),HL | EX A,L | ||
DDED28-FDED28 | LDA i,(IX+nn) | LD i,(IX+nn) | LD (IX+nn),i | LD (i+n),HL | EX A,iL | |||
ED30 | LDA HL,(IY+nn) | LD (IY+nn),A | LD HL,(IY+nn) | LD (IY+nn),HL | LD SP,(HL) | EX A,(HL) | ||
DDED30-FDED30 | LDA i,(IY+nn) | LD i,(IY+nn) | LD (IY+nn),i | LD SP,(i+n) | EX A,(i+n) | |||
ED38 | LDA HL,(HL+nn) | LD (HL+nn),A | LD HL,(HL+nn) | LD (HL+nn),HL | LD (HL),SP | EX A,A | ||
DDED38-FDED38 | LDA i,(HL+nn) | LD i,(HL+nn) | LD (HL+nn),i | LD (i+n),SP | ||||
ED40 | IN B,(C) | OUT (C),B | SBC HL,BC | LD(nn),BC | NEG A | RETN | IM 0 | LD I,A |
DDED40 FDED40 |
IN (SP+nn),(C) IN (PC+nn),(C) |
OUT (C),(SP+nn) OUT (C),(PC+nn) |
SBC i,BC | |||||
ED48 | IN C,(C) | OUT (C),C | ADC HL,BC | LD BC,(nn) | NEG HL | RETI | IM 3 | LD R,A |
DDED48 FDED48 |
IN (HL+IX),(C) IN (IX+nn),(C) |
OUT (C),(HL+IX) OUT (C),(IX+nn) |
ADC i,BC | |||||
ED50 | IN D,(C) | OUT (C),D | SBC HL,DE | LD (nn),DE | RETIL | IM 1 | LD A,I | |
DDED50 FDED50 |
IN (HL+IY),(C) IN (IY+nn),(C) |
OUT (C),(HL+IY) OUT (C),(IY+nn) |
SBC i,DE | |||||
ED58 | IN E,(C) | OUT (C),E | ADC HL,DE | LD DE,(nn) | IM 2 | LD A,R | ||
DDED58 FDED58 |
IN (IX+IY),(C) IN (HL+nn),(C) |
OUT (C),(IX+IY) OUT (C),(HL+nn) |
ADC i,DE | |||||
ED60 | IN H,(C) | OUT (C),H | SBC HL,HL | (zie 22) | EXTS A | PCACHE | LDCTL HL,(C) | RRD |
DDED60-FDED60 | IN iH,(C) | OUT (C),iH | SBC i,i | LDCTL i,(C) | ||||
ED68 | IN L,(C) | OUT (C),L | ADC HL,HL | (zie 2A) | EXTS HL | ADD HL,A | LDCTL (C),HL | RLD |
DDED68-FDED68 | IN iL,(C) | OUT (C),iL | ADC i,i | ADD i,A | LDCTL (C),i | |||
ED70 | TST (C) | SC nn | SBC HL,SP | LD (nn),SP | DI n | |||
DDED70-FDED70 | SBC i,SP | |||||||
ED78 | IN A,(C) | OUT (C),A | ADC HL,SP | LD SP,(nn) | EI n | |||
DDED78 FDED78 |
IN (nn),(C) |
OUT (C),(nn) |
ADC i,SP | |||||
ED80 | INIW | OUTIW | EPUM (SP+nn) | MEPU (SP+nn) | LDUD A,(HL) | LDCTL HL,USP | ||
DDED80-FDED80 | LDUD A,(i+n) | LDCTL i,USP | ||||||
ED88 | INDW | OUTDW | EPUM (HL+IX) | MEPU (HL+IX) | LDUD (HL),A | LDCTL USP,HL | ||
DDED88-FDED88 | LDUD (i+n),A | LDCTL USP,i | ||||||
ED90 | INIRW | OTIRW | EPUM(HL+IY) | MEPU(HL+IY) | LDUP A,(HL) | EPUF | ||
DDED90-FDED90 | LDUP A,(i+n) | |||||||
ED98 | INDRW | OTDRW | EPUM (IX+IY) | MEPU (IX+IY) | LDUP (HL),A | EPUI | ||
DDED98-FDED98 | LDUP (i+n),A | |||||||
EDA0 | LDI | CPI | INI | OUTI | EPUM (PC+nn) | MEPU (PC+nn) | EPUM (HL) | EPUM (nn) |
EDA8 | LDD | CPD | IND | OUTD | EPUM (IX+nn) | MEPU (IX+nn) | MEPU (HL) | MEPU (nn) |
EDB0 | LDIR | CPIR | INIR | OTIR | EPUM (IY+nn) | MEPU (IY+nn) | IN HL,(C) | |
EDB8 | LDDR | CPDR | INDR | OTDR | EPUM (HL+nn) | MEPU (HL+nn) | OUT C,HL | |
EDC0 | MULT A,B | MULTU A,B | MULT HL,BC | MULTU HL,BC | DIV HL,B | DIVU HL,B | ADD HL,BC | CP HL,BC |
DDEDC0 FDEDC0 |
MULT A,(SP+nn) MULT A,(PC+nn) |
MULTU A,(SP+nn) MULTU A,(PC+nn) |
MULT HL,(HL) MULT HL,(IX+nn) |
MULTU HL,(HL) MULTU HL,(IX+nn) |
DIV HL,(SP+nn) DIV HL,(PC+nn) |
DIVU HL,(SP+nn) DIVU HL,(PC+nn) |
ADD HL,(HL) ADD HL,(IX+nn) |
CP HL,(HL) CP HL,(IX+nn) |
EDC8 | MULT A,C | MULTU A,C | DIV DEHL,BC | DIVU DEHL,BC | DIV HL,C | DIVU HL,C | SUB HL,BC | |
DDEDC8 FDEDC8 |
MULT A,(HL+IX) MULT A,(IX+nn) |
MULTU A,(HL+IX) MULTU A,(IX+nn) |
DIV DEHL,(HL) DIV DEHL,(IX+nn) |
DIVU DEHL,(HL) DIVU DEHL,(IX+nn) |
DIV HL,(HL+IX) DIV HL,(IX+nn) |
DIVU HL,(HL+IX) DIVU HL,(IX+nn) |
SUB HL,(HL) SUB HL,(IX+nn) |
|
EDD0 | MULT A,D | MULTU A,D | MULT HL,DE | MULTU HL,DE | DIV HL,D | DIVU HL,D | ADD HL,DE | CP HL,DE |
DDEDD0 FDEDD0 |
MULT A,(HL+IY) MULT A,(IY+nn) |
MULTU A,(HL+IY) MULTU A,(IY+nn) |
MULT HL,(nn) MULT HL,(IY+nn) |
MULTU HL,(nn) MULTU HL,(IY+nn) |
DIV HL,(HL+IY) DIV HL,(IY+nn) |
DIVU HL,(HL+IY) DIVU HL,(IY+nn) |
ADD HL,(nn) ADD HL,(IY+nn) |
CP HL,(nn) CP HL,(IY+nn) |
EDD8 | MULT A,E | MULTU A,E | DIV DEHL,DE | DIVU DEHL,DE | DIV HL,E | DIVU HL,E | SUB HL,DE | |
DDEDD8 FDEDD8 |
MULT A,(IX+IY) MULT A,(HL+nn) |
MULTU A,(IX+IY) MULTU A,(HL+nn) |
DIV DEHL,(nn) DIV DEHL,(IY+nn) |
DIVU DEHL,(nn) DIVU DEHL,(IY+nn) |
DIV HL,(IX+IY) DIV HL,(HL+nn) |
DIVU HL,(IX+IY) DIVU HL,(HL+nn) |
SUB HL,(nn) SUB HL,(IY+nn) |
|
EDE0 | MULT A,H | MULTU A,H | MULT HL,HL | MULTU HL,HL | DIV HL,H | DIVU HL,H | ADD HL,HL | CP HL,HL |
DDEDE0-FDEDE0 | MULT A,(iH) | MULTU A,(iH) | MULT HL,i | MULTU HL,i | DIV HL,iH | DIVU HL,iH | ADD HL,i | CP HL,i |
EDE8 | MULT A,L | MULTU A,L | DIV DEHL,HL | DIVU DEHL,HL | DIV HL,L | DIVU HL,L | SUB HL,HL | EX H,L |
DDEDE8-FDEDE8 | MULT A,iL | MULTU A,iL | DIV DEHL,iL | DIVU DEHL,iL | DIV HL,iL | DIVU HL,iL | SUB HL,i | |
EDF0 | MULT A,(HL) | MULTU A,(HL) | MULT HL,SP | MULTU HL,SP | DIV HL,(HL) | DIVU HL,(HL) | ADD HL,SP | CP HL,SP |
DDEDF0 FDEDF0 |
MULT A,(i+n) | MULTU A,(i+n) | MULT HL,(PC+nn) MULT HL,nn |
MULTU HL,(PC+nn) MULTU HL,nn |
DIV HL,i | DIVU HL,i | ADD HL,(HL) ADD HL,nn |
CP HL,(PC+nn) CP HL,nn |
EDF8 | MULT A,A | MULTU A,A | DIV DEHL,SP | DIVU DEHL,SP | DIV HL,A | DIVU HL,A | SUB HL,SP | |
DDEDF8 FDEDF8 |
MULT A,(nn) MULT A,n |
MULTU A,(nn) MULTU A,n |
DIV DEHL,(PC+nn) DIV DEHL,nn |
DIVU DEHL,(PC+nn) DIVU DEHL,nn |
DIV HL,(nn) DIV HL,n |
DIVU HL,(nn) DIVU HL,n |
SUB HL,(PC+nn) SUB HL,nn |
Beschrijving van de instructies
bewerkenHieronder staan alleen de Z80-instructies.
- ADC
- De operanden en bit C van register F worden opgeteld en het resultaat komt in de linker operand. De conditiecode wordt gezet.
- ADD
- De operanden worden opgeteld en het resultaat komt in de linker operand. De conditiecode wordt gezet.
- AND
- Logische En van A en de operand. Het resultaat komt in A. De conditiecode wordt gezet.
- BIT
- Een bit van de rechter operand wordt getest. Bit Z van de conditiecode wordt het omgekeerde van de geteste bit.
- CALL
- Voorwaardelijke of onvoorwaardelijke aanroep van subroutine. PC wordt op de stack gezet, SP wordt met 2 verminderd en het nieuwe executieadres komt in PC. Geen invloed op conditiecode.
- CCF
- Bit C van de conditiecode wordt omgekeerd.
- CP
- A wordt verminderd met de operand. Het resultaat van de aftrekking gaat verloren maar de conditiecode wordt gezet.
- CPD
- A wordt verminderd met (HL). Het resultaat van de aftrekking gaat verloren maar de conditiecode wordt gezet. Daarna worden HL en BC met 1 verminderd.
- CPDR
- Als CPD. Is BC na de bewerking ongelijk nul en de flag Z gelijk aan nul, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- CPI
- A wordt verminderd met (HL). Het resultaat van de aftrekking gaat verloren maar de conditiecode wordt gezet. Daarna wordt HL met 1 verhoogd en BC met 1 verminderd.
- CPIR
- Als CPI. Is BC na de bewerking ongelijk nul en de flag Z gelijk aan nul, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- CPL
- Alle bits in register A worden omgekeerd. Geen invloed op de conditiecode (behalve H en N).
- DAA
- Na een optelling wordt register A gecorrigeerd voor BCD. De conditiecode wordt gezet.
- DEC
- De operand wordt met 1 verminderd. Is het een 8-bits bewerking, dan wordt de conditiecode gezet, met uitzondering van bit C. Is het een 16-bits bewerking, dan blijft de conditiecode onveranderd.
- DI
- Bits IFF1 en IFF2 worden nul gemaakt, zodat de processor niet reageert op interrupts.
- DJNZ
- Register B wordt met 1 verminderd. Is het resultaat ongelijk aan nul, dan wordt de positieve of negatieve 8-bits operand bij PC opgeteld. De conditiecode blijft onveranderd.
- EI
- Bits IFF1 en IFF2 worden 1 gemaakt, zodat de processor reageert op interrupts.
- EX
- De inhoud van de operanden wordt verwisseld.
- EXX
- De inhoud van BC, DE en HL wordt verwisseld met BC', DE' en HL'.
- IM
- De processor werkt vanaf nu in interruptmodeus 0, 1 of 2.
- IN
- Invoer van een port naar het aangegeven register. Wordt register C voor de port gebruikt, dan wordt de conditiecode gezet.
- INC
- De operand wordt met 1 verhoogd. Is het een 8-bits bewerking, dan wordt de conditiecode gezet, met uitzondering van bit C. Is het een 16-bits bewerking, dan blijft de conditiecode onveranderd.
- IND
- Invoer van een port naar (HL). Daarna worden B en HL met 1 verminderd. Bit Z van de conditiecode wordt bepaald door de nieuwe waarde van B.
- INDR
- Als IND. Is bit Z daarna 0, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- INI
- Invoer van een port naar (HL). Daarna worden B met 1 verminderd en HL met 1 verhoogd. Bit Z van de conditiecode wordt bepaald door de nieuwe waarde van B.
- INIR
- Als INI. Is bit Z daarna 0, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- JP
- Voorwaardelijke of onvoorwaardelijke sprong. Het nieuwe executieadres komt in PC. Geen invloed op conditiecode.
- JR
- Voorwaardelijke of onvoorwaardelijke sprong. De positieve of negatieve 8-bits operand bij PC opgeteld. Geen invloed op conditiecode. Deze instructie kost slechts twee bytes in het programmageheugen, maar is trager dan JP als de sprong wordt uitgevoerd.
- LD
- De tweede operand wordt gekopieerd naar de eerste operand. Geen invloed op conditiecode. Uitzondering: bij LD A,I en LD A,R worden de bits S en Z beïnvloed door het resultaat en bovendien wordt IFF2 naar bit P/V gekopieerd. Dit is de enige manier om de inhoud van IFF2 te lezen.
- LDD
- (HL) wordt gekopieerd naar (DE). DE, HL en BC worden met 1 verminderd. Is BC na de bewerking nul, dan wordt P/V (dus niet Z) op 0 gezet.
- LDDR
- Als LDD. Is bit P/V daarna 1, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- LDI
- (HL) wordt gekopieerd naar (DE). DE en HL worden met 1 verhoogd en BC wordt met 1 verminderd. Is BC na de bewerking nul, dan wordt P/V (dus niet Z) op 0 gezet.
- LDIR
- Als LDI. Is bit P/V daarna 1, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- NEG
- Het tegengestelde van de operand wordt bepaald en het resultaat komt in hetzelfde register. De conditiecode wordt gezet.
- NOP
- Er wordt geen bewerking uitgevoerd.
- OR
- Logische Of van A en de operand. Het resultaat komt in A. De conditiecode wordt gezet.
- OUT
- Uitvoer van het aangegeven register naar een port. Geen invloed op de conditiecode.
- OUTD
- Uitvoer van (HL) naar een port (C). HL en B worden met 1 verminderd. Bit Z van de conditiecode wordt bepaald door de nieuwe waarde van B.
- OUTDR
- Als OUTD. Is bit Z daarna 0, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- OUTI
- Uitvoer van (HL) naar een port (C). HL wordt met 1 verhoogd en B wordt met 1 verminderd. Bit Z van de conditiecode wordt bepaald door de nieuwe waarde van B.
- OUTIR
- Als OUTI. Is bit Z daarna 0, dan wordt PC met 2 verminderd, zodat de instructie herhaald wordt.
- POP
- (SP) wordt naar het aangegeven register gekopieerd. SP wordt met 2 verhoogd. Geen invloed op conditiecode, behalve bij POP AF.
- PUSH
- SP wordt met 2 verminderd en het aangegeven register wordt naar (SP) gekopieerd. Geen invloed op conditiecode.
- RES
- Een bit van de rechter operand wordt 0 gemaakt. Geen invloed op conditiecode.
- RET
- Hetzelfde als POP PC. Kan ook voorwaardelijk zijn.
- RETI
- Hetzelfde als RET. Bovendien wordt IFF2 gekopieerd naar IFF1. Sommige externe chips kunnen deze instructie afluisteren en weten dan dat een interruptroutine voltooid is.
- RETN
- Hetzelfde als RET. Bedoeld voor gebruik na NMI.
- RL
- De bits van de operand worden een plaats naar links geschoven. De hoogste bit wordt naar C gekopieerd en de oorspronkelijke waarde van C komt in de laagste bit van het register. De conditiecode wordt gezet.
- RLA
- Als RL, maar werkt alleen met register A en van de conditiecode wordt alleen bit C beïnvloed.
- RLC
- De bits van de operand worden een plaats naar links geschoven. De hoogste bit wordt naar C gekopieerd en naar de laagste bit van het register. De conditiecode wordt gezet.
- RLCA
- Als RLC, maar werkt alleen met register A en van de conditiecode wordt alleen bit C beïnvloed.
- RLD
- De laagste 4 bits van A worden gekopieerd naar de laagste 4 bits van (HL), de oorspronkelijke laagste 4 bits van HL worden gekopieerd naar de hoogste 4 bits en de oorspronkelijke hoogste 4 bits van (HL) worden gekopieerd naar de laagste 4 bits van A. De conditiecode wordt gezet.
- RR
- Als RL, maar er wordt naar rechts geschoven.
- RRA
- Als RR, maar werkt alleen met register A en van de conditiecode wordt alleen bit C beïnvloed.
- RRC
- Als RLC, maar er wordt naar rechts geschoven.
- RRCA
- Als RRC, maar werkt alleen met register A en van de conditiecode wordt alleen bit C beïnvloed.
- RRD
- Als RLD, maar in omgekeerde richting.
- RST
- Hetzelfde als CALL, maar er kan slechts naar 8 verschillende adressen worden gesprongen. Deze instructie is bedoeld voor gebruik bij interrupts omdat er maar een instructiebyte nodig is.
- SBC
- De rechter operand en bit C van register F worden afgetrokken van de linker operand. Het resultaat komt in de linker operand. De conditiecode wordt gezet.
- SCF
- Bit C van de conditiecode wordt gezet.
- SET
- Een bit van de rechter operand wordt 1 gemaakt. Geen invloed op conditiecode.
- SLA
- De bits van de operand worden een plaats naar links geschoven. De hoogste bit wordt naar C gekopieerd. De laagste bit van het register wordt 0. De conditiecode wordt gezet.
- SL1
- (ongedocumenteerd) De bits van de operand worden een plaats naar links geschoven. De hoogste bit wordt naar C gekopieerd. De laagste bit van het register wordt 1. De conditiecode wordt gezet.
- SRA
- De bits van de operand worden een plaats naar rechts geschoven. De laagste bit wordt naar C gekopieerd. De hoogste bit van het register blijft onveranderd. De conditiecode wordt gezet.
- SRL
- De bits van de operand worden een plaats naar rechts geschoven. De laagste bit wordt naar C gekopieerd. De hoogste bit van het register wordt 0. De conditiecode wordt gezet.
- SUB
- De operand wordt afgetrokken van A. Het resultaat komt in A. De conditiecode wordt gezet.
- XOR
- Logische exclusieve Of van A en de operand. Het resultaat komt in A. De conditiecode wordt gezet.