From b543481b9ff372394e32307e312626ca3661f535 Mon Sep 17 00:00:00 2001 From: 4am Date: Tue, 10 Sep 2019 00:54:52 -0400 Subject: [PATCH] refactor okvs_iter --- src/constants.a | 2 +- src/okvs.a | 67 +++++++++---------------------------------------- 2 files changed, 13 insertions(+), 56 deletions(-) diff --git a/src/constants.a b/src/constants.a index a41c9bfbb..81d6b05b2 100644 --- a/src/constants.a +++ b/src/constants.a @@ -9,7 +9,7 @@ ; D000..E4E9 - persistent data structures (gGlobalPrefsStore, gGamesListStore) ; ...end of data and start of code are approximate, in between is unused... ; ...if they ever overlap, things will go boom... -; E9CD..FFF9 - main program code +; EA19..FFF9 - main program code ; FFFA..FFFF - NMI, reset, IRQ vectors ; ; LC RAM BANK 2 diff --git a/src/okvs.a b/src/okvs.a index 6d489c5f6..28b55fcaf 100644 --- a/src/okvs.a +++ b/src/okvs.a @@ -329,70 +329,24 @@ okvs_update @exit rts ;------------------------------------------------------------------------------ -; okvs_iter +; okvs_iter / okvs_iter_values ; ; in: stack contains 4 bytes of parameters: ; +1 [word] handle to storage space ; +3 [word] address of callback ; out: will be called for each record in the store, in order, with ; X = numeric index of record -; A/Y = address of key +; A/Y = address of key or value (depends on which entry point you call) ; all registers are clobbered ; all flags clobbered ; $00/$01 clobbered ;------------------------------------------------------------------------------ okvs_iter - +PARAMS_ON_STACK 4 - jsr SetPTRFromStackParams - ldy #0 - lda (PTR),y - beq @exit ; no keys, exit immediately - sta @max - +LDPARAM 3 - +STAY @callback - jsr incptr ; PTR -> first record - ldx #0 -@loop txa - pha ; save X on stack - ldy PTR+1 - tya - pha - lda PTR - pha ; save PTR on stack (in case callback clobbers it) - clc - adc #2 ; skip over next-record pointer (2 bytes) - bcc + - iny ; A/Y -> key -+ -@callback=*+1 - jsr $FDFD ; SMC - pla - sta PTR - pla - sta PTR+1 ; restore PTR from stack - pla - tax ; restore X from stack - jsr derefptr ; PTR -> next record - inx -@max=*+1 - cpx #$FD ; SMC - bne @loop -@exit rts - -;------------------------------------------------------------------------------ -; okvs_iter_values -; -; in: stack contains 4 bytes of parameters: -; +1 [word] handle to storage space -; +3 [word] address of callback -; out: will be called for each record in the store, in order, with -; X = numeric index of record -; A/Y = address of value -; all registers are clobbered -; all flags clobbered -; $00/$01 clobbered -;------------------------------------------------------------------------------ + lda #$D0 + +HIDE_NEXT_2_BYTES okvs_iter_values + lda #$24 + sta @branch +PARAMS_ON_STACK 4 jsr SetPTRFromStackParams ldy #0 @@ -403,11 +357,14 @@ okvs_iter_values +STAY @callback jsr incptr ; PTR -> first record ldx #0 -@loop ldy #2 +@loop + lda #2 +@branch bne + ; SMC + ldy #2 lda (PTR),y ; A = length of key clc adc #3 ; skip over pointer to next record (2 bytes) + key length (1 byte) - sta @skiplen ++ sta @skiplen txa pha ; save X on stack lda PTR+1 @@ -416,7 +373,7 @@ okvs_iter_values lda PTR pha ; save PTR on stack (in case callback clobbers it) clc -@skiplen=*+1 ; skip over key +@skiplen=*+1 ; skip over pointer (and possibly key) adc #$FD ; SMC bcc + iny ; A/Y -> value