summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-06-19 14:40:53 -0700
committerMarcus Huderle <huderlem@gmail.com>2017-06-19 14:40:53 -0700
commit9e3e04c007befee68d1cbef303d3dfdd1897e288 (patch)
tree12adebfde7411217308f85a71130aaf6ed1545cb
parentf2f69fdfe13dd92ec986b238e976165ea4c9c8bb (diff)
Move field select, high scroes, and options screens into separate files
-rwxr-xr-xengine/field_select_screen.asm217
-rwxr-xr-xengine/high_scores_screen.asm1755
-rwxr-xr-xengine/options_screen.asm1087
-rwxr-xr-xmain.asm3065
4 files changed, 3062 insertions, 3062 deletions
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
diff --git a/main.asm b/main.asm
index 891938c..40b3863 100755
--- a/main.asm
+++ b/main.asm
@@ -1903,3068 +1903,9 @@ PokedexCharactersGfx: ; 0xa000
SECTION "bank3", ROMX, BANK[$3]
INCLUDE "engine/titlescreen.asm"
-
-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
-
-Data_ca63:
- 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
-
-Data_ca71:
- 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
-
-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
-
-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
+INCLUDE "engine/options_screen.asm"
+INCLUDE "engine/high_scores_screen.asm"
+INCLUDE "engine/field_select_screen.asm"
HandlePinballGame: ; 0xd853
ld a, [wScreenState]