From 9e3e04c007befee68d1cbef303d3dfdd1897e288 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Mon, 19 Jun 2017 14:40:53 -0700 Subject: Move field select, high scroes, and options screens into separate files --- engine/field_select_screen.asm | 217 +++++ engine/high_scores_screen.asm | 1755 ++++++++++++++++++++++++++++++++++++++++ engine/options_screen.asm | 1087 +++++++++++++++++++++++++ 3 files changed, 3059 insertions(+) create mode 100755 engine/field_select_screen.asm create mode 100755 engine/high_scores_screen.asm create mode 100755 engine/options_screen.asm (limited to 'engine') diff --git a/engine/field_select_screen.asm b/engine/field_select_screen.asm new file mode 100755 index 0000000..2d5cd7c --- /dev/null +++ b/engine/field_select_screen.asm @@ -0,0 +1,217 @@ +HandleFieldSelectScreen: ; 0xd6d3 + ld a, [wScreenState] + rst JumpTable ; calls JumpToFuncInTable +FieldSelectScreenFunctions: ; 0xd6d7 + dw LoadFieldSelectScreen + dw ChooseFieldToPlay + dw ExitFieldSelectScreen + +LoadFieldSelectScreen: ; 0xd6dd + ld a, $43 + ld [hLCDC], a + ld a, $e4 + ld [wBGP], a + ld a, $d2 + ld [wOBP0], a + ld [wOBP1], a + xor a + ld [hSCX], a + ld [hSCY], a + ld hl, FieldSelectGfxPointers + ld a, [hGameBoyColorFlag] + call LoadVideoData + call ClearOAMBuffer + ld a, $8 + ld [wFieldSelectBlinkingBorderFrame], a + call Func_b66 + ld a, $12 + call SetSongBank + ld de, $0003 + call PlaySong + call Func_588 + call Func_bbe + ld hl, wScreenState + inc [hl] + ret + +FieldSelectGfxPointers: ; 0xd71c + dw FieldSelectGfx_GameBoy + dw FieldSelectGfx_GameBoyColor + +FieldSelectGfx_GameBoy: ; 0xd720 + VIDEO_DATA_TILES FieldSelectScreenGfx, vTilesSH - $100, $d00 + VIDEO_DATA_TILEMAP FieldSelectTilemap, vBGMap, $240 + db $FF, $FF ; terminators + +FieldSelectGfx_GameBoyColor: ; 0xd730 + VIDEO_DATA_TILES FieldSelectScreenGfx, vTilesSH - $100, $d00 + VIDEO_DATA_TILEMAP FieldSelectTilemap, vBGMap, $240 + VIDEO_DATA_BGATTR FieldSelectBGAttributes, vBGMap, $240 + VIDEO_DATA_PALETTES FieldSelectScreenPalettes, $48 + db $FF, $FF ; terminators + +ChooseFieldToPlay: ; 0xd74e + call MoveFieldSelectCursor + ld hl, FieldSelectBorderAnimationData + call AnimateBlinkingFieldSelectBorder + ld a, [hNewlyPressedButtons] + and (A_BUTTON | B_BUTTON) + ret z + ld [wd8f6], a + ld a, $18 ; number of frames to blink the border after selecting the Field + ld [wFieldSelectBlinkingBorderTimer], a + ld a, $1 + ld [wFieldSelectBlinkingBorderFrame], a + lb de, $00, $01 + call PlaySoundEffect + ld hl, wScreenState + inc [hl] + ret + +ExitFieldSelectScreen: ; 0xd774 + ld a, [wd8f6] ; this holds the button that was pressed (A or B) + bit BIT_A_BUTTON, a + jr z, .didntPressA + ld hl, FieldSelectConfirmationAnimationData + call AnimateBlinkingFieldSelectBorder + ld a, [wFieldSelectBlinkingBorderTimer] + dec a + ld [wFieldSelectBlinkingBorderTimer], a + ret nz +.didntPressA + ld a, [hJoypadState] + push af + call Func_cb5 + call Func_576 + ld a, [wd8f6] + bit BIT_A_BUTTON, a + jr z, .pressedB + ld a, [wSelectedFieldIndex] + ld c, a + ld b, $0 + ld hl, StartingStages + add hl, bc + ld a, [hl] + ld [wCurrentStage], a + pop af + xor a + ld [wd7c2], a + ld hl, wPartyMons + ld de, sSaveGame + ld bc, $04c3 + call SaveData + xor a + ld [wd7c1], a + ; Start a round of Pinball! Yayy + ld a, SCREEN_PINBALL_GAME + ld [wCurrentScreen], a + xor a + ld [wScreenState], a + ret + +.pressedB + pop af + ld a, SCREEN_TITLESCREEN + ld [wCurrentScreen], a + xor a + ld [wScreenState], a + ret + +StartingStages: ; 0xd7d1 +; wSelectedFieldIndex is used to index this array + db STAGE_RED_FIELD_BOTTOM, STAGE_BLUE_FIELD_BOTTOM + +MoveFieldSelectCursor: ; 0xd7d3 +; When the player presses Right or Left, the stage is +; illuminated with a blinking border. This function keeps tracks +; of which field is currently selected. + ld a, [hPressedButtons] + ld b, a + ld a, [wSelectedFieldIndex] + bit BIT_D_LEFT, b + jr z, .didntPressLeft + and a + ret z ; if cursor is already hovering over Red stage, don't do anything + dec a ; move cursor over Red stage + ld [wSelectedFieldIndex], a + lb de, $00, $3c + call PlaySoundEffect + ret + +.didntPressLeft + bit BIT_D_RIGHT, b + ret z + cp $1 + ret z ; if cursor is already hovering over Blue stage, don't do anything + inc a ; move cursor over Red stage + ld [wSelectedFieldIndex], a + lb de, $00, $3d + call PlaySoundEffect + ret + +AnimateBlinkingFieldSelectBorder: ; 0xd7fb +; This makes the border of the currently-selected Field blink in the Field Select screen. + push hl + ld a, [wSelectedFieldIndex] + sla a + ld c, a + ld b, $0 + ld hl, FieldSelectBorderOAMPixelOffsetData + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [wd915] + sla a + ld e, a + ld d, $0 + pop hl + push hl + add hl, de + ld a, [hl] + call LoadOAMData + ld a, [wFieldSelectBlinkingBorderFrame] + dec a + jr nz, .asm_d838 + inc hl + inc hl + ld a, [hl] + and a + jr z, .asm_d82b + ld a, [wd915] + inc a +.asm_d82b + ld [wd915], a + sla a + ld c, a + ld b, $0 + pop hl + push hl + inc hl + add hl, bc + ld a, [hl] +.asm_d838 + ld [wFieldSelectBlinkingBorderFrame], a + pop hl + ret + +FieldSelectBorderAnimationData: +; [OAM id][duration] + db $9e, $08 + db $9f, $08 + db $9e, $08 + db $a0, $08 + db $00 ; terminator + +FieldSelectConfirmationAnimationData: +; [OAM id][duration] + db $9F, $03 + db $A0, $03 + db $9F, $03 + db $A0, $03 + db $00 ; terminator + +FieldSelectBorderOAMPixelOffsetData: + dw $2A42 + dw $7242 diff --git a/engine/high_scores_screen.asm b/engine/high_scores_screen.asm new file mode 100755 index 0000000..1969f62 --- /dev/null +++ b/engine/high_scores_screen.asm @@ -0,0 +1,1755 @@ +HandleHighScoresScreen: ; 0xca7f + ld a, [wScreenState] + rst JumpTable ; calls JumpToFuncInTable +HighScoresScreenFunctions: ; 0xca83 + dw Func_ca8f + dw Func_cb14 + dw Func_ccac + dw Func_ccb6 + dw Func_cd6c + dw ExitHighScoresScreen + +Func_ca8f: ; 0xca8f + ld hl, wd473 + call GenRandom + ld [hli], a + call GenRandom + ld [hli], a + call GenRandom + ld [hli], a + call GenRandom + ld [hli], a + ld hl, wRedHighScore5Points + $5 + ld a, [wHighScoresStage] + and a + jr z, .asm_caae + ld hl, wBlueHighScore5Points + $5 +.asm_caae + ld b, $5 +.asm_cab0 + ld de, wScore + $5 + ld c, $6 +.asm_cab5 + ld a, [de] + cp [hl] + jr c, .asm_cad0 + jr nz, .asm_cac2 + dec de + dec hl + dec c + jr nz, .asm_cab5 + jr .asm_cad0 + +.asm_cac2 + dec hl + dec c + jr nz, .asm_cac2 + ld a, l + sub $7 + ld l, a + jr nc, .asm_cacd + dec h +.asm_cacd + dec b + jr nz, .asm_cab0 +.asm_cad0 + ld a, b + ld [wda81], a + xor a + ld [wda80], a + inc b + ld hl, wRedHighScore4Unknown0x09 + 3 + ld de, wRedHighScore5Unknown0x09 + 3 + ld a, [wHighScoresStage] + and a + jr z, .asm_caeb + ld hl, wBlueHighScore4Unknown0x09 + 3 + ld de, wBlueHighScore5Unknown0x09 + 3 +.asm_caeb + ld a, $5 +.asm_caed + cp b + jr c, .asm_cb02 + push af + jr nz, .asm_caf6 + ld hl, wd473 + $3 +.asm_caf6 + ld c, $d +.asm_caf8 + ld a, [hld] + ld [de], a + dec de + dec c + jr nz, .asm_caf8 + pop af + dec a + jr nz, .asm_caed +.asm_cb02 + ld a, [wda81] + cp $5 + ld a, $1 + jr nz, .asm_cb0c + xor a +.asm_cb0c + ld [wda7f], a + ld hl, wScreenState + inc [hl] + ret + +Func_cb14: ; 0xcb14 + ld a, $43 + ld [hLCDC], a + ld a, $e0 + ld [wBGP], a + ld a, $e1 + ld [wOBP0], a + ld [wOBP1], a + xor a + ld [hSCX], a + ld [hNextFrameHBlankSCX], a + ld [hSCY], a + ld [hNextFrameHBlankSCY], a + ld a, $e + ld [hLYC], a + ld [hLastLYC], a + ld a, $82 + ld [hNextLYCSub], a + ld [hLYCSub], a + ld hl, hSTAT + set 6, [hl] + ld hl, rIE + set 1, [hl] + ld a, $3 + ld [hHBlankRoutine], a + ld a, [hGameBoyColorFlag] + and a + jr z, .asm_cb51 + ld a, [wHighScoresStage] + inc a +.asm_cb51 + ld hl, HighScoresVideoDataPointers + call LoadVideoData + call ClearOAMBuffer + ld a, $20 + ld [wda82], a + call Func_d211 + hlCoord 0, 14, vBGMap + ld de, wRedHighScore5Unknown0x09 + $3 + call Func_d2cb + hlCoord 0, 14, vBGWin + ld de, wBlueHighScore5Unknown0x09 + $3 + call Func_d2cb + ld a, [wHighScoresStage] + and a + jr z, .asm_cb7f + ld hl, hLCDC + set 3, [hl] +.asm_cb7f + call Func_b66 + ld a, [wda7f] + and a + jr z, .asm_cbbd + ld a, [wda81] + and a + jr nz, .asm_cb9b + ld a, $13 + call SetSongBank + ld de, $0001 + call PlaySong + jr .asm_cba6 + +.asm_cb9b + ld a, $13 + call SetSongBank + ld de, $0002 + call PlaySong +.asm_cba6 + call Func_588 + ld bc, $0009 + call Func_d68a + ld bc, $03c9 + call Func_d68a + call Func_bbe + ld hl, wScreenState + inc [hl] + ret + +.asm_cbbd + ld a, $10 + call SetSongBank + ld de, $0004 + call PlaySong + call Func_588 + ld bc, $0009 + call Func_d68a + ld bc, $03c9 + call Func_d68a + call Func_bbe + ld hl, wScreenState + inc [hl] + ld hl, wScreenState + inc [hl] + ret + +HighScoresVideoDataPointers: ; 0xcbe3 + dw HighScoresVideoData_GameBoy + dw HighScoresRedStageVideoData_GameBoyColor + dw HighScoresBlueStageVideoData_GameBoyColor + +HighScoresVideoData_GameBoy: ; 0xcbe9 + VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800 + VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400 + VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400 + dw HighScoresTilemap + $3c0 + db Bank(HighScoresTilemap) + dw vBGMap + dw ($40 << 2) + dw HighScoresTilemap + $280 + db Bank(HighScoresTilemap) + dw vBGMap + $200 + dw ($40 << 2) + dw HighScoresTilemap2 + $3c0 + db Bank(HighScoresTilemap2) + dw vBGWin + dw ($40 << 2) + dw HighScoresTilemap2 + $280 + db Bank(HighScoresTilemap2) + dw vBGWin + $200 + dw ($40 << 2) + db $FF, $FF ; terminators + +HighScoresRedStageVideoData_GameBoyColor: ; 0xcc1c + VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800 + VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400 + VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400 + VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap4, vBGMap, $400 + VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap5, vBGWin, $400 + dw HighScoresTilemap + $3c0 + db Bank(HighScoresTilemap) + dw vBGMap + dw ($40 << 2) + dw HighScoresTilemap + $280 + db Bank(HighScoresTilemap) + dw vBGMap + $200 + dw ($40 << 2) + dw HighScoresTilemap2 + $3c0 + db Bank(HighScoresTilemap2) + dw vBGWin + dw ($40 << 2) + dw HighScoresTilemap2 + $280 + db Bank(HighScoresTilemap2) + dw vBGWin + $200 + dw ($40 << 2) + VIDEO_DATA_PALETTES HighScoresRedStagePalettes, $80 + db $FF, $FF + +HighScoresBlueStageVideoData_GameBoyColor: ; 0xcc64 + VIDEO_DATA_TILES HighScoresBaseGameBoyGfx, vTilesOB, $1800 + VIDEO_DATA_TILEMAP HighScoresTilemap, vBGMap, $400 + VIDEO_DATA_TILEMAP HighScoresTilemap2, vBGWin, $400 + VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap4, vBGMap, $400 + VIDEO_DATA_TILEMAP_BANK2 HighScoresTilemap5, vBGWin, $400 + dw HighScoresTilemap + $3c0 + db Bank(HighScoresTilemap) + dw vBGMap + dw ($40 << 2) + dw HighScoresTilemap + $280 + db Bank(HighScoresTilemap) + dw vBGMap + $200 + dw ($40 << 2) + dw HighScoresTilemap2 + $3c0 + db Bank(HighScoresTilemap2) + dw vBGWin + dw ($40 << 2) + dw HighScoresTilemap2 + $280 + db Bank(HighScoresTilemap2) + dw vBGWin + $200 + dw ($40 << 2) + VIDEO_DATA_PALETTES HighScoresBlueStagePalettes, $80 + db $FF, $FF ; terminators + +Func_ccac: ; 0xccac + call Func_d18b + call Func_d1d2 + call Func_d211 + ret + +Func_ccb6: ; 0xccb6 + call Func_d4cf + call AnimateHighScoresArrow + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + jr z, .asm_ccd1 + lb de, $00, $01 + call PlaySoundEffect + ld hl, wScreenState + inc [hl] + ld hl, wScreenState + inc [hl] + ret + +.asm_ccd1 + bit 1, a + jr z, .asm_cce4 + lb de, $00, $01 + call PlaySoundEffect + ld hl, wScreenState + inc [hl] + ld hl, wScreenState + inc [hl] + ret + +.asm_cce4 + bit 3, a + jr z, .asm_ccfb + call Func_1a43 + ld a, [hGameBoyColorFlag] + ld [wd8f0], a + lb de, $00, $01 + call PlaySoundEffect + ld hl, wScreenState + inc [hl] + ret + +.asm_ccfb + ld a, [hJoypadState] + cp (SELECT | D_UP) + ret nz + ld a, [hNewlyPressedButtons] + and (SELECT | D_UP) + ret z + lb de, $00, $01 + call PlaySoundEffect + call ClearOAMBuffer + ld bc, $473b + ld a, $94 + call LoadOAMData +.asm_cd16 + rst AdvanceFrame + ld a, [hNewlyPressedButtons] + bit BIT_B_BUTTON, a + jr z, .asm_cd24 + lb de, $00, $01 + call PlaySoundEffect + ret + +.asm_cd24 + bit 0, a + jr z, .asm_cd16 + lb de, $00, $01 + call PlaySoundEffect + call CopyInitialHighScores + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $40 + deCoord 0, 2, vBGMap + ld bc, $01c0 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $40 + deCoord 0, 2, vBGWin + ld bc, $01c0 + call LoadVRAMData + hlCoord 0, 14, vBGMap + ld de, wRedHighScore5Unknown0x09 + $3 + call Func_d361 + hlCoord 0, 14, vBGWin + ld de, wBlueHighScore5Unknown0x09 + $3 + call Func_d361 + ld hl, wRedHighScore1Points + ld de, $a000 + ld bc, $0082 + call SaveData + ret + +Func_cd6c: ; 0xcd6c + ld a, [hNumFramesDropped] + and $1f + call z, Func_1a43 + call Func_cf7d + call Func_cfa6 + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + jr z, .asm_cdbb + lb de, $00, $01 + call PlaySoundEffect + ld a, [wda85] + and a + jr nz, .asm_cda1 + ld a, [wd86e] + and a + jr z, .asm_cdbb + call ClearOAMBuffer + ld bc, $473b + ld a, $8e + call LoadOAMData + call Func_d042 + jr .asm_cdc6 + +.asm_cda1 + ld a, [wd8f0] + and a + jr z, .asm_cdbb + ld de, $0000 + call PlaySong + rst AdvanceFrame + call Func_cdce + push af + ld de, $0004 + call PlaySong + pop af + jr nc, .asm_cdc6 +.asm_cdbb + ld a, [hNewlyPressedButtons] + bit BIT_B_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect +.asm_cdc6 + xor a + ld [rRP], a + ld hl, wScreenState + dec [hl] + ret + +Func_cdce: ; 0xcdce + push af + ld a, $0 + ld [$abf6], a + pop af + call ClearOAMBuffer + call Func_1be3 + call SendHighScores + push af + ld a, $1 + ld [$abf6], a + pop af + di + ld a, [wd8ea] + cp $0 + jp nz, .asm_ceb6 + ld a, [wd8e9] + cp $1 + jr z, .asm_ce23 + push af + ld a, $2 + ld [$abf6], a + pop af + ld b, $82 + ld hl, wRedHighScore1Points + call Func_1cf8 + ld a, [wd8ea] + cp $0 + jp nz, .asm_ceb6 + push af + ld a, $3 + ld [$abf6], a + pop af + ld hl, wc4c0 + call Func_1dda + ld a, [wd8ea] + cp $0 + jp nz, .asm_ceb6 + jr .asm_ce4d + +.asm_ce23 + push af + ld a, $4 + ld [$abf6], a + pop af + ld hl, wc4c0 + call Func_1dda + ld a, [wd8ea] + cp $0 + jr nz, .asm_ceb6 + push af + ld a, $5 + ld [$abf6], a + pop af + ld b, $82 + ld hl, wRedHighScore1Points + call Func_1cf8 + ld a, [wd8ea] + cp $0 + jr nz, .asm_ceb6 +.asm_ce4d + push af + ld a, $6 + ld [$abf6], a + pop af + call Func_ceca + rst AdvanceFrame + ld hl, wc4cc + ld b, $5 +.asm_ce5d + push bc + push hl + ld d, h + ld e, l + ld hl, wRedHighScore5Unknown0x09 + $3 + call Func_cfcb + pop hl + pop bc + ld de, $000d + add hl, de + dec b + jr nz, .asm_ce5d + push af + ld a, $7 + ld [$abf6], a + pop af + ld hl, wBottomMessageText + $0d + ld b, $5 +.asm_ce7c + push bc + push hl + ld d, h + ld e, l + ld hl, wBlueHighScore5Unknown0x09 + $3 + call Func_cfcb + pop hl + pop bc + ld de, $000d + add hl, de + dec b + jr nz, .asm_ce7c + push af + ld a, $8 + ld [$abf6], a + pop af + hlCoord 0, 14, vBGMap + ld de, wRedHighScore5Unknown0x09 + $3 + call Func_d361 + hlCoord 0, 14, vBGWin + ld de, wBlueHighScore5Unknown0x09 + $3 + call Func_d361 + ld hl, wRedHighScore1Points + ld de, $a000 + ld bc, $0082 + call SaveData + and a + ret + +.asm_ceb6 + push af + ld a, $9 + ld [$abf6], a + pop af + call Func_ceca + rst AdvanceFrame + push af + ld a, $a + ld [$abf6], a + pop af + scf + ret + +Func_ceca: ; 0xceca + ld a, [rLY] + and a + jr nz, Func_ceca + ei + ret + +SendHighScores: ; 0xced1 +; Sends high scores, and plays the animation for sending the high scores. + ld hl, SendHighScoresAnimationData + ld de, wSendHighScoresAnimationFrameCounter + call CopyHLToDE + ld bc, $4800 + ld a, [wSendHighScoresAnimationFrame] + call LoadOAMData + ld bc, $473b + ld a, $8f + call LoadOAMData + call CleanOAMBuffer + rst AdvanceFrame + ld a, $1 + ld [wd8e9], a + ld b, $b4 ; maximum attempts to send high scores +.attemptToSendHighScoresLoop + push bc + xor a + ld [hNumFramesSinceLastVBlank], a +.asm_cefa + ld b, $2 + ld c, $56 + ld a, [$ff00+c] + and b + jr z, .asm_cf09 + ld a, [hNumFramesSinceLastVBlank] + and a + jr z, .asm_cefa + jr .asm_cf0e + +.asm_cf09 + call Func_1c50 + jr .continueAttempts + +.asm_cf0e + ld hl, SendHighScoresAnimationData + ld de, wSendHighScoresAnimationFrameCounter + call UpdateAnimation + jr nc, .continueAttempts + ld bc, $4800 + ld a, [wSendHighScoresAnimationFrame] + call LoadOAMData + ld bc, $473b + ld a, $8f + call LoadOAMData + call CleanOAMBuffer + call Func_1ca1 + ld a, [wSendHighScoresAnimationFrameIndex] + cp $6 + jr nz, .continueAttempts + ld hl, SendHighScoresAnimationData + ld de, wSendHighScoresAnimationFrameCounter + call CopyHLToDE +.continueAttempts + pop bc + ld a, [wd8ea] + cp $0 + ret z + dec b + jr nz, .attemptToSendHighScoresLoop + ret + +SendHighScoresAnimationData: ; 0xcf4b +; Each entry is [OAM id][duration] + db $0C, $98 + db $06, $99 + db $0A, $9A + db $0C, $9B + db $0A, $9C + db $06, $9D + db $00 ; terminator + +Func_cf58: ; 0xcf58 + cp $5 + ret z + push af + lb de, $00, $02 + call PlaySoundEffect + call ClearOAMBuffer + rst AdvanceFrame + pop af + ld bc, $473b + add $8f + call LoadOAMData +.asm_cf6f + rst AdvanceFrame + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + jr z, .asm_cf6f + lb de, $00, $01 + call PlaySoundEffect + ret + +Func_cf7d: ; 0xcf7d + ld a, [wd809] + ld b, a + ld a, [wda85] + bit 6, b + jr z, .asm_cf95 + and a + ret z + dec a + ld [wda85], a + lb de, $00, $03 + call PlaySoundEffect + ret + +.asm_cf95 + bit 7, b + ret z + cp $1 + ret z + inc a + ld [wda85], a + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_cfa6: ; 0xcfa6 + ld bc, $473b + ld a, $87 + call LoadOAMData + ld a, [wd8f0] + and a + jr z, .asm_cfb6 + ld a, $2 +.asm_cfb6 + ld e, a + ld a, [wd86e] + add e + xor $3 + add $8a + call LoadOAMData + ld a, [wda85] + add $88 + call LoadOAMData + ret + +Func_cfcb: ; 0xcfcb + ld a, e + ld [$ff8c], a + ld a, d + ld [$ff8d], a + push hl + ld b, $5 +.asm_cfd4 + ld a, [$ff8c] + ld e, a + ld a, [$ff8d] + ld d, a + call Func_d005 + call Func_d017 + jr c, .asm_cfe5 + dec b + jr nz, .asm_cfd4 +.asm_cfe5 + inc b + pop de + ld hl, $fff3 + add hl, de + ld a, $5 +.asm_cfed + cp b + ret c + push af + jr nz, .asm_cff8 + ld a, [$ff8c] + ld l, a + ld a, [$ff8d] + ld h, a +.asm_cff8 + ld c, $d +.asm_cffa + ld a, [hld] + ld [de], a + dec de + dec c + jr nz, .asm_cffa + pop af + dec a + jr nz, .asm_cfed + ret + +Func_d005: ; 0xd005 + ld c, $7 +.asm_d007 + ld a, [de] + cp [hl] + jr nz, .asm_d010 + dec de + dec hl + dec c + jr nz, .asm_d007 +.asm_d010 + ld a, c + ld [$ff8e], a + call Func_d035 + ret + +Func_d017: ; 0xd017 + ld c, $6 +.asm_d019 + ld a, [de] + cp [hl] + jr c, .asm_d02b + jr nz, .asm_d030 + dec de + dec hl + dec c + jr nz, .asm_d019 + ld a, [$ff8e] + and a + jr nz, .asm_d02b + ld b, $5 +.asm_d02b + call Func_d035 + scf + ret + +.asm_d030 + call Func_d035 + and a + ret + +Func_d035: ; 0xd035 + ld a, e + sub c + ld e, a + jr nc, .asm_d03b + dec d +.asm_d03b + ld a, l + sub c + ld l, a + jr nc, .asm_d041 + dec h +.asm_d041 + ret + +Func_d042: ; 0xd042 + ld a, [hJoypadState] + ld [wda86], a + ld b, a + ld a, $80 + bit BIT_D_LEFT, b + jr z, .asm_d052 + ld a, $7f + jr .asm_d058 + +.asm_d052 + bit BIT_D_RIGHT, b + jr z, .asm_d058 + ld a, $10 +.asm_d058 + ld [wd8a7], a + ld a, $e0 + ld [wd8aa], a + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $3c0 + ld de, wc280 + ld bc, $0040 + call FarCopyData + ld a, $0 + hlCoord 0, 2, vBGMap + ld de, wc2c0 + ld bc, $01c0 + call LoadVRAMData + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $280 + ld de, wc480 + ld bc, $0040 + call FarCopyData + call Func_d6b6 + call Func_d0e3 + ret c + ld a, [wda86] + bit 2, a + jr z, .asm_d0a2 + ld de, wRedHighScore1Unknown0x09 + call Func_d107 + call Func_d0f5 + ret c +.asm_d0a2 + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $3c0 + ld de, wc280 + ld bc, $0040 + call FarCopyData + ld a, $0 + hlCoord 0, 2, vBGWin + ld de, wc2c0 + ld bc, $01c0 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $280 + ld de, wc480 + ld bc, $0040 + call FarCopyData + call Func_d6b6 + call Func_d0e3 + ret c + ld a, [wda86] + bit 2, a + ret z + ld de, wBlueHighScore1Unknown0x09 + call Func_d107 + call Func_d0f5 + ret + +Func_d0e3: ; 0xd0e3 + ld a, BANK(HighScoresBaseGameBoyGfx) + ld hl, HighScoresBaseGameBoyGfx + $800 + call Func_1a21 + ld a, [wd86d] + and a + ret z + call Func_cf58 + scf + ret + +Func_d0f5: ; 0xd0f5 + ld a, BANK(HighScoresHexadecimalCharsGfx) + ld hl, HighScoresHexadecimalCharsGfx + call Func_1a21 + ld a, [wd86d] + and a + ret z + call Func_cf58 + scf + ret + +Func_d107: ; 0xd107 + ld hl, wc280 + ld a, $c0 + ld b, $20 +.clear +rept 32 + ld [hli], a +endr + dec b + jr nz, .clear + ld hl, wc280 + ld b, $5 +.loop + ld c, $4 +.inner + ld a, [de] + swap a + call Func_d159 + ld a, [de] + call Func_d159 + inc de + inc hl + dec c + jr nz, .inner + ld a, l + add $4c + ld l, a + jr nc, .no_carry_1 + inc h +.no_carry_1 + ld a, e + add $9 + ld e, a + jr nc, .no_carry_2 + inc d +.no_carry_2 + dec b + jr nz, .loop + ret + +Func_d159: ; 0xd159 + and $f + sla a + sla a + xor $80 + ld [hli], a + inc a + ld [hli], a + inc a + push bc + push hl + ld bc, $001e + add hl, bc + ld [hli], a + inc a + ld [hli], a + pop hl + pop bc + ret + +ExitHighScoresScreen: ; 0xd171 + call Func_cb5 + call Func_576 + ld hl, hSTAT + res 6, [hl] + ld hl, rIE + res 1, [hl] + ld a, SCREEN_TITLESCREEN + ld [wCurrentScreen], a + xor a + ld [wScreenState], a + ret + +Func_d18b: ; 0xd18b + ld a, [hPressedButtons] + ld b, a + ld a, [wda81] + ld e, a + sla e + sla e + add e + sla e + add e + ld e, a + ld a, [wda80] + add e + ld e, a + ld d, $0 + ld hl, wRedHighScore1Name + ld a, [wHighScoresStage] + and a + jr z, .asm_d1ae + ld hl, wBlueHighScore1Name +.asm_d1ae + add hl, de + ld a, [hl] + bit 4, b + jr z, .asm_d1bd + inc a + cp $38 + jr nz, .asm_d1c7 + ld a, $a + jr .asm_d1c7 + +.asm_d1bd + bit 5, b + ret z + dec a + cp $9 + jr nz, .asm_d1c7 + ld a, $37 +.asm_d1c7 + ld [hl], a + call Func_d46f + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_d1d2: ; 0xd1d2 + ld a, [hNewlyPressedButtons] + ld b, a + ld a, [wda80] + bit BIT_A_BUTTON, b + jr z, .asm_d1fc + inc a + cp $3 + jr nz, .asm_d202 + lb de, $07, $45 + call PlaySoundEffect + xor a + ld [wda7f], a + ld hl, wScreenState + inc [hl] + ld hl, wRedHighScore1Points + ld de, $a000 + ld bc, $0082 + call SaveData + ret + +.asm_d1fc + bit 1, b + ret z + and a + ret z + dec a +.asm_d202 + ld [wda80], a + ld a, $20 + ld [wda82], a + lb de, $00, $01 + call PlaySoundEffect + ret + +Func_d211: ; 0xd211 +; related to high scores name entry? + ld a, [wda7f] + and a + ret z + ld a, [hJoypadState] + and (D_RIGHT | D_LEFT) + jr z, .asm_d221 + xor a + ld [wda82], a + ret + +.asm_d221 + ld a, [wda82] + inc a + ld [wda82], a + bit 5, a + ret z + ld a, [wda81] + ld e, a + ld d, $0 + ld hl, OAMPixelYOffsets_d247 + add hl, de + ld c, [hl] + ld a, [wda80] + ld e, a + ld d, $0 + ld hl, OAMPixelXOffsets_d24c + add hl, de + ld b, [hl] + ld a, $86 + call LoadOAMData + ret + +OAMPixelYOffsets_d247: ; 0xd247 + db $10, $28, $40, $58, $70 + +OAMPixelXOffsets_d24c: ; 0xd24c + db $18, $20, $28 + +AnimateHighScoresArrow: ; 0xd24f +; Handles the animation of the arrow in the bottom +; corner of the high scores screens. + ld a, [wHighScoresArrowAnimationCounter] + inc a + cp $28 + jr c, .noOverflow + xor a +.noOverflow + ld [wHighScoresArrowAnimationCounter], a + ld a, [wHighScoresStage] + and a + ld c, $77 + ld a, $95 + ld hl, HighScoresRightArrowOAMPixelXOffsets + jr z, .asm_d26d + ld a, $96 + ld hl, HighScoresLeftArrowOAMPixelXOffsets +.asm_d26d + push af + ld a, [wHighScoresArrowAnimationCounter] + ld e, a + ld d, $0 + add hl, de + ld b, [hl] + pop af + call LoadOAMData + ret + +HighScoresRightArrowOAMPixelXOffsets: ; 0xd27b +; Controls the animation of the right-arrow in the bottom corner of the +; high scores screen. + db $87, $87, $8A, $8A, $8A, $8A, $8A, $8A + db $89, $89, $88, $88, $88, $88, $88, $88 + db $88, $88, $88, $88, $88, $88, $88, $88 + db $88, $88, $88, $88, $88, $88, $88, $88 + db $88, $88, $88, $88, $88, $88, $88, $88 + +HighScoresLeftArrowOAMPixelXOffsets: ; 0xd2a3 + db $02, $02, $FF, $FF, $FF, $FF, $FF, $FF + db $00, $00, $01, $01, $01, $01, $01, $01 + db $01, $01, $01, $01, $01, $01, $01, $01 + db $01, $01, $01, $01, $01, $01, $01, $01 + db $01, $01, $01, $01, $01, $01, $01, $01 + +Func_d2cb: ; 0xd2cb + ld b, $5 +.asm_d2cd + push bc + push hl + dec de + dec de + dec de + dec de + ld a, l + add $5 + ld l, a + ld b, $3 +.asm_d2d9 + ld a, [de] + call Func_d348 + dec de + dec hl + dec b + jr nz, .asm_d2d9 + pop hl + push hl + ld a, l + add $6 + ld l, a + ld bc, $0c01 +.asm_d2eb + ld a, [de] + swap a + and $f + call Func_d30e + inc hl + dec b + ld a, [de] + and $f + call Func_d30e + dec de + inc hl + dec b + jr nz, .asm_d2eb + xor a + call Func_d317 + pop hl + ld bc, hSCY + add hl, bc + pop bc + dec b + jr nz, .asm_d2cd + ret + +Func_d30e: ; 0xd30e + jr nz, Func_d317 + ld a, b + dec a + jr z, Func_d317 + ld a, c + and a + ret nz + ; fall through +Func_d317: ; 0xd317 + push de + push af + call Func_d336 + pop af + ld c, $0 + sla a + add e + ld [hl], a + cp $fe + jr z, .asm_d328 + inc a +.asm_d328 + push hl + push af + ld a, l + add $20 + ld l, a + jr nc, .asm_d331 + inc h +.asm_d331 + pop af + ld [hl], a + pop hl + pop de + ret + +Func_d336: ; 0xd336 + ld e, $6c + ld a, b + cp $3 + ret z + cp $6 + ret z + cp $9 + ret z + cp $c + ret z + ld e, $58 + ret + +Func_d348: ; 0xd348 + ld c, $0 + sla a + add $90 + ld [hl], a + cp $fe + jr z, .asm_d354 + inc a +.asm_d354 + push hl + push af + ld a, l + add $20 + ld l, a + jr nc, .asm_d35d + inc h +.asm_d35d + pop af + ld [hl], a + pop hl + ret + +Func_d361: ; 0xd361 + ld b, $5 +.asm_d363 + push bc + push hl + dec de + dec de + dec de + dec de + ld a, l + add $5 + ld l, a + ld b, $3 +.asm_d36f + ld a, [de] + call Func_d3e2 + dec de + dec hl + dec b + jr nz, .asm_d36f + pop hl + push hl + ld a, l + add $6 + ld l, a + ld bc, $0c01 +.asm_d381 + ld a, [de] + swap a + and $f + call Func_d3a4 + inc hl + dec b + ld a, [de] + and $f + call Func_d3a4 + dec de + inc hl + dec b + jr nz, .asm_d381 + xor a + call Func_d3ad + pop hl + ld bc, hSCY + add hl, bc + pop bc + dec b + jr nz, .asm_d363 + ret + +Func_d3a4: ; 0xd3a4 + jr nz, Func_d3ad + ld a, b + dec a + jr z, Func_d3ad + ld a, c + and a + ret nz + ; fall through +Func_d3ad: ; 0xd3ad + push de + push af + call Func_d3d0 + pop af + ld c, $0 + sla a + add e + call PutTileInVRAM + cp $fe + jr z, .asm_d3c0 + inc a +.asm_d3c0 + push hl + push af + ld a, l + add $20 + ld l, a + jr nc, .asm_d3c9 + inc h +.asm_d3c9 + pop af + call PutTileInVRAM + pop hl + pop de + ret + +Func_d3d0: ; 0xd3d0 + ld e, $6c + ld a, b + cp $3 + ret z + cp $6 + ret z + cp $9 + ret z + cp $c + ret z + ld e, $58 + ret + +Func_d3e2: ; 0xd3e2 + ld c, $0 + sla a + add $90 + call PutTileInVRAM + cp $fe + jr z, .asm_d3f0 + inc a +.asm_d3f0 + push hl + push af + ld a, l + add $20 + ld l, a + jr nc, .asm_d3f9 + inc h +.asm_d3f9 + pop af + call PutTileInVRAM + pop hl + ret + +CopyInitialHighScores: ; 0xd3ff + ld hl, InitialHighScores + ld de, wRedHighScore1Points + call CopyInitialHighScoresForStage + ld hl, InitialHighScores + ld de, wBlueHighScore1Points + +CopyInitialHighScoresForStage: ; 0xd40e +; input: hl = address of high score entries +; de = destination address for high score entries to be copied + ld b, $5 ; 5 high score entries to copy +.copyHighScoreEntry + ld c, $6 ; high score points are 6 bytes long +.copyPoints + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .copyPoints + ld c, $3 ; name is 3 bytes +.copyName + ld a, [hli] + sub $37 + ld [de], a + inc de + dec c + jr nz, .copyName + ld c, $4 +.asm_d424 ; TODO: what are these 4 bytes used for? + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .asm_d424 + dec b + jr nz, .copyHighScoreEntry + ret + +INCLUDE "data/initial_high_scores.asm" ; 0xd42e + +Func_d46f: ; 0xd46f + ld a, [wda81] + ld d, a + sla a + add d + ld d, a + ld e, $0 + srl d + rr e + srl d + rr e + srl d + rr e + ld a, [wda80] + add e + ld e, a + hlCoord 3, 2, vBGMap + ld a, [wHighScoresStage] + and a + jr z, .asm_d496 + hlCoord 3, 2, vBGWin +.asm_d496 + add hl, de + push hl + ld a, [wda81] + ld e, a + sla e + sla e + add e + sla e + add e + ld e, a + ld a, [wda80] + add e + ld e, a + ld d, $0 + ld hl, wRedHighScore1Name + ld a, [wHighScoresStage] + and a + jr z, .asm_d4b8 + ld hl, wBlueHighScore1Name +.asm_d4b8 + add hl, de + ld a, [hl] + sla a + add $90 + pop hl + call PutTileInVRAM + ld de, $0020 + add hl, de + cp $fe + jr z, .asm_d4cb + inc a +.asm_d4cb + call PutTileInVRAM + ret + +Func_d4cf: ; 0xd4cf + ld a, [hNewlyPressedButtons] + ld b, a + ld a, [wHighScoresStage] + bit 4, b + jr z, .asm_d4e3 + and a + ret nz + lb de, $00, $03 + call PlaySoundEffect + jr .asm_d4f0 + +.asm_d4e3 + bit 5, b + ret z + and a + ret z + lb de, $00, $03 + call PlaySoundEffect + jr .asm_d537 + +.asm_d4f0 + call ClearOAMBuffer + call Func_d57b + ld a, $a5 + ld [hWX], a + xor a + ld [hWY], a + ld a, $2 + ld [hSCX], a + ld hl, hLCDC + set 5, [hl] + ld b, $27 +.asm_d508 + push bc + ld a, $27 + sub b + bit 0, b + call nz, TransitionHighScoresPalettes + ld hl, hWX + dec [hl] + dec [hl] + dec [hl] + dec [hl] + ld hl, hSCX + inc [hl] + inc [hl] + inc [hl] + inc [hl] + rst AdvanceFrame + pop bc + dec b + jr nz, .asm_d508 + xor a + ld [hSCX], a + ld hl, hLCDC + res 5, [hl] + set 3, [hl] + ld a, $1 + ld [wHighScoresStage], a + call Func_d5d0 + ret + +.asm_d537 + call ClearOAMBuffer + call Func_d57b + ld a, $7 + ld [hWX], a + xor a + ld [hWY], a + ld a, $a0 + ld [hSCX], a + ld hl, hLCDC + set 5, [hl] + res 3, [hl] + ld b, $27 +.asm_d551 + push bc + ld a, b + bit 0, b + call nz, TransitionHighScoresPalettes + ld hl, hWX + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ld hl, hSCX + dec [hl] + dec [hl] + dec [hl] + dec [hl] + rst AdvanceFrame + pop bc + dec b + jr nz, .asm_d551 + xor a + ld [hSCX], a + ld hl, hLCDC + res 5, [hl] + xor a + ld [wHighScoresStage], a + call Func_d5d0 + ret + +Func_d57b: ; 0xd57b + ld a, $f0 + ld [hSCY], a + xor a + ld [hNextFrameHBlankSCX], a + ld a, $10 + ld [hNextFrameHBlankSCY], a + rst AdvanceFrame + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + deCoord 0, 0, vBGMap + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $200 + deCoord 0, 16, vBGMap + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + deCoord 0, 0, vBGWin + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $200 + deCoord 0, 16, vBGWin + ld bc, $0040 + call LoadVRAMData + ld b, $10 +.asm_d5c1 + push bc + ld hl, hSCY + inc [hl] + ld hl, hNextFrameHBlankSCY + dec [hl] + rst AdvanceFrame + pop bc + dec b + jr nz, .asm_d5c1 + ret + +Func_d5d0: ; 0xd5d0 + ld b, $10 +.asm_d5d2 + push bc + ld hl, hSCY + dec [hl] + ld hl, hNextFrameHBlankSCY + inc [hl] + rst AdvanceFrame + pop bc + dec b + jr nz, .asm_d5d2 + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $3c0 + deCoord 0, 0, vBGMap + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap) + ld hl, HighScoresTilemap + $280 + deCoord 0, 16, vBGMap + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $3c0 + deCoord 0, 0, vBGWin + ld bc, $0040 + call LoadVRAMData + ld a, BANK(HighScoresTilemap2) + ld hl, HighScoresTilemap2 + $280 + deCoord 0, 16, vBGWin + ld bc, $0040 + call LoadVRAMData + ld bc, $0009 + call Func_d68a + xor a + ld [hSCY], a + ld [hNextFrameHBlankSCX], a + ld [hNextFrameHBlankSCY], a + ret + +TransitionHighScoresPalettes: ; 0xd626 +; When switching between the Red and Blue field high scores, the palettes +; of the rows smoothly transition between red and blue. + ld c, a + ld a, [hGameBoyColorFlag] + and a + ret z + ld a, c + srl a + sub $2 + cp $10 + ret nc + ld c, a + ld b, $0 + sla c + add c + ld c, a + ld hl, HighScoresPalettesTransition + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, [hl] + ld h, b + ld l, c + ld de, $0008 + ld bc, $0038 + push af + call Func_7dc + pop af + ld de, $0040 + ld bc, $0008 + call Func_7dc + ret + +HighScoresPalettesTransition: ; 0xd65a +; When switching between the Red and Blue field high scores, the palette +; of the rows fades between red and blue. This table defines the transition +; of those palettes. + dwb HighScoresTransitionPalettes1, Bank(HighScoresTransitionPalettes1) + dwb HighScoresTransitionPalettes2, Bank(HighScoresTransitionPalettes2) + dwb HighScoresTransitionPalettes3, Bank(HighScoresTransitionPalettes3) + dwb HighScoresTransitionPalettes4, Bank(HighScoresTransitionPalettes4) + dwb HighScoresTransitionPalettes5, Bank(HighScoresTransitionPalettes5) + dwb HighScoresTransitionPalettes6, Bank(HighScoresTransitionPalettes6) + dwb HighScoresTransitionPalettes7, Bank(HighScoresTransitionPalettes7) + dwb HighScoresTransitionPalettes8, Bank(HighScoresTransitionPalettes8) + dwb HighScoresTransitionPalettes9, Bank(HighScoresTransitionPalettes9) + dwb HighScoresTransitionPalettes10, Bank(HighScoresTransitionPalettes10) + dwb HighScoresTransitionPalettes11, Bank(HighScoresTransitionPalettes11) + dwb HighScoresTransitionPalettes12, Bank(HighScoresTransitionPalettes12) + dwb HighScoresTransitionPalettes13, Bank(HighScoresTransitionPalettes13) + dwb HighScoresTransitionPalettes14, Bank(HighScoresTransitionPalettes14) + dwb HighScoresTransitionPalettes15, Bank(HighScoresTransitionPalettes15) + dwb HighScoresTransitionPalettes16, Bank(HighScoresTransitionPalettes16) + +Func_d68a: ; 0xd68a + push bc + ld hl, wPokedexFlags + ld bc, (NUM_POKEMON << 8) +.asm_d691 + bit 1, [hl] + jr z, .asm_d696 + inc c +.asm_d696 + inc hl + dec b + jr nz, .asm_d691 + ld a, c + pop bc + cp NUM_POKEMON + ret nz + ld hl, vBGMap + add hl, bc + call Func_d6aa + ld hl, vBGWin + add hl, bc + ; fall through +Func_d6aa: ; 0xd6aa + ld a, $56 + call PutTileInVRAM + inc hl + ld a, $57 + call PutTileInVRAM + ret + +Func_d6b6: ; 0xd6b6 + ld hl, wPokedexFlags + ld bc, (NUM_POKEMON << 8) +.asm_d6bc + bit 1, [hl] + jr z, .asm_d6c1 + inc c +.asm_d6c1 + inc hl + dec b + jr nz, .asm_d6bc + ld a, c + cp NUM_POKEMON + ret nz + ld hl, wc289 + ld a, $56 + ld [hli], a + ld a, $57 + ld [hli], a + ret diff --git a/engine/options_screen.asm b/engine/options_screen.asm new file mode 100755 index 0000000..427e6d2 --- /dev/null +++ b/engine/options_screen.asm @@ -0,0 +1,1087 @@ +HandleOptionsScreen: ; 0xc34a + ld a, [wScreenState] + rst JumpTable ; calls JumpToFuncInTable +OptionsScreenFunctions: ; 0xc34e + dw Func_c35a + dw Func_c400 + dw Func_c483 + dw Func_c493 + dw Func_c506 + dw Func_c691 + +Func_c35a: ; 0xc35a + ld a, $47 + ld [hLCDC], a + ld a, $e4 + ld [wBGP], a + ld [wOBP0], a + ld a, $d2 + ld [wOBP1], a + xor a + ld [hSCX], a + ld [hSCY], a + ld hl, OptionsScreenVideoDataPointers + ld a, [hGameBoyColorFlag] + call LoadVideoData + call ClearOAMBuffer + ld a, $2 + ld [wd921], a + ld [wd91d], a + ld a, $9 + ld [wd91f], a + call Func_c43a + call Func_c948 + call Func_b66 + ld a, $12 + call SetSongBank + ld de, $0002 + call PlaySong + call Func_588 + ld a, [wSoundTestCurrentBackgroundMusic] + hlCoord 7, 11, vBGMap + call RedrawSoundTestID + ld a, [wSoundTextCurrentSoundEffect] + hlCoord 7, 13, vBGMap + call RedrawSoundTestID + call Func_bbe + ld hl, wScreenState + inc [hl] + ret + +OptionsScreenVideoDataPointers: ; 0xc3b9 + dw OptionsScreenVideoData_GameBoy + dw OptionsScreenVideoData_GameBoyColor + +OptionsScreenVideoData_GameBoy: ; 0xc3bd + VIDEO_DATA_TILES OptionMenuAndKeyConfigGfx, vTilesOB, $1400 + VIDEO_DATA_TILEMAP OptionMenuTilemap, vBGMap, $240 + VIDEO_DATA_TILEMAP OptionMenuTilemap2, vBGWin, $240 + db $FF, $FF ; terminators + +OptionsScreenVideoData_GameBoyColor: ; 0xc3d4 + VIDEO_DATA_TILES OptionMenuAndKeyConfigGfx, vTilesOB, $1400 + VIDEO_DATA_TILEMAP OptionMenuTilemap, vBGMap, $240 + VIDEO_DATA_TILEMAP_BANK2 OptionMenuTilemap3, vBGMap, $240 + VIDEO_DATA_TILEMAP OptionMenuTilemap2, vBGWin, $240 + VIDEO_DATA_TILEMAP_BANK2 OptionMenuTilemap4, vBGWin, $240 + VIDEO_DATA_PALETTES OptionMenuPalettes, $80 + db $FF, $FF ; terminators + +Func_c400: ; 0xc400 + call Func_c41a + call Func_c43a + call Func_c447 + ld a, [hNewlyPressedButtons] + bit 1, a + ret z + lb de, $00, $01 + call PlaySoundEffect + ld a, $2 + ld [wScreenState], a + ret + +Func_c41a: ; 0xc41a + ld a, [hPressedButtons] + ld b, a + ld a, [wd916] + bit 6, b + jr z, .asm_c429 + and a + ret z + dec a + jr .asm_c430 + +.asm_c429 + bit 7, b + ret z + cp $2 + ret z + inc a +.asm_c430 + ld [wd916], a + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_c43a: ; 0xc43a + call Func_c7ac + call Func_c80b + call Func_c88a + call Func_c92e + ret + +Func_c447: ; 0xc447 + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect + ld a, [wd916] + and a + jr nz, .asm_c465 + ld a, [hSGBFlag] + and a + ret nz + call Func_c4f4 + ld a, $3 + ld [wScreenState], a + ret + +.asm_c465 + cp $1 + jr nz, .asm_c477 + call ClearOAMBuffer + ld hl, hLCDC + set 3, [hl] + ld a, $4 + ld [wScreenState], a + ret + +.asm_c477 + ld de, $0000 + call PlaySong + ld a, $5 + ld [wScreenState], a + ret + +Func_c483: ; 0xc483 + call Func_cb5 + call Func_576 + ld a, SCREEN_TITLESCREEN + ld [wCurrentScreen], a + xor a + ld [wScreenState], a + ret + +Func_c493: ; 0xc493 + call Func_c4b4 + call Func_c4e6 + call Func_c869 + ld a, [hNewlyPressedButtons] + bit BIT_B_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect + xor a + ld [wd803], a + ld [wd804], a + ld a, $1 + ld [wScreenState], a + ret + +Func_c4b4: ; 0xc4b4 + ld a, [hNewlyPressedButtons] + ld b, a + ld a, [wd917] + bit BIT_D_LEFT, b + jr z, .asm_c4ce + and a + ret z + dec a + ld [wd917], a + call Func_c4f4 + lb de, $00, $03 + call PlaySoundEffect + ret + +.asm_c4ce + bit BIT_D_RIGHT, b + ret z + cp $1 + ret z + inc a + ld [wd917], a + xor a + ld [wd803], a + ld [wd804], a + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_c4e6: ; 0xc4e6 + call Func_c7ac + call Func_c80b + call Func_c88a + xor a + call Func_c8f1 + ret + +Func_c4f4: ; 0xc4f4 + xor a + ld [wd91c], a + ld [wd91e], a + ld a, $2 + ld [wd91d], a + ld a, $9 + ld [wd91f], a + ret + +Func_c506: ; 0xc506 + call Func_c534 + call Func_c554 + call Func_c55a + ld a, [hNewlyPressedButtons] + bit BIT_B_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect + call ClearOAMBuffer + ld hl, hLCDC + res 3, [hl] + ld hl, wKeyConfigBallStart + ld de, sKeyConfigs + ld bc, $000e + call SaveData + ld a, $1 + ld [wScreenState], a + ret + +Func_c534: ; 0xc534 + ld a, [hNewlyPressedButtons] + ld b, a + ld a, [wd918] + bit BIT_D_UP, b + jr z, .asm_c543 + and a + ret z + dec a + jr .asm_c54a + +.asm_c543 + bit BIT_D_DOWN, b + ret z + cp $7 + ret z + inc a +.asm_c54a + ld [wd918], a + lb de, $00, $03 + call PlaySoundEffect + ret + +Func_c554: ; 0xc554 + ld a, $1 + call Func_c8f1 + ret + +Func_c55a: ; 0xc55a + ld a, [wd918] + and a + jr nz, .asm_c572 + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect + call SaveDefaultKeyConfigs + call Func_c948 + ret + +.asm_c572 + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + ret z + lb de, $00, $01 + call PlaySoundEffect + ld bc, $001e + call AdvanceFrames + ld a, [wd918] + dec a + sla a + ld c, a + ld b, $0 + ld hl, PointerTable_c65f + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld a, [wd918] + dec a + sla a + call Func_c644 + ld bc, $00ff +.asm_c59f + push bc + push hl + ld a, [wd918] + dec a + sla a + call Func_c621 + call Func_c554 + call CleanOAMBuffer + rst AdvanceFrame + pop hl + pop bc + ld a, [hJoypadState] + and a + jr z, .asm_c5c2 + ld c, $0 + call Func_c9be + call Func_c95f + jr .asm_c59f + +.asm_c5c2 + or c + jr nz, .asm_c59f + ld a, [wd918] + dec a + sla a + call Func_c639 + push hl + ld bc, $001e + call AdvanceFrames + pop hl + ld bc, $0020 + add hl, bc + ld a, [wd918] + dec a + sla a + inc a + call Func_c644 + ld bc, $00ff + ld d, $5a +.asm_c5e9 + push bc + push de + push hl + ld a, [wd918] + dec a + sla a + inc a + call Func_c621 + call Func_c554 + call CleanOAMBuffer + rst AdvanceFrame + pop hl + pop de + pop bc + dec d + ret z + ld a, [hJoypadState] + and a + jr z, .asm_c613 + ld d, $ff + ld c, $0 + call Func_c9be + call Func_c95f + jr .asm_c5e9 + +.asm_c613 + or c + jr nz, .asm_c5e9 + ld a, [wd918] + dec a + sla a + inc a + call Func_c639 + ret + +Func_c621: ; 0xc621 + sla a + ld c, a + ld b, $0 + ld hl, OAMPixelOffsetData_c66d + add hl, bc + ld a, [hli] + ld c, a + ld a, [hl] + ld b, a + ld a, [hNumFramesDropped] + bit 2, a + ret z + ld a, $84 + call LoadOAMData + ret + +Func_c639: ; 0xc639 + push hl + ld e, a + ld d, $0 + ld hl, wKeyConfigBallStart + add hl, de + ld [hl], b + pop hl + ret + +Func_c644: ; 0xc644 + push hl + ld c, a + ld b, $0 + ld hl, wKeyConfigBallStart + add hl, bc + ld [hl], $0 + pop hl + push hl + ld d, h + ld e, l + ld hl, Data_c689 + ld a, Bank(Data_c689) + ld bc, $0008 + call LoadVRAMData + pop hl + ret + +PointerTable_c65f: ; 0xc65f + dw $9C6D + dw $9CAD + dw $9CED + dw $9D2D + dw $9D6D + dw $9DAD + dw $9DED + +OAMPixelOffsetData_c66d: ; 0xc66d + dw $6018 + dw $6020 + dw $6028 + dw $6030 + dw $6038 + dw $6040 + dw $6048 + dw $6050 + dw $6058 + dw $6060 + dw $6068 + dw $6070 + dw $6078 + dw $6080 + +Data_c689: ; 0xc689 + db $81, $81, $81, $81, $81, $81, $81, $81 + +Func_c691: ; 0xc91 + call Func_c6bf + call Func_c6d9 + call Func_c6e8 + ld a, [hNewlyPressedButtons] + bit BIT_B_BUTTON, a + ret z + ld de, $0000 + call PlaySong + rst AdvanceFrame + rst AdvanceFrame + rst AdvanceFrame + ld a, $12 + call SetSongBank + ld de, $0002 + call PlaySong + lb de, $00, $01 + call PlaySoundEffect + ld a, $1 + ld [wScreenState], a + ret + +Func_c6bf: ; 0xc6bf + ld a, [hNewlyPressedButtons] + ld b, a + ld a, [wd919] + bit BIT_D_UP, b + jr z, .asm_c6ce + and a + ret z + dec a + jr .asm_c6d5 + +.asm_c6ce + bit BIT_D_DOWN, b + ret z + cp $1 + ret z + inc a +.asm_c6d5 + ld [wd919], a + ret + +Func_c6d9: ; 0xc6d9 + call Func_c7ac + call Func_c80b + call Func_c88a + ld a, $2 + call Func_c8f1 + ret + +Func_c6e8: ; 0xc6e8 + ld a, [wd919] + and a + jr nz, UpdateSoundTestSoundEffectSelection + ld a, [hNewlyPressedButtons] + bit BIT_A_BUTTON, a + jr z, UpdateSoundTestBackgroundMusicSelection + ld de, $0000 + call PlaySong + rst AdvanceFrame + rst AdvanceFrame + rst AdvanceFrame + ld a, [wSoundTestCurrentBackgroundMusic] + sla a + ld c, a + ld b, $0 + ld hl, SongBanks + add hl, bc + ld a, [hli] + ld e, a + ld d, $0 + ld a, [hl] + call SetSongBank + call PlaySong + ret + +UpdateSoundTestBackgroundMusicSelection: ; 0xc715 + ld a, [hPressedButtons] ; joypad state + ld b, a + ld a, [wSoundTestCurrentBackgroundMusic] + bit BIT_D_LEFT, b ; was the left dpad button pressed? + jr z, .checkIfRightPressed + dec a ; decrement background music id + bit 7, a ; did it wrap around to $ff? + jr z, .saveBackgroundMusicID + ld a, NUM_SONGS - 1 + jr .saveBackgroundMusicID + +.checkIfRightPressed + bit BIT_D_RIGHT, b ; was the right dpad button pressed? + ret z + inc a ; increment background music id + cp NUM_SONGS ; should it wrap around to 0? + jr nz, .saveBackgroundMusicID + xor a +.saveBackgroundMusicID + ld [wSoundTestCurrentBackgroundMusic], a + hlCoord 7, 11, vBGMap + jp RedrawSoundTestID + +UpdateSoundTestSoundEffectSelection: ; 0xc73a + ld a, [hNewlyPressedButtons] ; joypad state + bit BIT_A_BUTTON, a + jr z, .didntPressAButton + ld a, [wSoundTextCurrentSoundEffect] + ld e, a + ld d, $0 + call PlaySoundEffect + ret + +.didntPressAButton + ld a, [hPressedButtons] ; joypad state + ld b, a + ld a, [wSoundTextCurrentSoundEffect] + bit BIT_D_LEFT, b ; was the left dpad button pressed? + jr z, .checkIfRightPressed + dec a ; decrement sound effect id + bit 7, a ; did it wrap around to $ff? + jr z, .saveSoundEffectID + ld a, NUM_SOUND_EFFECTS - 1 + jr .saveSoundEffectID + +.checkIfRightPressed + bit BIT_D_RIGHT, b ; was the right dpad button pressed? + ret z + inc a ; increment background music id + cp NUM_SOUND_EFFECTS ; should it wrap around to 0? + jr nz, .saveSoundEffectID + xor a +.saveSoundEffectID + ld [wSoundTextCurrentSoundEffect], a + hlCoord 7, 13, vBGMap + ; fall through + +RedrawSoundTestID: ; 0xc76c +; Redraws the 2-digit id number for the sound test's current background music or sound effect id. +; input: a = id number +; hl = pointer to bg map location where the new 2-digit id should be drawn + push af ; save music or sound effect id number + swap a + and $f ; a contains high nybble of music id + call .drawDigit + pop af + and $f ; a contains low nybble of music id +.drawDigit + add $b7 ; hexadecimal digit tiles start at tile number $b7 + call PutTileInVRAM + inc hl + ret + +SongBanks: ; 0xc77e + db MUSIC_NOTHING_0F,BANK(Music_Nothing0F) + db MUSIC_BLUE_FIELD,BANK(Music_BlueField) + db MUSIC_CATCH_EM_RED,BANK(Music_CatchEmRed) + db MUSIC_HURRY_UP_RED,BANK(Music_HurryUpRed) + db MUSIC_POKEDEX,BANK(Music_Pokedex) + db MUSIC_GASTLY_GRAVEYARD,BANK(Music_GastlyInTheGraveyard) + db MUSIC_HAUNTER_GRAVEYARD,BANK(Music_HaunterInTheGraveyard) + db MUSIC_GENGAR_GRAVEYARD,BANK(Music_GengarInTheGraveyard) + db MUSIC_RED_FIELD,BANK(Music_RedField) + db MUSIC_CATCH_EM_BLUE,BANK(Music_CatchEmBlue) + db MUSIC_HURRY_UP_BLUE,BANK(Music_HurryUpBlue) + db MUSIC_HI_SCORE,BANK(Music_HiScore) + db MUSIC_GAME_OVER,BANK(Music_GameOver) + db MUSIC_WHACK_DIGLETT,BANK(Music_WhackTheDiglett) + db MUSIC_WHACK_DUGTRIO,BANK(Music_WhackTheDugtrio) + db MUSIC_SEEL_STAGE,BANK(Music_SeelStage) + db MUSIC_TITLE_SCREEN,BANK(Music_Title) + db MUSIC_MEWTWO_STAGE,BANK(Music_MewtwoStage) + db MUSIC_OPTIONS,BANK(Music_Options) + db MUSIC_FIELD_SELECT,BANK(Music_FieldSelect) + db MUSIC_MEOWTH_STAGE,BANK(Music_MeowthStage) + db MUSIC_END_CREDITS,BANK(Music_EndCredits) + db MUSIC_NAME_ENTRY,BANK(Music_NameEntry) + +Func_c7ac: ; 0xc7ac + ld c, $0 + ld a, [wScreenState] + cp $1 + jr z, .asm_c7cc + ld a, [wd916] + and a + jr nz, .asm_c7cc + ld a, [wd917] + and a + jr nz, .asm_c7cc + ld a, [wd91e] + cp $4 + jr nz, .asm_c7cc + ld a, [wd91c] + ld c, a +.asm_c7cc + sla c + ld b, $0 + ld hl, Data_c806 + add hl, bc + ld a, [hl] + ld bc, $5050 + call LoadOAMData + ld a, [wd91d] + dec a + jr nz, .asm_c802 + ld a, [wd91c] + sla a + ld c, a + ld b, $0 + ld hl, Data_c806 + 2 + add hl, bc + ld a, [hl] + and a + jr z, .asm_c7f5 + ld a, [wd91c] + inc a +.asm_c7f5 + ld [wd91c], a + sla a + ld c, a + ld b, $0 + ld hl, Data_c806 + 1 + add hl, bc + ld a, [hl] +.asm_c802 + ld [wd91d], a + ret + +Data_c806: ; 0xc806 + db $7B, $02, $7C, $02, $00 + +Func_c80b: ; 0xc80b + ld c, $0 + ld a, [wScreenState] + cp $1 + jr z, .asm_c824 + ld a, [wd916] + and a + jr nz, .asm_c824 + ld a, [wd917] + and a + jr nz, .asm_c824 + ld a, [wd91e] + ld c, a +.asm_c824 + sla c + ld b, $0 + ld hl, Data_c85e + add hl, bc + ld bc, $7870 + ld a, [hl] + call LoadOAMData + ld a, [wd91f] + dec a + jr nz, .asm_c85a + ld a, [wd91e] + sla a + ld c, a + ld b, $0 + ld hl, Data_c85e + 2 + add hl, bc + ld a, [hl] + and a + ld a, [wd91e] + jr z, .asm_c850 + inc a + ld [wd91e], a +.asm_c850 + sla a + ld c, a + ld b, $0 + ld hl, Data_c85e + 1 + add hl, bc + ld a, [hl] +.asm_c85a + ld [wd91f], a + ret + +Data_c85e: ; 0xc85e + db $77, $09, $78, $09, $79, $09, $7A, $0D, $7A, $01, $00 + +Func_c869: ; 0xc869 + ld a, [wd916] + and a + ret nz + ld a, [wd917] + and a + ret nz + ld a, [wd91e] + cp $3 + ret nz + ld a, [wd91f] + cp $1 + ret nz + ld a, $55 + ld [wd803], a + ld a, $40 + ld [wd804], a + ret + +Func_c88a: ; 0xc88a + ld a, [wd916] + sla a + ld c, a + ld b, $0 + ld hl, Data_c8eb + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld e, $0 + ld a, [wScreenState] + cp $1 + jr nz, .asm_c8a9 + ld a, [wd920] + sla a + ld e, a +.asm_c8a9 + ld d, $0 + ld hl, Data_c8de + add hl, de + ld a, [hl] + call LoadOAMData + ld a, [wd921] + dec a + jr nz, .asm_c8da + ld a, [wd920] + sla a + ld c, a + ld b, $0 + ld hl, Data_c8de + 2 + add hl, bc + ld a, [hl] + and a + jr z, .asm_c8cd + ld a, [wd920] + inc a +.asm_c8cd + ld [wd920], a + sla a + ld c, a + ld b, $0 + ld hl, Data_c8de + 1 + add hl, bc + ld a, [hl] +.asm_c8da + ld [wd921], a + ret + +Data_c8de: ; 0xc8de + db $7D, $02, $7E, $06, $7F, $02, $80, $04, $81, $06, $7F, $04, $00 + +Data_c8eb: ; 0xc8eb + db $18, $08, $30, $08, $48, $08 + +Func_c8f1: ; 0xc8f1 + ld c, a + ld b, $0 + ld hl, wd917 + add hl, bc + ld e, [hl] + sla c + ld hl, PointerTable_c910 + add hl, bc + ld a, [hli] + ld h, [hl] + ld l, a + ld c, e + sla c + add hl, bc + ld a, [hli] + ld c, a + ld a, [hl] + ld b, a + ld a, $82 + call LoadOAMData + ret + +PointerTable_c910: ; 0xc910 + dw OAMPixelOffsetData_c916 + dw OAMPixelOffsetData_c91a + dw OAMPixelOffsetData_c92a + +OAMPixelOffsetData_c916: ; 0xc916 + dw $5018 + dw $7018 + +OAMPixelOffsetData_c91a: ; 0xc91a + dw $0808 + dw $0818 + dw $0828 + dw $0838 + dw $0848 + dw $0858 + dw $0868 + dw $0878 + +OAMPixelOffsetData_c92a: ; 0xc92a + dw $1058 + dw $1068 + +Func_c92e: ; 0xc92e + ld a, [wd917] + sla a + ld c, a + ld b, $0 + ld hl, OAMPixelOffsetData_c944 + add hl, bc + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld a, $85 + call LoadOAMData + ret + +OAMPixelOffsetData_c944: ; 0xc944 + dw $5018 + dw $7018 + +Func_c948: ; 0xc948 + hlCoord 13, 3, vBGWin + ld de, wKeyConfigBallStart + ld b, $e +.asm_c950 + push bc + ld a, [de] + call Func_c95f + inc de + ld bc, $0020 + add hl, bc + pop bc + dec b + jr nz, .asm_c950 + ret + +Func_c95f: ; 0xc95f + push bc + push de + push hl + push hl + push af + ld hl, wd922 + ld a, $81 + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + pop af + ld hl, wd922 + ld de, Data_c9ae + ld b, $8 +.asm_c979 + srl a + push af + jr nc, .asm_c994 + ld a, [de] + inc de + call Func_c9aa + ld a, [de] + inc de + call Func_c9aa + pop af + push af + and a + jr z, .asm_c996 + ld a, $1a + call Func_c9aa + jr .asm_c996 + +.asm_c994 + inc de + inc de +.asm_c996 + pop af + dec b + jr nz, .asm_c979 + pop de + ld hl, wd922 + ld a, $0 + ld bc, $0008 + call LoadOrCopyVRAMData + pop hl + pop de + pop bc + ret + +Func_c9aa: ; 0xc9aa + and a + ret z + ld [hli], a + ret + +Data_c9ae: ; 0xc9ae + db $14, $00, $15, $00, $18, $19, $16, $17, $13, $00, $12, $00, $10, $00, $11, $00 + +Func_c9be: ; 0xc9be + push af + push bc + push hl + ld c, a + xor b + and c + ld hl, wd936 + call Func_c9ff + ld a, b + ld hl, wd93f + call Func_c9ff + ld a, [wd947] + cp $3 + jr nc, .asm_c9f3 + ld hl, wd93e + add [hl] + sub $4 + ld hl, wd936 + call nc, Func_ca15 + ld de, wd936 + ld hl, wd93f + ld b, $8 +.asm_c9ec + ld a, [de] + or [hl] + ld [hli], a + inc de + dec b + jr nz, .asm_c9ec +.asm_c9f3 + ld hl, wd93f + call Func_ca29 + pop hl + pop bc + ld b, a + pop af + ld a, b + ret + +Func_c9ff: ; 0xc9ff + push bc + ld bc, $0800 +.asm_ca03 + sla a + jr nc, .asm_ca0c + ld [hl], $ff + inc c + jr .asm_ca0e + +.asm_ca0c + ld [hl], $0 +.asm_ca0e + inc hl + dec b + jr nz, .asm_ca03 + ld [hl], c + pop bc + ret + +Func_ca15: ; 0xca15 + push bc + inc a + ld c, a + ld b, $8 +.asm_ca1a + ld a, [hl] + and a + jr z, .asm_ca23 + ld [hl], $0 + dec c + jr z, .asm_ca27 +.asm_ca23 + inc hl + dec b + jr nz, .asm_ca1a +.asm_ca27 + pop bc + ret + +Func_ca29: ; 0ca29 + push bc + ld bc, $0800 +.asm_ca2d + ld a, [hli] + and a + jr z, .asm_ca32 + scf +.asm_ca32 + rl c + dec b + jr nz, .asm_ca2d + ld a, c + pop bc + ret + +SaveDefaultKeyConfigs: ; 0ca3a + ld hl, DefaultKeyConfigs + ld de, wKeyConfigs + ld b, $e +.loop + ld a, [hli] + ld [de], a + inc de + dec b + jr nz, .loop + ld hl, wKeyConfigs + ld de, sKeyConfigs + ld bc, $000e + call SaveData + ret + +DefaultKeyConfigs: ; 0xca55 + db A_BUTTON, $00 ; wKeyConfigBallStart + db D_LEFT, $00 ; wKeyConfigLeftFlipper + db A_BUTTON, $00 ; wKeyConfigRightFlipper + db D_DOWN, $00 ; wKeyConfigLeftTilt + db B_BUTTON, $00 ; wKeyConfigRightTilt + db SELECT, $00 ; wKeyConfigUpperTilt + db START, $00 ; wKeyConfigMenu + +UnusedKeyConfig1: ; 0xca63 + db A_BUTTON, $00 ; wKeyConfigBallStart + db D_LEFT, $00 ; wKeyConfigLeftFlipper + db A_BUTTON, $00 ; wKeyConfigRightFlipper + db D_DOWN, $00 ; wKeyConfigLeftTilt + db B_BUTTON, $00 ; wKeyConfigRightTilt + db START, $04 ; wKeyConfigUpperTilt + db D_UP | D_RIGHT, $00 ; wKeyConfigMenu + +UnusedKeyConfig2: ; 0xca71 + db A_BUTTON, $00 ; wKeyConfigBallStart + db D_LEFT, $00 ; wKeyConfigLeftFlipper + db A_BUTTON, $00 ; wKeyConfigRightFlipper + db D_DOWN, $00 ; wKeyConfigLeftTilt + db B_BUTTON, $00 ; wKeyConfigRightTilt + db START, $00 ; wKeyConfigUpperTilt + db D_UP | START | SELECT, $00 ; wKeyConfigMenu -- cgit v1.2.3