refactor PlayGame

This commit is contained in:
4am 2019-09-20 23:26:32 -04:00
parent 10e3d05f07
commit 8e19fc9c5b
10 changed files with 74 additions and 143 deletions

View File

@ -9,7 +9,7 @@
; D000..E5F4 - persistent data structures (per-game cheat categories,
; gGlobalPrefsStore, gGamesListStore)
; ...unused...
; EAE5..FFF9 - main program code
; EB42..FFF9 - main program code
; FFFA..FFFF - NMI, reset, IRQ vectors
;
; LC RAM BANK 2

View File

@ -5,15 +5,9 @@
;
; Public functions
; - GetGameDisplayName
; - PlayGameFromSearch
; - PlayGameFromBrowse
; - PlayGameFromAttract
; - PlayGame
; - Launch
;
; Public variables
; - gCurrentAttractIndex ; [byte] numeric index in gAttractModeStore of current Mega-Attract Module
; - gCurrentlyVisibleSlideshowIndex ; [byte] numeric index in gSlideshowStore of currently visible slideshow picture
; (only valid during slideshows, not updated once a key is pressed)
!zone {
@ -23,6 +17,9 @@ GetGameDisplayName
; X = #$EA if we should also look in gSlideshowStore
; out: C clear if game exists in gGamesListStore, and
; A/Y points to game display name (but see hack notes below)
; X = game index, or #$FF if the game doesn't really exist but
; we want to return a successful result anyway (really, read the
; hack notes, they're important)
; C set if game does not exist (this can happen because slideshows
; list games that require a joystick, but the games list parser
; filters out joystick-only games if the machine doesn't have a
@ -67,70 +64,16 @@ GetGameDisplayName
rts
@forceGoodResult
+LDAY @key
ldx #$FF
clc
@exit rts
PlayGameFromSearch
PlayGameFromBrowse
; in: X = game index
PlayGame
gGameToLaunch=*+1
ldx #$FF ; SMC
+LDADDR gGamesListStore
jsr okvs_nth
; A/Y = address of game filename
bne .Go ; always branches
PlayGameFromAttract
; in: none
jsr LoadAndParseAttractModeConf
+LDADDR gAttractModeStore
gCurrentAttractIndex=*+1
ldx #$FD ; set in MegaAttractMode
jsr okvs_nth ; get filename of current attract-mode module
+STAY @key
jsr okvs_get
!word gAttractModeStore
@key !word $FDFD ; SMC
; A/Y = address of attract mode value (module type)
+STAY PTR
ldy #1
lda (PTR),y
and #$0F
bne @playFromSlideshow
; we reached here by pressing <RETURN> during a self-running demo,
; which means that @key points to the filename of the game we want to play,
+LDAY @key
jmp .Go
@playFromSlideshow
; we reached here by pressing <RETURN> during a slideshow
; gSlideshowStore is still in memory, and gCurrentlyVisibleSlideshowIndex
; is the index into gSlideshowStore of the picture that is being displayed
+LDADDR gSlideshowStore
gCurrentlyVisibleSlideshowIndex=*+1
ldx #$FD ; set in HGRTitleCallback, HGRActionCallback, DHGRTitleCallback
jsr okvs_nth
!word gSlideshowStore
+STAY @sskey
+STAY @sskey2
jsr okvs_get
!word gGamesListStore
@sskey !word $FDFD ; SMC
bcs +
+LDAY @sskey ; the slideshow key was a game filename, so use that
jmp .Go
+
; if the key is not found, get the value of the current record
; from gSlideshowStore instead (some games have multiple action screenshots, so
; the key is just a unique filename for that screenshot and the value is the
; actual game filename)
jsr okvs_get
!word gSlideshowStore
@sskey2 !word $FDFD ; SMC
; execution falls through here
.Go
; in: A/Y = lo/hi address of filename
+STAY SAVE
+STAY +
+STAY @pfile
@ -141,7 +84,7 @@ gCurrentlyVisibleSlideshowIndex=*+1
ldx #$40 ; to flash previous bits of the launcher UI)
ldy #$00
tya
@clear sta $FD00,y
@clear sta $FD00,y ; SMC
iny
bne @clear
inc @clear+2

View File

@ -29,8 +29,6 @@ InputLength
!byte 0
InputBuffer
!text " "
SelectedIndex
!byte $FF
MatchCount
!byte 0
BestMatchScore

View File

@ -108,17 +108,15 @@ kDFXConfFile
@exit rts
+
+STAY @tfname
stx gCurrentlyVisibleSlideshowIndex
; try to get the human-readable name of this game from gGamesListStore
; find this game in gGamesListStore
ldx #$60
jsr GetGameDisplayName
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
bcs @exit
; (we don't actually use the display name in the title slideshow, we just
; reuse the function for convenience)
stx gGameToLaunch
; load DHGR screenshot at $4000/main and $4000/aux
jsr LoadDHRFile
@ -147,18 +145,15 @@ kDFXConfFile
rts
+
+STAY @afname
stx gCurrentlyVisibleSlideshowIndex
; try to get the human-readable name of this game from gGamesListStore
; or gSlideshowStore
; find this game in gGamesListStore or gSlideshowStore
ldx #$EA
jsr GetGameDisplayName
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
; if game name is not found (C will be set here), it means the game
; can't be played due to memory or joystick requirements, so we hide
; it from slideshows
bcs @actionExit
; (we don't actually use the display name in the DHGR action slideshow, we
; just reuse the function for convenience)
stx gGameToLaunch
; load DHGR screenshot at $4000/main and $4000/aux
jsr LoadDHRFile

View File

@ -91,18 +91,15 @@ kGRFizzleFile
rts
+
+STAY @fname
stx gCurrentlyVisibleSlideshowIndex
; try to get the human-readable name of this game from gGamesListStore
; or gSlideshowStore
; find this game in gGamesListStore or gSlideshowStore
ldx #$EA
jsr GetGameDisplayName
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
; if game name is not found (C will be set here), it means the game
; can't be played due to memory or joystick requirements, so we hide
; it from slideshows
bcs @actionExit
; (we don't actually use the display name in the GR action slideshow, we
; just reuse the function for convenience)
stx gGameToLaunch
jsr LoadFile ; load GR screenshot into $6000
!word kGRActionDirectory

View File

@ -52,17 +52,15 @@ HGRSingle
@exit rts
+
+STAY @tfname
stx gCurrentlyVisibleSlideshowIndex
; try to get the human-readable name of this game from gGamesListStore
; find this game in gGamesListStore
ldx #$60
jsr GetGameDisplayName
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
bcs @exit
; (we don't actually use the display name in the title slideshow, we just
; reuse the function for convenience)
stx gGameToLaunch
jsr LoadFile ; load HGR screenshot at $4000
!word kHGRTitleDirectory
@ -91,10 +89,8 @@ HGRSingle
rts
+
+STAY @afname
stx gCurrentlyVisibleSlideshowIndex
; try to get the human-readable name of this game from gGamesListStore
; or gSlideshowStore
; find this game in gGamesListStore or gSlideshowStore
ldx #$EA
jsr GetGameDisplayName
; if game name is not found (C will be set here), it means the game
@ -104,6 +100,7 @@ HGRSingle
; found the game
+STAY SAVE
stx gGameToLaunch
jsr LoadFile ; load HGR screenshot at $4000
!word kHGRActionDirectory

View File

@ -1,12 +1,12 @@
;license:MIT
;(c) 2018-9 by 4am
;
; Mega Attract Mode - cycle through slideshows and self-running demos
; Attract Mode - cycle through slideshows and self-running demos
;
; Public functions
; - MegaAttractMode
; - MiniAttractMode
; - RunAttractModule
; - LoadAndParseAttractModeConf
;------------------------------------------------------------------------------
; MegaAttractMode
@ -24,7 +24,14 @@ MegaAttractMode
jsr BlankHGR ; switch to HGR page 1 (once cleared)
jsr LoadAndParseAttractModeConf
jsr LoadFile ; load attract-mode configuration file into $8000
!word kRootDirectory
!word kAttractModeConfFile
- !word $8000
jsr ParseKeyValueList ; parse attract-mode configuration into OKVS data structure at $6000
!word gAttractModeStore
!word -
!byte 0
jsr pref_get ; get attract mode module from prefs
!word kNextAttract
@ -52,7 +59,7 @@ MegaAttractMode
bpl @jmpattract
cmp #$8D ; Enter plays the game shown on screen.
bne @jmpsearch ; Any other key switches to Search Mode.
jsr PlayGameFromAttract ; Might return if user hits Ctrl-Reset.
jsr PlayGame ; (might return if user hits Ctrl-Reset)
@jmpattract
jmp MegaAttractMode
@jmpsearch
@ -146,6 +153,10 @@ RunAttractModule
jsr GetGameDisplayName
bcc + ; if game doesn't exist, skip the demo
rts
+
cpx #$FF
beq +
stx gGameToLaunch
+
jsr Home ; avoid seeing code load into the HGR page
@ -223,17 +234,6 @@ RunAttractModule
!byte >SHRSingle
!byte >GRSingle
LoadAndParseAttractModeConf
; TODO refactor launch code then make this private
jsr LoadFile ; load attract-mode configuration file into $8000
!word kRootDirectory
!word @AttractModeConfFile
- !word $8000
jsr ParseKeyValueList ; parse attract-mode configuration into OKVS data structure at $6000
!word gAttractModeStore
!word -
!byte 0
rts
@AttractModeConfFile
kAttractModeConfFile
!byte 12
!text "ATTRACT.CONF"

View File

@ -69,10 +69,18 @@ kSFXFizzleFile
.SHRArtworkCallback
bit KBD
bpl +
rts
@exit rts
+
+STAY @sfname
stx gCurrentlyVisibleSlideshowIndex
; find this game in gGamesListStore
ldx #$60
jsr GetGameDisplayName
; if game is not found (C will be set here), it means it can't be played on
; this machine due to memory or joystick requirements, so we don't display
; it in slideshows
bcs @exit
stx gGameToLaunch
jsr .BlankSHR

View File

@ -20,8 +20,6 @@
BrowseMode
ldx #$FF
txs
ldx SelectedIndex
stx BrowseSelectedIndex
.BrowseModeInputLoop
jsr WaitForKeyFor30Seconds
@ -58,12 +56,12 @@ BrowseMode
jmp SearchMode
.OnPrevious
dec BrowseSelectedIndex
dec gGameToLaunch
jmp +
.OnNext
inc BrowseSelectedIndex
inc gGameToLaunch
+
ldx BrowseSelectedIndex
ldx gGameToLaunch
cpx #$FF
bne @notTooSmall
GameCount = *+1
@ -74,12 +72,11 @@ GameCount = *+1
cpx GameCount
bcc @done
ldx #0
@done stx BrowseSelectedIndex
@done stx gGameToLaunch
jmp .OnBrowseChanged
.OnLaunch
ldx BrowseSelectedIndex
jsr PlayGameFromBrowse
jsr PlayGame
jsr BlankHGR
jmp .ForceBrowseChanged
@ -88,13 +85,13 @@ GameCount = *+1
beq .ForceBrowseChanged ; always branches because Z=1 on exit from ToggleCheat
.OnTab
ldx BrowseSelectedIndex
ldx gGameToLaunch
jsr MiniAttractMode
cmp #$8D
beq .OnLaunch
.ForceBrowseChanged
bit CLEARKBD
ldx BrowseSelectedIndex
ldx gGameToLaunch
; execution falls through here
.OnBrowseChanged
+LDADDR gGamesListStore
@ -132,9 +129,9 @@ GameCount = *+1
sta UI_ToPlay,x
dex
bpl -
ldx BrowseSelectedIndex
ldx gGameToLaunch
jsr BuildUILine1WithNoDots; build UI line 1 with bars and other shapes
ldx BrowseSelectedIndex
ldx gGameToLaunch
jsr DrawSearchBarOffscreen; actually draw the UI (offscreen)
jmp ShowOtherPage ; now show everything at once
@ -194,8 +191,4 @@ kNumBrowseKeys = 11 ; number of entries in next 2 tables (each)
!byte kBrowseNext
!byte kBrowsePrevious
!byte kBrowsePrevious
BrowseSelectedIndex
!byte $FF
}

View File

@ -20,7 +20,7 @@
SearchMode
ldx #$FF
txs
stx SelectedIndex ; $FF = no game selected
stx gGameToLaunch ; $FF = no game selected
inx
stx OffscreenPage ; $00 = currently showing HGR page 2
jsr Home ; clear screen (switches to text mode)
@ -90,7 +90,7 @@ SearchMode
jmp .OnInputChanged
.OnTab
ldx SelectedIndex
ldx gGameToLaunch
cpx #$FF
beq .OnError
jsr MiniAttractMode
@ -100,15 +100,15 @@ SearchMode
rts
.OnLaunch
ldx SelectedIndex
ldx gGameToLaunch
cpx #$FF
beq .OnError
jsr PlayGameFromSearch
jsr PlayGame
sec ; tell caller to redraw UI
rts
.OnCheat
dec SelectedIndex ; force reload (will be reset to correct value in .OnInputChanged)
dec gGameToLaunch ; force reload (will be reset to correct value in .OnInputChanged)
jsr ToggleCheat
beq .OnInputChanged ; always branches because Z=1 on exit from ToggleCheat
@ -124,7 +124,7 @@ SearchMode
bne @findMatchingTitle
; no input, reset params and UI
lda #$FF
sta SelectedIndex ; no game selected
sta gGameToLaunch ; no game selected
ldx #39 ; copy instructions to line 2
- lda Instructions,x
sta UILine2,x
@ -153,9 +153,9 @@ SearchMode
jmp .OnError ; beep and return
+
ldx BestMatchIndex ; check if the new best match is the same
cpx SelectedIndex ; as the current best match
cpx gGameToLaunch ; as the current best match
php ; (we'll use this later to skip reloading)
stx SelectedIndex
stx gGameToLaunch
+LDADDR gGamesListStore
jsr okvs_nth ; get the name of the new best match
+STAY @key
@ -204,7 +204,7 @@ SearchMode
dex
bpl -
ldx SelectedIndex
ldx gGameToLaunch
jsr BuildUILine1WithNoDots; build UI line 1 with bars and other shapes
; now add dots to UI line 1 to highlight matched characters
@ -225,7 +225,7 @@ SearchMode
cpy SAVE ; if game name is exhausted, we're done
bne @dotloop
@doneHighlight
ldx SelectedIndex
ldx gGameToLaunch
jsr DrawSearchBarOffscreen; actually draw the search UI (offscreen)
jmp ShowOtherPage ; now show everything at once