Skip to content
Techniques & Technology

Z80 Instruction Set Reference

Complete CPU instruction reference

Complete reference for Z80 assembly instructions with T-states, bytes, and flag effects.

Spectrum z80instructionsassemblyreferenceopcodes

Complete reference for Z80 microprocessor instructions as used in the ZX Spectrum. Includes T-states (clock cycles), byte counts, and flag effects for every instruction.


Reading This Reference

Notation

  • n = 8-bit immediate value (0-255)
  • nn = 16-bit immediate value (0-65535)
  • d = 8-bit signed displacement (-128 to +127)
  • r = 8-bit register (A, B, C, D, E, H, L)
  • rr = 16-bit register pair (BC, DE, HL, SP)
  • (addr) = memory at address
  • $ = current address (in expressions)

Flag Notation

  • S = Sign flag (bit 7 of result)
  • Z = Zero flag (result is zero)
  • H = Half-carry flag (carry from bit 3 to 4)
  • P/V = Parity/Overflow flag
  • N = Add/Subtract flag (for BCD)
  • C = Carry flag
  • = Flag affected
  • = Flag reset
  • = Flag unchanged
  • ? = Flag undefined

8-Bit Load Instructions

LD r,n - Load Immediate

Load 8-bit value into register.

InstructionBytesT-statesSZHP/VNC
LD A,n27
LD B,n27
LD C,n27
LD D,n27
LD E,n27
LD H,n27
LD L,n27

Example:

LD A,42          ; A = 42
LD B,0           ; B = 0
LD H,$40         ; H = $40 (64 decimal)

Note: LD instructions do not affect flags.

LD r,r’ - Load Register to Register

InstructionBytesT-statesFlags
LD A,B14None affected
LD B,C14None affected
LD H,L14None affected

All 49 combinations: A,B,C,D,E,H,L can be copied to/from each other.

LD r,(HL) - Load from Memory

Load register from memory address in HL.

InstructionBytesT-statesFlags
LD A,(HL)17None affected
LD B,(HL)17None affected
LD C,(HL)17None affected

LD (HL),r - Store to Memory

Store register to memory address in HL.

InstructionBytesT-statesFlags
LD (HL),A17None affected
LD (HL),B17None affected
LD (HL),n210None affected

16-Bit Load Instructions

LD rr,nn - Load 16-bit Immediate

InstructionBytesT-statesFlags
LD BC,nn310None affected
LD DE,nn310None affected
LD HL,nn310None affected
LD SP,nn310None affected
LD IX,nn414None affected
LD IY,nn414None affected

Arithmetic Instructions

ADD A,r / ADD A,n - Add

InstructionBytesT-statesSZHP/VNC
ADD A,B14
ADD A,n27
ADD A,(HL)17

SUB r / SUB n - Subtract

InstructionBytesT-statesSZHP/VNC
SUB B14
SUB n27

INC r / DEC r - Increment/Decrement

InstructionBytesT-statesSZHP/VNC
INC A14
DEC A14

Note: Carry flag is NOT affected by INC/DEC!


16-Bit Arithmetic

ADD HL,rr - 16-bit Add

InstructionBytesT-statesSZHP/VNC
ADD HL,BC111
ADD HL,DE111
ADD HL,HL111
ADD HL,SP111

Important: Only HL can be the destination for 16-bit ADD!

INC rr / DEC rr - 16-bit Increment/Decrement

InstructionBytesT-statesFlags
INC BC16None affected
DEC HL16None affected

Important: 16-bit INC/DEC do NOT affect any flags!


Logical Instructions

AND r / AND n - Logical AND

InstructionBytesT-statesSZHP/VNC
AND B14
AND n27

OR r / OR n - Logical OR

InstructionBytesT-statesFlags
OR B14S,Z,P/V affected, H,N,C reset
OR n27S,Z,P/V affected, H,N,C reset

OR A idiom: Sets zero flag without changing A.

XOR r / XOR n - Logical XOR

InstructionBytesT-statesFlags
XOR B14S,Z,P/V affected, H,N,C reset
XOR n27S,Z,P/V affected, H,N,C reset

XOR A idiom: Fastest way to set A to zero (4 T-states vs LD A,0 = 7 T-states).

CP r / CP n - Compare

Like SUB but doesn’t store result (only sets flags).

InstructionBytesT-statesFlags
CP B14S,Z,H,P/V,N,C affected
CP n27S,Z,H,P/V,N,C affected

Jump Instructions

JP nn - Unconditional Jump

InstructionBytesT-statesFlags
JP nn310None affected
JP (HL)14None affected

JP cc,nn - Conditional Jump

ConditionMeaningInstructionBytesT-states
ZZeroJP Z,nn310
NZNot zeroJP NZ,nn310
CCarryJP C,nn310
NCNo carryJP NC,nn310

JR d - Relative Jump

InstructionBytesT-statesFlags
JR d212None affected
JR Z,d212/7None affected
JR NZ,d212/7None affected

Range: -126 to +129 bytes from current position.

DJNZ d - Decrement and Jump if Not Zero

Special loop instruction. Decrements B and jumps if B ≠ 0.

InstructionBytesT-statesFlags
DJNZ d213/8None affected

Perfect for counted loops!


Call and Return Instructions

CALL nn - Unconditional Call

InstructionBytesT-statesFlags
CALL nn317None affected

RET - Return from Subroutine

InstructionBytesT-statesFlags
RET110None affected
RET Z111/5None affected
RET NZ111/5None affected

Stack Instructions

PUSH rr - Push to Stack

InstructionBytesT-statesFlags
PUSH BC111None affected
PUSH DE111None affected
PUSH HL111None affected
PUSH AF111None affected

POP rr - Pop from Stack

InstructionBytesT-statesFlags
POP BC110None affected (except POP AF)
POP AF110All flags loaded from stack

I/O Instructions

IN A,(n) - Input from Port

InstructionBytesT-statesFlags
IN A,(n)211None affected

OUT (n),A - Output to Port

InstructionBytesT-statesFlags
OUT (n),A211None affected

IN r,(C) - Input using BC

InstructionBytesT-statesFlags
IN A,(C)212S,Z,P/V affected, H,N reset

Block Instructions

LDIR - Load, Increment, Repeat

InstructionBytesT-statesFlags
LDIR221/16H,P/V,N reset

Operation: Copy byte from (HL) to (DE), increment HL and DE, decrement BC. Repeat until BC = 0.

Example:

; Copy 6144 bytes from $8000 to $4000
        LD HL,$8000   ; Source
        LD DE,$4000   ; Destination
        LD BC,6144    ; Count
        LDIR          ; Copy all bytes

Miscellaneous Instructions

NOP - No Operation

InstructionBytesT-statesFlags
NOP14None affected

HALT - Halt CPU

InstructionBytesT-statesFlags
HALT14None affected

DI / EI - Disable/Enable Interrupts

InstructionBytesT-statesFlags
DI14None affected
EI14None affected

Common Instruction Patterns

Clear A Register (fastest)

XOR A             ; 4 T-states (vs LD A,0 = 7)

Test if A is Zero

OR A              ; Sets Z flag without changing A
JR Z,IsZero

Double A Register

ADD A,A           ; Faster than multiplying

Delay Loop

        LD B,100
Delay:  DJNZ Delay    ; 13 × 99 + 8 = 1295 T-states

Performance Notes

Fastest instructions:

  • Register operations: 4 T-states
  • XOR A (clear A): 4 T-states
  • INC/DEC register: 4 T-states

Optimization tips:

  1. Use register operations over memory
  2. Use HL instead of IX/IY (3× faster)
  3. Use JR instead of JP when possible (saves 1 byte)
  4. Use DJNZ for loops (very efficient)
  5. Unroll loops in speed-critical code

See also