4cade/src/parse.prefs.a

219 lines
5.8 KiB
Plaintext
Raw Normal View History

2018-11-10 13:36:36 +00:00
;license:MIT
;(c) 2018-9 by 4am
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
2018-11-10 13:36:36 +00:00
;
; Public constants (all length-prefixed strings)
; - kNextAttract
; - kNextFX
; - kNextDFX
;
kGlobalPrefsBuffer = $8000
2018-11-10 15:08:14 +00:00
2018-11-10 13:36:36 +00:00
kGlobalPrefsFilename
!byte 10
!raw "PREFS.CONF"
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-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
; X = 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
+LDPARAM 1
+STAY @prefkey
+LDPARAM 3
+STAY @store1
+STAY @store2
jsr okvs_get ; look up pref key in prefs store
!word gGlobalPrefsStore
@prefkey !word $FDFD ; SMC
bcs .useDefaultValue ; if pref key is not found, use default value
ldx @store2+1
beq @done
2019-09-16 16:36:10 +00:00
+STAY +
+STAY PTR
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
@store1 !word $FDFD ; SMC
+ !word $FDFD ; SMC
bcc +
.useDefaultValue ; find first key in passed store and use that as a default value
ldx #0
+ stx @n
jsr okvs_nth
@store2 !word $FDFD ; SMC
@n !byte $FD ; SMC
ldx @n
@done 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
+LDPARAM 1
+STAY @prefkey
+LDPARAM 3
+STAY @prefval
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
@prefkey !word $FDFD ; SMC
@prefval !word $FDFD ; SMC
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
+LDADDR kGlobalPrefsBuffer ; clear prefs buffer
+STAY $FE
ldx #$02
ldy #$00
tya
- sta ($FE),y
iny
bne -
inc $FF
dex
bne -
dec $FF
dec $FF
+LDADDR @kFluff1 ; serialize prefs into prefs buffer
2018-11-10 15:08:14 +00:00
jsr @addString
+LDADDR kNextAttract
jsr @addStringFromStore
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
+LDADDR @kFluff2
2018-11-10 15:08:14 +00:00
jsr @addString
+LDADDR kNextFX
jsr @addStringFromStore
2018-11-10 13:36:36 +00:00
2019-09-16 16:36:10 +00:00
+LDADDR @kFluff3
2018-11-10 15:08:14 +00:00
jsr @addString
+LDADDR kNextDFX
jsr @addStringFromStore
2018-11-10 13:36:36 +00:00
+LDADDR @kFluff4
jsr @addString
+LDADDR kCheat
jsr @addStringFromStore
2018-11-10 13:36:36 +00:00
+LDADDR @kEOF
2018-11-10 15:08:14 +00:00
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
2018-11-10 15:08:14 +00:00
jsr SaveSmallFile
2018-11-10 13:36:36 +00:00
!word kGlobalPrefsBuffer
rts
@addStringFromStore
+STAY @key
jsr @addString
+LDADDR @kEquals
jsr @addString
jsr okvs_get
!word gGlobalPrefsStore
@key !word $FDFD ; SMC
2018-11-10 15:08:14 +00:00
jsr @addString
2018-11-10 13:36:36 +00:00
+LDADDR @kLF
jmp @addString
@addString
+STAY $00
2018-11-10 15:08:14 +00:00
ldx #0
ldy #0
lda ($00),y
2018-11-18 02:39:02 +00:00
beq ++
2018-11-10 15:08:14 +00:00
clc
adc #$01
2018-11-10 13:36:36 +00:00
sta @len
2018-11-10 15:08:14 +00:00
iny
2018-11-10 13:36:36 +00:00
- lda ($00),y
2018-11-10 15:08:14 +00:00
sta ($FE,x)
2018-11-10 13:36:36 +00:00
+ iny
inc $FE
bne +
inc $FF
@len=*+1
+ cpy #$FD ; SMC
bne -
2018-11-18 02:39:02 +00:00
++ rts
2018-11-10 13:36:36 +00:00
@kEquals !byte 1
!raw "="
2018-11-10 15:08:14 +00:00
@kLF !byte 1,$0D
@kFluff1 !byte @kFluff2-*-1
2019-06-30 19:10:09 +00:00
!raw "# Total Replay preferences file",$0D
2018-11-10 13:36:36 +00:00
!raw "# Do not edit by hand.",$0D
2018-11-10 15:08:14 +00:00
!raw "# Or do. I'm a comment, not a cop.",$0D
!byte $0D
!raw "# value=attract mode module listed in ATTRACT.CONF, or empty",$0D
2019-09-16 16:36:10 +00:00
@kFluff2 !byte @kFluff3-*-1
2018-11-10 13:36:36 +00:00
!byte $0D
2018-11-10 15:08:14 +00:00
!raw "# value=transition effect listed in FX.CONF, or empty",$0D
@kFluff3 !byte @kFluff4-*-1
2018-11-10 13:36:36 +00:00
!byte $0D
2018-11-10 15:08:14 +00:00
!raw "# value=transition effect listed in DFX.CONF, or empty",$0D
@kFluff4 !byte @kEOF-*-1
!byte $0D
!raw "# value=0 or 1",$0D
2018-11-10 15:08:14 +00:00
@kEOF !byte @_-*-1
2018-11-10 13:36:36 +00:00
!byte $0D
!raw "[eof]",$0D
2018-11-10 15:08:14 +00:00
@_