more work on string support
This commit is contained in:
1 parent
127b71f67f
commit
159acfba2f
7 files changed
+133
-73
No files matched your search
@@ -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
|
||||
Reference in new issue
Block a user