diff --git a/src/basic/basic_operators/oper_add.s b/src/basic/basic_operators/oper_add.s index 2b3a0632..d1f6401b 100644 --- a/src/basic/basic_operators/oper_add.s +++ b/src/basic/basic_operators/oper_add.s @@ -58,10 +58,11 @@ oper_add_strings: adc __FAC2+0 bcs_16 do_STRING_TOO_LONG_error - // jsr alloc_temp_string - .break + jsr tmpstr_alloc + + // XXX finish the implementation diff --git a/src/basic/engine/do_new_clr_restore.s b/src/basic/engine/do_new_clr_restore.s index 3a249d2a..0323e5ad 100644 --- a/src/basic/engine/do_new_clr_restore.s +++ b/src/basic/engine/do_new_clr_restore.s @@ -51,7 +51,7 @@ do_clr: // See Computes Mapping the Commodore 64 - page 96 - // XXX check on real ROMs that it is being done too when entering new line + // XXX check if original ROM does this too jsr JCLALL lda MEMSIZ+0 @@ -69,6 +69,13 @@ do_clr: sta ARYTAB+1 sta STREND+1 + // This is a good place to reset the temporary string stack + + lda #$19 + sta TEMPPT + lda #$16 + sta LASTPT + // FALLTROUGH (confirmed on real C64 that CLR indeed resets DATPTR) do_restore: diff --git a/src/basic/engine/end_of_statement.s b/src/basic/engine/end_of_statement.s index 3e3ca00d..8216d144 100644 --- a/src/basic/engine/end_of_statement.s +++ b/src/basic/engine/end_of_statement.s @@ -9,6 +9,7 @@ end_of_statement: + jsr tmpstr_free_all jsr fetch_character_skip_spaces cmp #$3A // check for colon diff --git a/src/basic/engine/execute_line_statements.s b/src/basic/engine/execute_line_statements.s index 1e37e135..eb1cf0ad 100644 --- a/src/basic/engine/execute_line_statements.s +++ b/src/basic/engine/execute_line_statements.s @@ -27,16 +27,7 @@ execute_statements: // Not end of the line - it seems we actually have something to execute - // Initialize temporary string stack - just about any statement might need it - // XXX original C64 ROM initializes this during the startup too - not sure where to put this - - ldx #$16 - stx LASTPT - ldx #$19 - stx TEMPPT - // Move token code to .X - tax // Push the 'end_of_statement' address for RTS diff --git a/src/basic/engine/tmpstr_alloc.s b/src/basic/engine/tmpstr_alloc.s new file mode 100644 index 00000000..b5b3698e --- /dev/null +++ b/src/basic/engine/tmpstr_alloc.s @@ -0,0 +1,21 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Allocates memory for a temporary string +// +// Input: +// -.A desired string length, has to be > 0 +// +// + +tmpstr_alloc: + + // First we need to find a free temporary string descriptor + + // XXX TEMPPT-> LASTPT + + // XXX implement this + + rts diff --git a/src/basic/engine/tmpstr_free_all.s b/src/basic/engine/tmpstr_free_all.s new file mode 100644 index 00000000..5746080b --- /dev/null +++ b/src/basic/engine/tmpstr_free_all.s @@ -0,0 +1,10 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +tmpstr_free_all: + + // XXX implement this + + rts diff --git a/src/basic/engine/varstr_garbage_collect.s b/src/basic/engine/varstr_garbage_collect.s index 5d7ec535..ef6975c4 100644 --- a/src/basic/engine/varstr_garbage_collect.s +++ b/src/basic/engine/varstr_garbage_collect.s @@ -289,6 +289,22 @@ varstr_garbage_collect_check_bptr: lda __FAC1+2 adc INDEX+1 sta __FAC1+2 +!: + // Same for __FAC2 + + lda __FAC2+2 + cmp TXTPTR+1 + bne !+ + lda __FAC2+1 + cmp TXTPTR+0 + bne !+ + + clc + adc INDEX+0 + sta __FAC2+1 + lda __FAC2+2 + adc INDEX+1 + sta __FAC2+2 !: // Next iteration