diff --git a/src/launch.a b/src/launch.a index 1ed10ff..d62a808 100644 --- a/src/launch.a +++ b/src/launch.a @@ -7,30 +7,65 @@ ; - ClearInterpreterOptions ; - SetInterpreterOptions ; - SetInterpreterOptionsExceptForce40 -; - LoadInterpreter -; - LaunchInterpreter +; - LaunchInterpreterWithGame +; - LaunchInterpreterWithHints ; +kOnBeyondOptionsStruct = $0300 +kOnBeyondColumns = $0300 +kOnBeyondCase = $0301 +kOnBeyondAutoRestore = $0302 +kOnBeyondScriptToFile = $0303 +kOnBeyondAutoScript = $0304 +kOnBeyondWarnMissing = $0305 +kOnBeyondChecksum = $0306 + +;------------------------------------------------------------------------------ +; ClearInterpreterOptions +; clear options script and make checksum invalid +; +; in: none +; out: A/Y clobbered +; X preserved +; all flags clobbered +;------------------------------------------------------------------------------ ClearInterpreterOptions ldy #6 lda #0 -- sta $0300,y +- sta kOnBeyondOptionsStruct,y dey bpl - rts +;------------------------------------------------------------------------------ +; SetInterpreterOptions +; set options struct based on global preferences store +; +; in: none +; out: all registers and flags clobbered +;------------------------------------------------------------------------------ SetInterpreterOptions jsr okvs_get !word gGlobalPrefsStore !word kForce40 jsr okvs_as_boolean - beq + + beq SetInterpreterOptionsExceptForce40 lda #$CE !byte $2C -+ +; execution falls through here + +;------------------------------------------------------------------------------ +; SetInterpreterOptionsExceptForce40 +; set options struct based on global preferences store, except always specify +; 80-column mode (used to launch PRIZM hint files) +; +; in: none +; out: all registers and flags clobbered +;------------------------------------------------------------------------------ SetInterpreterOptionsExceptForce40 lda #$D9 - sta $0300 ; 40/80 columns + sta kOnBeyondColumns + jsr okvs_get !word gGlobalPrefsStore !word kForceUpper @@ -39,10 +74,10 @@ SetInterpreterOptionsExceptForce40 lda #0 !byte $2C + lda #1 - sta $0301 ; case + sta kOnBeyondCase - lda #$FF - sta $0302 ; auto-restore + lda #$FF ; TODO this will eventually be set based on 'Resume Game' screen + sta kOnBeyondAutoRestore jsr okvs_get !word gGlobalPrefsStore @@ -52,7 +87,7 @@ SetInterpreterOptionsExceptForce40 lda #1 !byte $2C + lda #0 - sta $0303 ; script-to-file + sta kOnBeyondScriptToFile jsr okvs_get !word gGlobalPrefsStore @@ -62,27 +97,35 @@ SetInterpreterOptionsExceptForce40 lda #1 !byte $2C + lda #0 - sta $0304 ; auto-script + sta kOnBeyondAutoScript - lda #1 - sta $0305 ; warn on missing .sav files + lda #0 ; never warn, YOLO + sta kOnBeyondWarnMissing lda #$A5 - eor $0300 - eor $0301 - eor $0302 - eor $0303 - eor $0304 - eor $0305 - sta $0306 + eor kOnBeyondColumns + eor kOnBeyondCase + eor kOnBeyondAutoRestore + eor kOnBeyondScriptToFile + eor kOnBeyondAutoScript + eor kOnBeyondWarnMissing + sta kOnBeyondChecksum rts -.playError - jmp SoftBell -LaunchInterpreter +;------------------------------------------------------------------------------ +; LaunchInterpreterWithGame +; load interpreter and launch it with a game based on global preferences store +; +; in: current ProDOS prefix is the same as the PITCH.DARK file +; out: returns with C set if interpreter could not be loaded or game +; directory could not be found +; otherwise does not return (calls ExitWeeGUI and jumps to interpreter) +; gPathname clobbered +;------------------------------------------------------------------------------ +LaunchInterpreterWithGame jsr SaveGlobalPreferences jsr LoadInterpreter - bcs .playError + bcs .launchError jsr ResetPath +LDADDR kGameRootDirectory @@ -91,12 +134,12 @@ LaunchInterpreter jsr okvs_get !word gGlobalPrefsStore !word kLastPlayed - +STAY + + +STAY + ; A/Y contains address jsr AddToPath jsr SetPrefix ; set ProDOS prefix to game directory !word gPathname - bcs .playError + bcs .launchError jsr okvs_get !word gGlobalPrefsStore @@ -106,7 +149,51 @@ LaunchInterpreter jsr ExitWeeGUI ; shut down WeeGUI jsr SetInterpreterOptions ; set options struct at $300 jmp kSystemAddress ; exit via interpreter +.launchError + jmp SoftBell +;------------------------------------------------------------------------------ +; LaunchInterpreterWithHints +; load interpreter and launch it with the hints file for the current game +; +; in: current ProDOS prefix is the same as the PITCH.DARK file +; out: returns with C set if interpreter could not be loaded or hints +; directory could not be found +; otherwise does not return (calls ExitWeeGUI and jumps to interpreter) +; gPathname clobbered +;------------------------------------------------------------------------------ +LaunchInterpreterWithHints + jsr SaveGlobalPreferences + jsr LoadInterpreter + bcs .launchError + + jsr ResetPath + +LDADDR kHintsRootDirectory + jsr AddToPath + + jsr SetPrefix + !word gPathname + bcs .launchError + + jsr okvs_get + !word gGlobalPrefsStore + !word kLastPlayed + jsr SetStartupPath ; store hints filename at $2006 + + jsr ExitWeeGUI + jsr SetInterpreterOptionsExceptForce40 + jmp kSystemAddress + +;------------------------------------------------------------------------------ +; LoadInterpreter +; load interpreter and launch it with the hints file for the current game +; +; in: current ProDOS prefix is the same as the ONBEYOND.SYSTEM file +; out: C clear if success +; C set if interpreter could not be loaded +; all other registers and flags clobbered +; gPathname clobbered +;------------------------------------------------------------------------------ LoadInterpreter jsr ResetPath +LDADDR .interpreterFilename @@ -117,6 +204,7 @@ LoadInterpreter !word kSystemAddress !word kProDOSFileBuffer rts + .interpreterFilename !byte 15 !raw "ONBEYOND.SYSTEM" diff --git a/src/parse.gameinfo.a b/src/parse.gameinfo.a index 79c199e..ac9a981 100644 --- a/src/parse.gameinfo.a +++ b/src/parse.gameinfo.a @@ -119,5 +119,15 @@ LoadGameInfo !word addrOptions !byte 0 + jsr okvs_get ; get shortname of current game + !word gGlobalPrefsStore + !word kLastPlayed + +STAY + ; A/Y contains address + + jsr okvs_get ; get selected version of this game + !word gGlobalPrefsStore ++ !word $FDFD ; SMC +; +STAY + ; A/Y contains address + rts } diff --git a/src/ui.main.keys.a b/src/ui.main.keys.a index 3a30e0a..d1e9318 100644 --- a/src/ui.main.keys.a +++ b/src/ui.main.keys.a @@ -262,31 +262,8 @@ callback_boxart jmp SoftBell } -!zone { callback_clues - jsr SaveGlobalPreferences - jsr LoadInterpreter - bcs .cluesError -; change prefix to folder of file we want the interpreter to open - jsr ResetPath - +LDADDR kHintsRootDirectory - jsr AddToPath - jsr SetPrefix - !word gPathname - bcs .cluesError - -; put just the filename at $2006 - jsr okvs_get - !word gGlobalPrefsStore - !word kLastPlayed - jsr SetStartupPath -; shutdown WeeGUI and transfer control to interpreter - jsr ExitWeeGUI - jsr SetInterpreterOptionsExceptForce40 - jmp kSystemAddress -.cluesError - jmp SoftBell -} + jmp LaunchInterpreterWithHints callback_play - jmp LaunchInterpreter + jmp LaunchInterpreterWithGame