diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-06-19 13:26:28 -0700 |
---|---|---|
committer | Marcus Huderle <huderlem@gmail.com> | 2017-06-19 13:26:28 -0700 |
commit | f4920d6387bc331c88de6a5be3acfbfa25f6afeb (patch) | |
tree | 0e7bcafabe34430221eccf5de43f9fc9e155faff | |
parent | 9fefcec47605aa232f520a38b915f8c24e2d1499 (diff) |
Label debug menu
-rwxr-xr-x | constants/screen_constants.asm | 3 | ||||
-rwxr-xr-x | engine/select_gameboy_target_menu.asm | 238 | ||||
-rw-r--r-- | gfx/select_gb_target_text.png (renamed from gfx/unused_text.png) | bin | 357 -> 357 bytes | |||
-rwxr-xr-x | home.asm | 3 | ||||
-rwxr-xr-x | main.asm | 239 |
5 files changed, 246 insertions, 237 deletions
diff --git a/constants/screen_constants.asm b/constants/screen_constants.asm index 53f05e9..bec5a6e 100755 --- a/constants/screen_constants.asm +++ b/constants/screen_constants.asm @@ -1,5 +1,8 @@ ; See wCurrentScreen in wram.asm +; unreachable debug menu, which allows selecting DMG or Game Boy Color during boot +SCREEN_SELECT_GAMEBOY_TARGET EQU $0 + SCREEN_ERASE_ALL_DATA EQU $1 SCREEN_COPYRIGHT EQU $2 SCREEN_TITLESCREEN EQU $3 diff --git a/engine/select_gameboy_target_menu.asm b/engine/select_gameboy_target_menu.asm new file mode 100755 index 0000000..9ee76bb --- /dev/null +++ b/engine/select_gameboy_target_menu.asm @@ -0,0 +1,238 @@ +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
+ ld [hFFC4], a
+ ld a, [hJoypadState]
+ cp D_UP
+ jr nz, .skipDebugMenu
+ ld 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
+ ld [hLCDC], a
+ ld a, $e4
+ ld [wBGP], a
+ ld [wOBP0], a
+ ld [wOBP1], a
+ xor a
+ ld [hSCX], a
+ ld [hSCY], a
+ call LoadGameboyTargetMenuGfx
+ call ClearOAMBuffer
+ call Func_b66
+ call Func_588
+ call Func_bbe
+ 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 Fill33Bytes
+ ld a, $80
+ ld de, rOBPI
+ ld hl, Data_80f4
+ call Fill33Bytes
+ ld hl, SelectGameboyTargetGfxPointers
+ xor a
+ call LoadVideoData
+ ld a, Bank(SelectGameboyTarget_TileData)
+ ld bc, SelectGameboyTarget_TileData
+ ld de, LoadTileLists
+ call Func_10c5
+ 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
+
+Fill33Bytes: ; 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
+ db $FF
+ db $7F
+ db $B5
+ db $56
+ db $6B
+ db $2D
+ db $00
+ db $00
+ db $FF
+ db $7F
+ db $B5
+ db $56
+ db $6B
+ db $2D
+ db $00
+ db $00
+Data_80f4: ; 0x80f4
+ db $B5
+ db $56
+ db $FF
+ db $7F
+ db $6B
+ db $2D
+ db $00
+ db $00
+ db $FF
+ db $7F
+ db $B5
+ db $56
+ db $6B
+ db $2D
+ db $00
+ db $00
+
+SelectCGBOrDMG: ; 0x8104
+ ld a, [hNewlyPressedButtons]
+ ld b, a
+ and (D_DOWN | D_UP)
+ jr z, .directionNotPressed
+ ld a, [hGameBoyColorFlag]
+ ld [hFFC4], a
+ xor $1
+ ld [hGameBoyColorFlag], a
+ jr .moveCursor
+
+.directionNotPressed
+ bit BIT_A_BUTTON, b
+ ret z
+ ld hl, wScreenState
+ inc [hl]
+ ret
+
+.moveCursor
+ ld a, [hGameBoyColorFlag]
+ and a
+ jr nz, .cgb
+ ld a, Bank(DMGSelected_TileData)
+ ld bc, DMGSelected_TileData
+ ld de, LoadTileLists
+ call Func_10c5
+ ret
+
+.cgb
+ ld a, Bank(CGBSelected_TileData)
+ ld bc, CGBSelected_TileData
+ ld de, LoadTileLists
+ call Func_10c5
+ 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 Func_cb5
+ call Func_576
+ ld hl, wCurrentScreen
+ inc [hl] ; set to SCREEN_ERASE_ALL_DATA
+ xor a
+ ld [wScreenState], a
+ ret
diff --git a/gfx/unused_text.png b/gfx/select_gb_target_text.png Binary files differindex da416b7..da416b7 100644 --- a/gfx/unused_text.png +++ b/gfx/select_gb_target_text.png @@ -3947,7 +3947,8 @@ CallTable_2049: ; 0x2049 ; First two bytes is function pointer. ; Third byte is bank of function. ; Fourth byte seems to be unused. - padded_dab Func_8000 + ; SCREEN_SELECT_GAMEBOY_TARGET + padded_dab HandleSelectGameboyTargetMenu ; SCREEN_ERASE_ALL_DATA padded_dab HandleEraseAllDataMenu @@ -9,240 +9,7 @@ INCLUDE "data/oam_frames.asm" SECTION "bank2", ROMX, BANK[$2] -Func_8000: ; 0x8000 - ld a, [wScreenState] - rst JumpTable ; calls JumpToFuncInTable -CallTable_8004: ; 0x8004 - dw Func_800a - dw Func_8104 - dw Func_814e - -Func_800a: ; 0x800a - xor a - ld [hFFC4], a - ld a, [hJoypadState] - cp D_UP - jr nz, .asm_8018 - ld a, [hGameBoyColorFlag] - and a - jr nz, .asm_8021 -.asm_8018 - ld hl, wCurrentScreen - inc [hl] - xor a - ld [wScreenState], a - ret - -.asm_8021 - ld a, $45 - ld [hLCDC], a - ld a, $e4 - ld [wBGP], a - ld [wOBP0], a - ld [wOBP1], a - xor a - ld [hSCX], a - ld [hSCY], a - call Func_8049 - call ClearOAMBuffer - call Func_b66 - call Func_588 - call Func_bbe - ld hl, wScreenState - inc [hl] - ret - -Func_8049: ; 0x8049 -; This function is unused? - 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 Fill33Bytes - ld a, $80 - ld de, rOBPI - ld hl, Data_80f4 - call Fill33Bytes - ld hl, PointerTable_8089 - xor a - call LoadVideoData - ld a, Bank(UnusedTileListData_8094) - ld bc, UnusedTileListData_8094 - ld de, LoadTileLists - call Func_10c5 - ret - -PointerTable_8089: ; 0x8089 - dw UnusedTextVideoData - -UnusedTextVideoData: ; 0x808b - VIDEO_DATA_TILES UnusedTextGfx, vTilesSH + $200, $400 - db $FF, $FF ; terminators - -UnusedTileListData_8094: ; 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 - -Fill33Bytes: ; 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 - db $FF - db $7F - db $B5 - db $56 - db $6B - db $2D - db $00 - db $00 - db $FF - db $7F - db $B5 - db $56 - db $6B - db $2D - db $00 - db $00 -Data_80f4: ; 0x80f4 - db $B5 - db $56 - db $FF - db $7F - db $6B - db $2D - db $00 - db $00 - db $FF - db $7F - db $B5 - db $56 - db $6B - db $2D - db $00 - db $00 - -Func_8104: ; 0x8104 - ld a, [hNewlyPressedButtons] - ld b, a - and (D_DOWN | D_UP) - jr z, .asm_8115 - ld a, [hGameBoyColorFlag] - ld [hFFC4], a - xor $1 - ld [hGameBoyColorFlag], a - jr .asm_811d - -.asm_8115 - bit BIT_A_BUTTON, b - ret z - ld hl, wScreenState - inc [hl] - ret - -.asm_811d - ld a, [hGameBoyColorFlag] - and a - jr nz, .asm_812e - ld a, Bank(Data_813a) - ld bc, Data_813a - ld de, LoadTileLists - call Func_10c5 - ret - -.asm_812e - ld a, Bank(Data_8144) - ld bc, Data_8144 - ld de, LoadTileLists - call Func_10c5 - ret - -Data_813a: ; 0x813a - db $02 - dbw $01, $98E3 - db $D1 - dbw $01, $9923 - db $D0 - db $00 ; terminator - -Data_8144: ; 0x8144 - db $02 - dbw $01, $98E3 - db $D0 - dbw $01, $9923 - db $D1 - db $00 ; terminator - -Func_814e: ; 0x414e - call Func_cb5 - call Func_576 - ld hl, wCurrentScreen - inc [hl] - xor a - ld [wScreenState], a - ret +INCLUDE "engine/select_gameboy_target_menu.asm" HandleEraseAllDataMenu: ; 0x815d ld a, [wScreenState] @@ -53729,8 +53496,8 @@ StageRedFieldBottomCollisionMasks: ; 0xd9000 INCLUDE "data/mon_gfx/mon_billboard_palette_maps_3.asm" -UnusedTextGfx: ; 0xd9c00 - INCBIN "gfx/unused_text.2bpp" +SelectGameboyTargetTextGfx: ; 0xd9c00 + INCBIN "gfx/select_gb_target_text.2bpp" CopyrightTextGfx: ; 0xda000 INCBIN "gfx/copyright_text.2bpp" |