GameBoy Opcode Summary
The GameBoy has instructions & registers similiar to the 8080, 8085, &
Z80 microprocessors. The internal 8-bit registers are A, B, C, D, E, F, H, &
L. Theses registers may be used in pairs for 16-bit operations as AF, BC, DE, &
HL. The two remaining 16-bit registers are the program counter (PC) and the
stack pointer (SP).
The F register holds the cpu flags. The operation of these flags is
identical to their Z80 relative. The lower four bits of this register always
read zero even if written with a one.
Flag
Register |
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Z | N | H | C | 0 | 0 | 0 | 0 |
The GameBoy CPU is based on a subset of the Z80 microprocessor. A summary of
these commands is given below.
Mnemonic | Symbolic
Operation | Comments | CPU Clocks | Flags - Z,N,H,C |
8-Bit Loads
LD r,s | r
s | s=r,n,(HL) | r=4,
n=8, (HL)=8 |
LD d,r | d
r | d=r,(HL) | r=4, (HL)=8 |
LD d,n | d
n | r=8, (HL)=12 |
LD
A,(ss) | A
(ss) | ss=BC,DE,HL,nn | [BC,DE,HL]=8,
nn=16 |
LD (dd),A | (dd)
A | dd=BC,DE,HL,nn |
LD
A,(C) | A
($FF00+C) | - | 8 |
|
LD (C),A | ($FF00+C)
A | 8 |
LDD A,(HL) | A
(HL), HL
HL - 1 | 8 |
LDD (HL),A | (HL)
A, HL
HL - 1 | 8 |
LDI A,(HL) | A
(HL), HL
HL + 1 | 8 |
LDI (HL),A | (HL)
A, HL
HL + 1 | 8 |
LDH (n),A | ($FF00+n)
A | 12 |
LDH A,(n) | A
($FF00+n) | 12 |
16-Bit Loads
LD dd,nn | dd
nn | dd=BC,DE,HL,SP | 12 | - | - | - | - |
LD (nn),SP | (nn)
SP
| - | 20 |
LD SP,HL
| SP
HL | 8 |
LD HL,(SP+e) | HL
(SP+e) | 12 | 0 | 0 | * | * |
PUSH ss |
(SP-1)
ssh, (SP-2)
ssl, SPSP-2
| ss=BC,DE,HL,AF | 16 | - | - | - | - |
|
POP dd
| ddl
(SP), ddh
(SP+1), SPSP+2
| dd=BC,DE,HL,AF
| 12 |
8-Bit ALU
ADD A,s | A
A + s
| CY is the carry flag. s=r,n,(HL) | r=4, n=8, (HL)=8 | * | 0 | * | * |
ADC A,s | A
A + s + CY
|
SUB s | A
A - s
| * | 1 | * | * |
SBC A,s | A
A - s - CY
|
AND s | A
A
s | * | 0 | 1 | 0 |
OR s | A
A
s
| * | 0 | 0 | 0 |
XOR s | A
A
s
|
CP s | A - s | * | 1 | * | * |
INC s | s
s + 1
| s=r,(HL) | r=4, (HL)=12 | * | 0 | * | - |
DEC s |
s
s - 1
| * | 1 | * | - |
16-Bit Arithmetic
ADD HL,ss | HL
HL + ss
| ss=BC,DE,HL,SP | 8 | - | 0 | * | * |
ADD SP,e | SP
SP + e
| 16 | 0 | 0 | * | * |
INC ss | ss
ss + 1
| 8 | - | - | - | - |
DEC
ss | ss
ss - 1
| 8 |
Miscellaneous
SWAP s | | Swap nibbles. s=r,(HL) | r=8, (HL)=16 | * | 0 | 0 | 0 |
DAA | Converts
A into packed BCD. | - | 4 | * | - | 0 | * |
CPL | A
/A | 4 | - | 1 | 1 | - |
CCF |
CY /CY
| CY is the carry flag. | 4 | - | 0 | 0 | * |
SCF | CY
1 | 4 | - | 0 | 0 | 1 |
NOP | No operation. | - | 4 | - |
- | - | - |
HALT | Halt CPU until an interrupt occurs. | 4 |
STOP
| Halt CPU. | 4 |
DI | Disable Interrupts. | 4 |
EI | Enable Interrupts.
| 4 |
Rotates & Shifts
RLCA | |
| 4 |
0 | 0 |
0 | * |
RLA |
|
RRCA |
|
RRA |
|
RLC s |
|
s=A,r,(HL) |
r=8,(HL)=16 |
* |
0 |
0 |
* |
RL s | |
RRC s | |
RR s | |
SLA s | | s=r,(HL) | r=8,
(HL)=16 |
SRA s | |
SRL s | |
Bit Opcodes
BIT b,s | Z
/sb | Z is zero flag. s=r,(HL) | r=8,
(HL)=12 | * | 0 | 1 | - |
SET b,s | sb
1 | r=8, (HL)=16 | - | - | - | - |
RES b,s | sb
0 |
Jumps
JP nn | PC
nn | - | 16 |
JP cc,nn | If cc is true, PC
nn, else
continue. | If cc is true, 16 else 12. |
JP (HL) | PC
HL | 4 |
JR e | PC
PC + e
| 12 |
JR cc,e |
if cc is true, PC
PC + e,
else continue. | If cc is true, 12 else 8. |
Calls
CALL nn | (SP-1)
PCh,
(SP-2)
PCl, PC
nn, SPSP-2
| - | 24 |
CALL cc,nn | If condition cc is false continue, else same as CALL nn. | If cc is true, 24 else 12. |
Restarts
RST f | (SP-1)
PCh,
(SP-2)
PCl, PCh
0, PCl f,
SPSP-2
| -
| 16 |
Returns
RET | pcl
(SP), pch
(SP+1), SPSP+2
| - | 16 |
RET cc | If cc is true, RET else continue. | If cc is
true, 20 else 8. |
RETI | Return
then enable interrupts. | 16 |
Terminology
- | Flag is not
affected by this operation. |
* | Flag is affected according to result of operation. |
b | A bit number in any 8-bit register or
memory location. |
C | Carry
flag. |
cc
| Flag condition code: C,NC,NZ,Z |
d | Any 8-bit destination register or memory
location. |
dd | Any 16-bit
destination register or memory location. |
e | 8-bit signed 2's complement displacement. |
f | 8 special call locations in page zero.
|
H | Half-carry flag. |
N | Subtraction flag. |
NC | Not carry flag |
NZ | Not zero flag. |
n | Any 8-bit binary number. |
nn | Any 16-bit binary number. |
r | Any 8-bit register. (A,B,C,D,E,H, or L) |
s | Any 8-bit source register or
memory location. |
sb | A bit
in a specific 8-bit register or memory location. |
ss |
Any 16-bit source register or memory location. |
Z | Zero Flag. |