From 0c8c0d6ad4c008cf5f087763c20a3ac958a580ce Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Jun 2020 18:26:38 +0200 Subject: [PATCH] separated commands from functions --- Makefile | 5 +- .../cmd__jumptable.s} | 59 ++----- c64/basic/basic_commands/cmd__unimplemented.s | 65 ++++++++ .../{commands => basic_commands}/cmd_clr.s | 0 .../{commands => basic_commands}/cmd_list.s | 0 .../cmd_load_verify.s | 0 .../{commands => basic_commands}/cmd_new.s | 0 .../{commands => basic_commands}/cmd_print.s | 0 .../{commands => basic_commands}/cmd_rem.s | 0 .../cmd_run_goto.s} | 0 .../{commands => basic_commands}/cmd_save.s | 0 .../cmd_stop_end.s} | 0 .../{commands => basic_commands}/cmd_sys.s | 0 c64/basic/basic_functions/fun__jumptable.s | 72 ++++++++ .../basic_functions/fun__unimplemented.s | 61 +++++++ .../oper__jumptable.s} | 0 .../{operators => basic_operators}/oper_add.s | 0 .../{operators => basic_operators}/oper_and.s | 0 .../oper_cmp_eq.s | 0 .../oper_cmp_gt.s | 0 .../oper_cmp_gteq.s | 0 .../oper_cmp_lt.s | 0 .../oper_cmp_lteq.s | 0 .../oper_cmp_neq.s | 0 .../{operators => basic_operators}/oper_div.s | 0 .../{operators => basic_operators}/oper_mul.s | 0 .../{operators => basic_operators}/oper_or.s | 0 .../{operators => basic_operators}/oper_pow.s | 0 .../{operators => basic_operators}/oper_sub.s | 0 .../oper_unary_minus.s | 0 .../oper_unary_not.s | 0 c64/basic/commands/cmd_unimplemented.s | 154 ------------------ c64/basic/engine/ad9e.frmevl.s | 2 +- c64/basic/engine/execute_line_statements.s | 6 +- 34 files changed, 215 insertions(+), 209 deletions(-) rename c64/basic/{commands/command_jumptable.s => basic_commands/cmd__jumptable.s} (65%) create mode 100644 c64/basic/basic_commands/cmd__unimplemented.s rename c64/basic/{commands => basic_commands}/cmd_clr.s (100%) rename c64/basic/{commands => basic_commands}/cmd_list.s (100%) rename c64/basic/{commands => basic_commands}/cmd_load_verify.s (100%) rename c64/basic/{commands => basic_commands}/cmd_new.s (100%) rename c64/basic/{commands => basic_commands}/cmd_print.s (100%) rename c64/basic/{commands => basic_commands}/cmd_rem.s (100%) rename c64/basic/{commands/cmd_run.s => basic_commands/cmd_run_goto.s} (100%) rename c64/basic/{commands => basic_commands}/cmd_save.s (100%) rename c64/basic/{commands/cmd_break.s => basic_commands/cmd_stop_end.s} (100%) rename c64/basic/{commands => basic_commands}/cmd_sys.s (100%) create mode 100644 c64/basic/basic_functions/fun__jumptable.s create mode 100644 c64/basic/basic_functions/fun__unimplemented.s rename c64/basic/{operators/operators_jumptable.s => basic_operators/oper__jumptable.s} (100%) rename c64/basic/{operators => basic_operators}/oper_add.s (100%) rename c64/basic/{operators => basic_operators}/oper_and.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_eq.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_gt.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_gteq.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_lt.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_lteq.s (100%) rename c64/basic/{operators => basic_operators}/oper_cmp_neq.s (100%) rename c64/basic/{operators => basic_operators}/oper_div.s (100%) rename c64/basic/{operators => basic_operators}/oper_mul.s (100%) rename c64/basic/{operators => basic_operators}/oper_or.s (100%) rename c64/basic/{operators => basic_operators}/oper_pow.s (100%) rename c64/basic/{operators => basic_operators}/oper_sub.s (100%) rename c64/basic/{operators => basic_operators}/oper_unary_minus.s (100%) rename c64/basic/{operators => basic_operators}/oper_unary_not.s (100%) delete mode 100644 c64/basic/commands/cmd_unimplemented.s diff --git a/Makefile b/Makefile index 3aa682b4..7f0b7ccb 100644 --- a/Makefile +++ b/Makefile @@ -13,15 +13,16 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ c64/basic/,stubs \ c64/basic/,stubs_math \ c64/basic/assets \ + c64/basic/basic_commands \ + c64/basic/basic_operators \ + c64/basic/basic_functions \ c64/basic/board_m65 \ c64/basic/board_x16 \ - c64/basic/commands \ c64/basic/engine \ c64/basic/init \ c64/basic/math \ c64/basic/math_consts \ c64/basic/math_mov \ - c64/basic/operators \ c64/basic/print \ c64/basic/rom_revision \ c64/basic/wedge diff --git a/c64/basic/commands/command_jumptable.s b/c64/basic/basic_commands/cmd__jumptable.s similarity index 65% rename from c64/basic/commands/command_jumptable.s rename to c64/basic/basic_commands/cmd__jumptable.s index dd64cb47..1fa25c49 100644 --- a/c64/basic/commands/command_jumptable.s +++ b/c64/basic/basic_commands/cmd__jumptable.s @@ -3,13 +3,10 @@ // #LAYOUT# * * #IGNORE // -// Jumptable for all known BASIC commands and functions +// Jumptable for all known BASIC commands // -// XXX use separate jumptables for commands and functions - - .const command_list = List().add( // $80 - $8F @@ -50,60 +47,24 @@ cmd_sys, cmd_open, - // $A0-$A9 + // $A0-$A6 cmd_close, cmd_get, cmd_new, - cmd_tab, - cmd_to, - cmd_fn, - cmd_spc, - cmd_then, - cmd_not, - cmd_step, + cmd_tab, // XXX this token probably does not belong here + do_SYNTAX_error, // 'TO' is not a standalone command + do_SYNTAX_error, // 'FN' is not a standalone command + cmd_spc, // XXX this token probably does not belong here + + // 'THEN' ($A7) and 'STEP' ($A9) are not standalone commands + // 'NOT' ($A8) is an operator, not a command - // $CB, but remapped to $A9 + // $CB, but remapped to $A7 cmd_go ) -/* - XXX we need a separate function dispatch table for the following ones: - - - // $B4-$BF - - cmd_sgn, - cmd_int, - cmd_abs, - cmd_usr, - cmd_fre, - cmd_pos, - cmd_sqr, - cmd_rnd, - cmd_log, - cmd_exp, - cmd_cos, - cmd_sin, - - // $C0-$CA - - cmd_tan, - cmd_atn, - cmd_peek, - cmd_len, - cmd_str, - cmd_val, - cmd_asc, - cmd_chr, - cmd_left, - cmd_right, - cmd_mid -*/ - - - #if !HAS_OPCODES_65C02 diff --git a/c64/basic/basic_commands/cmd__unimplemented.s b/c64/basic/basic_commands/cmd__unimplemented.s new file mode 100644 index 00000000..4e67d479 --- /dev/null +++ b/c64/basic/basic_commands/cmd__unimplemented.s @@ -0,0 +1,65 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Default handler for all not-yet-implemented commands +// +// Note: NOPs are here just to make debugging easier (no duplicated labels)! +// + + +cmd_for: + nop +cmd_next: + nop +cmd_data: + nop +cmd_inputhash: + nop +cmd_input: + nop +cmd_dim: + nop +cmd_read: + nop +cmd_let: + nop +cmd_if: + nop +cmd_restore: + nop +cmd_gosub: + nop +cmd_return: + nop +cmd_on: + nop +cmd_wait: + nop +cmd_def: + nop +cmd_poke: + nop +cmd_printhash: + nop +cmd_cont: + nop +cmd_cmd: + nop +cmd_open: + nop +cmd_close: + nop +cmd_get: + nop +cmd_tab: + nop +cmd_spc: + nop +cmd_go: + nop + + // Unimplemented tokens + + jmp do_NOT_IMPLEMENTED_error diff --git a/c64/basic/commands/cmd_clr.s b/c64/basic/basic_commands/cmd_clr.s similarity index 100% rename from c64/basic/commands/cmd_clr.s rename to c64/basic/basic_commands/cmd_clr.s diff --git a/c64/basic/commands/cmd_list.s b/c64/basic/basic_commands/cmd_list.s similarity index 100% rename from c64/basic/commands/cmd_list.s rename to c64/basic/basic_commands/cmd_list.s diff --git a/c64/basic/commands/cmd_load_verify.s b/c64/basic/basic_commands/cmd_load_verify.s similarity index 100% rename from c64/basic/commands/cmd_load_verify.s rename to c64/basic/basic_commands/cmd_load_verify.s diff --git a/c64/basic/commands/cmd_new.s b/c64/basic/basic_commands/cmd_new.s similarity index 100% rename from c64/basic/commands/cmd_new.s rename to c64/basic/basic_commands/cmd_new.s diff --git a/c64/basic/commands/cmd_print.s b/c64/basic/basic_commands/cmd_print.s similarity index 100% rename from c64/basic/commands/cmd_print.s rename to c64/basic/basic_commands/cmd_print.s diff --git a/c64/basic/commands/cmd_rem.s b/c64/basic/basic_commands/cmd_rem.s similarity index 100% rename from c64/basic/commands/cmd_rem.s rename to c64/basic/basic_commands/cmd_rem.s diff --git a/c64/basic/commands/cmd_run.s b/c64/basic/basic_commands/cmd_run_goto.s similarity index 100% rename from c64/basic/commands/cmd_run.s rename to c64/basic/basic_commands/cmd_run_goto.s diff --git a/c64/basic/commands/cmd_save.s b/c64/basic/basic_commands/cmd_save.s similarity index 100% rename from c64/basic/commands/cmd_save.s rename to c64/basic/basic_commands/cmd_save.s diff --git a/c64/basic/commands/cmd_break.s b/c64/basic/basic_commands/cmd_stop_end.s similarity index 100% rename from c64/basic/commands/cmd_break.s rename to c64/basic/basic_commands/cmd_stop_end.s diff --git a/c64/basic/commands/cmd_sys.s b/c64/basic/basic_commands/cmd_sys.s similarity index 100% rename from c64/basic/commands/cmd_sys.s rename to c64/basic/basic_commands/cmd_sys.s diff --git a/c64/basic/basic_functions/fun__jumptable.s b/c64/basic/basic_functions/fun__jumptable.s new file mode 100644 index 00000000..0d53bcdc --- /dev/null +++ b/c64/basic/basic_functions/fun__jumptable.s @@ -0,0 +1,72 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Jumptable for all known BASIC functions +// + + +.const function_list = List().add( + + // $B4-$BF + + fun_sgn, + fun_int, + fun_abs, + fun_usr, + fun_fre, + fun_pos, + fun_sqr, + fun_rnd, + fun_log, + fun_exp, + fun_cos, + fun_sin, + + // $C0-$CA + + fun_tan, + fun_atn, + fun_peek, + fun_len, + fun_str, + fun_val, + fun_asc, + fun_chr, + fun_left, + fun_right, + fun_mid +) + + +#if !HAS_OPCODES_65C02 + + +function_jumptable_lo: + + put_jumptable_lo(function_list) + + +function_jumptable_hi: + + put_jumptable_hi(function_list) + + +#else // HAS_OPCODES_65C02 + + +__before_function_jumptable: + +.if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary + +function_jumptable: + + put_jumptable(function_list) + + // Make sure routine size is always the same - build system limitation + +.if (__before_function_jumptable == function_jumptable) { brk } + + +#endif diff --git a/c64/basic/basic_functions/fun__unimplemented.s b/c64/basic/basic_functions/fun__unimplemented.s new file mode 100644 index 00000000..8954996d --- /dev/null +++ b/c64/basic/basic_functions/fun__unimplemented.s @@ -0,0 +1,61 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Default handler for all not-yet-implemented functions +// +// Note: NOPs are here just to make debugging easier (no duplicated labels)! +// + + +fun_sgn: + nop +fun_int: + nop +fun_abs: + nop +fun_usr: + nop +fun_fre: + nop +fun_pos: + nop +fun_sqr: + nop +fun_rnd: + nop +fun_log: + nop +fun_exp: + nop +fun_cos: + nop +fun_sin: + nop +fun_tan: + nop +fun_atn: + nop +fun_peek: + nop +fun_len: + nop +fun_str: + nop +fun_val: + nop +fun_asc: + nop +fun_chr: + nop +fun_left: + nop +fun_right: + nop +fun_mid: + nop + + // Unimplemented tokens + + jmp do_NOT_IMPLEMENTED_error diff --git a/c64/basic/operators/operators_jumptable.s b/c64/basic/basic_operators/oper__jumptable.s similarity index 100% rename from c64/basic/operators/operators_jumptable.s rename to c64/basic/basic_operators/oper__jumptable.s diff --git a/c64/basic/operators/oper_add.s b/c64/basic/basic_operators/oper_add.s similarity index 100% rename from c64/basic/operators/oper_add.s rename to c64/basic/basic_operators/oper_add.s diff --git a/c64/basic/operators/oper_and.s b/c64/basic/basic_operators/oper_and.s similarity index 100% rename from c64/basic/operators/oper_and.s rename to c64/basic/basic_operators/oper_and.s diff --git a/c64/basic/operators/oper_cmp_eq.s b/c64/basic/basic_operators/oper_cmp_eq.s similarity index 100% rename from c64/basic/operators/oper_cmp_eq.s rename to c64/basic/basic_operators/oper_cmp_eq.s diff --git a/c64/basic/operators/oper_cmp_gt.s b/c64/basic/basic_operators/oper_cmp_gt.s similarity index 100% rename from c64/basic/operators/oper_cmp_gt.s rename to c64/basic/basic_operators/oper_cmp_gt.s diff --git a/c64/basic/operators/oper_cmp_gteq.s b/c64/basic/basic_operators/oper_cmp_gteq.s similarity index 100% rename from c64/basic/operators/oper_cmp_gteq.s rename to c64/basic/basic_operators/oper_cmp_gteq.s diff --git a/c64/basic/operators/oper_cmp_lt.s b/c64/basic/basic_operators/oper_cmp_lt.s similarity index 100% rename from c64/basic/operators/oper_cmp_lt.s rename to c64/basic/basic_operators/oper_cmp_lt.s diff --git a/c64/basic/operators/oper_cmp_lteq.s b/c64/basic/basic_operators/oper_cmp_lteq.s similarity index 100% rename from c64/basic/operators/oper_cmp_lteq.s rename to c64/basic/basic_operators/oper_cmp_lteq.s diff --git a/c64/basic/operators/oper_cmp_neq.s b/c64/basic/basic_operators/oper_cmp_neq.s similarity index 100% rename from c64/basic/operators/oper_cmp_neq.s rename to c64/basic/basic_operators/oper_cmp_neq.s diff --git a/c64/basic/operators/oper_div.s b/c64/basic/basic_operators/oper_div.s similarity index 100% rename from c64/basic/operators/oper_div.s rename to c64/basic/basic_operators/oper_div.s diff --git a/c64/basic/operators/oper_mul.s b/c64/basic/basic_operators/oper_mul.s similarity index 100% rename from c64/basic/operators/oper_mul.s rename to c64/basic/basic_operators/oper_mul.s diff --git a/c64/basic/operators/oper_or.s b/c64/basic/basic_operators/oper_or.s similarity index 100% rename from c64/basic/operators/oper_or.s rename to c64/basic/basic_operators/oper_or.s diff --git a/c64/basic/operators/oper_pow.s b/c64/basic/basic_operators/oper_pow.s similarity index 100% rename from c64/basic/operators/oper_pow.s rename to c64/basic/basic_operators/oper_pow.s diff --git a/c64/basic/operators/oper_sub.s b/c64/basic/basic_operators/oper_sub.s similarity index 100% rename from c64/basic/operators/oper_sub.s rename to c64/basic/basic_operators/oper_sub.s diff --git a/c64/basic/operators/oper_unary_minus.s b/c64/basic/basic_operators/oper_unary_minus.s similarity index 100% rename from c64/basic/operators/oper_unary_minus.s rename to c64/basic/basic_operators/oper_unary_minus.s diff --git a/c64/basic/operators/oper_unary_not.s b/c64/basic/basic_operators/oper_unary_not.s similarity index 100% rename from c64/basic/operators/oper_unary_not.s rename to c64/basic/basic_operators/oper_unary_not.s diff --git a/c64/basic/commands/cmd_unimplemented.s b/c64/basic/commands/cmd_unimplemented.s deleted file mode 100644 index 1280d692..00000000 --- a/c64/basic/commands/cmd_unimplemented.s +++ /dev/null @@ -1,154 +0,0 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE - -// -// Default handler for all not-yet-implemented commands -// -// Note: NOPs are here just to make debugging easier! -// - -cmd_for: - nop -cmd_next: - nop -cmd_data: - nop -cmd_inputhash: - nop -cmd_input: - nop -cmd_dim: - nop -cmd_read: - nop -cmd_let: - nop -cmd_if: - nop -cmd_restore: - nop -cmd_gosub: - nop -cmd_return: - nop - - // $90-$9F - -cmd_on: - nop -cmd_wait: - nop -cmd_def: - nop -cmd_poke: - nop -cmd_printhash: - nop -cmd_cont: - nop -cmd_cmd: - nop -cmd_open: - nop - - // $A0-$AF - -cmd_close: - nop -cmd_get: - nop -cmd_tab: - nop -cmd_to: - nop -cmd_fn: - nop -cmd_spc: - nop -cmd_then: - nop -cmd_not: - nop -cmd_step: - nop -cmd_plus: - nop -cmd_minus: - nop -cmd_mult: - nop -cmd_div: - nop -cmd_exponent: - nop -cmd_and: - nop - - // $B0-$BF - -cmd_or: - nop -cmd_greater: - nop -cmd_equal: - nop -cmd_less: - nop -cmd_sgn: - nop -cmd_int: - nop -cmd_abs: - nop -cmd_usr: - nop -cmd_fre: - nop -cmd_pos: - nop -cmd_sqr: - nop -cmd_rnd: - nop -cmd_log: - nop -cmd_exp: - nop -cmd_cos: - nop -cmd_sin: - nop - - // $C0-$CF - -cmd_tan: - nop -cmd_atn: - nop -cmd_peek: - nop -cmd_len: - nop -cmd_str: - nop -cmd_val: - nop -cmd_asc: - nop -cmd_chr: - nop -cmd_left: - nop -cmd_right: - nop -cmd_mid: - nop -cmd_go: - nop - - // Undefined tokens - -cmd_unimplemented: - - jmp do_NOT_IMPLEMENTED_error diff --git a/c64/basic/engine/ad9e.frmevl.s b/c64/basic/engine/ad9e.frmevl.s index a2bd1fdf..1c7e51af 100644 --- a/c64/basic/engine/ad9e.frmevl.s +++ b/c64/basic/engine/ad9e.frmevl.s @@ -87,7 +87,7 @@ FRMEVL_loop: FRMEVL_execute_function: - // XXX implement this + // XXX implement this - use function_jumptable* jmp do_NOT_IMPLEMENTED_error diff --git a/c64/basic/engine/execute_line_statements.s b/c64/basic/engine/execute_line_statements.s index 8d70b130..df512e35 100644 --- a/c64/basic/engine/execute_line_statements.s +++ b/c64/basic/engine/execute_line_statements.s @@ -32,7 +32,7 @@ execute_statements: cmp #$7F bcc_16 do_SYNTAX_error // branch if not a token XXX here we should handle variable assignments - cmp #$A9 + cmp #$A6 bcs execute_statements_extended execute_statements_run_token: @@ -73,9 +73,9 @@ execute_statements_extended: cmp #$CB bne !+ - // 'GO' command has a strande token, after functions + // 'GO' command has a strange token, after function tokens - lda #$A9 + lda #$A7 bne execute_statements_run_token !: // XXX here is the place for possible extended BASIC command set