From 9846b69c718badb01442487d901e4c8060453ded Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 21 Jun 2020 21:53:49 +0200 Subject: [PATCH] more work on extended command set --- c64/aliases/,aliases_hardware.s | 13 ++- c64/basic/assets/packed_str_keywords_CC.s | 9 ++ c64/basic/assets/packed_str_keywords_CD.s | 9 ++ c64/basic/basic_commands_CD/cmd_fast.s | 34 +++++++- c64/basic/basic_commands_CD/cmd_slow.s | 39 ++++++++- .../board_m65/4000.mega65_vectable_basic_1.s | 6 +- c64/basic/engine/execute_line_statements.s | 85 ++++++++++++++++++- c64/basic/print/list_single_line.s | 75 ++++++++++++++++ c64/basic/print/print_packed_string.s | 18 ++-- c64/basic/tokenizer/tk_cut_away.s | 30 +++++++ c64/basic/tokenizer/tokenise_line.s | 76 +++++++++++++---- tools/generate_strings.cc | 10 ++- 12 files changed, 367 insertions(+), 37 deletions(-) create mode 100644 c64/basic/assets/packed_str_keywords_CC.s create mode 100644 c64/basic/assets/packed_str_keywords_CD.s create mode 100644 c64/basic/tokenizer/tk_cut_away.s diff --git a/c64/aliases/,aliases_hardware.s b/c64/aliases/,aliases_hardware.s index 74e8b6d3..f0096f81 100644 --- a/c64/aliases/,aliases_hardware.s +++ b/c64/aliases/,aliases_hardware.s @@ -187,10 +187,17 @@ #if CONFIG_MB_MEGA_65 - .const C65_EXTKEYS_PR = $D607 - .const C65_EXTKEYS_DDR = $D608 + .label C65_EXTKEYS_PR = $D607 + .label C65_EXTKEYS_DDR = $D608 - .const M65_BADL_SLI = $D710 + .label M65_BADL_SLI = $D710 + +#else + + // SuperCPU registers + + .label SCPU_SPEED_NORMAL = $D07A + .label SCPU_SPEED_TURBO = $D07B #endif diff --git a/c64/basic/assets/packed_str_keywords_CC.s b/c64/basic/assets/packed_str_keywords_CC.s new file mode 100644 index 00000000..4fe84295 --- /dev/null +++ b/c64/basic/assets/packed_str_keywords_CC.s @@ -0,0 +1,9 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# M65 BASIC_1 #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +packed_str_keywords_CC: + + put_freq_packed_keywords_CC() diff --git a/c64/basic/assets/packed_str_keywords_CD.s b/c64/basic/assets/packed_str_keywords_CD.s new file mode 100644 index 00000000..8c9e51f3 --- /dev/null +++ b/c64/basic/assets/packed_str_keywords_CD.s @@ -0,0 +1,9 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# M65 BASIC_1 #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +packed_str_keywords_CD: + + put_freq_packed_keywords_CD() diff --git a/c64/basic/basic_commands_CD/cmd_fast.s b/c64/basic/basic_commands_CD/cmd_fast.s index 056fed10..d447de59 100644 --- a/c64/basic/basic_commands_CD/cmd_fast.s +++ b/c64/basic/basic_commands_CD/cmd_fast.s @@ -5,4 +5,36 @@ cmd_fast: - jmp do_NOT_IMPLEMENTED_error // XXX implement the command +#if CONFIG_MB_MEGA_65 + + // Command implementation for Mega65 + + // XXX provide better implementation + + jmp execute_statements + +#elif CONFIG_MB_ULTIMATE_64 + + // Try to enable turbo in SuperCPU compatible way + sta SCPU_SPEED_TURBO + + jmp execute_statements + +#elif CONFIG_PLATFORM_COMMODORE_64 + + // Command implementation for generic C64 platform + + // Try to enable turbo mode in C128 compatible way + lda #$01 + sta VIC_CLKRATE + + // Try to enable turbo in SuperCPU compatible way + sta SCPU_SPEED_TURBO + + jmp execute_statements + +#else + + jmp do_NOT_IMPLEMENTED_error + +#endif diff --git a/c64/basic/basic_commands_CD/cmd_slow.s b/c64/basic/basic_commands_CD/cmd_slow.s index 730fb203..602dd740 100644 --- a/c64/basic/basic_commands_CD/cmd_slow.s +++ b/c64/basic/basic_commands_CD/cmd_slow.s @@ -5,4 +5,41 @@ cmd_slow: - jmp do_NOT_IMPLEMENTED_error // XXX implement the command + .break + +#if CONFIG_MB_MEGA_65 + + // Command implementation for Mega65 + + // XXX provide implementation + + jmp do_NOT_IMPLEMENTED_error + +#elif CONFIG_MB_ULTIMATE_64 + + // Command implementation for Ultimate 64 + + // Try to disable turbo in SuperCPU compatible way + sta SCPU_SPEED_NORMAL + + jmp execute_statements + +#elif CONFIG_PLATFORM_COMMODORE_64 + + // Command implementation for generic C64 platform + + // Try to disable turbo mode in C128 compatible way + + lda #$00 + sta VIC_CLKRATE + + // Try to disable turbo in SuperCPU compatible way + sta SCPU_SPEED_NORMAL + + jmp execute_statements + +#else + + jmp do_NOT_IMPLEMENTED_error + +#endif diff --git a/c64/basic/board_m65/4000.mega65_vectable_basic_1.s b/c64/basic/board_m65/4000.mega65_vectable_basic_1.s index 25c233d0..9239e233 100644 --- a/c64/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/c64/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -17,9 +17,8 @@ .label VB1__list_single_line = $4000 + 2 * 3 .label VB1__print_packed_error = $4000 + 2 * 4 .label VB1__print_packed_misc_str = $4000 + 2 * 5 - .label VB1__print_packed_keyword_V2 = $4000 + 2 * 6 - .label VB1__basic_do_clr = $4000 + 2 * 7 - .label VB1__basic_do_new = $4000 + 2 * 8 + .label VB1__basic_do_clr = $4000 + 2 * 6 + .label VB1__basic_do_new = $4000 + 2 * 7 #else @@ -31,7 +30,6 @@ .word list_single_line .word print_packed_error .word print_packed_misc_str - .word print_packed_keyword_V2 .word basic_do_clr .word basic_do_new diff --git a/c64/basic/engine/execute_line_statements.s b/c64/basic/engine/execute_line_statements.s index 374db0e5..23b8a680 100644 --- a/c64/basic/engine/execute_line_statements.s +++ b/c64/basic/engine/execute_line_statements.s @@ -59,7 +59,7 @@ execute_statements: #else // HAS_OPCODES_65C02 - // Use jumptable to go to the token + // Use jumptable to go to the command routine asl tax @@ -70,14 +70,93 @@ execute_statements: execute_statements_extended: - // XXX here is the place for possible extended BASIC command set + // Support for extended BASIC commands + + cmp #$CC + beq execute_statements_CC + cmp #$CD + beq execute_statements_CD + + // 'GO' command has a strange token, it is placed after function tokens cmp #$CB - beq_16 cmd_go // 'GO' command has a strange token, it is placed after function tokens + beq_16 cmd_go jmp do_SYNTAX_error +execute_statements_CC: + + // Get the sub-token, check that it is valid + + jsr fetch_character + cmp #$00 + beq_16 do_SYNTAX_error + + cmp #(TK__MAXTOKEN_keywords_CC+1) + bcs_16 do_SYNTAX_error + + // Execute command + +#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_CC_jumptable_hi - 1, x + pha + lda command_CC_jumptable_lo - 1, x + pha + + rts + +#else // HAS_OPCODES_65C02 + + // Use jumptable to go to the command routine + + asl + tax + jmp (command_CC_jumptable - 2, x) + +#endif + + +execute_statements_CD: + + // Get the sub-token, check that it is valid + + jsr fetch_character + cmp #$00 + beq_16 do_SYNTAX_error + + cmp #(TK__MAXTOKEN_keywords_CD+1) + bcs_16 do_SYNTAX_error + + // Execute command + +#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_CD_jumptable_hi - 1, x + pha + lda command_CD_jumptable_lo - 1, x + pha + + rts + +#else // HAS_OPCODES_65C02 + + // Use jumptable to go to the command routine + + asl + tax + jmp (command_CD_jumptable - 2, x) + +#endif + + execute_statements_end_of_line: // First check, if we are in direct mode - if so, diff --git a/c64/basic/print/list_single_line.s b/c64/basic/print/list_single_line.s index 454b9cbb..7a3e5a35 100644 --- a/c64/basic/print/list_single_line.s +++ b/c64/basic/print/list_single_line.s @@ -82,11 +82,82 @@ list_not_quote: // Display a token +list_display_token_CC: + + cmp #$CC + bne list_display_token_CD + + // Fetch the sub-token + + iny +#if ROM_LAYOUT_M65 + jsr peek_via_OLDTXT +#elif CONFIG_MEMORY_MODEL_60K + ldx #packed_str_misc bne print_freq_packed_string // branch always +print_packed_keyword_CC: // .X - token number + + lda #packed_str_keywords_CC + bne print_freq_packed_string // branch always + +print_packed_keyword_CD: // .X - token number + + lda #packed_str_keywords_CD + bne print_freq_packed_string // branch always + print_packed_keyword_V2: // .X - token number lda #packed_str_keywords_V2 @@ -78,7 +80,23 @@ tokenise_line_loop: jsr tk_search bcc tokenise_line_keyword_V2 // branch if keyword identified - // XXX add support for additional keyword lists here + // Check for extended tokens + + lda #packed_str_keywords_CC + sta FRESPC+1 + + jsr tk_search + bcc tokenise_line_keyword_CC // branch if keyword identified + + lda #packed_str_keywords_CD + sta FRESPC+1 + + jsr tk_search + bcc tokenise_line_keyword_CD // branch if keyword identified // Shorten packed keyword candidate and try again @@ -106,28 +124,13 @@ tokenise_line_keyword_V2: // Cut away unnecessary bytes - inc tk__offset - ldx tk__offset + jsr tk_cut_away - dec tk__len_unpacked // keyword length, afterwards number of bytes to cut away - lda tk__len_unpacked - clc - adc tk__offset - tay -!: - lda BUF, y - sta BUF, x - beq !+ - - inx - iny - bne !- -!: // Special handling for REM command - after this one nothing more should be tokenised pla cmp #$0F // REM token index - bne tokenise_line_loop + jmp tokenise_line_loop // FALLTROUGH @@ -173,4 +176,41 @@ tokenise_line_char: inc tk__offset jmp tokenise_line_loop + +// Support for extended keyword lists + +tokenise_line_keyword_CC: + + // Store the token list index + + lda #$CC + skip_2_bytes_trash_nvz + + // FALLTROUGH + +tokenise_line_keyword_CD: + + // Store the token list index + + lda #$CD + + ldy tk__offset + sta BUF, y + + // Store the sub-token itself + + inx + txa + iny + sty tk__offset + sta BUF, y + + // Cut away unnecessary bytes + + inc tk__offset + dec tk__len_unpacked + + jsr tk_cut_away + jmp tokenise_line_loop + #endif // ROM layout diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 16124a4a..552f4671 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -826,6 +826,14 @@ void DataSet::prepareOutput() } } + // For the token list - put the number of tokens available + + if (stringEntryList.type == ListType::KEYWORDS) + { + stream << std::endl << ".label TK__MAXTOKEN_" << stringEntryList.name << " = " << + std::dec << stringEncodedList.size() << std::endl; + } + stream << std::endl << ".macro put_freq_packed_" << stringEntryList.name << "()" << std::endl << "{" << std::endl; enum LastStr { NONE, SKIPPED, WRITTEN } lastStr = LastStr::NONE; @@ -867,7 +875,7 @@ void DataSet::prepareOutput() } } - // For the token list - pu the 'end of keywords' mark + // For the token list - put the 'end of keywords' mark if (stringEntryList.type == ListType::KEYWORDS) {