aoc_omni/gb/lib/macros.inc

109 lines
1.6 KiB
PHP

MACRO MemCopy
ld hl, \1
ld de, \2
ld bc, \2_end - \2
.loop\@
ld a, [de]
ld [hli], a
inc de
dec bc
ld a, b
or a, c
jp nz, .loop\@
ENDM
MACRO LoadTiles
MemCopy _VRAM9000, tiles
ENDM
MACRO MemClear
ld hl, \1
ld bc, \2
.loop\@
xor a
ldi [hl], a
dec bc
ld a, b
or a, c
jp nz, .loop\@
ENDM
MACRO ClearOAM
MemClear _OAMRAM, $A0
ENDM
MACRO ClearScreen
MemClear _SCRN0, _SCRN1 - _SCRN0
MemClear _SCRN1, _SCRN1 - _SCRN0
ENDM
MACRO PrintString
MemCopy (_SCRN0 + (\2 << 5) + \3), \1
ENDM
MACRO PrintByte
ld hl, \1
ld a, [hl]
and a, $F0
swap a
add a, "0"
cp a, ":"
jr c, .high_carry\@
add a, "A" - "0" - 10
.high_carry\@
ld b, a
ld a, [hl]
and a, $0F
add a, "0"
cp a, ":"
jr c, .low_carry\@
add a, "A" - "0" - 10
.low_carry\@
ld c, a
ld hl, print_byte_string
ld a, b
ldi [hl], a
ld a, c
ld [hl], a
PrintString print_byte_string, 0, 0
ENDM
MACRO StartInit
; Shut down audio circuitry
ld a, 0
ldh [rNR52], a
; Do not turn the LCD off outside of VBlank
WaitVBlank:
ldh a, [rLY]
cp 144
jp c, WaitVBlank
; Turn the LCD off
ld a, 0
ldh [rLCDC], a
;; Window setup
ld a, 30
ldh [rWX], a
ld a, 115
ldh [rWY], a
ENDM
MACRO FinishInit
; Enable the interrupt handler
ld a, $0F
ldh [rIE], a
; During the first (blank) frame, initialize display registers
ld a, %11100100
ldh [rBGP], a
; Turn the LCD on
ld a, LCDCF_ON | LCDCF_BGON | LCDCF_WINON | LCDCF_WIN9C00 | LCDCF_OBJON | LCDCF_OBJ8 | LCDCF_BG8800
ldh [rLCDC], a
ENDM