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.

Registers

Register F
Het register F (flags of conditiecode) bestaat uit acht bits waarvan er zes gedocumenteerd zijn:

Legenda
neen byte die in de instructie is opgenomen
nntwee bytes die in de instructie zijn opgenomen
eeen byte die in een sprong over een beperkte afstand mogelijk maakt
iIX of IY

Instructies zonder prefix en met prefix DD en FD
In 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.

Z80-instructies beginnend met CB
Na 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.

Z80-instructies beginnend met ED
Na 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.

Beschrijving van de instructies
Hieronder staan alleen de Z80-instructies.
ADCDe operanden en bit C van register F worden opgeteld en het resultaat komt in de linker operand. De conditiecode wordt gezet.
ADDDe operanden worden opgeteld en het resultaat komt in de linker operand. De conditiecode wordt gezet.
ANDLogische En van A en de operand. Het resultaat komt in A. De conditiecode wordt gezet.
BITEen bit van de rechter operand wordt getest. Bit Z van de conditiecode wordt het omgekeerde van de geteste bit.
CALLVoorwaardelijke 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.
ORLogische 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.
RESEen 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.
XORLogische exclusieve Of van A en de operand. Het resultaat komt in A. De conditiecode wordt gezet.

8080