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 + (\3 << 5) + \2), \1 ENDM MACRO PrintByteHex 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_hex_string ld a, b ldi [hl], a ld a, c ld [hl], a PrintString print_byte_hex_string, \2, \3 ENDM MACRO PrintByte ld hl, \1 xor a ld b, a ld c, a ld a, [hl] .hundreds\@ cp a, 100 jr c, .hundreds_done\@ sub a, 100 inc b jr .hundreds\@ .hundreds_done\@ .tens\@ cp a, 10 jr c, .tens_done\@ sub a, 10 inc c jr .tens\@ .tens_done\@ ld d, a ld hl, print_byte_string ld a, b add a, "0" ldi [hl], a ld a, c add a, "0" ldi [hl], a ld a, d add a, "0" ldi [hl], a PrintString print_byte_string, \2, \3 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 MACRO IncrementFrameCount ld a, [current_frame] inc a ld [current_frame], a ENDM MACRO IncrementWord ld a, [\1] ld b, a ld a, [\1 + 1] ld c, a inc bc ld a, b ld [\1], a ld a, c ld [\1 + 1], a ENDM SECTION "Macro HRAM", HRAM current_frame: DS 2 current_frame_end: input_index: DS 2 print_byte_hex_string: print_byte_string: DS 2 print_byte_hex_string_end: DS 1 print_byte_string_end: