From 45235bff46e20c979aad553359ca8612582a80ac Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 19 Jul 2020 13:40:21 +0200 Subject: [PATCH] optimizations in garbage collector --- .../is_line_pointer_null_46K_50K.s | 4 ++ .../helper_cmp_varnam_46K_50K.s | 10 +--- .../helper_gc_fetch_backpointer_46K_50K.s | 32 +++++++++++ .../engine_variables/helper_gc_misc_46K_50K.s | 57 +++++++++++++++++++ .../engine_variables/varstr_garbage_collect.s | 38 ++++--------- 5 files changed, 107 insertions(+), 34 deletions(-) create mode 100644 src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s create mode 100644 src/basic/engine_variables/helper_gc_misc_46K_50K.s diff --git a/src/basic/engine_runtime/is_line_pointer_null_46K_50K.s b/src/basic/engine_runtime/is_line_pointer_null_46K_50K.s index 8ffc839d..c9c81460 100644 --- a/src/basic/engine_runtime/is_line_pointer_null_46K_50K.s +++ b/src/basic/engine_runtime/is_line_pointer_null_46K_50K.s @@ -20,6 +20,10 @@ is_line_pointer_null: jsr line_pointer_null_check + // FALLTROUGH + +remap_BASIC_preserve_P: + // Restore memory mapping and quit php diff --git a/src/basic/engine_variables/helper_cmp_varnam_46K_50K.s b/src/basic/engine_variables/helper_cmp_varnam_46K_50K.s index 0f3ad9e2..91a56e2e 100644 --- a/src/basic/engine_variables/helper_cmp_varnam_46K_50K.s +++ b/src/basic/engine_variables/helper_cmp_varnam_46K_50K.s @@ -2,7 +2,7 @@ // #LAYOUT# * BASIC_0 #TAKE-HIGH // #LAYOUT# * * #IGNORE -// This has to go $E000 or above - routines below banks out the main BASIC ROM! +// This has to go $E000 or above - routine below banks out the main BASIC ROM! #if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K @@ -26,13 +26,7 @@ helper_cmp_varnam: cmp VARNAM+1 !: // Restore default memory mapping - // XXX consider deduplicating with 'is_line_pointer_null' - php - lda #$27 - sta CPU_R6510 - plp - - rts + jmp remap_BASIC_preserve_P #endif diff --git a/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s b/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s new file mode 100644 index 00000000..1b72c7cd --- /dev/null +++ b/src/basic/engine_variables/helper_gc_fetch_backpointer_46K_50K.s @@ -0,0 +1,32 @@ +// #LAYOUT# STD * #TAKE-HIGH +// #LAYOUT# * BASIC_0 #TAKE-HIGH +// #LAYOUT# * * #IGNORE + +// This has to go $E000 or above - routine below banks out the main BASIC ROM! + +#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + +helper_gc_fetch_backpointer: + + // Unmap BASIC lower ROM + + lda #$26 + sta CPU_R6510 + + // Copy the back-pointer to OLDTXT, check if it is NULL + + ldy #$00 + lda (TXTPTR),y + sta OLDTXT+0 + + iny + lda (TXTPTR),y + sta OLDTXT+1 + + ora OLDTXT+0 + + // Restore default memory mapping + + jmp remap_BASIC_preserve_P + +#endif diff --git a/src/basic/engine_variables/helper_gc_misc_46K_50K.s b/src/basic/engine_variables/helper_gc_misc_46K_50K.s new file mode 100644 index 00000000..68c10bf1 --- /dev/null +++ b/src/basic/engine_variables/helper_gc_misc_46K_50K.s @@ -0,0 +1,57 @@ +// #LAYOUT# STD * #TAKE-HIGH +// #LAYOUT# * BASIC_0 #TAKE-HIGH +// #LAYOUT# * * #IGNORE + +// This has to go $E000 or above - routines below bank out the main BASIC ROM! + +#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + +helper_gc_set_memmove_src: + + // Unmap BASIC lower ROM + + lda #$26 + sta CPU_R6510 + + // Set memmove__src + + lda (OLDTXT),y + sta memmove__src+0 + iny + lda (OLDTXT),y + sta memmove__src+1 + + // Restore default memory mapping + + jmp_8 helper_gc_misc_end + +helper_gc_increase_oldtxt: + + // Unmap BASIC lower ROM + + lda #$26 + sta CPU_R6510 + + // Increase OLDTXT accordingly + + lda (OLDTXT),y + clc + adc INDEX+0 + sta (OLDTXT),y + iny + lda (OLDTXT),y + adc INDEX+1 + sta (OLDTXT),y + + // FALLTROUGH + +helper_gc_misc_end: + + // Restore default memory mapping + + lda #$27 + sta CPU_R6510 + + rts + +#endif diff --git a/src/basic/engine_variables/varstr_garbage_collect.s b/src/basic/engine_variables/varstr_garbage_collect.s index c7321971..ba7e192e 100644 --- a/src/basic/engine_variables/varstr_garbage_collect.s +++ b/src/basic/engine_variables/varstr_garbage_collect.s @@ -87,6 +87,12 @@ varstr_garbage_collect_check_bptr: // Copy the back-pointer to OLDTXT, check if it is NULL +#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + + jsr helper_gc_fetch_backpointer + +#else + ldy #$00 #if CONFIG_MEMORY_MODEL_60K @@ -96,13 +102,6 @@ varstr_garbage_collect_check_bptr: iny jsr peek_under_roms sta OLDTXT+1 -#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K - // XXX consider optimized version without multiple JSRs - jsr peek_under_roms_via_TXTPTR - sta OLDTXT+0 - iny - jsr peek_under_roms_via_TXTPTR - sta OLDTXT+1 #else // CONFIG_MEMORY_MODEL_38K lda (TXTPTR),y sta OLDTXT+0 @@ -112,6 +111,9 @@ varstr_garbage_collect_check_bptr: #endif ora OLDTXT+0 + +#endif + beq_16 varstr_garbage_collect_unused // The back-pointer is not NULL - string is used @@ -159,12 +161,7 @@ varstr_garbage_collect_check_bptr: jsr peek_under_roms sta memmove__src+1 #elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K - // XXX consider optimized version without multiple JSRs - jsr peek_under_roms_via_OLDTXT - sta memmove__src+0 - iny - jsr peek_under_roms_via_OLDTXT - sta memmove__src+1 + jsr helper_gc_set_memmove_src #else // CONFIG_MEMORY_MODEL_38K lda (OLDTXT),y sta memmove__src+0 @@ -227,19 +224,8 @@ varstr_garbage_collect_check_bptr: jsr poke_under_roms #elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K - // XXX consider optimized version without multiple JSRs - - jsr peek_under_roms_via_OLDTXT - clc - adc INDEX+0 - sta (OLDTXT),y - iny - - php - jsr peek_under_roms_via_OLDTXT - plp - adc INDEX+1 - sta (OLDTXT),y + + jsr helper_gc_increase_oldtxt #else // CONFIG_MEMORY_MODEL_38K