From dbd8c777516fa9f549aeccd9f7b82da9c4198f26 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 9 Jul 2020 22:58:15 +0200 Subject: [PATCH] more size optimizations in BASIC interpreter --- src/basic/basic_commands/cmd__jumptable.s | 4 ++-- src/basic/basic_commands/cmd_clr.s | 8 ++----- src/basic/basic_commands/cmd_list.s | 2 +- src/basic/basic_commands/cmd_load_verify.s | 9 ++++---- src/basic/basic_commands/cmd_new.s | 2 +- src/basic/basic_commands/cmd_print.s | 2 +- src/basic/basic_commands/cmd_rem.s | 2 ++ src/basic/basic_commands/cmd_restore.s | 8 ++----- src/basic/basic_commands/cmd_run_goto.s | 9 ++++++++ src/basic/basic_commands/cmd_save.s | 2 +- src/basic/basic_commands/cmd_stop_end.s | 2 +- src/basic/basic_commands/cmd_sys.s | 5 +---- .../basic_commands_CC/cmd__jumptable_CC.s | 2 +- .../basic_commands_CC/cmd_bload_bverify.s | 2 +- src/basic/basic_commands_CC/cmd_clear.s | 7 ++----- src/basic/basic_commands_CC/cmd_cold.s | 4 +++- src/basic/basic_commands_CC/cmd_dispose.s | 9 +------- src/basic/basic_commands_CC/cmd_merge.s | 8 ++----- src/basic/basic_commands_CC/cmd_old.s | 2 +- src/basic/basic_commands_CD/cmd_fast_slow.s | 10 ++++----- src/basic/editor/shell.s | 8 +++++++ src/basic/engine/execute_line_statements.s | 21 ++++++++++++++----- 22 files changed, 67 insertions(+), 61 deletions(-) diff --git a/src/basic/basic_commands/cmd__jumptable.s b/src/basic/basic_commands/cmd__jumptable.s index d5f8e1ff..0a677b14 100644 --- a/src/basic/basic_commands/cmd__jumptable.s +++ b/src/basic/basic_commands/cmd__jumptable.s @@ -23,7 +23,7 @@ cmd_goto, cmd_run, cmd_if, - cmd_restore, + do_restore, // cmd_restore cmd_gosub, cmd_return, cmd_rem, @@ -42,7 +42,7 @@ cmd_print, cmd_cont, cmd_list, - cmd_clr, + do_clr, // cmd_clr cmd_cmd, cmd_sys, cmd_open, diff --git a/src/basic/basic_commands/cmd_clr.s b/src/basic/basic_commands/cmd_clr.s index 1204fca6..9305ec00 100644 --- a/src/basic/basic_commands/cmd_clr.s +++ b/src/basic/basic_commands/cmd_clr.s @@ -3,10 +3,6 @@ // #LAYOUT# * * #IGNORE -cmd_clr: +// PLACEHOLDER for completeness - jumptable contains direct address - jsr do_clr - - // CLR command does not stop execution (confirmed on a C64) - - jmp end_of_statement +// CLR command does not stop execution (confirmed on a C64) diff --git a/src/basic/basic_commands/cmd_list.s b/src/basic/basic_commands/cmd_list.s index 3da8ca4f..6d7eecc3 100644 --- a/src/basic/basic_commands/cmd_list.s +++ b/src/basic/basic_commands/cmd_list.s @@ -31,7 +31,7 @@ list_loop: // LIST terminates any running program, // because it has fiddled with the current line pointer. // (Confirmed by testing on a C64) - jmp shell_main_loop + jmp end_of_program list_more_lines: diff --git a/src/basic/basic_commands/cmd_load_verify.s b/src/basic/basic_commands/cmd_load_verify.s index dc1c6058..d9fdcda8 100644 --- a/src/basic/basic_commands/cmd_load_verify.s +++ b/src/basic/basic_commands/cmd_load_verify.s @@ -74,10 +74,9 @@ cmd_load_no_error: ldx CURLIN+1 inx - beq cmd_load_end // branch if direct mode + beq_16 end_of_program // branch if direct mode + + pha + pha jmp execute_line - -cmd_load_end: - - jmp shell_main_loop diff --git a/src/basic/basic_commands/cmd_new.s b/src/basic/basic_commands/cmd_new.s index e7d7189f..c726b527 100644 --- a/src/basic/basic_commands/cmd_new.s +++ b/src/basic/basic_commands/cmd_new.s @@ -9,4 +9,4 @@ cmd_new: // NEW command terminates execution (confirmed on a C64) - jmp shell_main_loop + jmp end_of_program diff --git a/src/basic/basic_commands/cmd_print.s b/src/basic/basic_commands/cmd_print.s index d5126f6f..f26eee42 100644 --- a/src/basic/basic_commands/cmd_print.s +++ b/src/basic/basic_commands/cmd_print.s @@ -91,4 +91,4 @@ cmd_print_done: // Execute next statement - jmp end_of_statement + rts diff --git a/src/basic/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index 1e5c113d..3247ab0f 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,4 +7,6 @@ cmd_rem: + pha + pha jmp execute_statements_end_of_line diff --git a/src/basic/basic_commands/cmd_restore.s b/src/basic/basic_commands/cmd_restore.s index 62d40846..6e67271e 100644 --- a/src/basic/basic_commands/cmd_restore.s +++ b/src/basic/basic_commands/cmd_restore.s @@ -3,10 +3,6 @@ // #LAYOUT# * * #IGNORE -cmd_restore: +// PLACEHOLDER for completeness - jumptable contains direct address - jsr do_restore - - // RESTORE command does not stop execution (confirmed on a C64) - - jmp end_of_statement +// RESTORE command does not stop execution (confirmed on a C64) diff --git a/src/basic/basic_commands/cmd_run_goto.s b/src/basic/basic_commands/cmd_run_goto.s index 4282ca1c..a960d05c 100644 --- a/src/basic/basic_commands/cmd_run_goto.s +++ b/src/basic/basic_commands/cmd_run_goto.s @@ -4,9 +4,15 @@ cmd_run: + // RUN clears all variables jsr do_clr + cmd_goto: + + // XXX optimize this: deduplicate last part (and init_oldtxt) with load/verify, + // if line number greater than current line - find line backwards + // Disable Kernal messages lda #$00 jsr JSETMSG @@ -24,4 +30,7 @@ cmd_goto: jmp do_UNDEFD_STATEMENT_error !: // Run it! + + pha + pha jmp execute_line diff --git a/src/basic/basic_commands/cmd_save.s b/src/basic/basic_commands/cmd_save.s index 5a944582..faee06a5 100644 --- a/src/basic/basic_commands/cmd_save.s +++ b/src/basic/basic_commands/cmd_save.s @@ -40,4 +40,4 @@ cmd_save_do: // entry point for BSAVE // Execute next statement - jmp end_of_statement \ No newline at end of file + rts diff --git a/src/basic/basic_commands/cmd_stop_end.s b/src/basic/basic_commands/cmd_stop_end.s index 3cf6f64c..2c87a33a 100644 --- a/src/basic/basic_commands/cmd_stop_end.s +++ b/src/basic/basic_commands/cmd_stop_end.s @@ -27,4 +27,4 @@ cmd_stop: cmd_end: - jmp shell_main_loop + jmp end_of_program diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index 16b5fbba..e1f7c001 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -60,10 +60,7 @@ cmd_sys_setup_call: plp // Call the routine. - jsr USRPOK - - jmp end_of_statement - + jmp USRPOK // // XXX Temporary ugly hack to support 'SYS PI*656' diff --git a/src/basic/basic_commands_CC/cmd__jumptable_CC.s b/src/basic/basic_commands_CC/cmd__jumptable_CC.s index fa795621..6df67cdc 100644 --- a/src/basic/basic_commands_CC/cmd__jumptable_CC.s +++ b/src/basic/basic_commands_CC/cmd__jumptable_CC.s @@ -19,7 +19,7 @@ cmd_cold, cmd_clear, - cmd_dispose + varstr_garbage_collect // cmd_dispose ) diff --git a/src/basic/basic_commands_CC/cmd_bload_bverify.s b/src/basic/basic_commands_CC/cmd_bload_bverify.s index 615f3901..149e7caa 100644 --- a/src/basic/basic_commands_CC/cmd_bload_bverify.s +++ b/src/basic/basic_commands_CC/cmd_bload_bverify.s @@ -39,4 +39,4 @@ cmd_bload: // Execute next statement - jmp end_of_statement + rts diff --git a/src/basic/basic_commands_CC/cmd_clear.s b/src/basic/basic_commands_CC/cmd_clear.s index 76cf9f83..ef71e4ff 100644 --- a/src/basic/basic_commands_CC/cmd_clear.s +++ b/src/basic/basic_commands_CC/cmd_clear.s @@ -5,9 +5,6 @@ cmd_clear: - jsr clear_screen - - // Execute next statement - - jmp end_of_statement + // XXX in the future add separate implementation for graphics screen + jmp clear_screen diff --git a/src/basic/basic_commands_CC/cmd_cold.s b/src/basic/basic_commands_CC/cmd_cold.s index 345d26c6..be21a689 100644 --- a/src/basic/basic_commands_CC/cmd_cold.s +++ b/src/basic/basic_commands_CC/cmd_cold.s @@ -6,7 +6,9 @@ cmd_cold: jsr helper_ask_if_sure - bcs_16 end_of_statement + bcs !+ jsr JCLALL // for extra safety jmp (vector_reset) // hardware CPU vector +!: + rts \ No newline at end of file diff --git a/src/basic/basic_commands_CC/cmd_dispose.s b/src/basic/basic_commands_CC/cmd_dispose.s index 51b88bfa..cccb47e2 100644 --- a/src/basic/basic_commands_CC/cmd_dispose.s +++ b/src/basic/basic_commands_CC/cmd_dispose.s @@ -3,11 +3,4 @@ // #LAYOUT# * * #IGNORE -cmd_dispose: - - jsr varstr_garbage_collect - - // Execute next statement - - jmp end_of_statement - +// PLACEHOLDER for completeness - jumptable contains direct address diff --git a/src/basic/basic_commands_CC/cmd_merge.s b/src/basic/basic_commands_CC/cmd_merge.s index 376e19a8..dab2f34f 100644 --- a/src/basic/basic_commands_CC/cmd_merge.s +++ b/src/basic/basic_commands_CC/cmd_merge.s @@ -42,10 +42,6 @@ cmd_merge_got_params: cmd_merge_no_error: - // Relink loaded program, clear variables + // Relink loaded program, clear variables, execute next statement - jsr update_LINKPRG_VARTAB_do_clr - - // Execute next statement - - jmp end_of_statement + jmp update_LINKPRG_VARTAB_do_clr diff --git a/src/basic/basic_commands_CC/cmd_old.s b/src/basic/basic_commands_CC/cmd_old.s index 9b816edf..1eeca8e9 100644 --- a/src/basic/basic_commands_CC/cmd_old.s +++ b/src/basic/basic_commands_CC/cmd_old.s @@ -21,4 +21,4 @@ cmd_old: // Quit - jmp shell_main_loop + jmp end_of_program diff --git a/src/basic/basic_commands_CD/cmd_fast_slow.s b/src/basic/basic_commands_CD/cmd_fast_slow.s index ddc8ce70..e8b9ed5d 100644 --- a/src/basic/basic_commands_CD/cmd_fast_slow.s +++ b/src/basic/basic_commands_CD/cmd_fast_slow.s @@ -20,7 +20,7 @@ cmd_fast: lda #$41 sta CPU_D6510 - jmp end_of_statement + rts #elif CONFIG_MB_ULTIMATE_64 @@ -30,12 +30,12 @@ cmd_fast: cmd_slow: sta SCPU_SPEED_NORMAL - jmp end_of_statement + rts cmd_fast: sta SCPU_SPEED_TURBO - jmp end_of_statement + rts #elif CONFIG_PLATFORM_COMMODORE_64 @@ -60,13 +60,13 @@ cmd_fast: lda #$01 !: sta VIC_CLKRATE - jmp end_of_statement + rts #else cmd_slow: - nop // to prevent double label + nop // just to prevent double label // FALLTROUGH diff --git a/src/basic/editor/shell.s b/src/basic/editor/shell.s index 5d66c48b..d8482a9c 100644 --- a/src/basic/editor/shell.s +++ b/src/basic/editor/shell.s @@ -3,6 +3,14 @@ // #LAYOUT# * * #IGNORE +end_of_program: + + // Entry point for commands not wishing to continue + pha + pha + + // FALLTROUGH + shell_main_loop: // Tell user we are ready diff --git a/src/basic/engine/execute_line_statements.s b/src/basic/engine/execute_line_statements.s index 51f34df4..fa8a23be 100644 --- a/src/basic/engine/execute_line_statements.s +++ b/src/basic/engine/execute_line_statements.s @@ -42,14 +42,24 @@ execute_statements: cmp #$7F bcc_16 execute_statements_var_assign // not a token - try variable assign - cmp #$A6 + // Move token code to .X + + tax + + // A token - first push the 'end_of_statement' address for RTS + + lda #>(end_of_statement - 1) + pha + lda #<(end_of_statement - 1) + pha + + 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. - tax lda command_jumptable_hi - $80, x pha lda command_jumptable_lo - $80, x @@ -61,6 +71,7 @@ execute_statements: // Use jumptable to go to the command routine + txa asl tax jmp (command_jumptable, x) @@ -72,14 +83,14 @@ execute_statements_extended: // Support for extended BASIC commands - cmp #$CC + cpx #$CC beq execute_statements_CC - cmp #$CD + cpx #$CD beq execute_statements_CD // 'GO' command has a strange token, it is placed after function tokens - cmp #$CB + cpx #$CB beq_16 cmd_go jmp do_SYNTAX_error