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 lda TXTPTR+1
pha 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 // INDEX+0 and INDEX+1 will be our cumulative shift counter
lda #$00 lda #$00
@@ -31,7 +38,8 @@ varstr_garbage_collect:
varstr_garbage_collect_loop: 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 lda TXTPTR+0
cmp FRETOP+0 cmp FRETOP+0
@@ -46,8 +54,12 @@ varstr_garbage_collect_loop:
varstr_garbage_collect_end: varstr_garbage_collect_end:
// Restore TXTPTR and quit // Restore OLDTXT and TXTPTR, and quit
pla
sta OLDTXT+1
pla
sta OLDTXT+0
pla pla
sta TXTPTR+1 sta TXTPTR+1
pla pla
@@ -60,15 +72,11 @@ varstr_garbage_collect_check_bptr:
// Decrement TXTPTR by 2, so that it points to the back-pointer // Decrement TXTPTR by 2, so that it points to the back-pointer
#if !HAS_OPCODES_65CE02 #if !HAS_OPCODES_65CE02
lda #$02 lda #$02
jsr varstr_TXTPTR_down_A jsr varstr_TXTPTR_down_A
#else // HAS_OPCODES_65CE02 #else // HAS_OPCODES_65CE02
dew TXTPTR dew TXTPTR
dew TXTPTR dew TXTPTR
#endif #endif
// Check whether the back-pointer is NULL // Check whether the back-pointer is NULL
@@ -78,39 +86,87 @@ varstr_garbage_collect_check_bptr:
#if CONFIG_MEMORY_MODEL_60K #if CONFIG_MEMORY_MODEL_60K
ldx #<TXTPTR ldx #<TXTPTR
jsr peek_under_roms jsr peek_under_roms
sta DSCPNT+2 sta OLDTXT+0
iny iny
jsr peek_under_roms jsr peek_under_roms
ora DSCPNT+2 sta OLDTXT+1
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K #elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
// XXX consider optimized version without multiple JSRs // XXX consider optimized version without multiple JSRs
jsr peek_under_roms_via_TXTPTR jsr peek_under_roms_via_TXTPTR
sta DSCPNT+2 sta OLDTXT+0
iny iny
jsr peek_under_roms_via_TXTPTR jsr peek_under_roms_via_TXTPTR
ora DSCPNT+2 sta OLDTXT+1
#else // CONFIG_MEMORY_MODEL_38K #else // CONFIG_MEMORY_MODEL_38K
lda (TXTPTR),y lda (TXTPTR),y
sta OLDTXT+0
iny iny
ora (TXTPTR),y lda (TXTPTR),y
sta OLDTXT+1
#endif #endif
ora OLDTXT+0
beq varstr_garbage_collect_unused beq varstr_garbage_collect_unused
// The back-pointer is not NULL - string is used // The back-pointer is not NULL - string is used
// Increase the string descriptor pointer by INDEX
// XXX implement this // 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: 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 #if HAS_OPCODES_65C02
bra varstr_garbage_collect_end bra varstr_garbage_collect_loop
#else #else
jmp varstr_garbage_collect_end jmp varstr_garbage_collect_loop
#endif #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 sta DSCPNT+2
@@ -132,3 +188,17 @@ varstr_TXTPTR_down_A: // .A - bytes to lower TXTPTR, uses DSCPN
dec TXTPTR+1 dec TXTPTR+1
!: !:
rts 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