Gameboy Common Routines

Home CPU Memory Routines


Generic Routines

A < B jp C, yes
 
A ≤ B jp C, yes
jp Z, yes
 
A = B jp Z, yes
 
A ≠ B jp NZ, yes
 
A ≥ B jp NC, yes
 
A > B jr C, 3
jp NZ, yes   

Video Routines

Official Nintendo Routine
prepare_dma
ld C, $80
ld B, 10
ld HL, DMAroutine
.loop ld A, (HLI)
ld (C), A
inc C
dec B
jr NZ, .loop
 
;use the following routine from a vblank interrupt
dmadata_vblank_interrupt
ld A, $0C 3E0C
ld (dma), A E046 C000-C09F > OAM
ld A, 40 3E28 160-cycle wait
.wait dec A 3D
jr NZ, .wait 20FD
ret C9
 
;use the following routine from anywhere else
dmadata
di F3 Interrupt disabled
ld A, $0C 3E0C
ld (dma), A E046 C000-C09F > OAM
ld A, 40 3E28 160-cycle wait
.wait dec A 3D
jr NZ, .wait 20FD
id FB Interrupt enabled
ret C9
Official Nintendo Routine
main
call cont ;Keypad input
call game ;Game or other processing.
 
.wait halt ;Halt the system clock.
;Return from HALT mode if an interrupt is generated.
;Wait for a vertical blanking interrupt.
nop ;Used to avoid bugs in the rare case
; that the instruction after the HALT instruction
; is not executed
ld A, (vblk_F)
and A ;Generate a V-blank interrupt?
jr Z, .wait ;Jump if a non-V-blank interrupt
 
xor A
ld (vblk_F), A ;Clear the V-Blank Flag
 
jr main
 
;vertical blanking routine
vblk
push AF
push BC
push DE
push HL
 
call FF80
 
ld A, 1
ld (vblk_F), A
 
pop HL
pop DE
pop BC
pop AF
vram_addr = 0x9800 | (vram_addr & 0x0300) ;
ld A, (addr_MBS) ; get MSB of VRAM addr
and $03 ; VRAM is $9800 to $9BFF
or $98 ; add on start of vram
ld (addr_MBS), A ; set MSB of VRAM addr
vram_addr = (vram_addr & 0xFFE0) | ( vram_addr & 0x1F);
ld A, (addr_LBS) ; get LSB of VRAM addr
ld B, A ; copy LSB of VRAM addr
and $E0 ; mask row start addr
ld C, A ; save result
ld A, B ; get LSB of VRAM addr
and $1F ; calculate col offset
or C ; add row start address
ld (addr_LBS), A ; set LSB of VRAM addr
vram_addr = 0x9800 | (col | (row<<5) );
ld A, (row) ; get row
swap ; *16
rlc ; *32
ld C, A ; save result for later
and $03 ; calc MSB VRAM row start
add $98 ; add start of VRAM
ld B, A ; set MSB of VRAL ptr
ld A, $E0 ; LSB VRAM row start mask
and C ; calc LSB VRAM row start
ld C, A ; save LSB VRAM row start
ld A, (col) ; get column
add C, ; add LSB VRAM row start
ld C, A ; BC contains VRAM addr