From defd079b2e54a291612fe7a2f3e5cdd40573c38c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 9 Jul 2020 22:23:04 +0200 Subject: [PATCH] improved syntax checking in BASIC --- src/basic/basic_commands/cmd_clr.s | 2 +- src/basic/basic_commands/cmd_load_verify.s | 2 +- src/basic/basic_commands/cmd_print.s | 4 ++- src/basic/basic_commands/cmd_restore.s | 2 +- src/basic/basic_commands/cmd_save.s | 4 +-- src/basic/basic_commands/cmd_sys.s | 2 +- .../basic_commands_CC/cmd_bload_bverify.s | 4 +-- src/basic/basic_commands_CC/cmd_clear.s | 5 ++- src/basic/basic_commands_CC/cmd_cold.s | 2 +- src/basic/basic_commands_CC/cmd_dispose.s | 5 ++- src/basic/basic_commands_CC/cmd_merge.s | 4 +-- src/basic/basic_commands_CD/cmd_fast_slow.s | 9 +++--- src/basic/engine/end_of_statement.s | 32 +++++++++++++++++++ src/basic/engine/end_of_statement_check.s | 2 -- 14 files changed, 58 insertions(+), 21 deletions(-) create mode 100644 src/basic/engine/end_of_statement.s diff --git a/src/basic/basic_commands/cmd_clr.s b/src/basic/basic_commands/cmd_clr.s index f944eacc..1204fca6 100644 --- a/src/basic/basic_commands/cmd_clr.s +++ b/src/basic/basic_commands/cmd_clr.s @@ -9,4 +9,4 @@ cmd_clr: // CLR command does not stop execution (confirmed on a C64) - jmp execute_statements + jmp end_of_statement diff --git a/src/basic/basic_commands/cmd_load_verify.s b/src/basic/basic_commands/cmd_load_verify.s index 9a0d59fd..dc1c6058 100644 --- a/src/basic/basic_commands/cmd_load_verify.s +++ b/src/basic/basic_commands/cmd_load_verify.s @@ -52,7 +52,7 @@ cmd_load_no_error: // For VERIFY - this is it lda VERCKB - bne_16 execute_statements + bne_16 end_of_statement // C64 BASIC apparently does not clear variables after a LOAD in the // middle of a program. For safety, we do. diff --git a/src/basic/basic_commands/cmd_print.s b/src/basic/basic_commands/cmd_print.s index 66443f4c..d5126f6f 100644 --- a/src/basic/basic_commands/cmd_print.s +++ b/src/basic/basic_commands/cmd_print.s @@ -89,4 +89,6 @@ cmd_print_new_line_done: cmd_print_done: - jmp execute_statements + // Execute next statement + + jmp end_of_statement diff --git a/src/basic/basic_commands/cmd_restore.s b/src/basic/basic_commands/cmd_restore.s index 034db54e..62d40846 100644 --- a/src/basic/basic_commands/cmd_restore.s +++ b/src/basic/basic_commands/cmd_restore.s @@ -9,4 +9,4 @@ cmd_restore: // RESTORE command does not stop execution (confirmed on a C64) - jmp execute_statements + jmp end_of_statement diff --git a/src/basic/basic_commands/cmd_save.s b/src/basic/basic_commands/cmd_save.s index 5ced4b27..5a944582 100644 --- a/src/basic/basic_commands/cmd_save.s +++ b/src/basic/basic_commands/cmd_save.s @@ -38,6 +38,6 @@ cmd_save_do: // entry point for BSAVE jsr JSAVE bcs_16 do_kernal_error - // The end + // Execute next statement - jmp execute_statements + jmp end_of_statement \ No newline at end of file diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index 8dd3f5a7..16b5fbba 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -62,7 +62,7 @@ cmd_sys_setup_call: // Call the routine. jsr USRPOK - jmp execute_statements + jmp end_of_statement // diff --git a/src/basic/basic_commands_CC/cmd_bload_bverify.s b/src/basic/basic_commands_CC/cmd_bload_bverify.s index 2b6db9fb..615f3901 100644 --- a/src/basic/basic_commands_CC/cmd_bload_bverify.s +++ b/src/basic/basic_commands_CC/cmd_bload_bverify.s @@ -37,6 +37,6 @@ cmd_bload: jsr JLOAD bcs_16 do_kernal_error - // XXX when number parsing is done, change to continue execution + // Execute next statement - jmp shell_main_loop + jmp end_of_statement diff --git a/src/basic/basic_commands_CC/cmd_clear.s b/src/basic/basic_commands_CC/cmd_clear.s index fc2a2ee8..76cf9f83 100644 --- a/src/basic/basic_commands_CC/cmd_clear.s +++ b/src/basic/basic_commands_CC/cmd_clear.s @@ -7,4 +7,7 @@ cmd_clear: jsr clear_screen - jmp execute_statements + // Execute next statement + + jmp end_of_statement + diff --git a/src/basic/basic_commands_CC/cmd_cold.s b/src/basic/basic_commands_CC/cmd_cold.s index fe197941..345d26c6 100644 --- a/src/basic/basic_commands_CC/cmd_cold.s +++ b/src/basic/basic_commands_CC/cmd_cold.s @@ -6,7 +6,7 @@ cmd_cold: jsr helper_ask_if_sure - bcs_16 execute_statements + bcs_16 end_of_statement jsr JCLALL // for extra safety jmp (vector_reset) // hardware CPU vector diff --git a/src/basic/basic_commands_CC/cmd_dispose.s b/src/basic/basic_commands_CC/cmd_dispose.s index f2adb22e..51b88bfa 100644 --- a/src/basic/basic_commands_CC/cmd_dispose.s +++ b/src/basic/basic_commands_CC/cmd_dispose.s @@ -7,4 +7,7 @@ cmd_dispose: jsr varstr_garbage_collect - jmp execute_statements + // Execute next statement + + jmp end_of_statement + diff --git a/src/basic/basic_commands_CC/cmd_merge.s b/src/basic/basic_commands_CC/cmd_merge.s index 42f3b1ed..376e19a8 100644 --- a/src/basic/basic_commands_CC/cmd_merge.s +++ b/src/basic/basic_commands_CC/cmd_merge.s @@ -46,6 +46,6 @@ cmd_merge_no_error: jsr update_LINKPRG_VARTAB_do_clr - // XXX when number parsing is done, change to continue execution + // Execute next statement - jmp shell_main_loop + jmp end_of_statement diff --git a/src/basic/basic_commands_CD/cmd_fast_slow.s b/src/basic/basic_commands_CD/cmd_fast_slow.s index 79fcb6ae..ddc8ce70 100644 --- a/src/basic/basic_commands_CD/cmd_fast_slow.s +++ b/src/basic/basic_commands_CD/cmd_fast_slow.s @@ -20,8 +20,8 @@ cmd_fast: lda #$41 sta CPU_D6510 + jmp end_of_statement - jmp execute_statements #elif CONFIG_MB_ULTIMATE_64 @@ -30,12 +30,12 @@ cmd_fast: cmd_slow: sta SCPU_SPEED_NORMAL - jmp execute_statements + jmp end_of_statement cmd_fast: sta SCPU_SPEED_TURBO - jmp execute_statements + jmp end_of_statement #elif CONFIG_PLATFORM_COMMODORE_64 @@ -60,8 +60,7 @@ cmd_fast: lda #$01 !: sta VIC_CLKRATE - - jmp execute_statements + jmp end_of_statement #else diff --git a/src/basic/engine/end_of_statement.s b/src/basic/engine/end_of_statement.s new file mode 100644 index 00000000..e6d2442c --- /dev/null +++ b/src/basic/engine/end_of_statement.s @@ -0,0 +1,32 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Executes the next command - after previous got finished +// + + +end_of_statement: + jsr fetch_character + + cmp #$3A // check for colon + beq end_of_statement_next + + cmp #$00 // check for end of the line + beq_16 execute_statements_end_of_line + + cmp #$20 // check for space + beq end_of_statement + + // Unexpectyed character + + jmp do_SYNTAX_error + +end_of_statement_next: + + // Go to next statement + + // XXX this should be speed-optimized, so that no unconsume is necessary + jsr unconsume_character + jmp execute_statements diff --git a/src/basic/engine/end_of_statement_check.s b/src/basic/engine/end_of_statement_check.s index 2c7a7271..8a4c7011 100644 --- a/src/basic/engine/end_of_statement_check.s +++ b/src/basic/engine/end_of_statement_check.s @@ -9,8 +9,6 @@ end_of_statement_check: - // XXX this can probably be size-optimized - ldy #$00 #if CONFIG_MEMORY_MODEL_60K