From aa101f79c63fda046a2494311012d477061f7a1c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 3 Jul 2020 16:47:23 +0200 Subject: [PATCH] added routine to free string memory --- src/basic/engine/varstr_alloc.s | 4 +- src/basic/engine/varstr_alloc_fretop.s | 6 +-- src/basic/engine/varstr_free.s | 61 ++++++++++++++++++++++++-- src/basic/engine/varstr_free_fretop.s | 18 ++++++++ 4 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 src/basic/engine/varstr_free_fretop.s diff --git a/src/basic/engine/varstr_alloc.s b/src/basic/engine/varstr_alloc.s index 8a24fec7..dd1e0d88 100644 --- a/src/basic/engine/varstr_alloc.s +++ b/src/basic/engine/varstr_alloc.s @@ -45,7 +45,7 @@ varstr_alloc_retry: #if !HAS_OPCODES_65CE02 lda #$02 - jsr varstr_FRETOP_down + jsr varstr_FRETOP_down_A #else // HAS_OPCODES_65CE02 - this time code is slightly longer, but faster @@ -92,7 +92,7 @@ varstr_alloc_retry: lda (DSCPNT),y #endif - jsr varstr_FRETOP_down + jsr varstr_FRETOP_down_A bcs varstr_alloc_fail // Success - fill in the string descriptor diff --git a/src/basic/engine/varstr_alloc_fretop.s b/src/basic/engine/varstr_alloc_fretop.s index 09f033bc..b00d2cb3 100644 --- a/src/basic/engine/varstr_alloc_fretop.s +++ b/src/basic/engine/varstr_alloc_fretop.s @@ -6,13 +6,13 @@ // Helper routines for 'varstr_alloc' // -varstr_FRETOP_down: // .A - bytes to lower FRETOP, uses memmove__tmp +varstr_FRETOP_down_A: // .A - bytes to lower FRETOP, uses DSCPNT+2 - sta memmove__tmp + sta DSCPNT+2 sec lda FRETOP+0 - sbc memmove__tmp + sbc DSCPNT+2 sta FRETOP+0 bcs !+ dec FRETOP+1 diff --git a/src/basic/engine/varstr_free.s b/src/basic/engine/varstr_free.s index 448c161f..c61aae3a 100644 --- a/src/basic/engine/varstr_free.s +++ b/src/basic/engine/varstr_free.s @@ -61,15 +61,68 @@ varstr_free: cmp FRETOP+1 bne varstr_free_inside - // This is the lowest string - increase FRETOP, this way + // This is the lowest string - so just increase FRETOP, this way // the garbage collector will not be needed that quickly - // XXX implement this + jsr varstr_FRETOP_up // free the string data + +#if !HAS_OPCODES_65CE02 + + lda #$02 // free the back-pointer + sta DSCPNT+2 + jmp varstr_FRETOP_up + +#else // HAS_OPCODES_65CE02 + + inw FRETOP // free the back-pointer + inw FRETOP + + rts + +#endif varstr_free_inside: - // THis is not the lowest string; mark it as free + // This is not the lowest string; mark it as free + // First preserve the string size, it will make it easier for the garbage collector - // XXX implement this + lda DSCPNT+2 + tay + dey +#if CONFIG_MEMORY_MODEL_60K + ldx # $01 + +#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 rts +#endif diff --git a/src/basic/engine/varstr_free_fretop.s b/src/basic/engine/varstr_free_fretop.s new file mode 100644 index 00000000..a9fec660 --- /dev/null +++ b/src/basic/engine/varstr_free_fretop.s @@ -0,0 +1,18 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Helper routines for 'varstr_free' +// + +varstr_FRETOP_up: // DSCPNT+2 - bytes to increment FRETO, uses DSCPNT+2 + + clc + lda FRETOP+0 + adc DSCPNT+2 + sta FRETOP+0 + bcc !+ + inc FRETOP+1 +!: + rts