From f5b4e554ac8cc34e0d1ddefa8efc3c3f9b0cbad4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 6 Jun 2020 10:09:25 +0200 Subject: [PATCH] use macros for CPU-specific jumptable generation --- c64/aliases/,aliases_cpu.s | 37 ++ c64/basic/commands/command_jumptable.s | 591 +++++------------- .../screen/chrout_screen_jumptable_codes.s | 104 ++- 3 files changed, 236 insertions(+), 496 deletions(-) diff --git a/c64/aliases/,aliases_cpu.s b/c64/aliases/,aliases_cpu.s index 38a321dc..4f26aefe 100644 --- a/c64/aliases/,aliases_cpu.s +++ b/c64/aliases/,aliases_cpu.s @@ -42,6 +42,43 @@ +// +// Macros for generating jumptables +// + + +#if !HAS_OPCODES_65C02 + +.macro put_jumptable_lo(list) +{ + .for (var i = 0; i < list.size(); i++) + { + .byte mod((list.get(i) - 1), $100) + } +} + +.macro put_jumptable_hi(list) +{ + .for (var i = 0; i < list.size(); i++) + { + .byte floor((list.get(i) - 1) / $100) + } +} + +#else // HAS_OPCODES_65C02 + +.macro put_jumptable(list) +{ + .for (var i = 0; i < list.size(); i++) + { + .word list.get(i) + } +} + +#endif + + + // // Trick to skip a 2-byte instruction // diff --git a/c64/basic/commands/command_jumptable.s b/c64/basic/commands/command_jumptable.s index 0f72c98c..99d2a98f 100644 --- a/c64/basic/commands/command_jumptable.s +++ b/c64/basic/commands/command_jumptable.s @@ -7,457 +7,190 @@ // +.const command_list = List().add( + + // $80 - $8F + + cmd_end, + cmd_for, + cmd_next, + cmd_data, + cmd_inputhash, + cmd_input, + cmd_dim, + cmd_read, + cmd_let, + cmd_goto, + cmd_run, + cmd_if, + cmd_restore, + cmd_gosub, + cmd_return, + cmd_rem, + + // $90-$9F + + cmd_stop, + cmd_on, + cmd_wait, + cmd_load, + cmd_save, + cmd_verify, + cmd_def, + cmd_poke, + cmd_printhash, + cmd_print, + cmd_cont, + cmd_list, + cmd_clr, + cmd_cmd, + cmd_sys, + cmd_open, + + // $A0-$AF + + cmd_close, + cmd_get, + cmd_new, + cmd_tab, + cmd_to, + cmd_fn, + cmd_spc, + cmd_then, + cmd_not, + cmd_step, + cmd_plus, + cmd_minus, + cmd_mult, + cmd_div, + cmd_exponent, + cmd_and, + + // $B0-$BF + + cmd_or, + cmd_greater, + cmd_equal, + cmd_less, + 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-$CF + + cmd_tan, + cmd_atn, + cmd_peek, + cmd_len, + cmd_str, + cmd_val, + cmd_asc, + cmd_chr, + cmd_left, + cmd_right, + cmd_mid, + cmd_go, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + + // $D0-$DF + + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + + // $E0-$EF + + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + + // $F0-$FF + + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented, + cmd_unimplemented +) + + + #if !HAS_OPCODES_65C02 command_jumptable_lo: - // $80 - $8F - .byte <(cmd_end-1) - .byte <(cmd_for-1) - .byte <(cmd_next-1) - .byte <(cmd_data-1) - .byte <(cmd_inputhash-1) - .byte <(cmd_input-1) - .byte <(cmd_dim-1) - .byte <(cmd_read-1) - .byte <(cmd_let-1) - .byte <(cmd_goto-1) - .byte <(cmd_run-1) - .byte <(cmd_if-1) - .byte <(cmd_restore-1) - .byte <(cmd_gosub-1) - .byte <(cmd_return-1) - .byte <(cmd_rem-1) - - // $90-$9F - .byte <(cmd_stop-1) - .byte <(cmd_on-1) - .byte <(cmd_wait-1) - .byte <(cmd_load-1) - .byte <(cmd_save-1) - .byte <(cmd_verify-1) - .byte <(cmd_def-1) - .byte <(cmd_poke-1) - .byte <(cmd_printhash-1) - .byte <(cmd_print-1) - .byte <(cmd_cont-1) - .byte <(cmd_list-1) - .byte <(cmd_clr-1) - .byte <(cmd_cmd-1) - .byte <(cmd_sys-1) - .byte <(cmd_open-1) - - // $A0-$AF - .byte <(cmd_close-1) - .byte <(cmd_get-1) - .byte <(cmd_new-1) - .byte <(cmd_tab-1) - .byte <(cmd_to-1) - .byte <(cmd_fn-1) - .byte <(cmd_spc-1) - .byte <(cmd_then-1) - .byte <(cmd_not-1) - .byte <(cmd_step-1) - .byte <(cmd_plus-1) - .byte <(cmd_minus-1) - .byte <(cmd_mult-1) - .byte <(cmd_div-1) - .byte <(cmd_exponent-1) - .byte <(cmd_and-1) - - // $B0-$BF - .byte <(cmd_or-1) - .byte <(cmd_greater-1) - .byte <(cmd_equal-1) - .byte <(cmd_less-1) - .byte <(cmd_sgn-1) - .byte <(cmd_int-1) - .byte <(cmd_abs-1) - .byte <(cmd_usr-1) - .byte <(cmd_fre-1) - .byte <(cmd_pos-1) - .byte <(cmd_sqr-1) - .byte <(cmd_rnd-1) - .byte <(cmd_log-1) - .byte <(cmd_exp-1) - .byte <(cmd_cos-1) - .byte <(cmd_sin-1) - - // $C0-$CF - .byte <(cmd_tan-1) - .byte <(cmd_atn-1) - .byte <(cmd_peek-1) - .byte <(cmd_len-1) - .byte <(cmd_str-1) - .byte <(cmd_val-1) - .byte <(cmd_asc-1) - .byte <(cmd_chr-1) - .byte <(cmd_left-1) - .byte <(cmd_right-1) - .byte <(cmd_mid-1) - .byte <(cmd_go-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - - // $D0-$DF - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - - // $E0-$EF - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - - // $F0-$FF - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) - .byte <(cmd_unimplemented-1) + put_jumptable_lo(command_list) command_jumptable_hi: - // $80 - $8F - .byte >(cmd_end-1) - .byte >(cmd_for-1) - .byte >(cmd_next-1) - .byte >(cmd_data-1) - .byte >(cmd_inputhash-1) - .byte >(cmd_input-1) - .byte >(cmd_dim-1) - .byte >(cmd_read-1) - .byte >(cmd_let-1) - .byte >(cmd_goto-1) - .byte >(cmd_run-1) - .byte >(cmd_if-1) - .byte >(cmd_restore-1) - .byte >(cmd_gosub-1) - .byte >(cmd_return-1) - .byte >(cmd_rem-1) - - // $90-$9F - .byte >(cmd_stop-1) - .byte >(cmd_on-1) - .byte >(cmd_wait-1) - .byte >(cmd_load-1) - .byte >(cmd_save-1) - .byte >(cmd_verify-1) - .byte >(cmd_def-1) - .byte >(cmd_poke-1) - .byte >(cmd_printhash-1) - .byte >(cmd_print-1) - .byte >(cmd_cont-1) - .byte >(cmd_list-1) - .byte >(cmd_clr-1) - .byte >(cmd_cmd-1) - .byte >(cmd_sys-1) - .byte >(cmd_open-1) - - // $A0-$AF - .byte >(cmd_close-1) - .byte >(cmd_get-1) - .byte >(cmd_new-1) - .byte >(cmd_tab-1) - .byte >(cmd_to-1) - .byte >(cmd_fn-1) - .byte >(cmd_spc-1) - .byte >(cmd_then-1) - .byte >(cmd_not-1) - .byte >(cmd_step-1) - .byte >(cmd_plus-1) - .byte >(cmd_minus-1) - .byte >(cmd_mult-1) - .byte >(cmd_div-1) - .byte >(cmd_exponent-1) - .byte >(cmd_and-1) - - // $B0-$BF - .byte >(cmd_or-1) - .byte >(cmd_greater-1) - .byte >(cmd_equal-1) - .byte >(cmd_less-1) - .byte >(cmd_sgn-1) - .byte >(cmd_int-1) - .byte >(cmd_abs-1) - .byte >(cmd_usr-1) - .byte >(cmd_fre-1) - .byte >(cmd_pos-1) - .byte >(cmd_sqr-1) - .byte >(cmd_rnd-1) - .byte >(cmd_log-1) - .byte >(cmd_exp-1) - .byte >(cmd_cos-1) - .byte >(cmd_sin-1) - - // $C0-$CF - .byte >(cmd_tan-1) - .byte >(cmd_atn-1) - .byte >(cmd_peek-1) - .byte >(cmd_len-1) - .byte >(cmd_str-1) - .byte >(cmd_val-1) - .byte >(cmd_asc-1) - .byte >(cmd_chr-1) - .byte >(cmd_left-1) - .byte >(cmd_right-1) - .byte >(cmd_mid-1) - .byte >(cmd_go-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - - // $D0-$DF - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - - // $E0-$EF - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - - // $F0-$FF - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) - .byte >(cmd_unimplemented-1) + put_jumptable_hi(command_list) #else // HAS_OPCODES_65C02 + __before_command_jumptable: .if (mod(*, $2) == 1) { brk } // align code so that vector never crosses page boundary command_jumptable: - // $80 - $8F - .word cmd_end - .word cmd_for - .word cmd_next - .word cmd_data - .word cmd_inputhash - .word cmd_input - .word cmd_dim - .word cmd_read - .word cmd_let - .word cmd_goto - .word cmd_run - .word cmd_if - .word cmd_restore - .word cmd_gosub - .word cmd_return - .word cmd_rem - - // $90-$9F - .word cmd_stop - .word cmd_on - .word cmd_wait - .word cmd_load - .word cmd_save - .word cmd_verify - .word cmd_def - .word cmd_poke - .word cmd_printhash - .word cmd_print - .word cmd_cont - .word cmd_list - .word cmd_clr - .word cmd_cmd - .word cmd_sys - .word cmd_open - - // $A0-$AF - .word cmd_close - .word cmd_get - .word cmd_new - .word cmd_tab - .word cmd_to - .word cmd_fn - .word cmd_spc - .word cmd_then - .word cmd_not - .word cmd_step - .word cmd_plus - .word cmd_minus - .word cmd_mult - .word cmd_div - .word cmd_exponent - .word cmd_and - - // $B0-$BF - .word cmd_or - .word cmd_greater - .word cmd_equal - .word cmd_less - .word cmd_sgn - .word cmd_int - .word cmd_abs - .word cmd_usr - .word cmd_fre - .word cmd_pos - .word cmd_sqr - .word cmd_rnd - .word cmd_log - .word cmd_exp - .word cmd_cos - .word cmd_sin - - // $C0-$CF - .word cmd_tan - .word cmd_atn - .word cmd_peek - .word cmd_len - .word cmd_str - .word cmd_val - .word cmd_asc - .word cmd_chr - .word cmd_left - .word cmd_right - .word cmd_mid - .word cmd_go - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - - // $D0-$DF - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - - // $E0-$EF - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - - // $F0-$FF - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented - .word cmd_unimplemented + put_jumptable(command_list) // Make sure routine size is always the same - build system limitation .if (__before_command_jumptable == command_jumptable) { brk } + #endif diff --git a/c64/kernal/screen/chrout_screen_jumptable_codes.s b/c64/kernal/screen/chrout_screen_jumptable_codes.s index 66e56e74..1f4fe7b3 100644 --- a/c64/kernal/screen/chrout_screen_jumptable_codes.s +++ b/c64/kernal/screen/chrout_screen_jumptable_codes.s @@ -40,59 +40,49 @@ __chrout_screen_jumptable_quote_guard: __chrout_screen_jumptable_codes_end: + +.const chrout_list = List().add( + + chrout_screen_CLR, + chrout_screen_HOME, + chrout_screen_SHIFT_OFF, + chrout_screen_SHIFT_ON, + chrout_screen_TXT, + chrout_screen_GFX, + chrout_screen_RVS_OFF, + chrout_screen_RVS_ON, + chrout_screen_CRSR_RIGHT, + chrout_screen_CRSR_LEFT, + chrout_screen_CRSR_DOWN, + chrout_screen_CRSR_UP, + chrout_screen_INS, +#if CONFIG_EDIT_STOPQUOTE + chrout_screen_STOP, +#endif +#if CONFIG_EDIT_TABULATORS + chrout_screen_TAB_BW, + chrout_screen_TAB_FW, +#endif + chrout_screen_DEL, + chrout_screen_RETURN +) + + #if !HAS_OPCODES_65C02 + chrout_screen_jumptable_lo: - .byte <(chrout_screen_CLR - 1) - .byte <(chrout_screen_HOME - 1) - .byte <(chrout_screen_SHIFT_OFF - 1) - .byte <(chrout_screen_SHIFT_ON - 1) - .byte <(chrout_screen_TXT - 1) - .byte <(chrout_screen_GFX - 1) - .byte <(chrout_screen_RVS_OFF - 1) - .byte <(chrout_screen_RVS_ON - 1) - .byte <(chrout_screen_CRSR_RIGHT - 1) - .byte <(chrout_screen_CRSR_LEFT - 1) - .byte <(chrout_screen_CRSR_DOWN - 1) - .byte <(chrout_screen_CRSR_UP - 1) - .byte <(chrout_screen_INS - 1) -#if CONFIG_EDIT_STOPQUOTE - .byte <(chrout_screen_STOP - 1) -#endif -#if CONFIG_EDIT_TABULATORS - .byte <(chrout_screen_TAB_BW - 1) - .byte <(chrout_screen_TAB_FW - 1) -#endif - .byte <(chrout_screen_DEL - 1) - .byte <(chrout_screen_RETURN - 1) + put_jumptable_lo(chrout_list) + chrout_screen_jumptable_hi: - .byte >(chrout_screen_CLR - 1) - .byte >(chrout_screen_HOME - 1) - .byte >(chrout_screen_SHIFT_OFF - 1) - .byte >(chrout_screen_SHIFT_ON - 1) - .byte >(chrout_screen_TXT - 1) - .byte >(chrout_screen_GFX - 1) - .byte >(chrout_screen_RVS_OFF - 1) - .byte >(chrout_screen_RVS_ON - 1) - .byte >(chrout_screen_CRSR_RIGHT - 1) - .byte >(chrout_screen_CRSR_LEFT - 1) - .byte >(chrout_screen_CRSR_DOWN - 1) - .byte >(chrout_screen_CRSR_UP - 1) - .byte >(chrout_screen_INS - 1) -#if CONFIG_EDIT_STOPQUOTE - .byte >(chrout_screen_STOP - 1) -#endif -#if CONFIG_EDIT_TABULATORS - .byte >(chrout_screen_TAB_BW - 1) - .byte >(chrout_screen_TAB_FW - 1) -#endif - .byte >(chrout_screen_DEL - 1) - .byte >(chrout_screen_RETURN - 1) + put_jumptable_hi(chrout_list) + + +#else // HAS_OPCODES_65C02 -#else __before_chrout_screen_jumptable: @@ -100,31 +90,11 @@ __before_chrout_screen_jumptable: chrout_screen_jumptable: - .word chrout_screen_CLR - .word chrout_screen_HOME - .word chrout_screen_SHIFT_OFF - .word chrout_screen_SHIFT_ON - .word chrout_screen_TXT - .word chrout_screen_GFX - .word chrout_screen_RVS_OFF - .word chrout_screen_RVS_ON - .word chrout_screen_CRSR_RIGHT - .word chrout_screen_CRSR_LEFT - .word chrout_screen_CRSR_DOWN - .word chrout_screen_CRSR_UP - .word chrout_screen_INS -#if CONFIG_EDIT_STOPQUOTE - .word chrout_screen_STOP -#endif -#if CONFIG_EDIT_TABULATORS - .word chrout_screen_TAB_BW - .word chrout_screen_TAB_FW -#endif - .word chrout_screen_DEL - .word chrout_screen_RETURN + put_jumptable(chrout_list) // Make sure routine size is always the same - build system limitation .if (__before_chrout_screen_jumptable == chrout_screen_jumptable) { brk } + #endif