diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s new file mode 100644 index 00000000..22565b94 --- /dev/null +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -0,0 +1,31 @@ +// #LAYOUT# M65 * #TAKE +// #LAYOUT# * * #IGNORE + +// +// Names of ZP and low memory locations for the native Mega65 mode +// + + + // + // Page 0 - reused LDTB1 + // + + // $D9 -- UNUSED -- + .label M65_LPNT_BAS1 = $DA // $DA-$DD 4-byte pointer for temporary usage within BASIC + .label M65_LPNT_BAS2 = $DE // $DE-$E1 4-byte pointer for temporary usage within BASIC + .label M65_LPNT_SCR = $E2 // $E2-$E5 4-byte pointer for temporary usage within BASIC and screen editor + // E6 reserved for BASIC error handling routines, also in native mode + .label M65_MAGICSTR = $E7 // $E7-$E9 if equals 'M65' it means we are in native mode + .label M65_LPNT_IRQ = $EA // $EA-$ED 4-byte pointer for temporary usage within interrupts + .label M65_LPNT_KERN = $EE // $EE-$F1 4-byte pointer for temporary usage by KERNAL + // $F2 -- UNUSED -- + + // + // Pages 4-7 - reused screen memory + // + + // $400-$57F -- UNUSED -- reserved for BASIC + // $580-$5FF -- UNUSED -- reserved for KERNAL + + .label M65_RS232_INBUF = $600 // $600-$6FF -- reserved for RS-232 input buffer -- + .label M65_RS232_OUTBUF = $700 // $700-$7FF -- reserved for RS-232 output buffer -- diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 6af1d667..a27fd24e 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -51,3 +51,11 @@ #endif .label filename_any = KERNAL().filename_any + +#if ROM_LAYOUT_M65 +.label M65_JMODE64 = KERNAL().M65_JMODE64 +.label M65_JMODE65 = KERNAL().M65_JMODE65 +.label M65_JISMODE65 = KERNAL().M65_JISMODE65 +.label M65_JSLOW = KERNAL().M65_JSLOW +.label M65_JFAST = KERNAL().M65_JFAST +#endif diff --git a/src/basic/basic_commands/cmd__unimplemented.s b/src/basic/basic_commands/cmd__unimplemented.s index 18c9fb1c..dc96a1c2 100644 --- a/src/basic/basic_commands/cmd__unimplemented.s +++ b/src/basic/basic_commands/cmd__unimplemented.s @@ -51,8 +51,6 @@ cmd_tab: nop cmd_spc: nop -cmd_go: - nop // Unimplemented tokens diff --git a/src/basic/basic_commands/cmd_run_goto.s b/src/basic/basic_commands/cmd_go_goto_run.s similarity index 61% rename from src/basic/basic_commands/cmd_run_goto.s rename to src/basic/basic_commands/cmd_go_goto_run.s index 043862c3..37c885fd 100644 --- a/src/basic/basic_commands/cmd_run_goto.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -3,6 +3,61 @@ // #LAYOUT# * * #IGNORE +cmd_go: + + jsr fetch_character_skip_spaces + + cmp #$A4 // 'TO' keyword + beq cmd_goto + +#if !ROM_LAYOUT_M65 + + // FALLTROUGH + +cmd_go_syntax_error: + + jmp do_SYNTAX_error + +#else + + dew TXTPTR // unconsume character + + // Fetch mode + + jsr fetch_uint8 + + cmp #64 + bne !+ + + // If in native mode - switch to C64 compatibilty + + jsr M65_JISMODE65 + bne cmd_go_rts + + jsr helper_ask_if_sure + bcs cmd_go_rts + jmp M65_JMODE64 +!: + cmp #65 + bne !+ + + // If in C64 compatibility mode - switch to native mode + + jsr M65_JISMODE65 + beq cmd_go_rts + + jsr helper_ask_if_sure + bcs cmd_go_rts + jmp M65_JMODE65 +!: + jmp do_ILLEGAL_QUANTITY_error + +cmd_go_rts: + + rts + +#endif + cmd_run: // RUN clears all variables @@ -27,7 +82,11 @@ cmd_goto: // GOTO requires line number jsr fetch_line_number +#if !ROM_LAYOUT_M65 + bcs cmd_go_syntax_error +#else bcs_16 do_SYNTAX_error +#endif // Check for direct mode diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 6e3f4f61..8f0f3537 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -9,8 +9,18 @@ .const command_01_list = List().add( +#if CONFIG_MB_MEGA_65 + + M65_JSLOW, + M65_JFAST, + +#else + cmd_slow, cmd_fast, + +#endif + cmd_old, // NOTE! These commands are temporarily placed here, they should be a part of list 02! diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index e8b9ed5d..c49e2cfa 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -5,23 +5,7 @@ #if CONFIG_MB_MEGA_65 - // Command implementation for Mega65 - - // XXX - I think there are some bit-set instructions in 65CE02... - -cmd_slow: - - lda #$40 - skip_2_bytes_trash_nvz - - // FALLTROUGH - -cmd_fast: - - lda #$41 - sta CPU_D6510 - rts - + // For Mega65 Kernal routines are called directly #elif CONFIG_MB_ULTIMATE_64 diff --git a/src/kernal/board_m65/mega65_jumptable.s b/src/kernal/board_m65/mega65_jumptable.s new file mode 100644 index 00000000..9dcea02a --- /dev/null +++ b/src/kernal/board_m65/mega65_jumptable.s @@ -0,0 +1,129 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Not this is not an official Kernal API extension (yet)! It is subject to change! +// + + +M65_JMODE64: + + // Disable interrupts, they might interfere + + sei + + // XXX provide full implementation + + // Set the magic string to mark legacy mode + + lda #$00 + sta M65_MAGICSTR+0 + sta M65_MAGICSTR+1 + sta M65_MAGICSTR+2 + + // Reenable interrupts + + cli + + // Switch CPU speed back to slow and quit + + jmp M65_JSLOW + + + +M65_JMODE65: + + // Disable interrupts, they might interfere + + sei + + // Swithc CPU speed to fast + + jsr M65_JFAST + + // Set the magic string to mark native mode + + lda #$4D // 'M' + sta M65_MAGICSTR+0 + lda #$36 // '6' + sta M65_MAGICSTR+1 + lda #$35 // '5' + sta M65_MAGICSTR+2 + + // XXX provide full implementation + + // Switch VIC to VIC-IV mode + + lda #$47 + sta VIC_KEY + lda #$53 + sta VIC_KEY + + // XXX provide proper implementation + + // Set screen mode to 80 columns + + lda $D031 + ora #$80 + sta $D031 + + // Set screen RAM base to $15000 + + lda #$00 + sta $D060 + sta LDTB1+0 + sta $D063 + sta LDTB1+3 + lda #$50 + sta $D061 + sta LDTB1+1 + lda #$01 + sta $D062 + sta LDTB1+2 + + // Set something in screen memory + + lda #$01 + + // STA [],Z + nop + .byte $92 + .byte LDTB1 + +!: + nop + jmp !- + + + +M65_JISMODE65: // checks if mode is native M65 one, BEQ = jump if native mode + + pha + + lda M65_MAGICSTR+0 + cmp #$4D // 'M' + bne !+ + lda M65_MAGICSTR+1 + cmp #$36 // '6' + bne !+ + lda M65_MAGICSTR+2 + cmp #$35 // '5' +!: + pla + rts + + + + +M65_JSLOW: // set CPU speed to 1 MHz + + lda #$40 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +M65_JFAST: // set CPU speed to 40 MHz + + lda #$41 + sta CPU_D6510 + rts