From 83cdf37c0d0102322592c83008b9d301887d347c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 17:24:09 +0200 Subject: [PATCH] more work towards Mega65 native mode, added NSYS command --- Makefile | 1 + doc/Extended-BASIC.md | 8 +++++ src/aliases/,aliases_hardware_m65.s | 2 +- src/basic/assets/packed_keywords_03.s | 12 +++++++ src/basic/basic_commands/cmd_sys.s | 36 +++++++++++++++---- .../basic_commands_03_m65/cmd__jumptable_03.s | 17 +++++++++ src/basic/basic_commands_03_m65/cmd_nsys.s | 7 ++++ src/basic/engine_editor/tokenise_line.s | 25 +++++++++++++ .../engine_runtime/execute_line_statements.s | 32 +++++++++++++++++ src/basic/print/list_single_line.s | 22 ++++++++++++ src/basic/print/print_packed_freq_string.s | 10 ++++++ .../board_m65/4000.mega65_vectable_kernal_1.s | 11 +++--- src/kernal/board_m65/mega65_redirect_screen.s | 15 ++++++++ src/kernal/extapi_m65/mega65_mode64.s | 5 +++ src/kernal/extapi_m65/mega65_mode65.s | 5 +++ .../interrupts/ea31.default_irq_handler.s | 19 ++++++++++ src/kernal/screen/chrout_screen.s | 7 ++++ src/kernal/screen/screen_off.s | 2 +- src/kernal/screen_m65/mega65_chrout_screen.s | 9 +++++ src/kernal/screen_m65/mega65_cursor.s | 9 +++++ src/kernal/screen_m65/mega65_screen_tables.s | 11 ++++++ src/kernal/screen_m65/mega65_scrmodeset.s | 10 +----- tools/generate_strings.cc | 12 +++++++ 23 files changed, 266 insertions(+), 21 deletions(-) create mode 100644 src/basic/assets/packed_keywords_03.s create mode 100644 src/basic/basic_commands_03_m65/cmd__jumptable_03.s create mode 100644 src/basic/basic_commands_03_m65/cmd_nsys.s create mode 100644 src/kernal/board_m65/mega65_redirect_screen.s create mode 100644 src/kernal/screen_m65/mega65_chrout_screen.s create mode 100644 src/kernal/screen_m65/mega65_cursor.s create mode 100644 src/kernal/screen_m65/mega65_screen_tables.s diff --git a/Makefile b/Makefile index 6b43913b..7d2ddd0e 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,7 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/basic_commands \ src/basic/basic_commands_01 \ src/basic/basic_commands_02 \ + src/basic/basic_commands_03_m65 \ src/basic/basic_operators \ src/basic/basic_functions \ src/basic/board_m65 \ diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 42765376..af4afb53 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -91,3 +91,11 @@ Clears the screen content. ### `DISPOSE` (all) Runs the garbage collector - disposes outdated strings. + +### `NSYS` (Mega65) + +A 'native' `SYS` - same as `SYS`, but does not switch to C64 compatibility mode. + +### `GO 64`, `GO 65` (Mega65) + +Switches machine to C64 compatibility mode or to MEGA65 native mode. Performs `CLR` diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index e6ca17c8..9830338e 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -11,7 +11,7 @@ // VIC-IV registers .label VIC_KEY = $D02F - + .label VIC_CTRLA = $D030 .label VIC_CTRLB = $D031 .label VIC_XPOS = $D050 diff --git a/src/basic/assets/packed_keywords_03.s b/src/basic/assets/packed_keywords_03.s new file mode 100644 index 00000000..10edc998 --- /dev/null +++ b/src/basic/assets/packed_keywords_03.s @@ -0,0 +1,12 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# M65 BASIC_1 #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +#if ROM_LAYOUT_M65 + +packed_freq_keywords_03: + + put_packed_freq_keywords_03() + +#endif diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index 01dcf833..87d91b64 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -3,15 +3,39 @@ // #LAYOUT# * * #IGNORE +#if ROM_LAYOUT_M65 + +cmd_nsys: + + // NSYS requires an argument + + jsr is_end_of_statement + bcs_16 do_SYNTAX_error + bra cmd_sys_nsys_common + +#endif + cmd_sys: - jsr is_end_of_statement - bcc !+ - // SYS requires an argument - jmp do_SYNTAX_error - -!: + + jsr is_end_of_statement + bcs_16 do_SYNTAX_error + +#if ROM_LAYOUT_M65 + + // Make sure we are in C64 compatibility mode + + jsr M65_ISMODE65 + bne cmd_sys_nsys_common + jsr M65_MODE64 + + // FALLTROUGH + +cmd_sys_nsys_common: + +#endif + // // XXX Temporary ugly hack to support 'SYS PI*656' // diff --git a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s new file mode 100644 index 00000000..c982c4a5 --- /dev/null +++ b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s @@ -0,0 +1,17 @@ +// #LAYOUT# M65 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Jumptable for BASIC commands with tokens prefixed by $03 +// + +.const command_03_list = List().add( + + cmd_nsys +) + + +command_03_jumptable: + + // Note: 65C02 has the page boundary vector bug fixed! + put_jumptable(command_03_list) diff --git a/src/basic/basic_commands_03_m65/cmd_nsys.s b/src/basic/basic_commands_03_m65/cmd_nsys.s new file mode 100644 index 00000000..2e8a7c4d --- /dev/null +++ b/src/basic/basic_commands_03_m65/cmd_nsys.s @@ -0,0 +1,7 @@ +// #LAYOUT# M65 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// PLACEHOLDER for completeness - jumptable contains direct address + +// NSYS command is implemented together with SYS diff --git a/src/basic/engine_editor/tokenise_line.s b/src/basic/engine_editor/tokenise_line.s index 06ddf755..13f1fcfd 100644 --- a/src/basic/engine_editor/tokenise_line.s +++ b/src/basic/engine_editor/tokenise_line.s @@ -98,6 +98,18 @@ tokenise_line_loop: jsr tk_search bcc tokenise_line_keyword_02 // branch if keyword identified +#endif + +#if ROM_LAYOUT_M65 + + lda #packed_freq_keywords_03 + sta FRESPC+1 + + jsr tk_search + bcc tokenise_line_keyword_03 // branch if keyword identified + #endif // Shorten packed keyword candidate and try again @@ -173,6 +185,19 @@ tokenise_line_char: // Support for extended keyword lists +#if ROM_LAYOUT_M65 + +tokenise_line_keyword_03: + + // Store the token list index + + lda #$03 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +#endif + #if !HAS_SMALL_BASIC tokenise_line_keyword_02: diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index 17624201..9c637b07 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -46,7 +46,11 @@ execute_statements: #else +#if ROM_LAYOUT_M65 + cpx #$04 +#else cpx #$03 +#endif bcc execute_statements_extended #endif @@ -93,6 +97,13 @@ execute_statements_extended: cpx #$02 beq execute_statements_02 +#if ROM_LAYOUT_M65 + + cpx #$03 + beq execute_statements_03 + +#endif + jmp do_SYNTAX_error #endif @@ -171,6 +182,27 @@ execute_statements_02: #endif // !HAS_SMALL_BASIC +#if ROM_LAYOUT_M65 + +execute_statements_03: + + // Get the sub-token, check that it is valid + + jsr fetch_character + cmp #$00 + beq_16 do_SYNTAX_error + + cmp #(TK__MAXTOKEN_keywords_03+1) + bcs_16 do_SYNTAX_error + + // Use jumptable to go to the command routine + + asl + tax + jmp (command_03_jumptable - 2, x) + +#endif // ROM_LAYOUT_M65 + execute_statements_end_of_line: // First check, if we are in direct mode - if so, diff --git a/src/basic/print/list_single_line.s b/src/basic/print/list_single_line.s index 51f90887..6a0eab20 100644 --- a/src/basic/print/list_single_line.s +++ b/src/basic/print/list_single_line.s @@ -94,6 +94,10 @@ list_not_quote: cmp #$02 beq list_display_token_02 #endif +#if ROM_LAYOUT_M65 + cmp #$03 + beq list_display_token_03 +#endif // Check for literals cmp #$7F @@ -228,6 +232,24 @@ list_display_token_02: #endif +#if ROM_LAYOUT_M65 + +list_display_token_03: + + // Display a 2-byte token - for extended BASIC + jsr list_fetch_subtoken + + // Check if token is known + cpx #TK__MAXTOKEN_keywords_03 + bcs list_is_unknown + + // Now ask for it to be printed + phy_trash_a + jsr print_packed_keyword_03 + jmp_8 list_display_token_ext_done + +#endif + list_fetch_subtoken: // Fetch the sub-token diff --git a/src/basic/print/print_packed_freq_string.s b/src/basic/print/print_packed_freq_string.s index cc5d36c9..100da364 100644 --- a/src/basic/print/print_packed_freq_string.s +++ b/src/basic/print/print_packed_freq_string.s @@ -55,6 +55,16 @@ print_packed_keyword_02: // .X - token number #endif +#if ROM_LAYOUT_M65 + +print_packed_keyword_03: // .X - token number + + lda #packed_freq_keywords_03 + bne print_freq_packed_string // branch always + +#endif + print_packed_keyword_V2: // .X - token number lda #