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

204 lines
5.7 KiB
Plaintext

;license:MIT
;(c) 2018-9 by 4am
;
; Browse Mode - main UI
;
; Public functions
; - BrowseMode
;
!zone {
;------------------------------------------------------------------------------
; 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
ldx SelectedIndex
stx BrowseSelectedIndex
.BrowseModeInputLoop
jsr WaitForKeyFor30Seconds
bit CLEARKBD
ldy #kNumBrowseKeys
- dey
bmi @noKeyMatch
cmp .BrowseKeys,y
bne -
ldx .BrowseKeyDispatch,y
bne @BrowseDispatch ; always branches
@noKeyMatch
jsr IsSearchKey
beq +
jsr SoftBell ; beep on invalid input
jmp .BrowseModeInputLoop ; and start over
+
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
.OnSearch
sta InputBuffer
lda #$01
sta InputLength
jmp SearchMode
.OnPrevious
dec BrowseSelectedIndex
jmp +
.OnNext
inc BrowseSelectedIndex
+
ldx BrowseSelectedIndex
cpx #$FF
bne @notTooSmall
GameCount = *+1
ldx #$D1 ; SMC
dex
bne @done ; always branches
@notTooSmall
cpx GameCount
bcc @done
ldx #0
@done stx BrowseSelectedIndex
jmp .OnBrowseChanged
.OnLaunch
ldx BrowseSelectedIndex
jsr PlayGameFromBrowse
jsr BlankHGR
jmp .ForceBrowseChanged
.OnCheat
jsr ToggleCheat
beq .ForceBrowseChanged ; always branches because Z=1 on exit from ToggleCheat
.OnTab
ldx BrowseSelectedIndex
jsr MiniAttractMode
cmp #$8D
beq .OnLaunch
.ForceBrowseChanged
bit CLEARKBD
ldx BrowseSelectedIndex
; execution falls through here
.OnBrowseChanged
stx @index
jsr okvs_nth ; get the name of the new game
!word gGamesListStore
@index !byte $FD
+STAY @key
+STAY @key2
jsr GetOffscreenAddress ; load new title screenshot offscreen
sta + ; new title screenshot (offscreen)
jsr LoadFile
!word kHGRTitleDirectory
@key !word $FDFD ; SMC
!byte $00
+ !byte $FD ; SMC
jsr okvs_get
!word gGamesListStore
@key2 !word $FDFD
+STAY SRC ; A/Y points to game title (in OKVS)
ldy #0 ; copy game title into search bar buffer
lda (SRC),y
sta SAVE ; game title length
inc SAVE
- iny
cpy SAVE
bcc @printTitleChar
lda #" "
+HIDE_NEXT_2_BYTES
@printTitleChar
lda (SRC),y ; copy game title to UI line 2
sta UILine2,y
cpy #MaxInputLength+1
bcc -
ldx #8
- lda ReturnToPlay,x ; replace games count with 'to play' label
sta UI_ToPlay,x
dex
bpl -
ldx @index
jsr BuildUILine1WithNoDots ; build UI line 1 with bars and other shapes
ldx @index
jsr DrawSearchBarOffscreen ; actually draw the UI (offscreen)
jmp ShowOtherPage ; now show everything at once
;------------------------------------------------------------------------------
; indices into BrowseDispatchTable
kBrowseSearch = 0
kBrowsePrevious = 1
kBrowseNext = 2
kBrowseExitToSearch = 3
kBrowseTab = 4
kBrowseLaunch = 5
kBrowseCredits = 6
kBrowseCheat = 7
.BrowseDispatchTableLo
!byte <.OnSearch
!byte <.OnPrevious
!byte <.OnNext
!byte <SearchMode
!byte <.OnTab
!byte <.OnLaunch
!byte <Credits
!byte <.OnCheat
.BrowseDispatchTableHi
!byte >.OnSearch
!byte >.OnPrevious
!byte >.OnNext
!byte >SearchMode
!byte >.OnTab
!byte >.OnLaunch
!byte >Credits
!byte >.OnCheat
kNumBrowseKeys = 11 ; number of entries in next 2 tables (each)
.BrowseKeys
!byte $83 ; Ctrl-C = toggle cheat mode
!byte $AF ; '/' = credits
!byte $BF ; '?' = credits
!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
.BrowseKeyDispatch
!byte kBrowseCheat
!byte kBrowseCredits
!byte kBrowseCredits
!byte kBrowseTab
!byte kBrowseTab
!byte kBrowseLaunch
!byte kBrowseExitToSearch
!byte kBrowseNext
!byte kBrowseNext
!byte kBrowsePrevious
!byte kBrowsePrevious
BrowseSelectedIndex
!byte $FF
}