more work towards garbage collector

This commit is contained in:
FeralChild64 committed 2020-07-07 22:54:55 +02:00
1 parent 86c61c88f4
commit 6642cdb4f7
1 file changed
+87 -17
+87 -17
View File
@@ -16,6 +16,13 @@ varstr_garbage_collect:
lda TXTPTR+1
pha
// Similarly, we will reuse OLDTXT as the pointer to string descriptor
lda OLDTXT+0
pha
lda OLDTXT+1
pha
// INDEX+0 and INDEX+1 will be our cumulative shift counter
lda #$00
@@ -31,7 +38,8 @@ varstr_garbage_collect:
varstr_garbage_collect_loop:
// Check whether we reached FRETOP
// Check if this was the last string
// XXX instead check if FRETOP+INDEX == TXTPTR
lda TXTPTR+0
cmp FRETOP+0
@@ -46,8 +54,12 @@ varstr_garbage_collect_loop:
varstr_garbage_collect_end:
// Restore TXTPTR and quit
// Restore OLDTXT and TXTPTR, and quit
pla
sta OLDTXT+1
pla
sta OLDTXT+0
pla
sta TXTPTR+1
pla
@@ -60,15 +72,11 @@ varstr_garbage_collect_check_bptr:
// Decrement TXTPTR by 2, so that it points to the back-pointer
#if !HAS_OPCODES_65CE02
lda #$02
jsr varstr_TXTPTR_down_A
#else // HAS_OPCODES_65CE02
dew TXTPTR
dew TXTPTR
#endif
// Check whether the back-pointer is NULL
@@ -78,39 +86,87 @@ varstr_garbage_collect_check_bptr:
#if CONFIG_MEMORY_MODEL_60K
ldx #<TXTPTR
jsr peek_under_roms
sta DSCPNT+2
sta OLDTXT+0
iny
jsr peek_under_roms
ora DSCPNT+2
sta OLDTXT+1
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
// XXX consider optimized version without multiple JSRs
jsr peek_under_roms_via_TXTPTR
sta DSCPNT+2
sta OLDTXT+0
iny
jsr peek_under_roms_via_TXTPTR
ora DSCPNT+2
sta OLDTXT+1
#else // CONFIG_MEMORY_MODEL_38K
lda (TXTPTR),y
sta OLDTXT+0
iny
ora (TXTPTR),y
lda (TXTPTR),y
sta OLDTXT+1
#endif
ora OLDTXT+0
beq varstr_garbage_collect_unused
// The back-pointer is not NULL - string is used
// Increase the string descriptor pointer by INDEX
// XXX implement this
// Move string memory up by INDEX
// XXX
// Update TXTPTR
// XXX
// Next iteration
#if HAS_OPCODES_65C02
bra varstr_garbage_collect_loop
#else
jmp varstr_garbage_collect_loop
#endif
varstr_garbage_collect_unused:
// The back-pointer is NULL - string is unused
// The back-pointer is NULL - string is a garbage to collect
// Fetch the string length
// XXX implement this
#if !HAS_OPCODES_65CE02
lda #$01
jsr varstr_TXTPTR_down_A
#else // HAS_OPCODES_65CE02
dew TXTPTR
#endif
ldy #$00
lda (TXTPTR), y
// Decrement string length by 1, it will be easier to perform calculations
tax
dex
// Increase INDEX (shift offset) by string length + back-pointer length
lda #$03
jsr varstr_INDEX_up_A
txa
jsr varstr_INDEX_up_A
// Decrease TXTPTR by unused string length-1
tax
jsr varstr_TXTPTR_down_A
// Next iteration
#if HAS_OPCODES_65C02
bra varstr_garbage_collect_end
bra varstr_garbage_collect_loop
#else
jmp varstr_garbage_collect_end
jmp varstr_garbage_collect_loop
#endif
@@ -118,9 +174,9 @@ varstr_garbage_collect_unused:
// XXX move this routine to a separate file
// XXX move these routines to separate files
varstr_TXTPTR_down_A: // .A - bytes to lower TXTPTR, uses DSCPNT+2
varstr_TXTPTR_down_A: // .A - bytes to decrease TXTPTR, uses DSCPNT+2
sta DSCPNT+2
@@ -132,3 +188,17 @@ varstr_TXTPTR_down_A: // .A - bytes to lower TXTPTR, uses DSCPN
dec TXTPTR+1
!:
rts
varstr_INDEX_up_A: // .A - bytes to increase TXTPTR, uses DSCPNT+2
sta DSCPNT+2
clc
lda INDEX+0
adc DSCPNT+2
sta INDEX+0
bcc !+
dec INDEX+1
!:
rts