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