4cade/src/4cade.a

99 lines
3.5 KiB
Plaintext

;license:MIT
;(c) 2018-9 by 4am
;
!cpu 6502
!to "build/LAUNCHER.SYSTEM",plain
*=$2000
!ifndef RELBASE {
RELBASE=$2000
}
!source "src/constants.a" ; no code in these
!source "src/macros.a"
; first-run initialization, relocates code to language card and jumps
; to |Reenter|
!source "src/4cade.init.a"
FirstMover
!pseudopc RELBASE {
;------------------------------------------------------------------------------
; Reenter
; This is the primary entry point for returning to the launcher from anywhere.
; - Self-running demos call this when the user presses a key or when the demo
; cycles ends naturally.
; - It is set as the reset vector, so the user can play a game then press
; Ctrl-Reset to return to the launcher and choose another.
; - It also functions as a reset vector while the launcher is running.
; - It is also called on program startup, after the first-run initialization.
;
; When execution reaches this point, we may have previously backed up the stack
; and stack pointer, in which case it is now our job to restore it and return
; to the caller. This allows magic like 'JSR PlayGame' then continuing once the
; JSR returns.
;
; If there is no stack to restore, this exits via SearchMode.
;
; in: none
; out: see above
;------------------------------------------------------------------------------
Reenter
cld
cli
+READ_RAM2_WRITE_RAM2
jsr CloseHandles ; close any open handles to restore ProRWTS
; (also switches to LC RAM bank 1)
jsr SaveOrRestoreScreenHoles ; restore original screen hole contents
RestoreStackNextTime
clc ; SMC
bcc SearchMode ; not an unconditional branch because code
; might change the 'clc' just before it
; If we fall through to here, it's because we backed up the stack and
; stack pointer and wanted this routine to restore it and return to
; caller.
lda #$18 ; reset to 'clc' opcode so we don't try to
sta RestoreStackNextTime ; restore the same stack twice
ldx #1
- lda $DF00,x ; restore stack
sta $100,x
inx
bne -
ldx $DF00 ; restore stack pointer
txs
rts ; and return to caller
; these routines will only be called after relocating to language card
!source "src/ui.search.mode.a"
!source "src/ui.attract.mode.a"
!source "src/ui.attract.hgr.a"
!source "src/ui.attract.dhgr.a"
!source "src/ui.attract.shr.a"
!source "src/prodos.path.a"
!source "src/glue.launch.a"
!source "src/glue.prorwts2.a"
!source "src/okvs.a"
!source "src/wait.a"
!source "src/textrank.a"
!source "src/parse.common.a"
!source "src/parse.prefs.a"
!source "src/ui.sound.a"
!source "src/ui.font.a"
gGlobalPrefsStore
!word $D000 ; address of first okvs store
gGamesListStore
!word $FDFD ; SMC
!word Reenter ; NMI vector ($FFFA-B)
!word Reenter ; reset vector ($FFFC-D)
!word Reenter ; IRQ vector ($FFFE-F)
}
LastMover
!source "src/ui.font.data.a"
!if RELBASE = $2000 {
!ifdef PASS2 {
} else { ;PASS2
!set PASS2=1
!warn "RELBASE = ", $10000 - (LastMover - FirstMover)
}
}