;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 .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 }