more work on string support

This commit is contained in:
FeralChild64 committed 2020-07-15 22:04:46 +02:00
1 parent 127b71f67f
commit 159acfba2f
7 files changed
+133 -73

No files matched your search

+33 -26
View File
@@ -6,14 +6,11 @@
// Releases back memory used by string
//
// Input:
// - DSCPNT+0, DSCPNT+1 - pointer to string descriptor
// - DSCPNT+1, DSCPNT+2 - pointer to string descriptor
//
// XXX test this routine
// XXX handle strings located in program area
// XXX change DSCPNT to use standard descriptor format
// XXX check if this entry point is needed
varstr_free:
@@ -23,23 +20,23 @@ varstr_free:
ldy #$00
#if CONFIG_MEMORY_MODEL_60K
ldx #<DSCPNT
ldx #<DSCPNT+1
jsr peek_under_roms
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_DSCPNT
jsr peek_under_roms_via_DSCPNT_PLUS_1
#else // CONFIG_MEMORY_MODEL_38K
lda (DSCPNT),y
lda (DSCPNT+1),y
#endif
sta DSCPNT+2 // length of the string
sta DSCPNT+0 // length of the string
iny
#if CONFIG_MEMORY_MODEL_60K
jsr peek_under_roms
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_DSCPNT
jsr peek_under_roms_via_DSCPNT_PLUS_1
#else // CONFIG_MEMORY_MODEL_38K
lda (DSCPNT),y
lda (DSCPNT+1),y
#endif
pha
@@ -48,20 +45,30 @@ varstr_free:
#if CONFIG_MEMORY_MODEL_60K
jsr peek_under_roms
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_DSCPNT
jsr peek_under_roms_via_DSCPNT_PLUS_1
#else // CONFIG_MEMORY_MODEL_38K
lda (DSCPNT),y
lda (DSCPNT+1),y
#endif
sta DSCPNT+1
sta DSCPNT+2
pla
sta DSCPNT+0
sta DSCPNT+1
// FALLTROUGH
varstr_free_DSCPNT_set:
// consider moving size check (DSCPNT+0) here
// XXX
// XXX check if string is located above FRETOP, handle case if it is not
// XXX
// Quick check - is the string the lowest one?
cmp FRETOP+0
bne varstr_free_inside
lda DSCPNT+1
lda DSCPNT+2
cmp FRETOP+1
bne varstr_free_inside
@@ -73,7 +80,7 @@ varstr_free:
#if !HAS_OPCODES_65CE02
lda #$02 // free the back-pointer
sta DSCPNT+2
sta DSCPNT+0
jmp varstr_FRETOP_up
#else // HAS_OPCODES_65CE02
@@ -90,7 +97,7 @@ varstr_free_inside:
// This is not the lowest string; mark it as free
// First preserve the string size, it will make it easier for the garbage collector
lda DSCPNT+2
lda DSCPNT+0
tay
dey
@@ -101,14 +108,14 @@ varstr_free_inside:
sta (FRETOP), y
#endif
// Now increase DSCPNT+0/+1 to point to the back-pointer
// Now increase DSCPNT+1/+2 to point to the back-pointer
clc
lda DSCPNT+0
adc DSCPNT+2
sta DSCPNT+0
lda DSCPNT+1
adc DSCPNT+0
sta DSCPNT+1
bcc !+
inc DSCPNT+1
inc DSCPNT+2
!:
// Fill the back-pointer with 0
@@ -116,10 +123,10 @@ varstr_free_inside:
ldy #$00
#if CONFIG_MEMORY_MODEL_60K
ldx #<DSCPNT
ldx #<DSCPNT+1
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (DSCPNT), y
sta (DSCPNT+1), y
#endif
iny // $00 -> $01
@@ -127,6 +134,6 @@ varstr_free_inside:
#if CONFIG_MEMORY_MODEL_60K
jmp poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (DSCPNT), y
sta (DSCPNT+1), y
rts
#endif