From 985a0882f6599893520f9c6779d6a3b0f0fb4f05 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 21 Jul 2020 17:45:24 +0200 Subject: [PATCH] changed handling of external token lists --- Makefile | 4 +- doc/Extended-BASIC-TODO.md | 2 +- ...packed_keywords_V2.s => packed_keywords.s} | 0 ...ked_keywords_CC.s => packed_keywords_01.s} | 4 +- ...ked_keywords_CD.s => packed_keywords_02.s} | 7 +- .../basic_commands_01/cmd__jumptable_01.s | 58 +++++++ .../cmd_fast_slow.s | 0 .../cmd_old.s | 0 .../basic_commands_02/cmd__jumptable_02.s | 60 +++++++ .../cmd_bload_bverify.s | 0 .../cmd_bsave.s | 0 .../cmd_clear.s | 0 .../cmd_cold.s | 0 .../cmd_dispose.s | 0 .../cmd_mem.s | 0 .../cmd_merge.s | 0 .../helper_ask_if_sure.s | 0 .../helper_bload_fetch_address.s | 0 .../helper_bload_fetch_filename.s | 0 .../helper_mem_tab_str.s | 0 .../helper_mem_tab_x.s | 0 .../helper_mem_tab_y.s | 0 .../basic_commands_CC/cmd__jumptable_CC.s | 76 --------- .../basic_commands_CD/cmd__jumptable_CD.s | 46 ------ src/basic/engine_editor/tokenise_line.s | 28 ++-- .../engine_runtime/execute_line_statements.s | 54 ++++--- src/basic/print/list_single_line.s | 152 +++++++++--------- src/basic/print/print_packed_freq_string.s | 16 +- tools/generate_strings.cc | 104 ++++-------- 29 files changed, 295 insertions(+), 316 deletions(-) rename src/basic/assets/{packed_keywords_V2.s => packed_keywords.s} (100%) rename src/basic/assets/{packed_keywords_CC.s => packed_keywords_01.s} (69%) rename src/basic/assets/{packed_keywords_CD.s => packed_keywords_02.s} (59%) create mode 100644 src/basic/basic_commands_01/cmd__jumptable_01.s rename src/basic/{basic_commands_CD => basic_commands_01}/cmd_fast_slow.s (100%) rename src/basic/{basic_commands_CC => basic_commands_01}/cmd_old.s (100%) create mode 100644 src/basic/basic_commands_02/cmd__jumptable_02.s rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_bload_bverify.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_bsave.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_clear.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_cold.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_dispose.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_mem.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/cmd_merge.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_ask_if_sure.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_bload_fetch_address.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_bload_fetch_filename.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_mem_tab_str.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_mem_tab_x.s (100%) rename src/basic/{basic_commands_CC => basic_commands_02}/helper_mem_tab_y.s (100%) delete mode 100644 src/basic/basic_commands_CC/cmd__jumptable_CC.s delete mode 100644 src/basic/basic_commands_CD/cmd__jumptable_CD.s diff --git a/Makefile b/Makefile index 4236d9ce..ac8a7a94 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,8 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/,stubs_math \ src/basic/assets \ src/basic/basic_commands \ - src/basic/basic_commands_CC \ - src/basic/basic_commands_CD \ + src/basic/basic_commands_01 \ + src/basic/basic_commands_02 \ src/basic/basic_operators \ src/basic/basic_functions \ src/basic/board_m65 \ diff --git a/doc/Extended-BASIC-TODO.md b/doc/Extended-BASIC-TODO.md index d262dbe9..7f2ce4a7 100644 --- a/doc/Extended-BASIC-TODO.md +++ b/doc/Extended-BASIC-TODO.md @@ -31,7 +31,7 @@ Ideas for the future, most of them suitable for Mega65 or other power machines o * consider `BOOT` command * possibly some commands for creating menus and dialog boxes * more configurable `INPUT` -* `PRINT USING`, `PRINT AT(x, y)`, `PRINT CENTRE` +* `PRINT USING`, ability to position cursor, ability to print result in the center of the screen * `CURSOR` command from BASIC V10 * `RESTORE` should accept lline number as argument * hex/dec conversion functions diff --git a/src/basic/assets/packed_keywords_V2.s b/src/basic/assets/packed_keywords.s similarity index 100% rename from src/basic/assets/packed_keywords_V2.s rename to src/basic/assets/packed_keywords.s diff --git a/src/basic/assets/packed_keywords_CC.s b/src/basic/assets/packed_keywords_01.s similarity index 69% rename from src/basic/assets/packed_keywords_CC.s rename to src/basic/assets/packed_keywords_01.s index 8cbf9bed..85093d48 100644 --- a/src/basic/assets/packed_keywords_CC.s +++ b/src/basic/assets/packed_keywords_01.s @@ -4,6 +4,6 @@ // #LAYOUT# * * #IGNORE -packed_freq_keywords_CC: +packed_freq_keywords_01: - put_packed_freq_keywords_CC() + put_packed_freq_keywords_01() diff --git a/src/basic/assets/packed_keywords_CD.s b/src/basic/assets/packed_keywords_02.s similarity index 59% rename from src/basic/assets/packed_keywords_CD.s rename to src/basic/assets/packed_keywords_02.s index c474d947..37c9903a 100644 --- a/src/basic/assets/packed_keywords_CD.s +++ b/src/basic/assets/packed_keywords_02.s @@ -3,7 +3,10 @@ // #LAYOUT# X16 BASIC_0 #TAKE // #LAYOUT# * * #IGNORE +#if !HAS_SMALL_BASIC -packed_freq_keywords_CD: +packed_freq_keywords_02: - put_packed_freq_keywords_CD() + put_packed_freq_keywords_02() + +#endif diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s new file mode 100644 index 00000000..cc119e31 --- /dev/null +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -0,0 +1,58 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Jumptable for BASIC commands with tokens prefixed by $01 +// + + +.const command_01_list = List().add( + + cmd_slow, + cmd_fast, + cmd_old, + + // NOTE! These commands are temporarily placed here, they should be a part of list 02! + + cmd_merge, + + cmd_bload, + cmd_bsave, + cmd_bverify, + + cmd_clear, + varstr_garbage_collect // cmd_dispose +) + + +#if !HAS_OPCODES_65C02 + + +command_01_jumptable_lo: + + put_jumptable_lo(command_01_list) + + +command_01_jumptable_hi: + + put_jumptable_hi(command_01_list) + + +#else // HAS_OPCODES_65C02 + + +__before_command_01_jumptable: + +.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary + +command_01_jumptable: + + put_jumptable(command_01_list) + + // Make sure routine size is always the same - build system limitation + +.if (__before_command_01_jumptable == command_01_jumptable) { brk } + + +#endif diff --git a/src/basic/basic_commands_CD/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s similarity index 100% rename from src/basic/basic_commands_CD/cmd_fast_slow.s rename to src/basic/basic_commands_01/cmd_fast_slow.s diff --git a/src/basic/basic_commands_CC/cmd_old.s b/src/basic/basic_commands_01/cmd_old.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_old.s rename to src/basic/basic_commands_01/cmd_old.s diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s new file mode 100644 index 00000000..6b669104 --- /dev/null +++ b/src/basic/basic_commands_02/cmd__jumptable_02.s @@ -0,0 +1,60 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Jumptable for BASIC commands with tokens prefixed by $02 +// + +#if !HAS_SMALL_BASIC + +.const command_02_list = List().add( + + // NOTE! These commands are temporarily placed in list 01! + + // cmd_merge, + + // cmd_bload, + // cmd_bsave, + // cmd_bverify, + + // cmd_clear, + // varstr_garbage_collect, // cmd_dispose + + cmd_cold, + cmd_mem +) + + +#if !HAS_OPCODES_65C02 + + +command_02_jumptable_lo: + + put_jumptable_lo(command_02_list) + + +command_02_jumptable_hi: + + put_jumptable_hi(command_02_list) + + +#else // HAS_OPCODES_65C02 + + +__before_command_02_jumptable: + +.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary + +command_02_jumptable: + + put_jumptable(command_02_list) + + // Make sure routine size is always the same - build system limitation + +.if (__before_command_02_jumptable == command_02_jumptable) { brk } + + +#endif + +#endif diff --git a/src/basic/basic_commands_CC/cmd_bload_bverify.s b/src/basic/basic_commands_02/cmd_bload_bverify.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_bload_bverify.s rename to src/basic/basic_commands_02/cmd_bload_bverify.s diff --git a/src/basic/basic_commands_CC/cmd_bsave.s b/src/basic/basic_commands_02/cmd_bsave.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_bsave.s rename to src/basic/basic_commands_02/cmd_bsave.s diff --git a/src/basic/basic_commands_CC/cmd_clear.s b/src/basic/basic_commands_02/cmd_clear.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_clear.s rename to src/basic/basic_commands_02/cmd_clear.s diff --git a/src/basic/basic_commands_CC/cmd_cold.s b/src/basic/basic_commands_02/cmd_cold.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_cold.s rename to src/basic/basic_commands_02/cmd_cold.s diff --git a/src/basic/basic_commands_CC/cmd_dispose.s b/src/basic/basic_commands_02/cmd_dispose.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_dispose.s rename to src/basic/basic_commands_02/cmd_dispose.s diff --git a/src/basic/basic_commands_CC/cmd_mem.s b/src/basic/basic_commands_02/cmd_mem.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_mem.s rename to src/basic/basic_commands_02/cmd_mem.s diff --git a/src/basic/basic_commands_CC/cmd_merge.s b/src/basic/basic_commands_02/cmd_merge.s similarity index 100% rename from src/basic/basic_commands_CC/cmd_merge.s rename to src/basic/basic_commands_02/cmd_merge.s diff --git a/src/basic/basic_commands_CC/helper_ask_if_sure.s b/src/basic/basic_commands_02/helper_ask_if_sure.s similarity index 100% rename from src/basic/basic_commands_CC/helper_ask_if_sure.s rename to src/basic/basic_commands_02/helper_ask_if_sure.s diff --git a/src/basic/basic_commands_CC/helper_bload_fetch_address.s b/src/basic/basic_commands_02/helper_bload_fetch_address.s similarity index 100% rename from src/basic/basic_commands_CC/helper_bload_fetch_address.s rename to src/basic/basic_commands_02/helper_bload_fetch_address.s diff --git a/src/basic/basic_commands_CC/helper_bload_fetch_filename.s b/src/basic/basic_commands_02/helper_bload_fetch_filename.s similarity index 100% rename from src/basic/basic_commands_CC/helper_bload_fetch_filename.s rename to src/basic/basic_commands_02/helper_bload_fetch_filename.s diff --git a/src/basic/basic_commands_CC/helper_mem_tab_str.s b/src/basic/basic_commands_02/helper_mem_tab_str.s similarity index 100% rename from src/basic/basic_commands_CC/helper_mem_tab_str.s rename to src/basic/basic_commands_02/helper_mem_tab_str.s diff --git a/src/basic/basic_commands_CC/helper_mem_tab_x.s b/src/basic/basic_commands_02/helper_mem_tab_x.s similarity index 100% rename from src/basic/basic_commands_CC/helper_mem_tab_x.s rename to src/basic/basic_commands_02/helper_mem_tab_x.s diff --git a/src/basic/basic_commands_CC/helper_mem_tab_y.s b/src/basic/basic_commands_02/helper_mem_tab_y.s similarity index 100% rename from src/basic/basic_commands_CC/helper_mem_tab_y.s rename to src/basic/basic_commands_02/helper_mem_tab_y.s diff --git a/src/basic/basic_commands_CC/cmd__jumptable_CC.s b/src/basic/basic_commands_CC/cmd__jumptable_CC.s deleted file mode 100644 index 97109edf..00000000 --- a/src/basic/basic_commands_CC/cmd__jumptable_CC.s +++ /dev/null @@ -1,76 +0,0 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE - -// -// Jumptable for BASIC commands with tokens prefixed by $CC -// - -#if !HAS_SMALL_BASIC - -.const command_CC_list = List().add( - - cmd_old, - - cmd_merge, - - cmd_bload, - cmd_bsave, - cmd_bverify, - - cmd_clear, - varstr_garbage_collect, // cmd_dispose - - cmd_cold, - cmd_mem -) - -#else - -.const command_CC_list = List().add( - - cmd_old, - - cmd_merge, - - cmd_bload, - cmd_bsave, - cmd_bverify, - - cmd_clear, - varstr_garbage_collect // cmd_dispose -) - -#endif - - -#if !HAS_OPCODES_65C02 - - -command_CC_jumptable_lo: - - put_jumptable_lo(command_CC_list) - - -command_CC_jumptable_hi: - - put_jumptable_hi(command_CC_list) - - -#else // HAS_OPCODES_65C02 - - -__before_command_CC_jumptable: - -.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary - -command_CC_jumptable: - - put_jumptable(command_CC_list) - - // Make sure routine size is always the same - build system limitation - -.if (__before_command_CC_jumptable == command_CC_jumptable) { brk } - - -#endif diff --git a/src/basic/basic_commands_CD/cmd__jumptable_CD.s b/src/basic/basic_commands_CD/cmd__jumptable_CD.s deleted file mode 100644 index 9cfa0c9a..00000000 --- a/src/basic/basic_commands_CD/cmd__jumptable_CD.s +++ /dev/null @@ -1,46 +0,0 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE - -// -// Jumptable for BASIC commands with tokens prefixed by $CD -// - - -.const command_CD_list = List().add( - - cmd_slow, - cmd_fast -) - - -#if !HAS_OPCODES_65C02 - - -command_CD_jumptable_lo: - - put_jumptable_lo(command_CD_list) - - -command_CD_jumptable_hi: - - put_jumptable_hi(command_CD_list) - - -#else // HAS_OPCODES_65C02 - - -__before_command_CD_jumptable: - -.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary - -command_CD_jumptable: - - put_jumptable(command_CD_list) - - // Make sure routine size is always the same - build system limitation - -.if (__before_command_CD_jumptable == command_CD_jumptable) { brk } - - -#endif diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index a8dc44ab..06ddf755 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -80,21 +80,25 @@ tokenise_line_loop: // Check for extended tokens - lda #packed_freq_keywords_CC + lda #>packed_freq_keywords_01 sta FRESPC+1 jsr tk_search - bcc tokenise_line_keyword_CC // branch if keyword identified + bcc tokenise_line_keyword_01 // branch if keyword identified - lda #packed_freq_keywords_CD + lda #>packed_freq_keywords_02 sta FRESPC+1 jsr tk_search - bcc tokenise_line_keyword_CD // branch if keyword identified + bcc tokenise_line_keyword_02 // branch if keyword identified + +#endif // Shorten packed keyword candidate and try again @@ -169,20 +173,24 @@ tokenise_line_char: // Support for extended keyword lists -tokenise_line_keyword_CC: +#if !HAS_SMALL_BASIC + +tokenise_line_keyword_02: // Store the token list index - lda #$CC + lda #$02 skip_2_bytes_trash_nvz // FALLTROUGH -tokenise_line_keyword_CD: +#endif + +tokenise_line_keyword_01: // Store the token list index - lda #$CD + lda #$01 ldy tk__offset sta BUF, y diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index 3ac95047..17624201 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -39,12 +39,24 @@ execute_statements: // Check if token is valid for execution +#if HAS_SMALL_BASIC + + cpx #$01 + beq execute_statements_01 + +#else + + cpx #$03 + bcc execute_statements_extended + +#endif + + cpx #$CB + beq_16 cmd_go // // 'GO' command has a strange token, placed after function tokens + cpx #$7F bcc_16 execute_statements_var_assign // not a token - try variable assign - cpx #$A6 - bcs execute_statements_extended - #if !HAS_OPCODES_65C02 // Get the jump table entry for it, push it on the stack, and then RTS to start it. @@ -67,25 +79,25 @@ execute_statements: #endif +#if !HAS_SMALL_BASIC execute_statements_extended: // Support for extended BASIC commands - cpx #$CC - beq execute_statements_CC - cpx #$CD - beq execute_statements_CD + // XXX consider jumpable here - // 'GO' command has a strange token, it is placed after function tokens + cpx #$01 + beq execute_statements_01 - cpx #$CB - beq_16 cmd_go + cpx #$02 + beq execute_statements_02 jmp do_SYNTAX_error +#endif -execute_statements_CC: +execute_statements_01: // Get the sub-token, check that it is valid @@ -93,7 +105,7 @@ execute_statements_CC: cmp #$00 beq_16 do_SYNTAX_error - cmp #(TK__MAXTOKEN_keywords_CC+1) + cmp #(TK__MAXTOKEN_keywords_01+1) bcs_16 do_SYNTAX_error // Execute command @@ -103,9 +115,9 @@ execute_statements_CC: // Get the jump table entry for it, push it on the stack, and then RTS to start it. tax - lda command_CC_jumptable_hi - 1, x + lda command_01_jumptable_hi - 1, x pha - lda command_CC_jumptable_lo - 1, x + lda command_01_jumptable_lo - 1, x pha rts @@ -116,12 +128,13 @@ execute_statements_CC: asl tax - jmp (command_CC_jumptable - 2, x) + jmp (command_01_jumptable - 2, x) #endif +#if !HAS_SMALL_BASIC -execute_statements_CD: +execute_statements_02: // Get the sub-token, check that it is valid @@ -129,7 +142,7 @@ execute_statements_CD: cmp #$00 beq_16 do_SYNTAX_error - cmp #(TK__MAXTOKEN_keywords_CD+1) + cmp #(TK__MAXTOKEN_keywords_02+1) bcs_16 do_SYNTAX_error // Execute command @@ -139,9 +152,9 @@ execute_statements_CD: // Get the jump table entry for it, push it on the stack, and then RTS to start it. tax - lda command_CD_jumptable_hi - 1, x + lda command_02_jumptable_hi - 1, x pha - lda command_CD_jumptable_lo - 1, x + lda command_02_jumptable_lo - 1, x pha rts @@ -152,10 +165,11 @@ execute_statements_CD: asl tax - jmp (command_CD_jumptable - 2, x) + jmp (command_02_jumptable - 2, x) #endif +#endif // !HAS_SMALL_BASIC execute_statements_end_of_line: diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index ac2a4e19..ce235f98 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -79,6 +79,7 @@ list_print_loop: jmp list_is_literal list_not_quote: + // Check quote mode, and display as literal if required ldx QTSW bne list_is_literal @@ -86,87 +87,19 @@ list_not_quote: cmp #$FF beq list_is_pi + // Check for extended BASIC tokens + cmp #$01 + beq list_display_token_01 +#if !HAS_SMALL_BASIC + cmp #$02 + beq list_display_token_02 +#endif + + // Check for literals cmp #$7F bcc list_is_literal - // Display a token - -list_display_token_CC: - - cmp #$CC - bne list_display_token_CD - - // Fetch the sub-token - - iny -#if ROM_LAYOUT_M65 - jsr peek_via_OLDTXT -#elif CONFIG_MEMORY_MODEL_60K - ldx #packed_freq_keywords_CC + lda #packed_freq_keywords_01 bne print_freq_packed_string // branch always -print_packed_keyword_CD: // .X - token number +#if !HAS_SMALL_BASIC - lda #packed_freq_keywords_CD +print_packed_keyword_02: // .X - token number + + lda #packed_freq_keywords_02 bne print_freq_packed_string // branch always +#endif + print_packed_keyword_V2: // .X - token number lda #