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

393 lines
10 KiB
Plaintext
Raw Normal View History

2018-12-23 16:13:47 +00:00
;license:MIT
;(c) 2018 by 4am
;
; Search Mode - incrementally search game catalog
;
; Public functions
; - SearchMode
;
2019-06-18 18:56:05 +00:00
; indices into InputDispatchTable
kInputSearch = 0
kInputClear = 1
kInputBack = 2
kInputLaunch = 3
2019-06-18 20:54:15 +00:00
2019-06-18 18:56:05 +00:00
InputDispatchTable
!word OnSearch
!word OnClear
!word OnBack
!word OnLaunch
2018-12-23 16:13:47 +00:00
SearchMode
jsr Home
2018-12-23 16:13:47 +00:00
2019-06-18 18:56:05 +00:00
lda #0
sta OffscreenPage
2019-06-18 18:56:05 +00:00
sta InputLength
2019-06-20 03:05:48 +00:00
jsr _UpdateGameCount
2018-12-23 16:13:47 +00:00
jsr OnInputChanged ; draw default UI on HGR page 1
2019-06-18 18:56:05 +00:00
bit $C052
bit $C057
bit $C050
bit $C010
jsr _ResetInputTimeout
2019-06-21 17:10:29 +00:00
_SearchModeInputLoop
2019-06-18 18:56:05 +00:00
- lda $C000
2019-06-21 17:10:29 +00:00
bmi @gotKey
inc $4F ; these are only ever incremented, never
bne + ; reset (used as a pseudorandom seed)
inc $4E
+
dec $50 ; these are a 3-byte timeout counter
bne - ; that counts down from a number set
dec $51 ; in _ResetInputTimeout and reset
bne - ; on every keypress (whether or not
dec $52 ; the key leads to an action)
bne -
lda #kAttractMode ; no input for ~30 seconds
sta Mode ; switch to attract mode
2019-06-21 17:17:57 +00:00
jmp _CoverFade
2019-06-21 17:10:29 +00:00
@gotKey
2019-06-20 18:18:23 +00:00
jsr _ResetInputTimeout
2019-06-21 17:10:29 +00:00
cmp #$9B ; Esc clears the input buffer (if any)
bne + ; or switches to attract mode
2019-06-20 18:18:23 +00:00
ldx #kInputClear
bne InputDispatch ; always branches
+
cmp #$8D ; ENTER launches the current game (if any)
bne +
ldx #kInputLaunch
bne InputDispatch ; always branches
+
2019-06-18 18:56:05 +00:00
bit $C010
and #$7F
cmp #$7F ; delete key
bne +
- ldx #kInputBack
2019-06-18 18:56:05 +00:00
bne InputDispatch ; always branches
+ cmp #$08 ; left arrow = delete
beq -
cmp #$30 ; control keys and punctuation ignored
bcc @badkey
cmp #$3A ; numbers are good input
bcc @goodkey
cmp #$41 ; more punctuation (also ignored)
bcc @badkey
cmp #$5B ; uppercase letters are good input
bcs +
ora #$20 ; convert uppercase letters to lowercase
bne @goodkey ; always branches
+ cmp #$61 ; more punctuation (also ignored)
bcc @badkey
cmp #$7B ; lowercase letters are good input
bcc @goodkey
; execution falls through here
@badkey
jsr SoftBell ; beep on invalid input
2019-06-21 17:10:29 +00:00
jmp _SearchModeInputLoop ; and start over
2019-06-18 18:56:05 +00:00
@goodkey
ldx #kInputSearch
2019-06-18 18:56:05 +00:00
; execution falls through here
InputDispatch
pha ; save key pressed
txa
asl
tax
lda InputDispatchTable,x
sta @j+1
lda InputDispatchTable+1,x
sta @j+2
pla ; restore key pressed
@j jsr $FDFD ; SMC
2019-06-21 17:10:29 +00:00
jmp _SearchModeInputLoop
2018-12-23 16:13:47 +00:00
OnClear
ldx InputLength
bne +
2019-06-21 17:17:57 +00:00
jsr _CoverFade
2019-06-20 18:18:23 +00:00
pla ; Esc with no input exits search mode
pla ; and switches to attract mode
rts
+ ldx #0
stx InputLength
2019-06-21 17:10:29 +00:00
bit $C010
jmp OnInputChanged
OnBack
2018-12-23 16:13:47 +00:00
ldx InputLength
2019-06-18 18:56:05 +00:00
bne +
jsr SoftBell
rts
+ dec InputLength
2019-06-21 17:10:29 +00:00
bit $C010
2019-06-18 18:56:05 +00:00
jmp OnInputChanged
2018-12-23 16:13:47 +00:00
OnLaunch
2019-06-20 18:18:23 +00:00
ldx SelectedIndex
cpx #$FF
beq +
pla ; Return exits search mode
pla ; and launches game
+ rts
2018-12-23 16:13:47 +00:00
OnSearch
2019-06-18 18:56:05 +00:00
ldx InputLength
cpx #MaxInputLength
bne +
jsr SoftBell
rts
+ sta InputBuffer,x
inc InputLength
; execution falls through here
2018-12-23 16:13:47 +00:00
OnInputChanged
2019-06-18 18:56:05 +00:00
lda InputLength
bne @findMatchingTitle
; no input, reset params and UI
lda #$FF
sta SelectedIndex ; no game selected
2019-06-18 21:07:14 +00:00
ldx #40 ; reset visible line
lda #0
- sta UILine1-1,x
dex
bne -
2019-06-18 18:56:05 +00:00
ldy #MaxInputLength ; clear visible search bar
lda #" "
- sta UILine2+1,y
dey
bne -
lda #$7F
sta UILine2+1
2019-06-21 17:10:29 +00:00
jsr _LoadCoverOffscreen
jsr _DrawSearchBarOffscreen
jmp _ShowOtherPage
2019-06-18 18:56:05 +00:00
@findMatchingTitle
2019-06-18 21:07:14 +00:00
jsr ResetTextRank
2018-12-23 16:13:47 +00:00
2019-06-18 21:07:14 +00:00
jsr okvs_iter_values ; iterate through all game titles
!word gGamesListStore ; and rank them for the best match
!word TextRankCallback ; to the current input buffer
2018-12-23 16:13:47 +00:00
lda MatchCount ; any matches at all?
bne +
2019-06-18 18:56:05 +00:00
jsr SoftBell ; no matches for this input buffer, beep
dec InputLength ; and ignore the last key typed
rts
+
lda BestMatchIndex ; check if the new best match is the same
cmp SelectedIndex ; as the current best match
php ; (we'll use this later to skip reloading)
sta SelectedIndex
sta @index
jsr okvs_nth
2018-12-23 16:13:47 +00:00
!word gGamesListStore
@index !byte $FD
+STAY @key
plp
bne +
lda OffscreenPage
eor #$01
sta OffscreenPage
jmp @skipload
+
lda OffscreenPage ; we have a new best match, so load the
beq + ; new title screenshot (offscreen)
lda #$40
+HIDE_NEXT_2_BYTES
+ lda #$20
sta @titleaddress+1
+LDADDR kHGRTitleDirectory
jsr SetPath
+LDAY @key
jsr AddToPath
jsr LoadFileAt
@titleaddress
!word $FD00
2018-12-23 16:13:47 +00:00
@skipload
2018-12-23 16:13:47 +00:00
jsr okvs_get
!word gGamesListStore
@key !word $FDFD
2019-06-18 18:56:05 +00:00
+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
2019-06-20 03:05:48 +00:00
bcc @printTitleChar
beq @printCursor
2019-06-18 18:56:05 +00:00
lda #" "
+HIDE_NEXT_2_BYTES
2019-06-20 03:05:48 +00:00
@printCursor
lda #$7F
+HIDE_NEXT_2_BYTES
@printTitleChar
lda (SRC),y ; copy game title to search UI
2019-06-18 18:56:05 +00:00
sta UILine2,y
cpy #MaxInputLength+1
bcc -
2018-12-23 16:13:47 +00:00
2019-06-18 21:07:14 +00:00
ldx #40
lda #0
- sta UILine1-1,x ; reset search bar
2019-06-18 21:07:14 +00:00
dex
bne -
tay
2019-06-18 20:54:15 +00:00
- lda (SRC),y
+LOW_ASCII_TO_LOWER
cmp InputBuffer,x
bne +
lda #$0B ; add dots to highlight matched characters
2019-06-18 21:07:14 +00:00
sta UILine1,y
2019-06-18 20:54:15 +00:00
inx
cpx InputLength
beq @doneHighlight
+ inc HTAB
iny
2019-06-18 21:07:14 +00:00
cpy #40
2019-06-18 20:54:15 +00:00
bne -
@doneHighlight
jsr _DrawSearchBarOffscreen; actually draw the search UI (offscreen)
jmp _ShowOtherPage ; now show everything at once
2018-12-23 16:13:47 +00:00
2019-06-21 17:10:29 +00:00
;------------------------------------------------------------------------------
_LoadCoverOffscreen
lda OffscreenPage
beq +
lda #$40
+HIDE_NEXT_2_BYTES
+ lda #$20
sta @coveraddress+1
+LDADDR Cover
jsr SetPath
jsr LoadFileAt ; load default background
@coveraddress
!word $FD00 ; SMC
rts
_DrawSearchBarOffscreen
lda #22 ; draw visible search bar
2019-06-18 21:07:14 +00:00
sta VTAB
lda OffscreenPage
ror ; draw on offscreen page
2019-06-18 21:07:14 +00:00
+LDADDR UILine1
jsr Draw40Chars
lda OffscreenPage
ror ; draw on offscreen page
2019-06-18 21:07:14 +00:00
+LDADDR UILine2
jmp Draw40Chars
2019-06-18 21:07:14 +00:00
_ShowOtherPage
lda OffscreenPage
eor #$01
sta OffscreenPage
bne +
2019-06-18 18:56:05 +00:00
bit $C055 ; show page 2
rts
+ bit $C054 ; show page 1
2019-06-18 18:56:05 +00:00
rts
2019-06-20 03:05:48 +00:00
_UpdateGameCount
jsr okvs_len
!word gGamesListStore
sta SAVE
ldy #0
@outer
lda #0
pha
@inner
lda SAVE
cmp @powersOfTen,y
bcc @digitDone
sbc @powersOfTen,y
sta SAVE
lda SAVE+1
sbc #0
sta SAVE+1
pla
adc #0
pha
jmp @inner
@digitDone
pla
ora #$30
sta UILine2_GameCount,y
iny
cpy #$03
bcc @outer
rts
@powersOfTen
!byte 100
!byte 10
!byte 1
_ResetInputTimeout
; clobbers X, preserves A/Y
2019-06-21 17:10:29 +00:00
ldx #$16
stx $50 ; timeout counter
stx $51
stx $52
rts
2019-06-21 17:10:29 +00:00
_CoverFade
jsr _LoadCoverOffscreen
jsr _ShowOtherPage
lda OffscreenPage
bne +
jsr _LoadCoverOffscreen
jsr _ShowOtherPage
+
; load transition effect code at $6000
+LDADDR kFXDirectory
jsr SetPath
+LDADDR kFXCoverFade
jsr AddToPath
jsr LoadFile
jmp $6000
kFXCoverFade
!byte 9
!text "COVERFADE"
2018-12-23 16:13:47 +00:00
Cover !byte 5
!text "COVER"
UILine1
!byte 0,0,0,0,0,0,0,0,0,0
!byte 0,0,0,0,0,0,0,0,0,0
!byte 0,0,0,0,0,0,0,0,0,0
!byte 0,0,0,0,0,0,0,0,0,0
UILine2
!text "["
!byte $7F
!text " "
2019-06-20 03:05:48 +00:00
!text "] "
UILine2_GameCount
!text "000 games"
OffscreenPage
!byte 1 ; 0 = currently showing HGR page 2
; (so offscreen is page 1 @ $2000)
; 1 = currently showing HGR page 1
; (so offscreen is page 2 @ $4000)