From 07e82a5aad38148c5e479621f29b445ef025dfbb Mon Sep 17 00:00:00 2001 From: 4am Date: Tue, 2 Nov 2021 21:49:41 -0400 Subject: [PATCH] remove GAMES.CONF --- Makefile | 10 +--- bin/buildaction.sh | 10 +++- bin/buildtitle.sh | 33 +++++++++++++ res/ATTRACT.CONF | 2 +- res/SS/ACTIONCD1.CONF | 2 +- res/SS/ACTIONCD6.CONF | 2 +- res/SS/ACTIONMNO3.CONF | 2 +- res/SS/ACTIONS5.CONF | 2 +- src/4cade.a | 2 - src/4cade.init.a | 22 +-------- src/constants.a | 4 +- src/glue.launch.a | 104 ++++++++++++++++++----------------------- src/macros.a | 2 +- src/parse.common.a | 1 - src/parse.games.a | 98 -------------------------------------- src/ui.attract.dhgr.a | 5 +- src/ui.attract.gr.a | 4 -- src/ui.attract.hgr.a | 8 +--- src/ui.attract.mode.a | 35 ++++++++------ src/ui.attract.shr.a | 4 +- 20 files changed, 120 insertions(+), 232 deletions(-) create mode 100755 bin/buildtitle.sh delete mode 100644 src/parse.games.a diff --git a/Makefile b/Makefile index 15aa99925..ae11cc837 100644 --- a/Makefile +++ b/Makefile @@ -50,7 +50,6 @@ dsk: asm index res/TITLE \ res/COVER \ res/HELP \ - build/GAMES.CONF \ build/PREFS.CONF \ build/CREDITS \ build/HELPTEXT \ @@ -127,13 +126,6 @@ index: md asmfx asmprelaunch # [ -f build/GAMES.CONF ] || (awk '!/^$$|^#/' < res/GAMES.CONF > build/GAMES.CONF) # -# create gGamesListStore indexes -# -# grep "^00" < build/GAMES.CONF | bin/buildgamesstore.sh > build/GAMES00.IDX -# grep "^0" < build/GAMES.CONF | bin/buildgamesstore.sh > build/GAMES01.IDX -# grep "^.0" < build/GAMES.CONF | bin/buildgamesstore.sh > build/GAMES10.IDX -# cat build/GAMES.CONF | bin/buildgamesstore.sh > build/GAMES11.IDX -# # create gSearchStore indexes # [ -f build/DISPLAY.CONF ] || (bin/builddisplaynames.py < build/GAMES.CONF > build/DISPLAY.CONF) @@ -161,7 +153,7 @@ index: md asmfx asmprelaunch [ -f build/SLIDESHOW.IDX ] || ((for f in res/SS/*; do \ [ $$(echo "$$(basename $$f)" | cut -c-3) = "ACT" ] && \ bin/buildaction.sh build/DISPLAY.CONF < "$$f" > "build/SS/$$(basename $$f)" || \ - bin/buildokvs.sh < "$$f" > "build/SS/$$(basename $$f)"; \ + bin/buildtitle.sh build/DISPLAY.CONF < "$$f" > "build/SS/$$(basename $$f)"; \ echo "$$(basename $$f)"; \ done) | bin/buildindexedfile.sh -p -a build/TOTAL.DATA build/SS > build/SLIDESHOW.IDX) [ -f build/MINIATTRACT.IDX ] || ((for f in res/ATTRACT/*; do \ diff --git a/bin/buildaction.sh b/bin/buildaction.sh index 5938cd2c6..2ebd824ac 100755 --- a/bin/buildaction.sh +++ b/bin/buildaction.sh @@ -1,5 +1,7 @@ #!/bin/bash +games=$(cat "$1") + # make temp file with just the key/value pairs (strip blank lines, comments, eof marker) records=$(mktemp) awk '!/^$|^#|^\[/' > "$records" @@ -10,14 +12,18 @@ source=$(mktemp) echo "!le16 $(wc -l <"$records"), 0" # OKVS header while IFS="=" read -r key value; do [ -n "$value" ] && filename="$value" || filename="$key" - displayname=$(awk -F= '/,'"$filename"'=/ { print $2 }' "$1") - echo "!byte ${#key}+${#value}+${#displayname}+4" # OKVS record length + line=$(echo "$games" | awk '/,'"$filename"'=/') + needsjoystick=$(echo "$line" | cut -c1) # 'requires joystick' flag (0 or 1) + needs128k=$(echo "$line" | cut -c2) # 'requires 128K' flag (0 or 1) + displayname=$(echo "$line" | awk -F= '{ print $2 }') + echo "!byte ${#key}+${#value}+${#displayname}+5" # OKVS record length echo "!byte ${#key}" # OKVS key length echo "!text \"$key\"" # OKVS key echo "!byte ${#value}" # OKVS value length echo "!text \"$value\"" # OKVS value echo "!byte ${#displayname}" echo "!text \"$displayname\"" + echo "!byte $((needsjoystick*128))+$((needs128k*64))" done < "$records") > "$source" # assemble temp source file into binary OKVS data structure, then output that diff --git a/bin/buildtitle.sh b/bin/buildtitle.sh new file mode 100755 index 000000000..549b4b51c --- /dev/null +++ b/bin/buildtitle.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +games=$(cat "$1") + +# make temp file with just the key/value pairs (strip blank lines, comments, eof marker) +records=$(mktemp) +awk '!/^$|^#|^\[/' > "$records" + +# make temp assembly source file that represents the binary OKVS data structure +source=$(mktemp) +(echo "*=0" # dummy program counter for assembler + echo "!le16 $(wc -l <"$records"), 0" # OKVS header + while read -r filename; do + line=$(echo "$games" | awk '/,'"$filename"'=/') + needsjoystick=$(echo "$line" | cut -c1) # 'requires joystick' flag (0 or 1) + needs128k=$(echo "$line" | cut -c2) # 'requires 128K' flag (0 or 1) + echo "!byte ${#filename}+3" # OKVS record length + echo "!byte ${#filename}" # OKVS key length + echo "!text \"$filename\"" # OKVS key + [ -z "$line" ] && \ + echo "!byte 0" || \ + echo "!byte $((needsjoystick*128))+$((needs128k*64))" + done < "$records") > "$source" + +# assemble temp source file into binary OKVS data structure, then output that +out=$(mktemp) +acme -o "$out" "$source" +cat "$out" + +# clean up +rm "$out" +rm "$source" +rm "$records" diff --git a/res/ATTRACT.CONF b/res/ATTRACT.CONF index de59151cc..e2aeb90f9 100644 --- a/res/ATTRACT.CONF +++ b/res/ATTRACT.CONF @@ -380,7 +380,7 @@ ACTDHGR16.CONF=4 ACTIONS6.CONF=2 MNO4.CONF=1 N.O.R.A.D=0 -ACTIONCD6.CONF=2 +#ACTIONCD6.CONF=2 T4.CONF=1 SHR20.CONF=5 diff --git a/res/SS/ACTIONCD1.CONF b/res/SS/ACTIONCD1.CONF index af9e8fb87..5385eac3a 100644 --- a/res/SS/ACTIONCD1.CONF +++ b/res/SS/ACTIONCD1.CONF @@ -3,6 +3,7 @@ # DROL +COMMANDO CS CROSSFIRE DONKEY.KONG2=DONKEY.KONG @@ -10,7 +11,6 @@ DUNG.BEETLES2=DUNG.BEETLES DJ3=DJ CHIVALRY DIAMOND.MINE -COMMANDO DIVE.BOMBER2=DIVE.BOMBER [eof] diff --git a/res/SS/ACTIONCD6.CONF b/res/SS/ACTIONCD6.CONF index 4274e781b..98e57d049 100644 --- a/res/SS/ACTIONCD6.CONF +++ b/res/SS/ACTIONCD6.CONF @@ -3,6 +3,7 @@ # DM +CHOPLIFTER CONGO CQ2=CQ DJ @@ -10,7 +11,6 @@ CR2=CR DEEP.SPACE2=DEEP.SPACE DRELBS COUNTY.FAIR -CHOPLIFTER CHIVALRY6=CHIVALRY COSMIC.COMBAT2=COSMIC.COMBAT DOGFIGHT.II diff --git a/res/SS/ACTIONMNO3.CONF b/res/SS/ACTIONMNO3.CONF index 5bd07ccde..61c433c56 100644 --- a/res/SS/ACTIONMNO3.CONF +++ b/res/SS/ACTIONMNO3.CONF @@ -10,7 +10,7 @@ NT2=NT MICROWAVE2=MICROWAVE MINER.2049ER2=MINER.2049ER MAXWELL.MANOR2=MAXWELL.MANOR -MATING.ZONE +#MATING.ZONE MAD.BOMBER NEON diff --git a/res/SS/ACTIONS5.CONF b/res/SS/ACTIONS5.CONF index 4a0b0c273..029ddf0ee 100644 --- a/res/SS/ACTIONS5.CONF +++ b/res/SS/ACTIONS5.CONF @@ -11,7 +11,7 @@ STAR.BLAZER SPACE.RAIDERS SPACE.KADET SPIDER.RAID -SABOTAGE +#SABOTAGE SEA.DRAGON2=SEA.DRAGON [eof] diff --git a/src/4cade.a b/src/4cade.a index 6deb711a7..c0eb6ca89 100644 --- a/src/4cade.a +++ b/src/4cade.a @@ -131,8 +131,6 @@ gGlobalPrefsStore ; flips out if it has certain values (it will ; be set to $55 as part of the 64K memory test, ; which is apparently one of the acceptable values) -gGamesListStore - !word $FDFD ; SMC SwitchToBank2 +READ_RAM2_WRITE_RAM2 rts diff --git a/src/4cade.init.a b/src/4cade.init.a index a2dd573ce..06c18164f 100644 --- a/src/4cade.init.a +++ b/src/4cade.init.a @@ -342,7 +342,6 @@ PrintAsDecimal !source "src/hw.accel.a" !source "src/hw.vbl.init.a" !source "src/parse.common.a" - !source "src/parse.games.a" OneTimeSetup lda zpMachineStatus @@ -381,20 +380,6 @@ CopyDevs !word gGlobalPrefsStore !word - !byte 16 - +LD16 SAVE - +ST16 PTR - jsr stepptr - +LD16 PTR ; (PTR) points to free space after the OKVS data structure we just created - +ST16 gGamesListStore ; save pointer to free space for next store - jsr LoadFile ; load games list file into $8200 - !word kRootDirectory - !word @kGameListConfFile -- !word $8200 - lda #$EA - sta AddValueDuringAppend - jsr ParseGamesList ; parse games list into OKVS data structure in LC RAM bank - !word gGamesListStore - !word - !ifndef RELEASE { +LD16 SAVE @@ -427,7 +412,8 @@ CopyDevs inx + stx gSearchHas128K - +LDADDR gGamesListStore + jsr ReloadSearchIndex + +LDADDR gSearchStore jsr okvs_len +LD16 WCOUNT +ST16 GameCount @@ -478,10 +464,6 @@ CopyDevs bit CLEARKBD jmp Reenter -@kGameListConfFile - !byte 10 - !text "GAMES.CONF" - @kPowersOfTen !byte 100 !byte 10 diff --git a/src/constants.a b/src/constants.a index 96f1d0368..db13881cc 100644 --- a/src/constants.a +++ b/src/constants.a @@ -6,11 +6,11 @@ ; YE OLDE GRAND UNIFIED MEMORY MAP ; ; LC RAM BANK 1 -; D000..DFE7 - persistent data structures (gGlobalPrefsStore, gGamesListStore) +; D001..D06E - persistent data structures (gGlobalPrefsStore) ; ...unused... ; E000..E3FF - HGR font data ; ...unused... -; E966..FFEE - main program code +; E994..FFEE - main program code ; FFEF..FFF9 - API functions and global constants available for main program ; code, prelaunchers, transition effects, &c. ; (LoadFileDirect, Wait/UnwaitForVBL, MockingboardStuff, MachineStatus) diff --git a/src/glue.launch.a b/src/glue.launch.a index 31e6d7b79..030161c72 100644 --- a/src/glue.launch.a +++ b/src/glue.launch.a @@ -12,11 +12,13 @@ ; - Launch ; ; Public variables: -; - gGameToLaunch - 0-based index into gGamesListStore (word) +; - gGameToLaunch - 0-based index into gSearchStore (word) ; gGameToLaunch !word $FFFF +gLastMegaAttractGame + !word $FFFF ;------------------------------------------------------------------------------ ; AnyGameSelected @@ -54,73 +56,56 @@ ForceGoodResult _gameToLaunchExit rts -;------------------------------------------------------------------------------ -; FindGame -; check if an arbitrary game exists, for some definition of 'exists' -; -; in: A/Y points to game filename -; out: C clear if game exists in gGamesListStore, and -; $WINDEX = game index, or #$FFFF if the game doesn't really -; exist but we want to return a successful result anyway -; C set if game does not exist (this can happen because slideshows -; list games that require a joystick, but the games list parser -; filters them out if the machine doesn't have a joystick) -; all registers clobbered -;------------------------------------------------------------------------------ -FindGame - +ST16 @key - jsr okvs_find - !word gGamesListStore -@key !word $FDFD ; SMC - bcc GlueLaunchRTS -; Hack to allow self-running demos that don't correspond to a game -; filename. If the name ends in a '.', accept it unconditionally. - ldx #$FF - stx WINDEX - stx WINDEX+1 - +LD16 @key - +ST16 PARAM - ldy #0 - lda (PARAM),y - tay - lda (PARAM),y - cmp #"." - beq ForceGoodResult - sec -GlueLaunchRTS - rts - ;------------------------------------------------------------------------------ ; FindGameInActionSlideshow ; check if an arbitrary game exists, for some definition of 'exists', while ; in the middle of a slideshow ; ; in: A/Y points to a key in gSlideshowStore -; out: C clear if game exists, and -; $WINDEX = game index, and -; A/Y points to game display name -; C set if game can't be found by any means +; out: C clear if game exists and is playable on current machine, and +; (SAVE) -> game display name, and +; (gLastMegaAttractGame) -> game filename +; C set otherwise +; clobbers $FF, PTR +; all registers clobbered ;------------------------------------------------------------------------------ FindGameInActionSlideshow - +ST16 @slideshowKey - jsr FindGame - bcc @GetGameDisplayName -; if the game was not found, try getting the value of the current record from -; gSlideshowStore (some games have multiple action screenshots, in which case -; the key is only the screenshot filename, and the value is the actual game -; filename) - jsr okvs_get - !word gSlideshowStore -@slideshowKey - !word $FDFD ; SMC - jsr FindGame - bcs GlueLaunchRTS - -@GetGameDisplayName - +LD16 @slideshowKey - jsr okvs_get_current - jsr okvs_get_current_PTR_is_already_set + +ST16 gLastMegaAttractGame + jsr okvs_get_current ; (PTR) -> OKVS value (filename or empty string) + ; Y=0 + lda (PTR), y + beq + +LD16 PTR + +ST16 gLastMegaAttractGame ++ jsr okvs_get_current_PTR_is_already_set ; (PTR) -> game display name + +LD16 PTR ; A/Y -> game display name + +ST16 SAVE ; (SAVE) -> game display name +FindGame + jsr okvs_get_current ; (PTR) -> game requirements bitfield + ; Y=0 + + ; check if game requires joystick + lda (PTR), y + sta $FF + bpl @check128K + lda MachineStatus + and #HAS_JOYSTICK + beq @failedCheck ; machine doesn't have joystick but game requires it + +@check128K + ; check if game requires 128K + bit $FF + bvc @passedAllChecks + lda MachineStatus + and #HAS_128K + beq @failedCheck ; machine doesn't have 128K but game requires it + +@passedAllChecks + clc + rts + +@failedCheck + sec rts ;------------------------------------------------------------------------------ @@ -135,6 +120,7 @@ FindGameInActionSlideshow PlayGame jsr GetGameToLaunch ; A/Y = address of game filename +PlayGameInAY +ST16 SAVE +ST16 @pfile diff --git a/src/macros.a b/src/macros.a index 87908fba1..ff0b5150f 100755 --- a/src/macros.a +++ b/src/macros.a @@ -441,7 +441,7 @@ } ; Macros for demo launchers that need to check whether they should run -; on the current machine. These will RTS if the requirements are not met. +; on the current machine. Exit demo if the requirements are not met. !macro GAME_REQUIRES_JOYSTICK { +GET_MACHINE_STATUS and #HAS_JOYSTICK diff --git a/src/parse.common.a b/src/parse.common.a index 15c222836..6ec7d5e99 100644 --- a/src/parse.common.a +++ b/src/parse.common.a @@ -210,7 +210,6 @@ okvs_append tay lda (SRC),y ; no max, use actual length instead tax -AddValueDuringAppend + inx tay - lda (SRC),y diff --git a/src/parse.games.a b/src/parse.games.a deleted file mode 100644 index 1508e0a6e..000000000 --- a/src/parse.games.a +++ /dev/null @@ -1,98 +0,0 @@ -;license:MIT -;(c) 2018-2020 by 4am -; -; GAMES.CONF parser -; -; Public functions: -; - ParseGamesList -; - -;------------------------------------------------------------------------------ -; ParseGamesList -; parse buffer with ABC,KEY=VALUE lines of text into an okvs -; keys and values limited to 127 characters, which should be enough for anyone -; '[' character at beginning of line ends the parsing -; (see games.conf file for more format information) -; -; in: stack contains 4 bytes of parameters: -; +1 [word] handle to storage space for okvs -; +3 [word] handle to buffer containing contents of GAMES.CONF -; out: all registers and flags clobbered -; $1F00..$1FFF clobbered -; $00/$01 clobbered -; $02/$03 clobbered -; $04/$05 has the address of the next available byte after the okvs -; $FE/$FF clobbered -;------------------------------------------------------------------------------ -ParseGamesList - +PARAMS_ON_STACK 4 - - +LDPARAM 1 - +ST16 @store2 - jsr SetKeyPtr - - ldy #$00 ; index into ($FE) pointing to current character - beq @newkey ; always branches -@skipLine ; skip to CR - jsr IncAndGetChar - cmp #$0A ; CR - bne @skipLine -@newkey ldx #$00 ; X = index into current key - stx gValLen ; initialize value length (in case this line has no value) -@emptyline - jsr IncAndGetChar ; get first filter character ('1' if game requires joystick) - cmp #$0A ; ignore blank line - beq @emptyline - cmp #$5B ; '[' ends the parsing - beq @exit - cmp #$30 ; '0' -> no filtering on joystick - beq @filterOnMemory - cmp #$31 ; not '0' or '1' or '[' or CR -> ignore entire line (e.g. comment) - bne @skipLine - bit zpMachineStatus - bpl @skipLine ; game requires joystick but we don't have one, so ignore entire line -@filterOnMemory - jsr IncAndGetChar ; get second filter character ('1' if game requires 128K) - cmp #$30 ; '0' -> no filtering on memory - beq @parseDHGRTitle - cmp #$31 ; not '0' or '1' -> ignore entire line - bne @skipLine - bit zpMachineStatus - bvc @skipLine ; game requires 128K but we only have 64K, so ignore entire line -@parseDHGRTitle - jsr IncAndGetChar ; get third character ('1' if game has DHGR title) -@parseCheatsAvailable - jsr IncAndGetChar ; get fourth character (cheat category, int) -@swallowComma - jsr IncAndGetChar -@gatherKey - jsr IncAndGetChar - cmp #$0A ; CR -> finalize key, no value - beq @endKey - cmp #$3D ; '=' ends the key - beq @endKey - sta gKey,x - inx - bpl @gatherKey -@endKey stx gKeyLen - ldx #$00 ; now X = index into the current value - cmp #$0A - beq @endValue -@gatherValue - jsr IncAndGetChar - cmp #$0A ; CR ends the value - bne @gatherValue -@endValue - stx gValLen - tya - pha ; okvs functions clobber everything but we need Y - jsr okvs_append -@store2 !word $FDFD ; SMC - !word gKeyLen - !word gValLen - !byte 0 - pla ; pop saved Y - tay - jmp @newkey - -@exit rts diff --git a/src/ui.attract.dhgr.a b/src/ui.attract.dhgr.a index 470a05f1d..055751e5d 100644 --- a/src/ui.attract.dhgr.a +++ b/src/ui.attract.dhgr.a @@ -175,6 +175,7 @@ DHGRTitleCallback bmi DHGRRTS +ST16 + + +ST16 gLastMegaAttractGame jsr FindGame ; if game is not found (C will be set here), it means it can't be played on @@ -215,10 +216,6 @@ DHGRActionCallback ; can't be played due to memory or joystick requirements, so we hide ; it from slideshows bcs DHGRRTS - +ST16 SAVE ; (SAVE) -> game display name - - +LD16 WINDEX ; save game index in case user hits RETURN - +ST16 gGameToLaunch ; while it's visible (we'll launch it) jsr LoadIndexedDHGRFile jsr DecompressDHGR diff --git a/src/ui.attract.gr.a b/src/ui.attract.gr.a index bfdbeffcb..73e3276b1 100644 --- a/src/ui.attract.gr.a +++ b/src/ui.attract.gr.a @@ -84,7 +84,6 @@ GRRTS rts ; in: A/Y contains address of filename (name only, path is always /ACTION.GR/) ; $WINDEX contains 0-based index of the current record in gSlideshowStore (word) -; gGamesListStore must be initialized ; out: all registers and flags clobbered ; $0800..$1EFF preserved (this contains the gSlideshowStore OKVS data) ; $2000..$BFFF clobbered by graphics data and transition code @@ -101,9 +100,6 @@ GRActionCallback ; it from slideshows bcs GRRTS - +LD16 WINDEX ; save game index in case user hits RETURN - +ST16 gGameToLaunch ; while it's visible (we'll launch it) - jsr LoadFile ; load GR screenshot into $6000 !word kGRActionDirectory + !word $FDFD ; SMC diff --git a/src/ui.attract.hgr.a b/src/ui.attract.hgr.a index c8803adb1..55242647e 100644 --- a/src/ui.attract.hgr.a +++ b/src/ui.attract.hgr.a @@ -105,6 +105,7 @@ HGRTitleCallback bmi HGRRTS +ST16 + + +ST16 gLastMegaAttractGame jsr FindGame ; if game is not found (C will be set here), it means it can't be played on @@ -129,7 +130,6 @@ HGRTitleCallback ; in: A/Y contains address of filename (name only, path is always /ACTION.HGR/) ; $WINDEX contains 0-based index of the current record in gSlideshowStore (word) -; gGamesListStore must be initialized ; out: all registers and flags clobbered ; $0800..$1EFF preserved (this contains the gSlideshowStore OKVS data) ; $2000..$BFFF clobbered by graphics data and transition code @@ -146,12 +146,6 @@ HGRActionCallback ; it from slideshows bcs HGRRTS - ; found the game - +ST16 SAVE ; (SAVE) -> game display name - - +LD16 WINDEX ; save game index in case user hits RETURN - +ST16 gGameToLaunch ; while it's visible (we'll launch it) - jsr LoadIndexedHGRFile jsr DecompressHGR jmp DrawGameTitleInActionSlideshow diff --git a/src/ui.attract.mode.a b/src/ui.attract.mode.a index 480a670ed..df13594e0 100644 --- a/src/ui.attract.mode.a +++ b/src/ui.attract.mode.a @@ -54,8 +54,8 @@ MegaAttractMode bpl MegaAttractMode cmp #$8D ; Enter plays the game shown on screen. bne + ; Any other key switches to Search Mode. - jsr ReloadSearchIndex - jsr PlayGame ; (might return if user hits Ctrl-Reset) + +LD16 gLastMegaAttractGame + jsr PlayGameInAY ; (might return if user hits Ctrl-Reset) + jmp SearchMode ;------------------------------------------------------------------------------ @@ -150,29 +150,31 @@ RunAttractModule bne @NotDemo ; Self-running demos are loaded into main memory and executed. -; Each binary has been patched to quit on any key and jump back -; to the |Reenter| entry point. +; Each demo has been patched to check joystick and memory requirements, +; so a demo won't run if the actual game wouldn't be playable. +; Demos are also patched to jump back to the |Reenter| entry point +; on any key, or at the natural end of the demo cycle. ; All demos are strictly 48K / main memory. No demo uses the ; language card or auxiliary memory. - +LD16 @key - jsr FindGame - bcs ATTRTS ; if game doesn't exist, skip the demo - +LD16 WINDEX - +CMP16_E $FFFF, @nogame - +ST16 gGameToLaunch ; if this demo corresponds to a game, save its index - ; in case user presses RETURN during the demo (we will launch the game) -@nogame + +ST16 PTR + ldy #0 + lda (PTR), y + tay +- lda (PTR), y + sta DemoFilename, y + dey + bpl - + +LDADDR DemoFilename + +ST16 gLastMegaAttractGame ; save game filename in LC in case user hits Return to launch + jsr ClearScreens ; avoid seeing code load into the HGR page ; (clobbers $106, must do now before loading prelaunch code) - jsr LoadStandardPrelaunch ; load standard prelaunch code (|Launch| will call it) - jsr LoadFile ; load self-running demo into its default address (varies) !word kDemoDirectory @key !word $FDFD !word 0 - jmp Launch ; will return to caller via |Reenter| ; not a demo, so maybe a slideshow or single screenshot @@ -233,3 +235,6 @@ RunAttractModule !byte >DHGRSingle !byte >SHRSingle !byte >GRSingle + +DemoFilename + !byte 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 diff --git a/src/ui.attract.shr.a b/src/ui.attract.shr.a index 0d683e311..36f2300be 100644 --- a/src/ui.attract.shr.a +++ b/src/ui.attract.shr.a @@ -85,6 +85,7 @@ SHRArtworkCallback bmi SHRRTS +ST16 IndexedSHRFilename + +ST16 gLastMegaAttractGame jsr FindGame ; if game is not found (C will be set here), it means it can't be played on @@ -92,9 +93,6 @@ SHRArtworkCallback ; it in slideshows bcs SHRRTS - +LD16 WINDEX ; save game index in case user hits RETURN - +ST16 gGameToLaunch ; while it's visible (we'll launch it) - jsr BlankSHR jsr LoadIndexedSHRFile jsr DecompressSHR