4cade/src/parse.prefs.a

239 lines
6.7 KiB
Plaintext
Raw Normal View History

2018-11-10 13:36:36 +00:00
;license:MIT
2021-10-13 22:58:26 +00:00
;(c) 2018-2021 by 4am & qkumba
2018-11-10 13:36:36 +00:00
;
; Parser for global preferences file
;
; Public functions
2019-09-16 16:36:10 +00:00
; - pref_get
; - pref_set
2019-10-08 18:47:47 +00:00
; - SaveSmallFile
2018-11-10 13:36:36 +00:00
;
; Public constants (all length-prefixed strings)
; - kNextAttract
; - kNextFX
; - kNextDFX
2019-10-08 03:23:47 +00:00
; - kCheat
2018-11-10 13:36:36 +00:00
;
kGlobalPrefsBuffer = $BD00 ; [512 bytes] must be page-aligned
2018-11-10 15:08:14 +00:00
2019-09-16 16:36:10 +00:00
; valid pref keys
2018-11-10 13:36:36 +00:00
kNextAttract
!byte 11
!raw "NEXTATTRACT"
kNextFX
!byte 6
!raw "NEXTFX"
kNextDFX
!byte 7
!raw "NEXTDFX"
kCheat
!byte 5
!raw "CHEAT"
2018-11-10 13:36:36 +00:00
2019-10-08 17:19:20 +00:00
.kEquals !byte 1
!raw "="
2020-03-23 01:58:26 +00:00
.kLF !byte 1,$0A
2019-10-08 17:19:20 +00:00
.kFluff1 !byte .kFluff2-*-1
2020-03-23 01:58:26 +00:00
!raw "# Total Replay preferences file",$0A
!raw "# Do not edit by hand.",$0A
!raw "# Or do. I'm a comment, not a cop.",$0A
!byte $0A
!raw "# value=module listed in ATTRACT.CONF",$0A
2019-10-08 17:19:20 +00:00
.kFluff2 !byte .kFluff3-*-1
2020-03-23 01:58:26 +00:00
!byte $0A
!raw "# value=effect listed in FX.CONF",$0A
2019-10-08 17:19:20 +00:00
.kFluff3 !byte .kFluff4-*-1
2020-03-23 01:58:26 +00:00
!byte $0A
!raw "# value=effect listed in DFX.CONF",$0A
2019-10-08 17:19:20 +00:00
.kFluff4 !byte .kEOF-*-1
2020-03-23 01:58:26 +00:00
!byte $0A
!raw "# value=0 or 1",$0A
2019-10-08 17:19:20 +00:00
.kEOF !byte ._-*-1
2020-03-23 01:58:26 +00:00
!byte $0A
!raw "[eof]",$0A
2019-10-08 17:19:20 +00:00
._
.addStringFromStore
2020-03-24 20:30:14 +00:00
+ST16 .key
2019-10-08 17:19:20 +00:00
jsr .addString
+LDADDR .kEquals
jsr .addString
jsr okvs_get
!word gGlobalPrefsStore
.key !word $FDFD ; SMC
jsr .addString
+LDADDR .kLF
; execution falls through here
.addString
2020-03-24 20:30:14 +00:00
+ST16 $00
2019-10-08 17:19:20 +00:00
ldy #0
lda ($00),y
2019-10-08 18:53:27 +00:00
beq PREFRTS
2019-10-08 17:19:20 +00:00
tay
clc
adc $FE
tax
- lda ($00),y
dey
sta ($FE),y
bne -
stx $FE
2019-10-08 18:53:27 +00:00
bcc PREFRTS
2019-10-08 17:19:20 +00:00
inc $FF
2019-10-08 18:53:27 +00:00
PREFRTS rts
2019-10-08 17:19:20 +00:00
2018-11-10 13:36:36 +00:00
;------------------------------------------------------------------------------
2019-09-16 16:36:10 +00:00
; pref_get
; get pref value by pref key, and optionally validate that the pref value
; exists as a key in another OKVS
2019-09-16 16:36:10 +00:00
;
; example usage:
; jsr pref_get
; !word kNextFX
; !word gFXStore
;
; See above for list of valid pref keys.
;
; The OKVS you pass in as the second parameter must have at least 1 record.
; This is not checked.
;
; in: stack contains 4 bytes of parameters:
; +1 [word] address of length-prefixed pref key
; +3 [word] address of OKVS, or 0
2019-09-16 16:36:10 +00:00
; gGlobalPrefsStore must be initialized (this is done in 4cade.init)
; out: A/Y = address of pref value
2020-03-24 20:30:14 +00:00
; $WINDEX = index of pref value in passed store
; (if OKVS parameter is 0, no validation occurs and X=0 and Z=1 on exit,
; some callers rely on this behavior, so don't change it!)
2019-09-16 16:36:10 +00:00
; PARAM clobbered
; PTR clobbered
; SRC clobbered
; SAVE clobbered
;------------------------------------------------------------------------------
pref_get
+PARAMS_ON_STACK 4
2021-10-13 22:58:26 +00:00
jsr .set_store01
2019-09-16 16:36:10 +00:00
2021-10-12 23:37:45 +00:00
jsr okvs_get ; look up pref key in prefs store, sets PTR to value
2019-09-16 16:36:10 +00:00
!word gGlobalPrefsStore
2021-10-13 22:58:26 +00:00
.store0 !word $FDFD ; SMC
2019-09-16 16:36:10 +00:00
bcs .useDefaultValue ; if pref key is not found, use default value
2019-10-08 17:19:20 +00:00
ldx .store1+1
2019-10-08 18:53:27 +00:00
beq PREFRTS ; if no OKVS to validate against, we're done
2020-03-24 20:30:14 +00:00
+ST16 +
2019-09-16 16:36:10 +00:00
ldy #0
lda (PTR),y
beq .useDefaultValue ; if pref value is empty, use default value
jsr okvs_get ; check whether the pref value exists as a key in the passed-in store
2019-10-08 17:19:20 +00:00
.store1 !word $FDFD ; SMC
2019-09-16 16:36:10 +00:00
+ !word $FDFD ; SMC
2019-09-20 23:27:16 +00:00
bcc + ; found key, continue
.useDefaultValue ; did not find key, use first key in passed store as a default value
2020-03-24 20:30:14 +00:00
sta WINDEX
sta WINDEX+1
2019-09-20 23:27:16 +00:00
+
2020-03-24 20:30:14 +00:00
+LD16 .store1
2019-10-08 18:49:53 +00:00
jmp okvs_nth
2019-09-16 16:36:10 +00:00
2021-10-13 22:58:26 +00:00
.set_store01
ldx #0
lda #.store1 - .store0
.set_store23
pha
ldy #1
jsr +
iny
pla
tax
+ lda (PARAM), y
sta .store0, x
iny
lda (PARAM), y
sta .store0 + 1, x
rts
2019-09-16 16:36:10 +00:00
;------------------------------------------------------------------------------
; pref_set
; set pref value by pref key, serialize prefs, and write them to disk
2018-11-10 13:36:36 +00:00
;
2019-09-16 16:36:10 +00:00
; in: stack contains 4 bytes of parameters:
; +1 [word] address of length-prefixed pref key
; +3 [word] address of length-prefixed pref value
2018-11-10 13:36:36 +00:00
; out: all registers and flags clobbered
2019-09-16 16:36:10 +00:00
; PARAM clobbered
; PTR clobbered
; SRC clobbered
; $FE/$FF clobbered
2018-11-10 13:36:36 +00:00
;------------------------------------------------------------------------------
2019-09-16 16:36:10 +00:00
pref_set
+PARAMS_ON_STACK 4
2021-10-13 22:58:26 +00:00
ldx #.store2 - .store0
lda #.store3 - .store0
jsr .set_store23
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
jsr okvs_update ; save that in prefs store
!word gGlobalPrefsStore
2021-10-13 22:58:26 +00:00
.store2 !word $FDFD ; SMC
.store3 !word $FDFD ; SMC
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
+LDADDR kGlobalPrefsBuffer ; clear prefs buffer
2020-03-24 20:30:14 +00:00
+ST16 $FE
2019-09-16 16:36:10 +00:00
ldx #$02
ldy #$00
tya
- sta ($FE),y
iny
bne -
inc $FF
dex
bne -
dec $FF
dec $FF
2019-10-08 17:19:20 +00:00
+LDADDR .kFluff1 ; serialize prefs into prefs buffer
jsr .addString
2018-11-10 15:08:14 +00:00
+LDADDR kNextAttract
2019-10-08 17:19:20 +00:00
jsr .addStringFromStore
2018-11-10 13:36:36 +00:00
2019-10-08 17:19:20 +00:00
+LDADDR .kFluff2
jsr .addString
2018-11-10 15:08:14 +00:00
+LDADDR kNextFX
2019-10-08 17:19:20 +00:00
jsr .addStringFromStore
2018-11-10 13:36:36 +00:00
2019-10-08 17:19:20 +00:00
+LDADDR .kFluff3
jsr .addString
2018-11-10 15:08:14 +00:00
+LDADDR kNextDFX
2019-10-08 17:19:20 +00:00
jsr .addStringFromStore
2018-11-10 13:36:36 +00:00
2019-10-08 17:19:20 +00:00
+LDADDR .kFluff4
jsr .addString
+LDADDR kCheat
2019-10-08 17:19:20 +00:00
jsr .addStringFromStore
2019-10-08 17:19:20 +00:00
+LDADDR .kEOF
jsr .addString
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
+LDADDR kGlobalPrefsFilename ; write prefs buffer to file on disk
jsr SetPath
2019-10-08 17:19:20 +00:00
; /!\ execution falls through here to glue.prorwts/SaveSmallFile
2019-10-08 18:47:47 +00:00
;------------------------------------------------------------------------------
; SaveSmallFile
; Save a file into memory all at once, using ProRWTS2.
; /!\ Only first block (512 bytes) is written. Keep those files small. /!\
; /!\ All 512 bytes are written to disk. Clear buffer before calling. /!\
; /!\ Address is hardcoded to kGlobalPrefsBuffer /!\
2019-10-08 18:47:47 +00:00
;
; supports paths, see note
;
; in: A/Y points to data buffer
; gPathname contains path+filename to write
; out: all flags clobbered
; all registers clobbered
;------------------------------------------------------------------------------
SaveSmallFile
jsr SwitchToBank2
jsr SaveSmallFileInternal
jmp SwitchToBank1