4cade/src/ui.browse.mode.a

199 lines
5.6 KiB
Plaintext

;license:MIT
;(c) 2018-2020 by 4am
;
; Browse Mode - main UI
;
; Public functions
; - BrowseMode
;
;------------------------------------------------------------------------------
; BrowseMode
; main entry point for Browse Mode, which allows the user to browse the game
; catalog in alphabetical order and launch games
;
; in: none
; out: never returns to caller (may JMP to other major modes)
;------------------------------------------------------------------------------
BrowseMode
ldx #$FF
txs
@BrowseModeInputLoop
jsr WaitForKeyFor30Seconds
bit CLEARKBD
; indices into BrowseDispatchTable below
kBrowseSearch = 0
kBrowsePrevious = 1
kBrowseNext = 2
kBrowseExitToSearch = 3
kBrowseTab = 4
kBrowseLaunch = 5
kBrowseHelp = 6
kBrowseCredits = 7
kBrowseCheat = 8
kSoftBell = 9 ; must match kInputError
kBrowseJoystick = 10
kBrowseQuit = 11
kBrowseSHR = 12
ldy #kNumBrowseKeys
- dey
bmi @noKeyMatch
cmp BrowseKeys,y
bne -
ldx BrowseKeyDispatch,y
bne @BrowseDispatch ; always branches
@noKeyMatch
jsr IsSearchKey
!if kBrowseSearch > 0 {
bne @BrowseDispatch
ldx #kBrowseSearch
}
; execution falls through here
@BrowseDispatch
ldy BrowseDispatchTableLo,x
sty @j+1
ldy BrowseDispatchTableHi,x
sty @j+2
@j jsr $FDFD ; SMC
jmp @BrowseModeInputLoop
;------------------------------------------------------------------------------
; internal functions
OnBrowseSearch
sta InputBuffer
lda #$01
sta InputLength
jmp SearchMode
OnBrowsePrevious
jsr AnyGameSelected
; A/Y = gGameToLaunch
bcs @goToLastGame ; if no game selected, select last game
tax ; X/Y = gGameToLaunch
tya ; set up first comparison in CPX16 macro
+CPX16_0_NE @notFirstGame ; if first game selected, select last game
@goToLastGame
+LDX16 GameCount
@notFirstGame
+DEX16
jmp notLastGame
OnBrowseNext
+LDX16 gGameToLaunch
+INX16
+CPX16ADDR_NE GameCount, notLastGame
ldx #0
ldy #0
notLastGame
+STX16 gGameToLaunch
jmp OnBrowseChanged
ReloadIndexAndLaunch
jsr ReloadSearchIndex
OnBrowseLaunch
jsr PlayGame
jsr BlankHGR
jmp ForceBrowseChanged
OnBrowseCheat
jsr ToggleCheat
beq ForceBrowseChanged ; always branches because Z=1 on exit from ToggleCheat
OnBrowseTab
jsr MiniAttractMode
jsr HGRMode
cmp #$8D
beq ReloadIndexAndLaunch
; execution falls through here
ForceBrowseChanged
jsr ReloadSearchIndex
bit CLEARKBD
; execution falls through here
OnBrowseChanged
; in: gGameToLaunch = game index (word)
; gSearchStore populated
jsr SwitchToBank2
jsr EnableAcceleratorAndSwitchToBank1
jsr LoadGameTitleOffscreen
jsr DrawUIWithoutDots
jmp MaybeAnimateTitle
BrowseCreditsWrapper
jsr Credits
jmp ForceBrowseChanged
BrowseHelpWrapper
jsr Help
jmp ForceBrowseChanged
BrowseDispatchTableLo
!byte <OnBrowseSearch
!byte <OnBrowsePrevious
!byte <OnBrowseNext
!byte <SearchMode
!byte <OnBrowseTab
!byte <OnBrowseLaunch
!byte <BrowseHelpWrapper
!byte <BrowseCreditsWrapper
!byte <OnBrowseCheat
!byte <SoftBell
!byte <Joystick
!byte <OnQuit
!byte <AllSHRSlideshow
BrowseDispatchTableHi
!byte >OnBrowseSearch
!byte >OnBrowsePrevious
!byte >OnBrowseNext
!byte >SearchMode
!byte >OnBrowseTab
!byte >OnBrowseLaunch
!byte >BrowseHelpWrapper
!byte >BrowseCreditsWrapper
!byte >OnBrowseCheat
!byte >SoftBell
!byte >Joystick
!byte >OnQuit
!byte >AllSHRSlideshow
kNumBrowseKeys = 15
; number of entries in next 2 tables (each)
BrowseKeys
!byte $80 ; Ctrl-@ = SHR-only slideshow
!byte $83 ; Ctrl-C = toggle cheat mode
!byte $81 ; Ctrl-A = about
!byte $AF ; '/' = help
!byte $BF ; '?' = help
!byte $A0 ; Space = mini attract mode
!byte $89 ; TAB = mini attract mode
!byte $90 ; Ctrl-P = launch joystick calibration program
!byte $91 ; Ctrl-Q = quit
!byte $9B ; Esc = switch to search mode
!byte $8D ; ENTER = launch current game
!byte $8B ; up arrow = previous
!byte $8A ; down arrow = next
!byte $88 ; left arrow = previous
!byte $95 ; right arrow = next
BrowseKeyDispatch
!byte kBrowseSHR
!byte kBrowseCheat
!byte kBrowseCredits
!byte kBrowseHelp
!byte kBrowseHelp
!byte kBrowseTab
!byte kBrowseTab
!byte kBrowseJoystick
!byte kBrowseQuit
!byte kBrowseExitToSearch
!byte kBrowseLaunch
!byte kBrowsePrevious
!byte kBrowseNext
!byte kBrowsePrevious
!byte kBrowseNext
GameCount
!word 0