pokepinball/engine/select_gameboy_target_menu.asm
Raymond Dodge d1f4c7fab7 Use labels instead of constants for HRAM
Use explicit ldh instruction to access HRAM locations, don't rely on optimizing ld
2024-03-17 09:27:05 -05:00

226 lines
4.0 KiB
NASM

HandleSelectGameboyTargetMenu: ; 0x8000
; This is an unreachable debug menu, which allowed developers to choose to run the game
; in either DMG or Game Boy Color mode.
; If you want to access this menu, you must set the initial screen to
; SCREEN_SELECT_GAMEBOY_TARGET, instead of SCREEN_ERASE_ALL_DATA.
; Additionally, you must hold UP when booting the game.
ld a, [wScreenState]
rst JumpTable ; calls JumpToFuncInTable
SelectGameboyTargetMenuFunctions: ; 0x8004
dw InitSelectGameboyTargetMenu
dw SelectCGBOrDMG
dw EndSelectGameboyTargetMenu
InitSelectGameboyTargetMenu: ; 0x800a
xor a
ldh [hFFC4], a
ldh a, [hJoypadState]
cp D_UP
jr nz, .skipDebugMenu
ldh a, [hGameBoyColorFlag]
and a
jr nz, .showMenu
.skipDebugMenu
ld hl, wCurrentScreen
inc [hl] ; set to SCREEN_ERASE_ALL_DATA
xor a
ld [wScreenState], a
ret
.showMenu
ld a, $45
ldh [hLCDC], a
ld a, $e4
ld [wBGP], a
ld [wOBP0], a
ld [wOBP1], a
xor a
ldh [hSCX], a
ldh [hSCY], a
call LoadGameboyTargetMenuGfx
call ClearSpriteBuffer
call SetAllPalettesWhite
call EnableLCD
call FadeIn
ld hl, wScreenState
inc [hl]
ret
LoadGameboyTargetMenuGfx: ; 0x8049
ld a, $1
ld [rVBK], a
ld c, $ff
call FillTilesVRAM
call FillBackgroundsVRAM
xor a
ld [rVBK], a
ld c, $0
call FillTilesVRAM
call FillBackgroundsVRAM
; This code makes no sense.
; It first fills 33 bytes at $ff68, then refills at rOBPI
ld a, $80
ld de, rBGPI
ld hl, Data_80e4
call FillPalette
ld a, $80
ld de, rOBPI
ld hl, Data_80f4
call FillPalette
ld hl, SelectGameboyTargetGfxPointers
xor a
call LoadVideoData
ld a, Bank(SelectGameboyTarget_TileData)
ld bc, SelectGameboyTarget_TileData
ld de, LoadTileLists
call QueueGraphicsToLoadWithFunc
ret
SelectGameboyTargetGfxPointers: ; 0x8089
dw SelectGameboyTarget_VideoData
SelectGameboyTarget_VideoData: ; 0x808b
VIDEO_DATA_TILES SelectGameboyTargetTextGfx, vTilesSH + $200, $400
db $FF, $FF ; terminators
SelectGameboyTarget_TileData: ; 0x8094
db $13
dbw $06, vBGMap + $a3
db $BC, $AF, $B6, $AF, $AD, $BD
dbw $06, $98AA
db $BD, $AB, $BB, $B1, $AF, $BD
dbw $04, $98E3
db $D0, $AD, $B1, $AC
dbw $03, $9924
db $AE, $B7, $B1
db $00 ; terminator
FillBackgroundsVRAM: ; 0x80b5
ld hl, vBGMap
.fillLoop
xor a
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld a, h
cp $a0 ; end of VRAM
jr nz, .fillLoop
ret
FillTilesVRAM: ; 0x80c3
ld hl, vTilesOB
.fillLoop
ld a, c
ld [hli], a
ld [hli], a
ld [hli], a
ld [hli], a
ld a, h
cp (vBGMap >> 8)
jr nz, .fillLoop
ret
FillPalette: ; 0x80d1
; First places a in [de].
; Then, reads 32 bytes from hl and places them in order at de + 1
ld [de], a
inc de
ld b, $4
.outerLoop
ld c, $8
push hl
.innerLoop
ld a, [hli]
ld [de], a
ld a, [hli]
ld [de], a
dec c
jr nz, .innerLoop
pop hl
dec b
jr nz, .outerLoop
ret
Data_80e4: ; 0x80e4
RGB 31, 31, 31
RGB 21, 21, 21
RGB 11, 11, 11
RGB 00, 00, 00
RGB 31, 31, 31
RGB 21, 21, 21
RGB 11, 11, 11
RGB 00, 00, 00
Data_80f4: ; 0x80f4
RGB 21, 21, 21
RGB 31, 31, 31
RGB 11, 11, 11
RGB 00, 00, 00
RGB 31, 31, 31
RGB 21, 21, 21
RGB 11, 11, 11
RGB 00, 00, 00
SelectCGBOrDMG: ; 0x8104
ldh a, [hNewlyPressedButtons]
ld b, a
and (D_DOWN | D_UP)
jr z, .directionNotPressed
ldh a, [hGameBoyColorFlag]
ldh [hFFC4], a
xor $1
ldh [hGameBoyColorFlag], a
jr .moveCursor
.directionNotPressed
bit BIT_A_BUTTON, b
ret z
ld hl, wScreenState
inc [hl]
ret
.moveCursor
ldh a, [hGameBoyColorFlag]
and a
jr nz, .cgb
ld a, Bank(DMGSelected_TileData)
ld bc, DMGSelected_TileData
ld de, LoadTileLists
call QueueGraphicsToLoadWithFunc
ret
.cgb
ld a, Bank(CGBSelected_TileData)
ld bc, CGBSelected_TileData
ld de, LoadTileLists
call QueueGraphicsToLoadWithFunc
ret
DMGSelected_TileData: ; 0x813a
db $02
dbw $01, $98E3
db $D1
dbw $01, $9923
db $D0
db $00 ; terminator
CGBSelected_TileData: ; 0x8144
db $02
dbw $01, $98E3
db $D0
dbw $01, $9923
db $D1
db $00 ; terminator
EndSelectGameboyTargetMenu: ; 0x414e
call FadeOut
call DisableLCD
ld hl, wCurrentScreen
inc [hl] ; set to SCREEN_ERASE_ALL_DATA
xor a
ld [wScreenState], a
ret