z80 ASM
Z80 Processor Instruction Set
Quick Navigation
Z80 Registers & Flags
Main Register Set
A (Accumulator)
8-bit primary register
F (Flags)
Status flags register
B, C
8-bit general purpose
BC = 16-bit pair
D, E
8-bit general purpose
DE = 16-bit pair
H, L
8-bit general purpose
HL = 16-bit pair (memory pointer)
Alternate Register Set
A', F'
Alternate accumulator & flags
B', C'
Alternate BC pair
D', E'
Alternate DE pair
H', L'
Alternate HL pair
Special Registers
IX
16-bit index register X
IY
16-bit index register Y
SP
16-bit stack pointer
PC
16-bit program counter
I
Interrupt vector register
R
Memory refresh register
Flag Register (F)
| Bit | Flag | Name | Description |
|---|---|---|---|
| 7 | S | Sign | Set if result is negative (bit 7 = 1) |
| 6 | Z | Zero | Set if result is zero |
| 5 | Y | Copy of bit 5 | Undocumented, copy of bit 5 of result |
| 4 | H | Half Carry | Carry from bit 3 to bit 4 |
| 3 | X | Copy of bit 3 | Undocumented, copy of bit 3 of result |
| 2 | P/V | Parity/Overflow | Parity or Overflow depending on operation |
| 1 | N | Add/Subtract | Set for subtract operations |
| 0 | C | Carry | Carry from bit 7 |
Addressing Modes
| Mode | Format | Example | Description |
|---|---|---|---|
| Immediate | n | LD A,55H | 8-bit immediate data |
| Immediate Extended | nn | LD HL,1234H | 16-bit immediate data |
| Register | r | LD A,B | Register addressing |
| Register Indirect | (rr) | LD A,(HL) | Memory pointed by register pair |
| Indexed | (IX+d), (IY+d) | LD A,(IX+5) | Index register + signed displacement |
| Extended | (nn) | LD A,(5000H) | Direct memory address |
| Relative | e | JR 10H | PC + signed displacement |
| Bit Addressing | b | SET 3,A | Bit position 0-7 |
| I/O Port | (n), (C) | IN A,(20H) | 8-bit port address or BC register |
Register Notation
r, r': Any 8-bit register (A, B, C, D, E, H, L)
dd: Register pair BC, DE, HL, SP
qq: Register pair BC, DE, HL, AF
pp: Register pair BC, DE, IX, SP (with DD prefix)
rr: Register pair BC, DE, IY, SP (with FD prefix)
dd: Register pair BC, DE, HL, SP
qq: Register pair BC, DE, HL, AF
pp: Register pair BC, DE, IX, SP (with DD prefix)
rr: Register pair BC, DE, IY, SP (with FD prefix)
8-Bit Load Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| LD r,r' | r ← r' | - | 40-7F (except 76) | 4 |
| LD r,n | r ← n | - | 06,0E,16,1E,26,2E,3E | 7 |
| LD r,(HL) | r ← (HL) | - | 46,4E,56,5E,66,6E,7E | 7 |
| LD r,(IX+d) | r ← (IX+d) | - | DD 46,4E,56,5E,66,6E,7E | 19 |
| LD r,(IY+d) | r ← (IY+d) | - | FD 46,4E,56,5E,66,6E,7E | 19 |
| LD (HL),r | (HL) ← r | - | 70-77 (except 76) | 7 |
| LD (IX+d),r | (IX+d) ← r | - | DD 70-77 | 19 |
| LD (IY+d),r | (IY+d) ← r | - | FD 70-77 | 19 |
| LD (HL),n | (HL) ← n | - | 36 | 10 |
| LD (IX+d),n | (IX+d) ← n | - | DD 36 | 19 |
| LD (IY+d),n | (IY+d) ← n | - | FD 36 | 19 |
| LD A,(BC) | A ← (BC) | - | 0A | 7 |
| LD A,(DE) | A ← (DE) | - | 1A | 7 |
| LD A,(nn) | A ← (nn) | - | 3A | 13 |
| LD (BC),A | (BC) ← A | - | 02 | 7 |
| LD (DE),A | (DE) ← A | - | 12 | 7 |
| LD (nn),A | (nn) ← A | - | 32 | 13 |
| LD A,I | A ← I | S Z H=0 P/V N=0 | ED 57 | 9 |
| LD A,R | A ← R | S Z H=0 P/V N=0 | ED 5F | 9 |
| LD I,A | I ← A | - | ED 47 | 9 |
| LD R,A | R ← A | - | ED 4F | 9 |
16-Bit Load Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| LD dd,nn | dd ← nn | - | 01,11,21,31 | 10 |
| LD IX,nn | IX ← nn | - | DD 21 | 14 |
| LD IY,nn | IY ← nn | - | FD 21 | 14 |
| LD HL,(nn) | H ← (nn+1), L ← (nn) | - | 2A | 16 |
| LD dd,(nn) | dd ← (nn) | - | ED 4B,5B,6B,7B | 20 |
| LD IX,(nn) | IX ← (nn) | - | DD 2A | 20 |
| LD IY,(nn) | IY ← (nn) | - | FD 2A | 20 |
| LD (nn),HL | (nn+1) ← H, (nn) ← L | - | 22 | 16 |
| LD (nn),dd | (nn) ← dd | - | ED 43,53,63,73 | 20 |
| LD (nn),IX | (nn) ← IX | - | DD 22 | 20 |
| LD (nn),IY | (nn) ← IY | - | FD 22 | 20 |
| LD SP,HL | SP ← HL | - | F9 | 6 |
| LD SP,IX | SP ← IX | - | DD F9 | 10 |
| LD SP,IY | SP ← IY | - | FD F9 | 10 |
| PUSH qq | (SP-1) ← qqH, (SP-2) ← qqL, SP ← SP-2 | - | C5,D5,E5,F5 | 11 |
| PUSH IX | Push IX onto stack | - | DD E5 | 15 |
| PUSH IY | Push IY onto stack | - | FD E5 | 15 |
| POP qq | qqL ← (SP), qqH ← (SP+1), SP ← SP+2 | - | C1,D1,E1,F1 | 10 |
| POP IX | Pop IX from stack | - | DD E1 | 14 |
| POP IY | Pop IY from stack | - | FD E1 | 14 |
Exchange, Block Transfer, and Search
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| EX DE,HL | DE ↔ HL | - | EB | 4 |
| EX AF,AF' | AF ↔ AF' | - | 08 | 4 |
| EXX | BC ↔ BC', DE ↔ DE', HL ↔ HL' | - | D9 | 4 |
| EX (SP),HL | H ↔ (SP+1), L ↔ (SP) | - | E3 | 19 |
| EX (SP),IX | IX ↔ (SP) | - | DD E3 | 23 |
| EX (SP),IY | IY ↔ (SP) | - | FD E3 | 23 |
| LDI | (DE) ← (HL), DE++, HL++, BC-- | H=0 P/V N=0 | ED A0 | 16 |
| LDIR | Repeat LDI until BC=0 | H=0 P/V=0 N=0 | ED B0 | 21/16 |
| LDD | (DE) ← (HL), DE--, HL--, BC-- | H=0 P/V N=0 | ED A8 | 16 |
| LDDR | Repeat LDD until BC=0 | H=0 P/V=0 N=0 | ED B8 | 21/16 |
| CPI | Compare A with (HL), HL++, BC-- | S Z H P/V N=1 | ED A1 | 16 |
| CPIR | Repeat CPI until A=(HL) or BC=0 | S Z H P/V N=1 | ED B1 | 21/16 |
| CPD | Compare A with (HL), HL--, BC-- | S Z H P/V N=1 | ED A9 | 16 |
| CPDR | Repeat CPD until A=(HL) or BC=0 | S Z H P/V N=1 | ED B9 | 21/16 |
Block instructions: P/V is set if BC≠0 after operation
8-Bit Arithmetic Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| ADD A,r | A ← A + r | S Z H P/V N=0 C | 80-87 | 4 |
| ADD A,n | A ← A + n | S Z H P/V N=0 C | C6 | 7 |
| ADD A,(HL) | A ← A + (HL) | S Z H P/V N=0 C | 86 | 7 |
| ADD A,(IX+d) | A ← A + (IX+d) | S Z H P/V N=0 C | DD 86 | 19 |
| ADC A,s | A ← A + s + CY | S Z H P/V N=0 C | 88-8F, CE | 4-19 |
| SUB s | A ← A - s | S Z H P/V N=1 C | 90-97, D6 | 4-19 |
| SBC A,s | A ← A - s - CY | S Z H P/V N=1 C | 98-9F, DE | 4-19 |
| AND s | A ← A ∧ s | S Z H=1 P/V N=0 C=0 | A0-A7, E6 | 4-19 |
| OR s | A ← A ∨ s | S Z H=0 P/V N=0 C=0 | B0-B7, F6 | 4-19 |
| XOR s | A ← A ⊕ s | S Z H=0 P/V N=0 C=0 | A8-AF, EE | 4-19 |
| CP s | A - s (compare) | S Z H P/V N=1 C | B8-BF, FE | 4-19 |
| INC r | r ← r + 1 | S Z H P/V N=0 | 04,0C,14,1C,24,2C,3C | 4 |
| INC (HL) | (HL) ← (HL) + 1 | S Z H P/V N=0 | 34 | 11 |
| INC (IX+d) | (IX+d) ← (IX+d) + 1 | S Z H P/V N=0 | DD 34 | 23 |
| DEC r | r ← r - 1 | S Z H P/V N=1 | 05,0D,15,1D,25,2D,3D | 4 |
| DEC (HL) | (HL) ← (HL) - 1 | S Z H P/V N=1 | 35 | 11 |
| DEC (IX+d) | (IX+d) ← (IX+d) - 1 | S Z H P/V N=1 | DD 35 | 23 |
16-Bit Arithmetic Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| ADD HL,ss | HL ← HL + ss | H N=0 C | 09,19,29,39 | 11 |
| ADC HL,ss | HL ← HL + ss + CY | S Z H P/V N=0 C | ED 4A,5A,6A,7A | 15 |
| SBC HL,ss | HL ← HL - ss - CY | S Z H P/V N=1 C | ED 42,52,62,72 | 15 |
| ADD IX,pp | IX ← IX + pp | H N=0 C | DD 09,19,29,39 | 15 |
| ADD IY,rr | IY ← IY + rr | H N=0 C | FD 09,19,29,39 | 15 |
| INC ss | ss ← ss + 1 | - | 03,13,23,33 | 6 |
| INC IX | IX ← IX + 1 | - | DD 23 | 10 |
| INC IY | IY ← IY + 1 | - | FD 23 | 10 |
| DEC ss | ss ← ss - 1 | - | 0B,1B,2B,3B | 6 |
| DEC IX | IX ← IX - 1 | - | DD 2B | 10 |
| DEC IY | IY ← IY - 1 | - | FD 2B | 10 |
General-Purpose Arithmetic and CPU Control
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| DAA | Decimal Adjust Accumulator | S Z H P/V C | 27 | 4 |
| CPL | A ← Ā (complement) | H=1 N=1 | 2F | 4 |
| NEG | A ← 0 - A | S Z H P/V N=1 C | ED 44 | 8 |
| CCF | CY ← C̄Y | H N=0 C | 3F | 4 |
| SCF | CY ← 1 | H=0 N=0 C=1 | 37 | 4 |
| NOP | No operation | - | 00 | 4 |
| HALT | Halt CPU | - | 76 | 4 |
| DI | IFF1,IFF2 ← 0 | - | F3 | 4 |
| EI | IFF1,IFF2 ← 1 | - | FB | 4 |
| IM 0 | Set interrupt mode 0 | - | ED 46 | 8 |
| IM 1 | Set interrupt mode 1 | - | ED 56 | 8 |
| IM 2 | Set interrupt mode 2 | - | ED 5E | 8 |
Rotate and Shift Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| RLCA | Rotate A left circular | H=0 N=0 C | 07 | 4 |
| RLA | Rotate A left through carry | H=0 N=0 C | 17 | 4 |
| RRCA | Rotate A right circular | H=0 N=0 C | 0F | 4 |
| RRA | Rotate A right through carry | H=0 N=0 C | 1F | 4 |
| RLC r | Rotate r left circular | S Z H=0 P/V N=0 C | CB 00-07 | 8 |
| RLC (HL) | Rotate (HL) left circular | S Z H=0 P/V N=0 C | CB 06 | 15 |
| RLC (IX+d) | Rotate (IX+d) left circular | S Z H=0 P/V N=0 C | DD CB d 06 | 23 |
| RL m | Rotate m left through carry | S Z H=0 P/V N=0 C | CB 10-17 | 8-23 |
| RRC m | Rotate m right circular | S Z H=0 P/V N=0 C | CB 08-0F | 8-23 |
| RR m | Rotate m right through carry | S Z H=0 P/V N=0 C | CB 18-1F | 8-23 |
| SLA m | Shift m left arithmetic | S Z H=0 P/V N=0 C | CB 20-27 | 8-23 |
| SRA m | Shift m right arithmetic | S Z H=0 P/V N=0 C | CB 28-2F | 8-23 |
| SRL m | Shift m right logical | S Z H=0 P/V N=0 C | CB 38-3F | 8-23 |
| RLD | Rotate left digit (A,HL) | S Z H=0 P/V N=0 | ED 6F | 18 |
| RRD | Rotate right digit (A,HL) | S Z H=0 P/V N=0 | ED 67 | 18 |
Bit Set, Reset, and Test Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| BIT b,r | Test bit b of r | Z H=1 N=0 | CB 40-7F | 8 |
| BIT b,(HL) | Test bit b of (HL) | Z H=1 N=0 | CB 46-7E | 12 |
| BIT b,(IX+d) | Test bit b of (IX+d) | Z H=1 N=0 | DD CB d 46-7E | 20 |
| SET b,r | Set bit b of r | - | CB C0-FF | 8 |
| SET b,(HL) | Set bit b of (HL) | - | CB C6-FE | 15 |
| SET b,(IX+d) | Set bit b of (IX+d) | - | DD CB d C6-FE | 23 |
| RES b,r | Reset bit b of r | - | CB 80-BF | 8 |
| RES b,(HL) | Reset bit b of (HL) | - | CB 86-BE | 15 |
| RES b,(IX+d) | Reset bit b of (IX+d) | - | DD CB d 86-BE | 23 |
Jump Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| JP nn | PC ← nn | - | C3 | 10 |
| JP cc,nn | If cc true, PC ← nn | - | C2,CA,D2,DA,E2,EA,F2,FA | 10 |
| JR e | PC ← PC + e | - | 18 | 12 |
| JR C,e | If C=1, PC ← PC + e | - | 38 | 12/7 |
| JR NC,e | If C=0, PC ← PC + e | - | 30 | 12/7 |
| JR Z,e | If Z=1, PC ← PC + e | - | 28 | 12/7 |
| JR NZ,e | If Z=0, PC ← PC + e | - | 20 | 12/7 |
| JP (HL) | PC ← HL | - | E9 | 4 |
| JP (IX) | PC ← IX | - | DD E9 | 8 |
| JP (IY) | PC ← IY | - | FD E9 | 8 |
| DJNZ e | B--, if B≠0 then PC ← PC + e | - | 10 | 13/8 |
Condition Codes
NZ
Z = 0
Z = 0
Z
Z = 1
Z = 1
NC
C = 0
C = 0
C
C = 1
C = 1
PO
P/V = 0
P/V = 0
PE
P/V = 1
P/V = 1
P
S = 0
S = 0
M
S = 1
S = 1
Call and Return Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| CALL nn | (SP-1) ← PCH, (SP-2) ← PCL, PC ← nn | - | CD | 17 |
| CALL cc,nn | If cc true, CALL nn | - | C4,CC,D4,DC,E4,EC,F4,FC | 17/10 |
| RET | PCL ← (SP), PCH ← (SP+1) | - | C9 | 10 |
| RET cc | If cc true, RET | - | C0,C8,D0,D8,E0,E8,F0,F8 | 11/5 |
| RETI | Return from interrupt | - | ED 4D | 14 |
| RETN | Return from NMI | - | ED 45 | 14 |
| RST p | CALL to address p | - | C7,CF,D7,DF,E7,EF,F7,FF | 11 |
RST addresses: 00H, 08H, 10H, 18H, 20H, 28H, 30H, 38H
Input and Output Group
| Mnemonic | Operation | Flags | Opcodes | Cycles |
|---|---|---|---|---|
| IN A,(n) | A ← (n) | - | DB | 11 |
| IN r,(C) | r ← (C) | S Z H=0 P/V N=0 | ED 40,48,50,58,60,68,78 | 12 |
| INI | (HL) ← (C), B--, HL++ | Z N=1 | ED A2 | 16 |
| INIR | Repeat INI until B=0 | Z=1 N=1 | ED B2 | 21/16 |
| IND | (HL) ← (C), B--, HL-- | Z N=1 | ED AA | 16 |
| INDR | Repeat IND until B=0 | Z=1 N=1 | ED BA | 21/16 |
| OUT (n),A | (n) ← A | - | D3 | 11 |
| OUT (C),r | (C) ← r | - | ED 41,49,51,59,61,69,79 | 12 |
| OUTI | (C) ← (HL), B--, HL++ | Z N=1 | ED A3 | 16 |
| OTIR | Repeat OUTI until B=0 | Z=1 N=1 | ED B3 | 21/16 |
| OUTD | (C) ← (HL), B--, HL-- | Z N=1 | ED AB | 16 |
| OTDR | Repeat OUTD until B=0 | Z=1 N=1 | ED BB | 21/16 |
Instruction Prefixes
| Prefix | Hex | Purpose | Example |
|---|---|---|---|
| CB | CB | Bit operations prefix | CB 46 = BIT 0,(HL) |
| DD | DD | IX register operations | DD 21 = LD IX,nn |
| ED | ED | Extended instructions | ED 44 = NEG |
| FD | FD | IY register operations | FD 21 = LD IY,nn |
| DD CB | DD CB | IX bit operations | DD CB 05 46 = BIT 0,(IX+5) |
| FD CB | FD CB | IY bit operations | FD CB 05 46 = BIT 0,(IY+5) |
Instruction Timing
Z80 instruction timing is measured in T-states (clock cycles). The timings shown are for standard Z80 at 4MHz.
Actual execution time = T-states × (1/clock_frequency)
Timing Notes
- Conditional instructions show two timings: taken/not taken
- Block instructions (LDIR, CPIR, etc.) show timings for BC≠0/BC=0
- Memory access adds wait states on some systems
- Interrupt acknowledgment adds 2 T-states minimum
- M1 cycle (opcode fetch) typically takes 4 T-states
Undocumented Instructions
⚠️ These instructions work on NMOS Z80 but may not work on all variants (CMOS, clones)
| Mnemonic | Operation | Description |
|---|---|---|
| SLL m | Shift left logical, set bit 0 | Like SLA but sets bit 0 |
| IXH, IXL | Access IX high/low bytes | Use IX as two 8-bit registers |
| IYH, IYL | Access IY high/low bytes | Use IY as two 8-bit registers |
| IN (C) | Input to flags only | Sets flags but discards data |
| OUT (C),0 | Output zero | Outputs 0 to port C |
Undocumented Flags
- Bit 3 (X flag) and Bit 5 (Y flag) usually copy bits 3 and 5 of the result
- Used by some programs for copy protection or optimization
- DAA instruction behavior depends on these undocumented flags
Programming Tips
Register Pairs: Use HL for memory pointers, BC for counters, DE for data transfer
Shadow Registers: Use EX AF,AF' and EXX for fast context switching in interrupt handlers
Block Instructions: LDIR/LDDR are powerful but slow - unroll for speed-critical code
Index Registers: IX/IY instructions are 4 bytes and slow - use HL when possible
Conditional Jumps: JR is 1 byte shorter than JP for short jumps (±126 bytes)
Stack Operations: PUSH/POP preserve register pairs efficiently
I/O Operations: Use OTIR/INIR for fast block I/O transfers
Interrupt Modes: IM 2 provides vectored interrupts for complex systems
Z80 vs 8080 Differences
| Feature | Z80 | 8080 |
|---|---|---|
| Registers | AF, BC, DE, HL + alternates, IX, IY, I, R | AF, BC, DE, HL only |
| Instructions | 158 official + extensions | 78 instructions |
| Addressing | Indexed, bit addressing, block operations | Basic modes only |
| Interrupts | NMI, 3 interrupt modes | Single interrupt |
| Power | Single +5V supply | Multiple voltages |
| Clock | Single-phase clock | Two-phase clock |
Reference Note: This cheat sheet covers the standard NMOS Z80. The CMOS versions (Z80C, Z84C00) have lower power consumption and some timing differences. Modern variants like the eZ80 extend to 24-bit addressing.