2019-01-15 00:06:58 +00:00
|
|
|
;license:MIT
|
2019-06-24 02:32:18 +00:00
|
|
|
;(c) 2018-9 by 4am
|
2019-01-15 00:06:58 +00:00
|
|
|
;
|
|
|
|
; Functions to launch games and self-running demos
|
|
|
|
;
|
|
|
|
; Public functions
|
2019-10-08 18:43:41 +00:00
|
|
|
; - GetGameToLaunch
|
2019-10-08 17:22:29 +00:00
|
|
|
; - GetGameInfo
|
|
|
|
; - GetGameInfoInActionSlideshow
|
2019-09-21 03:26:32 +00:00
|
|
|
; - PlayGame
|
2019-06-26 02:44:39 +00:00
|
|
|
; - Launch
|
2019-01-15 00:06:58 +00:00
|
|
|
;
|
2019-09-24 22:40:43 +00:00
|
|
|
; Public variables:
|
|
|
|
; - gGameToLaunch - 0-based index into gGamesListStore
|
|
|
|
;
|
2019-01-15 00:06:58 +00:00
|
|
|
|
2019-10-08 18:43:41 +00:00
|
|
|
GetGameToLaunch
|
|
|
|
; in: gGameToLaunch = index into gGamesListStore
|
|
|
|
; out: A/Y points to game filename
|
|
|
|
gGameToLaunch=*+1
|
|
|
|
ldx #$FF ; SMC
|
|
|
|
+LDADDR gGamesListStore
|
|
|
|
jmp okvs_nth
|
|
|
|
|
2019-10-08 17:22:29 +00:00
|
|
|
GetGameInfo
|
2019-07-08 19:03:25 +00:00
|
|
|
; in: A/Y points to game filename
|
|
|
|
; out: C clear if game exists in gGamesListStore, and
|
|
|
|
; A/Y points to game display name (but see hack notes below)
|
2019-09-21 03:26:32 +00:00
|
|
|
; 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)
|
2019-07-08 19:03:25 +00:00
|
|
|
; 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
|
|
|
|
; joystick)
|
2019-09-22 02:25:34 +00:00
|
|
|
ldx #$60
|
|
|
|
+HIDE_NEXT_2_BYTES
|
2019-10-08 17:22:29 +00:00
|
|
|
GetGameInfoInActionSlideshow
|
2019-09-22 02:25:34 +00:00
|
|
|
ldx #$EA
|
2019-09-08 18:50:50 +00:00
|
|
|
stx @maybeExit
|
2019-07-08 19:03:25 +00:00
|
|
|
+STAY @key
|
2019-09-08 18:50:50 +00:00
|
|
|
+STAY @slideshowKey
|
2019-07-08 19:03:25 +00:00
|
|
|
jsr okvs_get
|
|
|
|
!word gGamesListStore
|
|
|
|
@key !word $FDFD ; SMC
|
|
|
|
bcc @exit
|
2019-09-08 18:50:50 +00:00
|
|
|
; Hack to allow self-running demos that don't correspond to a game
|
|
|
|
; filename. If the name ends in a '.', accept it unconditionally.
|
|
|
|
; The filename is its own display name. Launching this fake game
|
|
|
|
; will of course fail, so don't do that.
|
2019-07-08 19:03:25 +00:00
|
|
|
+LDAY @key
|
|
|
|
+STAY PARAM
|
|
|
|
ldy #0
|
|
|
|
lda (PARAM),y
|
|
|
|
tay
|
|
|
|
lda (PARAM),y
|
|
|
|
cmp #"."
|
|
|
|
beq @forceGoodResult
|
|
|
|
sec
|
2019-09-08 18:50:50 +00:00
|
|
|
@maybeExit
|
|
|
|
!byte $00 ; SMC
|
|
|
|
; if the key is still not found, AND the caller said to try this, then try
|
|
|
|
; getting the value of the current record from gSlideshowStore
|
|
|
|
; (some games have multiple action screenshots, in which case the filename of
|
|
|
|
; the action screenshot is not the game name, but the value is)
|
|
|
|
jsr okvs_get
|
|
|
|
!word gSlideshowStore
|
|
|
|
@slideshowKey
|
|
|
|
!word $FDFD ; SMC
|
|
|
|
+STAY @key3
|
|
|
|
jsr okvs_get
|
|
|
|
!word gGamesListStore
|
|
|
|
@key3 !word $FDFD ; SMC
|
|
|
|
; note that the game might still not be found (C will be set by okvs_get),
|
|
|
|
; which can happen if the game can't be played due to memory or joystick
|
|
|
|
; requirements
|
2019-07-08 19:03:25 +00:00
|
|
|
rts
|
|
|
|
@forceGoodResult
|
|
|
|
+LDAY @key
|
2019-09-21 03:26:32 +00:00
|
|
|
ldx #$FF
|
2019-07-08 19:03:25 +00:00
|
|
|
clc
|
|
|
|
@exit rts
|
|
|
|
|
2019-09-21 03:26:32 +00:00
|
|
|
PlayGame
|
2019-10-08 18:43:41 +00:00
|
|
|
jsr GetGameToLaunch
|
2019-09-16 01:35:34 +00:00
|
|
|
; A/Y = address of game filename
|
2019-09-15 02:57:52 +00:00
|
|
|
+STAY SAVE
|
2019-09-24 20:01:03 +00:00
|
|
|
+STAY @pfile ; assume we're loading a game-specific prelaunch file
|
2019-09-18 18:04:41 +00:00
|
|
|
|
|
|
|
jsr Home ; clear screen (clobbers $106, must do now before loading prelaunch code)
|
|
|
|
lda #$20 ; clear both hi-res pages
|
|
|
|
sta @clear+2 ; (in case game loader shows them, we don't want
|
|
|
|
ldx #$40 ; to flash previous bits of the launcher UI)
|
|
|
|
ldy #$00
|
|
|
|
tya
|
2019-09-21 03:26:32 +00:00
|
|
|
@clear sta $FD00,y ; SMC
|
2019-09-18 18:04:41 +00:00
|
|
|
iny
|
|
|
|
bne @clear
|
|
|
|
inc @clear+2
|
|
|
|
dex
|
|
|
|
bne @clear
|
2019-09-15 02:57:52 +00:00
|
|
|
|
2019-10-05 01:34:49 +00:00
|
|
|
jsr LoadFile ; load this game's prelaunch file at $106
|
|
|
|
!word kPrelaunchDirectory
|
|
|
|
@pfile !word $FDFD
|
2019-09-15 21:55:16 +00:00
|
|
|
!word $0106
|
2019-09-15 02:57:52 +00:00
|
|
|
|
2019-10-09 04:25:10 +00:00
|
|
|
; we start by placing the subdirectory name at gPathname+kGameDirectoryLen
|
|
|
|
; to leave room for the GameDirectory name as the parent
|
|
|
|
|
|
|
|
lda #kGameDirectoryLen
|
|
|
|
sta gPathname
|
|
|
|
+LDAY SAVE
|
|
|
|
jsr AddToPath
|
|
|
|
|
|
|
|
; then we save the length of the resulting string without the count byte
|
|
|
|
|
|
|
|
ldx gPathname
|
|
|
|
dex
|
2019-06-21 23:47:05 +00:00
|
|
|
txa
|
2019-10-09 04:25:10 +00:00
|
|
|
pha
|
|
|
|
|
|
|
|
; attach the separator
|
|
|
|
|
|
|
|
inc gPathname
|
|
|
|
lda #'/'
|
|
|
|
sta gPathname+1,x
|
2019-01-15 00:06:58 +00:00
|
|
|
|
2019-10-09 04:25:10 +00:00
|
|
|
; then attach the game name
|
|
|
|
|
|
|
|
+LDAY SAVE
|
|
|
|
jsr AddToPath
|
|
|
|
|
|
|
|
; don't look while I do this
|
|
|
|
; we "place" a string at gPathname+kGameDirectoryLen
|
|
|
|
; whose length is the subdirectory name and game name
|
|
|
|
; then we load it
|
|
|
|
; the load sets the path to the GameDirectory
|
|
|
|
; and then finds the subdirectory name and game name right after it
|
|
|
|
; and attaches it to the path by overwriting the count byte
|
|
|
|
|
|
|
|
sec
|
|
|
|
lda gPathname
|
|
|
|
sbc #kGameDirectoryLen
|
|
|
|
sta gPathname+kGameDirectoryLen
|
2019-06-26 02:44:39 +00:00
|
|
|
jsr LoadFile ; load the game startup file
|
2019-10-09 04:25:10 +00:00
|
|
|
!word kGameDirectory
|
|
|
|
!word gPathname+kGameDirectoryLen
|
2019-09-10 02:38:17 +00:00
|
|
|
!word 0 ; use file's default address
|
2019-01-15 00:06:58 +00:00
|
|
|
|
2019-06-21 23:47:05 +00:00
|
|
|
pla
|
2019-06-26 02:44:39 +00:00
|
|
|
sta ProDOS_prefix ; set 'root' directory to the path part
|
|
|
|
; of the game startup file we just loaded
|
2019-09-10 02:38:17 +00:00
|
|
|
; so games can load other files without
|
2019-06-26 02:44:39 +00:00
|
|
|
; knowing which directory they're in
|
2019-01-15 00:06:58 +00:00
|
|
|
|
2019-06-26 02:44:39 +00:00
|
|
|
; execution falls through here
|
|
|
|
Launch
|
2019-09-20 13:33:23 +00:00
|
|
|
jsr SwitchToBank2
|
2019-09-24 22:40:43 +00:00
|
|
|
jmp LaunchInternal
|