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

198 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
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 $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 $8D ; ENTER = launch current game
!byte $9B ; Esc = switch to search mode
!byte $8A ; down arrow = next
!byte $95 ; right arrow = next
!byte $8B ; up arrow = previous
!byte $88 ; left arrow = previous
!byte $90 ; Ctrl-P = launch joystick calibration program
!byte $91 ; Ctrl-Q = quit
!byte $80 ; Ctrl-@ = SHR-only slideshow
BrowseKeyDispatch
!byte kBrowseCheat
!byte kBrowseCredits
!byte kBrowseHelp
!byte kBrowseHelp
!byte kBrowseTab
!byte kBrowseTab
!byte kBrowseLaunch
!byte kBrowseExitToSearch
!byte kBrowseNext
!byte kBrowseNext
!byte kBrowsePrevious
!byte kBrowsePrevious
!byte kBrowseJoystick
!byte kBrowseQuit
!byte kBrowseSHR
GameCount
!word 0