more work towards garbage collector
This commit is contained in:
1 parent
86c61c88f4
commit
6642cdb4f7
1 file changed
+87
-17
@@ -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
|
||||||
Reference in new issue
Block a user