From b235db4cd0d46e1be43507f6b5f4c04cff0fb3c3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 7 Aug 2020 22:03:31 +0200 Subject: [PATCH 01/96] implemented 'GO' BASIC command, started work on native MEGA65 mode --- src/aliases/,aliases_ram_lowmem_m65.s | 31 +++++ src/basic/,imports.s | 8 ++ src/basic/basic_commands/cmd__unimplemented.s | 2 - .../{cmd_run_goto.s => cmd_go_goto_run.s} | 59 ++++++++ .../basic_commands_01/cmd__jumptable_01.s | 10 ++ src/basic/basic_commands_01/cmd_fast_slow.s | 18 +-- src/kernal/board_m65/mega65_jumptable.s | 129 ++++++++++++++++++ 7 files changed, 238 insertions(+), 19 deletions(-) create mode 100644 src/aliases/,aliases_ram_lowmem_m65.s rename src/basic/basic_commands/{cmd_run_goto.s => cmd_go_goto_run.s} (61%) create mode 100644 src/kernal/board_m65/mega65_jumptable.s 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 From 0b9cc2a9ec1d2c01dd368af34a8172c56bc92e5d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 12:57:15 +0200 Subject: [PATCH 02/96] more work on Mega65 native mode --- src/basic/,imports.s | 12 +- src/basic/basic_commands/cmd_go_goto_run.s | 10 +- .../basic_commands/helper_load_init_param.s | 2 +- .../basic_commands_01/cmd__jumptable_01.s | 8 +- src/basic/board_m65/mega65_imports.s | 1 + src/basic/wedge/wedge_dos.s | 2 +- src/kernal/board_m65/mega65_ISMODE64.s | 19 +++ src/kernal/board_m65/mega65_MODE64.s | 26 ++++ src/kernal/board_m65/mega65_MODE65.s | 63 +++++++++ src/kernal/board_m65/mega65_SLOW_FAST.s | 16 +++ src/kernal/board_m65/mega65_imports.s | 2 +- src/kernal/board_m65/mega65_jumptable.s | 126 ++---------------- ...{mega65_unhide.s => mega65_viciv_unhide.s} | 4 +- .../iostack/seldev.s} | 10 +- src/kernal/keyboard/scnkey.s | 2 +- src/kernal/tape/tape_common_screen.s | 2 +- 16 files changed, 163 insertions(+), 142 deletions(-) create mode 100644 src/kernal/board_m65/mega65_ISMODE64.s create mode 100644 src/kernal/board_m65/mega65_MODE64.s create mode 100644 src/kernal/board_m65/mega65_MODE65.s create mode 100644 src/kernal/board_m65/mega65_SLOW_FAST.s rename src/kernal/board_m65/{mega65_unhide.s => mega65_viciv_unhide.s} (66%) rename src/{basic/engine_runtime/select_device.s => kernal/iostack/seldev.s} (67%) diff --git a/src/basic/,imports.s b/src/basic/,imports.s index a27fd24e..99d9333b 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -52,10 +52,12 @@ .label filename_any = KERNAL().filename_any +.label SELDEV = KERNAL().SELDEV + #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 +.label M65_MODE64 = KERNAL().M65_MODE64 +.label M65_MODE65 = KERNAL().M65_MODE65 +.label M65_ISMODE65 = KERNAL().M65_ISMODE65 +.label M65_SLOW = KERNAL().M65_SLOW +.label M65_FAST = KERNAL().M65_FAST #endif diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 37c885fd..2600b80f 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -31,24 +31,26 @@ cmd_go_syntax_error: // If in native mode - switch to C64 compatibilty - jsr M65_JISMODE65 + jsr M65_ISMODE65 bne cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts - jmp M65_JMODE64 + jsr M65_MODE64 + jmp do_clr !: cmp #65 bne !+ // If in C64 compatibility mode - switch to native mode - jsr M65_JISMODE65 + jsr M65_ISMODE65 beq cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts - jmp M65_JMODE65 + jsr M65_MODE65 + jmp do_clr !: jmp do_ILLEGAL_QUANTITY_error diff --git a/src/basic/basic_commands/helper_load_init_param.s b/src/basic/basic_commands/helper_load_init_param.s index 3e48bbdb..e070b2be 100644 --- a/src/basic/basic_commands/helper_load_init_param.s +++ b/src/basic/basic_commands/helper_load_init_param.s @@ -22,6 +22,6 @@ helper_load_init_params_no_VERCKB: // Set default device, set secondary address to 0 - jsr select_device + jsr SELDEV ldy #$00 // secondary address jmp JSETFLS diff --git a/src/basic/basic_commands_01/cmd__jumptable_01.s b/src/basic/basic_commands_01/cmd__jumptable_01.s index 8f0f3537..269ff014 100644 --- a/src/basic/basic_commands_01/cmd__jumptable_01.s +++ b/src/basic/basic_commands_01/cmd__jumptable_01.s @@ -10,15 +10,11 @@ .const command_01_list = List().add( #if CONFIG_MB_MEGA_65 - - M65_JSLOW, - M65_JFAST, - + M65_SLOW, + M65_FAST, #else - cmd_slow, cmd_fast, - #endif cmd_old, diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index a9891af5..9461ee1b 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -23,6 +23,7 @@ .label JCHKIN = KERNAL_0.JCHKIN .label JCHRIN = KERNAL_0.JCHRIN .label JREADST = KERNAL_0.JREADST +.label SELDEV = KERNAL_0.SELDEV .label plot_set = KERNAL_0.plot_set .label init_oldtxt = BASIC_0.init_oldtxt .label tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset diff --git a/src/basic/wedge/wedge_dos.s b/src/basic/wedge/wedge_dos.s index dae70840..8ca489e0 100644 --- a/src/basic/wedge/wedge_dos.s +++ b/src/basic/wedge/wedge_dos.s @@ -28,7 +28,7 @@ wedge_dos: jsr JCLALL // Set file parameters, channel 15 is a typical one for commands - jsr select_device // sets .X register + jsr SELDEV // sets .X register lda #$0F ldy #$0F jsr JSETFLS diff --git a/src/kernal/board_m65/mega65_ISMODE64.s b/src/kernal/board_m65/mega65_ISMODE64.s new file mode 100644 index 00000000..88637375 --- /dev/null +++ b/src/kernal/board_m65/mega65_ISMODE64.s @@ -0,0 +1,19 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_ISMODE65: // 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 diff --git a/src/kernal/board_m65/mega65_MODE64.s b/src/kernal/board_m65/mega65_MODE64.s new file mode 100644 index 00000000..2f9a265f --- /dev/null +++ b/src/kernal/board_m65/mega65_MODE64.s @@ -0,0 +1,26 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_MODE64: + + // 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_SLOW diff --git a/src/kernal/board_m65/mega65_MODE65.s b/src/kernal/board_m65/mega65_MODE65.s new file mode 100644 index 00000000..9050d56c --- /dev/null +++ b/src/kernal/board_m65/mega65_MODE65.s @@ -0,0 +1,63 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_MODE65: + + // Disable interrupts, they might interfere + + sei + + // Switch CPU speed to fast + + jsr M65_FAST + + // 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 + + jsr viciv_unhide + + // XXX provide proper implementation below + + // 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 !- diff --git a/src/kernal/board_m65/mega65_SLOW_FAST.s b/src/kernal/board_m65/mega65_SLOW_FAST.s new file mode 100644 index 00000000..3403b80c --- /dev/null +++ b/src/kernal/board_m65/mega65_SLOW_FAST.s @@ -0,0 +1,16 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_SLOW: // set CPU speed to 1 MHz + + lda #$40 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +M65_FAST: // set CPU speed to 40 MHz + + lda #$41 + sta CPU_D6510 + rts diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 0588fa89..226e4f1a 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -28,7 +28,7 @@ #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO -.label mega65_unhide = KERNAL_0.mega65_unhide +.label viciv_unhide = KERNAL_0.viciv_unhide .label tape_motor_on = KERNAL_0.tape_motor_on .label tape_motor_off = KERNAL_0.tape_motor_off diff --git a/src/kernal/board_m65/mega65_jumptable.s b/src/kernal/board_m65/mega65_jumptable.s index 9dcea02a..8faae9c8 100644 --- a/src/kernal/board_m65/mega65_jumptable.s +++ b/src/kernal/board_m65/mega65_jumptable.s @@ -4,126 +4,24 @@ // // Not this is not an official Kernal API extension (yet)! It is subject to change! // +// XXX consider turning this into vector table, the only jumptable extension +// would copy the vector table to given memory location 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 - - + jsr M65_MODE64 M65_JMODE65: + jsr M65_MODE65 - // Disable interrupts, they might interfere +M65_JISMODE65: + jsr M65_ISMODE65 - sei +M65_JSLOW: + jsr M65_SLOW - // Swithc CPU speed to fast +M65_JFAST: + jsr M65_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 +M65_JSELDEV: + jsr SELDEV diff --git a/src/kernal/board_m65/mega65_unhide.s b/src/kernal/board_m65/mega65_viciv_unhide.s similarity index 66% rename from src/kernal/board_m65/mega65_unhide.s rename to src/kernal/board_m65/mega65_viciv_unhide.s index 3fa9b1c9..95511cb0 100644 --- a/src/kernal/board_m65/mega65_unhide.s +++ b/src/kernal/board_m65/mega65_viciv_unhide.s @@ -8,10 +8,10 @@ // -#if CONFIG_KEYBOARD_C65 || (CONFIG_MB_MEGA_65 && (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO)) +#if ROM_LAYOUT_M65 || CONFIG_KEYBOARD_C65 || (CONFIG_MB_MEGA_65 && (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO)) -mega65_unhide: +viciv_unhide: lda #$A5 sta VIC_KEY diff --git a/src/basic/engine_runtime/select_device.s b/src/kernal/iostack/seldev.s similarity index 67% rename from src/basic/engine_runtime/select_device.s rename to src/kernal/iostack/seldev.s index 20fbc6b4..6144b311 100644 --- a/src/basic/engine_runtime/select_device.s +++ b/src/kernal/iostack/seldev.s @@ -1,11 +1,9 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# * BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE +// #LAYOUT# STD * #TAKE +// #LAYOUT# * KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE -// XXX for Mega65, it should be available in BASIC_1 segment only -select_device: +SELDEV: // Take last device number, make sure it is a drive - 8 or above. Above 30, // although illegal for IEC we also consider a drive, as they exists diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index c48f847b..d6080c78 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -48,7 +48,7 @@ SCNKEY: // mode when done. This is not ideal, but as MEGA65s start C65 mode with VIC-IV IO mode // selected anyway, it should not be a big problem in practice. - jsr mega65_unhide + jsr viciv_unhide jsr scnkey_viciv_mode sta VIC_KEY // hide Mega65 registers diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 19264dee..77fd0b95 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -60,7 +60,7 @@ tape_screen_off_motor_on: // On Mega65 we do not have to turn the screen off; // it is enough to disable badline emulation - jsr mega65_unhide + jsr viciv_unhide lda #$00 sta M65_BADL_SLI From 333ecf6eba4200e7de2e9ef3c9e9da2581371ee5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 15:12:46 +0200 Subject: [PATCH 03/96] started work on setting text mode --- Makefile | 2 + src/aliases/,aliases_cpu.s | 7 ++ src/aliases/,aliases_hardware.s | 7 -- src/aliases/,aliases_hardware_m65.s | 24 +++++ src/aliases/,aliases_ram_lowmem_m65.s | 11 ++- .../board_m65/4000.mega65_vectable_kernal_1.s | 9 ++ src/kernal/board_m65/mega65_MODE65.s | 63 ------------ src/kernal/board_m65/mega65_imports.s | 6 +- src/kernal/board_m65/mega65_redirect_api.s | 30 ++++++ src/kernal/board_m65/mega65_viciv_unhide.s | 8 +- .../mega65__jumptable.s} | 0 .../mega65_ismode64.s} | 0 .../mega65_mode64.s} | 2 +- src/kernal/extapi_m65/mega65_mode65.s | 35 +++++++ .../mega65_slow_fast.s} | 0 src/kernal/screen_m65/mega65_clrscr.s | 9 ++ src/kernal/screen_m65/mega65_scrmodeget.s | 14 +++ src/kernal/screen_m65/mega65_scrmodeset.s | 99 +++++++++++++++++++ 18 files changed, 247 insertions(+), 79 deletions(-) create mode 100644 src/aliases/,aliases_hardware_m65.s delete mode 100644 src/kernal/board_m65/mega65_MODE65.s create mode 100644 src/kernal/board_m65/mega65_redirect_api.s rename src/kernal/{board_m65/mega65_jumptable.s => extapi_m65/mega65__jumptable.s} (100%) rename src/kernal/{board_m65/mega65_ISMODE64.s => extapi_m65/mega65_ismode64.s} (100%) rename src/kernal/{board_m65/mega65_MODE64.s => extapi_m65/mega65_mode64.s} (91%) create mode 100644 src/kernal/extapi_m65/mega65_mode65.s rename src/kernal/{board_m65/mega65_SLOW_FAST.s => extapi_m65/mega65_slow_fast.s} (100%) create mode 100644 src/kernal/screen_m65/mega65_clrscr.s create mode 100644 src/kernal/screen_m65/mega65_scrmodeget.s create mode 100644 src/kernal/screen_m65/mega65_scrmodeset.s diff --git a/Makefile b/Makefile index 498de7f4..6b43913b 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/assets \ src/kernal/board_m65 \ src/kernal/board_x16 \ + src/kernal/extapi_m65 \ src/kernal/iec \ src/kernal/iec_fast \ src/kernal/init \ @@ -50,6 +51,7 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/rom_revision \ src/kernal/rs232 \ src/kernal/screen \ + src/kernal/screen_m65 \ src/kernal/tape \ src/kernal/time diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index 3cf72b6a..9d36e083 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -261,6 +261,13 @@ .byte $22, mod(arg, $100), floor(arg / $100) } +.pseudocommand jsr_ind_x addr +{ + .var arg = addr.getValue() + .byte $23, mod(arg, $100), floor(arg / $100) +} + + #endif diff --git a/src/aliases/,aliases_hardware.s b/src/aliases/,aliases_hardware.s index f0096f81..3a334740 100644 --- a/src/aliases/,aliases_hardware.s +++ b/src/aliases/,aliases_hardware.s @@ -70,13 +70,6 @@ .label VIC_XSCAN = $D02F // C128 only .label VIC_CLKRATE = $D030 // C128 only -#endif - -#if CONFIG_MB_MEGA_65 - - .label VIC_KEY = $D02F - .label VIC_XPOS = $D050 - #endif // SID registers diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s new file mode 100644 index 00000000..349862c2 --- /dev/null +++ b/src/aliases/,aliases_hardware_m65.s @@ -0,0 +1,24 @@ + +// +// Names of hardware registers +// +// See https://github.com/MEGA65/mega65-core/blob/master/iomap.txt +// + + +#if CONFIG_MB_MEGA_65 + + // VIC-IV registers + + .label VIC_KEY = $D02F + + .label VIC_SCFLAGS = $D031 + + .label VIC_XPOS = $D050 + + .label VIC_SCRNPTR = $D060 // 4 bytes + .label VIC_COLPTR = $D064 // 2 bytes + + .label VIC_CHARPTR = $D068 // 3 bytes + +#endif diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 22565b94..537c54a8 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -24,8 +24,15 @@ // Pages 4-7 - reused screen memory // - // $400-$57F -- UNUSED -- reserved for BASIC - // $580-$5FF -- UNUSED -- reserved for KERNAL + // $400-$57F - reserved for BASIC + // $400-$57F -- UNUSED -- reserved for BASIC + + // $580-$5FF - reserved for KERNAL + + .label M65_SCRMODE = $580 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) + .label M65_SCRTXTBASE = $581 // $581-$584 base address of the screen memory for text modes + .label M65_SCRGFXBASE = $585 // $585-$588 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes + // $589-$5FF -- UNUSED -- .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/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 95d310e5..a13ab58c 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -18,6 +18,10 @@ .label VK1__load_tape_turbo = $4000 + 2 * 4 .label VK1__load_tape_auto = $4000 + 2 * 5 .label VK1__tape_head_align = $4000 + 2 * 6 + .label VK1__M65_MODE64 = $4000 + 2 * 7 + .label VK1__M65_MODE65 = $4000 + 2 * 8 + .label VK1__M65_SCRMODEGET = $4000 + 2 * 9 + .label VK1__M65_SCRMODESET = $4000 + 2 * 10 #else @@ -51,4 +55,9 @@ .word $0000 #endif + .word M65_MODE64 + .word M65_MODE65 + .word M65_SCRMODEGET + .word M65_SCRMODESET + #endif diff --git a/src/kernal/board_m65/mega65_MODE65.s b/src/kernal/board_m65/mega65_MODE65.s deleted file mode 100644 index 9050d56c..00000000 --- a/src/kernal/board_m65/mega65_MODE65.s +++ /dev/null @@ -1,63 +0,0 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE - - -M65_MODE65: - - // Disable interrupts, they might interfere - - sei - - // Switch CPU speed to fast - - jsr M65_FAST - - // 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 - - jsr viciv_unhide - - // XXX provide proper implementation below - - // 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 !- diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 226e4f1a..7bd3e874 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -9,6 +9,9 @@ .label STOP = KERNAL_0.STOP +.label M65_SLOW = KERNAL_0.M65_SLOW +.label M65_FAST = KERNAL_0.M65_FAST + .label hw_entry_reset = KERNAL_0.hw_entry_reset .label return_from_interrupt = KERNAL_0.return_from_interrupt @@ -17,7 +20,7 @@ .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars - +.label viciv_unhide = KERNAL_0.viciv_unhide #if CONFIG_IEC @@ -28,7 +31,6 @@ #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO -.label viciv_unhide = KERNAL_0.viciv_unhide .label tape_motor_on = KERNAL_0.tape_motor_on .label tape_motor_off = KERNAL_0.tape_motor_off diff --git a/src/kernal/board_m65/mega65_redirect_api.s b/src/kernal/board_m65/mega65_redirect_api.s new file mode 100644 index 00000000..ed681163 --- /dev/null +++ b/src/kernal/board_m65/mega65_redirect_api.s @@ -0,0 +1,30 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// ROM routine call redirect for Mega65 API routines +// + +M65_MODE64: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_MODE64 + jmp map_NORMAL + +M65_MODE65: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_MODE65 + jmp map_NORMAL + +M65_SCRMODEGET: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_SCRMODEGET + jmp map_NORMAL + +M65_SCRMODESET: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_SCRMODESET + jmp map_NORMAL diff --git a/src/kernal/board_m65/mega65_viciv_unhide.s b/src/kernal/board_m65/mega65_viciv_unhide.s index 95511cb0..7f1de0a0 100644 --- a/src/kernal/board_m65/mega65_viciv_unhide.s +++ b/src/kernal/board_m65/mega65_viciv_unhide.s @@ -8,17 +8,17 @@ // -#if ROM_LAYOUT_M65 || CONFIG_KEYBOARD_C65 || (CONFIG_MB_MEGA_65 && (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO)) +#if ROM_LAYOUT_M65 || CONFIG_KEYBOARD_C65 + // XXX viciii_unhide for non-Mega65 build? viciv_unhide: - lda #$A5 + lda #$47 sta VIC_KEY - lda #$96 + lda #$53 sta VIC_KEY rts - #endif diff --git a/src/kernal/board_m65/mega65_jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s similarity index 100% rename from src/kernal/board_m65/mega65_jumptable.s rename to src/kernal/extapi_m65/mega65__jumptable.s diff --git a/src/kernal/board_m65/mega65_ISMODE64.s b/src/kernal/extapi_m65/mega65_ismode64.s similarity index 100% rename from src/kernal/board_m65/mega65_ISMODE64.s rename to src/kernal/extapi_m65/mega65_ismode64.s diff --git a/src/kernal/board_m65/mega65_MODE64.s b/src/kernal/extapi_m65/mega65_mode64.s similarity index 91% rename from src/kernal/board_m65/mega65_MODE64.s rename to src/kernal/extapi_m65/mega65_mode64.s index 2f9a265f..5f534b20 100644 --- a/src/kernal/board_m65/mega65_MODE64.s +++ b/src/kernal/extapi_m65/mega65_mode64.s @@ -1,4 +1,4 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s new file mode 100644 index 00000000..fbd26d1b --- /dev/null +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -0,0 +1,35 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_MODE65: + + // Disable interrupts, they might interfere + + sei + + // Switch CPU speed to fast + + jsr M65_FAST + + // 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 + + // Switch VIC to VIC-IV mode + + jsr viciv_unhide + + // Set screen mode to 80x25 + + lda #$01 + jsr m65_scrmodeset_internal + + // Clear the screen + + jmp M65_CLRSCR diff --git a/src/kernal/board_m65/mega65_SLOW_FAST.s b/src/kernal/extapi_m65/mega65_slow_fast.s similarity index 100% rename from src/kernal/board_m65/mega65_SLOW_FAST.s rename to src/kernal/extapi_m65/mega65_slow_fast.s diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s new file mode 100644 index 00000000..97da032e --- /dev/null +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -0,0 +1,9 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_CLRSCR: + + // XXX impplement this + + rts diff --git a/src/kernal/screen_m65/mega65_scrmodeget.s b/src/kernal/screen_m65/mega65_scrmodeget.s new file mode 100644 index 00000000..b541aa37 --- /dev/null +++ b/src/kernal/screen_m65/mega65_scrmodeget.s @@ -0,0 +1,14 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Output: +// .A - current screen mode +// + + +M65_SCRMODEGET: + + lda M65_SCRMODE + + rts diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s new file mode 100644 index 00000000..89fc8b0f --- /dev/null +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -0,0 +1,99 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Input: +// - .A - desired screen mode +// +// Output: +// - Carry set = unsupported screen mode +// - Carry clear = screen mode switched correctly +// + + +M65_SCRMODESET: + + cmp #$03 + bcs m65_scrmodeset_rts // branch if unsupported screen mode + + // Preserve .X, move desired mode to .X, disable interrupts + + phx + sei + + // Perform the switch + + jsr m65_scrmodeset_internal + + // Re-enable interrupts, restore .X + + cli + plx + + // FALLTROUGH + +m65_scrmodeset_rts: + + rts + +m65_scrmodeset_internal: // entry point for M65_MODE65 + + // Store desired screen mode + + sta M65_SCRMODE + + // Set the base screen addresses: + // - in VIC_SCRNPTR and M65_SCRTXTBASE to $16000 + // - in VIC_COLPTR to $0000 + + ldx #$00 + stx VIC_COLPTR+0 + stx VIC_COLPTR+1 + stx VIC_SCRNPTR+0 + stx M65_SCRTXTBASE+0 + stx VIC_SCRNPTR+3 + stx M65_SCRTXTBASE+3 + inx + stx VIC_SCRNPTR+2 + stx M65_SCRTXTBASE+2 + ldx #$06 + stx VIC_SCRNPTR+1 + stx M65_SCRTXTBASE+1 + + // Set flags for 40/80 columns and 25/50 rows + + asl + tax + lda VIC_SCFLAGS + jsr_ind_x m65_scrmodeset_flagtab + + rts + + + +m65_scrmodeset_flagtab: + + .word m65_scrmodeset_40x25 + .word m65_scrmodeset_80x25 + .word m65_scrmodeset_80x50 + + +m65_scrmodeset_40x25: + + and #$77 + bra !+ + +m65_scrmodeset_80x25: + + and #$F7 + ora #$80 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_scrmodeset_80x50: + + ora #$88 +!: + sta VIC_SCFLAGS + rts From 11aa1f114afa2f084c7f06d8b19b4a070f9d9244 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 15:27:07 +0200 Subject: [PATCH 04/96] screen mode initialization fix --- src/kernal/screen_m65/mega65_scrmodeset.s | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 89fc8b0f..31c37c54 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -56,7 +56,7 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 inx stx VIC_SCRNPTR+2 stx M65_SCRTXTBASE+2 - ldx #$06 + ldx #$60 stx VIC_SCRNPTR+1 stx M65_SCRTXTBASE+1 @@ -69,8 +69,6 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 rts - - m65_scrmodeset_flagtab: .word m65_scrmodeset_40x25 From ffdc67d5ca9ab934e98090e3a8fa5ebf4968b798 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 16:09:03 +0200 Subject: [PATCH 05/96] improved tape support with Mega65 native mode --- src/aliases/,aliases_hardware.s | 4 +-- src/aliases/,aliases_hardware_m65.s | 6 +++- src/kernal/board_m65/mega65_imports.s | 5 ++++ src/kernal/extapi_m65/mega65_mode64.s | 11 ++++++- src/kernal/extapi_m65/mega65_mode65.s | 9 ++++++ src/kernal/screen/screen_on.s | 2 +- src/kernal/screen_m65/mega65_scrmodeset.s | 35 ++++++----------------- src/kernal/tape/tape_common_screen.s | 27 ++++++----------- 8 files changed, 49 insertions(+), 50 deletions(-) diff --git a/src/aliases/,aliases_hardware.s b/src/aliases/,aliases_hardware.s index 3a334740..ae0ae762 100644 --- a/src/aliases/,aliases_hardware.s +++ b/src/aliases/,aliases_hardware.s @@ -183,9 +183,9 @@ .label C65_EXTKEYS_PR = $D607 .label C65_EXTKEYS_DDR = $D608 - .label M65_BADL_SLI = $D710 +#endif -#else +#if !CONFIG_MB_MEGA_65 // SuperCPU registers diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 349862c2..e6ca17c8 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -12,7 +12,7 @@ .label VIC_KEY = $D02F - .label VIC_SCFLAGS = $D031 + .label VIC_CTRLB = $D031 .label VIC_XPOS = $D050 @@ -21,4 +21,8 @@ .label VIC_CHARPTR = $D068 // 3 bytes + // MISC registers + + .label MISC_EMU = $D710 // to enable badlines and slow interrupts + #endif diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 7bd3e874..2fad26b1 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -11,7 +11,12 @@ .label STOP = KERNAL_0.STOP .label M65_SLOW = KERNAL_0.M65_SLOW .label M65_FAST = KERNAL_0.M65_FAST +.label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 +#if (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) +.label screen_on = KERNAL_0.screen_on +.label screen_off = KERNAL_0.screen_off +#endif .label hw_entry_reset = KERNAL_0.hw_entry_reset .label return_from_interrupt = KERNAL_0.return_from_interrupt diff --git a/src/kernal/extapi_m65/mega65_mode64.s b/src/kernal/extapi_m65/mega65_mode64.s index 5f534b20..6bbf1847 100644 --- a/src/kernal/extapi_m65/mega65_mode64.s +++ b/src/kernal/extapi_m65/mega65_mode64.s @@ -8,7 +8,7 @@ M65_MODE64: sei - // XXX provide full implementation + // XXX provide full implementation - switch back to normal text mode // Set the magic string to mark legacy mode @@ -17,6 +17,15 @@ M65_MODE64: sta M65_MAGICSTR+1 sta M65_MAGICSTR+2 + // Reenable badlines and slow interrupt emulation + + lda #$03 + sta MISC_EMU + + // Switch to VIC-II mode + + sta VIC_KEY + // Reenable interrupts cli diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s index fbd26d1b..c48fd2ac 100644 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -21,10 +21,19 @@ M65_MODE65: lda #$35 // '5' sta M65_MAGICSTR+2 + // XXX find a better place for code below + // Switch VIC to VIC-IV mode jsr viciv_unhide + // Disable badlines and slow interrupt emulation + + lda #$00 + sta MISC_EMU + + // XXX + // Set screen mode to 80x25 lda #$01 diff --git a/src/kernal/screen/screen_on.s b/src/kernal/screen/screen_on.s index 22853c22..57e81c02 100644 --- a/src/kernal/screen/screen_on.s +++ b/src/kernal/screen/screen_on.s @@ -8,7 +8,7 @@ // -#if (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) && !CONFIG_MB_MEGA_65 +#if (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) screen_on: diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 31c37c54..cee7dfa9 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -60,38 +60,19 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_SCRNPTR+1 stx M65_SCRTXTBASE+1 - // Set flags for 40/80 columns and 25/50 rows + // Set flags/varaibles for 40/80 columns and 25/50 rows - asl tax - lda VIC_SCFLAGS - jsr_ind_x m65_scrmodeset_flagtab + + lda m65_scrtab_vic_ctrlb,x + sta VIC_CTRLB rts -m65_scrmodeset_flagtab: - - .word m65_scrmodeset_40x25 - .word m65_scrmodeset_80x25 - .word m65_scrmodeset_80x50 -m65_scrmodeset_40x25: +m65_scrtab_vic_ctrlb: - and #$77 - bra !+ - -m65_scrmodeset_80x25: - - and #$F7 - ora #$80 - skip_2_bytes_trash_nvz - - // FALLTROUGH - -m65_scrmodeset_80x50: - - ora #$88 -!: - sta VIC_SCFLAGS - rts + .byte %00000000 // 40x25 + .byte %10000000 // 80x25 + .byte %10000100 // 80x50 diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 77fd0b95..083e917c 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -11,8 +11,6 @@ #if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO -// XXX for Mega65 do not disable screen, just disable badline emulation - tape_screen_on_motor_off: @@ -21,18 +19,14 @@ tape_screen_on_motor_off: lda COLSTORE sta VIC_EXTCOL -#if !CONFIG_MB_MEGA_65 +#if !ROM_LAYOUT_M65 jmp screen_on #else - // On Mega65 just reenable badline emulation - - lda #$FF - sta M65_BADL_SLI - sta VIC_KEY - + jsr M65_ISMODE65 + bne_16 screen_on // MEGA65 native mode does not have badlines, no need to enable/disable screen rts #endif @@ -51,22 +45,19 @@ tape_screen_off_motor_on: lda VIC_EXTCOL sta COLSTORE -#if !CONFIG_MB_MEGA_65 - +#if !ROM_LAYOUT_M65 + jsr screen_off #else - // On Mega65 we do not have to turn the screen off; - // it is enough to disable badline emulation - - jsr viciv_unhide - lda #$00 - sta M65_BADL_SLI + jsr M65_ISMODE65 + beq !+ // MEGA65 native mode does not have badlines, no need to enable/disable screen + jsr screen_off +!: #endif - jmp tape_motor_on #endif From 83cdf37c0d0102322592c83008b9d301887d347c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 17:24:09 +0200 Subject: [PATCH 06/96] 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 # Date: Sat, 8 Aug 2020 20:39:55 +0200 Subject: [PATCH 07/96] more work towards Mega65 screen support --- CREDITS.md | 4 +- src/aliases/,aliases_cpu.s | 79 ++++++++++++++++++ src/aliases/,aliases_ram_lowmem_m65.s | 16 ++-- src/basic/basic_commands/cmd_rem.s | 2 + .../board_m65/4000.mega65_vectable_kernal_1.s | 6 +- src/kernal/board_m65/mega65_redirect_api.s | 23 ++++- src/kernal/board_m65/mega65_redirect_screen.s | 1 - src/kernal/extapi_m65/mega65__jumptable.s | 6 ++ src/kernal/screen_m65/mega65_clrscr.s | 9 -- src/kernal/screen_m65/mega65_clrscr_clrwin.s | 83 +++++++++++++++++++ src/kernal/screen_m65/mega65_screen_tables.s | 16 +++- 11 files changed, 221 insertions(+), 24 deletions(-) delete mode 100644 src/kernal/screen_m65/mega65_clrscr.s create mode 100644 src/kernal/screen_m65/mega65_clrscr_clrwin.s diff --git a/CREDITS.md b/CREDITS.md index c1a3082a..dce673d1 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -26,8 +26,10 @@ ## other -* Gábor Lénárt - for his work on [XEMU Mega65 emulator](https://github.com/lgblgblgb/xemu) +* Gábor Lénárt - for [his work](https://github.com/lgblgblgb/xemu) on XEMU Mega65 emulator +* Hernán Di Pietro - for [his work](https://github.com/hernandp/xemu) on XEMU Mega65 emulator * Mads Nielsen - for the [Kick Assembler](http://www.theweb.dk/KickAssembler/Main.html#frontpage) +* Simon Jameson - for his Kick Assembler [pseudocommands](https://github.com/smnjameson/M65_KickAsm_PseudoCommands) for Mega65 CPU support
diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index 9d36e083..f1ad4b98 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -268,6 +268,85 @@ } +// Others, taken from https://github.com/smnjameson/M65_KickAsm_PseudoCommands + +.const z = -999 // allows (base page),z addressing mode +.const sy = -998 // allows (base page, s),y addressing mode +.const AT_IZEROPAGEZ = 13 // adds a pseudo addressing mode +.const AT_INDIRECTX = -5 // adds a pseudo addressing mode + +.function GetAdressingModeType(arg) { + .if(arg == AT_NONE) .return "AT_NONE" + .if(arg == AT_IMMEDIATE) .return "AT_IMMEDIATE" + .if(arg == AT_INDIRECT) .return "AT_INDIRECT" + .if(arg == AT_INDIRECTX) .return "AT_INDIRECTX" + .if(arg == AT_ABSOLUTE) .return "AT_ABSOLUTE" + .if(arg == AT_ABSOLUTEX) .return "AT_ABSOLUTEX" + .if(arg == AT_ABSOLUTEY) .return "AT_ABSOLUTEY" + .if(arg == AT_IZEROPAGEX) .return "AT_IZEROPAGEX" + .if(arg == AT_IZEROPAGEY) .return "AT_IZEROPAGEY" + .if(arg == AT_IZEROPAGEZ) .return "AT_IZEROPAGEZ" + .return arg +} + +.pseudocommand cpz arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type == AT_IMMEDIATE) { + .byte $C2, value + } else .if(type == AT_ABSOLUTE) { + .if(value <= $FF ) { + .byte $D4, value + } else { + .byte $DC, value + } + } else { + .error "Invalid adressingmode. 'cpz' doesn't support "+GetAdressingModeType(type)+" mode" + } +} + +.pseudocommand lda arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "':lda' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "':lda ($nn),z' requires zeropage address" + .byte $B2, value +} + +.pseudocommand ldz arg +{ + .var value = arg.getValue() + .var type = arg.getType() + .if(type == AT_IMMEDIATE) { + .byte $A3, value + } else .if(type == AT_ABSOLUTE) { + .byte $AB, value + } else .if(type == AT_ABSOLUTEX) { + .byte $BB, value + } else { + .error "Invalid adressingmode. 'ldz' doesn't support "+GetAdressingModeType(type)+" mode" + } +} + +.pseudocommand sta arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "':sta' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "':sta ($nn),z' requires zeropage address" + .byte $92, value +} + +// Flat memory access support + +.pseudocommand sta_lp arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "'sta_lp' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "'sta_lp' requires zeropage address" + nop + .byte $92, value +} + #endif diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 537c54a8..921bd319 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -10,7 +10,7 @@ // Page 0 - reused LDTB1 // - // $D9 -- UNUSED -- + .label M65_TMP__K1 = $D9 // $D9 -- UNUSED -- temporary value for various Kernal routines .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 @@ -18,7 +18,7 @@ .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 -- + .label M65_TMP__K2 = $F2 // $F2 -- UNUSED -- temporary value for various Kernal routines // // Pages 4-7 - reused screen memory @@ -30,9 +30,13 @@ // $580-$5FF - reserved for KERNAL - .label M65_SCRMODE = $580 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) - .label M65_SCRTXTBASE = $581 // $581-$584 base address of the screen memory for text modes - .label M65_SCRGFXBASE = $585 // $585-$588 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes - // $589-$5FF -- UNUSED -- + .label M65_SCRTXTBASE = $580 // $580-$583 base address of the screen memory for text modes + .label M65_SCRGFXBASE = $584 // $584-$587 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes + .label M65_SCRMODE = $588 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) + .label M65_TXTWIN_X0 = $589 // text window - top-left X coordinate, starting from 0 + .label M65_TXTWIN_Y0 = $58A // text window - top-left Y coordinate, starting from 0 + .label M65_TXTWIN_X1 = $58B // text window - bottom-right X coordinate + 1 + .label M65_TXTWIN_Y1 = $58C // text window - bottom-right Y coordinate + 1 + // $58D-$5FF -- UNUSED -- .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/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index 3247ab0f..ea139303 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,6 +7,8 @@ cmd_rem: + // XXX do we need these PHA's? + pha pha jmp execute_statements_end_of_line diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index c6680565..6e6a7dd5 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -23,6 +23,8 @@ .label VK1__M65_MODE65 = $4000 + 2 * 9 .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 .label VK1__M65_SCRMODESET = $4000 + 2 * 11 + .label VK1__M65_CLRSCR = $4000 + 2 * 12 + .label VK1__M65_CLRWIN = $4000 + 2 * 13 #else @@ -61,6 +63,8 @@ .word M65_MODE64 .word M65_MODE65 .word M65_SCRMODEGET - .word M65_SCRMODESET + .word M65_SCRMODESET + .word M65_CLRSCR + .word M65_CLRWIN #endif diff --git a/src/kernal/board_m65/mega65_redirect_api.s b/src/kernal/board_m65/mega65_redirect_api.s index ed681163..8c47f81c 100644 --- a/src/kernal/board_m65/mega65_redirect_api.s +++ b/src/kernal/board_m65/mega65_redirect_api.s @@ -9,22 +9,39 @@ M65_MODE64: jsr map_KERNAL_1 jsr_ind VK1__M65_MODE64 - jmp map_NORMAL + bra m65_api_end M65_MODE65: jsr map_KERNAL_1 jsr_ind VK1__M65_MODE65 - jmp map_NORMAL + bra m65_api_end M65_SCRMODEGET: jsr map_KERNAL_1 jsr_ind VK1__M65_SCRMODEGET - jmp map_NORMAL + bra m65_api_end M65_SCRMODESET: jsr map_KERNAL_1 jsr_ind VK1__M65_SCRMODESET + bra m65_api_end + +M65_CLRSCR: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_CLRSCR + bra m65_api_end + +M65_CLRWIN: + + jsr map_KERNAL_1 + jsr_ind VK1__M65_CLRWIN + + // FALLTROUGH + +m65_api_end: + jmp map_NORMAL diff --git a/src/kernal/board_m65/mega65_redirect_screen.s b/src/kernal/board_m65/mega65_redirect_screen.s index f875e0f6..9ca9c889 100644 --- a/src/kernal/board_m65/mega65_redirect_screen.s +++ b/src/kernal/board_m65/mega65_redirect_screen.s @@ -12,4 +12,3 @@ m65_chrout_screen: jsr_ind VK1__m65_chrout_screen jsr map_NORMAL jmp chrout_done_success - diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 8faae9c8..8f11f632 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -25,3 +25,9 @@ M65_JFAST: M65_JSELDEV: jsr SELDEV + +M65_JCLRSCR: + jsr M65_CLRSCR + +M65_JCLRWIN: + jsr M65_CLRWIN diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s deleted file mode 100644 index 97da032e..00000000 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ /dev/null @@ -1,9 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -M65_CLRSCR: - - // XXX impplement this - - rts diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrscr_clrwin.s new file mode 100644 index 00000000..a5876e2f --- /dev/null +++ b/src/kernal/screen_m65/mega65_clrscr_clrwin.s @@ -0,0 +1,83 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_CLRSCR: + + // Set the text window to whole screen area + + lda #$00 + sta M65_TXTWIN_X0 + sta M65_TXTWIN_Y0 + + ldx M65_SCRMODE + + lda m65_scrtab_txtwidth, X + sta M65_TXTWIN_X1 + lda m65_scrtab_txtheight, X + sta M65_TXTWIN_Y1 + + // FALLTROUGH + +M65_CLRWIN: + + // To clear the window, two zeropage long pointers will be used: + // - M65_LPNT_SCR for screen memory + // - M65_LPNT_KERN for colour memory (starts from $FF80000) + + // First initialize both pointers + + ldx #$03 +!: + lda M65_SCRTXTBASE,x + sta M65_LPNT_SCR,x + lda #$00 + sta M65_LPNT_KERN,x + dex + bpl !- + + lda #$0F + sta M65_LPNT_KERN+2 + lda #$F8 + sta M65_LPNT_KERN+1 + + // Go trough all the rows + + phz + ldy #$00 + + // FALLTROUGH + +m65_clrwin_loop: + + // Check if .Y cordinate is not below the window + + cpy M65_TXTWIN_Y0 + bcc m65_clrwin_loop_next // branch if we should skip this row + + // Clear the row + + ldz M65_TXTWIN_X0 +!: + lda #$20 + sta_lp (M65_LPNT_SCR),z + lda #$00 + sta_lp (M65_LPNT_KERN),z + inz + cpz M65_TXTWIN_X1 + bne !- + + // FALLTROUGH + +m65_clrwin_loop_next: + + iny + + // XXX + + plz + + + // XXX implement this + + rts diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 85ce9336..3a071a2b 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -2,10 +2,20 @@ // #LAYOUT# * * #IGNORE -// Table of parameters for VIC control register B - -m65_scrtab_vic_ctrlb: +m65_scrtab_vic_ctrlb: // parameters for VIC control register B .byte %00100000 // 40x25 + extended attributes .byte %10100000 // 80x25 + extended attributes .byte %10100100 // 80x50 + extended attributes + +m65_scrtab_txtwidth: // width of the text screen + + .byte 40 + .byte 80 + .byte 80 + +m65_scrtab_txtheight: // height of the text screen + + .byte 25 + .byte 25 + .byte 50 From ab5400b20c42c16ffe8bbb16c0ec781132e1101d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 8 Aug 2020 21:51:15 +0200 Subject: [PATCH 08/96] clearing Mega65 text scren works now --- src/kernal/screen_m65/mega65_chrout_screen.s | 4 +-- src/kernal/screen_m65/mega65_clrscr_clrwin.s | 31 ++++++++++++++++---- src/kernal/screen_m65/mega65_scrmodeset.s | 14 ++++----- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 8d771c31..fd122ae1 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -4,6 +4,6 @@ m65_chrout_screen: - // Provide implementation + // XXX provide implementation - rts \ No newline at end of file + rts diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrscr_clrwin.s index a5876e2f..5d363ed6 100644 --- a/src/kernal/screen_m65/mega65_clrscr_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrscr_clrwin.s @@ -37,13 +37,14 @@ M65_CLRWIN: bpl !- lda #$0F - sta M65_LPNT_KERN+2 + sta M65_LPNT_KERN+3 lda #$F8 - sta M65_LPNT_KERN+1 + sta M65_LPNT_KERN+2 // Go trough all the rows phz + ldx M65_SCRMODE ldy #$00 // FALLTROUGH @@ -61,7 +62,7 @@ m65_clrwin_loop: !: lda #$20 sta_lp (M65_LPNT_SCR),z - lda #$00 + lda COLOR sta_lp (M65_LPNT_KERN),z inz cpz M65_TXTWIN_X1 @@ -71,12 +72,30 @@ m65_clrwin_loop: m65_clrwin_loop_next: + // Increment M65_LPNT_SCR and M65_LPNT_KERN by the row length + + clc + lda m65_scrtab_txtwidth, x + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + bcc !+ + inc M65_LPNT_SCR+1 +!: + clc + lda m65_scrtab_txtwidth, x + adc M65_LPNT_KERN+0 + sta M65_LPNT_KERN+0 + bcc !+ + inc M65_LPNT_KERN+1 +!: + // Increment row counter, check if new row is valid + iny - - // XXX - + cpy M65_TXTWIN_Y1 + bne m65_clrwin_loop plz + // Set screen variables // XXX implement this diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 1ee6e0ac..c7e070e5 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -42,6 +42,13 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 sta M65_SCRMODE + // Set flags/variables for 40/80 columns and 25/50 rows + + tax + + lda m65_scrtab_vic_ctrlb,x + sta VIC_CTRLB + // Set the base screen addresses: // - in VIC_SCRNPTR and M65_SCRTXTBASE to $16000 // - in VIC_COLPTR to $0000 @@ -60,11 +67,4 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_SCRNPTR+1 stx M65_SCRTXTBASE+1 - // Set flags/variables for 40/80 columns and 25/50 rows - - tax - - lda m65_scrtab_vic_ctrlb,x - sta VIC_CTRLB - rts From ab22c13fac5957322035ebe346eae37b19426f7c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 9 Aug 2020 13:11:15 +0200 Subject: [PATCH 09/96] more work towards Mega65 console --- src/aliases/,aliases_hardware_m65.s | 8 +++++--- src/kernal/screen_m65/mega65_clrscr_clrwin.s | 6 +++--- src/kernal/screen_m65/mega65_screen_tables.s | 18 +++++++++++++++++- src/kernal/screen_m65/mega65_scrmodeset.s | 8 +++++++- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 9830338e..14e33cc4 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -16,10 +16,12 @@ .label VIC_XPOS = $D050 - .label VIC_SCRNPTR = $D060 // 4 bytes - .label VIC_COLPTR = $D064 // 2 bytes + .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line - .label VIC_CHARPTR = $D068 // 3 bytes + .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory + .label VIC_COLPTR = $D064 // 2 bytes - pointer to start of color memory + + .label VIC_CHARPTR = $D068 // 3 bytes - pointer to start of character generator // MISC registers diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrscr_clrwin.s index 5d363ed6..d29ae967 100644 --- a/src/kernal/screen_m65/mega65_clrscr_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrscr_clrwin.s @@ -72,17 +72,17 @@ m65_clrwin_loop: m65_clrwin_loop_next: - // Increment M65_LPNT_SCR and M65_LPNT_KERN by the row length + // Increment M65_LPNT_SCR and M65_LPNT_KERN by the logical row length (always 80 = $50) clc - lda m65_scrtab_txtwidth, x + lda #$50 adc M65_LPNT_SCR+0 sta M65_LPNT_SCR+0 bcc !+ inc M65_LPNT_SCR+1 !: clc - lda m65_scrtab_txtwidth, x + lda #$50 adc M65_LPNT_KERN+0 sta M65_LPNT_KERN+0 bcc !+ diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 3a071a2b..2a00a5ce 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -8,7 +8,7 @@ m65_scrtab_vic_ctrlb: // parameters for VIC control register B .byte %10100000 // 80x25 + extended attributes .byte %10100100 // 80x50 + extended attributes -m65_scrtab_txtwidth: // width of the text screen +m65_scrtab_txtwidth: // width of the text screen (logical width is always set to 80) .byte 40 .byte 80 @@ -19,3 +19,19 @@ m65_scrtab_txtheight: // height of the text screen .byte 25 .byte 25 .byte 50 + +m65_scrtab_rowoffset_lo: // row offsets - low bytes + + .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) + .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) + .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) + .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) + .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) + +m65_scrtab_rowoffset_hi: // row offsets - high bytes + + .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) + .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) + .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) + .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) + .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) \ No newline at end of file diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index c7e070e5..56994e77 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -49,11 +49,17 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 lda m65_scrtab_vic_ctrlb,x sta VIC_CTRLB + // Set the logical row length to 80 + + ldx #$50 + stx VIC_CHARSTEP+0 + ldx #$00 + stx VIC_CHARSTEP+1 + // Set the base screen addresses: // - in VIC_SCRNPTR and M65_SCRTXTBASE to $16000 // - in VIC_COLPTR to $0000 - ldx #$00 stx VIC_COLPTR+0 stx VIC_COLPTR+1 stx VIC_SCRNPTR+0 From 0d4898d91c88a5c4b6098ccaf90c1c6260aea059 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 13 Aug 2020 19:18:05 +0200 Subject: [PATCH 10/96] preparation for up-scrollable console --- src/aliases/,aliases_ram_lowmem_m65.s | 21 ++-- src/kernal/screen_m65/mega65_clrscr.s | 118 ++++++++++++++++++ ...mega65_clrscr_clrwin.s => mega65_clrwin.s} | 59 +++++---- src/kernal/screen_m65/mega65_screen_tables.s | 12 ++ src/kernal/screen_m65/mega65_scrmodeset.s | 55 ++++++-- 5 files changed, 214 insertions(+), 51 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_clrscr.s rename src/kernal/screen_m65/{mega65_clrscr_clrwin.s => mega65_clrwin.s} (67%) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 921bd319..97dafc69 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -30,13 +30,18 @@ // $580-$5FF - reserved for KERNAL - .label M65_SCRTXTBASE = $580 // $580-$583 base address of the screen memory for text modes - .label M65_SCRGFXBASE = $584 // $584-$587 -- NOT IMPLEMENTED -- base address of the screen memory for graphics modes - .label M65_SCRMODE = $588 // 0 = 40x25, 1 = 80x25, 2 = 80x50, (-- NOT IMPLEMENTED -- add $80 for graphics modes) - .label M65_TXTWIN_X0 = $589 // text window - top-left X coordinate, starting from 0 - .label M65_TXTWIN_Y0 = $58A // text window - top-left Y coordinate, starting from 0 - .label M65_TXTWIN_X1 = $58B // text window - bottom-right X coordinate + 1 - .label M65_TXTWIN_Y1 = $58C // text window - bottom-right Y coordinate + 1 - // $58D-$5FF -- UNUSED -- + .label M65_SCRSEG = $580 // $580-$581 segment address (2 higher bytes) of the screen memory + .label M65_SCRBASE = $582 // $582-$583 first byte of screen memory + .label M65_SCRGUARD = $584 // $584-$585 last byte of screen memory + 1 + .label M65_SCRVIEW = $586 // $586-$587 first byte of screen memory viewport + .label M65_COLVIEW = $588 // $588-$589 first byte of color memory viewport + .label M65_SCRVIEWMAX = $58A // $58A-$58B largest allowed value of M65_SCRVIEW + .label M65_SCRMODE = $58C // 0 = 40x25, 1 = 80x25, 2 = 80x50 + .label M64_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled + .label M65_TXTWIN_X0 = $58E // text window - top-left X coordinate, starting from 0 + .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 + .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 + .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 + // $592-$5FF -- UNUSED -- .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/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s new file mode 100644 index 00000000..14d951a7 --- /dev/null +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -0,0 +1,118 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_CLRSCR: + + // Clear additional attributes from the color code + + lda COLOR + and #$0F + sta COLOR + + // Disable the window mode + + lda #$00 + sta M64_SCRWINMODE + + // FALLTROUGH + +m65_clrscr_takeover: + + // Set the viewport to the beginning of screen memory - variables: + // - M65_SCRVIEW, M65_COLVIEW + // To clear the screen, two zeropage long pointers will be used, initialize them too + // - M65_LPNT_SCR for screen memory + // - M65_LPNT_KERN for colour memory (starts from $FF80000) + + sta M65_COLVIEW+0 + sta M65_COLVIEW+1 + + sta M65_LPNT_KERN+0 + sta M65_LPNT_KERN+1 + lda #$F8 + sta M65_LPNT_KERN+2 + lda #$0F + sta M65_LPNT_KERN+3 + + lda M65_SCRSEG+0 + sta M65_SCRVIEW+0 + lda M65_SCRSEG+1 + sta M65_SCRVIEW+1 + + lda M65_SCRBASE+0 + sta M65_LPNT_SCR+0 + lda M65_SCRBASE+1 + sta M65_LPNT_SCR+1 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + + // Clear the whole screen+color memory + + phz + + // FALLTROUGH + +m65_clrscr_loop: + + // Clear 80 characters + + ldz #$4F // 80 bytes +!: + lda #$20 + sta_lp (M65_LPNT_SCR),z + lda COLOR + sta_lp (M65_LPNT_KERN),z + + dez + bpl !- + + // Move M65_LPNT_SCR and M65_LPNT_KERN 80 characters forward + // XXX deduplicate with window clearing + + clc + lda M65_LPNT_SCR+0 + adc #$50 + sta M65_LPNT_SCR+0 + bcc !+ + inc M65_LPNT_SCR+1 +!: + clc + lda M65_LPNT_KERN+0 + adc #$50 + sta M65_LPNT_KERN+0 + bcc !+ + inc M65_LPNT_KERN+1 +!: + // Check if we have more rows to clear + + lda M65_LPNT_SCR+1 + cmp M65_SCRGUARD+1 + bne m65_clrscr_loop + lda M65_LPNT_SCR+0 + cmp M65_SCRGUARD+0 + bne m65_clrscr_loop + + // Restore .Z register + + plz + + // Set screen+color base address in VIC IV + // XXX deduplicate with mode setting routine + + lda #$00 + sta VIC_COLPTR+0 + sta VIC_COLPTR+1 + + lda M65_SCRBASE+0 + sta VIC_SCRNPTR+0 + lda M65_SCRBASE+1 + sta VIC_SCRNPTR+1 + + // Set screen variables + + // XXX implement this, together with HOME + + rts diff --git a/src/kernal/screen_m65/mega65_clrscr_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s similarity index 67% rename from src/kernal/screen_m65/mega65_clrscr_clrwin.s rename to src/kernal/screen_m65/mega65_clrwin.s index d29ae967..fdd782b9 100644 --- a/src/kernal/screen_m65/mega65_clrscr_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -2,49 +2,48 @@ // #LAYOUT# * * #IGNORE -M65_CLRSCR: - - // Set the text window to whole screen area - - lda #$00 - sta M65_TXTWIN_X0 - sta M65_TXTWIN_Y0 - - ldx M65_SCRMODE - - lda m65_scrtab_txtwidth, X - sta M65_TXTWIN_X1 - lda m65_scrtab_txtheight, X - sta M65_TXTWIN_Y1 - - // FALLTROUGH - M65_CLRWIN: + // Clear additional attributes from the color code + // XXX deduplicate with M65_CLRSCR + + lda COLOR + and #$0F + sta COLOR + + // Check if windowed mode; if not, go to M65_CLRSCR + + lda M64_SCRWINMODE + bpl_16 m65_clrscr_takeover + // To clear the window, two zeropage long pointers will be used: // - M65_LPNT_SCR for screen memory // - M65_LPNT_KERN for colour memory (starts from $FF80000) // First initialize both pointers - ldx #$03 -!: - lda M65_SCRTXTBASE,x - sta M65_LPNT_SCR,x - lda #$00 - sta M65_LPNT_KERN,x - dex - bpl !- + lda M65_SCRVIEW+0 + sta M65_LPNT_SCR+0 + lda M65_SCRVIEW+1 + sta M65_LPNT_SCR+1 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 - lda #$0F - sta M65_LPNT_KERN+3 - lda #$F8 - sta M65_LPNT_KERN+2 + lda M65_COLVIEW+0 + sta M65_LPNT_KERN+0 + lda M65_COLVIEW+1 + sta M65_LPNT_KERN+1 + // XXX deduplicate part below with M65_CLRSCR + lda #$F8 + sta M65_LPNT_KERN+2 + lda #$0F + sta M65_LPNT_KERN+3 // Go trough all the rows phz - ldx M65_SCRMODE ldy #$00 // FALLTROUGH diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 2a00a5ce..7055d533 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -20,6 +20,18 @@ m65_scrtab_txtheight: // height of the text screen .byte 25 .byte 50 +m65_scrtab_viewmax_lo: // maximum allowed viewport start - low byte + + .byte $B0 + .byte $B0 + .byte $E0 + +m65_scrtab_viewmax_hi: // maximum allowed viewport start - high byte + + .byte $96 + .byte $96 + .byte $8E + m65_scrtab_rowoffset_lo: // row offsets - low bytes .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 56994e77..27879d87 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -56,21 +56,50 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 ldx #$00 stx VIC_CHARSTEP+1 - // Set the base screen addresses: - // - in VIC_SCRNPTR and M65_SCRTXTBASE to $16000 - // - in VIC_COLPTR to $0000 + // Set the following locations: + // - M64_SCRWINMODE - for scroll-console mode + // - M65_SCRSEG, VIC_SCRNPTR+2/+3 - for screen in $0001xxxx area + stx M64_SCRWINMODE // .X = 0 + stx M65_SCRSEG+1 + stx VIC_SCRNPTR+3 + inx + stx M65_SCRSEG+0 + stx VIC_SCRNPTR+2 + + // Set the following locations: + // - M65_SCRBASE - for screen starting from $xxxx6000 + // - M65_SCRVIEW, VIC_SCRNPTR+0/+1 - for screen viewport starting from the same address + // - M65_COLVIEW, VIC_COLPTR - for using color memory from the start + + ldx #$60 + stx M65_SCRBASE+1 + stx M65_SCRVIEW+1 + stx VIC_SCRNPTR+1 + + ldx #$00 + stx M65_SCRBASE+0 + stx M65_SCRVIEW+0 + stx VIC_SCRNPTR+0 + + stx M65_COLVIEW+0 + stx M65_COLVIEW+1 stx VIC_COLPTR+0 stx VIC_COLPTR+1 - stx VIC_SCRNPTR+0 - stx M65_SCRTXTBASE+0 - stx VIC_SCRNPTR+3 - stx M65_SCRTXTBASE+3 - inx - stx VIC_SCRNPTR+2 - stx M65_SCRTXTBASE+2 - ldx #$60 - stx VIC_SCRNPTR+1 - stx M65_SCRTXTBASE+1 + + // Set the following locations: + // - M65_SCREND - for max 200 lines of virtual screen + // - M65_SCRVIEWMAX - as above, but depending on the mode + + ldx #$80 + stx M65_SCRGUARD+0 + ldx #$9E + stx M65_SCRGUARD+1 + + ldx M65_SCRMODE + lda m65_scrtab_viewmax_lo, x + sta M65_SCRVIEWMAX+0 + lda m65_scrtab_viewmax_hi, x + sta M65_SCRVIEWMAX+1 rts From ee549361ab59d1513702da4606c74f0042d6a011 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 16 Aug 2020 21:43:18 +0200 Subject: [PATCH 11/96] more work towards MEGA65 native mode screen support --- src/aliases/,aliases_ram_lowmem_m65.s | 7 +++ src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/screen/chrout_screen.s | 39 ++-------------- src/kernal/screen/chrout_to_screen_code.s | 44 +++++++++++++++++++ src/kernal/screen_m65/mega65_chrout_screen.s | 33 +++++++++++++- .../screen_m65/mega65_chrout_screen_control.s | 9 ++++ src/kernal/screen_m65/mega65_clrscr.s | 6 ++- 7 files changed, 101 insertions(+), 38 deletions(-) create mode 100644 src/kernal/screen/chrout_to_screen_code.s create mode 100644 src/kernal/screen_m65/mega65_chrout_screen_control.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 97dafc69..47e77a3a 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -20,6 +20,13 @@ .label M65_LPNT_KERN = $EE // $EE-$F1 4-byte pointer for temporary usage by KERNAL .label M65_TMP__K2 = $F2 // $F2 -- UNUSED -- temporary value for various Kernal routines + // + // Page 0 - other reused values + // + + .label M65__TXTROW = PNTR // screen row + .label M65__TXTCOL = TBLX // screen column + // // Pages 4-7 - reused screen memory // diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 2fad26b1..7bda6d9f 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -22,6 +22,7 @@ .label return_from_interrupt = KERNAL_0.return_from_interrupt .label clrchn_reset = KERNAL_0.clrchn_reset .label udtim_keyboard = KERNAL_0.udtim_keyboard +.label chrout_to_screen_code = KERNAL_0.chrout_to_screen_code .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index 8bf46760..e7e38bb0 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -26,49 +26,16 @@ chrout_screen: // ones are always printable characters; separate away control codes and #$60 - bne !+ - jmp chrout_screen_control -!: + beq_16 chrout_screen_control txa // Literals - first convert PETSCII to screen code - // Codes $C0-$DF become $40-$5F - cmp #$E0 - bcs !+ - cmp #$C0 - bcc !+ - - and #$7F - jmp chrout_screen_literal // not high char - -!: - // Range $20-$3F is unchanged - cmp #$40 - bcc chrout_screen_literal // not high char - - // Unshifted letters and symbols from $40-$5F - // all end up being -$40 - // (C64 PRG p376) - - // But anything >= $80 needs to be -$40 - // (C64 PRG p380-381) - // And bit 7 should be cleared, only to be - // set by reverse video - sec - sbc #$40 - - // Fix shifted chars by adding $20 again - cmp #$20 - bcc chrout_screen_literal // not high char - cmp #$40 - bcs chrout_screen_literal // not high char - clc - adc #$20 + jsr chrout_to_screen_code // FALLTROUGH -chrout_screen_literal: +chrout_screen_literal: // entry point for chrout_screen_quote // Write normal character on the screen diff --git a/src/kernal/screen/chrout_to_screen_code.s b/src/kernal/screen/chrout_to_screen_code.s new file mode 100644 index 00000000..207c512d --- /dev/null +++ b/src/kernal/screen/chrout_to_screen_code.s @@ -0,0 +1,44 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// CHROUT routine - convert PETSCII to screen code +// + + +chrout_to_screen_code: + + // Codes $C0-$DF become $40-$5F + cmp #$E0 + bcs !+ + cmp #$C0 + bcc !+ + + and #$7F + rts // not high char +!: + // Range $20-$3F is unchanged + cmp #$40 + bcc !+ // not high char + + // Unshifted letters and symbols from $40-$5F + // all end up being -$40 + // (C64 PRG p376) + + // But anything >= $80 needs to be -$40 + // (C64 PRG p380-381) + // And bit 7 should be cleared, only to be + // set by reverse video + sec + sbc #$40 + + // Fix shifted chars by adding $20 again + cmp #$20 + bcc !+ // not high char + cmp #$40 + bcs !+ // not high char + clc + adc #$20 +!: + rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index fd122ae1..9998a91b 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -1,9 +1,40 @@ // #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE +// +// CHROUT routine - screen support (character output), MEGA65 native mode version +// + m65_chrout_screen: - // XXX provide implementation + // XXX hide cursor if visible + + lda SCHAR + tax + + // All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining + // ones are always printable characters; separate away control codes + + and #$60 + beq_16 m65_chrout_screen_control + txa + + // Literals - first convert PETSCII to screen code + + jsr chrout_to_screen_code + + // FALLTROUGH + +m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote + + // Write normal character on the screen + + tax // store screen code, we need .A for calculations + + // XXX continue the implementation + + + rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s new file mode 100644 index 00000000..53602392 --- /dev/null +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -0,0 +1,9 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_chrout_screen_control: + + // XXX provide implementation + + rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 14d951a7..4a109977 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -113,6 +113,10 @@ m65_clrscr_loop: // Set screen variables - // XXX implement this, together with HOME + // XXX provide proper implementation, together with HOME + + lda #$00 + sta M65__TXTROW + sta M65__TXTCOL rts From 628b9447216cf6dea9177550299730d633b785ca Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 19 Aug 2020 22:19:23 +0200 Subject: [PATCH 12/96] work towards literal output for native MEGA65 mode --- src/basic/basic_commands/cmd_go_goto_run.s | 13 ++++- src/kernal/screen_m65/mega65_chrout_screen.s | 58 +++++++++++++++++++- src/kernal/screen_m65/mega65_clrscr.s | 2 +- src/kernal/screen_m65/mega65_clrwin.s | 2 +- 4 files changed, 71 insertions(+), 4 deletions(-) diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 2600b80f..2665c9a6 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -50,7 +50,16 @@ cmd_go_syntax_error: jsr helper_ask_if_sure bcs cmd_go_rts jsr M65_MODE65 - jmp do_clr + // XXX test code, replace by jmp do_clr + + jsr do_clr + + lda #$41 + jsr JCHROUT +testx: + jmp testx + + !: jmp do_ILLEGAL_QUANTITY_error @@ -82,6 +91,8 @@ cmd_run: cmd_goto: // GOTO requires line number + // XXX in case of no parameter, go to line 0 - checked with original ROMs + jsr fetch_line_number #if !ROM_LAYOUT_M65 diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 9998a91b..fa09e070 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -32,9 +32,65 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote tax // store screen code, we need .A for calculations - // XXX continue the implementation + // Preserve .Z on stack, use it toi store screen columnt + phz + ldz M65__TXTCOL + // Start from setting M65_SCRSEG to point colour memory (starts from $FF80000) + lda #$0F + sta M65_SCRSEG+3 + lda #$F8 + sta M65_SCRSEG+2 + + lda M65_COLVIEW+1 + sta M65_SCRSEG+1 + lda M65_COLVIEW+0 + sta M65_SCRSEG+0 + + // Add screen row to the address + + ldy M65__TXTROW + clc + lda m65_scrtab_rowoffset_lo,y + adc M65_SCRSEG+0 + sta M65_SCRSEG+0 + lda m65_scrtab_rowoffset_hi,y + adc M65_SCRSEG+1 + sta M65_SCRSEG+1 + + // Store the new color in screen memory + + lda COLOR + sta_lp (M65_LPNT_SCR),z + + // Now change M65_LPNT_SCRb to point to screen memory + + // XXX deduplicate this part + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + + clc + lda M65_SCRBASE+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + lda M65_SCRBASE+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 + + // Store the new character in screen memory, restore .Z + + txa + sta_lp (M65_LPNT_SCR),z + plz + + // Increment screen column by 1 + + inc M65__TXTCOL + + // XXX continue the implementation - fix the cursor position rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 4a109977..6c252914 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -23,7 +23,7 @@ m65_clrscr_takeover: // - M65_SCRVIEW, M65_COLVIEW // To clear the screen, two zeropage long pointers will be used, initialize them too // - M65_LPNT_SCR for screen memory - // - M65_LPNT_KERN for colour memory (starts from $FF80000) + // - M65_LPNT_KERN for colour memory (starts from $FF80000) // XXX preserve this on stack, restore afterwards sta M65_COLVIEW+0 sta M65_COLVIEW+1 diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index fdd782b9..34d88a3c 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -18,7 +18,7 @@ M65_CLRWIN: // To clear the window, two zeropage long pointers will be used: // - M65_LPNT_SCR for screen memory - // - M65_LPNT_KERN for colour memory (starts from $FF80000) + // - M65_LPNT_KERN for colour memory (starts from $FF80000) // XXX preserve this on stack, restore afterwards // First initialize both pointers From 8b6b47041743ee5622c827c370f61e81ac8a2ae8 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 19 Aug 2020 22:51:33 +0200 Subject: [PATCH 13/96] MEGA65 native mode fixes --- src/basic/basic_commands/cmd_go_goto_run.s | 15 +++----------- src/basic/basic_commands/cmd_sys.s | 2 +- .../{mega65_ismode64.s => mega65_ismode65.s} | 12 ++++++++++- src/kernal/screen/chrout_screen.s | 2 +- src/kernal/screen_m65/mega65_chrout_screen.s | 20 +++++++++---------- src/kernal/tape/tape_common_screen.s | 4 ++-- 6 files changed, 28 insertions(+), 27 deletions(-) rename src/kernal/extapi_m65/{mega65_ismode64.s => mega65_ismode65.s} (61%) diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 2665c9a6..848a1c30 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -32,7 +32,7 @@ cmd_go_syntax_error: // If in native mode - switch to C64 compatibilty jsr M65_ISMODE65 - bne cmd_go_rts + bcs cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts @@ -45,21 +45,12 @@ cmd_go_syntax_error: // If in C64 compatibility mode - switch to native mode jsr M65_ISMODE65 - beq cmd_go_rts + bcc cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts jsr M65_MODE65 - // XXX test code, replace by jmp do_clr - - jsr do_clr - - lda #$41 - jsr JCHROUT -testx: - jmp testx - - + jmp do_clr !: jmp do_ILLEGAL_QUANTITY_error diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index 87d91b64..d689b488 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -27,7 +27,7 @@ cmd_sys: // Make sure we are in C64 compatibility mode jsr M65_ISMODE65 - bne cmd_sys_nsys_common + bcs cmd_sys_nsys_common jsr M65_MODE64 // FALLTROUGH diff --git a/src/kernal/extapi_m65/mega65_ismode64.s b/src/kernal/extapi_m65/mega65_ismode65.s similarity index 61% rename from src/kernal/extapi_m65/mega65_ismode64.s rename to src/kernal/extapi_m65/mega65_ismode65.s index 88637375..428233d9 100644 --- a/src/kernal/extapi_m65/mega65_ismode64.s +++ b/src/kernal/extapi_m65/mega65_ismode65.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE -M65_ISMODE65: // checks if mode is native M65 one, BEQ = jump if native mode +M65_ISMODE65: // checks if mode is native M65 one, BCC = jump if native mode pha @@ -14,6 +14,16 @@ M65_ISMODE65: // checks if mode is native M65 one, BEQ = jump if native mode bne !+ lda M65_MAGICSTR+2 cmp #$35 // '5' + bne !+ + + // M65 native mode + + clc + pla + rts !: + // C64 compatibility mode + + sec pla rts diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index e7e38bb0..596a3ce9 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -13,7 +13,7 @@ chrout_screen: #if ROM_LAYOUT_M65 jsr M65_ISMODE65 - beq_16 m65_chrout_screen + bcc_16 m65_chrout_screen #endif diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index fa09e070..5bae0d37 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -37,35 +37,35 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote phz ldz M65__TXTCOL - // Start from setting M65_SCRSEG to point colour memory (starts from $FF80000) + // Start from setting M65_LPNT_SCR to point colour memory (starts from $FF80000) lda #$0F - sta M65_SCRSEG+3 + sta M65_LPNT_SCR+3 lda #$F8 - sta M65_SCRSEG+2 + sta M65_LPNT_SCR+2 lda M65_COLVIEW+1 - sta M65_SCRSEG+1 + sta M65_LPNT_SCR+1 lda M65_COLVIEW+0 - sta M65_SCRSEG+0 + sta M65_LPNT_SCR+0 // Add screen row to the address ldy M65__TXTROW clc lda m65_scrtab_rowoffset_lo,y - adc M65_SCRSEG+0 - sta M65_SCRSEG+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 lda m65_scrtab_rowoffset_hi,y - adc M65_SCRSEG+1 - sta M65_SCRSEG+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 // Store the new color in screen memory lda COLOR sta_lp (M65_LPNT_SCR),z - // Now change M65_LPNT_SCRb to point to screen memory + // Now change M65_LPNT_SCR to point to screen memory // XXX deduplicate this part lda M65_SCRSEG+1 diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index 083e917c..bd44c5b3 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -26,7 +26,7 @@ tape_screen_on_motor_off: #else jsr M65_ISMODE65 - bne_16 screen_on // MEGA65 native mode does not have badlines, no need to enable/disable screen + bcs_16 screen_on // MEGA65 native mode does not have badlines, no need to enable/disable screen rts #endif @@ -52,7 +52,7 @@ tape_screen_off_motor_on: #else jsr M65_ISMODE65 - beq !+ // MEGA65 native mode does not have badlines, no need to enable/disable screen + bcs !+ // MEGA65 native mode does not have badlines, no need to enable/disable screen jsr screen_off !: From e32b3651d2c06bcce25a1f13ec092a05e29842e0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 20 Aug 2020 21:51:38 +0200 Subject: [PATCH 14/96] some work towards extra keys support in MEGA65 mode --- src/aliases/,aliases_hardware_m65.s | 2 + src/aliases/,aliases_petscii_codes.s | 34 +++++++++++------ src/kernal/extapi_m65/mega65_mode65.s | 4 +- src/kernal/keyboard/kb_matrix.s | 2 +- src/kernal/keyboard/kb_matrix_128.s | 2 +- src/kernal/keyboard/kb_matrix_65.s | 4 +- src/kernal/keyboard/scnkey.s | 4 +- .../screen/chrout_screen_jumptable_codes.s | 8 ++-- src/kernal/screen_m65/mega65_screen_tables.s | 38 ++++++++++++++++++- src/kernal/screen_m65/mega65_scrmodeset.s | 4 +- 10 files changed, 77 insertions(+), 25 deletions(-) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 14e33cc4..6202f37d 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -16,6 +16,8 @@ .label VIC_XPOS = $D050 + .label VIC_CTRLC = $D054 + .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory diff --git a/src/aliases/,aliases_petscii_codes.s b/src/aliases/,aliases_petscii_codes.s index 0156cfff..6cb39b13 100644 --- a/src/aliases/,aliases_petscii_codes.s +++ b/src/aliases/,aliases_petscii_codes.s @@ -25,27 +25,35 @@ .const KEY_FLAG_NO_SCRL = %00100000 // Open ROMs unofficial #endif -// Note - the following PETSCII codes are currently unassigned, can be used for further extensions: -// -// $01, $02, $04, $06, $0A, $0B, $0C, $0F, $18, $82 +// Note - the following PETSCII codes are currently unassigned, can be used for further extensions: $01, $04, $06, ($80 ?) .const KEY_NA = $00 // to indicate that no key is presed + // PETSCII codes for our extended screen editor -.const KEY_TAB_FW = $8F // CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII -.const KEY_TAB_BW = $80 // CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII +.const KEY_C64_TAB_FW = $8F // CTRL+>, TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? +.const KEY_C64_TAB_BW = $80 // CTRL+<, SHIFT+TAB - Open ROMs unofficial, original TAB conflicts with C64 PETSCII, XXX remove? // PETSCII codes for certain C128 and C65 functionalities #if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 -.const KEY_BELL = $07 // no key, originally CTRL+G // XXX implement BELL +.const KEY_BELL = $07 // no key, originally CTRL+G // XXX implement, add to C65 keyboard matrix .const KEY_ESC = $1B #endif +#if CONFIG_KEYBOARD_C65 +.const KEY_TAB = $09 // XXX add to C65 keyboard matrix +.const KEY_LINE_FEED = $0A // XXX add to C65 keyboard matrix +.const KEY_TAB_SET_CLR = $18 // XXX add to C65 keyboard matrix +.const KEY_UNDERLINE_ON = $02 // XXX add to C65 keyboard matrix +.const KEY_UNDERLINE_OFF = $82 // XXX add to C65 keyboard matrix +.const KEY_FLASHING_ON = $0F // XXX add to C65 keyboard matrix +.const KEY_FLASHING_OFF = $8F // XXX add to C65 keyboard matrix +#endif // PETSCII codes for programmable keys @@ -71,7 +79,7 @@ #endif #if CONFIG_KEYBOARD_C128 || CONFIG_KEYBOARD_C65 -.const KEY_HELP = $84 // normally C65 only, also used for our C128 support +.const KEY_HELP = $84 #endif @@ -109,10 +117,14 @@ // PETSCII codes for case toggle -.const KEY_SHIFT_ON = $09 // no key -.const KEY_SHIFT_OFF = $08 // no key -.const KEY_TXT = $0E // no key -.const KEY_GFX = $8E // no key +.const KEY_C64_SHIFT_ON = $09 // no key +.const KEY_C64_SHIFT_OFF = $08 // no key +#if CONFIG_KEYBOARD_C65 +.const KEY_C65_SHIFT_OFF = $0B // no key +.const KEY_C65_SHIFT_ON = $0C // no key +#endif +.const KEY_TXT = $0E // no key +.const KEY_GFX = $8E // no key // PETSCII codes for other non-printable characters diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s index 57eb1700..dc6c8207 100644 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -37,7 +37,9 @@ M65_MODE65: lda %01000000 // enable C65 character set sta VIC_CTRLA - // XXX + // XXX enable 48 MHz mode in VIC_CTRLC + + // XXX posibly alter other settings // Set screen mode to 80x25 diff --git a/src/kernal/keyboard/kb_matrix.s b/src/kernal/keyboard/kb_matrix.s index e194bd95..97a836e2 100644 --- a/src/kernal/keyboard/kb_matrix.s +++ b/src/kernal/keyboard/kb_matrix.s @@ -56,7 +56,7 @@ __kb_matrix_ctrl: .byte $1F,$19,$07,$9E,$02,$08,$15,$16 .byte $12,$09,$0A,$92,$0D,$0B,$0F,$0E #if CONFIG_EDIT_TABULATORS - .byte $00,$10,$0C,$00,KEY_TAB_FW,$1B,$00,KEY_TAB_BW + .byte $00,$10,$0C,$00,KEY_C64_TAB_FW,$1B,$00,KEY_C64_TAB_BW #else .byte $00,$10,$0C,$00,$00,$1B,$00,$00 #endif diff --git a/src/kernal/keyboard/kb_matrix_128.s b/src/kernal/keyboard/kb_matrix_128.s index d6323ba6..e93d0ec9 100644 --- a/src/kernal/keyboard/kb_matrix_128.s +++ b/src/kernal/keyboard/kb_matrix_128.s @@ -16,7 +16,7 @@ kb_matrix_128: - .byte KEY_HELP,$38,$35,KEY_TAB_FW,$32,$34,$37,$31 + .byte KEY_HELP,$38,$35,KEY_C64_TAB_FW,$32,$34,$37,$31 .byte KEY_ESC,$2B,$2D,$8D,$0D,$36,$39,$33 .byte $00,$30,$2E,$91,$11,$9D,$1D,$00 diff --git a/src/kernal/keyboard/kb_matrix_65.s b/src/kernal/keyboard/kb_matrix_65.s index a7cd89f5..c20831b3 100644 --- a/src/kernal/keyboard/kb_matrix_65.s +++ b/src/kernal/keyboard/kb_matrix_65.s @@ -15,11 +15,11 @@ kb_matrix_65: - .byte $00, KEY_TAB_FW, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC + .byte $00, KEY_C64_TAB_FW, $00, KEY_HELP, KEY_F9, KEY_F11, KEY_F13, KEY_ESC kb_matrix_65_shifted: - .byte $00, KEY_TAB_BW, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC + .byte $00, KEY_C64_TAB_BW, $00, KEY_HELP, KEY_F10, KEY_F12, KEY_F14, KEY_ESC #endif // CONFIG_KEYBOARD_C65 and no CONFIG_LEGACY_SCNKEY diff --git a/src/kernal/keyboard/scnkey.s b/src/kernal/keyboard/scnkey.s index d6080c78..ac43679c 100644 --- a/src/kernal/keyboard/scnkey.s +++ b/src/kernal/keyboard/scnkey.s @@ -428,12 +428,12 @@ scnkey_got_petscii: // Special handling for SHIFT+TAB; it is easier than creating new matrix tax - cmp #KEY_TAB_FW + cmp #KEY_C64_TAB_FW bne !+ lda SHFLAG and #KEY_FLAG_SHIFT beq !+ - ldx #KEY_TAB_BW + ldx #KEY_C64_TAB_BW !: txa diff --git a/src/kernal/screen/chrout_screen_jumptable_codes.s b/src/kernal/screen/chrout_screen_jumptable_codes.s index 07d30cd4..4299d42a 100644 --- a/src/kernal/screen/chrout_screen_jumptable_codes.s +++ b/src/kernal/screen/chrout_screen_jumptable_codes.s @@ -13,8 +13,8 @@ chrout_screen_jumptable_codes: .byte KEY_CLR .byte KEY_HOME - .byte KEY_SHIFT_OFF - .byte KEY_SHIFT_ON + .byte KEY_C64_SHIFT_OFF + .byte KEY_C64_SHIFT_ON .byte KEY_TXT .byte KEY_GFX .byte KEY_RVS_OFF @@ -31,8 +31,8 @@ __chrout_screen_jumptable_quote_guard: .byte KEY_STOP #endif #if CONFIG_EDIT_TABULATORS - .byte KEY_TAB_BW - .byte KEY_TAB_FW + .byte KEY_C64_TAB_BW + .byte KEY_C64_TAB_FW #endif .byte KEY_DEL .byte KEY_RETURN diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 7055d533..9978b9e1 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -46,4 +46,40 @@ m65_scrtab_rowoffset_hi: // row offsets - high bytes .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) - .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) \ No newline at end of file + .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) + +// Jumptable for screen control codes support. To improve performance, should be sorted +// starting from the least probable routine. + +m65_chrout_screen_jumptable_codes: + + .byte KEY_CLR + .byte KEY_HOME + .byte KEY_C65_SHIFT_OFF + .byte KEY_C65_SHIFT_ON + .byte KEY_TXT + .byte KEY_GFX + .byte KEY_RVS_OFF + .byte KEY_RVS_ON + .byte KEY_CRSR_RIGHT + .byte KEY_CRSR_LEFT + .byte KEY_CRSR_DOWN + .byte KEY_CRSR_UP + .byte KEY_INS + .byte KEY_TAB + .byte KEY_LINE_FEED + .byte KEY_UNDERLINE_ON + .byte KEY_UNDERLINE_OFF + .byte KEY_FLASHING_ON + .byte KEY_FLASHING_OFF + .byte KEY_TAB_SET_CLR + .byte KEY_ESC + .byte KEY_BELL + +__m65_chrout_screen_jumptable_quote_guard: + + .byte KEY_STOP + .byte KEY_DEL + .byte KEY_RETURN + +__m65_chrout_screen_jumptable_codes_end: diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 27879d87..3d8278cd 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -52,9 +52,9 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 // Set the logical row length to 80 ldx #$50 - stx VIC_CHARSTEP+0 + // stx VIC_CHARSTEP+0 ldx #$00 - stx VIC_CHARSTEP+1 + // stx VIC_CHARSTEP+1 // Set the following locations: // - M64_SCRWINMODE - for scroll-console mode From 175c40c512bb4cd8f2640d0737a35a10539f177a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 21 Aug 2020 16:44:21 +0200 Subject: [PATCH 15/96] fixed first text column on VIC-IV --- src/kernal/init/e5a0.setup_vicii.s | 2 +- src/kernal/screen_m65/mega65_screen_tables.s | 6 ++++++ src/kernal/screen_m65/mega65_scrmodeset.s | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/kernal/init/e5a0.setup_vicii.s b/src/kernal/init/e5a0.setup_vicii.s index 538576e9..1358f461 100644 --- a/src/kernal/init/e5a0.setup_vicii.s +++ b/src/kernal/init/e5a0.setup_vicii.s @@ -51,7 +51,7 @@ setup_vicii: lda #$1B // according to [CM64] page 137 some software assumes oldest bit is 0 sta VIC_SCROLY lda #$C8 - sta VIC_SCROLX // 40 column etc + sta VIC_SCROLX // 40 column, etc. lda #$14 sta VIC_YMCSB lda #$0F diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 9978b9e1..aa3bc9a3 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -32,6 +32,12 @@ m65_scrtab_viewmax_hi: // maximum allowed viewport start - high byte .byte $96 .byte $8E +m65_scrtab_scrolx: // values for VIC_SCROLX + + .byte $C8 + .byte $CA + .byte $CA + m65_scrtab_rowoffset_lo: // row offsets - low bytes .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 3d8278cd..981e5b8e 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -46,6 +46,8 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 tax + lda m65_scrtab_scrolx,x + sta VIC_SCROLX lda m65_scrtab_vic_ctrlb,x sta VIC_CTRLB From 6542f64a594f2e7ed9e61960413250d304e3069a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 16:49:05 +0200 Subject: [PATCH 16/96] initial support for MEGA65 screen control codes --- STATUS.md | 15 ++- src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/screen_m65/mega65_chrout_screen.s | 4 + .../screen_m65/mega65_chrout_screen_control.s | 124 +++++++++++++++++- src/kernal/screen_m65/mega65_screen_tables.s | 35 +++++ 5 files changed, 175 insertions(+), 4 deletions(-) diff --git a/STATUS.md b/STATUS.md index ed8966a0..ff3fb37e 100644 --- a/STATUS.md +++ b/STATUS.md @@ -58,7 +58,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | C64 | DONE | | | C128 | DONE | | -| Mega65 | NOT DONE | code should be complete, but is not tested yet | +| Mega65 | PARTIAL | code mostly complete, but not tested yet |
@@ -70,7 +70,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | VIC-II | DONE | | | 80 columns, VDC | NOT DONE | | -| 80 columns, Mega65 | NOT DONE | | +| 80 columns, Mega65 | PARTIAL | work-in-progreess, not useable yet |
@@ -121,6 +121,17 @@ The following ROM features are currently missing:
+## MEGA65 storage + +
+ +| Driver | Status | Remarks | +| :----------------: | :------: | :-------------------------------------------------------------------------: | +| internal floppy | NOT DONE | try to reuse https://github.com/commanderx16/x16-rom/tree/master/dos | +| SD card access | NOT DONE | tryy to reuse https://github.com/commanderx16/x16-rom/tree/master/dos/fat32 | + +
+ ## RS-232 * modems (telephone, WiFi) diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 7bda6d9f..6eca7f6b 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -23,6 +23,7 @@ .label clrchn_reset = KERNAL_0.clrchn_reset .label udtim_keyboard = KERNAL_0.udtim_keyboard .label chrout_to_screen_code = KERNAL_0.chrout_to_screen_code +.label colour_codes = KERNAL_0.colour_codes .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 5bae0d37..4e9abced 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -93,4 +93,8 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote // XXX continue the implementation - fix the cursor position +m65_chrout_screen_done: + + // XXX reenable cursor + rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 53602392..76fb00c8 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -4,6 +4,126 @@ m65_chrout_screen_control: - // XXX provide implementation + txa - rts +m65_chrout_try_jumptable: + + ldx #(__m65_chrout_screen_jumptable_codes_end - m65_chrout_screen_jumptable_codes - 1) + +m65_chrout_try_jumptable_loop: + + cpx #(__m65_chrout_screen_jumptable_quote_guard - m65_chrout_screen_jumptable_codes - 1) + bne m65_chrout_try_jumptable_loop_noquote + + // Is this insert/quote mode? + + tay + lda QTSW + ora INSRT + beq !+ + tya + jmp m65_chrout_screen_quote +!: + tya + + // FALLTROUGH + +m65_chrout_try_jumptable_loop_noquote: + + cmp m65_chrout_screen_jumptable_codes, x + bne !+ + + // Found, perform a jump to subroutine + + txa + asl + tax + jmp (m65_chrout_screen_jumptable, x) + +!: + dex + bpl m65_chrout_try_jumptable_loop + +m65_chrout_try_COLOR: + + ldx #$0F + +m65_chrout_try_color_loop: + + cmp colour_codes,x + bne !+ + + lda COLOR + and #$F0 + sta COLOR + + txa + ora COLOR + sta COLOR + + jmp m65_chrout_screen_done +!: + dex + bpl m65_chrout_try_color_loop + + // Unknown code, or key not requiring any handling + + jmp m65_chrout_screen_done + + + + +// XXX: implement screen routines below: + +m65_chrout_screen_quote: + nop +m65_chrout_screen_CLR: + nop +m65_chrout_screen_HOME: + nop +m65_chrout_screen_SHIFT_OFF: + nop +m65_chrout_screen_SHIFT_ON: + nop +m65_chrout_screen_TXT: + nop +m65_chrout_screen_GFX: + nop +m65_chrout_screen_RVS_OFF: + nop +m65_chrout_screen_RVS_ON: + nop +m65_chrout_screen_CRSR_RIGHT: + nop +m65_chrout_screen_CRSR_LEFT: + nop +m65_chrout_screen_CRSR_DOWN: + nop +m65_chrout_screen_CRSR_UP: + nop +m65_chrout_screen_INS: + nop +m65_chrout_screen_TAB: + nop +m65_chrout_screen_LINE_FEED: + nop +m65_chrout_screen_UNDERLINE_ON: + nop +m65_chrout_screen_UNDERLINE_OFF: + nop +m65_chrout_screen_FLASHING_ON: + nop +m65_chrout_screen_FLASHING_OFF: + nop +m65_chrout_screen_TAB_SET_CLR: + nop +m65_chrout_screen_ESC: + nop +m65_chrout_screen_BELL: + nop +m65_chrout_screen_STOP: + nop +m65_chrout_screen_DEL: + nop +m65_chrout_screen_RETURN: + jmp m65_chrout_screen_done diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index aa3bc9a3..55a10b18 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -89,3 +89,38 @@ __m65_chrout_screen_jumptable_quote_guard: .byte KEY_RETURN __m65_chrout_screen_jumptable_codes_end: + + +.const m65_chrout_list = List().add( + + m65_chrout_screen_CLR, + m65_chrout_screen_HOME, + m65_chrout_screen_SHIFT_OFF, + m65_chrout_screen_SHIFT_ON, + m65_chrout_screen_TXT, + m65_chrout_screen_GFX, + m65_chrout_screen_RVS_OFF, + m65_chrout_screen_RVS_ON, + m65_chrout_screen_CRSR_RIGHT, + m65_chrout_screen_CRSR_LEFT, + m65_chrout_screen_CRSR_DOWN, + m65_chrout_screen_CRSR_UP, + m65_chrout_screen_INS, + m65_chrout_screen_TAB, + m65_chrout_screen_LINE_FEED, + m65_chrout_screen_UNDERLINE_ON, + m65_chrout_screen_UNDERLINE_OFF, + m65_chrout_screen_FLASHING_ON, + m65_chrout_screen_FLASHING_OFF, + m65_chrout_screen_TAB_SET_CLR, + m65_chrout_screen_ESC, + m65_chrout_screen_BELL, + m65_chrout_screen_STOP, + m65_chrout_screen_DEL, + m65_chrout_screen_RETURN +) + +m65_chrout_screen_jumptable: + + // Note: 65C02 has the page boundary vector bug fixed! + put_jumptable(m65_chrout_list) From fe00a07aebbdde68b3e126e06debd56f6f0c60b4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 17:32:17 +0200 Subject: [PATCH 17/96] initial support for internal MEGA65 DOS --- Makefile | 42 ++++++++++++++++++++++------------- src/dos_m65/dos_vectable.s | 40 +++++++++++++++++++++++++++++++++ src/kernal/iec_fast/dos_m65.s | 19 ++++++++++++++++ 3 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 src/dos_m65/dos_vectable.s create mode 100644 src/kernal/iec_fast/dos_m65.s diff --git a/Makefile b/Makefile index 7d2ddd0e..fde56031 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,9 @@ SRCDIR_BASIC = $(SRCDIR_COMMON) \ src/basic/rom_revision \ src/basic/wedge +SRCDIR_DOS_M65 = $(SRCDIR_COMMON) \ + src/dos_m65 \ + SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal \ src/kernal/,stubs \ @@ -56,14 +59,15 @@ SRCDIR_KERNAL = $(SRCDIR_COMMON) \ src/kernal/tape \ src/kernal/time -SRC_BASIC = $(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s)) -SRC_KERNAL = $(foreach dir,$(SRCDIR_KERNAL),$(wildcard $(dir)/*.s)) -SRC_TOOLS = $(wildcard tools/*.c,tools/*.cc) +SRC_BASIC = $(foreach dir,$(SRCDIR_BASIC),$(wildcard $(dir)/*.s)) +SRC_DOS_M65 = $(foreach dir,$(SRCDIR_DOS_M65),$(wildcard $(dir)/*.s)) +SRC_KERNAL = $(foreach dir,$(SRCDIR_KERNAL),$(wildcard $(dir)/*.s)) +SRC_TOOLS = $(wildcard tools/*.c,tools/*.cc) # Generated files -GEN_BASIC = build/,generated/float_constants.s -GEN_KERNAL = +GEN_BASIC = build/,generated/float_constants.s +GEN_KERNAL = # List of build directories @@ -94,8 +98,9 @@ GEN_STR_X16 = $(DIR_X16)/,generated/packed_strings.s # Dependencies - helper variables -DEP_BASIC = $(SRC_BASIC) $(SRCDIR_BASIC) $(GEN_BASIC) -DEP_KERNAL = $(SRC_KERNAL) $(SRCDIR_KERNAL) $(GEN_KERNAL) +DEP_BASIC = $(SRC_BASIC) $(SRCDIR_BASIC) $(GEN_BASIC) +DEP_DOS_M65 = $(SRC_DOS_M65) $(SRCDIR_DOS_M65) +DEP_KERNAL = $(SRC_KERNAL) $(SRCDIR_KERNAL) $(GEN_KERNAL) # List of tools @@ -143,6 +148,7 @@ TARGET_LIST = build/chargen_openroms.rom \ SEG_LIST_M65 = $(DIR_M65)/basic.seg_0 \ $(DIR_M65)/basic.seg_1 \ + $(DIR_M65)/dos.seg_1 \ $(DIR_M65)/kernal.seg_0 \ $(DIR_M65)/kernal.seg_1 @@ -207,7 +213,7 @@ build/chargen_openroms.patched: $(TOOL_PATCH_CHARGEN) build/chargen_openroms.rom build/chargen_pxlfont.patched: $(TOOL_PATCH_CHARGEN) build/chargen_pxlfont.rom $(TOOL_PATCH_CHARGEN) -i build/chargen_pxlfont.rom -o $@ -n 6px-PXLfont -# Dependencies - BASIC and KERNAL +# Dependencies - BASIC, DOS, and KERNAL $(DIR_CUS)/OUTB_x.BIN $(DIR_CUS)/BASIC_combined.vs: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_CUS) $(GEN_STR_CUS) $(DIR_CUS)/KERNAL_combined.sym @@ -239,6 +245,8 @@ $(DIR_X16)/OUTK_0.BIN $(DIR_X16)/KERNAL_0_combined.vs $(DIR_X16)/KERNAL_0_combin $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_BASIC) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym $(DIR_M65)/BASIC_0_combined.sym +$(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: \ + $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_DOS) $(CFG_M65) $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1_combined.vs $(DIR_M65)/KERNAL_1_combined.sym: \ $(TOOL_ASSEMBLER) $(TOOL_BUILD_SEGMENT) $(DEP_KERNAL) $(CFG_M65) $(GEN_STR_M65) $(DIR_M65)/KERNAL_0_combined.sym @@ -318,7 +326,7 @@ build/target_%/OUTK_x.BIN build/target_%/KERNAL_combined.vs build/target_%/KERNA @rm -f $@* build/target_$*/KERNAL* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r STD -s KERNAL -i KERNAL-$* -o OUTK_x.BIN -d build/target_$* -l e4d3 -h ffff src/,,config_$*.s $(SRCDIR_KERNAL) $(GEN_KERNAL) $(GEN_STR_$*) -# Rules - BASIC and KERNAL intermediate files, for Mega65 +# Rules - BASIC and KERNAL intermediate files, for MEGA65 $(DIR_M65)/OUTB_0.BIN $(DIR_M65)/BASIC_0_combined.vs $(DIR_M65)/BASIC_0_combined.sym: @mkdir -p $(DIR_M65) @@ -335,6 +343,11 @@ $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1_combined.vs $(DIR_M65)/BASIC_1_combine @rm -f $@* $(DIR_M65)/basic.seg_1 $(DIR_M65)/BASIC_1* @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r M65 -s BASIC_1 -i BASIC_1-mega65 -o basic.seg_1 -d $(DIR_M65) -l 4000 -h 7fff $(CFG_M65) $(GEN_STR_M65) $(SRCDIR_BASIC) $(GEN_BASIC) +$(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1_combined.vs $(DIR_M65)/DOS_1_combined.sym: + @mkdir -p $(DIR_M65) + @rm -f $@* $(DIR_M65)/dos.seg_1 $(DIR_M65)/DOS_1* + @$(TOOL_BUILD_SEGMENT) -a ../../$(TOOL_ASSEMBLER) -r M65 -s DOS_1 -i DOS_1-mega65 -o dos.seg_1 -d $(DIR_M65) -l 4000 -h 7fff $(CFG_M65) $(SRCDIR_DOS_M65) + $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1_combined.vs $(DIR_M65)/KERNAL_1_combined.sym: @mkdir -p $(DIR_M65) @rm -f $@* $(DIR_M65)/kernal.seg_1 $(DIR_M65)/KERNAL_1* @@ -410,18 +423,15 @@ build/kernal_hybrid.rom: kernal $(DIR_GEN)/OUTK_x.BIN build/symbols_hybrid.vs: $(DIR_GEN)/KERNAL_combined.vs sort $(DIR_GEN)/KERNAL_combined.vs | uniq | grep -v "__" > $@ -# Rules - platform 'Mega65' specific +# Rules - MEGA65 platform specific -build/padding_16_KB: - @mkdir -p build - dd if=/dev/zero bs=8192 count=2 of=build/padding_16_KB build/padding_64_KB: @mkdir -p build dd if=/dev/zero bs=8192 count=8 of=build/padding_64_KB -$(TARGET_M65_x) $(TARGET_M65_x_PXL): build/padding_16_KB build/padding_64_KB $(SEG_LIST_M65) build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched +$(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched @echo - cat build/padding_16_KB > $(TARGET_M65_x) + cat $(DIR_M65)/dos.seg_1 >> $(TARGET_M65_x) cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x) cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x) cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x) @@ -430,7 +440,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): build/padding_16_KB build/padding_64_KB $(S cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x) cat build/padding_64_KB >> $(TARGET_M65_x) @echo - cat build/padding_16_KB > $(TARGET_M65_x_PXL) + cat $(DIR_M65)/dos.seg_1 >> $(TARGET_M65_x_PXL) cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) diff --git a/src/dos_m65/dos_vectable.s b/src/dos_m65/dos_vectable.s new file mode 100644 index 00000000..00d700f1 --- /dev/null +++ b/src/dos_m65/dos_vectable.s @@ -0,0 +1,40 @@ + +// A vector table to integrate DOS with the MEGA65 Kernal + +.word dos_INIT +.word dos_HASUNIT +.word dos_ACPTR +.word dos_CIOUT +.word dos_LISTEN +.word dos_SECOND +.word dos_TALK +.word dos_TKSA +.word dos_UNTLK +.word dos_UNLSN + + +// Dummy implementations - XXX to be replaced with real ones + +dos_INIT: + nop +dos_HASUNIT: + nop +dos_ACPTR: + nop +dos_CIOUT: + nop +dos_LISTEN: + nop +dos_SECOND: + nop +dos_TALK: + nop +dos_TKSA: + nop +dos_UNTLK: + nop +dos_UNLSN: + nop + + sec + rts diff --git a/src/kernal/iec_fast/dos_m65.s b/src/kernal/iec_fast/dos_m65.s new file mode 100644 index 00000000..3d08c6b5 --- /dev/null +++ b/src/kernal/iec_fast/dos_m65.s @@ -0,0 +1,19 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// MEGA65 pseudo-IEC internal DOS support +// + +.label VDOS_INIT = $4000 +.label VDOS_HASUNIT = $4002 +.label VDOS_ACPTR = $4004 +.label VDOS_CIOUT = $4006 +.label VDOS_LISTEN = $4008 +.label VDOS_SECOND = $400A +.label VDOS_TALK = $400C +.label VDOS_TKSA = $400E +.label VDOS_UNTLK = $4010 +.label VDOS_UNLSN = $4012 + +// XXX implement support From de7ce30e0340aa8bd3213ab137022d941e5741e4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 19:37:46 +0200 Subject: [PATCH 18/96] more work towards internal MEGA65 DOS --- Makefile | 4 +- .../{dos_vectable.s => 4000.dos_vectable.s} | 0 src/kernal/board_m65/mega65_map_helpers.s | 50 ++++++++++- src/kernal/iec_fast/dos_m65.s | 19 ----- src/kernal/iec_fast/m65dos_bridge.s | 84 +++++++++++++++++++ 5 files changed, 133 insertions(+), 24 deletions(-) rename src/dos_m65/{dos_vectable.s => 4000.dos_vectable.s} (100%) delete mode 100644 src/kernal/iec_fast/dos_m65.s create mode 100644 src/kernal/iec_fast/m65dos_bridge.s diff --git a/Makefile b/Makefile index fde56031..62da0476 100644 --- a/Makefile +++ b/Makefile @@ -431,7 +431,7 @@ build/padding_64_KB: $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/chargen_openroms.rom build/chargen_openroms.patched build/chargen_pxlfont.rom build/chargen_pxlfont.patched @echo - cat $(DIR_M65)/dos.seg_1 >> $(TARGET_M65_x) + cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x) cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x) cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x) cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x) @@ -440,7 +440,7 @@ $(TARGET_M65_x) $(TARGET_M65_x_PXL): $(SEG_LIST_M65) build/padding_64_KB build/c cat $(DIR_M65)/kernal.seg_0 >> $(TARGET_M65_x) cat build/padding_64_KB >> $(TARGET_M65_x) @echo - cat $(DIR_M65)/dos.seg_1 >> $(TARGET_M65_x_PXL) + cat $(DIR_M65)/dos.seg_1 > $(TARGET_M65_x_PXL) cat $(DIR_M65)/kernal.seg_1 >> $(TARGET_M65_x_PXL) cat $(DIR_M65)/basic.seg_1 >> $(TARGET_M65_x_PXL) cat $(DIR_M65)/basic.seg_0 >> $(TARGET_M65_x_PXL) diff --git a/src/dos_m65/dos_vectable.s b/src/dos_m65/4000.dos_vectable.s similarity index 100% rename from src/dos_m65/dos_vectable.s rename to src/dos_m65/4000.dos_vectable.s diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index 0009100f..2353b70e 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -6,8 +6,10 @@ // // Available memory maps: -// - NORMAL - nothing mapped in -// - KERNAL_1 - for calling KERNAL_1 segment code +// - NORMAL - nothing mapped in +// - KERNAL_1 - for calling KERNAL_1 segment code +// - DOS_1 - for swiching to DOS context +// - NORMAL_from_DOS_1 - for switching bact from DOS context map_NORMAL: @@ -19,6 +21,11 @@ map_NORMAL: phz lda #$00 + + // FALLTROUGH + +map_NORMAL_common: + tax tay taz @@ -30,6 +37,10 @@ map_end: map eom + // FALLTROUGH + +map_end_no_eom: + plz ply plx @@ -53,4 +64,37 @@ map_KERNAL_1: ldx #$42 // 0x4000 <- map 8KB from 0x20000 - bne map_end + jmp_8 map_end + +map_DOS_1: + + php + pha + phx + phy + phz + + lda #$C0 + tab // from now on, zeropage starts from $C000 + + ldy #$00 + taz #$81 // 0xC000 <- map 8KB (4KB useable) from $10000 + + tya + ldx #$C2 // 0x4000 <- map 16KB from 0x20000 + + map + jmp_8 map_end_no_eom // no EOM, we do not want interrupts within DOS! + +map_NORMAL_from_DOS_1: + + php + pha + phx + phy + phz + + lda #$00 + tba + + jmp_8 map_NORMAL_common diff --git a/src/kernal/iec_fast/dos_m65.s b/src/kernal/iec_fast/dos_m65.s deleted file mode 100644 index 3d08c6b5..00000000 --- a/src/kernal/iec_fast/dos_m65.s +++ /dev/null @@ -1,19 +0,0 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE - -// -// MEGA65 pseudo-IEC internal DOS support -// - -.label VDOS_INIT = $4000 -.label VDOS_HASUNIT = $4002 -.label VDOS_ACPTR = $4004 -.label VDOS_CIOUT = $4006 -.label VDOS_LISTEN = $4008 -.label VDOS_SECOND = $400A -.label VDOS_TALK = $400C -.label VDOS_TKSA = $400E -.label VDOS_UNTLK = $4010 -.label VDOS_UNLSN = $4012 - -// XXX implement support diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s new file mode 100644 index 00000000..b429353a --- /dev/null +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -0,0 +1,84 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// MEGA65 pseudo-IEC internal DOS support +// + + +.label VDOS_INIT = $4000 +.label VDOS_HASUNIT = $4002 +.label VDOS_ACPTR = $4004 +.label VDOS_CIOUT = $4006 +.label VDOS_LISTEN = $4008 +.label VDOS_SECOND = $400A +.label VDOS_TALK = $400C +.label VDOS_TKSA = $400E +.label VDOS_UNTLK = $4010 +.label VDOS_UNLSN = $4012 + + +// XXX connect this to core IEC implementation + + +m65dos_init: + + jsr map_DOS_1 + jsr_ind VDOS_INIT + jmp_8 !+ + +m65dos_hasunit: + + jsr map_DOS_1 + jsr_ind VDOS_HASUNIT + jmp_8 !+ + +m65dos_acptr: + + jsr map_DOS_1 + jsr_ind VDOS_ACPTR +!: + jmp map_NORMAL_from_DOS_1 // try to make ACPTR slightly faster + +m65dos_ciout: + + jsr map_DOS_1 + jsr_ind VDOS_CIOUT +!: + jmp map_NORMAL_from_DOS_1 // try to make CIOUT slightly faster + +m65dos_listen: + + jsr map_DOS_1 + jsr_ind VDOS_LISTEN + jmp_8 !- + +m65dos_second: + + jsr map_DOS_1 + jsr_ind VDOS_SECOND + jmp_8 !- + +m65dos_talk: + + jsr map_DOS_1 + jsr_ind VDOS_TALK + jmp_8 !- + +m65dos_tksa: + + jsr map_DOS_1 + jsr_ind VDOS_TKSA + jmp_8 !- + +m65dos_untlk: + + jsr map_DOS_1 + jsr_ind VDOS_UNTLK + jmp_8 !- + +m65dos_unlsn: + + jsr map_DOS_1 + jsr_ind VDOS_UNLSN + jmp_8 !- From 7437dc4548a423981838e649390a580c7f4534e7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 21:07:12 +0200 Subject: [PATCH 19/96] more work towards MEGA65 DOS support --- src/basic/board_m65/mega65_map_helpers.s | 2 +- src/kernal/board_m65/mega65_map_helpers.s | 12 +++++++----- src/kernal/iec_fast/m65dos_bridge.s | 2 +- src/kernal/init/fda3.ioinit.s | 3 ++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/basic/board_m65/mega65_map_helpers.s b/src/basic/board_m65/mega65_map_helpers.s index 2ed00bff..0f0fa550 100644 --- a/src/basic/board_m65/mega65_map_helpers.s +++ b/src/basic/board_m65/mega65_map_helpers.s @@ -23,6 +23,6 @@ map_BASIC_1: taz lda #$20 - ldx #$C2 // 0x4000 <- map 16KB from 0x22000 + ldx #$C2 // $4000 <- map 16KB from $22000 jmp map_end diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index 2353b70e..cf2d69cc 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -62,7 +62,7 @@ map_KERNAL_1: tay taz - ldx #$42 // 0x4000 <- map 8KB from 0x20000 + ldx #$42 // $4000 <- map 8KB from $20000 jmp_8 map_end @@ -78,10 +78,12 @@ map_DOS_1: tab // from now on, zeropage starts from $C000 ldy #$00 - taz #$81 // 0xC000 <- map 8KB (4KB useable) from $10000 + lda #$41 + taz // $C000 <- map 8KB from $10000 - tya - ldx #$C2 // 0x4000 <- map 16KB from 0x20000 + // XXX what should be the value here?? + lda #$A0 + ldx #$C2 // $4000 <- map 16KB from ????? map jmp_8 map_end_no_eom // no EOM, we do not want interrupts within DOS! @@ -95,6 +97,6 @@ map_NORMAL_from_DOS_1: phz lda #$00 - tba + tab jmp_8 map_NORMAL_common diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s index b429353a..be0a2754 100644 --- a/src/kernal/iec_fast/m65dos_bridge.s +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -24,7 +24,7 @@ m65dos_init: jsr map_DOS_1 - jsr_ind VDOS_INIT + // XXX do after memory mapping is correct: jsr_ind VDOS_INIT jmp_8 !+ m65dos_hasunit: diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index f6398b4d..69cef2cf 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -20,7 +20,8 @@ IOINIT: jsr map_KERNAL_1 jsr_ind VK1__IOINIT - jmp map_NORMAL + // End by initializing the MEGA65 internal DOS + jmp m65dos_init #else From 274a3c070a0c4f937ce6cabbfba5995735ff54fd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 21:48:36 +0200 Subject: [PATCH 20/96] fixed DOS memory mapping --- src/dos_m65/4000.dos_vectable.s | 29 +---------------------- src/dos_m65/stubs.s | 26 ++++++++++++++++++++ src/kernal/board_m65/mega65_map_helpers.s | 9 ++++--- src/kernal/iec_fast/m65dos_bridge.s | 26 ++++++++++---------- 4 files changed, 44 insertions(+), 46 deletions(-) create mode 100644 src/dos_m65/stubs.s diff --git a/src/dos_m65/4000.dos_vectable.s b/src/dos_m65/4000.dos_vectable.s index 00d700f1..365f1761 100644 --- a/src/dos_m65/4000.dos_vectable.s +++ b/src/dos_m65/4000.dos_vectable.s @@ -2,7 +2,7 @@ // A vector table to integrate DOS with the MEGA65 Kernal .word dos_INIT -.word dos_HASUNIT +.word dos_CHKUNIT .word dos_ACPTR .word dos_CIOUT .word dos_LISTEN @@ -11,30 +11,3 @@ .word dos_TKSA .word dos_UNTLK .word dos_UNLSN - - -// Dummy implementations - XXX to be replaced with real ones - -dos_INIT: - nop -dos_HASUNIT: - nop -dos_ACPTR: - nop -dos_CIOUT: - nop -dos_LISTEN: - nop -dos_SECOND: - nop -dos_TALK: - nop -dos_TKSA: - nop -dos_UNTLK: - nop -dos_UNLSN: - nop - - sec - rts diff --git a/src/dos_m65/stubs.s b/src/dos_m65/stubs.s new file mode 100644 index 00000000..56a37771 --- /dev/null +++ b/src/dos_m65/stubs.s @@ -0,0 +1,26 @@ + +// Dummy implementations - XXX to be replaced with real ones + +dos_INIT: + nop +dos_CHKUNIT: + nop +dos_ACPTR: + nop +dos_CIOUT: + nop +dos_LISTEN: + nop +dos_SECOND: + nop +dos_TALK: + nop +dos_TKSA: + nop +dos_UNTLK: + nop +dos_UNLSN: + nop + + sec + rts diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index cf2d69cc..1453ef6c 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -77,13 +77,12 @@ map_DOS_1: lda #$C0 tab // from now on, zeropage starts from $C000 - ldy #$00 - lda #$41 + ldy #$40 + lda #$40 taz // $C000 <- map 8KB from $10000 - // XXX what should be the value here?? - lda #$A0 - ldx #$C2 // $4000 <- map 16KB from ????? + lda #$C0 + ldx #$C1 // $4000 <- map 16KB from $20000 map jmp_8 map_end_no_eom // no EOM, we do not want interrupts within DOS! diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s index be0a2754..11208afe 100644 --- a/src/kernal/iec_fast/m65dos_bridge.s +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -6,16 +6,16 @@ // -.label VDOS_INIT = $4000 -.label VDOS_HASUNIT = $4002 -.label VDOS_ACPTR = $4004 -.label VDOS_CIOUT = $4006 -.label VDOS_LISTEN = $4008 -.label VDOS_SECOND = $400A -.label VDOS_TALK = $400C -.label VDOS_TKSA = $400E -.label VDOS_UNTLK = $4010 -.label VDOS_UNLSN = $4012 +.label VDOS_INIT = $4000 + 0 * 2 +.label VDOS_CHKUNIT = $4000 + 1 * 2 +.label VDOS_ACPTR = $4000 + 2 * 2 +.label VDOS_CIOUT = $4000 + 3 * 2 +.label VDOS_LISTEN = $4000 + 4 * 2 +.label VDOS_SECOND = $4000 + 5 * 2 +.label VDOS_TALK = $4000 + 6 * 2 +.label VDOS_TKSA = $4000 + 7 * 2 +.label VDOS_UNTLK = $4000 + 8 * 2 +.label VDOS_UNLSN = $4000 + 9 * 2 // XXX connect this to core IEC implementation @@ -24,13 +24,13 @@ m65dos_init: jsr map_DOS_1 - // XXX do after memory mapping is correct: jsr_ind VDOS_INIT + jsr_ind VDOS_INIT jmp_8 !+ -m65dos_hasunit: +m65dos_chkunit: jsr map_DOS_1 - jsr_ind VDOS_HASUNIT + jsr_ind VDOS_CHKUNIT jmp_8 !+ m65dos_acptr: From 379eb746fe7ddf452ed7ad90b0bf38babc49d9e4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 22 Aug 2020 22:20:51 +0200 Subject: [PATCH 21/96] cleanup in multiprotocol IEC support --- src/aliases/,aliases_ram_lowmem.s | 25 ++++++++++++++++++++----- src/kernal/iec/iec_rx_byte.s | 4 ++-- src/kernal/iec/iec_tx_byte.s | 4 ++-- src/kernal/iec/load_iec.s | 4 ++-- src/kernal/iec_fast/dolphindos_detect.s | 2 +- src/kernal/iec_fast/dolphindos_load.s | 2 +- src/kernal/iec_fast/jiffydos_detect.s | 4 ++-- src/kernal/iec_fast/jiffydos_load.s | 2 +- src/kernal/iec_fast/jiffydos_rx_byte.s | 2 +- src/kernal/iec_fast/jiffydos_tx_byte.s | 2 +- 10 files changed, 33 insertions(+), 18 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index ef37b7ac..7d6d20dd 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -103,11 +103,7 @@ .label PTR1 = $9E // for tape support, counter of errorneous bytes .label PTR2 = $9F // for tape support, counter for errorneous bytes correction .label TIME = $A0 // $A0-$A2 jiffy clock -#if !CONFIG_IEC_JIFFYDOS && !CONFIG_IEC_DOLPHINDOS && !CONFIG_IEC_BURST_CIA1 && !CONFIG_IEC_BURST_CIA2 && !CONFIG_IEC_BURST_MEGA_65 - .label TSFCNT = $A3 // temporary variable for tape and IEC, [!] our usage differs -#else - .label IECPROTO = $A3 // -- WIP -- [!] 0 = normal, 1 = JiffyDOS, >= $80 for unknown -#endif + .label IECPROTO = $A3 // [!] IEC or pseudo-IEC protocol, >= $80 for unknown; originally named TSFCNT .label TBTCNT = $A4 // temporary variable for tape and IEC, [!] our usage probably differs in details .label CNTDN = $A5 // -- NOT IMPLEMENTED -- .label BUFPNT = $A6 // -- NOT IMPLEMENTED -- @@ -290,6 +286,25 @@ // $3FC $3FC-$3FF -- UNUSED -- free for user software +// +// Definitions for extended IEC functionality +// + + .const IEC_NORMAL = 0 // has to be 0, always! +#if CONFIG_IEC_JIFFYDOS + .const IEC_JIFFY = 1 // has to be 1, always! +#endif +#if CONFIG_IEC_DOLPHINDOS + .const IEC_DOLPHIN = 2 +#endif +#if CONFIG_IEC_BURST_CIA1 || CONFIG_IEC_BURST_CIA2 || ROM_LAYOUT_M65 + .const IEC_BURST = 3 +#endif +#if ROM_LAYOUT_M65 + .const IEC_ROMDOS = 4 +#endif + + // // Definitions for tape functionality // diff --git a/src/kernal/iec/iec_rx_byte.s b/src/kernal/iec/iec_rx_byte.s index 9dd110df..17c326e7 100644 --- a/src/kernal/iec/iec_rx_byte.s +++ b/src/kernal/iec/iec_rx_byte.s @@ -17,7 +17,7 @@ iec_rx_dispatch: lda IECPROTO - cmp #$01 + cmp #IEC_JIFFY beq_16 jiffydos_rx_byte // FALLTROUGH @@ -54,7 +54,7 @@ iec_rx_byte: // Check if DolphinDOS was detected lda IECPROTO - cmp #$02 + cmp #IEC_DOLPHIN bne iec_rx_no_dolphindos // For DolphinDOS just fetch the byte from parallel port diff --git a/src/kernal/iec/iec_tx_byte.s b/src/kernal/iec/iec_tx_byte.s index 53295b0a..e34e6da3 100644 --- a/src/kernal/iec/iec_tx_byte.s +++ b/src/kernal/iec/iec_tx_byte.s @@ -19,7 +19,7 @@ iec_tx_dispatch: php // preserve C flag for EOI indication lda IECPROTO - cmp #$01 + cmp #IEC_JIFFY bne !+ plp @@ -71,7 +71,7 @@ iec_tx_common: // Check if DolphinDOS was detected lda IECPROTO - cmp #$02 + cmp #IEC_DOLPHIN bne iec_tx_no_dolphindos // For DolphinDOS just push the byte to parallel port (set it to output first) diff --git a/src/kernal/iec/load_iec.s b/src/kernal/iec/load_iec.s index fdd75f85..c9778dd0 100644 --- a/src/kernal/iec/load_iec.s +++ b/src/kernal/iec/load_iec.s @@ -107,12 +107,12 @@ load_iec: lda IECPROTO #if CONFIG_IEC_JIFFYDOS - cmp #$01 + cmp #IEC_JIFFY beq_16 jiffydos_load // branch if JiffyDOS #endif #if CONFIG_IEC_DOLPHINDOS - cmp #$02 + cmp #IEC_DOLPHIN beq_16 dolphindos_load // branch if DolphinDOS #endif diff --git a/src/kernal/iec_fast/dolphindos_detect.s b/src/kernal/iec_fast/dolphindos_detect.s index 92a53649..6cd288a0 100644 --- a/src/kernal/iec_fast/dolphindos_detect.s +++ b/src/kernal/iec_fast/dolphindos_detect.s @@ -56,7 +56,7 @@ dolphindos_detect_success: // Protocol detected - lda #$02 + lda #IEC_DOLPHIN sta IECPROTO rts diff --git a/src/kernal/iec_fast/dolphindos_load.s b/src/kernal/iec_fast/dolphindos_load.s index f32a8502..93a4970c 100644 --- a/src/kernal/iec_fast/dolphindos_load.s +++ b/src/kernal/iec_fast/dolphindos_load.s @@ -76,7 +76,7 @@ dolphindos_load_loop: jsr iec_update_EAL_by_Y // Restore proper IECPROTO value - lda #$02 + lda #IEC_DOLPHIN sta IECPROTO // End of load loop diff --git a/src/kernal/iec_fast/jiffydos_detect.s b/src/kernal/iec_fast/jiffydos_detect.s index 3488ee6b..095bac78 100644 --- a/src/kernal/iec_fast/jiffydos_detect.s +++ b/src/kernal/iec_fast/jiffydos_detect.s @@ -33,12 +33,12 @@ jiffydos_detect_loop: lda IECPROTO bpl jiffydos_detect_end // no detection requested, preserve existing protocol - lda #$00 // normal protocol + lda #IEC_NORMAL // normal protocol beq jiffydos_store_proto // branch always jiffydos_detected: jsr iec_wait_for_data_release // guessed from VICE logs - lda #$01 // JiffyDOS protocol + lda #IEC_JIFFY // JiffyDOS protocol // FALLTROUGH diff --git a/src/kernal/iec_fast/jiffydos_load.s b/src/kernal/iec_fast/jiffydos_load.s index f8487e42..11eb8995 100644 --- a/src/kernal/iec_fast/jiffydos_load.s +++ b/src/kernal/iec_fast/jiffydos_load.s @@ -145,7 +145,7 @@ jiffydos_load_end: sta C3PO // Restore proper IECPROTO value - lda #$01 + lda #IEC_JIFFY sta IECPROTO #if CONFIG_IEC_JIFFYDOS_BLANK diff --git a/src/kernal/iec_fast/jiffydos_rx_byte.s b/src/kernal/iec_fast/jiffydos_rx_byte.s index 01473045..e0166b3e 100644 --- a/src/kernal/iec_fast/jiffydos_rx_byte.s +++ b/src/kernal/iec_fast/jiffydos_rx_byte.s @@ -102,7 +102,7 @@ jiffydos_rx_byte_end: sta C3PO // Restore proper IECPROTO value - lda #$01 + lda #IEC_JIFFY sta IECPROTO // Re-enable sprites diff --git a/src/kernal/iec_fast/jiffydos_tx_byte.s b/src/kernal/iec_fast/jiffydos_tx_byte.s index e3ddcd06..272d0d62 100644 --- a/src/kernal/iec_fast/jiffydos_tx_byte.s +++ b/src/kernal/iec_fast/jiffydos_tx_byte.s @@ -83,7 +83,7 @@ jiffydos_tx_byte_finalize: sta CIA2_PRA // Restore proper IECPROTO value - lda #$01 + lda #IEC_JIFFY sta IECPROTO // Re-enable sprites and interrupts From ece9dc8f6fc44eedc191ca7f183cebebf51710fb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 10:55:35 +0200 Subject: [PATCH 22/96] MEGA65 glue code for DOS finished --- src/,,config_mega65.s | 7 +++++ src/dos_m65/,aliases_dos.s | 11 ++++++++ src/dos_m65/4000.dos_vectable.s | 1 + src/dos_m65/dos_chkunit.s | 38 ++++++++++++++++++++++++++ src/dos_m65/dos_init.s | 17 ++++++++++++ src/dos_m65/dos_setunit.s | 42 +++++++++++++++++++++++++++++ src/dos_m65/stubs.s | 4 --- src/kernal/iec/acptr.s | 5 ++++ src/kernal/iec/ciout.s | 5 ++++ src/kernal/iec/iec_cmd_close.s | 7 +++++ src/kernal/iec/iec_cmd_open.s | 7 +++++ src/kernal/iec/listen.s | 13 ++++++++- src/kernal/iec/second.s | 12 +++++++-- src/kernal/iec/talk.s | 13 ++++++++- src/kernal/iec/tksa.s | 7 +++++ src/kernal/iec/unlsn.s | 13 ++++++++- src/kernal/iec/untlk.s | 13 ++++++++- src/kernal/iec_fast/m65dos_bridge.s | 42 +++++++++++++++++++---------- src/kernal/iec_fast/m65dos_check.s | 22 +++++++++++++++ src/kernal/iec_fast/m65dos_detect.s | 22 +++++++++++++++ 20 files changed, 277 insertions(+), 24 deletions(-) create mode 100644 src/dos_m65/,aliases_dos.s create mode 100644 src/dos_m65/dos_chkunit.s create mode 100644 src/dos_m65/dos_init.s create mode 100644 src/dos_m65/dos_setunit.s create mode 100644 src/kernal/iec_fast/m65dos_check.s create mode 100644 src/kernal/iec_fast/m65dos_detect.s diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 1c9cdbf5..545005e5 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -130,6 +130,13 @@ // #define CONFIG_SHOW_FEATURES +// Built-in DOS configuration + +.const CONFIG_UNIT_SDCARD = 0 // do not change, DOS is not implemented yet +.const CONFIG_UNIT_FLOPPY = 0 // do not change, DOS is not implemented yet +.const CONFIG_UNIT_RAMDISK = 0 // do not change, DOS is not implemented yet + + // Debug options // #define CONFIG_DBG_STUBS_BRK diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s new file mode 100644 index 00000000..c9578fa7 --- /dev/null +++ b/src/dos_m65/,aliases_dos.s @@ -0,0 +1,11 @@ +// +// Memory locations for the DOS +// + + // + // Page 0 + // + + .label UNIT_SDCARD = $00 + .label UNIT_FLOPPY = $01 + .label UNIT_RAMDISK = $02 diff --git a/src/dos_m65/4000.dos_vectable.s b/src/dos_m65/4000.dos_vectable.s index 365f1761..2f99face 100644 --- a/src/dos_m65/4000.dos_vectable.s +++ b/src/dos_m65/4000.dos_vectable.s @@ -3,6 +3,7 @@ .word dos_INIT .word dos_CHKUNIT +.word dos_SETUNIT .word dos_ACPTR .word dos_CIOUT .word dos_LISTEN diff --git a/src/dos_m65/dos_chkunit.s b/src/dos_m65/dos_chkunit.s new file mode 100644 index 00000000..94088238 --- /dev/null +++ b/src/dos_m65/dos_chkunit.s @@ -0,0 +1,38 @@ + +// +// Unit number handling. For detailed description see 'm65dos_bridge.s' file +// + + +dos_CHKUNIT: + + cmp UNIT_SDCARD + beq dos_CHKUNIT_sdcard + cmp UNIT_FLOPPY + beq dos_CHKUNIT_floppy + cmp UNIT_RAMDISK + beq dos_CHKUNIT_ramdisk + + sec + rts + +dos_CHKUNIT_sdcard: + + lda #$00 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +dos_CHKUNIT_floppy: + + lda #$01 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +dos_CHKUNIT_ramdisk: + + lda #$02 + + clc + rts diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s new file mode 100644 index 00000000..82471370 --- /dev/null +++ b/src/dos_m65/dos_init.s @@ -0,0 +1,17 @@ + +// +// Initializes DOS. For detailed description see 'm65dos_bridge.s' file +// + +dos_INIT: + + lda #CONFIG_UNIT_SDCARD + sta UNIT_SDCARD + lda #CONFIG_UNIT_FLOPPY + sta UNIT_FLOPPY + lda #CONFIG_UNIT_RAMDISK + sta UNIT_RAMDISK + + // XXX initialize drivers, etc. + + rts diff --git a/src/dos_m65/dos_setunit.s b/src/dos_m65/dos_setunit.s new file mode 100644 index 00000000..cc9c53f9 --- /dev/null +++ b/src/dos_m65/dos_setunit.s @@ -0,0 +1,42 @@ + +// +// Unit number handling. For detailed description see 'm65dos_bridge.s' file +// + + +dos_SETUNIT: + + // XXX check if .X is valid + + cmp #$00 + beq dos_SETUNIT_sdcard + cmp #$01 + beq dos_SETUNIT_floppy + cmp #$02 + beq dos_SETUNIT_ramdisk + + sec + rts + +dos_SETUNIT_sdcard: + + stx UNIT_SDCARD + skip_2_bytes_trash_nvz + + // FALLTROUGH + +dos_SETUNIT_floppy: + + stx UNIT_FLOPPY + skip_2_bytes_trash_nvz + + // FALLTROUGH + +dos_SETUNIT_ramdisk: + + stx UNIT_RAMDISK + + // FALLTROUGH + + clc + rts diff --git a/src/dos_m65/stubs.s b/src/dos_m65/stubs.s index 56a37771..4dcdd351 100644 --- a/src/dos_m65/stubs.s +++ b/src/dos_m65/stubs.s @@ -1,10 +1,6 @@ // Dummy implementations - XXX to be replaced with real ones -dos_INIT: - nop -dos_CHKUNIT: - nop dos_ACPTR: nop dos_CIOUT: diff --git a/src/kernal/iec/acptr.s b/src/kernal/iec/acptr.s index 4739e5db..2f19f92d 100644 --- a/src/kernal/iec/acptr.s +++ b/src/kernal/iec/acptr.s @@ -22,6 +22,11 @@ ACPTR: rts !: +#if ROM_LAYOUT_M65 + jsr m65dos_check + bcc_16 m65dos_acptr // branch if device is handeld by internal DOS +#endif + #if CONFIG_IEC #if CONFIG_IEC_JIFFYDOS jmp iec_rx_dispatch diff --git a/src/kernal/iec/ciout.s b/src/kernal/iec/ciout.s index 6a35c029..a8f0d2e8 100644 --- a/src/kernal/iec/ciout.s +++ b/src/kernal/iec/ciout.s @@ -35,6 +35,11 @@ ciout_store_in_buffer: ciout_send_byte: +#if ROM_LAYOUT_M65 + jsr m65dos_check + bcc_16 m65dos_ciout // branch if device is handeld by internal DOS +#endif + clc // send without EOI #if CONFIG_IEC_JIFFYDOS jsr iec_tx_dispatch diff --git a/src/kernal/iec/iec_cmd_close.s b/src/kernal/iec/iec_cmd_close.s index 095e2000..567edc1f 100644 --- a/src/kernal/iec/iec_cmd_close.s +++ b/src/kernal/iec/iec_cmd_close.s @@ -20,6 +20,13 @@ iec_cmd_close: !: ora #$E0 +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_second // branch if device is handeld by internal DOS + +#endif + jmp common_open_close_unlsn_second diff --git a/src/kernal/iec/iec_cmd_open.s b/src/kernal/iec/iec_cmd_open.s index a4a0e2df..c93da420 100644 --- a/src/kernal/iec/iec_cmd_open.s +++ b/src/kernal/iec/iec_cmd_open.s @@ -20,6 +20,13 @@ iec_cmd_open: // similar to TKSA, but without turnaround !: ora #$F0 +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_second // branch if device is handeld by internal DOS + +#endif + #if CONFIG_IEC_BURST_CIA1 || CONFIG_IEC_BURST_CIA2 || CONFIG_IEC_BURST_MEGA_65 pha jsr burst_advertise diff --git a/src/kernal/iec/listen.s b/src/kernal/iec/listen.s index 33bb554d..ddb05c9b 100644 --- a/src/kernal/iec/listen.s +++ b/src/kernal/iec/listen.s @@ -16,11 +16,22 @@ LISTEN: -#if CONFIG_IEC +#if CONFIG_IEC || ROM_LAYOUT_M65 // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#endif + +#if ROM_LAYOUT_M65 + + jsr m65dos_detect + bcc_16 m65dos_listen // branch if device is handeld by internal DOS + +#endif + +#if CONFIG_IEC + // Check whether device number is correct jsr iec_check_devnum_oc bcc !+ diff --git a/src/kernal/iec/second.s b/src/kernal/iec/second.s index 60fce725..bfe484f4 100644 --- a/src/kernal/iec/second.s +++ b/src/kernal/iec/second.s @@ -13,8 +13,18 @@ // +// XXX cleanup: iec_cmd_open and iec_cmd_close should just do ORA and jump directly here + + SECOND: +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_second // branch if device is handeld by internal DOS + +#endif + #if CONFIG_IEC // Due to OPEN/CLOSE/TKSA/SECOND command encoding, allowed channels are 0-15; it is the caller @@ -22,8 +32,6 @@ SECOND: // - https://www.lemon64.com/forum/viewtopic.php?t=57694&sid=531ba3592bcffadef2ac8b9162f2e529 // - https://www.pagetable.com/?p=1031 (Kernal API description) - // XXX consider checking whether value is in range (contrary to original ROM implementation) - jmp common_open_close_unlsn_second #else diff --git a/src/kernal/iec/talk.s b/src/kernal/iec/talk.s index 23b0504e..dd0de963 100644 --- a/src/kernal/iec/talk.s +++ b/src/kernal/iec/talk.s @@ -16,11 +16,22 @@ TALK: -#if CONFIG_IEC +#if CONFIG_IEC || ROM_LAYOUT_M65 // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#endif + +#if ROM_LAYOUT_M65 + + jsr m65dos_detect + bcc_16 m65dos_talk // branch if device is handeld by internal DOS + +#endif + +#if CONFIG_IEC + // Check whether device number is correct jsr iec_check_devnum_oc bcc !+ diff --git a/src/kernal/iec/tksa.s b/src/kernal/iec/tksa.s index 59d0b9e5..be37b006 100644 --- a/src/kernal/iec/tksa.s +++ b/src/kernal/iec/tksa.s @@ -15,6 +15,13 @@ TKSA: +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_tksa // branch if device is handeld by internal DOS + +#endif + #if CONFIG_IEC // Due to OPEN/CLOSE/TKSA/SECOND command encoding, allowed channels are 0-15; it is the caller diff --git a/src/kernal/iec/unlsn.s b/src/kernal/iec/unlsn.s index d727fd92..57a2f98a 100644 --- a/src/kernal/iec/unlsn.s +++ b/src/kernal/iec/unlsn.s @@ -16,11 +16,22 @@ UNLSN: -#if CONFIG_IEC +#if CONFIG_IEC || ROM_LAYOUT_M65 // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#endif + +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_unlsn // branch if device is handeld by internal DOS + +#endif + +#if CONFIG_IEC + #if CONFIG_IEC_JIFFYDOS || CONFIG_IEC_DOLPHINDOS lda #$FF // do not use JiffyDOS / DolphinDOS anymore, trigger JiffyDOS detection diff --git a/src/kernal/iec/untlk.s b/src/kernal/iec/untlk.s index 2fab716a..8193bed7 100644 --- a/src/kernal/iec/untlk.s +++ b/src/kernal/iec/untlk.s @@ -16,11 +16,22 @@ UNTLK: -#if CONFIG_IEC +#if CONFIG_IEC || ROM_LAYOUT_M65 // According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer jsr iec_tx_flush +#endif + +#if ROM_LAYOUT_M65 + + jsr m65dos_check + bcc_16 m65dos_untlk // branch if device is handeld by internal DOS + +#endif + +#if CONFIG_IEC + #if CONFIG_IEC_JIFFYDOS || CONFIG_IEC_DOLPHINDOS lda #$FF // do not use JiffyDOS / DolphinDOS anymore, trigger JiffyDOS detection diff --git a/src/kernal/iec_fast/m65dos_bridge.s b/src/kernal/iec_fast/m65dos_bridge.s index 11208afe..40b21c85 100644 --- a/src/kernal/iec_fast/m65dos_bridge.s +++ b/src/kernal/iec_fast/m65dos_bridge.s @@ -8,44 +8,58 @@ .label VDOS_INIT = $4000 + 0 * 2 .label VDOS_CHKUNIT = $4000 + 1 * 2 -.label VDOS_ACPTR = $4000 + 2 * 2 -.label VDOS_CIOUT = $4000 + 3 * 2 -.label VDOS_LISTEN = $4000 + 4 * 2 -.label VDOS_SECOND = $4000 + 5 * 2 -.label VDOS_TALK = $4000 + 6 * 2 -.label VDOS_TKSA = $4000 + 7 * 2 -.label VDOS_UNTLK = $4000 + 8 * 2 -.label VDOS_UNLSN = $4000 + 9 * 2 - - -// XXX connect this to core IEC implementation +.label VDOS_SETUNIT = $4000 + 2 * 2 +.label VDOS_ACPTR = $4000 + 3 * 2 +.label VDOS_CIOUT = $4000 + 4 * 2 +.label VDOS_LISTEN = $4000 + 5 * 2 +.label VDOS_SECOND = $4000 + 6 * 2 +.label VDOS_TALK = $4000 + 7 * 2 +.label VDOS_TKSA = $4000 + 8 * 2 +.label VDOS_UNTLK = $4000 + 9 * 2 +.label VDOS_UNLSN = $4000 + 10 * 2 m65dos_init: + // Initializes the DOS internal variables + jsr map_DOS_1 jsr_ind VDOS_INIT jmp_8 !+ -m65dos_chkunit: +m65dos_chkunit: // XXX expose to BASIC + + // Checks is the unit number is supported by the internal DOS + // Input: .A - unit number to check + // Output: Carry set if not supported, otherwise .A contains unit type (0 = SD card, 1 = internal floppy, 2 = RAM disk) jsr map_DOS_1 jsr_ind VDOS_CHKUNIT jmp_8 !+ +m65dos_setunit: // XXX expose to BASIC + + // Set the unit number + // Input: .A - unit number, .X - unit type (as in m65dos_chkunit) + // Output: Carry set means error + + jsr map_DOS_1 + jsr_ind VDOS_SETUNIT + jmp_8 !+ + m65dos_acptr: jsr map_DOS_1 jsr_ind VDOS_ACPTR !: - jmp map_NORMAL_from_DOS_1 // try to make ACPTR slightly faster + jmp map_NORMAL_from_DOS_1 // ACPTR is slightly faster m65dos_ciout: jsr map_DOS_1 jsr_ind VDOS_CIOUT !: - jmp map_NORMAL_from_DOS_1 // try to make CIOUT slightly faster + jmp map_NORMAL_from_DOS_1 // CIOUT is slightly faster m65dos_listen: diff --git a/src/kernal/iec_fast/m65dos_check.s b/src/kernal/iec_fast/m65dos_check.s new file mode 100644 index 00000000..ba3b25b8 --- /dev/null +++ b/src/kernal/iec_fast/m65dos_check.s @@ -0,0 +1,22 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// MEGA65 pseudo-IEC internal DOS support - check if the current device is already handled by internal DOS +// + + +m65dos_check: + + pha + lda IECPROTO + cmp #IEC_ROMDOS + beq !+ + + pla + sec + rts +!: + pla + clc + rts diff --git a/src/kernal/iec_fast/m65dos_detect.s b/src/kernal/iec_fast/m65dos_detect.s new file mode 100644 index 00000000..ff7c9eb9 --- /dev/null +++ b/src/kernal/iec_fast/m65dos_detect.s @@ -0,0 +1,22 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// MEGA65 pseudo-IEC internal DOS support - detect if a drive should be handled by internal DOS +// + + +m65dos_detect: + + // Checks if drive is supported by internal DOS + // Output: Carry set if not supported, if supported IECPROTO isset to IEC_ROMDOS + + pha + jsr m65dos_chkunit + bcs !+ + + lda #IEC_ROMDOS + sta IECPROTO +!: + pla + rts From 9a154b371014e56d0d3528223f47980aaccba965 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 12:17:32 +0200 Subject: [PATCH 23/96] more control codes for MEGA65 screen editor --- src/aliases/,aliases_ram_lowmem_m65.s | 4 +- src/basic/basic_commands/cmd_go_goto_run.s | 14 +-- src/basic/board_m65/mega65_imports.s | 1 + src/basic/init/initmsg_real.s | 4 +- src/kernal/screen/chrout_screen_rvs.s | 6 +- src/kernal/screen_m65/mega65_chrout_screen.s | 13 +++ .../screen_m65/mega65_chrout_screen_control.s | 89 ++++++++++++++++--- 7 files changed, 108 insertions(+), 23 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 47e77a3a..1391e59d 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -24,8 +24,8 @@ // Page 0 - other reused values // - .label M65__TXTROW = PNTR // screen row - .label M65__TXTCOL = TBLX // screen column + .label M65__TXTROW = TBLX // screen row + .label M65__TXTCOL = PNTR // screen column // // Pages 4-7 - reused screen memory diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 848a1c30..cb1395d4 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -37,10 +37,10 @@ cmd_go_syntax_error: jsr helper_ask_if_sure bcs cmd_go_rts jsr M65_MODE64 - jmp do_clr + jmp_8 cmd_go_switchmode_clr_banner !: cmp #65 - bne !+ + bne_16 do_ILLEGAL_QUANTITY_error // If in C64 compatibility mode - switch to native mode @@ -50,9 +50,13 @@ cmd_go_syntax_error: jsr helper_ask_if_sure bcs cmd_go_rts jsr M65_MODE65 - jmp do_clr -!: - jmp do_ILLEGAL_QUANTITY_error + + // FALLTROUGH + +cmd_go_switchmode_clr_banner: + + jsr do_clr + jmp INITMSG cmd_go_rts: diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index 9461ee1b..53209d8d 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -24,6 +24,7 @@ .label JCHRIN = KERNAL_0.JCHRIN .label JREADST = KERNAL_0.JREADST .label SELDEV = KERNAL_0.SELDEV +.label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 .label plot_set = KERNAL_0.plot_set .label init_oldtxt = BASIC_0.init_oldtxt .label tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index 98df977a..c7779163 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -123,7 +123,8 @@ initmsg_real: #if ROM_LAYOUT_M65 - // XXX make it different for future Mega65 native mode + jsr M65_ISMODE65 + bcc !+ // XXX for MEGA65 native mode, display something else instead ldx #$02 ldy #$21 @@ -132,6 +133,7 @@ initmsg_real: lda #text_mode_64 jsr STROUT +!: #endif diff --git a/src/kernal/screen/chrout_screen_rvs.s b/src/kernal/screen/chrout_screen_rvs.s index 47dce95f..5703cacc 100644 --- a/src/kernal/screen/chrout_screen_rvs.s +++ b/src/kernal/screen/chrout_screen_rvs.s @@ -11,11 +11,13 @@ chrout_screen_RVS_ON: lda #$80 - bne !+ // branch always + skip_2_bytes_trash_nvz + + // FALLTROUGH chrout_screen_RVS_OFF: lda #$00 -!: + sta RVS jmp chrout_screen_done diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 4e9abced..486661e2 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -84,6 +84,11 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote // Store the new character in screen memory, restore .Z txa + + bit RVS + bpl !+ + ora #$80 // reverse the character XXX consider doing this within chrout_to_screen_code +!: sta_lp (M65_LPNT_SCR),z plz @@ -91,8 +96,16 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote inc M65__TXTCOL + // FALLTROUGH + +m65_chrout_fix_column_row: + // XXX continue the implementation - fix the cursor position + nop + + // FALLTROUGH + m65_chrout_screen_done: // XXX reenable cursor diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 76fb00c8..867fa58c 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -73,6 +73,81 @@ m65_chrout_try_color_loop: + +// XXX: consider moving to separate files + +m65_chrout_screen_RETURN: + + // RETURN clears quote and insert modes, it also clears reverse flag + + lda #$00 + sta QTSW + sta INSRT + sta RVS + + // XXX should we clear special colour attributes too? + + // Move cursor to the beginning of the next line + + sta M65__TXTCOL + inc M65__TXTROW + + // Correct the column/row values + + jmp m65_chrout_fix_column_row + + + + +m65_chrout_screen_RVS_ON: + + lda #$80 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_RVS_OFF: + + lda #$00 + + sta RVS + jmp m65_chrout_screen_done + + + +m65_chrout_screen_CRSR_RIGHT: + + inc M65__TXTCOL + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_LEFT: + + dec M65__TXTCOL + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_DOWN: + + inc M65__TXTROW + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_UP: + + dec M65__TXTROW + + // Correct the column/row values + + jmp m65_chrout_fix_column_row + + + + + // XXX: implement screen routines below: m65_chrout_screen_quote: @@ -89,18 +164,6 @@ m65_chrout_screen_TXT: nop m65_chrout_screen_GFX: nop -m65_chrout_screen_RVS_OFF: - nop -m65_chrout_screen_RVS_ON: - nop -m65_chrout_screen_CRSR_RIGHT: - nop -m65_chrout_screen_CRSR_LEFT: - nop -m65_chrout_screen_CRSR_DOWN: - nop -m65_chrout_screen_CRSR_UP: - nop m65_chrout_screen_INS: nop m65_chrout_screen_TAB: @@ -125,5 +188,5 @@ m65_chrout_screen_STOP: nop m65_chrout_screen_DEL: nop -m65_chrout_screen_RETURN: + jmp m65_chrout_screen_done From 19dfa0f4a13f5a1dc504a89f7e34330a05f50e54 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 13:51:14 +0200 Subject: [PATCH 24/96] added 'SYSINFO' BASIC command --- doc/Extended-BASIC.md | 4 + src/aliases/,aliases_hardware_m65.s | 1 + .../basic_commands_02/cmd__jumptable_02.s | 3 +- src/basic/basic_commands_02/cmd_sysinfo.s | 105 ++++++++++++++ .../board_m65/4000.mega65_vectable_basic_1.s | 6 +- src/basic/init/initmsg_real.s | 2 + tools/generate_strings.cc | 131 ++++++++++++------ 7 files changed, 210 insertions(+), 42 deletions(-) create mode 100644 src/basic/basic_commands_02/cmd_sysinfo.s diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index af4afb53..93d70e2a 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -84,6 +84,10 @@ Displays BASIC memory usage information: * `STRS` - bytes occupied by strings, also the ones belonging to arrays * `FREE` - unused space +### `SYSINFO` (Mega65) + +Displays various system information. + ### `CLEAR` (all) Clears the screen content. diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 6202f37d..75688eaf 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -27,6 +27,7 @@ // MISC registers + .label MISC_BOARDID = $D629 // board identification byte .label MISC_EMU = $D710 // to enable badlines and slow interrupts #endif diff --git a/src/basic/basic_commands_02/cmd__jumptable_02.s b/src/basic/basic_commands_02/cmd__jumptable_02.s index f554611f..32285618 100644 --- a/src/basic/basic_commands_02/cmd__jumptable_02.s +++ b/src/basic/basic_commands_02/cmd__jumptable_02.s @@ -22,7 +22,8 @@ // varstr_garbage_collect, // cmd_dispose cmd_cold, - cmd_mem + cmd_mem, + cmd_sysinfo ) diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s new file mode 100644 index 00000000..f8725753 --- /dev/null +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -0,0 +1,105 @@ +// #LAYOUT# M65 * #TAKE +// #LAYOUT# * * #IGNORE + + +#if SEGMENT_BASIC_0 + +cmd_sysinfo: + + jsr map_BASIC_1 + jsr_ind VB1__cmd_sysinfo + jmp map_NORMAL + +#else + +cmd_sysinfo: + + jsr print_return + + // Print mode and build information + + ldx #IDX__STR_SI_HEADER + jsr print_packed_misc_str + + jsr M65_ISMODE65 + bcc !+ + + ldx #IDX__STR_SI_MODE64 + skip_2_bytes_trash_nvz +!: + ldx #IDX__STR_SI_MODE65 + jsr print_packed_misc_str + + ldx #IDX__STR_SI_HDR_REL + jsr print_packed_misc_str + + lda #rom_revision_basic_string + jsr STROUT + + // Print board ID + + ldx #IDX__STR_SI_HDR_HW + jsr print_packed_misc_str + + lda MISC_BOARDID + ldy #(__cmd_sysinfo_hw_ids_end - cmd_sysinfo_hw_ids - 1) +!: + cmp cmd_sysinfo_hw_ids, y + beq !+ + dey + bpl !- + ldy #(__cmd_sysinfo_hw_ids_end - cmd_sysinfo_hw_ids) +!: + ldx cmd_sysinfo_hw_str, y + jsr print_packed_misc_str + + // Print video system information + + ldx #IDX__STR_SI_HDR_VID + jsr print_packed_misc_str + + ldx #IDX__STR_NTSC + lda TVSFLG + beq !+ + ldx #IDX__STR_PAL +!: + jsr print_packed_misc_str + + // Print build featires information + + ldx #IDX__STR_SI_FEATURES + jmp print_packed_misc_str + + + +cmd_sysinfo_hw_ids: + + .byte $01 + .byte $02 + .byte $03 + .byte $21 + .byte $40 + .byte $41 + .byte $42 + .byte $FD + .byte $FE + +__cmd_sysinfo_hw_ids_end: + +cmd_sysinfo_hw_str: + + .byte IDX__STR_SI_HW_01 + .byte IDX__STR_SI_HW_02 + .byte IDX__STR_SI_HW_03 + .byte IDX__STR_SI_HW_21 + .byte IDX__STR_SI_HW_40 + .byte IDX__STR_SI_HW_41 + .byte IDX__STR_SI_HW_42 + .byte IDX__STR_SI_HW_FD + .byte IDX__STR_SI_HW_FE + .byte IDX__STR_SI_HW_XX + + + +#endif diff --git a/src/basic/board_m65/4000.mega65_vectable_basic_1.s b/src/basic/board_m65/4000.mega65_vectable_basic_1.s index 17f96e1b..c81cea55 100644 --- a/src/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/src/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -22,8 +22,9 @@ .label VB1__do_clr = $4000 + 2 * 7 .label VB1__do_restore = $4000 + 2 * 8 .label VB1__cmd_mem_cont = $4000 + 2 * 9 - .label VB1__prepare_direct_execution = $4000 + 2 * 10 - .label VB1__helper_ask_if_sure = $4000 + 2 * 11 + .label VB1__cmd_sysinfo = $4000 + 2 * 10 + .label VB1__prepare_direct_execution = $4000 + 2 * 11 + .label VB1__helper_ask_if_sure = $4000 + 2 * 12 #if CONFIG_DOS_WEDGE .label VB1__wedge_dos = $4000 + 2 * 12 @@ -43,6 +44,7 @@ .word do_clr .word do_restore .word cmd_mem_cont + .word cmd_sysinfo .word prepare_direct_execution .word helper_ask_if_sure diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index c7779163..29566f4c 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -6,6 +6,8 @@ // Routine is too long to fit in the original location +// XXX banner-related code needs cleanup, move MEGA65 stuff to a separate file + #if ROM_LAYOUT_M65 diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index a86fba98..8343aa28 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -202,6 +202,7 @@ const StringEntryList GLOBAL_Keywords_02 = { ListType::KEYWORDS, "keywords_02", { false, true, false, false, "K02_07", "COLD", }, // Not present in CBM BASIC dialects, but common to some extensions (*) { false, true, false, false, "K02_08", "MEM", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, false, false, "K02_09", "SYSINFO", }, // Not present in CBM BASIC dialects, Open ROMs specific // (*) see https://sourceforge.net/p/vice-emu/code/HEAD/tree/trunk/vice/src/petcat.c } }; @@ -283,22 +284,41 @@ const StringEntryList GLOBAL_Errors = { ListType::STRINGS_BASIC, "errors", const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { // STD M65 U64 X16 --- misc strings as on CBM machines - { true, true, true, true, "STR_RET_QM", "\r?" }, - { true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html - { true, true, true, true, "STR_IN", " IN " }, - { false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm + { true, true, true, true, "STR_RET_QM", "\r?" }, + { true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser + { true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser + { true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html + { true, true, true, true, "STR_IN", " IN " }, + { false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm // STD M65 U64 X16 --- misc strings specific to Open ROMs, not present in CBM ROMs - { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, - { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, - { false, true, false, false, "STR_MEM_1", " $" }, - { false, true, false, false, "STR_MEM_2", " " }, - { false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, - { false, true, false, false, "STR_MEM_VARS", "\r VARS" }, - { false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, - { false, true, false, false, "STR_MEM_STRS", "\r STRS" }, - { false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, + { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, + + { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, + { false, true, false, false, "STR_MEM_1", " $" }, + { false, true, false, false, "STR_MEM_2", " " }, + { false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, + { false, true, false, false, "STR_MEM_VARS", "\r VARS" }, + { false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, + { false, true, false, false, "STR_MEM_STRS", "\r STRS" }, + { false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, + + { false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, + { false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, + { false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, + { false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, + { false, true, false, false, "STR_SI_HDR_HW", "\r\rBOARD : " }, + { false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, + { false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, + { false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, + { false, true, false, false, "STR_SI_HW_21", "MEGAPHONE R1" }, + { false, true, false, false, "STR_SI_HW_40", "NEXYS4 PSRAM" }, + { false, true, false, false, "STR_SI_HW_41", "NEXYS4 DDR" }, + { false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, + { false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, + { false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, + { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN" }, + { false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, + // Note: depending on configuration, additional strings will be added here } }; @@ -1108,68 +1128,91 @@ void DataSet::generateConfigDepStrings() // Generate string to show the build features std::string featureStr; - + std::string featureStrM65 = "\r"; + // Tape support features if (GLOBAL_ConfigOptions["CONFIG_TAPE_NORMAL"] && GLOBAL_ConfigOptions["CONFIG_TAPE_TURBO"]) { - featureStr = "TAPE LOAD NORMAL TURBO\r"; + featureStr += "TAPE LOAD NORMAL TURBO\r"; + featureStrM65 += "TAPE : LOAD NORMAL TURBO\r"; } else if (GLOBAL_ConfigOptions["CONFIG_TAPE_NORMAL"]) { - featureStr = "TAPE LOAD NORMAL\r"; + featureStr += "TAPE LOAD NORMAL\r"; + featureStrM65 += "TAPE : LOAD NORMAL\r"; } else if (GLOBAL_ConfigOptions["CONFIG_TAPE_TURBO"]) { - featureStr = "TAPE LOAD TURBO\r"; + featureStr += "TAPE LOAD TURBO\r"; + featureStrM65 += "TAPE : LOAD TURBO\r"; } // IEC support features if (GLOBAL_ConfigOptions["CONFIG_IEC"]) { - featureStr += "IEC"; + featureStr += "IEC"; + featureStrM65 += "IEC :"; bool extendedIEC = false; if (GLOBAL_ConfigOptions["CONFIG_IEC_BURST_CIA1"]) { - featureStr += " BURST1"; - extendedIEC = true; + featureStr += " BURST1"; + extendedIEC = true; } if (GLOBAL_ConfigOptions["CONFIG_IEC_BURST_CIA2"]) { - featureStr += " BURST2"; - extendedIEC = true; + featureStr += " BURST2"; + extendedIEC = true; } if (GLOBAL_ConfigOptions["CONFIG_IEC_BURST_MEGA65"]) { - featureStr += " BURST"; - extendedIEC = true; + featureStr += " BURST"; + featureStrM65 += " BURST"; + extendedIEC = true; } if (GLOBAL_ConfigOptions["CONFIG_IEC_DOLPHINDOS"]) { - featureStr += " DOLPHIN"; - extendedIEC = true; + featureStr += " DOLPHIN"; + featureStrM65 += " DOLPHIN"; + extendedIEC = true; } if (GLOBAL_ConfigOptions["CONFIG_IEC_JIFFYDOS"]) { - featureStr += " JIFFY"; - extendedIEC = true; + featureStr += " JIFFY"; + featureStrM65 += " JIFFY"; + extendedIEC = true; } - if (!extendedIEC) featureStr += " NORMAL"; - - featureStr += "\r"; + if (!extendedIEC) + { + featureStr += " NORMAL ONLY"; + featureStrM65 += " NORMAL ONLY"; + } + + featureStr += "\r"; + featureStrM65 += "\r"; } - + else + { + featureStrM65 += "IEC : NO\r"; + } + // RS-232 support features if (GLOBAL_ConfigOptions["CONFIG_RS232_UP2400"]) featureStr += "UP2400\r"; if (GLOBAL_ConfigOptions["CONFIG_RS232_UP9600"]) featureStr += "UP9600\r"; + featureStrM65 += "RS-232 : NO\r"; + + // CBDOS features + + featureStrM65 += "CBDOS : NO\r"; + // Keyboard support features if (GLOBAL_ConfigOptions["CONFIG_KEYBOARD_C128"]) featureStr += "KBD 128\r"; @@ -1183,18 +1226,28 @@ void DataSet::generateConfigDepStrings() // List found - if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"]) + if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"] || GLOBAL_ConfigOptions["CONFIG_BRAND_MEGA_65"]) { StringEntry newEntry1 = { true, true, true, true, "STR_PAL", "PAL\r" }; StringEntry newEntry2 = { true, true, true, true, "STR_NTSC", "NTSC\r" }; - StringEntry newEntry3 = { true, true, true, true, "STR_FEATURES", featureStr }; stringEntryList.list.push_back(newEntry1); stringEntryList.list.push_back(newEntry2); - stringEntryList.list.push_back(newEntry3); - - break; } + + if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"]) + { + StringEntry newEntry = { true, true, true, true, "STR_FEATURES", featureStr }; + stringEntryList.list.push_back(newEntry); + } + + if (GLOBAL_ConfigOptions["CONFIG_BRAND_MEGA_65"]) + { + StringEntry newEntry = { false, true, false, false, "STR_SI_FEATURES", featureStrM65 }; + stringEntryList.list.push_back(newEntry); + } + + break; } } From 5f6357c7e39e108e9a7b28c018d9b502a69d2935 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 14:01:52 +0200 Subject: [PATCH 25/96] more control codes supported for MEGA65 native screen --- src/kernal/screen/chrout_screen_shift_onoff.s | 10 ++- .../screen_m65/mega65_chrout_screen_control.s | 83 ------------------- .../mega65_chrout_screen_control_1.s | 58 +++++++++++++ .../mega65_chrout_screen_control_2.s | 58 +++++++++++++ 4 files changed, 122 insertions(+), 87 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_chrout_screen_control_1.s create mode 100644 src/kernal/screen_m65/mega65_chrout_screen_control_2.s diff --git a/src/kernal/screen/chrout_screen_shift_onoff.s b/src/kernal/screen/chrout_screen_shift_onoff.s index 24369ada..0058e836 100644 --- a/src/kernal/screen/chrout_screen_shift_onoff.s +++ b/src/kernal/screen/chrout_screen_shift_onoff.s @@ -11,11 +11,13 @@ chrout_screen_SHIFT_ON: lda #$00 // enable SHIFT+VENDOR combination -!: - sta MODE - jmp chrout_screen_done + skip_2_bytes_trash_nvz + + // FALLTROUGH chrout_screen_SHIFT_OFF: lda #$80 // disable SHIFT+VENDOR combination - bne !- // branch always + + sta MODE + jmp chrout_screen_done diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 867fa58c..55cf1b07 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -73,81 +73,6 @@ m65_chrout_try_color_loop: - -// XXX: consider moving to separate files - -m65_chrout_screen_RETURN: - - // RETURN clears quote and insert modes, it also clears reverse flag - - lda #$00 - sta QTSW - sta INSRT - sta RVS - - // XXX should we clear special colour attributes too? - - // Move cursor to the beginning of the next line - - sta M65__TXTCOL - inc M65__TXTROW - - // Correct the column/row values - - jmp m65_chrout_fix_column_row - - - - -m65_chrout_screen_RVS_ON: - - lda #$80 - skip_2_bytes_trash_nvz - - // FALLTROUGH - -m65_chrout_screen_RVS_OFF: - - lda #$00 - - sta RVS - jmp m65_chrout_screen_done - - - -m65_chrout_screen_CRSR_RIGHT: - - inc M65__TXTCOL - skip_2_bytes_trash_nvz - - // FALLTROUGH - -m65_chrout_screen_CRSR_LEFT: - - dec M65__TXTCOL - skip_2_bytes_trash_nvz - - // FALLTROUGH - -m65_chrout_screen_CRSR_DOWN: - - inc M65__TXTROW - skip_2_bytes_trash_nvz - - // FALLTROUGH - -m65_chrout_screen_CRSR_UP: - - dec M65__TXTROW - - // Correct the column/row values - - jmp m65_chrout_fix_column_row - - - - - // XXX: implement screen routines below: m65_chrout_screen_quote: @@ -156,14 +81,6 @@ m65_chrout_screen_CLR: nop m65_chrout_screen_HOME: nop -m65_chrout_screen_SHIFT_OFF: - nop -m65_chrout_screen_SHIFT_ON: - nop -m65_chrout_screen_TXT: - nop -m65_chrout_screen_GFX: - nop m65_chrout_screen_INS: nop m65_chrout_screen_TAB: diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s new file mode 100644 index 00000000..07db19f4 --- /dev/null +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s @@ -0,0 +1,58 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +// Cursor movement + +m65_chrout_screen_CRSR_RIGHT: + + inc M65__TXTCOL + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_LEFT: + + dec M65__TXTCOL + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_DOWN: + + inc M65__TXTROW + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_CRSR_UP: + + dec M65__TXTROW + jmp_8 m65_chrout_screen_ctrl1_end + + +// 'RETURN' key + +m65_chrout_screen_RETURN: + + // RETURN clears quote and insert modes, it also clears reverse flag + + lda #$00 + sta QTSW + sta INSRT + sta RVS + + // XXX should we clear special colour attributes too? + + // Move cursor to the beginning of the next line + + sta M65__TXTCOL + inc M65__TXTROW + + // FALLTROUGH + +m65_chrout_screen_ctrl1_end: + + // Correct the column/row values + + jmp m65_chrout_fix_column_row diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s new file mode 100644 index 00000000..8ebfcfa2 --- /dev/null +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -0,0 +1,58 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +// 'REVERSE' mode support + +m65_chrout_screen_RVS_ON: + + lda #$80 + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_RVS_OFF: + + lda #$00 + + sta RVS + + // FALLTROUGH + +m65_chrout_screen_ctrl2_end: + + jmp m65_chrout_screen_done + + +// 'SHIFT ON/OFF' support + +m65_chrout_screen_SHIFT_ON: + + lda #$00 // enable SHIFT+VENDOR combination + skip_2_bytes_trash_nvz + + // FALLTROUGH + +m65_chrout_screen_SHIFT_OFF: + + lda #$80 // disable SHIFT+VENDOR combination + + sta MODE + jmp_8 m65_chrout_screen_ctrl2_end + + +// GFX/TXT switching support + +m65_chrout_screen_GFX: + + lda VIC_YMCSB + and #$02 // to upper case +!: + sta VIC_YMCSB + jmp_8 m65_chrout_screen_ctrl2_end + +m65_chrout_screen_TXT: + + lda VIC_YMCSB + ora #$02 // to lower case + bne !- // branch always From 56b9571b62513fb51a3b0b3c8161b2c37a4222a0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 15:31:57 +0200 Subject: [PATCH 26/96] more work towards windowed mode support --- src/kernal/board_m65/mega65_imports.s | 5 ++ src/kernal/extapi_m65/mega65__jumptable.s | 12 ++++ src/kernal/screen_m65/mega65_chrout_screen.s | 21 ++++++- .../mega65_chrout_screen_control_1.s | 6 ++ src/kernal/screen_m65/mega65_setwin.s | 56 +++++++++++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/kernal/screen_m65/mega65_setwin.s diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 6eca7f6b..e8ebbe9b 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -12,6 +12,11 @@ .label M65_SLOW = KERNAL_0.M65_SLOW .label M65_FAST = KERNAL_0.M65_FAST .label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 +.label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY +.label M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH +.label M65_SETWIN_N = KERNAL_0.M65_SETWIN_N +.label M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y + #if (CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO) || (CONFIG_IEC_JIFFYDOS && !CONFIG_MEMORY_MODEL_60K) .label screen_on = KERNAL_0.screen_on diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 8f11f632..2cf575d5 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -31,3 +31,15 @@ M65_JCLRSCR: M65_JCLRWIN: jsr M65_CLRWIN + +M65_JSETWIN_XY: + jsr M65_SETWIN_XY + +M65_JSETWIN_WH: + jsr M65_SETWIN_WH + +M65_JSETWIN_N: + jsr M65_SETWIN_N + +M65_JSETWIN_Y: + jsr M65_SETWIN_Y diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 486661e2..c438276d 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -100,7 +100,26 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote m65_chrout_fix_column_row: - // XXX continue the implementation - fix the cursor position + ldy M65_SCRMODE + + bit M64_SCRWINMODE + bmi m65_chrout_fix_column_row_win + + // Non-windowed mode + + // XXX + // XXX provide implementation + // XXX + + jmp_8 m65_chrout_screen_done + +m65_chrout_fix_column_row_win: + + // Windowed mode + + // XXX + // XXX provide implementation + // XXX nop diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s index 07db19f4..be48a266 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s @@ -46,6 +46,12 @@ m65_chrout_screen_RETURN: // Move cursor to the beginning of the next line + bit M64_SCRWINMODE + bpl !+ + lda M65_TXTWIN_X0 + skip_2_bytes_trash_nvz +!: + lda #$00 sta M65__TXTCOL inc M65__TXTROW diff --git a/src/kernal/screen_m65/mega65_setwin.s b/src/kernal/screen_m65/mega65_setwin.s new file mode 100644 index 00000000..f900c5b8 --- /dev/null +++ b/src/kernal/screen_m65/mega65_setwin.s @@ -0,0 +1,56 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_SETWIN_XY: + + stx M65_TXTWIN_X0 + sty M65_TXTWIN_Y0 + + rts + + +M65_SETWIN_WH: + + pha + + clc + txa + adc M65_TXTWIN_X0 + sta M65_TXTWIN_X1 + + clc + tya + adc M65_TXTWIN_Y0 + sta M65_TXTWIN_Y1 + + pla + rts + + +M65_SETWIN_N: + + pha + + lda #$00 + sta M64_SCRWINMODE + + pla + rts + + +M65_SETWIN_Y: + + pha + + lda #$FF + sta M64_SCRWINMODE + + lda M65_TXTWIN_X0 + sta M65__TXTCOL + + lda M65_TXTWIN_Y0 + sta M65__TXTROW + + pla + rts From 4f417d714e5234be7306c56fe2d3dbd2b620edf4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 15:43:04 +0200 Subject: [PATCH 27/96] added protection against DOS memory damage --- src/dos_m65/,aliases_dos.s | 9 ++++++--- src/dos_m65/dos_chkunit.s | 25 +++++++++++++++++++++++++ src/dos_m65/dos_init.s | 18 ++++++++++++++++++ 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index c9578fa7..f182d3ce 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -6,6 +6,9 @@ // Page 0 // - .label UNIT_SDCARD = $00 - .label UNIT_FLOPPY = $01 - .label UNIT_RAMDISK = $02 + .label MAGICSTR = $00 // magic string; if not matching, DOS considered non-functional + + .label UNIT_SDCARD = $05 + .label UNIT_FLOPPY = $06 + .label UNIT_RAMDISK = $07 + diff --git a/src/dos_m65/dos_chkunit.s b/src/dos_m65/dos_chkunit.s index 94088238..e813e930 100644 --- a/src/dos_m65/dos_chkunit.s +++ b/src/dos_m65/dos_chkunit.s @@ -6,6 +6,24 @@ dos_CHKUNIT: + // Check for magic string + + pha + phx + + ldx #$04 +!: + lda MAGICSTR, x + cmp dos_magicstr, x + bne dos_CHKUNIT_mem_fail + dex + bpl !- + + plx + pla + + // Check for unit + cmp UNIT_SDCARD beq dos_CHKUNIT_sdcard cmp UNIT_FLOPPY @@ -36,3 +54,10 @@ dos_CHKUNIT_ramdisk: clc rts + +dos_CHKUNIT_mem_fail: + + plx + pla + sec + rts diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index 82471370..25ed5e7d 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -5,6 +5,20 @@ dos_INIT: + // Set the magic string 'CBDOS' + + phx + ldx #$04 +!: + lda dos_magicstr, x + sta MAGICSTR, x + dex + bpl !- + + plx + + // Set default device numbers + lda #CONFIG_UNIT_SDCARD sta UNIT_SDCARD lda #CONFIG_UNIT_FLOPPY @@ -15,3 +29,7 @@ dos_INIT: // XXX initialize drivers, etc. rts + +dos_magicstr: // 'CBDOS' + + .byte $43, $42, $44, $4F, $53 From 8bd0544e87a7d2e90d59930f97a6985833fb3e33 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 16:17:14 +0200 Subject: [PATCH 28/96] startup banner support cleanup --- CONFIG.md | 4 +- src/,,config_custom.s | 2 - src/,,config_cx16.s | 2 - src/,,config_generic.s | 2 - src/,,config_mega65.s | 18 +---- src/,,config_testing.s | 2 - src/,,config_ultimate64.s | 2 - src/aliases/,aliases_config.s | 30 ++++---- src/basic/assets/startup_banner.s | 65 ++++++++++++++++ .../startup_banner_m65.s} | 77 +------------------ src/basic/init/initmsg_m65.s | 44 +++++++++++ src/basic/init/initmsg_real.s | 59 -------------- tools/generate_strings.cc | 4 +- 13 files changed, 131 insertions(+), 180 deletions(-) create mode 100644 src/basic/assets/startup_banner.s rename src/basic/{init/startup_banner.s => assets/startup_banner_m65.s} (73%) create mode 100644 src/basic/init/initmsg_m65.s diff --git a/CONFIG.md b/CONFIG.md index e94e7ac6..9f0f7b30 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -307,9 +307,9 @@ Feature needs 2 bytes in KERNAL segmment (for CPUs needing the patch), but at th Tries to adjust the color scheme to the selected brand. Some brands might not support this. -### `CONFIG_BANNER_SIMPLE`, `CONFIG_BANNER_FANCY`, `CONFIG_BANNER_BRAND` +### `CONFIG_BANNER_SIMPLE`, `CONFIG_BANNER_FANCY` -Select startup banner - either a simple one, or with some colorful elements. `CONFIG_BANNER_BRAND` heavily depends on the selected brand, not all the brands support it. +Select startup banner - either a simple one, or with some colorful elements. Richer banners need more BASIC segment, varies between brands. diff --git a/src/,,config_custom.s b/src/,,config_custom.s index ad83a50a..5383a2ee 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -22,7 +22,6 @@ #define CONFIG_BRAND_CUSTOM_BUILD // #define CONFIG_BRAND_GENERIC // #define CONFIG_BRAND_TESTING -// #define CONFIG_BRAND_MEGA_65 // #define CONFIG_BRAND_ULTIMATE_64 .const CONFIG_CUSTOM_BRAND = @"CUSTOM BUILD" @@ -134,7 +133,6 @@ // #define CONFIG_COLORS_BRAND // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND #define CONFIG_SHOW_FEATURES diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index 61056fb2..69d16602 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -21,7 +21,6 @@ #define CONFIG_BRAND_CUSTOM_BUILD // #define CONFIG_BRAND_GENERIC // #define CONFIG_BRAND_TESTING -// #define CONFIG_BRAND_MEGA_65 // #define CONFIG_BRAND_ULTIMATE_64 .const CONFIG_CUSTOM_BRAND = @"FOR COMMANDER X16" @@ -128,7 +127,6 @@ // #define CONFIG_COLORS_BRAND // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND // #define CONFIG_SHOW_FEATURES diff --git a/src/,,config_generic.s b/src/,,config_generic.s index 391de569..a5bbe9bb 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -21,7 +21,6 @@ #define CONFIG_BRAND_GENERIC // #define CONFIG_BRAND_TESTING -// #define CONFIG_BRAND_MEGA_65 // #define CONFIG_BRAND_ULTIMATE_64 @@ -126,7 +125,6 @@ #define CONFIG_COLORS_BRAND // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND #define CONFIG_SHOW_FEATURES diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 545005e5..29bd1ddc 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -12,18 +12,11 @@ -// Hardware platform and brand +// Hardware platform #define CONFIG_PLATFORM_COMMODORE_64 #define CONFIG_MB_MEGA_65 -// #define CONFIG_MB_ULTIMATE_64 - -// #define CONFIG_BRAND_GENERIC -// #define CONFIG_BRAND_TESTING -#define CONFIG_BRAND_MEGA_65 -// #define CONFIG_BRAND_ULTIMATE_64 - // Processor instruction set @@ -121,15 +114,6 @@ #define CONFIG_BCD_SAFE_INTERRUPTS -// Eye candy - -#define CONFIG_COLORS_BRAND -// #define CONFIG_BANNER_SIMPLE -// #define CONFIG_BANNER_FANCY -#define CONFIG_BANNER_BRAND -// #define CONFIG_SHOW_FEATURES - - // Built-in DOS configuration .const CONFIG_UNIT_SDCARD = 0 // do not change, DOS is not implemented yet diff --git a/src/,,config_testing.s b/src/,,config_testing.s index b56027c3..ed450277 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -21,7 +21,6 @@ // #define CONFIG_BRAND_GENERIC #define CONFIG_BRAND_TESTING -// #define CONFIG_BRAND_MEGA_65 // #define CONFIG_BRAND_ULTIMATE_64 @@ -126,7 +125,6 @@ // #define CONFIG_COLORS_BRAND #define CONFIG_BANNER_SIMPLE // #define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND #define CONFIG_SHOW_FEATURES diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index b463c918..5e6eb4b0 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -21,7 +21,6 @@ // #define CONFIG_BRAND_GENERIC // #define CONFIG_BRAND_TESTING -// #define CONFIG_BRAND_MEGA_65 #define CONFIG_BRAND_ULTIMATE_64 @@ -126,7 +125,6 @@ #define CONFIG_COLORS_BRAND // #define CONFIG_BANNER_SIMPLE #define CONFIG_BANNER_FANCY -// #define CONFIG_BANNER_BRAND #define CONFIG_SHOW_FEATURES diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index ae1798de..c42216ca 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -63,18 +63,21 @@ #if CONFIG_BRAND_TESTING .eval selected++ #endif -#if CONFIG_BRAND_MEGA_65 - .eval selected++ -#endif #if CONFIG_BRAND_ULTIMATE_64 .eval selected++ #endif +#if !CONFIG_MB_MEGA_65 .if (selected != 1) .error "Please select exactly one CONFIG_BRAND_* option" - -#if CONFIG_MB_MEGA_65 && !(CONFIG_BRAND_MEGA_65 || CONFIG_BRAND_TESTING || CONFIG_BRAND_CUSTOM_BUILD) - .error "Please select brand either matching the CONFIG_MB_*, or a testing/custom one" #endif +#if CONFIG_MB_MEGA_65 + .if (selected != 0) .error "Do not use CONFIG_BRAND_* options for MEGA65" +#endif + +#if CONFIG_MB_MEGA_65 && CONFIG_SHOW_FEATURES + .if (selected != 0) .error "Do not use CONFIG_SHOW_FEATURES options for MEGA65" +#endif + #if CONFIG_MB_ULTIMATE_64 && !(CONFIG_BRAND_ULTIMATE_64 || CONFIG_BRAND_TESTING || CONFIG_BRAND_CUSTOM_BUILD) .error "Please select brand either matching the CONFIG_MB_*, or a testing/custom one" #endif @@ -218,18 +221,17 @@ #if CONFIG_BANNER_FANCY .eval selected++ #endif -#if CONFIG_BANNER_BRAND - .eval selected++ -#endif +#if !CONFIG_MB_MEGA_65 .if (selected != 1) .error "Please select exactly one CONFIG_BANNER_* option" - -#if CONFIG_BANNER_BRAND && !CONFIG_BRAND_MEGA_65 - .error "CONFIG_BANNER_BRAND is not supported for your CONFIG_BRAND_*" #endif -#if CONFIG_MB_MEGA_65 && CONFIG_SHOW_PAL_NTSC - .error "MEGA65 can switch PAL/NTSC during run-time, CONFIG_SHOW_PAL_NTSC makes no sense" +#if CONFIG_MB_MEGA_65 + .if (selected != 0) .error "Do not use CONFIG_BANNER_* options for MEGA65" +#endif + +#if CONFIG_MB_MEGA_65 && CONFIG_COLORS_BRAND + .error "Do not use CONFIG_COLORS_BRAND options for MEGA65" #endif } diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s new file mode 100644 index 00000000..2ae93071 --- /dev/null +++ b/src/basic/assets/startup_banner.s @@ -0,0 +1,65 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# X16 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Startup banner, to be displayed during cold start +// + +.encoding "petscii_upper" + + +.macro BANNER_TEXT() { + +#if CONFIG_BRAND_CUSTOM_BUILD + .text "OPEN ROMS " + .text CONFIG_CUSTOM_BRAND +#elif CONFIG_BRAND_GENERIC + .text "OPEN ROMS GENERIC BUILD" +#elif CONFIG_BRAND_TESTING + .text "OPEN ROMS TESTING BUILD" +#elif CONFIG_BRAND_ULTIMATE_64 + .text "OPEN ROMS FOR ULTIMATE 64" +#endif + +} + +startup_banner: + +#if CONFIG_BANNER_SIMPLE + + .text " " + BANNER_TEXT() + .byte $00 + +#elif CONFIG_BANNER_FANCY + + BANNER_TEXT() + .byte $00 + +rainbow_logo: + +{ + .var SET_COLOR_0 = $05 + .var SET_COLOR_1 = $1C + .var SET_COLOR_2 = $9E + .var SET_COLOR_3 = $1E + .var SET_COLOR_4 = $9F + + .byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D + .byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D + .byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D + .byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 + .byte SET_COLOR_0, $00 +} + +#if !CONFIG_BRAND_CUSTOM_BUILD + +pre_revision_string: + + .text "RELEASE " + .byte $00 + +#endif // no CONFIG_BRAND_CUSTOM_BUILD + +#endif diff --git a/src/basic/init/startup_banner.s b/src/basic/assets/startup_banner_m65.s similarity index 73% rename from src/basic/init/startup_banner.s rename to src/basic/assets/startup_banner_m65.s index 68fb173a..fc10ded0 100644 --- a/src/basic/init/startup_banner.s +++ b/src/basic/assets/startup_banner_m65.s @@ -1,6 +1,4 @@ -// #LAYOUT# STD * #TAKE // #LAYOUT# M65 BASIC_1 #TAKE -// #LAYOUT# X16 BASIC_0 #TAKE // #LAYOUT# * * #IGNORE // @@ -10,75 +8,8 @@ .encoding "petscii_upper" -.macro BANNER_TEXT() { - -#if CONFIG_BRAND_CUSTOM_BUILD - .text "OPEN ROMS " - .text CONFIG_CUSTOM_BRAND -#elif CONFIG_BRAND_GENERIC - .text "OPEN ROMS GENERIC BUILD" -#elif CONFIG_BRAND_TESTING - .text "OPEN ROMS TESTING BUILD" -#elif CONFIG_BRAND_MEGA_65 - .text "OPEN ROMS FOR MEGA65" -#elif CONFIG_BRAND_ULTIMATE_64 - .text "OPEN ROMS FOR ULTIMATE 64" -#endif - -} - startup_banner: -#if CONFIG_BANNER_SIMPLE - - .text " " - BANNER_TEXT() - .byte $00 - -#elif CONFIG_BANNER_FANCY - - BANNER_TEXT() - .byte $00 - -rainbow_logo: - -{ -#if CONFIG_COLORS_BRAND && CONFIG_BRAND_MEGA_65 - - .var SET_COLOR_0 = $05 - .var SET_COLOR_1 = $9A - .var SET_COLOR_2 = $1E - .var SET_COLOR_3 = $9E - .var SET_COLOR_4 = $96 - -#else - - .var SET_COLOR_0 = $05 - .var SET_COLOR_1 = $1C - .var SET_COLOR_2 = $9E - .var SET_COLOR_3 = $1E - .var SET_COLOR_4 = $9F - -#endif - - .byte SET_COLOR_1, $12, $A4, $A4, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_2, $12, $A4, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_3, $12, $A4, $A4, $A4, $A4, $A4, $0D - .byte SET_COLOR_4, $12, $A4, $A4, $A4, $A4, $92 - .byte SET_COLOR_0, $00 -} - -#if !CONFIG_BRAND_CUSTOM_BUILD - -pre_revision_string: - - .text "RELEASE " - .byte $00 - -#endif // no CONFIG_BRAND_CUSTOM_BUILD - -#elif CONFIG_BANNER_BRAND && CONFIG_BRAND_MEGA_65 - // Fancy Mega65 banner - from Retrofan, slightly tweaked .byte $9A, $12, $20, $20, $7F, $A9, $20, $20, $1F, $20, $9A, $20, $20, $20, $20, $1F @@ -135,15 +66,9 @@ pre_revision_string: // .byte $12,$DF,$92,$7F,$9B,$20,$9A,$20,$9B,"0.2.0.0",$0D // .byte $0D,$05,$92,$00 -#if ROM_LAYOUT_M65 - -text_mode_64: +startup_banner_legacy: .text "LEGACY" .byte $11, $9D, $9D, $9D, $9D, $9D .text "MODE" .byte $00 - -#endif - -#endif diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s new file mode 100644 index 00000000..d347bf03 --- /dev/null +++ b/src/basic/init/initmsg_m65.s @@ -0,0 +1,44 @@ +// #LAYOUT# M65 BASIC_1 #TAKE +// #LAYOUT# * * #IGNORE + + +// Routine is too long to fit in the original location + +// XXX banner-related code needs cleanup, move MEGA65 stuff to a separate file + + +INITMSG: + + // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen + lda #147 + jsr JCHROUT + + lda #startup_banner + jsr STROUT + + jsr M65_ISMODE65 + bcc !+ // XXX for MEGA65 native mode, display something else instead + + ldx #$02 + ldy #$21 + jsr plot_set + + lda #startup_banner_legacy + jsr STROUT +!: + + ldx #$05 + ldy #$00 + jsr plot_set + + lda #rom_revision_basic_string + jsr STROUT + + ldx #$05 + ldy #$12 + jsr plot_set + + jsr initmsg_bytes_free diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index 29566f4c..e297a7d7 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -1,24 +1,13 @@ // #LAYOUT# STD * #TAKE -// #LAYOUT# M65 BASIC_1 #TAKE // #LAYOUT# X16 BASIC_0 #TAKE // #LAYOUT# * * #IGNORE // Routine is too long to fit in the original location -// XXX banner-related code needs cleanup, move MEGA65 stuff to a separate file - - -#if ROM_LAYOUT_M65 - -INITMSG: - -#else initmsg_real: -#endif - // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen lda #147 jsr JCHROUT @@ -117,52 +106,4 @@ initmsg_real: jmp plot_set #endif -#elif CONFIG_BANNER_BRAND && CONFIG_BRAND_MEGA_65 - - lda #startup_banner - jsr STROUT - -#if ROM_LAYOUT_M65 - - jsr M65_ISMODE65 - bcc !+ // XXX for MEGA65 native mode, display something else instead - - ldx #$02 - ldy #$21 - jsr plot_set - - lda #text_mode_64 - jsr STROUT -!: - -#endif - - ldx #$05 - ldy #$00 - jsr plot_set - - lda #rom_revision_basic_string - jsr STROUT - - ldx #$05 - ldy #$12 - jsr plot_set - - jsr initmsg_bytes_free - -#if CONFIG_SHOW_FEATURES - ldx #$08 - ldy #$00 - jsr plot_set - jmp print_features -#else - ldx #$07 - ldy #$00 - jmp plot_set -#endif - - #endif diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 8343aa28..f7d3c989 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1226,7 +1226,7 @@ void DataSet::generateConfigDepStrings() // List found - if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"] || GLOBAL_ConfigOptions["CONFIG_BRAND_MEGA_65"]) + if (GLOBAL_ConfigOptions["CONFIG_SHOW_FEATURES"] || GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) { StringEntry newEntry1 = { true, true, true, true, "STR_PAL", "PAL\r" }; StringEntry newEntry2 = { true, true, true, true, "STR_NTSC", "NTSC\r" }; @@ -1241,7 +1241,7 @@ void DataSet::generateConfigDepStrings() stringEntryList.list.push_back(newEntry); } - if (GLOBAL_ConfigOptions["CONFIG_BRAND_MEGA_65"]) + if (GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) { StringEntry newEntry = { false, true, false, false, "STR_SI_FEATURES", featureStrM65 }; stringEntryList.list.push_back(newEntry); From c388e8e64c3c32984974a4f266cdd6e1bfb70870 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 16:59:37 +0200 Subject: [PATCH 29/96] more work on MEGA65 startup info --- src/basic/assets/startup_banner.s | 9 ---- src/basic/basic_commands_02/cmd_sysinfo.s | 16 ++++++- src/basic/board_m65/mega65_imports.s | 4 ++ src/basic/init/initmsg_m65.s | 51 ++++++++++++++++++++++- src/basic/init/initmsg_real.s | 5 +-- tools/generate_strings.cc | 12 ++++-- 6 files changed, 79 insertions(+), 18 deletions(-) diff --git a/src/basic/assets/startup_banner.s b/src/basic/assets/startup_banner.s index 2ae93071..d1096c4f 100644 --- a/src/basic/assets/startup_banner.s +++ b/src/basic/assets/startup_banner.s @@ -53,13 +53,4 @@ rainbow_logo: .byte SET_COLOR_0, $00 } -#if !CONFIG_BRAND_CUSTOM_BUILD - -pre_revision_string: - - .text "RELEASE " - .byte $00 - -#endif // no CONFIG_BRAND_CUSTOM_BUILD - #endif diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s index f8725753..71ea5e83 100644 --- a/src/basic/basic_commands_02/cmd_sysinfo.s +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -37,7 +37,14 @@ cmd_sysinfo: ldy #>rom_revision_basic_string jsr STROUT - // Print board ID + jsr print_return + jsr print_return + + // FALLTROUGH + +print_sysinfo_banner: + + // Print board type ldx #IDX__STR_SI_HDR_HW jsr print_packed_misc_str @@ -52,8 +59,15 @@ cmd_sysinfo: ldy #(__cmd_sysinfo_hw_ids_end - cmd_sysinfo_hw_ids) !: ldx cmd_sysinfo_hw_str, y + phx jsr print_packed_misc_str + plx + cpx #IDX__STR_SI_HW_XX + bne !+ + lda MISC_BOARDID + jsr print_hex_byte +!: // Print video system information ldx #IDX__STR_SI_HDR_VID diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index 53209d8d..2d0d628d 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -25,6 +25,10 @@ .label JREADST = KERNAL_0.JREADST .label SELDEV = KERNAL_0.SELDEV .label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 +.label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY +.label M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH +.label M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y +.label M65_SETWIN_N = KERNAL_0.M65_SETWIN_N .label plot_set = KERNAL_0.plot_set .label init_oldtxt = BASIC_0.init_oldtxt .label tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index d347bf03..d90c9cbe 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -10,15 +10,22 @@ INITMSG: // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen + lda #147 jsr JCHROUT + // Display main banner + lda #startup_banner jsr STROUT + // Display additional information, depending on the mode + jsr M65_ISMODE65 - bcc !+ // XXX for MEGA65 native mode, display something else instead + bcc !+ + + // Legacy mode ldx #$02 ldy #$21 @@ -27,7 +34,8 @@ INITMSG: lda #startup_banner_legacy jsr STROUT -!: + + // Legacy mode - display revision and available memory ldx #$05 ldy #$00 @@ -42,3 +50,42 @@ INITMSG: jsr plot_set jsr initmsg_bytes_free + + ldx #$07 + ldy #$00 + jmp plot_set + +!: + // Native mode + + ldx #48 + ldy #0 + jsr M65_SETWIN_XY + + ldx #32 + ldy #7 + jsr M65_SETWIN_WH + + jsr M65_SETWIN_Y + jsr print_sysinfo_banner + jsr M65_SETWIN_N + + // Native mode - display revision and available memory + + ldx #$05 + ldy #$00 + jsr plot_set + + ldx #IDX__STR_PRE_REV + jsr print_packed_misc_str + + lda #rom_revision_basic_string + jsr STROUT + + jsr print_return + jsr initmsg_bytes_free + + ldx #$08 + ldy #$00 + jmp plot_set diff --git a/src/basic/init/initmsg_real.s b/src/basic/init/initmsg_real.s index e297a7d7..8a38e3e6 100644 --- a/src/basic/init/initmsg_real.s +++ b/src/basic/init/initmsg_real.s @@ -73,9 +73,8 @@ initmsg_real: ldy #$0A jsr plot_set - lda #pre_revision_string - jsr STROUT + ldx #IDX__STR_PRE_REV + jsr print_packed_misc_str lda #rom_revision_basic_string diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index f7d3c989..0fe0b3f2 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -306,7 +306,7 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, { false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, { false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, - { false, true, false, false, "STR_SI_HDR_HW", "\r\rBOARD : " }, + { false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, { false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, { false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, { false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, @@ -316,7 +316,7 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, { false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, { false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, - { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN" }, + { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, { false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, @@ -1211,7 +1211,7 @@ void DataSet::generateConfigDepStrings() // CBDOS features - featureStrM65 += "CBDOS : NO\r"; + featureStrM65 += "CBDOS : NO FDD/SD/RAM SUPPORT\r"; // Keyboard support features @@ -1247,6 +1247,12 @@ void DataSet::generateConfigDepStrings() stringEntryList.list.push_back(newEntry); } + if (!GLOBAL_ConfigOptions["CONFIG_BRAND_CUSTOM_BUILD"] || GLOBAL_ConfigOptions["CONFIG_MB_MEGA_65"]) + { + StringEntry newEntry = { true, true, true, true, "STR_PRE_REV", "RELEASE " }; + stringEntryList.list.push_back(newEntry); + } + break; } } From 6735386f3382cd2ef38f8342d92d133d0024da05 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 17:17:15 +0200 Subject: [PATCH 30/96] small startup tweaks --- src/basic/init/initmsg_m65.s | 8 ++++++-- tools/generate_strings.cc | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index d90c9cbe..39d24c39 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -63,7 +63,7 @@ INITMSG: jsr M65_SETWIN_XY ldx #32 - ldy #7 + ldy #9 jsr M65_SETWIN_WH jsr M65_SETWIN_Y @@ -76,6 +76,9 @@ INITMSG: ldy #$00 jsr plot_set + ldx #IDX__STR_ORS + jsr print_packed_misc_str + ldx #IDX__STR_PRE_REV jsr print_packed_misc_str @@ -83,9 +86,10 @@ INITMSG: ldy #>rom_revision_basic_string jsr STROUT + jsr print_return jsr print_return jsr initmsg_bytes_free - ldx #$08 + ldx #$09 ldy #$00 jmp plot_set diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 0fe0b3f2..c7f9e128 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -293,6 +293,8 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", // STD M65 U64 X16 --- misc strings specific to Open ROMs, not present in CBM ROMs { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, + { false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, + { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, { false, true, false, false, "STR_MEM_1", " $" }, { false, true, false, false, "STR_MEM_2", " " }, From e2cf83489f0d352ca03c9f74cf459a056937240d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 17:24:03 +0200 Subject: [PATCH 31/96] small native/legacy mode switching fixes --- src/basic/basic_commands/cmd_go_goto_run.s | 7 +++++++ src/basic/init/basic_cold_start_internal.s | 3 +++ src/basic/init/initmsg_bytes_free.s | 6 ------ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index cb1395d4..8639d57b 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -56,7 +56,14 @@ cmd_go_syntax_error: cmd_go_switchmode_clr_banner: jsr do_clr + + ldx CURLIN+1 + inx + bne !+ jmp INITMSG +!: + rts + cmd_go_rts: diff --git a/src/basic/init/basic_cold_start_internal.s b/src/basic/init/basic_cold_start_internal.s index e321d9e7..4e14a127 100644 --- a/src/basic/init/basic_cold_start_internal.s +++ b/src/basic/init/basic_cold_start_internal.s @@ -41,5 +41,8 @@ basic_cold_start_internal: // Print startup messages jsr INITMSG + // Initialize other variables by performing NEW + jsr do_new + // jump into warm start loop jmp basic_warm_start diff --git a/src/basic/init/initmsg_bytes_free.s b/src/basic/init/initmsg_bytes_free.s index ed8db16f..97f9f32b 100644 --- a/src/basic/init/initmsg_bytes_free.s +++ b/src/basic/init/initmsg_bytes_free.s @@ -55,12 +55,6 @@ initmsg_bytes_free: #endif sta MEMSIZ+0 - // XXX move the part above to a more suitable place - - // Initialize other variables by performing NEW - - jsr do_new - // Print number of bytes free sec From ad221406175c44e2e5af0e1dc215decda7e6bc82 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 17:44:39 +0200 Subject: [PATCH 32/96] adapted SCREEN rioutine to MEGA65 native mode --- src/basic/basic_commands_02/cmd_sysinfo.s | 17 +++++++++++ src/basic/board_m65/mega65_imports.s | 1 + src/kernal/board_m65/mega65_imports.s | 3 ++ src/kernal/screen/screen.s | 28 +++++++++++++++++++ .../screen_m65/mega65_screen_table_height.s | 9 ++++++ .../screen_m65/mega65_screen_table_width.s | 9 ++++++ src/kernal/screen_m65/mega65_screen_tables.s | 12 -------- 7 files changed, 67 insertions(+), 12 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_screen_table_height.s create mode 100644 src/kernal/screen_m65/mega65_screen_table_width.s diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s index 71ea5e83..08b2d6e4 100644 --- a/src/basic/basic_commands_02/cmd_sysinfo.s +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -73,6 +73,23 @@ print_sysinfo_banner: ldx #IDX__STR_SI_HDR_VID jsr print_packed_misc_str + jsr JSCREEN + + phy + lda #$00 + jsr print_integer + + lda #$58 + jsr JCHROUT + + ply + tya + tax + lda #$00 + jsr print_integer + + jsr print_space + ldx #IDX__STR_NTSC lda TVSFLG beq !+ diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index 2d0d628d..8a2a80ae 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -23,6 +23,7 @@ .label JCHKIN = KERNAL_0.JCHKIN .label JCHRIN = KERNAL_0.JCHRIN .label JREADST = KERNAL_0.JREADST +.label JSCREEN = KERNAL_0.JSCREEN .label SELDEV = KERNAL_0.SELDEV .label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 .label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index e8ebbe9b..bb9c3d10 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -34,6 +34,9 @@ .label wait_x_bars = KERNAL_0.wait_x_bars .label viciv_unhide = KERNAL_0.viciv_unhide +.label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth +.label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight + #if CONFIG_IEC .label iec_set_idle = KERNAL_0.iec_set_idle diff --git a/src/kernal/screen/screen.s b/src/kernal/screen/screen.s index 6b98bdb3..9d11c38b 100644 --- a/src/kernal/screen/screen.s +++ b/src/kernal/screen/screen.s @@ -15,6 +15,8 @@ SCREEN: +#if !ROM_LAYOUT_M65 + // There are only 2 sane ways to implement this routine, // I hope this one is different than what Commodore picked :) @@ -22,3 +24,29 @@ SCREEN: ldx #40 // 40 rows rts + +#else + + php + jsr M65_ISMODE65 + bcc !+ + + plp + + ldy #25 // 25 columns + ldx #40 // 40 rows + + rts +!: + plp + pha + ldy M65_SCRMODE + + ldx m65_scrtab_txtwidth, y + lda m65_scrtab_txtheight, y + tay + + pla + rts + +#endif diff --git a/src/kernal/screen_m65/mega65_screen_table_height.s b/src/kernal/screen_m65/mega65_screen_table_height.s new file mode 100644 index 00000000..7c531313 --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_height.s @@ -0,0 +1,9 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_scrtab_txtheight: // height of the text screen + + .byte 25 + .byte 25 + .byte 50 diff --git a/src/kernal/screen_m65/mega65_screen_table_width.s b/src/kernal/screen_m65/mega65_screen_table_width.s new file mode 100644 index 00000000..1a9a5850 --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_width.s @@ -0,0 +1,9 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_scrtab_txtwidth: // width of the text screen (logical width is always set to 80) + + .byte 40 + .byte 80 + .byte 80 diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables.s index 55a10b18..51d0b7b6 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables.s @@ -8,18 +8,6 @@ m65_scrtab_vic_ctrlb: // parameters for VIC control register B .byte %10100000 // 80x25 + extended attributes .byte %10100100 // 80x50 + extended attributes -m65_scrtab_txtwidth: // width of the text screen (logical width is always set to 80) - - .byte 40 - .byte 80 - .byte 80 - -m65_scrtab_txtheight: // height of the text screen - - .byte 25 - .byte 25 - .byte 50 - m65_scrtab_viewmax_lo: // maximum allowed viewport start - low byte .byte $B0 From 511a30715f4c5dd1f6f6f0e36d4624c27cad0a7d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 20:28:06 +0200 Subject: [PATCH 33/96] started work on VIC-IV cursor --- src/aliases/,aliases_cpu.s | 9 ++ src/kernal/board_m65/mega65_imports.s | 2 + .../interrupts/ea31.default_irq_handler.s | 2 +- src/kernal/screen/cursor.s | 12 ++- src/kernal/screen_m65/mega65_chrout_screen.s | 7 +- src/kernal/screen_m65/mega65_cursor.s | 32 ++++++- src/kernal/screen_m65/mega65_cursor_blink.s | 93 +++++++++++++++++++ .../screen_m65/mega65_screen_table_roff_hi.s | 13 +++ .../screen_m65/mega65_screen_table_roff_lo.s | 13 +++ ...n_tables.s => mega65_screen_tables_misc.s} | 16 ---- 10 files changed, 175 insertions(+), 24 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_cursor_blink.s create mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_hi.s create mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_lo.s rename src/kernal/screen_m65/{mega65_screen_tables.s => mega65_screen_tables_misc.s} (61%) diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index f1ad4b98..ddaee704 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -338,6 +338,15 @@ // Flat memory access support +.pseudocommand lda_lp arg { + .var value = arg.getValue() + .var type = arg.getType() + .if(type != AT_IZEROPAGEZ) .error "'lda_lp' only accepts AT_IZEROPAGEZ" + .if(value > $FF ) .error "'lda_lp' requires zeropage address" + nop + .byte $B2, value +} + .pseudocommand sta_lp arg { .var value = arg.getValue() .var type = arg.getType() diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index bb9c3d10..1bd3fb2a 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -34,6 +34,8 @@ .label wait_x_bars = KERNAL_0.wait_x_bars .label viciv_unhide = KERNAL_0.viciv_unhide +.label m65_scrtab_rowoffset_lo = KERNAL_0.m65_scrtab_rowoffset_lo +.label m65_scrtab_rowoffset_hi = KERNAL_0.m65_scrtab_rowoffset_hi .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight diff --git a/src/kernal/interrupts/ea31.default_irq_handler.s b/src/kernal/interrupts/ea31.default_irq_handler.s index 4dbe8ed9..f15f2305 100644 --- a/src/kernal/interrupts/ea31.default_irq_handler.s +++ b/src/kernal/interrupts/ea31.default_irq_handler.s @@ -18,7 +18,7 @@ default_irq_handler: #if ROM_LAYOUT_M65 jsr M65_ISMODE65 - bne !+ + bcs !+ jsr m65_cursor_blink diff --git a/src/kernal/screen/cursor.s b/src/kernal/screen/cursor.s index 7021133a..999c40d4 100644 --- a/src/kernal/screen/cursor.s +++ b/src/kernal/screen/cursor.s @@ -17,6 +17,7 @@ cursor_blink: + // Is the cursor enabled? lda BLNSW bne cursor_blink_end @@ -50,26 +51,31 @@ cursor_draw: bne cursor_blink_timer_reset // branches always cursor_disable: + lda #$80 sta BLNSW // FALLTHROUGH cursor_hide_if_visible: + lda BLNON beq cursor_blink_end + // FALLTROUGH + cursor_undraw: + // Prevent interrupts from updating cursor + lda #0 + sta BLNON + jsr screen_get_clipped_PNTR lda GDBLN sta (PNT),y lda GDCOL sta (USER),y - lda #0 - sta BLNON - // FALLTROUGH cursor_blink_timer_reset: diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index c438276d..708a5272 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -8,7 +8,9 @@ m65_chrout_screen: - // XXX hide cursor if visible + jsr m65_cursor_hide_if_visible + + // Retrieve the character to output lda SCHAR tax @@ -127,6 +129,7 @@ m65_chrout_fix_column_row_win: m65_chrout_screen_done: - // XXX reenable cursor + jsr m65_cursor_show_if_enabled + // XXX change this to return success rts diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 091294bd..db0d6b8a 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -1,9 +1,37 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE +// +// Variables used: +// - BLNSW (cursor blink switch) +// - BLNCT (cursor blink countdown) +// - GDBLN (cursor saved character) +// - BLNON (if cursor is visible) +// - GDCOL (colour under cursor) +// -m65_cursor_blink: +m65_cursor_hide_if_visible: + + lda BLNON + beq m65_cursor_end + + // FALLTROUGH + +m65_cursor_undraw: // XXX provide implementation rts + + +m65_cursor_show_if_enabled: + + // XXX provide implementation + + nop + + // FALLTROUGH + +m65_cursor_end: + + rts diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s new file mode 100644 index 00000000..ea8bfd9c --- /dev/null +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -0,0 +1,93 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Variables used: +// - BLNSW (cursor blink switch) +// - BLNCT (cursor blink countdown) +// - GDBLN (cursor saved character) +// - BLNON (if cursor is visible) +// - GDCOL (colour under cursor) +// + + +m65_cursor_blink: + + // Preserve .Z + phz + + // Is the cursor enabled? + lda BLNSW + bne m65_cursor_blink_end + + // Do we need to redraw things? + dec BLNCT + bpl m65_cursor_blink_end + + // Prepare .Z and long pointer to screen position + ldz M65__TXTCOL + lda M65_SCRVIEW+0 + sta M65_LPNT_IRQ+0 + lda M65_SCRVIEW+1 + sta M65_LPNT_IRQ+1 + lda M65_SCRSEG+0 + sta M65_LPNT_IRQ+2 + lda M65_SCRSEG+1 + sta M65_LPNT_IRQ+3 + + // Add row offset to the long pointer + ldy M65__TXTROW + clc + lda m65_scrtab_rowoffset_lo,y + adc M65_LPNT_IRQ+0 + sta M65_LPNT_IRQ+0 + lda m65_scrtab_rowoffset_hi,y + adc M65_LPNT_IRQ+1 + sta M65_LPNT_IRQ+1 + + // Check if cursor was visible or not, and toggle + lda BLNON + bne m65_cursor_blink_undraw + + // FALLTROUGH + +m65_cursor_blink_draw: + + lda #1 + sta BLNON + + // Cursor draw - character + lda_lp (M65_LPNT_IRQ),z + sta GDBLN + eor #$80 + sta_lp (M65_LPNT_IRQ),z + + // Cursor draw - color + // XXX provide implementation + +m65_cursor_blink_timer_reset: + + // Rest blink counter (Mapping the 64, p39-40) + lda #20 + sta BLNCT + + // FALLTROUGH + +m65_cursor_blink_end: + + plz + rts + +m65_cursor_blink_undraw: + + lda #0 + sta BLNON + + // Cursor undraw - character + lda GDBLN + sta_lp (M65_LPNT_IRQ),z + + // Cursor undraw - color + // XXX provide implementation + + jmp_8 m65_cursor_blink_timer_reset diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_hi.s b/src/kernal/screen_m65/mega65_screen_table_roff_hi.s new file mode 100644 index 00000000..15435e4a --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_roff_hi.s @@ -0,0 +1,13 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// XXX consider moving this back to extended memory, and just store the offset in RAM + +m65_scrtab_rowoffset_hi: // row offsets - high bytes + + .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) + .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) + .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) + .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) + .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) \ No newline at end of file diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_lo.s b/src/kernal/screen_m65/mega65_screen_table_roff_lo.s new file mode 100644 index 00000000..1327984f --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_table_roff_lo.s @@ -0,0 +1,13 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +// XXX consider moving this back to extended memory, and just store the offset in RAM + +m65_scrtab_rowoffset_lo: // row offsets - low bytes + + .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) + .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) + .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) + .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) + .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) diff --git a/src/kernal/screen_m65/mega65_screen_tables.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s similarity index 61% rename from src/kernal/screen_m65/mega65_screen_tables.s rename to src/kernal/screen_m65/mega65_screen_tables_misc.s index 51d0b7b6..7dc0c5fd 100644 --- a/src/kernal/screen_m65/mega65_screen_tables.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -26,22 +26,6 @@ m65_scrtab_scrolx: // values for VIC_SCROLX .byte $CA .byte $CA -m65_scrtab_rowoffset_lo: // row offsets - low bytes - - .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) - .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) - .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) - .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) - .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) - -m65_scrtab_rowoffset_hi: // row offsets - high bytes - - .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) - .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) - .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) - .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) - .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) - // Jumptable for screen control codes support. To improve performance, should be sorted // starting from the least probable routine. From 19b45af1977e9594e6becf0c7641f1c5a99efc9e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 20:44:55 +0200 Subject: [PATCH 34/96] VIC-IV mode has now a blinking cursor (support not complete yet) --- src/kernal/screen_m65/mega65_cursor.s | 7 ++- src/kernal/screen_m65/mega65_cursor_blink.s | 69 ++++++++++++++++----- 2 files changed, 57 insertions(+), 19 deletions(-) diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index db0d6b8a..7c89e4ea 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -21,14 +21,17 @@ m65_cursor_undraw: // XXX provide implementation - rts + lda #$80 + sta BLNSW + rts m65_cursor_show_if_enabled: // XXX provide implementation - nop + lda #$00 + sta BLNSW // FALLTROUGH diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s index ea8bfd9c..dfe40955 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink.s +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -24,27 +24,31 @@ m65_cursor_blink: dec BLNCT bpl m65_cursor_blink_end - // Prepare .Z and long pointer to screen position + // Prepare .Z for offset within row ldz M65__TXTCOL - lda M65_SCRVIEW+0 - sta M65_LPNT_IRQ+0 - lda M65_SCRVIEW+1 - sta M65_LPNT_IRQ+1 - lda M65_SCRSEG+0 - sta M65_LPNT_IRQ+2 - lda M65_SCRSEG+1 - sta M65_LPNT_IRQ+3 - // Add row offset to the long pointer + // Prepare long pointer to color memory + lda #$0F + sta M65_LPNT_IRQ+3 + lda #$F8 + sta M65_LPNT_IRQ+2 + + lda M65_COLVIEW+1 + sta M65_LPNT_IRQ+1 + lda M65_COLVIEW+0 + sta M65_LPNT_IRQ+0 + + // Add screen row to the address ldy M65__TXTROW clc lda m65_scrtab_rowoffset_lo,y adc M65_LPNT_IRQ+0 - sta M65_LPNT_IRQ+0 + sta M65_LPNT_IRQ+0 lda m65_scrtab_rowoffset_hi,y adc M65_LPNT_IRQ+1 sta M65_LPNT_IRQ+1 + // Check if cursor was visible or not, and toggle lda BLNON bne m65_cursor_blink_undraw @@ -56,15 +60,22 @@ m65_cursor_blink_draw: lda #1 sta BLNON + // Cursor draw - color + lda_lp (M65_LPNT_IRQ),z + sta GDCOL + lda COLOR + and #$0F + sta_lp (M65_LPNT_IRQ),z + + // Rework pointer to point to screnn memory + jsr m65_cursor_blink_adapt_ptr + // Cursor draw - character lda_lp (M65_LPNT_IRQ),z sta GDBLN eor #$80 sta_lp (M65_LPNT_IRQ),z - // Cursor draw - color - // XXX provide implementation - m65_cursor_blink_timer_reset: // Rest blink counter (Mapping the 64, p39-40) @@ -83,11 +94,35 @@ m65_cursor_blink_undraw: lda #0 sta BLNON + // Cursor undraw - color + lda GDCOL + sta_lp (M65_LPNT_IRQ),z + + // Rework pointer to point to screnn memory + jsr m65_cursor_blink_adapt_ptr + // Cursor undraw - character lda GDBLN sta_lp (M65_LPNT_IRQ),z - // Cursor undraw - color - // XXX provide implementation - jmp_8 m65_cursor_blink_timer_reset + + +m65_cursor_blink_adapt_ptr: + + // Adapt pointer to point to screen memory + + lda M65_SCRSEG+1 + sta M65_LPNT_IRQ+3 + lda M65_SCRSEG+0 + sta M65_LPNT_IRQ+2 + + clc + lda M65_SCRBASE+0 + adc M65_LPNT_IRQ+0 + sta M65_LPNT_IRQ+0 + lda M65_SCRBASE+1 + adc M65_LPNT_IRQ+1 + sta M65_LPNT_IRQ+1 + + rts From 9e94b9d78c9749b69fb0c2eecb283b8ac78422bb Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 21:44:38 +0200 Subject: [PATCH 35/96] VIC-IV screen code optimizations --- src/aliases/,aliases_ram_lowmem_m65.s | 3 +- src/basic/,imports.s | 1 + src/basic/board_m65/mega65_imports.s | 4 +-- src/basic/board_m65/mega65_proxies.s | 14 ++++---- .../board_m65/4000.mega65_vectable_kernal_1.s | 32 ++++++++++--------- src/kernal/board_m65/mega65_imports.s | 2 -- src/kernal/board_m65/mega65_redirect_screen.s | 10 ++++-- .../screen/e56c.screen_calculate_pointers.s | 4 +++ src/kernal/screen_m65/mega65_chrout_screen.s | 13 +++++--- src/kernal/screen_m65/mega65_clrscr.s | 2 ++ src/kernal/screen_m65/mega65_cursor_blink.s | 30 +++-------------- .../mega65_cursor_blink_rework_ptr.s | 22 +++++++++++++ .../screen_m65/mega65_screen_table_roff_hi.s | 13 -------- .../screen_m65/mega65_screen_table_roff_lo.s | 13 -------- .../screen_m65/mega65_screen_tables_misc.s | 16 ++++++++++ .../screen_m65/mega65_screen_upd_txtrow_off.s | 13 ++++++++ src/kernal/screen_m65/mega65_setwin.s | 2 ++ 17 files changed, 109 insertions(+), 85 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s delete mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_hi.s delete mode 100644 src/kernal/screen_m65/mega65_screen_table_roff_lo.s create mode 100644 src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 1391e59d..1f8064db 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -49,6 +49,7 @@ .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 - // $592-$5FF -- UNUSED -- + .label M65_TXTROW_OFF = $592 // $592-$594 offset to the current text row + // $594-$5FF -- UNUSED -- .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 99d9333b..1e9b0319 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -36,6 +36,7 @@ .label hw_entry_reset = KERNAL().hw_entry_reset .label clear_screen = KERNAL().clear_screen +.label M65_SETWIN_Y = KERNAL().M65_SETWIN_Y #if CONFIG_DBG_PRINTF .label printf = KERNAL().printf diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index 8a2a80ae..f7d7af97 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -12,6 +12,7 @@ .label poke_via_OLDTXT = BASIC_0.proxy_B1_poke_via_OLDTXT .label JCHROUT = BASIC_0.proxy_B1_JCHROUT .label JCLALL = BASIC_0.proxy_B1_JCLALL +.label plot_set = BASIC_0.proxy_B1_plot_set #if CONFIG_DOS_WEDGE .label JCLOSE = BASIC_0.proxy_B1_JCLOSE .label JOPEN = BASIC_0.proxy_B1_JOPEN @@ -28,9 +29,8 @@ .label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 .label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY .label M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH -.label M65_SETWIN_Y = KERNAL_0.M65_SETWIN_Y +.label M65_SETWIN_Y = BASIC_0.proxy_B1_M65_SETWIN_Y .label M65_SETWIN_N = KERNAL_0.M65_SETWIN_N -.label plot_set = KERNAL_0.plot_set .label init_oldtxt = BASIC_0.init_oldtxt .label tmpstr_free_all_reset = BASIC_0.tmpstr_free_all_reset .label rom_revision_basic_string = BASIC_0.rom_revision_basic_string diff --git a/src/basic/board_m65/mega65_proxies.s b/src/basic/board_m65/mega65_proxies.s index 2891b466..29350754 100644 --- a/src/basic/board_m65/mega65_proxies.s +++ b/src/basic/board_m65/mega65_proxies.s @@ -29,7 +29,6 @@ proxy_B1_poke_via_OLDTXT: #endif jmp map_BASIC_1 - proxy_B1_JCLALL: jsr map_NORMAL @@ -85,16 +84,17 @@ proxy_B1_print_space: jsr print_space jmp map_BASIC_1 - -#if CONFIG_SHOW_FEATURES - -proxy_B1_print_features: +proxy_B1_plot_set: jsr map_NORMAL - jsr print_features + jsr plot_set jmp map_BASIC_1 -#endif +proxy_B1_M65_SETWIN_Y: + + jsr map_NORMAL + jsr M65_SETWIN_Y + jmp map_BASIC_1 #if CONFIG_DOS_WEDGE diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 6e6a7dd5..87d0a1f3 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -11,20 +11,21 @@ // Label definitions - .label VK1__IOINIT = $4000 + 2 * 0 - .label VK1__RAMTAS = $4000 + 2 * 1 - .label VK1__setup_vicii = $4000 + 2 * 2 - .label VK1__load_tape_normal = $4000 + 2 * 3 - .label VK1__load_tape_turbo = $4000 + 2 * 4 - .label VK1__load_tape_auto = $4000 + 2 * 5 - .label VK1__tape_head_align = $4000 + 2 * 6 - .label VK1__m65_chrout_screen = $4000 + 2 * 7 - .label VK1__M65_MODE64 = $4000 + 2 * 8 - .label VK1__M65_MODE65 = $4000 + 2 * 9 - .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 - .label VK1__M65_SCRMODESET = $4000 + 2 * 11 - .label VK1__M65_CLRSCR = $4000 + 2 * 12 - .label VK1__M65_CLRWIN = $4000 + 2 * 13 + .label VK1__IOINIT = $4000 + 2 * 0 + .label VK1__RAMTAS = $4000 + 2 * 1 + .label VK1__setup_vicii = $4000 + 2 * 2 + .label VK1__load_tape_normal = $4000 + 2 * 3 + .label VK1__load_tape_turbo = $4000 + 2 * 4 + .label VK1__load_tape_auto = $4000 + 2 * 5 + .label VK1__tape_head_align = $4000 + 2 * 6 + .label VK1__m65_chrout_screen = $4000 + 2 * 7 + .label VK1__M65_MODE64 = $4000 + 2 * 8 + .label VK1__M65_MODE65 = $4000 + 2 * 9 + .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 + .label VK1__M65_SCRMODESET = $4000 + 2 * 11 + .label VK1__M65_CLRSCR = $4000 + 2 * 12 + .label VK1__M65_CLRWIN = $4000 + 2 * 13 + .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 #else @@ -65,6 +66,7 @@ .word M65_SCRMODEGET .word M65_SCRMODESET .word M65_CLRSCR - .word M65_CLRWIN + .word M65_CLRWIN + .word m65_screen_upd_txtrow_off #endif diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 1bd3fb2a..bb9c3d10 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -34,8 +34,6 @@ .label wait_x_bars = KERNAL_0.wait_x_bars .label viciv_unhide = KERNAL_0.viciv_unhide -.label m65_scrtab_rowoffset_lo = KERNAL_0.m65_scrtab_rowoffset_lo -.label m65_scrtab_rowoffset_hi = KERNAL_0.m65_scrtab_rowoffset_hi .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight diff --git a/src/kernal/board_m65/mega65_redirect_screen.s b/src/kernal/board_m65/mega65_redirect_screen.s index 9ca9c889..18dacdaf 100644 --- a/src/kernal/board_m65/mega65_redirect_screen.s +++ b/src/kernal/board_m65/mega65_redirect_screen.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// ROM routine call redirect for Mega65 screen routines +// ROM routine call redirect for MEGA65 screen routines // @@ -11,4 +11,10 @@ m65_chrout_screen: jsr map_KERNAL_1 jsr_ind VK1__m65_chrout_screen jsr map_NORMAL - jmp chrout_done_success + jmp chrout_done_success + +m65_screen_upd_txtrow_off: + + jsr map_KERNAL_1 + jsr_ind VK1__m65_screen_upd_txtrow_off + jmp map_NORMAL diff --git a/src/kernal/screen/e56c.screen_calculate_pointers.s b/src/kernal/screen/e56c.screen_calculate_pointers.s index cb4194b9..87286443 100644 --- a/src/kernal/screen/e56c.screen_calculate_pointers.s +++ b/src/kernal/screen/e56c.screen_calculate_pointers.s @@ -15,5 +15,9 @@ screen_calculate_pointers: + jsr M65_ISMODE65 + bcs !+ + jmp m65_screen_upd_txtrow_off +!: jsr screen_calculate_PNT_USER jmp screen_calculate_PNTR_LNMX diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 708a5272..b315630f 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -53,12 +53,11 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote // Add screen row to the address - ldy M65__TXTROW clc - lda m65_scrtab_rowoffset_lo,y + lda M65_TXTROW_OFF+0 adc M65_LPNT_SCR+0 sta M65_LPNT_SCR+0 - lda m65_scrtab_rowoffset_hi,y + lda M65_TXTROW_OFF+1 adc M65_LPNT_SCR+1 sta M65_LPNT_SCR+1 @@ -113,7 +112,7 @@ m65_chrout_fix_column_row: // XXX provide implementation // XXX - jmp_8 m65_chrout_screen_done + jmp_8 m65_chrout_fix_txtrow_off m65_chrout_fix_column_row_win: @@ -127,6 +126,12 @@ m65_chrout_fix_column_row_win: // FALLTROUGH +m65_chrout_fix_txtrow_off: + + jsr m65_screen_upd_txtrow_off + + // FALLTROUGH + m65_chrout_screen_done: jsr m65_cursor_show_if_enabled diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 6c252914..1168571c 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -118,5 +118,7 @@ m65_clrscr_loop: lda #$00 sta M65__TXTROW sta M65__TXTCOL + sta M65_TXTROW_OFF+0 + sta M65_TXTROW_OFF+1 rts diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s index dfe40955..6fb5e549 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink.s +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -39,16 +39,14 @@ m65_cursor_blink: sta M65_LPNT_IRQ+0 // Add screen row to the address - ldy M65__TXTROW clc - lda m65_scrtab_rowoffset_lo,y + lda M65_TXTROW_OFF+0 adc M65_LPNT_IRQ+0 sta M65_LPNT_IRQ+0 - lda m65_scrtab_rowoffset_hi,y + lda M65_TXTROW_OFF+1 adc M65_LPNT_IRQ+1 sta M65_LPNT_IRQ+1 - // Check if cursor was visible or not, and toggle lda BLNON bne m65_cursor_blink_undraw @@ -68,7 +66,7 @@ m65_cursor_blink_draw: sta_lp (M65_LPNT_IRQ),z // Rework pointer to point to screnn memory - jsr m65_cursor_blink_adapt_ptr + jsr m65_cursor_blink_rework_ptr // Cursor draw - character lda_lp (M65_LPNT_IRQ),z @@ -99,30 +97,10 @@ m65_cursor_blink_undraw: sta_lp (M65_LPNT_IRQ),z // Rework pointer to point to screnn memory - jsr m65_cursor_blink_adapt_ptr + jsr m65_cursor_blink_rework_ptr // Cursor undraw - character lda GDBLN sta_lp (M65_LPNT_IRQ),z jmp_8 m65_cursor_blink_timer_reset - - -m65_cursor_blink_adapt_ptr: - - // Adapt pointer to point to screen memory - - lda M65_SCRSEG+1 - sta M65_LPNT_IRQ+3 - lda M65_SCRSEG+0 - sta M65_LPNT_IRQ+2 - - clc - lda M65_SCRBASE+0 - adc M65_LPNT_IRQ+0 - sta M65_LPNT_IRQ+0 - lda M65_SCRBASE+1 - adc M65_LPNT_IRQ+1 - sta M65_LPNT_IRQ+1 - - rts diff --git a/src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s b/src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s new file mode 100644 index 00000000..7aaffcc0 --- /dev/null +++ b/src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s @@ -0,0 +1,22 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_cursor_blink_rework_ptr: + + // Adapt pointer to point to screen memory + + lda M65_SCRSEG+1 + sta M65_LPNT_IRQ+3 + lda M65_SCRSEG+0 + sta M65_LPNT_IRQ+2 + + clc + lda M65_SCRBASE+0 + adc M65_LPNT_IRQ+0 + sta M65_LPNT_IRQ+0 + lda M65_SCRBASE+1 + adc M65_LPNT_IRQ+1 + sta M65_LPNT_IRQ+1 + + rts diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_hi.s b/src/kernal/screen_m65/mega65_screen_table_roff_hi.s deleted file mode 100644 index 15435e4a..00000000 --- a/src/kernal/screen_m65/mega65_screen_table_roff_hi.s +++ /dev/null @@ -1,13 +0,0 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE - - -// XXX consider moving this back to extended memory, and just store the offset in RAM - -m65_scrtab_rowoffset_hi: // row offsets - high bytes - - .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) - .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) - .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) - .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) - .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) \ No newline at end of file diff --git a/src/kernal/screen_m65/mega65_screen_table_roff_lo.s b/src/kernal/screen_m65/mega65_screen_table_roff_lo.s deleted file mode 100644 index 1327984f..00000000 --- a/src/kernal/screen_m65/mega65_screen_table_roff_lo.s +++ /dev/null @@ -1,13 +0,0 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE -// #LAYOUT# * * #IGNORE - - -// XXX consider moving this back to extended memory, and just store the offset in RAM - -m65_scrtab_rowoffset_lo: // row offsets - low bytes - - .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) - .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) - .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) - .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) - .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 7dc0c5fd..51d0b7b6 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -26,6 +26,22 @@ m65_scrtab_scrolx: // values for VIC_SCROLX .byte $CA .byte $CA +m65_scrtab_rowoffset_lo: // row offsets - low bytes + + .byte <(80 * 0), <(80 * 1), <(80 * 2), <(80 * 3), <(80 * 4), <(80 * 5), <(80 * 6), <(80 * 7), <(80 * 8), <(80 * 9) + .byte <(80 * 10), <(80 * 11), <(80 * 12), <(80 * 13), <(80 * 14), <(80 * 15), <(80 * 16), <(80 * 17), <(80 * 18), <(80 * 19) + .byte <(80 * 20), <(80 * 21), <(80 * 22), <(80 * 23), <(80 * 24), <(80 * 25), <(80 * 26), <(80 * 27), <(80 * 28), <(80 * 29) + .byte <(80 * 30), <(80 * 31), <(80 * 32), <(80 * 33), <(80 * 34), <(80 * 35), <(80 * 36), <(80 * 37), <(80 * 38), <(80 * 39) + .byte <(80 * 40), <(80 * 41), <(80 * 42), <(80 * 43), <(80 * 44), <(80 * 45), <(80 * 46), <(80 * 47), <(80 * 48), <(80 * 49) + +m65_scrtab_rowoffset_hi: // row offsets - high bytes + + .byte >(80 * 0), >(80 * 1), >(80 * 2), >(80 * 3), >(80 * 4), >(80 * 5), >(80 * 6), >(80 * 7), >(80 * 8), >(80 * 9) + .byte >(80 * 10), >(80 * 11), >(80 * 12), >(80 * 13), >(80 * 14), >(80 * 15), >(80 * 16), >(80 * 17), >(80 * 18), >(80 * 19) + .byte >(80 * 20), >(80 * 21), >(80 * 22), >(80 * 23), >(80 * 24), >(80 * 25), >(80 * 26), >(80 * 27), >(80 * 28), >(80 * 29) + .byte >(80 * 30), >(80 * 31), >(80 * 32), >(80 * 33), >(80 * 34), >(80 * 35), >(80 * 36), >(80 * 37), >(80 * 38), >(80 * 39) + .byte >(80 * 40), >(80 * 41), >(80 * 42), >(80 * 43), >(80 * 44), >(80 * 45), >(80 * 46), >(80 * 47), >(80 * 48), >(80 * 49) + // Jumptable for screen control codes support. To improve performance, should be sorted // starting from the least probable routine. diff --git a/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s b/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s new file mode 100644 index 00000000..a3e16566 --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s @@ -0,0 +1,13 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_screen_upd_txtrow_off: + + ldy M65__TXTROW + lda m65_scrtab_rowoffset_lo,y + sta M65_TXTROW_OFF+0 + lda m65_scrtab_rowoffset_hi,y + sta M65_TXTROW_OFF+1 + + rts diff --git a/src/kernal/screen_m65/mega65_setwin.s b/src/kernal/screen_m65/mega65_setwin.s index f900c5b8..7204be16 100644 --- a/src/kernal/screen_m65/mega65_setwin.s +++ b/src/kernal/screen_m65/mega65_setwin.s @@ -52,5 +52,7 @@ M65_SETWIN_Y: lda M65_TXTWIN_Y0 sta M65__TXTROW + jsr m65_screen_upd_txtrow_off + pla rts From 0b747ded64480d1d0835f94e721c1af9acaefbb0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 21:50:50 +0200 Subject: [PATCH 36/96] compilation fixes --- src/basic/,imports.s | 2 +- src/kernal/screen/e56c.screen_calculate_pointers.s | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/basic/,imports.s b/src/basic/,imports.s index 1e9b0319..f8e402dd 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -36,7 +36,6 @@ .label hw_entry_reset = KERNAL().hw_entry_reset .label clear_screen = KERNAL().clear_screen -.label M65_SETWIN_Y = KERNAL().M65_SETWIN_Y #if CONFIG_DBG_PRINTF .label printf = KERNAL().printf @@ -61,4 +60,5 @@ .label M65_ISMODE65 = KERNAL().M65_ISMODE65 .label M65_SLOW = KERNAL().M65_SLOW .label M65_FAST = KERNAL().M65_FAST +.label M65_SETWIN_Y = KERNAL().M65_SETWIN_Y #endif diff --git a/src/kernal/screen/e56c.screen_calculate_pointers.s b/src/kernal/screen/e56c.screen_calculate_pointers.s index 87286443..ab0d632d 100644 --- a/src/kernal/screen/e56c.screen_calculate_pointers.s +++ b/src/kernal/screen/e56c.screen_calculate_pointers.s @@ -15,9 +15,12 @@ screen_calculate_pointers: +#if ROM_LAYOUT_M65 + jsr M65_ISMODE65 - bcs !+ - jmp m65_screen_upd_txtrow_off -!: + bcc_16 m65_screen_upd_txtrow_off + +#endif + jsr screen_calculate_PNT_USER jmp screen_calculate_PNTR_LNMX From 7527c7a2204857bbc7c57743930a484908bb630c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 22:44:22 +0200 Subject: [PATCH 37/96] fix for possible cursor-related scren corruption --- src/kernal/screen/cursor.s | 18 +++++++++---- src/kernal/screen/cursor_show.s | 2 ++ src/kernal/screen_m65/mega65_cursor.s | 38 +++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/kernal/screen/cursor.s b/src/kernal/screen/cursor.s index 999c40d4..f01eccf6 100644 --- a/src/kernal/screen/cursor.s +++ b/src/kernal/screen/cursor.s @@ -50,6 +50,9 @@ cursor_draw: bne cursor_blink_timer_reset // branches always + +// XXX code below is probably not 100% safe + cursor_disable: lda #$80 @@ -59,23 +62,27 @@ cursor_disable: cursor_hide_if_visible: + // Set countdown to high value, to prevent IRQ interference + lda #$FF + sta BLNCT + + // If cursor is not visible, nothing to do lda BLNON - beq cursor_blink_end + beq cursor_blink_timer_reset // FALLTROUGH cursor_undraw: - // Prevent interrupts from updating cursor - lda #0 - sta BLNON - jsr screen_get_clipped_PNTR lda GDBLN sta (PNT),y lda GDCOL sta (USER),y + lda #0 + sta BLNON + // FALLTROUGH cursor_blink_timer_reset: @@ -87,4 +94,5 @@ cursor_blink_timer_reset: // FALLTROUGH cursor_blink_end: + rts diff --git a/src/kernal/screen/cursor_show.s b/src/kernal/screen/cursor_show.s index d700679f..5a9ad31e 100644 --- a/src/kernal/screen/cursor_show.s +++ b/src/kernal/screen/cursor_show.s @@ -12,6 +12,7 @@ cursor_show_if_enabled: + lda BLNSW bne cursor_show_end lda BLNON @@ -36,4 +37,5 @@ cursor_show: // FALLTROUGH cursor_show_end: + rts diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 7c89e4ea..b30eae5c 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -10,10 +10,28 @@ // - GDCOL (colour under cursor) // + +m65_cursor_disable: // XXX utilize this! + + // Make sure IRQ won't interfere by increasing the counter XXX reuse in legacy mode + lda #$FF + sta BLNCT + + // Disable cursor blinking + lda #$80 + sta BLNSW + + // FALLTHROUGH + m65_cursor_hide_if_visible: + // Set countdown to high value, to prevent IRQ interference + lda #$FF + sta BLNCT + + // If cursor is not visible, nothing to do lda BLNON - beq m65_cursor_end + beq m65_cursor_blink_timer_reset // FALLTROUGH @@ -21,8 +39,10 @@ m65_cursor_undraw: // XXX provide implementation - lda #$80 - sta BLNSW + + // Mark cursor as not drawn + lda #0 + sta BLNON rts @@ -35,6 +55,14 @@ m65_cursor_show_if_enabled: // FALLTROUGH -m65_cursor_end: +m65_cursor_blink_timer_reset: // XXX reuse code from main KERNAL - rts + // Rest blink counter (Mapping the 64, p39-40) + lda #20 + sta BLNCT + + // FALLTROUGH + +m65_cursor_blink_end: + + rts \ No newline at end of file From 642958cddc7aa60d6334f48630189edb0d046ba0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 23 Aug 2020 23:39:17 +0200 Subject: [PATCH 38/96] VIC-IV cursor is now complete --- src/kernal/board_m65/mega65_imports.s | 3 ++ src/kernal/screen/cursor.s | 13 +++-- src/kernal/screen/cursor_show.s | 19 +++---- src/kernal/screen_m65/mega65_chrout_screen.s | 46 ++++------------ src/kernal/screen_m65/mega65_clrscr.s | 2 + src/kernal/screen_m65/mega65_clrwin.s | 2 + src/kernal/screen_m65/mega65_cursor.s | 45 ++++++---------- src/kernal/screen_m65/mega65_cursor_blink.s | 17 +++--- ...=> mega65_cursor_blink_irqpnt_to_screen.s} | 2 +- src/kernal/screen_m65/mega65_screen_helpers.s | 54 +++++++++++++++++++ 10 files changed, 108 insertions(+), 95 deletions(-) rename src/kernal/screen_m65/{mega65_cursor_blink_rework_ptr.s => mega65_cursor_blink_irqpnt_to_screen.s} (90%) create mode 100644 src/kernal/screen_m65/mega65_screen_helpers.s diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index bb9c3d10..530b11e4 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -36,6 +36,9 @@ .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight +.label cursor_undraw_cont = KERNAL_0.cursor_undraw_cont +.label cursor_timer_reset = KERNAL_0.cursor_timer_reset +.label cursor_show_if_enabled = KERNAL_0.cursor_show_if_enabled #if CONFIG_IEC diff --git a/src/kernal/screen/cursor.s b/src/kernal/screen/cursor.s index f01eccf6..4058778b 100644 --- a/src/kernal/screen/cursor.s +++ b/src/kernal/screen/cursor.s @@ -48,7 +48,7 @@ cursor_draw: lda #1 sta BLNON - bne cursor_blink_timer_reset // branches always + bne cursor_timer_reset // branches always // XXX code below is probably not 100% safe @@ -66,9 +66,9 @@ cursor_hide_if_visible: lda #$FF sta BLNCT - // If cursor is not visible, nothing to do + // If cursor is not visible, not much to do lda BLNON - beq cursor_blink_timer_reset + beq cursor_timer_reset // FALLTROUGH @@ -80,12 +80,17 @@ cursor_undraw: lda GDCOL sta (USER),y + // FALLTROUGH + +cursor_undraw_cont: // entry point used by MEGA65 screen editor + + // Mark cursor as not drawn lda #0 sta BLNON // FALLTROUGH -cursor_blink_timer_reset: +cursor_timer_reset: // Rest blink counter (Mapping the 64, p39-40) lda #20 diff --git a/src/kernal/screen/cursor_show.s b/src/kernal/screen/cursor_show.s index 5a9ad31e..585ce97e 100644 --- a/src/kernal/screen/cursor_show.s +++ b/src/kernal/screen/cursor_show.s @@ -14,28 +14,21 @@ cursor_show_if_enabled: lda BLNSW - bne cursor_show_end + bne !+ lda BLNON - bne cursor_show_end + bne !+ // FALLTROUGH cursor_show: - // Set cursor as though it had just finished the off phase, - // so that the call to cursor_blink paints it - lda #$00 - sta BLNCT - sta BLNON - jsr cursor_blink + // Set the cursor so that it is going to be repainted by the next IRQ - // Then set the timeout to 1 frame, so that the cursor - // blinks under key repeat conditions, like on the original KERNAL lda #$01 sta BLNCT - // FALLTROUGH - -cursor_show_end: + lda #$00 + sta BLNON +!: rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index b315630f..8e6564c9 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -34,32 +34,13 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote tax // store screen code, we need .A for calculations - // Preserve .Z on stack, use it toi store screen columnt + // Preserve .Z on stack phz - ldz M65__TXTCOL - // Start from setting M65_LPNT_SCR to point colour memory (starts from $FF80000) + // Prepare .Z and M65_LPNT_SCR for colour memory manipulation - lda #$0F - sta M65_LPNT_SCR+3 - lda #$F8 - sta M65_LPNT_SCR+2 - - lda M65_COLVIEW+1 - sta M65_LPNT_SCR+1 - lda M65_COLVIEW+0 - sta M65_LPNT_SCR+0 - - // Add screen row to the address - - clc - lda M65_TXTROW_OFF+0 - adc M65_LPNT_SCR+0 - sta M65_LPNT_SCR+0 - lda M65_TXTROW_OFF+1 - adc M65_LPNT_SCR+1 - sta M65_LPNT_SCR+1 + jsr m65_helper_scrlpnt_color // Store the new color in screen memory @@ -68,19 +49,7 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote // Now change M65_LPNT_SCR to point to screen memory - // XXX deduplicate this part - lda M65_SCRSEG+1 - sta M65_LPNT_SCR+3 - lda M65_SCRSEG+0 - sta M65_LPNT_SCR+2 - - clc - lda M65_SCRBASE+0 - adc M65_LPNT_SCR+0 - sta M65_LPNT_SCR+0 - lda M65_SCRBASE+1 - adc M65_LPNT_SCR+1 - sta M65_LPNT_SCR+1 + jsr m65_helper_scrlpnt_to_screen // Store the new character in screen memory, restore .Z @@ -91,6 +60,9 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote ora #$80 // reverse the character XXX consider doing this within chrout_to_screen_code !: sta_lp (M65_LPNT_SCR),z + + // Restore .Z + plz // Increment screen column by 1 @@ -134,7 +106,7 @@ m65_chrout_fix_txtrow_off: m65_chrout_screen_done: - jsr m65_cursor_show_if_enabled + jsr cursor_show_if_enabled - // XXX change this to return success + // XXX make sure it return success rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 1168571c..f410ca46 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -2,6 +2,8 @@ // #LAYOUT# * * #IGNORE +// XXX deduplicate pointer manipulation + M65_CLRSCR: // Clear additional attributes from the color code diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index 34d88a3c..e7a73af1 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -2,6 +2,8 @@ // #LAYOUT# * * #IGNORE +// XXX deduplicate pointer manipulation + M65_CLRWIN: // Clear additional attributes from the color code diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index b30eae5c..54d0ec36 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -13,10 +13,6 @@ m65_cursor_disable: // XXX utilize this! - // Make sure IRQ won't interfere by increasing the counter XXX reuse in legacy mode - lda #$FF - sta BLNCT - // Disable cursor blinking lda #$80 sta BLNSW @@ -29,40 +25,29 @@ m65_cursor_hide_if_visible: lda #$FF sta BLNCT - // If cursor is not visible, nothing to do + // If cursor is not visible, not much to do lda BLNON - beq m65_cursor_blink_timer_reset + beq_16 cursor_timer_reset // FALLTROUGH m65_cursor_undraw: - // XXX provide implementation + // Preserve .Z + phz + // Cursor undraw - color - // Mark cursor as not drawn - lda #0 - sta BLNON + jsr m65_helper_scrlpnt_color + lda GDCOL + sta_lp (M65_LPNT_SCR),z - rts + // Cursor undraw - character -m65_cursor_show_if_enabled: + jsr m65_helper_scrlpnt_to_screen + lda GDBLN + sta_lp (M65_LPNT_SCR),z - // XXX provide implementation - - lda #$00 - sta BLNSW - - // FALLTROUGH - -m65_cursor_blink_timer_reset: // XXX reuse code from main KERNAL - - // Rest blink counter (Mapping the 64, p39-40) - lda #20 - sta BLNCT - - // FALLTROUGH - -m65_cursor_blink_end: - - rts \ No newline at end of file + // Restore .Z and continue as with normal editor + plz + jmp cursor_undraw_cont diff --git a/src/kernal/screen_m65/mega65_cursor_blink.s b/src/kernal/screen_m65/mega65_cursor_blink.s index 6fb5e549..80fd31c8 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink.s +++ b/src/kernal/screen_m65/mega65_cursor_blink.s @@ -62,13 +62,11 @@ m65_cursor_blink_draw: lda_lp (M65_LPNT_IRQ),z sta GDCOL lda COLOR - and #$0F + and #$0F // take current colour, but not extended attributes sta_lp (M65_LPNT_IRQ),z - // Rework pointer to point to screnn memory - jsr m65_cursor_blink_rework_ptr - // Cursor draw - character + jsr m65_cursor_blink_irqpnt_to_screen lda_lp (M65_LPNT_IRQ),z sta GDBLN eor #$80 @@ -89,18 +87,17 @@ m65_cursor_blink_end: m65_cursor_blink_undraw: - lda #0 - sta BLNON - // Cursor undraw - color lda GDCOL sta_lp (M65_LPNT_IRQ),z - // Rework pointer to point to screnn memory - jsr m65_cursor_blink_rework_ptr - // Cursor undraw - character + jsr m65_cursor_blink_irqpnt_to_screen lda GDBLN sta_lp (M65_LPNT_IRQ),z + // Mark cursor as not drawn + lda #0 + sta BLNON + jmp_8 m65_cursor_blink_timer_reset diff --git a/src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s b/src/kernal/screen_m65/mega65_cursor_blink_irqpnt_to_screen.s similarity index 90% rename from src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s rename to src/kernal/screen_m65/mega65_cursor_blink_irqpnt_to_screen.s index 7aaffcc0..a5e851a2 100644 --- a/src/kernal/screen_m65/mega65_cursor_blink_rework_ptr.s +++ b/src/kernal/screen_m65/mega65_cursor_blink_irqpnt_to_screen.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE -m65_cursor_blink_rework_ptr: +m65_cursor_blink_irqpnt_to_screen: // Adapt pointer to point to screen memory diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s new file mode 100644 index 00000000..d5c61caa --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -0,0 +1,54 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + + +m65_helper_scrlpnt_color: + + // Set .Z to the current column + + ldz M65__TXTCOL + + // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) + + lda #$0F + sta M65_LPNT_SCR+3 + lda #$F8 + sta M65_LPNT_SCR+2 + + lda M65_COLVIEW+1 + sta M65_LPNT_SCR+1 + lda M65_COLVIEW+0 + sta M65_LPNT_SCR+0 + + // Add screen row to the address + + clc + lda M65_TXTROW_OFF+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + lda M65_TXTROW_OFF+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 + + rts + + +m65_helper_scrlpnt_to_screen: + + // Change M65_LPNT_SCR to point to screen memory (when it points to scren memory) + + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + + clc + lda M65_SCRBASE+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + lda M65_SCRBASE+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 + + rts From e661de3a06bcd72a164b30fd6d0049d3902c755f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 24 Aug 2020 04:03:27 +0200 Subject: [PATCH 39/96] more work towards MEGA65 native mode, updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes src/,,config_mega65.s | 4 +- src/aliases/,aliases_petscii_codes.s | 12 +- src/aliases/,aliases_ram_lowmem_m65.s | 21 ++- src/basic/board_m65/mega65_proxies.s | 33 ++--- src/kernal/board_m65/mega65_imports.s | 4 + src/kernal/board_m65/mega65_proxies.s | 27 ++-- src/kernal/board_m65/mega65_viciv_unhide.s | 4 +- src/kernal/keyboard/chrin_keyboard.s | 96 +++++-------- src/kernal/keyboard/chrin_programmable_keys.s | 46 ++++++ src/kernal/keyboard/scnkey.s | 24 ---- src/kernal/screen/cursor_enable.s | 1 + src/kernal/screen_m65/mega65_chrin_keyboard.s | 112 +++++++++++++++ src/kernal/screen_m65/mega65_chrout_screen.s | 131 +++++++++++++++++- src/kernal/screen_m65/mega65_clrscr.s | 7 +- src/kernal/screen_m65/mega65_clrwin.s | 7 +- .../screen_m65/mega65_screen_tables_misc.s | 16 +-- src/kernal/screen_m65/mega65_scrmodeset.s | 15 +- 23 files changed, 400 insertions(+), 160 deletions(-) create mode 100644 src/kernal/keyboard/chrin_programmable_keys.s create mode 100644 src/kernal/screen_m65/mega65_chrin_keyboard.s diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index 447fd20d91258d74074679afce49c948b3cf2ef3..e3875ba66a25bdb6c7d06a9ea08ddc7d720b5793 100644 GIT binary patch delta 2749 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 delta 2808 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 diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 5ae0f03b290abd8608dd921b51b64968a40711e9..cbddecf52fe1b05d754c3f69c06ca40b676bc52d 100644 GIT binary patch delta 1907 zcmYjR4Nz3q6@EX!vdjOv-~s|SyND=g5p3CjT1bL@#>Tq}tkJr$#x;|)HPdlmWsyj2Hl}LGOx@lG(;0VW z@AsQ9P^|t#cTnO=7gw!AD;eZK#=j9-YZ8GGkA=H<_nqfW1NN1$XXX4_)AjQRHRS z=8@ZK8Q2-bP0>^`TTRnqnp}^A^8r{e3T{MX7Q8hRWnw%v@$oty9#KK}2zb*6PpL@B zv7k3N3;O_hxr3;kuVxeI=X^c-LB>X%2%ky-UO^{Iifec!dN!#8cPEK1wm=NATXchZ zvZCH(mgd#RJ|S7LYa}~%1?^1R_ypb--4#p2ZPA_L|L>ggMw^n0Q6{;?O%#DVD@?P= zmD87LUVjKpANKID0!K#2g~-6TAZpiMO#8qnya$9Jjkq5I15PRrN06F+nES5}Su+|p z$yvcXKH1{1ne%a*-C44NyTF)&`@k5Q*OxWRiW&a| zyyymhAEvmf!uCh>?nm?&9?|zL>!`)Bn)Ra|!?jkzN;M=?sRdd?i=L?>q1!o#7S-)?+@nv?)*M8s*)24pp0;Q*@yy~KzJ|_HL zprThQ?3GN!1plexjuH1@td|6}n(<Ra_vdMUW|Lps{q>i_zxdC+d-or7e)Zvpi$kiS{mv+nP)G?Y z$^^9oYJj>X6*a89OO=4)aw#FSx3GonLqmm|^Yvl7MY06#al2Kr2CvMbxk3y31kx8h zUwdWNQ5(z0*6a4T!y40J%XNL&Q8KsMhAoTwuw=p3MSEPb;>tyO3>9^!EzDjjNB4`S zAVJ`x6zP!1LHUTv$Oe#|Am3WH*du}fL}Z1Nm2k`3;<;e_iRr|J#c?Oo5X@q_~1Q; z(cFE>R@_Ao>_-R9YiX-an#*-Eqwawphtb5!W)Aw_EZ&j7eThzXiDZL(HkMERh&qe6 zmbR<3ic7I8-fyl=hJ;I0$UL+h}7MsZisVmXh|} z%9tqHKC7clYY=Us1~6xGg$4#%#*GN214jy+3wo+So69qgo9c|X@In(!!gS$rM;2Ha zhyMsI2btm&L{ZmLwJ2V)rn7%a&j0>qtu(Eyi!R(p#RY0*)Qw+~UcmdMebA4(OS_E|0k~xXo^{Dj ztJ}ebVfgGc`n1&g*nahx5SkV}JUr*>b&J~0ku!uS^w8 zJ~X)MfO(1jf+Bd!@8IbN@lHWy<^dfqW7&Zf)Ik%?!wnQinu*CV;UsBn7|yCn`bDBrV+e?lOndmmP2-Tlp*8Wgj|Q z{=KZrKHMcU$G-!96G6EZ-{tBzp&wRMX(M~2V%_?Y+am5tW-Nn7e9h)=Ub{@2w0}{U U)J5BqdaYYIGq5CpZd6$Q2gS2W=l}o! delta 1935 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 F{{y_1{e1uc delta 4202 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 G{{ID)MsGd< delta 4033 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 diff --git a/bin/mega65.rom b/bin/mega65.rom index 643e1484a0aeaa061bd11df03234ad5a24472fb0..50a2efdb679dc742d20a308328765ea9f8aa082b 100644 GIT binary patch delta 12534 zcmZ8{3tUvy_WzzU3~!j>>8RxFlmrwNQ@dRAfj7-5k5>~FM6F{+jb`_D(@ZIwF*!&m zG<3|=vZis)-~quwex-wsq9!pKbqph)g(4uRaB!42%zy2{`rY4uKCt)NYd_9DYk$|; zYwxoR24920H}X6ECH+_WUHZ@TyY-*z_vrWP_vydTm&!hzsc(7wOJtl#@^{K4KPM&m zCNf!y_$=@EEFU#<)$HZ?S^pV2uj=X%5UYTHZ}|6Np8Ln_1<6{d{ubT%SuZ|uUe(c~ zJExHR&v{FJ=X}U00*V)8@dBl0dUT1*jFk2z|6YvX_j20rE8Q#JNFEii`23!t@5;ae$qV3Dm0ik-%`O)%9a_72-D$a7V{@hCSz%$*>n(s`{W zgikLXUBDMO-J+sO^&r99Nr^3L24?M@i$%O5*`~t(Tw)9OzCiTJj{8u&E-K>1PP!%aB9RhZ8<3D2;1gehz@{^6m3 z$ZI6QYX~xYFqQs2t+6J)vL^n?#@hJGTEh?+^b&iS{ULsbLgiJwQ$e0m(^yN#t>mVs zju|_!$QX)IDiP2ytVo5?u&8E$0*=uaYSe5 zPuQAlOE6cMys|#W_ZAabXNwQ5pPv`+W2lKV`+2xhw+Y=Y5br^OD_^!m0qY4<2~T@U zUsQtxCEFl$vA2u2E7f()dBHdGlsC*idFTcXduR^H3%+jNniq7P4sOdatLq}fz=QlH z#bwEB4=twbxp8^9=$+$V_(A*f^Qv2B<&CR%#L(g_Do)DHqH=<=D98Xu=T(i6{;AK8 zbKvBDO$qMA`(IOBOIjG^o65PLC(oeB zdsQ?udD|3ut3;^zNRh{gd0C3Q?TWnD#JqITY{<)0n7_(n6(uR`6x)_xus|EW>}#p5f23rx_whB}lM%ha&79 znHo^_)<*y=fY@8x2+9bS22llgYh6X4*9I7r0E_L{Oz6j4g)zKnr$WG>{4iF_r>(=U z=PATCwXl!?(?~Ve6S9?U1+uN`$4?aEg
>>(kHEjBe~rc`AvGfm4(%}g`<;Av@` zX2lTwv@|}2UB;)fX_YDbGG~nV3!mnkApR%_I3-O$kl=Y~0z*T=0R=vVB&nosKcSY9 zB+Z2K57i%H@UM%oDj6pxT?Fbd(3 zx4&>jQgru?GQSe$$- zkREaJ_0_CGtl@7}XDY-Wd*KPMiMi<_44KP_FlO#55vEzo*1+cB**Q!Wl`1JFMpJeE zJX&ayl8ki;1`)qqp<-H(v7V=dwHwJJH@xRS5EviX5gjx8$< zvKFlWV-X%EF^#o@V@M+tfoNVx0P&h=^ZseO;-_>mv6vBo$A~uhPpd@3GnKWVaMd3x zL|QGg9!A4Q2{Yl_hi1 z$~XLOE)zb=4VMc`IOgSHRQv6+4_?lcMU`x<+fe>q^yaA>lQyc~9ry0scYl9(?0ak0 zXKbi_zf?ASl6KPHCQcZq3=Rqmm^f*|xUttXzaY08FPZ;5J^O`Oix&KIaq=7upN{I~ zs6TYeJb$PJL1YLN`#$8;*%{z7Ol9!L>$#lIp7f7(fF(vDn31h}i zn?B>^m&VPD9hIt0iC((wA9J5u7&JBJnJJT>o;Y(-LfVVt<41>buFuAD^zPyMME-9L zV+;AjhIpLlFw5wqjVpVUD6<-+d87L7@L;4#&hbW?nywHaT_Io1)lf*YB+n0R?2o(} z470ONy(5k_D{#_Am|rFQ|A=q9!3FGgE`z=NpE%Y5PC%?f&70Q*o->PmYNk+9ou@ys zH!lz9Xp+_-(W&}^2b)?k5%(y*HG*@K7I{i$77X)d-L;BeXPUm3v)Ahot(Bl4G8cK zk~U_fot(A)TNzGp3{nUvv;Sbl-`3k_tv{IfE$T){d#B2i_t<=dneY+@IS45uTUACU zIfU`1En<|g!}OsTDaIpF#DJgz0hG!fcjZe`_TE)s_tcFLy`hc>Tmxl%-%YlmM2Ck<99|A5q0f2Iqv=OOVWgDCbCNrSo@b zt#hWdW-03Lwv94Q9ymtJtQmxPh@_RZEy z;smE#iUap#0UW26Ipxx;PQ7t>p*AfiPG49@+a}}GjTt)UCnCjOsuIhE54F*kRFQFd zXQ-r#W5hsRny}b(8_lT8j(?ukU@NcqVRh}WT9%}u1ax%puzYV<-HtFi@Y zb{~b&Accg#fZnYJW8;T3Q@p_%2BDtFlTg-!-O=0*gb66oPK_%79YX(u`Xe=u0#IM@ zNmLYwss|#GQjU~kaFDZPS}_(XL|%f3%+4uz!^PqxH6+ zs?rSSRM8t}Y$&^lux1N(xG{E=T|;DybsrQ1suRS;^JSE{fDYM$-*#xR&f!Eg?{?{& zzTAJh*m8O^QC3i&!JgkBvl3Uj%l0A@s#xfHp$i{%i-GuOciDCXXsv=n6NA@$02b{@ z&}x*O;0Kxm@VFyBG=NiSEjKY_(l8V3;Qsd2lhnOVF72yWee`DDD4l^>!Sl3`>F7fn zOm3LI*t^G?VR@f+xDO56)*Cu2<#)89;Tuh30A!`-{~~6Mc@s5i{-Xh2dt~$d3#cdx zuoJbR0f;euk!NP51f%sgj%va;H0-EHDGi#;h{5JhYw7`WdS!LH@&{$fnOXY)5f{3G z2(AV>?crA+grPA}FRrTc9qg!#J@!FgDC!CMYBB6-P&0AHKG?pFG(H>}SzR^bBw%b? zj!XFG%EXnx!*N-t$JN{y=wVd&Isty`~arIyI<0 z>~d!WO!3U`vzh_DpXYUiPIx#3-Q2qm{bxARY;SH49dq&10gVh=hjsgJjnWY1$)Ea! zX4@7`#Dqv?i#=821C=pbo7ExJd!j2yK;iEuvZ_xRWtD9gwtrtDE5Q$_7LU2 z6zGVuyhl0w4Vbv5Gvtku5RDpXvK|dV7y2W}EB??GIRbdRu5{nFi1_ZXo*_+|h>&)5 z`>44OLp7iG`)T^I<_V3uNYfdiS$!3n7R`EHd9g$Gao9LbN94Y~A*i|G@(8r6{%HOD zGKDF^YsfDpwkJ)9pPN6air3~(f=#vgCO%ifO|%T9a0EwNri^;i&S%I)kLZx`kz@!#Rs3CZfB8_mR$8eTar9xmI{PUvW(c=jtpP>YH*-#t(l= zb_hq@;(gBfN^)FUK<~0(Z4o`=ApW#$B$Y&e(4*DTB?q}#{IoIr^UlSh7eB|D%-|6x z%Id=ee|)yE>{^&L+!DdyYo%pk7~Xx0I}^qg@R&Lf#yR9qK56=EM9de_R7jN9$x#KpiCw zt&>YJ^xJmaebb3t?JB2#**z6BxOZxh^M}gmRd$tdju#Gcs#Q*^tcq|l4ujY0s_Etb z&OXaeWv5}~3w8W-#SGW!UL1GRb-b5baCrEz83*fALzJS$F0gqaBkO(ocV*dT`n+}y&aR=j3E zn*jsZrsMI4Y>5YT+AEiejLJ+J5H^oKBj~hZw}rL_B_Mv4mVZ^tuh!;h@xv4L2Sr+Y zJ^WuP($c*LVTI=L^TdlfhT#{Tn=Hu~{-tx1IP2jFPXI=YGA253Qfxnd{gmr%Z@lA{ z>sSch!n>}ixM(4fdehFmER3P_hq)YK+{`J3#A-eMF)tOJIu?3D3#)*=?6%o#I6Nr= zUWb$>X>n+g?eBbqmJj!k@lfWJN5)g1*tro!8vO@71kqju(S(Tf5Z@iMdE+Mcx;{6< zE==Sz8Wyq{HmdS{hDad-gvAGibqDdQ*rWWb>~VfIdjf6~5k6awwN`xBjz2q^$d7A= zGeIHr8gCiT`{Q5TW#%CI_X2*EG?IT?HLNjRjBI>OE79^(X9HP0=X-m+aO6{QW5ykNc{8wq|ff_X7D< zPVbugfhLqWGILaBG;Sv{D7(&mY#Wy^tBasvl>w>ITgli2o1#=wn!Ul6@TGW8CvSs<&ax1ZOahTif|r}jKRvjV6VFXz zxU~oO&tS%vGnQC9{x)s7$qr-9u`dHNX*2Iot zxa87BoU?FAkZw-Uq@BKeP=W`}v&uETCk1u-nzEI?oUVMN{-i)eVv*(o#4GL2BvDE3 zxMMLuU=+^iHiSB7)r{~ZCy#K#Q{s=hv9lD^P?XanZ!-)O;QR=SZ*&uIjK<%Tm$m!w zQxih?h;viHEQX)^yU`!3Zy9_C8%5kIyWj)Hv+|(PfY8&30WE{!YOFpc8Js8a?*(+G z#UrJ_KLr>3C!rz)_nq}MZ(>#BeYiPCG%*&i^oAkWa+s(N>LIGrzSm z=d}P3ZpV>fGn4H)c2yyrTmauZ)_k_=ysA4vj-%l4qmG`VqSnZwpNG_t5GsMdCVlD+ zQ-eHbFc164o4b8vK6OsuCY8M<&+1`HW$kiq*HMk$Sqhiwa8XY*;CBaDaJcxqYq!bq z&U#C{b?hMg-;rgF%LG-ZS?xuHHi-wh!Hc`Ndmd>p|5N{^b-(p1>(^G3^$Y$R>&zn= zrE5#g)?Z2wSS{9R{JwhLYPH&r%Im&6T3|hB6|5JI6 z*0=3%+ilkPQe-+MgwSss!xshqbvW9*POm-oXx`3X3emrpAVk<}q-Xh6u0%Qhy@Y># z&c7xlwsKpJ4WpK|aeI$Fp(p57du0DV#e@#^(6Gv5h_QTD8V#6PSqHM^gH#GUrQTyP z2@3q3@lpdcP>45hcLzha7l0%an-h$3r$2n2ft{3?Cm4g4qMY-k5l$_D8MXwXoHftE z?WhFZ=*X3J?6T889fcHB+D_*eG4$*PF32&50vIfIjCpP=v4ODZ+LS^N?722yKBDGJ zHy^HM3{$*Zledz@05C&_iSG>QV(@9Zjbh8;a|y8mqnsma-f?qo`tf!}+fP(2oxN$5lqQ7+DbM=7MviyF4 zYgu+b&gQSCLBh2kj|zbXFh^MSaI)-laS=D-#L(DeJA)8oLgp3prQ-})evsuMQG>ljYg2j&X)o15SP(4Uq8nLm9n zhfT-uh*X_*8}5_5!fj|E`7dt64U*64H2g~PS-hc|hrvPezy`y&B!9o( zQ0%F{Y2Zn&xMkQsmJpTp!6z924d5wdT0oYg*%&sKjbq0!>h#gYx z-b77YA>e5lP;&DuQ#%~B__6GCKAxSyaN`b*=SG}VuVNkiDp(NDs_>(m4eV$DV@xwL z{sc=EQ!}@RAI+}9EVx#0;}a)wX*rBInos{P`nCU}SN|9N>LAU1esa|O_5x`UYyxkA zu}>evj>$=nW8;kejj^J4V~j`!Tt{kvnUfyN#=>pxAooqe1x8MK3>)Kl@LJ$-KBtya zPfzAvIW0=C_uVW)%&szj{2fUTZHKI3>p#Xg3HM-IYHr zoG{ip&N3cfc9+Fp;c(rv#HUgIA1Xyh+4o-cml6uw7)!m92mu%nmg7T`FU@QeN_LpG=*W$Fj?8REP91uEaQq{HG< zX;xS!fC9I_et1MNm^LJjAsA%+;TiyL(8}H17JdYGw|<5KfDF?ce|v1i!xO|{1Q7Vf zOFrQGc>{R4f8Bl|%HFeJ5jA_x((z9xBqTmPdHnOwjh~26<0{vWH4K;0Giq$H>^hj! zd_kX!t^=*eXY(1GPi9S4Ene4Psj=2F*wjFO(na%b?wRgU-0X(9fPi*xND!XiO+VSq zE$fbr#Cbh~UKiXv`NGYUf!sVXW#2W(WJBW7jfL=q={xq3(7<*S=TdP#g^sUUxv-AO zPXJtZ!Iw`42e%E9bj|={EwA&nQD$FG)0C|DkS$@V>tZnvGnKipwUNOG9BgA`A*CHxuoFm4!t$OCvmr_A-h zAJ6Hv?Z&17TmIVm622r(BL-Z>?YHs$j3?|2o4dF;)Pi(Vg~wqJKO#^rAJ8ycZJ*SMg~xHq>ASE zx{MUPq8%m*ffMwvy_+m1>o>ePmC+Z6h<>Wv5RoBr&kh2K{~5LMYww=)61D_v;b8_Y znT^z%Q}lse{x^Kk&E28s>oD42PzQ_$Gxt-){g#VvFj{_>3l%Bc6s(Bbwr(9jGWojKt21&Mos52OJfNDJ`vlH?Fn zqk{;YG@^FFZIFVF!De^I5%W;h8K}JAY}JL#5fPi*9NwgrRc4 zR0wq*tAPLAhSQoEqGt(h-1Y!?hVd;qh~E#>6S_dixCz&`5jYZS2F6ZJZ)-A#5p$~q z8;9??gov|<&nKxb1 z%FSvIo5JpA0F%SJ$SXQrVCps*smcTJczDmsHZ5<7Qx-bD^AM8Ox{Fxl?GpEK`(!=U z1Rw(t@Vn@ecJ?5aZ8AxEr*wl<3{x>ifL)+|cQBFqmCZ_c3 z2Z}*SfRO*)21RWeZfeWHJKDGzcqbEFo5sU*vhdxbKIyeawmu_k& zbd=}7u%pd38d{QmFS)s|AB@mXqkIs&1ep5^0eBR#zF_WKAs!0MeG@VFw+30)gjIv) z{ui+A7BzmS3GBNkhma81bAIg_EDeS&NYE**+0#?F`6nPeJT*gqAtB620N%ZVT+i6^o8QxCexG%AU4oqD zNX!fWedZaMHJBioYj>~H$CclUm$Y%2F8T$xFc-q(gk(q<*s5~#DEL~JOPS>MX)uxN z_N2CPvg@KBR1KZo1{K+=#$qESDzKx`ARqY&1z|qa^)aR>Xzp4!27*cWyj{QjJz$vh`S z=I*5U%Ic5xlx+$G0PdhlA4z8{m3!Z#8Y`LN94aAbk6C`h@jy~QbYsH(;+>S__0vv@ zDc(UzRX^>Zz}mqG(2vPHoK;fzt&BbMEn-ivds^<1ACX#hA4n~ir5OBSt0b@aSpgf6 zwf5U9s!;rN2iZRfKSYjS>wsn9YZ9Ad*&3+f{@pul7$aaX(ZN9h5J5sw9p80)*8o3= z)|=0TJdB{g5r}>G=7g>`YwaEI1i<&>^HpAg8!Wki7$FGy0&?QoVC^AS^+E!BBsZ}u z42%MS1w#Ut?voIvd!BH(7PbX~V$$!jcexk4hU-1|GTyPKq2^d7RtrHBCsz;HH$OP2 z^VmSJ&5z(=;A^}xs6}!*x*Y^E7++|qtx!w;M9~$EwZt*a?>C|Ek4mBVc30K+N7bS% z5qiA?Zeb^#)(jh;=+n4Mtz$p)sLpyX&_;bz<1YGQr{$;=0SXMdk~6^DL5DpQs4<=C z+Qw#W&whnQNodiMe@+Fpnl&3GMT3K`@K-*z)Bo@SW%6|KOJXf#zVr>r>~#Zmc@{O1 zaSZ7ybSSzcZ}4#Lh>z3^D5`5%k9~D01&=Lj=zy{xgD21j(mBytD*B(kY3k^d>O zf44DCmC@VDNK_)DX1J~0%O(=rrb;r5CV6O*VFby;lMEiGJ~9bz5TLA1GI*1G7_oue zmD>~bIp&bM!2gO2Y;E0hL)9}F891`%ugE~}JctJTwfDU00i;}*uiszcM{>g_;Xzrh zPM3F^ylt*DO}f!~wRL6B+MWeH&-b_=eb@SS%gUCYo48KCR-!6v30!NPYVg}y?f@kH zJ$_n6jBA{n8`m?0YioZ(Z@BBLy_$ASs90`F5|ZW#73R|`3|9tuXu0A1CM`bD4~H2r zb0i2S+!PEaZ1W1dwM{1tfzK=^3d%Yy9LsfZ=1`b*Py-eOi+5E0W^c$_LkGUPA>d~#$nudaz9i#Hk7CT`_*U{TSlz+g+u465* zXIj*$#NFkZJHW5j4+c=p81Mv8!9#NtKjdHJFN5?h=U}11GdoL7Rb~wwb$q}AG}c;b zDi#7x;KpQK14KiSjSf7V^X;(Mo*W!jvj4q5K#C0mhBlH9aT}Tl7Y-PZKIcgnK&tNn zdHvsuj0rBd$oQgXBzU=zB&P_RAon70f*h`n5BCrPu9XJ~|0K9F0Y+dFT$w-~oCH@U zkOM$(kQ@N|E6D+%)tkTz0T<-Y-N~zvcplUGCXKx7IZYCiqsxsDL1uXGfbHI<%W|`O zA9;hlZCq>LIN3W~RR0t`pxW~ZEN`b`XRdFN2*JZ(69HjQ!7KdSa-=19JAqc5vgOkjJhl@U z1awd!K!URf3Hc@!B;vb;0L;(`PtK%DwoyAXsl08l8T@Gu>WDcQJ^*J2&=in^D34!9 z8SqWF4Lk+X7e2eKid79Ot-krW-GJr>>(++_ILZLM)u<4WXJPYB;@u z+tSv>l@2_awzbV;aQ(sHlE6Q@c7Wmct9s2!o`V3KAw-qpAR)WF6zuc?ul+Fj3QP_U1dME(PJJ+^l~?Spr2mYPe=6A!}{sP?exV~dZvqhYJfh}Pyh0e z?tMg$m1t)ty_xI}^bZmp)kR0Q(YjXp->vJ0$+@%cq0w(O)2CY3#md)>k*|xF(>1s0 jS2}6`2GeyjVm^DSpzT)QriN0PduFLh`s+VmHSzxeH{9Q= delta 10201 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
>>(kHEjBe~rc`AvGfm4(%}g`<;Av@` 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 delta 10201 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 Date: Tue, 25 Aug 2020 15:40:44 +0200 Subject: [PATCH 40/96] added initial high memory map --- src/aliases/,aliases_ram_over64K_m65.s | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/aliases/,aliases_ram_over64K_m65.s diff --git a/src/aliases/,aliases_ram_over64K_m65.s b/src/aliases/,aliases_ram_over64K_m65.s new file mode 100644 index 00000000..354a085a --- /dev/null +++ b/src/aliases/,aliases_ram_over64K_m65.s @@ -0,0 +1,17 @@ +// #LAYOUT# M65 * #TAKE +// #LAYOUT# * * #IGNORE + + + // XXX target High RAM memory map concept - TODO: update current code + + // $10000-$17FFF (32KB) - reserved for DOS + // $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition + // $19000-$1B7FF (10KB) - reserved for virtual text screenk, 80x128 + // $1B800-$1DFFF (10KB) - reserved for a color RAM backup when switchin between text/graphics modes + // (4KB) - reserved for sprites + // (2KB) - reserved for future use + // (2KB) - color RAM mirror, not useable + // $20000-$2FFFF (64KB) - ROM, the essential part + // $30000-$4FFFF (64KB) - ROM, additions + // $50000-$57FFF (32KB) - reserved for graphics screen + // $58000-... - extended BASIC variables, RAM disk, etc. From 55399dab713b93bedb2fdc6bbb32ff0327903d6e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 25 Aug 2020 16:24:29 +0200 Subject: [PATCH 41/96] removed potentially dangerous tape option --- CONFIG.md | 6 ------ src/,,config_custom.s | 1 - src/,,config_cx16.s | 1 - src/,,config_generic.s | 1 - src/,,config_mega65.s | 1 - src/,,config_testing.s | 1 - src/,,config_ultimate64.s | 1 - src/kernal/tape/load_tape_normal.s | 12 ++---------- src/kernal/tape/tape_normal_get_data_1.s | 11 +---------- src/kernal/tape/tape_normal_get_data_2.s | 2 +- 10 files changed, 4 insertions(+), 33 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index 9f0f7b30..b5a851c9 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -175,12 +175,6 @@ Enable this option if you are using a tape interface adapter with some audio sig Enable this option if you are using a tape interface adapter lacking tape motor control (most likely every adapter currently being sold) - this will eliminate the need to quickly press space when the program header information gets displayed. Note: if you are using a cassette player with REM port, and your adapter is connected to this port too, than you do not need this option. -### `CONFIG_TAPE_NO_ERROR_CORRECTION` - -Normal tape format contains two copies of each data block - in case some bytes from the first one are damaged, they can be corrected by reading them from the second copy. Enabling this option omits the core to read the second block. - -If used with `CONFIG_TAPE_NORMAL`, saves about 125 bytes in KERNAL segment. Not recommended when using real magnetic tapes. - ## Multiple SID support The SID is a sound chip - the original Commodore 64 had one installed. However, mods exists to add more of them for improved sound capabilities. Emulators and FPGA machines typically allow to simulate more than one too. Unfortunately, there is no standard regarding how these additional chips are visible in the processor address space, and there is no sane way to detect it - thus, it has to be configurable. diff --git a/src/,,config_custom.s b/src/,,config_custom.s index 5383a2ee..da8d626c 100644 --- a/src/,,config_custom.s +++ b/src/,,config_custom.s @@ -60,7 +60,6 @@ #define CONFIG_TAPE_AUTODETECT // #define CONFIG_TAPE_NO_KEY_SENSE // #define CONFIG_TAPE_NO_MOTOR_CONTROL -// #define CONFIG_TAPE_NO_ERROR_CORRECTION // #define CONFIG_RS232_UP2400 // please keep disabled for now // #define CONFIG_RS232_UP9600 // please keep disabled for now diff --git a/src/,,config_cx16.s b/src/,,config_cx16.s index 69d16602..a36527e9 100644 --- a/src/,,config_cx16.s +++ b/src/,,config_cx16.s @@ -56,7 +56,6 @@ // #define CONFIG_TAPE_AUTODETECT // #define CONFIG_TAPE_NO_KEY_SENSE // #define CONFIG_TAPE_NO_MOTOR_CONTROL -// #define CONFIG_TAPE_NO_ERROR_CORRECTION // Multiple SID support diff --git a/src/,,config_generic.s b/src/,,config_generic.s index a5bbe9bb..49ba908e 100644 --- a/src/,,config_generic.s +++ b/src/,,config_generic.s @@ -54,7 +54,6 @@ #define CONFIG_TAPE_AUTODETECT // #define CONFIG_TAPE_NO_KEY_SENSE // #define CONFIG_TAPE_NO_MOTOR_CONTROL -// #define CONFIG_TAPE_NO_ERROR_CORRECTION // Multiple SID support diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 665650c5..7a742ee2 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -48,7 +48,6 @@ #define CONFIG_TAPE_AUTODETECT #define CONFIG_TAPE_NO_KEY_SENSE #define CONFIG_TAPE_NO_MOTOR_CONTROL -// #define CONFIG_TAPE_NO_ERROR_CORRECTION // Multiple SID support diff --git a/src/,,config_testing.s b/src/,,config_testing.s index ed450277..24010994 100644 --- a/src/,,config_testing.s +++ b/src/,,config_testing.s @@ -54,7 +54,6 @@ // #define CONFIG_TAPE_AUTODETECT // #define CONFIG_TAPE_NO_KEY_SENSE // #define CONFIG_TAPE_NO_MOTOR_CONTROL -#define CONFIG_TAPE_NO_ERROR_CORRECTION // Multiple SID support diff --git a/src/,,config_ultimate64.s b/src/,,config_ultimate64.s index 5e6eb4b0..b2373db5 100644 --- a/src/,,config_ultimate64.s +++ b/src/,,config_ultimate64.s @@ -54,7 +54,6 @@ #define CONFIG_TAPE_AUTODETECT // #define CONFIG_TAPE_NO_KEY_SENSE // #define CONFIG_TAPE_NO_MOTOR_CONTROL -// #define CONFIG_TAPE_NO_ERROR_CORRECTION // Multiple SID support diff --git a/src/kernal/tape/load_tape_normal.s b/src/kernal/tape/load_tape_normal.s index c1ecd776..3a38500b 100644 --- a/src/kernal/tape/load_tape_normal.s +++ b/src/kernal/tape/load_tape_normal.s @@ -80,13 +80,9 @@ load_tape_normal_switch_turbo: !: #endif -#if CONFIG_TAPE_NO_ERROR_CORRECTION - lda RIPRTY - cmp #$01 // sets Carry if checksum verification fails -#else jsr load_TAPE1_to_MEMUSS jsr tape_normal_get_data_2 -#endif + #if !CONFIG_TAPE_AUTODETECT bcs load_tape_normal_header // block load error, try again #else @@ -137,13 +133,9 @@ load_tape_normal_payload: jsr lvs_check_EAL bne_16 tape_load_error // amount of data read does not match header info -#if CONFIG_TAPE_NO_ERROR_CORRECTION - lda RIPRTY - cmp #$01 // sets Carry if checksum verification fails -#else jsr lvs_STAL_to_MEMUSS jsr tape_normal_get_data_2 -#endif + bcs_16 tape_load_error jmp tape_load_success diff --git a/src/kernal/tape/tape_normal_get_data_1.s b/src/kernal/tape/tape_normal_get_data_1.s index fd1242c6..04c7abae 100644 --- a/src/kernal/tape/tape_normal_get_data_1.s +++ b/src/kernal/tape/tape_normal_get_data_1.s @@ -21,10 +21,9 @@ tape_normal_get_data_1: // and pointers for error log and correction mechanism lda #$00 sta RIPRTY -#if !CONFIG_TAPE_NO_ERROR_CORRECTION + sta PTR2 sta PTR1 -#endif // FALLTROUGH @@ -44,12 +43,6 @@ tape_normal_get_data_1_loop: jsr tape_normal_get_byte bcc tape_normal_get_data_1_loop_byte_OK - -#if CONFIG_TAPE_NO_ERROR_CORRECTION - - bcs tape_normal_get_data_1_fail - -#else // Problem reading a byte, try to add it to the error log @@ -71,8 +64,6 @@ tape_normal_get_data_1_loop: bcc tape_normal_get_data_1_loop_advance bcs tape_normal_get_data_1_success -#endif - tape_normal_get_data_1_loop_byte_OK: jsr tape_normal_get_marker diff --git a/src/kernal/tape/tape_normal_get_data_2.s b/src/kernal/tape/tape_normal_get_data_2.s index cf2a3763..16b5f166 100644 --- a/src/kernal/tape/tape_normal_get_data_2.s +++ b/src/kernal/tape/tape_normal_get_data_2.s @@ -7,7 +7,7 @@ // -#if CONFIG_TAPE_NORMAL && !CONFIG_TAPE_NO_ERROR_CORRECTION +#if CONFIG_TAPE_NORMAL tape_normal_get_data_2: From 74bdbd793042dc4be918b11eea2f4a6efd323dea Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 25 Aug 2020 16:51:34 +0200 Subject: [PATCH 42/96] removed dangerous tape reading optimization --- src/kernal/tape/tape_normal_get_data_2.s | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/kernal/tape/tape_normal_get_data_2.s b/src/kernal/tape/tape_normal_get_data_2.s index 16b5f166..2b88c12c 100644 --- a/src/kernal/tape/tape_normal_get_data_2.s +++ b/src/kernal/tape/tape_normal_get_data_2.s @@ -12,10 +12,8 @@ tape_normal_get_data_2: - // First check if there is a need to read anything - - lda PTR1 - beq tape_normal_get_data_2_log_checksum + // NOTE: Always read all the bytes fro second copy, to taht we stop + // at the moment when it is safe to start recording! // Read sync of the block @@ -28,11 +26,6 @@ tape_normal_get_data_2: tape_normal_get_data_2_loop: - // Check if there are missing bytes to read - lda PTR1 - cmp PTR2 - beq tape_normal_get_data_2_log_checksum // branch if no more errors to correct - // Read missing bytes jsr tape_normal_get_byte From 164b29bab8477f7149762ef837e3fc52a5492e9c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 25 Aug 2020 19:43:17 +0200 Subject: [PATCH 43/96] fixed crash in BASIC when trying to incorrectly execute operator --- src/basic/basic_commands/cmd__jumptable.s | 6 ++---- src/basic/engine_runtime/execute_line_statements.s | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/basic/basic_commands/cmd__jumptable.s b/src/basic/basic_commands/cmd__jumptable.s index 321ebb31..3f541ef8 100644 --- a/src/basic/basic_commands/cmd__jumptable.s +++ b/src/basic/basic_commands/cmd__jumptable.s @@ -55,14 +55,12 @@ 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 + 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 $A7 - - cmd_go + // 'GO' ($CB) is handled separately ) diff --git a/src/basic/engine_runtime/execute_line_statements.s b/src/basic/engine_runtime/execute_line_statements.s index 9c637b07..dd1d3b99 100644 --- a/src/basic/engine_runtime/execute_line_statements.s +++ b/src/basic/engine_runtime/execute_line_statements.s @@ -61,6 +61,9 @@ execute_statements: cpx #$7F bcc_16 execute_statements_var_assign // not a token - try variable assign + cpx #$A7 + bcs_16 do_SYNTAX_error + #if !HAS_OPCODES_65C02 // Get the jump table entry for it, push it on the stack, and then RTS to start it. From e40e8c5d2e38587bb311aaa101f96fcf1aefa8c5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Tue, 25 Aug 2020 21:20:25 +0200 Subject: [PATCH 44/96] small cleanup --- src/kernal/tape/tape_normal_get_marker.s | 8 ++------ src/kernal/tape/tape_normal_sync.s | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/kernal/tape/tape_normal_get_marker.s b/src/kernal/tape/tape_normal_get_marker.s index 2055c581..350e8c49 100644 --- a/src/kernal/tape/tape_normal_get_marker.s +++ b/src/kernal/tape/tape_normal_get_marker.s @@ -29,18 +29,14 @@ tape_normal_get_marker_type: -!: // Not an entry point!!! - - // XXX check for short pulses of turbo here - + // Not an entry point!!! +!: jsr tape_normal_calibrate_during_pilot // while sync use short pulses for calibration // FALLTROUGH tape_normal_get_marker_while_sync: - // (L,M) - end of byte, (L,S) - end of data - jsr tape_common_get_pulse bcs !- // branch if short pulse diff --git a/src/kernal/tape/tape_normal_sync.s b/src/kernal/tape/tape_normal_sync.s index e7ba9eb9..8a749e36 100644 --- a/src/kernal/tape/tape_normal_sync.s +++ b/src/kernal/tape/tape_normal_sync.s @@ -21,7 +21,7 @@ tape_normal_sync: jsr tape_normal_get_marker_while_sync bcs tape_normal_sync_fail // branch if end of data marker - + jsr tape_normal_get_byte bcs tape_normal_sync_fail From aecf5f9594a5384222ee44dcc0ef6db7081e6f6e Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 26 Aug 2020 17:37:30 +0200 Subject: [PATCH 45/96] tape reading fix (data pilot) --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes src/kernal/tape/tape_normal_get_data_1.s | 3 --- src/kernal/tape/tape_normal_get_pilot.s | 20 +++++++++++++++++++- 8 files changed, 19 insertions(+), 4 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index e3875ba66a25bdb6c7d06a9ea08ddc7d720b5793..dd989da4a6f2f146d510f9d2494d83f37709457d 100644 GIT binary patch delta 1600 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 Tg8w?#xjggba8U@nmTLSLk}%Y{ diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index cbddecf52fe1b05d754c3f69c06ca40b676bc52d..e7f1464a5b486035c00922e3d0baeba58b55db1b 100644 GIT binary patch delta 1662 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 Ldgc4MUwi%s^^)-6 diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index 03b1839c1b45f0096b2b0a19b0366ae83755fb34..a43d9b024e7a500cff81c5562ddc7656b90e02d8 100644 GIT binary patch delta 2983 zcmZ8j3s4kC8s3=!mPgnf!NBsg4H8*j!AA_0GZ)nJ+*oZMmn$RYaqD?WwsKfkl{*tF zsi0Ib98y^Vw0EM2uFDQM7;sST5WJ0>h=wJXFb0cgA{D*jp*yqe0LnvTimAkF2 z?*9A#|DM15|NgIgfA0R=czmV~{(=rowj%Qhp$Zil{;3|c;xxWkh9l>n95VlO99J-=#|RZsxo~v?K_FL-!5ST*~TvR zswb#MqGqx)@>A-2Vu;$cvSqUPP?d$3)XYnrl0ndM5_i>hvhI*ch_wz%C!4*XVo*>7Lbg(uS%O zTo8Z(-W%9^&C-~}sA0Bz6Jx`hXG2MaY!t|l4QwZQkKmNn$wreDMN4DofGh;LTH$vO z5!^^Tk372JYsCiJ=RdXZO%}eJV;*%+Xc_9ha@J2D&OkSri1K zaygf_9(I$&*z`rOOle5CFp3hUvLNZs_+`4j7mWY|RH*<`077Ub$%|dQ@O{7SBw9U& z%M{4PLD)wF9D0HLP{0M`L~OdzFonV%Xh_mP1fJi-n&9w;Vl${MB*u`FUK{A_Xf;Vx z4n&tXgx3$_<1)${;EzHT;7qd9kQi}BE7@vNU`SqG5a8R;yIMIH1kkg?xOhxEsmQ%( z%Tx%jOIUrEG?4|Lg4oF=!#b*#(8d+<;eK#=NDdQYnm{%h-!{}hy<5z)9M#-}YXW38 z!A#B>S3;foj8CR??s-=@w(aHArH1gCxNkG=_+(j8WO)RBIG_3HCLVUR=qe3Gel*VzW%f-MY(sV7WWp_V(nsobQ=42Xa;5A7M^4%WPBs3v=7E27Sc+gqY!`=k3gdGRl-pjqhVy;K}2ERda=Pj6jRTde1 z#D_Nq^FN{YhETJc{CVE`<&~kN0BzOU?2k$~;y$tmM1}h|?a)=6=|nT*(0all6Eou;j}&m|n$M__W*}P# zstp|^ugy={iYLTr&?8+a<*02Id1j?ym}!93`>P?k`avuX7IhR~%+F>x!e8V*=R1nN zfYasMfw&o*eAlZFbx1nfF@FiQTGJp&%SQ7welCc{d}_GL06XQ7LCczmMnpLM9y8e1e0ijD8H<2{` zI#%f8?g@9faiD#(zQN59A@TW?NX4cmTAZ|lMvn~GEJ*d+V6WlMS5YL1Gp&h!$=^uz zRW#*5056(MnZKAs{e%2>4Q4AGM7LUsX2u!-=cVCaR$Sq)K~-EUMLuFTEqv)C1&@pX zt(@YHbH^M9(4Jv27x8{nt(K>@-$doB>yGgkYjo6YzC&w^kAbp0K}^=V2-NSx(Nlaq zr1v6>Az8Sa1Wl`{*U0LmjBH1gw%nSZmZQPx=#;7lQA{W|XkEnrxV}S_q>RO(+n2%l zBU&}>)wmKEv(<+-`$IRc9`@|faTY&*SCg#dm6VL6B|{FKreFY%fKq@I^x`aNNlHfMUjry3 z2*4{G6%~O3VigB~RmGcgQ`d!^+Lb|mNJ-syFu=J?K+r#dJpdNR<&c?h>*2i;nlo8} zjPQq=K|q0rkZo=N535$lGkox?*^rxf4PJ=w!7JJazlEuAzxb744Xq`90WUPvI4riK z?isEL8uDIhM%eO6be7blF4x1t@Xk6*uB0YXh}=nCMGcbFG>&Q^&a};j`vK>?GQ$mL zVOi`AxP&Iswt>;}>C0CfklS|CUMoCKV1W~(;d2)v)X!E;bP*{6K+qg(@rB#RN9#ck3^>#8m+2TgIBLc^QQs#d=rM|3vKkd zHmYI0&TKHlOc2Iy=R&B6r3;c$Lk|G$8BiMF2{25W)GwswSdnP}_Y>=al`E#karywB z7{i&fc>O5;W(a@$0NZ4INx{tuT$H$Q6o>oqDH-?ra38s_AZ^i8GESBAvzYuPO#U(k a_w?h$Asjv6xZ%`U|CafT@}HTPeg6f*eYx)d delta 3039 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 RZ#XoT50*VD|1$f6_rDJF*1Z4# diff --git a/bin/mega65.rom b/bin/mega65.rom index 50a2efdb679dc742d20a308328765ea9f8aa082b..10de558af534cab4342b19488d5941f59f56ba5d 100644 GIT binary patch delta 2494 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 Date: Wed, 26 Aug 2020 21:25:23 +0200 Subject: [PATCH 46/96] more work on MEGA65 native screen mode --- src/aliases/,aliases_ram_lowmem_m65.s | 23 ++-- src/kernal/extapi_m65/mega65_mode65.s | 2 +- .../screen_m65/mega65_clear_attributes.s | 11 ++ src/kernal/screen_m65/mega65_clrscr.s | 105 +++++++++--------- src/kernal/screen_m65/mega65_clrwin.s | 7 +- src/kernal/screen_m65/mega65_screen_helpers.s | 3 +- .../screen_m65/mega65_screen_tables_misc.s | 14 +-- src/kernal/screen_m65/mega65_scrmodeset.s | 17 ++- 8 files changed, 99 insertions(+), 83 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_clear_attributes.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index b4ebafdc..4a65c6b4 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -39,16 +39,17 @@ .label M65_SCRSEG = $580 // $580-$581 segment address (2 higher bytes) of the screen memory .label M65_SCRBASE = $582 // $582-$583 first byte of screen memory - .label M65_SCRGUARD = $584 // $584-$585 last byte of screen memory + 1 - .label M65_COLVIEW = $586 // $586-$587 first byte of color memory viewport - .label M65_COLVIEWMAX = $588 // $588-$589 largest allowed value of M65_SCRVIEW - .label M65_SCRMODE = $58A // 0 = 40x25, 1 = 80x25, 2 = 80x50 - .label M64_SCRWINMODE = $58B // $00 = normal mode, $FF = window enabled - .label M65_TXTWIN_X0 = $58C // text window - top-left X coordinate, starting from 0 - .label M65_TXTWIN_Y0 = $58D // text window - top-left Y coordinate, starting from 0 - .label M65_TXTWIN_X1 = $58E // text window - bottom-right X coordinate + 1 - .label M65_TXTWIN_Y1 = $58F // text window - bottom-right Y coordinate + 1 - .label M65_TXTROW_OFF = $590 // $590-$591 offset to the current text row - // $592-$5FF -- UNUSED -- + .label M65_SCRGUARD = $584 // $584-$585 last byte of screen memory + 1 XXX is it needed? + .label M65_COLGUARD = $586 // $586-$587 last byte of colour memory + 1 + .label M65_COLVIEW = $588 // $588-$589 first byte of color memory viewport + .label M65_COLVIEWMAX = $58A // $58A-$58B largest allowed value of M65_COLVIEW + .label M65_SCRMODE = $58C // 0 = 40x25, 1 = 80x25, 2 = 80x50 + .label M64_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled + .label M65_TXTWIN_X0 = $58E // text window - top-left X coordinate, starting from 0 + .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 + .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 + .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 + .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row + // $594-$5FF -- UNUSED -- .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/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s index dc6c8207..273f98ee 100644 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -43,7 +43,7 @@ M65_MODE65: // Set screen mode to 80x25 - lda #$01 + lda #$02 jsr m65_scrmodeset_internal // Clear the screen diff --git a/src/kernal/screen_m65/mega65_clear_attributes.s b/src/kernal/screen_m65/mega65_clear_attributes.s new file mode 100644 index 00000000..7c5dc476 --- /dev/null +++ b/src/kernal/screen_m65/mega65_clear_attributes.s @@ -0,0 +1,11 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_clear_attributes: + + lda COLOR + and #$0F + sta COLOR + + rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index f2dcfb1c..ff143655 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -2,15 +2,12 @@ // #LAYOUT# * * #IGNORE -// XXX deduplicate pointer manipulation M65_CLRSCR: // Clear additional attributes from the color code - lda COLOR - and #$0F - sta COLOR + jsr m65_clear_attributes // Disable the window mode @@ -19,32 +16,19 @@ M65_CLRSCR: // FALLTROUGH -m65_clrscr_takeover: +m65_clrscr_takeover: // .A has to be 0 - // Set the viewport to the beginning of screen memory - variables: + // Set the viewport to the beginning of screen memory - variable: // - M65_COLVIEW - // To clear the screen, two zeropage long pointers will be used, initialize them too - // - M65_LPNT_SCR for screen memory - // - M65_LPNT_KERN for colour memory (starts from $FF80000) // XXX preserve this on stack, restore afterwards + // It will serve as line counter sta M65_COLVIEW+0 sta M65_COLVIEW+1 - sta M65_LPNT_KERN+0 - sta M65_LPNT_KERN+1 - lda #$F8 - sta M65_LPNT_KERN+2 - lda #$0F - sta M65_LPNT_KERN+3 + // Clear the row offset, so that it won't interfere - lda M65_SCRBASE+0 - sta M65_LPNT_SCR+0 - lda M65_SCRBASE+1 - sta M65_LPNT_SCR+1 - lda M65_SCRSEG+0 - sta M65_LPNT_SCR+2 - lda M65_SCRSEG+1 - sta M65_LPNT_SCR+3 + sta M65_TXTROW_OFF+0 + sta M65_TXTROW_OFF+1 // Clear the whole screen+color memory @@ -54,45 +38,56 @@ m65_clrscr_takeover: m65_clrscr_loop: - // Clear 80 characters + // Prepare M65_LPNT_SCR, let it point to color memory + + jsr m65_helper_scrlpnt_color + + // Clear color for the whole line ldz #$4F // 80 bytes -!: - lda #$20 - sta_lp (M65_LPNT_SCR),z lda COLOR - sta_lp (M65_LPNT_KERN),z +!: + sta_lp (M65_LPNT_SCR),z dez bpl !- - // Move M65_LPNT_SCR and M65_LPNT_KERN 80 characters forward - // XXX deduplicate with window clearing + // Let M65_LPNT_SCR point to scren memory - clc - lda M65_LPNT_SCR+0 - adc #$50 - sta M65_LPNT_SCR+0 - bcc !+ - inc M65_LPNT_SCR+1 -!: - clc - lda M65_LPNT_KERN+0 - adc #$50 - sta M65_LPNT_KERN+0 - bcc !+ - inc M65_LPNT_KERN+1 -!: - // Check if we have more rows to clear + jsr m65_helper_scrlpnt_to_screen - lda M65_LPNT_SCR+1 - cmp M65_SCRGUARD+1 + // Clear characters in the whole line + + ldz #$4F // 80 bytes + lda #$20 +!: + sta_lp (M65_LPNT_SCR),z + + dez + bpl !- + + // Advance by one line, do next iteration + + // XXX this can probably be deduplicated + clc + lda M65_COLVIEW+0 + adc #$50 + sta M65_COLVIEW+0 + bcc !+ + inc M65_COLVIEW+1 +!: + // Check if we are allowed to progress further + + lda M65_COLVIEW+1 + cmp M65_COLVIEWMAX+1 bne m65_clrscr_loop - lda M65_LPNT_SCR+0 - cmp M65_SCRGUARD+0 + lda M65_COLVIEW+0 + cmp M65_COLVIEWMAX+0 bne m65_clrscr_loop - // Restore .Z register +m65_clrscr_loop_done: + + // Nothing more to clear - restore .Z register plz @@ -102,6 +97,8 @@ m65_clrscr_loop: lda #$00 sta VIC_COLPTR+0 sta VIC_COLPTR+1 + sta M65_COLVIEW+0 + sta M65_COLVIEW+1 lda M65_SCRBASE+0 sta VIC_SCRNPTR+0 @@ -110,7 +107,13 @@ m65_clrscr_loop: // Set screen variables - // XXX provide proper implementation, together with HOME + // XXX provide proper implementation + + // FALLTROUGH + +M65_HOME: + + // XXX provide proper implementation lda #$00 sta M65__TXTROW diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index d57d9d1d..11e73155 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -2,16 +2,13 @@ // #LAYOUT# * * #IGNORE -// XXX deduplicate pointer manipulation +// XXX deduplicate pointer manipulation, see M65_CLRSCR M65_CLRWIN: // Clear additional attributes from the color code - // XXX deduplicate with M65_CLRSCR - lda COLOR - and #$0F - sta COLOR + jsr m65_clear_attributes // Check if windowed mode; if not, go to M65_CLRSCR diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index d5c61caa..91247a55 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -2,7 +2,6 @@ // #LAYOUT# * * #IGNORE - m65_helper_scrlpnt_color: // Set .Z to the current column @@ -36,7 +35,7 @@ m65_helper_scrlpnt_color: m65_helper_scrlpnt_to_screen: - // Change M65_LPNT_SCR to point to screen memory (when it points to scren memory) + // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) lda M65_SCRSEG+1 sta M65_LPNT_SCR+3 diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 329d5c7a..c4a786e7 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -6,19 +6,19 @@ m65_scrtab_vic_ctrlb: // parameters for VIC control register B .byte %00100000 // 40x25 + extended attributes .byte %10100000 // 80x25 + extended attributes - .byte %10100100 // 80x50 + extended attributes + .byte %10101000 // 80x50 + extended attributes m65_scrtab_colviewmax_lo: // maximum allowed color viewport start - low byte - .byte $10 - .byte $10 - .byte $40 + .byte <((128-25)*80) + .byte <((128-25)*80) + .byte <((128-50)*80) m65_scrtab_colviewmax_hi: // maximum allowed color viewport start - high byte - .byte $27 - .byte $27 - .byte $1F + .byte >((128-25)*80) + .byte >((128-25)*80) + .byte >((128-50)*80) m65_scrtab_scrolx: // values for VIC_SCROLX diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 00ecf9a4..0cbe613d 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -70,15 +70,15 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_SCRNPTR+2 // Set the following locations: - // - M65_SCRBASE - for screen starting from $xxxx6000 + // - M65_SCRBASE - for screen starting from $xxxx9000 // - VIC_SCRNPTR+0/+1 - for screen viewport start // - M65_COLVIEW, VIC_COLPTR - for using color memory from the start - ldx #$60 + ldx #>($9000) stx M65_SCRBASE+1 stx VIC_SCRNPTR+1 - ldx #$00 + ldx #<($9000) stx M65_SCRBASE+0 stx VIC_SCRNPTR+0 @@ -89,14 +89,19 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_COLPTR+1 // Set the following locations: - // - M65_SCREND - for max 200 lines of virtual screen + // - M65_SCRGUARD, M65_COLGUARD - for max 128 lines of virtual screen // - M65_COLVIEWMAX - as above, but depending on the mode - ldx #$80 + ldx #<($9000 + 80 * 128) stx M65_SCRGUARD+0 - ldx #$9E + ldx #>($9000 + 80 * 128) stx M65_SCRGUARD+1 + ldx #<(80 * 128) + stx M65_COLGUARD+0 + ldx #>(80 * 128) + stx M65_COLGUARD+1 + ldx M65_SCRMODE lda m65_scrtab_colviewmax_lo, x sta M65_COLVIEWMAX+0 From c32650f7f5a55682244cb13fd87da4a54950766c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 26 Aug 2020 22:25:56 +0200 Subject: [PATCH 47/96] MEGA65 native screen fixes --- src/aliases/,aliases_ram_over64K_m65.s | 5 ++ .../screen_m65/mega65_clear_attributes.s | 11 ---- src/kernal/screen_m65/mega65_clrscr.s | 8 +-- src/kernal/screen_m65/mega65_clrwin.s | 2 +- src/kernal/screen_m65/mega65_screen_helpers.s | 51 ++++-------------- ...o_screen.s => mega65_screen_helpers_irq.s} | 0 .../mega65_screen_helpers_scrlpnt.s | 53 +++++++++++++++++++ .../screen_m65/mega65_screen_tables_misc.s | 12 ++--- .../screen_m65/mega65_screen_upd_txtrow_off.s | 13 ----- src/kernal/screen_m65/mega65_scrmodeset.s | 19 ++++--- 10 files changed, 88 insertions(+), 86 deletions(-) delete mode 100644 src/kernal/screen_m65/mega65_clear_attributes.s rename src/kernal/screen_m65/{mega65_cursor_blink_irqpnt_to_screen.s => mega65_screen_helpers_irq.s} (100%) create mode 100644 src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s delete mode 100644 src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s diff --git a/src/aliases/,aliases_ram_over64K_m65.s b/src/aliases/,aliases_ram_over64K_m65.s index 354a085a..19ef2082 100644 --- a/src/aliases/,aliases_ram_over64K_m65.s +++ b/src/aliases/,aliases_ram_over64K_m65.s @@ -7,6 +7,11 @@ // $10000-$17FFF (32KB) - reserved for DOS // $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition // $19000-$1B7FF (10KB) - reserved for virtual text screenk, 80x128 + +.const MEMCONF_SCRBASE = $9000 +.const MEMCONF_SCRROWS = 128 + + // $1B800-$1DFFF (10KB) - reserved for a color RAM backup when switchin between text/graphics modes // (4KB) - reserved for sprites // (2KB) - reserved for future use diff --git a/src/kernal/screen_m65/mega65_clear_attributes.s b/src/kernal/screen_m65/mega65_clear_attributes.s deleted file mode 100644 index 7c5dc476..00000000 --- a/src/kernal/screen_m65/mega65_clear_attributes.s +++ /dev/null @@ -1,11 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -m65_clear_attributes: - - lda COLOR - and #$0F - sta COLOR - - rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index ff143655..dc49e84b 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -7,7 +7,7 @@ M65_CLRSCR: // Clear additional attributes from the color code - jsr m65_clear_attributes + jsr m65_screen_clear_colorattr // Disable the window mode @@ -79,10 +79,10 @@ m65_clrscr_loop: // Check if we are allowed to progress further lda M65_COLVIEW+1 - cmp M65_COLVIEWMAX+1 + cmp M65_COLGUARD+1 bne m65_clrscr_loop lda M65_COLVIEW+0 - cmp M65_COLVIEWMAX+0 + cmp M65_COLGUARD+0 bne m65_clrscr_loop m65_clrscr_loop_done: @@ -111,7 +111,7 @@ m65_clrscr_loop_done: // FALLTROUGH -M65_HOME: +m65_home: // XXX reuse // XXX provide proper implementation diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index 11e73155..854c31d5 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -8,7 +8,7 @@ M65_CLRWIN: // Clear additional attributes from the color code - jsr m65_clear_attributes + jsr m65_screen_clear_colorattr // Check if windowed mode; if not, go to M65_CLRSCR diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index 91247a55..8418d92e 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -2,52 +2,21 @@ // #LAYOUT# * * #IGNORE -m65_helper_scrlpnt_color: +m65_screen_clear_colorattr: - // Set .Z to the current column - - ldz M65__TXTCOL - - // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) - - lda #$0F - sta M65_LPNT_SCR+3 - lda #$F8 - sta M65_LPNT_SCR+2 - - lda M65_COLVIEW+1 - sta M65_LPNT_SCR+1 - lda M65_COLVIEW+0 - sta M65_LPNT_SCR+0 - - // Add screen row to the address - - clc - lda M65_TXTROW_OFF+0 - adc M65_LPNT_SCR+0 - sta M65_LPNT_SCR+0 - lda M65_TXTROW_OFF+1 - adc M65_LPNT_SCR+1 - sta M65_LPNT_SCR+1 + lda COLOR + and #$0F + sta COLOR rts -m65_helper_scrlpnt_to_screen: +m65_screen_upd_txtrow_off: - // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) - - lda M65_SCRSEG+1 - sta M65_LPNT_SCR+3 - lda M65_SCRSEG+0 - sta M65_LPNT_SCR+2 - - clc - lda M65_SCRBASE+0 - adc M65_LPNT_SCR+0 - sta M65_LPNT_SCR+0 - lda M65_SCRBASE+1 - adc M65_LPNT_SCR+1 - sta M65_LPNT_SCR+1 + ldy M65__TXTROW + lda m65_scrtab_rowoffset_lo,y + sta M65_TXTROW_OFF+0 + lda m65_scrtab_rowoffset_hi,y + sta M65_TXTROW_OFF+1 rts diff --git a/src/kernal/screen_m65/mega65_cursor_blink_irqpnt_to_screen.s b/src/kernal/screen_m65/mega65_screen_helpers_irq.s similarity index 100% rename from src/kernal/screen_m65/mega65_cursor_blink_irqpnt_to_screen.s rename to src/kernal/screen_m65/mega65_screen_helpers_irq.s diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s new file mode 100644 index 00000000..91247a55 --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -0,0 +1,53 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_helper_scrlpnt_color: + + // Set .Z to the current column + + ldz M65__TXTCOL + + // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) + + lda #$0F + sta M65_LPNT_SCR+3 + lda #$F8 + sta M65_LPNT_SCR+2 + + lda M65_COLVIEW+1 + sta M65_LPNT_SCR+1 + lda M65_COLVIEW+0 + sta M65_LPNT_SCR+0 + + // Add screen row to the address + + clc + lda M65_TXTROW_OFF+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + lda M65_TXTROW_OFF+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 + + rts + + +m65_helper_scrlpnt_to_screen: + + // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) + + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + + clc + lda M65_SCRBASE+0 + adc M65_LPNT_SCR+0 + sta M65_LPNT_SCR+0 + lda M65_SCRBASE+1 + adc M65_LPNT_SCR+1 + sta M65_LPNT_SCR+1 + + rts diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index c4a786e7..579d8b64 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -10,15 +10,15 @@ m65_scrtab_vic_ctrlb: // parameters for VIC control register B m65_scrtab_colviewmax_lo: // maximum allowed color viewport start - low byte - .byte <((128-25)*80) - .byte <((128-25)*80) - .byte <((128-50)*80) + .byte <((MEMCONF_SCRROWS - 25) * 80) + .byte <((MEMCONF_SCRROWS - 25) * 80) + .byte <((MEMCONF_SCRROWS - 50) * 80) m65_scrtab_colviewmax_hi: // maximum allowed color viewport start - high byte - .byte >((128-25)*80) - .byte >((128-25)*80) - .byte >((128-50)*80) + .byte >((MEMCONF_SCRROWS - 25) * 80) + .byte >((MEMCONF_SCRROWS - 25) * 80) + .byte >((MEMCONF_SCRROWS - 50) * 80) m65_scrtab_scrolx: // values for VIC_SCROLX diff --git a/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s b/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s deleted file mode 100644 index a3e16566..00000000 --- a/src/kernal/screen_m65/mega65_screen_upd_txtrow_off.s +++ /dev/null @@ -1,13 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -m65_screen_upd_txtrow_off: - - ldy M65__TXTROW - lda m65_scrtab_rowoffset_lo,y - sta M65_TXTROW_OFF+0 - lda m65_scrtab_rowoffset_hi,y - sta M65_TXTROW_OFF+1 - - rts diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 0cbe613d..aaa3137d 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -54,9 +54,9 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 // Set the logical row length to 80 ldx #$50 - // stx VIC_CHARSTEP+0 + stx VIC_CHARSTEP+0 ldx #$00 - // stx VIC_CHARSTEP+1 + stx VIC_CHARSTEP+1 // Set the following locations: // - M64_SCRWINMODE - for scroll-console mode @@ -74,13 +74,12 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 // - VIC_SCRNPTR+0/+1 - for screen viewport start // - M65_COLVIEW, VIC_COLPTR - for using color memory from the start - ldx #>($9000) + ldx #>MEMCONF_SCRBASE stx M65_SCRBASE+1 stx VIC_SCRNPTR+1 - ldx #<($9000) + ldx #($9000 + 80 * 128) + ldx #>(MEMCONF_SCRBASE + 80 * MEMCONF_SCRROWS) stx M65_SCRGUARD+1 - ldx #<(80 * 128) + ldx #<(80 * MEMCONF_SCRROWS) stx M65_COLGUARD+0 - ldx #>(80 * 128) + ldx #>(80 * MEMCONF_SCRROWS) stx M65_COLGUARD+1 ldx M65_SCRMODE From d78514c5d4a5d49da6fd88901b627fe817867d03 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 27 Aug 2020 17:13:14 +0200 Subject: [PATCH 48/96] more cleanup --- src/aliases/,aliases_hardware_m65.s | 32 +++++++++++++++-------- src/aliases/,aliases_ram_over64K_m65.s | 3 +-- src/dos_m65/,aliases_dos.s | 5 ++++ src/kernal/board_m65/mega65_map_helpers.s | 10 +++---- src/kernal/extapi_m65/mega65__jumptable.s | 8 +++--- 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 75688eaf..075f5ac6 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -10,24 +10,34 @@ // VIC-IV registers - .label VIC_KEY = $D02F - .label VIC_CTRLA = $D030 - .label VIC_CTRLB = $D031 + .label VIC_KEY = $D02F + .label VIC_CTRLA = $D030 + .label VIC_CTRLB = $D031 - .label VIC_XPOS = $D050 + .label VIC_XPOS = $D050 - .label VIC_CTRLC = $D054 + .label VIC_CTRLC = $D054 - .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line + .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line - .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory - .label VIC_COLPTR = $D064 // 2 bytes - pointer to start of color memory + .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory + .label VIC_COLPTR = $D064 // 2 bytes - pointer to start of color memory - .label VIC_CHARPTR = $D068 // 3 bytes - pointer to start of character generator + .label VIC_CHARPTR = $D068 // 3 bytes - pointer to start of character generator + + // DMAgic + + .label DMA_ADDRLSBTRIG = $D700 + .label DMA_ADDRMSB = $D701 + .label DMA_ADDRBANK = $D702 + .label DMA_EN018B = $D703 + .label DMA_ADDRMB = $D704 + .label DMA_ETRIG = $D705 + .label DMA_ADDRLSB = $D70E // MISC registers - .label MISC_BOARDID = $D629 // board identification byte - .label MISC_EMU = $D710 // to enable badlines and slow interrupts + .label MISC_BOARDID = $D629 // board identification byte + .label MISC_EMU = $D710 // to enable badlines and slow interrupts #endif diff --git a/src/aliases/,aliases_ram_over64K_m65.s b/src/aliases/,aliases_ram_over64K_m65.s index 19ef2082..f26d15a7 100644 --- a/src/aliases/,aliases_ram_over64K_m65.s +++ b/src/aliases/,aliases_ram_over64K_m65.s @@ -6,12 +6,11 @@ // $10000-$17FFF (32KB) - reserved for DOS // $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition - // $19000-$1B7FF (10KB) - reserved for virtual text screenk, 80x128 + // $19000-$1B7FF (10KB) - reserved for virtual text screen, 80x128 .const MEMCONF_SCRBASE = $9000 .const MEMCONF_SCRROWS = 128 - // $1B800-$1DFFF (10KB) - reserved for a color RAM backup when switchin between text/graphics modes // (4KB) - reserved for sprites // (2KB) - reserved for future use diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index f182d3ce..920c62b6 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -12,3 +12,8 @@ .label UNIT_FLOPPY = $06 .label UNIT_RAMDISK = $07 + + // NOTES: + // - DOS zeropage is mirrored at $8000 + // - starting from $8000, 16KB RAM is available (starting from $10000 in C65 address space) + // - additional 16KB RAM is reserved for DOS too ($14000-$17FFF), and can be banked-in if needed diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index 1453ef6c..7e2b41e0 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -74,15 +74,15 @@ map_DOS_1: phy phz - lda #$C0 + lda #$80 tab // from now on, zeropage starts from $C000 - ldy #$40 - lda #$40 - taz // $C000 <- map 8KB from $10000 + ldy #$80 + lda #$30 + taz // $8000 <- map 16KB RAM from $10000 lda #$C0 - ldx #$C1 // $4000 <- map 16KB from $20000 + ldx #$C1 // $4000 <- map 16KB ROM from $20000 map jmp_8 map_end_no_eom // no EOM, we do not want interrupts within DOS! diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 2cf575d5..00f2a016 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -11,7 +11,7 @@ M65_JMODE64: jsr M65_MODE64 -M65_JMODE65: +M65_JMODE65: // XXX consider combining with M65_JMODE64 jsr M65_MODE65 M65_JISMODE65: @@ -20,7 +20,7 @@ M65_JISMODE65: M65_JSLOW: jsr M65_SLOW -M65_JFAST: +M65_JFAST: // XXX consider combining with M65_JSLOW jsr M65_FAST M65_JSELDEV: @@ -29,13 +29,13 @@ M65_JSELDEV: M65_JCLRSCR: jsr M65_CLRSCR -M65_JCLRWIN: +M65_JCLRWIN: // XXX consider combining with M65_JCLRSCR jsr M65_CLRWIN M65_JSETWIN_XY: jsr M65_SETWIN_XY -M65_JSETWIN_WH: +M65_JSETWIN_WH: // XXX combine this with M65_JSETWIN_N, M65_JSETWIN_Y, and possibly M65_JSETWIN_XY jsr M65_SETWIN_WH M65_JSETWIN_N: From 0d07074b20134e42e0ce809df0fa450f5b7b18f7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 27 Aug 2020 21:15:01 +0200 Subject: [PATCH 49/96] more work on MEGA65 specific CHRIN --- src/aliases/,aliases_cpu.s | 10 ++++ src/aliases/,aliases_ram_lowmem.s | 2 +- src/aliases/,aliases_ram_lowmem_m65.s | 7 +-- src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/keyboard/chrin_keyboard.s | 2 +- src/kernal/screen_m65/mega65_chrin_keyboard.s | 50 ++++++++++++++++--- src/kernal/screen_m65/mega65_chrout_screen.s | 2 +- .../mega65_chrout_screen_control_1.s | 2 +- src/kernal/screen_m65/mega65_clrscr.s | 4 +- src/kernal/screen_m65/mega65_clrwin.s | 2 +- .../screen_m65/mega65_screen_helpers_K0.s | 27 ++++++++++ .../mega65_screen_helpers_scrlpnt.s | 2 +- src/kernal/screen_m65/mega65_scrmodeset.s | 4 +- src/kernal/screen_m65/mega65_setwin.s | 10 +++- 14 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_screen_helpers_K0.s diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index ddaee704..2554b234 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -97,6 +97,16 @@ #endif +// +// Some additional 65C02 instructions +// + +#if HAS_OPCODES_65C02 + +.pseudocommand inc_a { .byte $1A } +.pseudocommand dec_a { .byte $3A } + +#endif // // Some additional 65CE02 instructions diff --git a/src/aliases/,aliases_ram_lowmem.s b/src/aliases/,aliases_ram_lowmem.s index 7d6d20dd..09f1a861 100644 --- a/src/aliases/,aliases_ram_lowmem.s +++ b/src/aliases/,aliases_ram_lowmem.s @@ -147,7 +147,7 @@ .label BLNCT = $CD // cursor blink countdown .label GDBLN = $CE // cursor saved character .label BLNON = $CF // cursor visibility flag - .label CRSW = $D0 // whether to input from screen or keyboard + .label CRSW = $D0 // whether to input from screen or keyboard (if from screen, stores input offset) .label PNT = $D1 // $D1-$D2 pointer to the current screen line .label PNTR = $D3 // current screen X position (logical column), 0-79 .label QTSW = $D4 // quote mode flag diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 4a65c6b4..c7d75221 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -24,8 +24,9 @@ // Page 0 - other reused values // - .label M65__TXTROW = TBLX // screen row - .label M65__TXTCOL = PNTR // screen column + .label M65__TXTROW = TBLX // screen row + .label M65__TXTCOL = PNTR // screen column + .label M65__SCRINPUT = LSXP // pointer to the screen input, within the screen segment // // Pages 4-7 - reused screen memory @@ -44,7 +45,7 @@ .label M65_COLVIEW = $588 // $588-$589 first byte of color memory viewport .label M65_COLVIEWMAX = $58A // $58A-$58B largest allowed value of M65_COLVIEW .label M65_SCRMODE = $58C // 0 = 40x25, 1 = 80x25, 2 = 80x50 - .label M64_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled + .label M65_SCRWINMODE = $58D // $00 = normal mode, $FF = window enabled .label M65_TXTWIN_X0 = $58E // text window - top-left X coordinate, starting from 0 .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 7d139fdc..8231b46d 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -37,6 +37,7 @@ .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight +.label m65_screen_set_indx = KERNAL_0.m65_screen_set_indx .label cursor_enable = KERNAL_0.cursor_enable .label cursor_undraw_cont = KERNAL_0.cursor_undraw_cont .label cursor_timer_reset = KERNAL_0.cursor_timer_reset diff --git a/src/kernal/keyboard/chrin_keyboard.s b/src/kernal/keyboard/chrin_keyboard.s index a539f770..522c306b 100644 --- a/src/kernal/keyboard/chrin_keyboard.s +++ b/src/kernal/keyboard/chrin_keyboard.s @@ -113,7 +113,7 @@ chrin_keyboard_enter: chrin_enter_calc_length: - // Calculate length + // Get the logical line length jsr screen_get_logical_line_end_ptr iny diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 268a6eb3..25b6dca0 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -8,10 +8,11 @@ m65_chrin_keyboard: // XXX connnect this function to Kernal - // Preserve .X and .Y registers + // Preserve .X, .Y and .Z registers phx phy + phz // FALLTROUGH @@ -25,7 +26,7 @@ m65_chrin_keyboard_repeat: // XXX implement - // We have input waiting at (XXX)+CRSW + // We have input waiting at [M65__SCRINPUT]+CRSW // When CRSW = INDX, then we return a carriage return and clear the flag cmp INDX @@ -43,10 +44,16 @@ m65_chrin_keyboard_empty_line: // For an empty line, just return the carriage return + lda #$0D + + // FALLTROUGH + +m65_chrin_keyboard_end: + + plz ply plx clc - lda #$0D rts m65_chrin_keyboard_not_end_of_input: @@ -62,7 +69,7 @@ m65_chrin_keyboard_return_byte: // XXX implement - rts + jmp_8 m65_chrin_keyboard_end m65_chrin_keyboard_read: @@ -80,6 +87,8 @@ m65_chrin_keyboard_read: m65_chrin_keyboard_enter: + // Disable cursor, retrieve code from keyboard buffer + jsr m65_cursor_disable jsr pop_keyboard_buffer jsr m65_cursor_hide_if_visible @@ -87,14 +96,43 @@ m65_chrin_keyboard_enter: // It was enter. Note that we have a line of input to return, and return the first byte // after computing and storing its length (Computes Mapping the 64, p96) + // Set pointer to the input, start for the viewport offset + screen memory base + clc + lda M65_COLVIEW+0 + adc M65_SCRBASE+0 + sta M65__SCRINPUT+0 + lda M65_COLVIEW+1 + adc M65_SCRBASE+1 + sta M65__SCRINPUT+1 + // Add current row offset + clc + lda M65__SCRINPUT+0 + adc M65_TXTROW_OFF+0 + sta M65__SCRINPUT+0 + lda M65__SCRINPUT+1 + adc M65_TXTROW_OFF+1 + sta M65__SCRINPUT+1 + + // XXX for windowed mode add current column too + + // Retrieve first byte which is not space + + ldy INDX + iny + + // FALLTROUGH + +m65_chrin_enter_loop: + + dey + bmi m65_chrin_keyboard_empty_line + // XXX implement rts - - m65_chrkin_keyboard_not_enter: lda KEYD diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 61449b39..9251532d 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -75,7 +75,7 @@ m65_chrout_fix_column_row: ldy M65_SCRMODE - bit M64_SCRWINMODE + bit M65_SCRWINMODE bmi m65_chrout_fix_column_row_win // Non-windowed mode diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s index be48a266..d16ead68 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_1.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_1.s @@ -46,7 +46,7 @@ m65_chrout_screen_RETURN: // Move cursor to the beginning of the next line - bit M64_SCRWINMODE + bit M65_SCRWINMODE bpl !+ lda M65_TXTWIN_X0 skip_2_bytes_trash_nvz diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index dc49e84b..d4102e14 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -12,7 +12,7 @@ M65_CLRSCR: // Disable the window mode lda #$00 - sta M64_SCRWINMODE + sta M65_SCRWINMODE // FALLTROUGH @@ -107,6 +107,8 @@ m65_clrscr_loop_done: // Set screen variables + jsr m65_screen_set_indx + // XXX provide proper implementation // FALLTROUGH diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index 854c31d5..0aa4b859 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -12,7 +12,7 @@ M65_CLRWIN: // Check if windowed mode; if not, go to M65_CLRSCR - lda M64_SCRWINMODE + lda M65_SCRWINMODE bpl_16 m65_clrscr_takeover // To clear the window, two zeropage long pointers will be used: diff --git a/src/kernal/screen_m65/mega65_screen_helpers_K0.s b/src/kernal/screen_m65/mega65_screen_helpers_K0.s new file mode 100644 index 00000000..ceeb2649 --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_helpers_K0.s @@ -0,0 +1,27 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_screen_set_indx: // leaves value in .A + + lda M65_SCRWINMODE + bmi !+ + + // Non-windowed mode + + phx + ldx M65_SCRMODE + lda m65_scrtab_txtwidth,x + dec_a + sta INDX + plx + rts +!: + // Windowed mode + + sec + lda M65_TXTWIN_X1 + sbc M65_TXTWIN_X0 + dec_a + sta INDX + rts diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index 91247a55..0f5046ba 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -6,7 +6,7 @@ m65_helper_scrlpnt_color: // Set .Z to the current column - ldz M65__TXTCOL + ldz M65__TXTCOL // XXX probably not the best place for this // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index aaa3137d..d5eeb887 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -59,10 +59,10 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_CHARSTEP+1 // Set the following locations: - // - M64_SCRWINMODE - for scroll-console mode + // - M65_SCRWINMODE - for scroll-console mode // - M65_SCRSEG, VIC_SCRNPTR+2/+3 - for screen in $0001xxxx area - stx M64_SCRWINMODE // .X = 0 + stx M65_SCRWINMODE // .X = 0 stx M65_SCRSEG+1 stx VIC_SCRNPTR+3 inx diff --git a/src/kernal/screen_m65/mega65_setwin.s b/src/kernal/screen_m65/mega65_setwin.s index 7204be16..4aecdc27 100644 --- a/src/kernal/screen_m65/mega65_setwin.s +++ b/src/kernal/screen_m65/mega65_setwin.s @@ -33,7 +33,9 @@ M65_SETWIN_N: pha lda #$00 - sta M64_SCRWINMODE + sta M65_SCRWINMODE + + jsr m65_screen_set_indx pla rts @@ -44,7 +46,11 @@ M65_SETWIN_Y: pha lda #$FF - sta M64_SCRWINMODE + sta M65_SCRWINMODE + + jsr m65_screen_set_indx + + // XXX consider calling HOME instead lda M65_TXTWIN_X0 sta M65__TXTCOL From dee452d3525a45b949b74152fab5cad6868f423b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 27 Aug 2020 22:44:42 +0200 Subject: [PATCH 50/96] CHRIN for MEGA65 - code complete, but needs bugfixing --- .../board_m65/4000.mega65_vectable_kernal_1.s | 16 +++---- src/kernal/board_m65/mega65_imports.s | 2 + src/kernal/board_m65/mega65_redirect_screen.s | 6 +++ src/kernal/keyboard/chrin_keyboard.s | 10 ++++- src/kernal/screen_m65/mega65_chrin_keyboard.s | 42 ++++++++++++++----- .../mega65_screen_helpers_scrlpnt.s | 28 ++++++++++--- 6 files changed, 80 insertions(+), 24 deletions(-) diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 87d0a1f3..07d924d1 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -19,13 +19,14 @@ .label VK1__load_tape_auto = $4000 + 2 * 5 .label VK1__tape_head_align = $4000 + 2 * 6 .label VK1__m65_chrout_screen = $4000 + 2 * 7 - .label VK1__M65_MODE64 = $4000 + 2 * 8 - .label VK1__M65_MODE65 = $4000 + 2 * 9 - .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 - .label VK1__M65_SCRMODESET = $4000 + 2 * 11 - .label VK1__M65_CLRSCR = $4000 + 2 * 12 - .label VK1__M65_CLRWIN = $4000 + 2 * 13 - .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 + .label VK1__m65_chrin_keyboard = $4000 + 2 * 8 + .label VK1__M65_MODE64 = $4000 + 2 * 9 + .label VK1__M65_MODE65 = $4000 + 2 * 10 + .label VK1__M65_SCRMODEGET = $4000 + 2 * 11 + .label VK1__M65_SCRMODESET = $4000 + 2 * 12 + .label VK1__M65_CLRSCR = $4000 + 2 * 13 + .label VK1__M65_CLRWIN = $4000 + 2 * 14 + .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 15 #else @@ -60,6 +61,7 @@ #endif .word m65_chrout_screen + .word m65_chrin_keyboard .word M65_MODE64 .word M65_MODE65 diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 8231b46d..4e4d9cb7 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -30,6 +30,8 @@ .label udtim_keyboard = KERNAL_0.udtim_keyboard .label chrout_to_screen_code = KERNAL_0.chrout_to_screen_code .label colour_codes = KERNAL_0.colour_codes +.label screen_check_toggle_quote = KERNAL_0.screen_check_toggle_quote +.label screen_code_to_petscii = KERNAL_0.screen_code_to_petscii .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars diff --git a/src/kernal/board_m65/mega65_redirect_screen.s b/src/kernal/board_m65/mega65_redirect_screen.s index 18dacdaf..ed4d13b6 100644 --- a/src/kernal/board_m65/mega65_redirect_screen.s +++ b/src/kernal/board_m65/mega65_redirect_screen.s @@ -13,6 +13,12 @@ m65_chrout_screen: jsr map_NORMAL jmp chrout_done_success +m65_chrin_keyboard: + + jsr map_KERNAL_1 + jsr_ind VK1__m65_chrin_keyboard + jmp map_NORMAL + m65_screen_upd_txtrow_off: jsr map_KERNAL_1 diff --git a/src/kernal/keyboard/chrin_keyboard.s b/src/kernal/keyboard/chrin_keyboard.s index 522c306b..44335795 100644 --- a/src/kernal/keyboard/chrin_keyboard.s +++ b/src/kernal/keyboard/chrin_keyboard.s @@ -15,6 +15,14 @@ chrin_keyboard: stx XSAV phy_trash_a +#if ROM_LAYOUT_M65 + +/* XXX does not work yet + jsr M65_ISMODE65 + bcc_16 m65_chrin_keyboard +*/ +#endif + // FALLTROUGH chrin_keyboard_repeat: @@ -119,7 +127,7 @@ chrin_enter_calc_length: chrin_enter_loop: - // Retrieve bytes + // Skip spaces at the end of line dey bmi chrin_keyboard_empty_line lda (LSXP),y diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 25b6dca0..ebd92a43 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -8,10 +8,8 @@ m65_chrin_keyboard: // XXX connnect this function to Kernal - // Preserve .X, .Y and .Z registers + // Preserve .Z register - phx - phy phz // FALLTROUGH @@ -24,8 +22,6 @@ m65_chrin_keyboard_repeat: lda CRSW beq m65_chrin_keyboard_read - // XXX implement - // We have input waiting at [M65__SCRINPUT]+CRSW // When CRSW = INDX, then we return a carriage return and clear the flag @@ -50,9 +46,9 @@ m65_chrin_keyboard_empty_line: m65_chrin_keyboard_end: + ldx XSAV plz ply - plx clc rts @@ -67,7 +63,14 @@ m65_chrin_keyboard_not_end_of_input: m65_chrin_keyboard_return_byte: - // XXX implement + jsr m65_helper_scrlpnt_chrin + + tya + taz + lda_lp (M65_LPNT_SCR), z + + jsr screen_check_toggle_quote + jsr screen_code_to_petscii jmp_8 m65_chrin_keyboard_end @@ -113,10 +116,9 @@ m65_chrin_keyboard_enter: adc M65_TXTROW_OFF+1 sta M65__SCRINPUT+1 - // XXX for windowed mode add current column too - // Retrieve first byte which is not space + jsr m65_helper_scrlpnt_chrin ldy INDX iny @@ -124,13 +126,30 @@ m65_chrin_keyboard_enter: m65_chrin_enter_loop: + // Skip spaces at the end of line dey bmi m65_chrin_keyboard_empty_line - // XXX implement + tya + taz + lda_lp (M65_LPNT_SCR), z + cmp #$20 + beq m65_chrin_enter_loop + iny + sty INDX - rts + // XXX add windowed mode support here - correct INDX and M65__SCRINPUT + // Set mark informing that we are returning a line + ldy #$01 + sty CRSW + + // Clear quote mode mark + dey + sty QTSW + + // Return first char of line + jmp_8 m65_chrin_keyboard_return_byte // branch always m65_chrkin_keyboard_not_enter: @@ -148,3 +167,4 @@ m65_chrkin_keyboard_not_enter: jsr CHROUT jsr pop_keyboard_buffer jmp m65_chrin_keyboard_repeat + diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index 0f5046ba..f9b91ccf 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -33,15 +33,11 @@ m65_helper_scrlpnt_color: rts + m65_helper_scrlpnt_to_screen: // Change M65_LPNT_SCR to point to screen memory (when it points to color memory) - lda M65_SCRSEG+1 - sta M65_LPNT_SCR+3 - lda M65_SCRSEG+0 - sta M65_LPNT_SCR+2 - clc lda M65_SCRBASE+0 adc M65_LPNT_SCR+0 @@ -50,4 +46,26 @@ m65_helper_scrlpnt_to_screen: adc M65_LPNT_SCR+1 sta M65_LPNT_SCR+1 + // FALLTROUGH + +m65_helper_scrlpnt_to_screen_hi: + + lda M65_SCRSEG+1 + sta M65_LPNT_SCR+3 + lda M65_SCRSEG+0 + sta M65_LPNT_SCR+2 + rts + + + +m65_helper_scrlpnt_chrin: + + // Prepare the pointer for CHRIN + + lda M65__SCRINPUT+0 + sta M65_LPNT_SCR+0 + lda M65__SCRINPUT+1 + sta M65_LPNT_SCR+1 + + jmp_8 m65_helper_scrlpnt_to_screen_hi From 179ddc25438d3a4cb158a4f1911549dbf77e2b34 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 17:17:09 +0200 Subject: [PATCH 51/96] MEGA65 CHRIN variant now accepts commands --- src/basic/basic_commands_02/cmd_sysinfo.s | 11 ++++++++++- src/kernal/keyboard/chrin_keyboard.s | 19 +++++++++---------- src/kernal/screen_m65/mega65_chrin_keyboard.s | 16 +++++++++------- 3 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s index 08b2d6e4..d85cd9b2 100644 --- a/src/basic/basic_commands_02/cmd_sysinfo.s +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -38,13 +38,17 @@ cmd_sysinfo: jsr STROUT jsr print_return + + jsr M65_ISMODE65 + bcs print_sysinfo_video + jsr print_return // FALLTROUGH print_sysinfo_banner: - // Print board type + // Print board type (information not accessible in native mode) ldx #IDX__STR_SI_HDR_HW jsr print_packed_misc_str @@ -68,6 +72,11 @@ print_sysinfo_banner: lda MISC_BOARDID jsr print_hex_byte !: + + // FALLTROUGH + +print_sysinfo_video: + // Print video system information ldx #IDX__STR_SI_HDR_VID diff --git a/src/kernal/keyboard/chrin_keyboard.s b/src/kernal/keyboard/chrin_keyboard.s index 44335795..074fbdde 100644 --- a/src/kernal/keyboard/chrin_keyboard.s +++ b/src/kernal/keyboard/chrin_keyboard.s @@ -10,19 +10,18 @@ chrin_keyboard: +#if ROM_LAYOUT_M65 + + jsr M65_ISMODE65 + bcc_16 m65_chrin_keyboard + +#endif + // Preserve .X and .Y registers stx XSAV phy_trash_a -#if ROM_LAYOUT_M65 - -/* XXX does not work yet - jsr M65_ISMODE65 - bcc_16 m65_chrin_keyboard -*/ -#endif - // FALLTROUGH chrin_keyboard_repeat: @@ -86,7 +85,7 @@ chrin_keyboard_read: lda KEYD cmp #$0D - bne chrkin_keyboard_not_enter + bne chrkn_keyboard_not_enter // FALLTROUGH @@ -147,7 +146,7 @@ chrin_enter_loop: // Return first char of line beq chrin_keyboard_return_byte // branch always -chrkin_keyboard_not_enter: +chrkn_keyboard_not_enter: lda KEYD diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index ebd92a43..61894679 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -8,8 +8,10 @@ m65_chrin_keyboard: // XXX connnect this function to Kernal - // Preserve .Z register + // Preserve .X, .Y and .Z register + phx + phy phz // FALLTROUGH @@ -46,9 +48,9 @@ m65_chrin_keyboard_empty_line: m65_chrin_keyboard_end: - ldx XSAV plz ply + plx clc rts @@ -81,10 +83,9 @@ m65_chrin_keyboard_read: // Wait for a key lda NDX beq m65_chrin_keyboard_repeat - lda KEYD cmp #$0D - bne m65_chrkin_keyboard_not_enter + bne m65_chrin_keyboard_not_enter // FALLTROUGH @@ -152,14 +153,15 @@ m65_chrin_enter_loop: jmp_8 m65_chrin_keyboard_return_byte // branch always -m65_chrkin_keyboard_not_enter: +m65_chrin_keyboard_not_enter: lda KEYD #if CONFIG_PROGRAMMABLE_KEYS - jsr chrin_programmable_keys - bcc m65_chrin_keyboard_enter + // XXX do not work yet + //jsr chrin_programmable_keys + //bcc m65_chrin_keyboard_enter #endif // CONFIG_PROGRAMMABLE_KEYS From cda4c7b0d3e4842096a6c9e3bd5c9cfce67563c9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 20:09:53 +0200 Subject: [PATCH 52/96] fix for programmable keys in MEGA65 native mode --- src/kernal/board_m65/mega65_proxies.s | 2 +- src/kernal/screen_m65/mega65_chrin_keyboard.s | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/kernal/board_m65/mega65_proxies.s b/src/kernal/board_m65/mega65_proxies.s index 3120e933..1c64dfb5 100644 --- a/src/kernal/board_m65/mega65_proxies.s +++ b/src/kernal/board_m65/mega65_proxies.s @@ -9,7 +9,7 @@ proxy_K1_chrin_programmable_keys: jsr map_NORMAL - jsr CHROUT + jsr chrin_programmable_keys jmp_8 !+ proxy_K1_CHROUT: diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 61894679..14ade3dc 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -159,9 +159,8 @@ m65_chrin_keyboard_not_enter: #if CONFIG_PROGRAMMABLE_KEYS - // XXX do not work yet - //jsr chrin_programmable_keys - //bcc m65_chrin_keyboard_enter + jsr chrin_programmable_keys + bcc m65_chrin_keyboard_enter #endif // CONFIG_PROGRAMMABLE_KEYS @@ -169,4 +168,3 @@ m65_chrin_keyboard_not_enter: jsr CHROUT jsr pop_keyboard_buffer jmp m65_chrin_keyboard_repeat - From 62dbc4af2b05ef04a239b56fd4094a76e3c7cf41 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 20:23:57 +0200 Subject: [PATCH 53/96] MEGA65 related DOS Wedge fixes --- src/basic/board_m65/4000.mega65_vectable_basic_1.s | 2 +- src/basic/board_m65/mega65_proxies.s | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/basic/board_m65/4000.mega65_vectable_basic_1.s b/src/basic/board_m65/4000.mega65_vectable_basic_1.s index c81cea55..e135eda1 100644 --- a/src/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/src/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -27,7 +27,7 @@ .label VB1__helper_ask_if_sure = $4000 + 2 * 12 #if CONFIG_DOS_WEDGE - .label VB1__wedge_dos = $4000 + 2 * 12 + .label VB1__wedge_dos = $4000 + 2 * 13 #endif #else diff --git a/src/basic/board_m65/mega65_proxies.s b/src/basic/board_m65/mega65_proxies.s index 46391cb9..bfed1e2a 100644 --- a/src/basic/board_m65/mega65_proxies.s +++ b/src/basic/board_m65/mega65_proxies.s @@ -120,6 +120,6 @@ proxy_B1_fetch_uint8: proxy_B1_shell_main_loop: jsr map_NORMAL - jmp_8 !- + jmp shell_main_loop #endif From 278c57f92715589509a130bae4353fbde9183023 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 20:38:14 +0200 Subject: [PATCH 54/96] more MEGA65 DOS Wedge fixes --- src/basic/board_m65/mega65_imports.s | 4 ++-- src/basic/board_m65/mega65_proxies.s | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index f7d7af97..ce49e8c5 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -21,8 +21,8 @@ .label JSETFLS = KERNAL_0.JSETFLS .label JSETNAM = KERNAL_0.JSETNAM .label JGETIN = KERNAL_0.JGETIN -.label JCHKIN = KERNAL_0.JCHKIN -.label JCHRIN = KERNAL_0.JCHRIN +.label JCHKIN = BASIC_0.proxy_B1_JCHKIN +.label JCHRIN = BASIC_0.proxy_B1_JCHRIN .label JREADST = KERNAL_0.JREADST .label JSCREEN = KERNAL_0.JSCREEN .label SELDEV = KERNAL_0.SELDEV diff --git a/src/basic/board_m65/mega65_proxies.s b/src/basic/board_m65/mega65_proxies.s index bfed1e2a..c7e00a33 100644 --- a/src/basic/board_m65/mega65_proxies.s +++ b/src/basic/board_m65/mega65_proxies.s @@ -54,6 +54,18 @@ proxy_B1_JOPEN: #endif +proxy_B1_JCHKIN: + + jsr map_NORMAL + jsr JCHKIN + jmp_8 !- + +proxy_B1_JCHRIN: + + jsr map_NORMAL + jsr JCHRIN + jmp_8 !- + proxy_B1_JCHROUT: jsr map_NORMAL @@ -102,13 +114,13 @@ proxy_B1_fetch_character: jsr map_NORMAL jsr fetch_character - jmp_8 !- + jmp_8 !+ proxy_B1_fetch_character_skip_spaces: jsr map_NORMAL jsr fetch_character_skip_spaces - jmp_8 !- + jmp_8 !+ proxy_B1_fetch_uint8: From 0ed000de3039018b62c014ac53b4b869255797ff Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 21:14:34 +0200 Subject: [PATCH 55/96] fixed error messages in MEGA65 native mode --- src/aliases/,aliases_ram_lowmem_m65.s | 9 +++++---- src/basic/engine_runtime/do_error.s | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index c7d75221..07316987 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -7,7 +7,7 @@ // - // Page 0 - reused LDTB1 + // Page 0 - reused LDTB1 and USER // .label M65_TMP__K1 = $D9 // $D9 -- UNUSED -- temporary value for various Kernal routines @@ -16,9 +16,10 @@ .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 - .label M65_TMP__K2 = $F2 // $F2 -- UNUSED -- temporary value for various Kernal routines + // EA reserved for BASIC error handling routines, also in native mode + .label M65_LPNT_IRQ = $EB // $EB-$EE 4-byte pointer for temporary usage within interrupts + .label M65_LPNT_KERN = $EF // $EF-$F3 4-byte pointer for temporary usage by KERNAL + .label M65_TMP__K2 = $F4 // $F4 -- UNUSED -- temporary value for various Kernal routines // // Page 0 - other reused values diff --git a/src/basic/engine_runtime/do_error.s b/src/basic/engine_runtime/do_error.s index a3d64f63..56501647 100644 --- a/src/basic/engine_runtime/do_error.s +++ b/src/basic/engine_runtime/do_error.s @@ -163,7 +163,7 @@ do_error_fetch: // $E6 has even part asl ora $EA - and #$7f + and #$7F tax // Restore $EA to correct value in case the NOP above is used From 64ae9ad75b57ec3cfbb3dc64b9e73457ad210ea9 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 23:15:17 +0200 Subject: [PATCH 56/96] switching from MEGA65 native mode to legacy mode works now --- src/kernal/board_m65/mega65_imports.s | 2 ++ src/kernal/board_m65/mega65_viciv_init.s | 27 ++++++++++++++++++ src/kernal/board_m65/mega65_viciv_shutdown.s | 29 ++++++++++++++++++++ src/kernal/board_m65/mega65_viciv_unhide.s | 10 ++----- src/kernal/extapi_m65/mega65_mode64.s | 17 ++---------- src/kernal/extapi_m65/mega65_mode65.s | 22 ++------------- src/kernal/panic.s | 8 ++++++ 7 files changed, 74 insertions(+), 41 deletions(-) create mode 100644 src/kernal/board_m65/mega65_viciv_init.s create mode 100644 src/kernal/board_m65/mega65_viciv_shutdown.s diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 4e4d9cb7..7077b18f 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -36,6 +36,8 @@ .label setup_irq_timer = KERNAL_0.setup_irq_timer .label wait_x_bars = KERNAL_0.wait_x_bars .label viciv_unhide = KERNAL_0.viciv_unhide +.label viciv_init = KERNAL_0.viciv_init +.label viciv_shutdown = KERNAL_0.viciv_shutdown .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight diff --git a/src/kernal/board_m65/mega65_viciv_init.s b/src/kernal/board_m65/mega65_viciv_init.s new file mode 100644 index 00000000..000bf1b1 --- /dev/null +++ b/src/kernal/board_m65/mega65_viciv_init.s @@ -0,0 +1,27 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Routine to initialize VIC-IV for entering MEGA65 native mode +// + + +viciv_init: + + // Switch VIC to VIC-IV mode + + jsr viciv_unhide + + // Disable badlines and slow interrupt emulation + + lda #$00 + sta MISC_EMU + + // Set misc VIC-IV flags + + lda #%01000000 // enable C65 character set + sta VIC_CTRLA + + // XXX enable 48 MHz mode in VIC_CTRLC + + rts diff --git a/src/kernal/board_m65/mega65_viciv_shutdown.s b/src/kernal/board_m65/mega65_viciv_shutdown.s new file mode 100644 index 00000000..553cd580 --- /dev/null +++ b/src/kernal/board_m65/mega65_viciv_shutdown.s @@ -0,0 +1,29 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Routine to shutdown VIC-IV for leaving MEGA65 native mode +// + + +viciv_shutdown: + + // Switch VIC to VIC-IV mode, temporarily + + jsr viciv_unhide + + // Reenable badlines and slow interrupt emulation + + lda #$03 + sta MISC_EMU + + // Set misc VIC-IV flags + + lda #%00000000 + sta VIC_CTRLA // enable C64 character set + sta VIC_CTRLB // disable extended resolution and attributes + + // Hide VIC-IV registers and quit + + sta VIC_KEY + rts diff --git a/src/kernal/board_m65/mega65_viciv_unhide.s b/src/kernal/board_m65/mega65_viciv_unhide.s index 179950f3..2961cb3a 100644 --- a/src/kernal/board_m65/mega65_viciv_unhide.s +++ b/src/kernal/board_m65/mega65_viciv_unhide.s @@ -1,15 +1,11 @@ -// #LAYOUT# STD * #TAKE -// #LAYOUT# X16 * #IGNORE -// #LAYOUT# * KERNAL_0 #TAKE +// #LAYOUT# M65 KERNAL_0 #TAKE // #LAYOUT# * * #IGNORE // -// Routine to unhide Mega65 extra registers +// Routine to unhide MEGA65 extra registers // -#if ROM_LAYOUT_M65 - viciv_unhide: lda #$47 @@ -18,5 +14,3 @@ viciv_unhide: sta VIC_KEY rts - -#endif diff --git a/src/kernal/extapi_m65/mega65_mode64.s b/src/kernal/extapi_m65/mega65_mode64.s index 14910d22..010e85ea 100644 --- a/src/kernal/extapi_m65/mega65_mode64.s +++ b/src/kernal/extapi_m65/mega65_mode64.s @@ -8,8 +8,6 @@ M65_MODE64: sei - // XXX provide full implementation - switch back to normal text mode - // Set the magic string to mark legacy mode lda #$00 @@ -17,19 +15,10 @@ M65_MODE64: sta M65_MAGICSTR+1 sta M65_MAGICSTR+2 - // Reenable badlines and slow interrupt emulation + // Restore VIC-II configuration - lda #$03 - sta MISC_EMU - - // Set misc VIC-IV flags - - lda %00000000 // enable C64 character set - sta VIC_CTRLA - - // Switch to VIC-II mode - - sta VIC_KEY + jsr viciv_shutdown + jsr setup_vicii // Reenable interrupts diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s index 273f98ee..100ffeb0 100644 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -21,27 +21,11 @@ M65_MODE65: lda #$35 // '5' sta M65_MAGICSTR+2 - // XXX find a better place for code below + // Initialize VIC-IV - // Switch VIC to VIC-IV mode + jsr viciv_init - jsr viciv_unhide - - // Disable badlines and slow interrupt emulation - - lda #$00 - sta MISC_EMU - - // Set misc VIC-IV flags - - lda %01000000 // enable C65 character set - sta VIC_CTRLA - - // XXX enable 48 MHz mode in VIC_CTRLC - - // XXX posibly alter other settings - - // Set screen mode to 80x25 + // Set screen mode to 80x50 lda #$02 jsr m65_scrmodeset_internal diff --git a/src/kernal/panic.s b/src/kernal/panic.s index 7e2ef9c4..f2a8023a 100644 --- a/src/kernal/panic.s +++ b/src/kernal/panic.s @@ -16,6 +16,14 @@ panic: sei pha +#if ROM_LAYOUT_M65 + + // Make sure we are in legacy mode + + jsr M65_MODE64 + +#endif + // Reinitialize the hardware jsr IOINIT From fbe95ba9c2b5945a1624520e2344578a5e5682d6 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 23:44:16 +0200 Subject: [PATCH 57/96] Kernal panic now works in MEGA65 native mode too --- src/basic/basic_commands/cmd_go_goto_run.s | 2 +- src/kernal/extapi_m65/mega65_mode65.s | 1 + src/kernal/interrupts/fe66.default_brk_handler.s | 8 ++++++++ src/kernal/panic.s | 3 ++- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 8639d57b..96744238 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -22,7 +22,7 @@ cmd_go_syntax_error: dew TXTPTR // unconsume character - // Fetch mode + // Fetch desired mode jsr fetch_uint8 diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s index 100ffeb0..8dd88f24 100644 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ b/src/kernal/extapi_m65/mega65_mode65.s @@ -23,6 +23,7 @@ M65_MODE65: // Initialize VIC-IV + jsr setup_vicii jsr viciv_init // Set screen mode to 80x50 diff --git a/src/kernal/interrupts/fe66.default_brk_handler.s b/src/kernal/interrupts/fe66.default_brk_handler.s index 782a0d6b..eb7e2cec 100644 --- a/src/kernal/interrupts/fe66.default_brk_handler.s +++ b/src/kernal/interrupts/fe66.default_brk_handler.s @@ -22,6 +22,14 @@ default_brk_handler: see // disable extended stack +#endif + +#if ROM_LAYOUT_M65 + + // Make sure we have normal memory mapping + + jsr map_NORMAL + #endif jsr JRESTOR diff --git a/src/kernal/panic.s b/src/kernal/panic.s index f2a8023a..f214ddee 100644 --- a/src/kernal/panic.s +++ b/src/kernal/panic.s @@ -18,8 +18,9 @@ panic: #if ROM_LAYOUT_M65 - // Make sure we are in legacy mode + // Make sure we are in legacy mode with normal memory mapping + jsr map_NORMAL jsr M65_MODE64 #endif From 098e1b7540763eede732faac4650fe5563c3a034 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Fri, 28 Aug 2020 23:50:25 +0200 Subject: [PATCH 58/96] more robust panic screen --- src/kernal/panic.s | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/kernal/panic.s b/src/kernal/panic.s index f214ddee..45c1c4ac 100644 --- a/src/kernal/panic.s +++ b/src/kernal/panic.s @@ -11,10 +11,14 @@ panic: - // Disable interrupts, store error code on stack + // Store error code on stack + + pha + + // Reinitialize the hardware sei - pha + jsr IOINIT #if ROM_LAYOUT_M65 @@ -22,13 +26,14 @@ panic: jsr map_NORMAL jsr M65_MODE64 + sei + +#else + + jsr setup_vicii #endif - // Reinitialize the hardware - - jsr IOINIT - jsr setup_vicii jsr clear_screen // Disable NMIs From 7bcc7d6014a4bd979a9b242512fb22c3b1ea9e24 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 15:03:03 +0200 Subject: [PATCH 59/96] tweaked MEGA65 startup banner, updated documentation --- doc/Extended-BASIC-TODO.md | 2 +- src/basic/assets/startup_banner_m65.s | 28 +++++++++++++++------------ src/basic/basic_commands/cmd_rem.s | 2 ++ 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/doc/Extended-BASIC-TODO.md b/doc/Extended-BASIC-TODO.md index 7f2ce4a7..7c683e6a 100644 --- a/doc/Extended-BASIC-TODO.md +++ b/doc/Extended-BASIC-TODO.md @@ -27,7 +27,7 @@ Ideas for the future, most of them suitable for Mega65 or other power machines o * `XOR` operator * `AUTO` - line auto numbering * `RENUMBER` for chanign the line numbers -* `IF ... THEN ... ELSE`, `BEGIN ... BEND` +* `IF ... THEN`, `BEGIN ... BEND`; `ELSE` not planned, as it would have slown down the execution * consider `BOOT` command * possibly some commands for creating menus and dialog boxes * more configurable `INPUT` diff --git a/src/basic/assets/startup_banner_m65.s b/src/basic/assets/startup_banner_m65.s index fc10ded0..c3c74cff 100644 --- a/src/basic/assets/startup_banner_m65.s +++ b/src/basic/assets/startup_banner_m65.s @@ -12,22 +12,26 @@ startup_banner: // Fancy Mega65 banner - from Retrofan, slightly tweaked - .byte $9A, $12, $20, $20, $7F, $A9, $20, $20, $1F, $20, $9A, $20, $20, $20, $20, $1F - .byte $20, $9A, $A9, $20, $20, $20, $92, $A1, $1F, $12, $20, $9A, $A9, $20, $20, $20 - .byte $7F, $1F, $20, $20, $9A, $A3, $A3, $A3, $A3, $A3, $A3, $A3, $1F + + // remove unneeded $1F's (blue) and $9A's (light blue) + + + .byte $9A, $12, $20, $20, $7F, $A9, $20, $20, $92, $20, $12, $20, $20, $20, $20, $92 + .byte $20, $12, $A9, $20, $20, $20, $92, $A1, $20, $12, $A9, $20, $20, $20, $7F, $92 + .byte $20, $20, $12, $A3, $A3, $A3, $A3, $A3, $A3, $A3 .byte $0D .byte $9A, $12, $20, $20, $20, $20, $20 - .byte $20, $1F, $20, $9A, $20, $20, $92, $A2, $bb, $1F, $12, $20, $9A, $20, $20, $92 - .byte $Ac, $A2, $A2, $1F, $12, $20, $9A, $20, $20, $1F, $20, $9A, $20, $20, $1F, $20 - .byte $20, $1e, $A3, $A3, $A3, $A3, $A3, $A3, $1F + .byte $20, $92, $20, $12, $20, $20, $92, $A2, $BB, $92, $20, $12, $20, $20, $92, $AC + .byte $A2, $A2, $20, $9A, $12, $20, $20, $92, $20, $12, $20, $20, $92, $20, $20, $12 + .byte $1E, $A3, $A3, $A3, $A3, $A3, $A3 .byte $0D - .byte $9A, $12, $20, $20, $92, $7F, $A9, $12, $20, $20, $1F, $20, $9A, $20, $20, $A2 - .byte $92, $be, $1F, $12, $20, $9A, $20, $20, $92, $bc, $12, $20, $20, $1F, $20, $9A - .byte $20, $20, $20, $20, $20, $1F, $20, $20, $9e, $A3, $A3, $A3, $A3, $A3, $1F + .byte $9A, $12, $20, $20, $92, $7F, $A9, $12, $20, $20, $92, $20, $12, $20, $20, $A2 + .byte $92, $BE, $92, $20, $12, $20, $20, $92, $BC, $12, $20, $20, $92, $20, $12, $20 + .byte $20, $20, $20, $20, $92, $20, $20, $12, $9E, $A3, $A3, $A3, $A3, $A3 .byte $0D - .byte $9A, $12, $20, $20, $1F, $20, $20, $9A, $20, $20, $1F, $20, $9A, $20, $20, $20 - .byte $20, $1F, $20, $9A, $20, $20, $20, $20, $20, $1F, $20, $9A, $20, $20, $1F, $20 - .byte $9A, $20, $20, $1F, $20, $20, $96, $A3, $A3, $A3, $A3, $1F, $92 + .byte $9A, $12, $20, $20, $92, $20, $20, $12, $20, $20, $92, $20, $12, $20, $20, $20 + .byte $20, $92, $20, $12, $20, $20, $20, $20, $20, $92, $20, $12, $20, $20, $92, $20 + .byte $12, $20, $20, $92, $20, $20, $12, $96, $A3, $A3, $A3, $A3, $1F, $92 .byte $0D, $0D, $05, $00 // Fancy Mega65 banner - from Retrofan diff --git a/src/basic/basic_commands/cmd_rem.s b/src/basic/basic_commands/cmd_rem.s index ea139303..71fa8057 100644 --- a/src/basic/basic_commands/cmd_rem.s +++ b/src/basic/basic_commands/cmd_rem.s @@ -7,6 +7,8 @@ cmd_rem: + inc $d021 + // XXX do we need these PHA's? pha From db08fd15742635fecc067e2fdc0107f9ac1d91f7 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 16:35:08 +0200 Subject: [PATCH 60/96] removed some test code, updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes src/basic/basic_commands/cmd_rem.s | 2 -- src/kernal/iec/chkin_iec.s | 2 +- src/kernal/iec/iec_pull_release.s | 2 +- src/kernal/iostack/f20e.chkin.s | 2 ++ 10 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index dd989da4a6f2f146d510f9d2494d83f37709457d..ac383f5c74a5e88f7541fd44adbdf6b40750725a 100644 GIT binary patch delta 13 UcmZp0XmHpNC(md(IbMDt03h)Mng9R* delta 13 UcmZp0XmHpNC(md$IbMDt03hN7mjD0& diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index e7f1464a5b486035c00922e3d0baeba58b55db1b..8c71b1f147f124856e09df85c3e7d032673bed6b 100644 GIT binary patch delta 13 UcmZp0XmHpNC(md(IbMDt03h)Mng9R* delta 13 UcmZp0XmHpNC(md$IbMDt03hN7mjD0& diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index 8bf2c370d7dc254498afd9159b2af8acbb9b1ce9..d7a3ffaa5fb7bf383a7b769a2358fe08383eb252 100644 GIT binary patch delta 22 ecmZp0XmHqYl!ei9^D&mcLQEbNn~#cHa{vHkH3(Dy delta 22 ecmZp0XmHqYl!ei3^D&mcLQEANn~#cHa{vHkI|xw# diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index a43d9b024e7a500cff81c5562ddc7656b90e02d8..c67a3b2e1cb62de5532b0aab8c01f6475d34ef8c 100644 GIT binary patch delta 22 dcmZp0XmHqYl!ei9^D!1hVJ44?%`e5pIRISl2YCPh delta 22 dcmZp0XmHqYl!ei3^D!1hVWtX?%`e5pIRISr2X+7e diff --git a/bin/mega65.rom b/bin/mega65.rom index 10de558af534cab4342b19488d5941f59f56ba5d..2ef6602a60b21edc06799335ac54efa7ab0e4ba9 100644 GIT binary patch delta 8568 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 delta 8420 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 delta 8420 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 Date: Sat, 29 Aug 2020 21:08:34 +0200 Subject: [PATCH 61/96] work on INS support for MEGA65 mode --- src/kernal/screen/chrout_screen.s | 20 ++--- .../screen/chrout_screen_jumptable_codes.s | 2 +- src/kernal/screen_m65/mega65_chrout_screen.s | 13 ++- .../screen_m65/mega65_chrout_screen_control.s | 8 +- .../mega65_chrout_screen_control_2.s | 87 ++++++++++++++++--- .../screen_m65/mega65_chrout_screen_quote.s | 22 +++++ src/kernal/screen_m65/mega65_cursor.s | 1 + .../mega65_screen_helpers_scrlpnt.s | 4 - .../screen_m65/mega65_screen_tables_misc.s | 2 +- 9 files changed, 126 insertions(+), 33 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_chrout_screen_quote.s diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index 596a3ce9..e306fdcb 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -41,16 +41,6 @@ chrout_screen_literal: // entry point for chrout_screen_quote tax // store screen code, we need .A for calculations - // First we need offset from PNT in .Y, we can take it from PNTR - - jsr screen_get_clipped_PNTR - - // Put the character on the screen - - txa - ora RVS // Computes Mapping the 64, page 38 - sta (PNT),y - // Decrement number of chars waiting to be inserted lda INSRT @@ -62,6 +52,16 @@ chrout_screen_literal: // entry point for chrout_screen_quote txa jsr screen_check_toggle_quote + // First we need offset from PNT in .Y, we can take it from PNTR + + jsr screen_get_clipped_PNTR + + // Put the character on the screen + + txa + ora RVS // Computes Mapping the 64, page 38 + sta (PNT),y + // Set colour of the newly printed character lda COLOR diff --git a/src/kernal/screen/chrout_screen_jumptable_codes.s b/src/kernal/screen/chrout_screen_jumptable_codes.s index 4299d42a..000284bd 100644 --- a/src/kernal/screen/chrout_screen_jumptable_codes.s +++ b/src/kernal/screen/chrout_screen_jumptable_codes.s @@ -23,10 +23,10 @@ chrout_screen_jumptable_codes: .byte KEY_CRSR_LEFT .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP - .byte KEY_INS __chrout_screen_jumptable_quote_guard: + .byte KEY_INS #if CONFIG_EDIT_STOPQUOTE .byte KEY_STOP #endif diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 9251532d..9f444318 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -38,12 +38,13 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote phz - // Prepare .Z and M65_LPNT_SCR for colour memory manipulation + // Prepare M65_LPNT_SCR for colour memory manipulation jsr m65_helper_scrlpnt_color // Store the new color in screen memory + ldz M65__TXTCOL lda COLOR sta_lp (M65_LPNT_SCR),z @@ -51,6 +52,16 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote jsr m65_helper_scrlpnt_to_screen + // Decrement number of chars waiting to be inserted + + lda INSRT + beq !+ + dec INSRT +!: + // Toggle quote flag if required + txa + jsr screen_check_toggle_quote + // Store the new character in screen memory, restore .Z txa diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 55cf1b07..1fef3924 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -75,14 +75,10 @@ m65_chrout_try_color_loop: // XXX: implement screen routines below: -m65_chrout_screen_quote: - nop m65_chrout_screen_CLR: nop m65_chrout_screen_HOME: nop -m65_chrout_screen_INS: - nop m65_chrout_screen_TAB: nop m65_chrout_screen_LINE_FEED: @@ -101,7 +97,9 @@ m65_chrout_screen_ESC: nop m65_chrout_screen_BELL: nop -m65_chrout_screen_STOP: +m65_chrout_screen_GFX: + nop +m65_chrout_screen_TXT: nop m65_chrout_screen_DEL: nop diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index 8ebfcfa2..d6bca52c 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -40,19 +40,84 @@ m65_chrout_screen_SHIFT_OFF: sta MODE jmp_8 m65_chrout_screen_ctrl2_end +// STOP key -// GFX/TXT switching support +m65_chrout_screen_STOP: -m65_chrout_screen_GFX: - - lda VIC_YMCSB - and #$02 // to upper case -!: - sta VIC_YMCSB + lda #$00 + sta QTSW + sta INSRT jmp_8 m65_chrout_screen_ctrl2_end -m65_chrout_screen_TXT: +// INS key - lda VIC_YMCSB - ora #$02 // to lower case - bne !- // branch always +m65_chrout_screen_INS: + + // First prepare the pointer to the current row + + jsr m65_helper_scrlpnt_color + jsr m65_helper_scrlpnt_to_screen + + // Check for windowed mode + + lda M65_SCRWINMODE + bmi_16 m65_chrout_screen_INS_winmode + + // Check if last character of the line is space + + ldy M65_SCRMODE + lda m65_scrtab_txtwidth,y + dec_a + taz + lda_lp (M65_LPNT_SCR), z + cmp #$20 + bne_16 m65_chrout_screen_ctrl2_end + phz + + // Last character is space - move the characters + + jsr m65_chrout_screen_INS_copy + + // Store space in the current character cell + + lda #$20 + sta_lp (M65_LPNT_SCR), z + + // Move the color memory + + jsr m65_helper_scrlpnt_color + plz + jsr m65_chrout_screen_INS_copy + + // Store current colour in the current character cell + + lda COLOR + and #$0F + sta_lp (M65_LPNT_SCR), z + + // Increase insert mode count (which causes quote-mode like behaviour) and quit + + inc INSRT + jmp_8 m65_chrout_screen_ctrl2_end + +m65_chrout_screen_INS_winmode: + + // Check if last character of the line within window is space + + // XXX provide implementation + + jmp_8 m65_chrout_screen_ctrl2_end + + + +m65_chrout_screen_INS_copy: + + dez + lda_lp (M65_LPNT_SCR), z + inz + sta_lp (M65_LPNT_SCR), z + dez + cpz M65__TXTCOL + bne m65_chrout_screen_INS_copy + + rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen_quote.s b/src/kernal/screen_m65/mega65_chrout_screen_quote.s new file mode 100644 index 00000000..16f0668a --- /dev/null +++ b/src/kernal/screen_m65/mega65_chrout_screen_quote.s @@ -0,0 +1,22 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + +// +// CHROUT routine - screen support, control codes in quote mode, MEGA65 native mode version +// + + +m65_chrout_screen_quote: + + // Low control codes are just +$80 + clc + adc #$80 + + // If it overflowed, then it is a high control code, + // so we need to make it be $80 + $40 + char + // as we will have flipped back to just $00 + char, we should + // now add $c0 if C is set from overflow + bcc !+ + adc #$BF // C=1, so adding $BF + C = add $C0 +!: + jmp m65_chrout_screen_literal diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 54d0ec36..3df29bf2 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -39,6 +39,7 @@ m65_cursor_undraw: // Cursor undraw - color jsr m65_helper_scrlpnt_color + ldz M65__TXTCOL lda GDCOL sta_lp (M65_LPNT_SCR),z diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index f9b91ccf..31630d11 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -4,10 +4,6 @@ m65_helper_scrlpnt_color: - // Set .Z to the current column - - ldz M65__TXTCOL // XXX probably not the best place for this - // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) lda #$0F diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 579d8b64..578f19c5 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -59,7 +59,6 @@ m65_chrout_screen_jumptable_codes: .byte KEY_CRSR_LEFT .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP - .byte KEY_INS .byte KEY_TAB .byte KEY_LINE_FEED .byte KEY_UNDERLINE_ON @@ -72,6 +71,7 @@ m65_chrout_screen_jumptable_codes: __m65_chrout_screen_jumptable_quote_guard: + .byte KEY_INS .byte KEY_STOP .byte KEY_DEL .byte KEY_RETURN From c9d68d8586859ad764e7b1a4f5bfe99178be0da4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 21:11:48 +0200 Subject: [PATCH 62/96] Revert wrong commit "work on INS support for MEGA65 mode" This reverts commit 2c5e181457d6baeaeadb206576df302543f3aa96. --- src/kernal/screen/chrout_screen.s | 20 ++--- .../screen/chrout_screen_jumptable_codes.s | 2 +- src/kernal/screen_m65/mega65_chrout_screen.s | 13 +-- .../screen_m65/mega65_chrout_screen_control.s | 8 +- .../mega65_chrout_screen_control_2.s | 87 +++---------------- .../screen_m65/mega65_chrout_screen_quote.s | 22 ----- src/kernal/screen_m65/mega65_cursor.s | 1 - .../mega65_screen_helpers_scrlpnt.s | 4 + .../screen_m65/mega65_screen_tables_misc.s | 2 +- 9 files changed, 33 insertions(+), 126 deletions(-) delete mode 100644 src/kernal/screen_m65/mega65_chrout_screen_quote.s diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index e306fdcb..596a3ce9 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -41,6 +41,16 @@ chrout_screen_literal: // entry point for chrout_screen_quote tax // store screen code, we need .A for calculations + // First we need offset from PNT in .Y, we can take it from PNTR + + jsr screen_get_clipped_PNTR + + // Put the character on the screen + + txa + ora RVS // Computes Mapping the 64, page 38 + sta (PNT),y + // Decrement number of chars waiting to be inserted lda INSRT @@ -52,16 +62,6 @@ chrout_screen_literal: // entry point for chrout_screen_quote txa jsr screen_check_toggle_quote - // First we need offset from PNT in .Y, we can take it from PNTR - - jsr screen_get_clipped_PNTR - - // Put the character on the screen - - txa - ora RVS // Computes Mapping the 64, page 38 - sta (PNT),y - // Set colour of the newly printed character lda COLOR diff --git a/src/kernal/screen/chrout_screen_jumptable_codes.s b/src/kernal/screen/chrout_screen_jumptable_codes.s index 000284bd..4299d42a 100644 --- a/src/kernal/screen/chrout_screen_jumptable_codes.s +++ b/src/kernal/screen/chrout_screen_jumptable_codes.s @@ -23,10 +23,10 @@ chrout_screen_jumptable_codes: .byte KEY_CRSR_LEFT .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP + .byte KEY_INS __chrout_screen_jumptable_quote_guard: - .byte KEY_INS #if CONFIG_EDIT_STOPQUOTE .byte KEY_STOP #endif diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 9f444318..9251532d 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -38,13 +38,12 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote phz - // Prepare M65_LPNT_SCR for colour memory manipulation + // Prepare .Z and M65_LPNT_SCR for colour memory manipulation jsr m65_helper_scrlpnt_color // Store the new color in screen memory - ldz M65__TXTCOL lda COLOR sta_lp (M65_LPNT_SCR),z @@ -52,16 +51,6 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote jsr m65_helper_scrlpnt_to_screen - // Decrement number of chars waiting to be inserted - - lda INSRT - beq !+ - dec INSRT -!: - // Toggle quote flag if required - txa - jsr screen_check_toggle_quote - // Store the new character in screen memory, restore .Z txa diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 1fef3924..55cf1b07 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -75,10 +75,14 @@ m65_chrout_try_color_loop: // XXX: implement screen routines below: +m65_chrout_screen_quote: + nop m65_chrout_screen_CLR: nop m65_chrout_screen_HOME: nop +m65_chrout_screen_INS: + nop m65_chrout_screen_TAB: nop m65_chrout_screen_LINE_FEED: @@ -97,9 +101,7 @@ m65_chrout_screen_ESC: nop m65_chrout_screen_BELL: nop -m65_chrout_screen_GFX: - nop -m65_chrout_screen_TXT: +m65_chrout_screen_STOP: nop m65_chrout_screen_DEL: nop diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index d6bca52c..8ebfcfa2 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -40,84 +40,19 @@ m65_chrout_screen_SHIFT_OFF: sta MODE jmp_8 m65_chrout_screen_ctrl2_end -// STOP key -m65_chrout_screen_STOP: +// GFX/TXT switching support - lda #$00 - sta QTSW - sta INSRT +m65_chrout_screen_GFX: + + lda VIC_YMCSB + and #$02 // to upper case +!: + sta VIC_YMCSB jmp_8 m65_chrout_screen_ctrl2_end -// INS key +m65_chrout_screen_TXT: -m65_chrout_screen_INS: - - // First prepare the pointer to the current row - - jsr m65_helper_scrlpnt_color - jsr m65_helper_scrlpnt_to_screen - - // Check for windowed mode - - lda M65_SCRWINMODE - bmi_16 m65_chrout_screen_INS_winmode - - // Check if last character of the line is space - - ldy M65_SCRMODE - lda m65_scrtab_txtwidth,y - dec_a - taz - lda_lp (M65_LPNT_SCR), z - cmp #$20 - bne_16 m65_chrout_screen_ctrl2_end - phz - - // Last character is space - move the characters - - jsr m65_chrout_screen_INS_copy - - // Store space in the current character cell - - lda #$20 - sta_lp (M65_LPNT_SCR), z - - // Move the color memory - - jsr m65_helper_scrlpnt_color - plz - jsr m65_chrout_screen_INS_copy - - // Store current colour in the current character cell - - lda COLOR - and #$0F - sta_lp (M65_LPNT_SCR), z - - // Increase insert mode count (which causes quote-mode like behaviour) and quit - - inc INSRT - jmp_8 m65_chrout_screen_ctrl2_end - -m65_chrout_screen_INS_winmode: - - // Check if last character of the line within window is space - - // XXX provide implementation - - jmp_8 m65_chrout_screen_ctrl2_end - - - -m65_chrout_screen_INS_copy: - - dez - lda_lp (M65_LPNT_SCR), z - inz - sta_lp (M65_LPNT_SCR), z - dez - cpz M65__TXTCOL - bne m65_chrout_screen_INS_copy - - rts + lda VIC_YMCSB + ora #$02 // to lower case + bne !- // branch always diff --git a/src/kernal/screen_m65/mega65_chrout_screen_quote.s b/src/kernal/screen_m65/mega65_chrout_screen_quote.s deleted file mode 100644 index 16f0668a..00000000 --- a/src/kernal/screen_m65/mega65_chrout_screen_quote.s +++ /dev/null @@ -1,22 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - -// -// CHROUT routine - screen support, control codes in quote mode, MEGA65 native mode version -// - - -m65_chrout_screen_quote: - - // Low control codes are just +$80 - clc - adc #$80 - - // If it overflowed, then it is a high control code, - // so we need to make it be $80 + $40 + char - // as we will have flipped back to just $00 + char, we should - // now add $c0 if C is set from overflow - bcc !+ - adc #$BF // C=1, so adding $BF + C = add $C0 -!: - jmp m65_chrout_screen_literal diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 3df29bf2..54d0ec36 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -39,7 +39,6 @@ m65_cursor_undraw: // Cursor undraw - color jsr m65_helper_scrlpnt_color - ldz M65__TXTCOL lda GDCOL sta_lp (M65_LPNT_SCR),z diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index 31630d11..f9b91ccf 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -4,6 +4,10 @@ m65_helper_scrlpnt_color: + // Set .Z to the current column + + ldz M65__TXTCOL // XXX probably not the best place for this + // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) lda #$0F diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 578f19c5..579d8b64 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -59,6 +59,7 @@ m65_chrout_screen_jumptable_codes: .byte KEY_CRSR_LEFT .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP + .byte KEY_INS .byte KEY_TAB .byte KEY_LINE_FEED .byte KEY_UNDERLINE_ON @@ -71,7 +72,6 @@ m65_chrout_screen_jumptable_codes: __m65_chrout_screen_jumptable_quote_guard: - .byte KEY_INS .byte KEY_STOP .byte KEY_DEL .byte KEY_RETURN From 1cc254fa18852381ad18acab2b96675908d1bf82 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 21:33:09 +0200 Subject: [PATCH 63/96] work towards quote mode in MEGA65 screen editor --- .../screen_m65/mega65_chrout_screen_control.s | 8 +++---- .../mega65_chrout_screen_control_2.s | 17 ++++---------- src/kernal/screen_m65/mega65_screen_quote.s | 23 +++++++++++++++++++ 3 files changed, 32 insertions(+), 16 deletions(-) create mode 100644 src/kernal/screen_m65/mega65_screen_quote.s diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 55cf1b07..57719d76 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -75,8 +75,6 @@ m65_chrout_try_color_loop: // XXX: implement screen routines below: -m65_chrout_screen_quote: - nop m65_chrout_screen_CLR: nop m65_chrout_screen_HOME: @@ -101,9 +99,11 @@ m65_chrout_screen_ESC: nop m65_chrout_screen_BELL: nop -m65_chrout_screen_STOP: - nop m65_chrout_screen_DEL: nop +m65_chrout_screen_GFX: + nop +m65_chrout_screen_TXT: + nop jmp m65_chrout_screen_done diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index 8ebfcfa2..61f8e8c8 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -41,18 +41,11 @@ m65_chrout_screen_SHIFT_OFF: jmp_8 m65_chrout_screen_ctrl2_end -// GFX/TXT switching support +// STOP key support -m65_chrout_screen_GFX: +m65_chrout_screen_STOP: - lda VIC_YMCSB - and #$02 // to upper case -!: - sta VIC_YMCSB + lda #$00 + sta QTSW + sta INSRT jmp_8 m65_chrout_screen_ctrl2_end - -m65_chrout_screen_TXT: - - lda VIC_YMCSB - ora #$02 // to lower case - bne !- // branch always diff --git a/src/kernal/screen_m65/mega65_screen_quote.s b/src/kernal/screen_m65/mega65_screen_quote.s new file mode 100644 index 00000000..7e89455c --- /dev/null +++ b/src/kernal/screen_m65/mega65_screen_quote.s @@ -0,0 +1,23 @@ + +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + +// +// CHROUT routine - screen support, control codes in quote mode, MEGA65 native mode version +// + + +m65_chrout_screen_quote: + + // Low control codes are just +$80 + clc + adc #$80 + + // If it overflowed, then it is a high control code, + // so we need to make it be $80 + $40 + char + // as we will have flipped back to just $00 + char, we should + // now add $c0 if C is set from overflow + bcc !+ + adc #$BF // C=1, so adding $BF + C = add $C0 +!: + jmp m65_chrout_screen_literal From 3fc9f6fb294e66ad9de1711de0088fb3cb9b7e82 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 21:36:33 +0200 Subject: [PATCH 64/96] small cleanup --- src/kernal/screen_m65/mega65_chrout_screen.s | 1 + src/kernal/screen_m65/mega65_cursor.s | 1 + src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s | 4 ---- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 9251532d..837ccf9c 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -40,6 +40,7 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote // Prepare .Z and M65_LPNT_SCR for colour memory manipulation + ldz M65__TXTCOL jsr m65_helper_scrlpnt_color // Store the new color in screen memory diff --git a/src/kernal/screen_m65/mega65_cursor.s b/src/kernal/screen_m65/mega65_cursor.s index 54d0ec36..3df29bf2 100644 --- a/src/kernal/screen_m65/mega65_cursor.s +++ b/src/kernal/screen_m65/mega65_cursor.s @@ -39,6 +39,7 @@ m65_cursor_undraw: // Cursor undraw - color jsr m65_helper_scrlpnt_color + ldz M65__TXTCOL lda GDCOL sta_lp (M65_LPNT_SCR),z diff --git a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s index f9b91ccf..31630d11 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_scrlpnt.s @@ -4,10 +4,6 @@ m65_helper_scrlpnt_color: - // Set .Z to the current column - - ldz M65__TXTCOL // XXX probably not the best place for this - // Setting M65_LPNT_SCR to point to colour memory (starts from $FF80000) lda #$0F From c5f195fcdc184b66dbb865d5cca00646537a5ecc Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 21:40:53 +0200 Subject: [PATCH 65/96] work towards INS key support in MEGA65 mode --- .../screen_m65/mega65_chrout_screen_control.s | 2 - .../mega65_chrout_screen_control_2.s | 74 +++++++++++++++++++ 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 57719d76..7e2f0f0e 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -79,8 +79,6 @@ m65_chrout_screen_CLR: nop m65_chrout_screen_HOME: nop -m65_chrout_screen_INS: - nop m65_chrout_screen_TAB: nop m65_chrout_screen_LINE_FEED: diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index 61f8e8c8..e674ee3c 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -49,3 +49,77 @@ m65_chrout_screen_STOP: sta QTSW sta INSRT jmp_8 m65_chrout_screen_ctrl2_end + + +// INS key + +m65_chrout_screen_INS: + + // First prepare the pointer to the current row + + jsr m65_helper_scrlpnt_color + jsr m65_helper_scrlpnt_to_screen + + // Check for windowed mode + + lda M65_SCRWINMODE + bmi_16 m65_chrout_screen_INS_winmode + + // Check if last character of the line is space + + ldy M65_SCRMODE + lda m65_scrtab_txtwidth,y + dec_a + taz + lda_lp (M65_LPNT_SCR), z + cmp #$20 + bne_16 m65_chrout_screen_ctrl2_end + phz + + // Last character is space - move the characters + + jsr m65_chrout_screen_INS_copy + + // Store space in the current character cell + + lda #$20 + sta_lp (M65_LPNT_SCR), z + + // Move the color memory + + jsr m65_helper_scrlpnt_color + plz + jsr m65_chrout_screen_INS_copy + + // Store current colour in the current character cell + + lda COLOR + and #$0F + sta_lp (M65_LPNT_SCR), z + + // Increase insert mode count (which causes quote-mode like behaviour) and quit + + inc INSRT + jmp_8 m65_chrout_screen_ctrl2_end + +m65_chrout_screen_INS_winmode: + + // Check if last character of the line within window is space + + // XXX provide implementation + + jmp_8 m65_chrout_screen_ctrl2_end + + + +m65_chrout_screen_INS_copy: + + dez + lda_lp (M65_LPNT_SCR), z + inz + sta_lp (M65_LPNT_SCR), z + dez + cpz M65__TXTCOL + bne m65_chrout_screen_INS_copy + + rts From f5d126e14af57a837b00e0e0b91def3f86b610e8 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 22:00:06 +0200 Subject: [PATCH 66/96] INS key now works in MEGA65 native mode --- src/kernal/screen_m65/mega65_chrout_screen.s | 11 +++++++++++ src/kernal/screen_m65/mega65_screen_tables_misc.s | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 837ccf9c..89cbfb06 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -52,6 +52,17 @@ m65_chrout_screen_literal: // entry point for m65_chrout_screen_quote jsr m65_helper_scrlpnt_to_screen + // Decrement number of chars waiting to be inserted + + lda INSRT + beq !+ + dec INSRT +!: + // Toggle quote flag if required + + txa + jsr screen_check_toggle_quote + // Store the new character in screen memory, restore .Z txa diff --git a/src/kernal/screen_m65/mega65_screen_tables_misc.s b/src/kernal/screen_m65/mega65_screen_tables_misc.s index 579d8b64..10c14d36 100644 --- a/src/kernal/screen_m65/mega65_screen_tables_misc.s +++ b/src/kernal/screen_m65/mega65_screen_tables_misc.s @@ -59,7 +59,6 @@ m65_chrout_screen_jumptable_codes: .byte KEY_CRSR_LEFT .byte KEY_CRSR_DOWN .byte KEY_CRSR_UP - .byte KEY_INS .byte KEY_TAB .byte KEY_LINE_FEED .byte KEY_UNDERLINE_ON @@ -72,6 +71,7 @@ m65_chrout_screen_jumptable_codes: __m65_chrout_screen_jumptable_quote_guard: + .byte KEY_INS .byte KEY_STOP .byte KEY_DEL .byte KEY_RETURN @@ -93,7 +93,6 @@ __m65_chrout_screen_jumptable_codes_end: m65_chrout_screen_CRSR_LEFT, m65_chrout_screen_CRSR_DOWN, m65_chrout_screen_CRSR_UP, - m65_chrout_screen_INS, m65_chrout_screen_TAB, m65_chrout_screen_LINE_FEED, m65_chrout_screen_UNDERLINE_ON, @@ -103,6 +102,7 @@ __m65_chrout_screen_jumptable_codes_end: m65_chrout_screen_TAB_SET_CLR, m65_chrout_screen_ESC, m65_chrout_screen_BELL, + m65_chrout_screen_INS, m65_chrout_screen_STOP, m65_chrout_screen_DEL, m65_chrout_screen_RETURN From 6507a1f74b18e727cd7536029c05a7196dec8046 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 29 Aug 2020 22:34:29 +0200 Subject: [PATCH 67/96] CLR/HOME support in MEGA65 native mode --- src/kernal/extapi_m65/mega65__jumptable.s | 2 ++ src/kernal/screen_m65/mega65_chrout_screen_control.s | 4 ---- .../screen_m65/mega65_chrout_screen_control_2.s | 11 +++++++++++ src/kernal/screen_m65/mega65_clrscr.s | 11 +++++++++-- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 00f2a016..41eb1f5c 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -43,3 +43,5 @@ M65_JSETWIN_N: M65_JSETWIN_Y: jsr M65_SETWIN_Y + +// XXX add M65_HOME diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 7e2f0f0e..1bad4541 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -75,10 +75,6 @@ m65_chrout_try_color_loop: // XXX: implement screen routines below: -m65_chrout_screen_CLR: - nop -m65_chrout_screen_HOME: - nop m65_chrout_screen_TAB: nop m65_chrout_screen_LINE_FEED: diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s index e674ee3c..ce888a72 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control_2.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_2.s @@ -50,6 +50,17 @@ m65_chrout_screen_STOP: sta INSRT jmp_8 m65_chrout_screen_ctrl2_end +// CLR/HOME key support + +m65_chrout_screen_CLR: + + jsr M65_CLRWIN + jmp_8 m65_chrout_screen_ctrl2_end + +m65_chrout_screen_HOME: + + jsr M65_HOME + jmp_8 m65_chrout_screen_ctrl2_end // INS key diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index d4102e14..4f275e28 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -113,9 +113,10 @@ m65_clrscr_loop_done: // FALLTROUGH -m65_home: // XXX reuse +M65_HOME: - // XXX provide proper implementation + lda M65_SCRWINMODE + bmi M65_HOME_winmode lda #$00 sta M65__TXTROW @@ -124,3 +125,9 @@ m65_home: // XXX reuse sta M65_TXTROW_OFF+1 rts + +M65_HOME_winmode: + + // XXX provide implementation + + rts From 34a7759804f79cdfb7ce8bd9cba328329608354d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 30 Aug 2020 19:27:48 +0200 Subject: [PATCH 68/96] preparation for using DMAgic in the screen editor --- STATUS.md | 2 +- src/aliases/,aliases_ram_lowmem_m65.s | 20 +++++- src/kernal/board_m65/mega65_dmagic.s | 63 +++++++++++++++++++ src/kernal/board_m65/mega65_imports.s | 2 + .../mega65_chrout_screen_control_1.s | 2 - src/kernal/screen_m65/mega65_clrscr.s | 1 + src/kernal/screen_m65/mega65_clrwin.s | 1 + 7 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/kernal/board_m65/mega65_dmagic.s diff --git a/STATUS.md b/STATUS.md index ff3fb37e..b3cff17c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -70,7 +70,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | VIC-II | DONE | | | 80 columns, VDC | NOT DONE | | -| 80 columns, Mega65 | PARTIAL | work-in-progreess, not useable yet | +| 80 columns, Mega65 | PARTIAL | work-in-progress |
diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 07316987..423bfd7f 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -52,6 +52,24 @@ .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row - // $594-$5FF -- UNUSED -- + // $594-$5EB -- UNUSED -- + .label M65_DMAGIC_LIST = $5EF // $5EF-$5FF reserved for DMAgic list, 17 bytes .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 -- + + // + // Addresses for configuring the DMA job + // + + .label M65_DMAJOB_SIZE_0 = M65_DMAGIC_LIST + 7 + .label M65_DMAJOB_SIZE_1 = M65_DMAGIC_LIST + 8 + + .label M65_DMAJOB_SRC_0 = M65_DMAGIC_LIST + 10 + .label M65_DMAJOB_SRC_1 = M65_DMAGIC_LIST + 11 + .label M65_DMAJOB_SRC_2 = M65_DMAGIC_LIST + 9 + .label M65_DMAJOB_SRC_3 = M65_DMAGIC_LIST + 2 + + .label M65_DMAJOB_DST_0 = M65_DMAGIC_LIST + 13 + .label M65_DMAJOB_DST_1 = M65_DMAGIC_LIST + 14 + .label M65_DMAJOB_DST_2 = M65_DMAGIC_LIST + 12 + .label M65_DMAJOB_DST_3 = M65_DMAGIC_LIST + 4 diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s new file mode 100644 index 00000000..8dbd7dbf --- /dev/null +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -0,0 +1,63 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// Helper routines for DMAgic usage + +// See: +// - https://c65gs.blogspot.com/2019/03/auto-detecting-required-revision-of.html +// - https://c65gs.blogspot.com/2018/01/improving-dmagic-controller-interface.html + + +// XXX: finish the implementation, use in screen editor + + +m65_dmagic_oper_copy: + + // To configure parameters, use: + // - M65_DMAJOB_SIZE_* + // - M65_DMAJOB_SRC_* + // - M65_DMAJOB_DST_* + + lda #$00 + sta M65_DMAGIC_LIST+6 // operation: copy + + jmp_8 m65_dmagic_common + +m65_dmagic_oper_fill: + + // XXX provide implementation + + // FALLTROUGH + +m65_dmagic_common: + + lda #$0A + sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) + lda #$80 + sta M65_DMAGIC_LIST+1 // <- $80 = next byte is highest 8 bits of source address + inc_a + sta M65_DMAGIC_LIST+3 // <- $80 = next byte is highest 8 bits of destination address + + lda #$00 + sta M65_DMAGIC_LIST+5 // <- end of options + + sta M65_DMAGIC_LIST+15 // <- set modulo to 0 + sta M65_DMAGIC_LIST+16 + + // FALLTROUGH + +m65_dmagic_launch: + + // Launch the DMA list + + lda #$00 + sta DMA_ADDRBANK // $D702 + sta DMA_ADDRMB // $D704 + + lda #>M65_DMAGIC_LIST + sta DMA_ADDRMSB // $D701 + + lda # Date: Sun, 30 Aug 2020 20:22:42 +0200 Subject: [PATCH 69/96] DMAgic related update --- src/kernal/board_m65/mega65_dmagic.s | 66 +++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 8dbd7dbf..7c123914 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -11,6 +11,70 @@ // XXX: finish the implementation, use in screen editor +/* + // XXX implementation is wrong - this example seems to work, copies 32 bytes from $19000 to $19001 + + // Prepare list + + lda #$0A // format F018A + sta M65_DMAGIC_LIST + 0 + + lda #$80 // src MB code + sta M65_DMAGIC_LIST + 1 + lda #$00 // src address - bits 20-27 + sta M65_DMAGIC_LIST + 2 + + lda #$81 // dst MB code + sta M65_DMAGIC_LIST + 3 + lda #$00 // dst address - bits 20-27 + sta M65_DMAGIC_LIST + 4 + + lda #$00 // end of options + sta M65_DMAGIC_LIST + 5 + + lda #$00 // COPY, not a chained request + sta M65_DMAGIC_LIST + 6 + + lda #$20 // copy $0020 bytes + sta M65_DMAGIC_LIST + 7 + lda #$00 + sta M65_DMAGIC_LIST + 8 + + lda #$00 // src address is $xxx9000 (setting bits 0-15) + sta M65_DMAGIC_LIST + 9 + lda #$90 + sta M65_DMAGIC_LIST + 10 + lda #$01 // src address - bits 16-19 + sta M65_DMAGIC_LIST + 11 + + lda #$01 // dst address is $xxx9001 (setting bits 0-15) + sta M65_DMAGIC_LIST + 12 + lda #$90 + sta M65_DMAGIC_LIST + 13 + lda #$01 // dst address - bits 16-19 + sta M65_DMAGIC_LIST + 14 + + lda #$00 // 'modulo' value is $0000 + sta M65_DMAGIC_LIST + 15 + sta M65_DMAGIC_LIST + 16 + + // Launch the DMAgic list + + lda #$00 // DMA list location - bits 16-19 + sta $D702 + + lda #$00 // DMA list location - bits 20-27 + sta $D704 + + lda #>M65_DMAGIC_LIST + sta $D701 + lda # Date: Sun, 30 Aug 2020 20:51:16 +0200 Subject: [PATCH 70/96] fixes for DMA jobs routines --- src/aliases/,aliases_ram_lowmem_m65.s | 12 +-- src/kernal/board_m65/mega65_dmagic.s | 107 ++++++++++---------------- 2 files changed, 48 insertions(+), 71 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 423bfd7f..dc5cc1d0 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -64,12 +64,12 @@ .label M65_DMAJOB_SIZE_0 = M65_DMAGIC_LIST + 7 .label M65_DMAJOB_SIZE_1 = M65_DMAGIC_LIST + 8 - .label M65_DMAJOB_SRC_0 = M65_DMAGIC_LIST + 10 - .label M65_DMAJOB_SRC_1 = M65_DMAGIC_LIST + 11 - .label M65_DMAJOB_SRC_2 = M65_DMAGIC_LIST + 9 + .label M65_DMAJOB_SRC_0 = M65_DMAGIC_LIST + 9 + .label M65_DMAJOB_SRC_1 = M65_DMAGIC_LIST + 10 + .label M65_DMAJOB_SRC_2 = M65_DMAGIC_LIST + 11 .label M65_DMAJOB_SRC_3 = M65_DMAGIC_LIST + 2 - .label M65_DMAJOB_DST_0 = M65_DMAGIC_LIST + 13 - .label M65_DMAJOB_DST_1 = M65_DMAGIC_LIST + 14 - .label M65_DMAJOB_DST_2 = M65_DMAGIC_LIST + 12 + .label M65_DMAJOB_DST_0 = M65_DMAGIC_LIST + 12 + .label M65_DMAJOB_DST_1 = M65_DMAGIC_LIST + 13 + .label M65_DMAJOB_DST_2 = M65_DMAGIC_LIST + 14 .label M65_DMAJOB_DST_3 = M65_DMAGIC_LIST + 4 diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 7c123914..bebe7b4f 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -11,70 +11,6 @@ // XXX: finish the implementation, use in screen editor -/* - // XXX implementation is wrong - this example seems to work, copies 32 bytes from $19000 to $19001 - - // Prepare list - - lda #$0A // format F018A - sta M65_DMAGIC_LIST + 0 - - lda #$80 // src MB code - sta M65_DMAGIC_LIST + 1 - lda #$00 // src address - bits 20-27 - sta M65_DMAGIC_LIST + 2 - - lda #$81 // dst MB code - sta M65_DMAGIC_LIST + 3 - lda #$00 // dst address - bits 20-27 - sta M65_DMAGIC_LIST + 4 - - lda #$00 // end of options - sta M65_DMAGIC_LIST + 5 - - lda #$00 // COPY, not a chained request - sta M65_DMAGIC_LIST + 6 - - lda #$20 // copy $0020 bytes - sta M65_DMAGIC_LIST + 7 - lda #$00 - sta M65_DMAGIC_LIST + 8 - - lda #$00 // src address is $xxx9000 (setting bits 0-15) - sta M65_DMAGIC_LIST + 9 - lda #$90 - sta M65_DMAGIC_LIST + 10 - lda #$01 // src address - bits 16-19 - sta M65_DMAGIC_LIST + 11 - - lda #$01 // dst address is $xxx9001 (setting bits 0-15) - sta M65_DMAGIC_LIST + 12 - lda #$90 - sta M65_DMAGIC_LIST + 13 - lda #$01 // dst address - bits 16-19 - sta M65_DMAGIC_LIST + 14 - - lda #$00 // 'modulo' value is $0000 - sta M65_DMAGIC_LIST + 15 - sta M65_DMAGIC_LIST + 16 - - // Launch the DMAgic list - - lda #$00 // DMA list location - bits 16-19 - sta $D702 - - lda #$00 // DMA list location - bits 20-27 - sta $D704 - - lda #>M65_DMAGIC_LIST - sta $D701 - lda #M65_DMAGIC_LIST sta DMA_ADDRMSB // $D701 - lda # Date: Sun, 30 Aug 2020 23:01:57 +0200 Subject: [PATCH 71/96] more DMAgic work --- src/kernal/board_m65/mega65_dmagic.s | 133 ++++++++++++++++---------- src/kernal/board_m65/mega65_imports.s | 2 - 2 files changed, 85 insertions(+), 50 deletions(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index bebe7b4f..773c0711 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -1,4 +1,4 @@ -// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE // Helper routines for DMAgic usage @@ -11,68 +11,55 @@ // XXX: finish the implementation, use in screen editor -m65_dmagic_oper_copy: +m65_dmagic_oper_fill: - // To configure parameters, use: + // To configure job parameters, use: // - M65_DMAJOB_SIZE_* - // - M65_DMAJOB_SRC_* - // - M65_DMAJOB_DST_* + // - M65_DMAJOB_DST_* + // - .A - byte for filling + // Afterwards, consider M65_DMAJOB_*_2 and M65_DMAJOB_*_3 destroyed. - lda #$00 - sta M65_DMAGIC_LIST+6 // operation: copy + // Set fill address + + sta M65_DMAJOB_SRC_0 - // We need to correct the addresses: - // - M65_DMAJOB_SRC_2, M65_DMAJOB_DST_2 - contain bits 16-23, should contain 16-19 - // - M65_DMAJOB_SRC_3, M65_DMAJOB_DST_3 - contain bits 24-27, should contain 20-27 + // Set operation type - // Correct SRC address + lda #$03 // operation: FILL + sta M65_DMAGIC_LIST+6 - lda M65_DMAJOB_SRC_2 - pha - - asl - ror M65_DMAJOB_SRC_3 - asl - ror M65_DMAJOB_SRC_3 - asl - ror M65_DMAJOB_SRC_3 - asl - ror M65_DMAJOB_SRC_3 - - pla - and %00001111 - sta M65_DMAJOB_SRC_2 - - // Correct DST address - - lda M65_DMAJOB_DST_2 - pha - - asl - ror M65_DMAJOB_DST_3 - asl - ror M65_DMAJOB_DST_3 - asl - ror M65_DMAJOB_DST_3 - asl - ror M65_DMAJOB_DST_3 - - pla - and %00001111 - sta M65_DMAJOB_DST_2 - - // Jump to common part + // Go to common part jmp_8 m65_dmagic_common -m65_dmagic_oper_fill: +m65_dmagic_oper_copy: - // XXX provide implementation + // To configure job parameters, use: + // - M65_DMAJOB_SIZE_* + // - M65_DMAJOB_SRC_* + // - M65_DMAJOB_DST_* + // Afterwards, consider M65_DMAJOB_DST_2 and M65_DMAJOB_DST_3 destroyed. + + // Set operation type + + lda #$00 // operation: COPY + sta M65_DMAGIC_LIST+6 + + // Adapt the source addresses, go to common part + + jsr m65_dmagic_adapt_src // FALLTROUGH m65_dmagic_common: + // Adapt destination addresses - this is always needed + // XXX consider inlining this here + + jsr m65_dmagic_adapt_dst + + // Set remaining job parameters + lda #$0A sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) lda #$80 @@ -102,3 +89,53 @@ m65_dmagic_launch: sta DMA_ETRIG // $D705 rts + + +m65_dmagic_adapt_src: + + // We need to adapt the addresses: + // - M65_DMAJOB_SRC_2 - contain bits 16-23, should contain 16-19 + // - M65_DMAJOB_SRC_3 - contain bits 24-27, should contain 20-27 + + lda M65_DMAJOB_SRC_2 + pha + + asl + ror M65_DMAJOB_SRC_3 + asl + ror M65_DMAJOB_SRC_3 + asl + ror M65_DMAJOB_SRC_3 + asl + ror M65_DMAJOB_SRC_3 + + pla + and %00001111 + sta M65_DMAJOB_SRC_2 + + rts + + +m65_dmagic_adapt_dst: + + // We need to adapt the addresses: + // - M65_DMAJOB_DST_2 - contain bits 16-23, should contain 16-19 + // - M65_DMAJOB_DST_3 - contain bits 24-27, should contain 20-27 + + lda M65_DMAJOB_DST_2 + pha + + asl + ror M65_DMAJOB_DST_3 + asl + ror M65_DMAJOB_DST_3 + asl + ror M65_DMAJOB_DST_3 + asl + ror M65_DMAJOB_DST_3 + + pla + and %00001111 + sta M65_DMAJOB_DST_2 + + rts diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 4b4f32c6..7077b18f 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -38,8 +38,6 @@ .label viciv_unhide = KERNAL_0.viciv_unhide .label viciv_init = KERNAL_0.viciv_init .label viciv_shutdown = KERNAL_0.viciv_shutdown -.label m65_dmagic_oper_copy = KERNAL_0.m65_dmagic_oper_copy -.label m65_dmagic_oper_fill = KERNAL_0.m65_dmagic_oper_fill .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight From 7d7dfa87d8fc3499b48906ae457c858983aee864 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 30 Aug 2020 23:20:06 +0200 Subject: [PATCH 72/96] initial code for clearing screen with DMAgic, does not work yet --- src/kernal/board_m65/mega65_dmagic.s | 4 +-- src/kernal/screen_m65/mega65_clrscr.s | 48 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 773c0711..76d45d06 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -25,7 +25,7 @@ m65_dmagic_oper_fill: // Set operation type - lda #$03 // operation: FILL + lda #($03 + $08) // operation: FILL + allow interrupts sta M65_DMAGIC_LIST+6 // Go to common part @@ -42,7 +42,7 @@ m65_dmagic_oper_copy: // Set operation type - lda #$00 // operation: COPY + lda #($00 + $08) // operation: COPY + allow interrupts sta M65_DMAGIC_LIST+6 // Adapt the source addresses, go to common part diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index f297c469..bb43dfcb 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -1,6 +1,7 @@ // #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE +// #define DMAGIC_CLRSCR M65_CLRSCR: @@ -30,6 +31,51 @@ m65_clrscr_takeover: // .A has to be 0 sta M65_TXTROW_OFF+0 sta M65_TXTROW_OFF+1 +#if DMAGIC_CLRSCR + + // XXX for some reason this does not work - find out, why + + // Clear the whole screen + colour memory + + // Screen size + sec + lda M65_COLGUARD+0 + sbc #$01 + sta M65_DMAJOB_SIZE_0 + lda M65_COLGUARD+1 + sbc #$00 + sta M65_DMAJOB_SIZE_1 + + // Screen start address + lda M65_SCRBASE+0 + sta M65_DMAJOB_DST_0 + lda M65_SCRBASE+1 + sta M65_DMAJOB_DST_1 + lda M65_SCRSEG+0 + sta M65_DMAJOB_DST_2 + lda M65_SCRSEG+1 + sta M65_DMAJOB_DST_3 + + // Fill with spaces + lda #$20 + jsr m65_dmagic_oper_fill + + // Colour RAM start address + lda #$00 + sta M65_DMAJOB_DST_0 + sta M65_DMAJOB_DST_1 + lda #$F8 + sta M65_DMAJOB_DST_2 + lda #$0F + sta M65_DMAJOB_DST_3 + + // Fill with colour, without attributes + lda COLOR + and #$0F + jsr m65_dmagic_oper_fill + +#else + // Clear the whole screen+color memory // XXX consider using DMAgic for this - FILL command @@ -92,6 +138,8 @@ m65_clrscr_loop_done: plz +#endif // no DMAGIC_CLRSCR + // Set screen+color base address in VIC IV // XXX deduplicate with mode setting routine From 3b761c879ad0a107958293443b57a03cb73758dd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 30 Aug 2020 23:31:40 +0200 Subject: [PATCH 73/96] more DMAgic fixes --- src/kernal/board_m65/mega65_dmagic.s | 16 ++++++++-------- src/kernal/screen_m65/mega65_clrscr.s | 5 +---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 76d45d06..495da892 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -101,13 +101,13 @@ m65_dmagic_adapt_src: pha asl - ror M65_DMAJOB_SRC_3 + rol M65_DMAJOB_SRC_3 asl - ror M65_DMAJOB_SRC_3 + rol M65_DMAJOB_SRC_3 asl - ror M65_DMAJOB_SRC_3 + rol M65_DMAJOB_SRC_3 asl - ror M65_DMAJOB_SRC_3 + rol M65_DMAJOB_SRC_3 pla and %00001111 @@ -126,13 +126,13 @@ m65_dmagic_adapt_dst: pha asl - ror M65_DMAJOB_DST_3 + rol M65_DMAJOB_DST_3 asl - ror M65_DMAJOB_DST_3 + rol M65_DMAJOB_DST_3 asl - ror M65_DMAJOB_DST_3 + rol M65_DMAJOB_DST_3 asl - ror M65_DMAJOB_DST_3 + rol M65_DMAJOB_DST_3 pla and %00001111 diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index bb43dfcb..4568bb2d 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -33,17 +33,14 @@ m65_clrscr_takeover: // .A has to be 0 #if DMAGIC_CLRSCR - // XXX for some reason this does not work - find out, why + // XXX for some reason this does not work correctly - find out, why // Clear the whole screen + colour memory // Screen size - sec lda M65_COLGUARD+0 - sbc #$01 sta M65_DMAJOB_SIZE_0 lda M65_COLGUARD+1 - sbc #$00 sta M65_DMAJOB_SIZE_1 // Screen start address From a25be2d083b477171248aacc0b68a79ccc91e794 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 06:24:20 +0200 Subject: [PATCH 74/96] use DMAgic for MEGA65 screen clearing --- src/kernal/board_m65/mega65_dmagic.s | 22 ++-- src/kernal/screen_m65/mega65_chrout_screen.s | 35 +++--- src/kernal/screen_m65/mega65_clrscr.s | 116 ++---------------- src/kernal/screen_m65/mega65_screen_helpers.s | 37 ++++++ .../screen_m65/mega65_screen_helpers_K0.s | 3 + 5 files changed, 81 insertions(+), 132 deletions(-) diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 495da892..29268033 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -8,9 +8,6 @@ // - https://c65gs.blogspot.com/2018/01/improving-dmagic-controller-interface.html -// XXX: finish the implementation, use in screen editor - - m65_dmagic_oper_fill: // To configure job parameters, use: @@ -28,8 +25,9 @@ m65_dmagic_oper_fill: lda #($03 + $08) // operation: FILL + allow interrupts sta M65_DMAGIC_LIST+6 - // Go to common part + // Adapt the addresses, go to common part + jsr m65_dmagic_adapt_dst jmp_8 m65_dmagic_common m65_dmagic_oper_copy: @@ -45,20 +43,20 @@ m65_dmagic_oper_copy: lda #($00 + $08) // operation: COPY + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the source addresses, go to common part + // Adapt the addresses, go to common part jsr m65_dmagic_adapt_src + jsr m65_dmagic_adapt_dst + + // XXX prepare separate version for the opposite direction - change direction + // by setting bit 6 of M65_DMAJOB_*_2 // FALLTROUGH m65_dmagic_common: - // Adapt destination addresses - this is always needed - // XXX consider inlining this here - - jsr m65_dmagic_adapt_dst - // Set remaining job parameters + // XXX this should be done during switching to MEGA65 native mode lda #$0A sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) @@ -110,7 +108,7 @@ m65_dmagic_adapt_src: rol M65_DMAJOB_SRC_3 pla - and %00001111 + and #%00001111 sta M65_DMAJOB_SRC_2 rts @@ -135,7 +133,7 @@ m65_dmagic_adapt_dst: rol M65_DMAJOB_DST_3 pla - and %00001111 + and #%00001111 sta M65_DMAJOB_DST_2 rts diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 89cbfb06..bfb92f25 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -125,7 +125,7 @@ m65_chrout_fix_column_row: lda M65__TXTROW bpl !+ - jsr m65_chrout_fix_scroll_up + jsr m65_chrout_fix_scroll_down !: // Check for row above maximum @@ -133,7 +133,7 @@ m65_chrout_fix_column_row: cmp m65_scrtab_txtheight,y bcc !+ - jsr m65_chrout_fix_scroll_down + jsr m65_chrout_fix_scroll_up !: jmp_8 m65_chrout_fix_txtrow_off @@ -164,9 +164,9 @@ m65_chrout_screen_done: -// Try to fix coordinates by scrolling the screen up +// Try to fix coordinates by scrolling the screen down -m65_chrout_fix_scroll_up: +m65_chrout_fix_scroll_down: inc M65__TXTROW @@ -174,7 +174,7 @@ m65_chrout_fix_scroll_up: lda M65_COLVIEW+0 ora M65_COLVIEW+1 - beq m65_chrout_fix_scroll_up_end + beq m65_chrout_fix_scroll_down_end // Yes, we can simply adapt the viewport @@ -196,14 +196,14 @@ m65_chrout_fix_scroll_up: !: // FALLTROUGH -m65_chrout_fix_scroll_up_end: +m65_chrout_fix_scroll_down_end: - jmp_8 m65_chrout_fix_scroll_done + rts // Try to fix coordinates by scrolling the screen up -m65_chrout_fix_scroll_down: +m65_chrout_fix_scroll_up: dec M65__TXTROW @@ -215,7 +215,7 @@ m65_chrout_fix_scroll_down: lda M65_COLVIEW+0 cmp M65_COLVIEWMAX+0 - beq m65_chrout_fix_scroll_down_scroll + beq m65_chrout_fix_scroll_up_scroll !: // Yes, we can simply adapt the viewport @@ -235,15 +235,22 @@ m65_chrout_fix_scroll_down: bcc !+ inc VIC_SCRNPTR+1 !: - jmp_8 m65_chrout_fix_scroll_done + rts -m65_chrout_fix_scroll_down_scroll: +m65_chrout_fix_scroll_up_scroll: + + // Virtual screen is too small - we will lose one row // XXX implement - // FALLTROUGH + // XXX set size -m65_chrout_fix_scroll_done: + // jsr m65_screen_dmasrcdst_screen + // XXX add $50 to DST + // jsr m65_dmagic_oper_copy + + // jsr m65_screen_dmasrcdst_color + // XXX add $50 to DST + // jsr m65_dmagic_oper_copy - ldy M65_SCRMODE rts diff --git a/src/kernal/screen_m65/mega65_clrscr.s b/src/kernal/screen_m65/mega65_clrscr.s index 4568bb2d..41913d29 100644 --- a/src/kernal/screen_m65/mega65_clrscr.s +++ b/src/kernal/screen_m65/mega65_clrscr.s @@ -1,8 +1,6 @@ // #LAYOUT# M65 KERNAL_1 #TAKE // #LAYOUT# * * #IGNORE -// #define DMAGIC_CLRSCR - M65_CLRSCR: @@ -17,23 +15,7 @@ M65_CLRSCR: // FALLTROUGH -m65_clrscr_takeover: // .A has to be 0 - - // Set the viewport to the beginning of screen memory - variable: - // - M65_COLVIEW - // It will serve as line counter - - sta M65_COLVIEW+0 - sta M65_COLVIEW+1 - - // Clear the row offset, so that it won't interfere - - sta M65_TXTROW_OFF+0 - sta M65_TXTROW_OFF+1 - -#if DMAGIC_CLRSCR - - // XXX for some reason this does not work correctly - find out, why +m65_clrscr_takeover: // Clear the whole screen + colour memory @@ -43,104 +25,28 @@ m65_clrscr_takeover: // .A has to be 0 lda M65_COLGUARD+1 sta M65_DMAJOB_SIZE_1 - // Screen start address - lda M65_SCRBASE+0 - sta M65_DMAJOB_DST_0 - lda M65_SCRBASE+1 - sta M65_DMAJOB_DST_1 - lda M65_SCRSEG+0 - sta M65_DMAJOB_DST_2 - lda M65_SCRSEG+1 - sta M65_DMAJOB_DST_3 - // Fill with spaces + // Fill screen memory with spaces + jsr m65_screen_dmasrcdst_screen lda #$20 jsr m65_dmagic_oper_fill - // Colour RAM start address - lda #$00 - sta M65_DMAJOB_DST_0 - sta M65_DMAJOB_DST_1 - lda #$F8 - sta M65_DMAJOB_DST_2 - lda #$0F - sta M65_DMAJOB_DST_3 - - // Fill with colour, without attributes + // Fill color memory with the current color + jsr m65_screen_dmasrcdst_color lda COLOR and #$0F jsr m65_dmagic_oper_fill -#else + // Set the viewport to the beginning of virtual screen + // XXX deduplicate with mode setting routine - // Clear the whole screen+color memory - // XXX consider using DMAgic for this - FILL command - - phz - - // FALLTROUGH - -m65_clrscr_loop: - - // Prepare M65_LPNT_SCR, let it point to color memory - - jsr m65_helper_scrlpnt_color - - // Clear color for the whole line - - ldz #$4F // 80 bytes - lda COLOR -!: - sta_lp (M65_LPNT_SCR),z - - dez - bpl !- - - // Let M65_LPNT_SCR point to scren memory - - jsr m65_helper_scrlpnt_to_screen - - // Clear characters in the whole line - - ldz #$4F // 80 bytes - lda #$20 -!: - sta_lp (M65_LPNT_SCR),z - - dez - bpl !- - - // Advance by one line, do next iteration - - // XXX this can probably be deduplicated - clc - lda M65_COLVIEW+0 - adc #$50 + lda #$00 sta M65_COLVIEW+0 - bcc !+ - inc M65_COLVIEW+1 -!: - // Check if we are allowed to progress further - - lda M65_COLVIEW+1 - cmp M65_COLGUARD+1 - bne m65_clrscr_loop - lda M65_COLVIEW+0 - cmp M65_COLGUARD+0 - bne m65_clrscr_loop - -m65_clrscr_loop_done: - - // Nothing more to clear - restore .Z register - - plz - -#endif // no DMAGIC_CLRSCR + sta M65_COLVIEW+1 // Set screen+color base address in VIC IV // XXX deduplicate with mode setting routine - lda #$00 sta VIC_COLPTR+0 sta VIC_COLPTR+1 sta M65_COLVIEW+0 @@ -151,12 +57,10 @@ m65_clrscr_loop_done: lda M65_SCRBASE+1 sta VIC_SCRNPTR+1 - // Set screen variables + // Set logical row length jsr m65_screen_set_indx - // XXX provide proper implementation - // FALLTROUGH M65_HOME: diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index 8418d92e..b4fa7d16 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -20,3 +20,40 @@ m65_screen_upd_txtrow_off: sta M65_TXTROW_OFF+1 rts + + +m65_screen_dmasrcdst_screen: + + // Set screen memory as start/end addresses + + lda M65_SCRBASE+0 + sta M65_DMAJOB_SRC_0 + sta M65_DMAJOB_DST_0 + lda M65_SCRBASE+1 + sta M65_DMAJOB_SRC_1 + sta M65_DMAJOB_DST_1 + lda M65_SCRSEG+0 + sta M65_DMAJOB_SRC_2 + sta M65_DMAJOB_DST_2 + lda M65_SCRSEG+1 +!: + sta M65_DMAJOB_SRC_3 + sta M65_DMAJOB_DST_3 + + rts + + +m65_screen_dmasrcdst_color: + + // Set color memory as start/end addresses + + lda #$00 + sta M65_DMAJOB_SRC_0 + sta M65_DMAJOB_DST_0 + sta M65_DMAJOB_SRC_1 + sta M65_DMAJOB_DST_1 + lda #$F8 + sta M65_DMAJOB_SRC_2 + sta M65_DMAJOB_DST_2 + lda #$0F + jmp_8 !- diff --git a/src/kernal/screen_m65/mega65_screen_helpers_K0.s b/src/kernal/screen_m65/mega65_screen_helpers_K0.s index ceeb2649..edcd9382 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers_K0.s +++ b/src/kernal/screen_m65/mega65_screen_helpers_K0.s @@ -1,6 +1,9 @@ // #LAYOUT# M65 KERNAL_0 #TAKE // #LAYOUT# * * #IGNORE +// +// Set the INDX variable - logical row length +// m65_screen_set_indx: // leaves value in .A From c1e0bfa0c9644a01d1a59f8933fe2931817d1d70 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 17:46:45 +0200 Subject: [PATCH 75/96] finished MEGA65 screen scrolling --- src/aliases/,aliases_ram_lowmem_m65.s | 2 +- src/kernal/screen_m65/mega65_chrout_screen.s | 49 ++++++++++++++++--- src/kernal/screen_m65/mega65_clrwin.s | 2 + src/kernal/screen_m65/mega65_screen_helpers.s | 12 +++++ 4 files changed, 56 insertions(+), 9 deletions(-) diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index dc5cc1d0..62e1fc2b 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -51,7 +51,7 @@ .label M65_TXTWIN_Y0 = $58F // text window - top-left Y coordinate, starting from 0 .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 - .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row + .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row from the viewport start // $594-$5EB -- UNUSED -- .label M65_DMAGIC_LIST = $5EF // $5EF-$5FF reserved for DMAgic list, 17 bytes .label M65_RS232_INBUF = $600 // $600-$6FF -- reserved for RS-232 input buffer -- diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index bfb92f25..7a16eaea 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -241,16 +241,49 @@ m65_chrout_fix_scroll_up_scroll: // Virtual screen is too small - we will lose one row - // XXX implement + // Calculate size of data to copy - // XXX set size + sec + lda M65_COLGUARD+0 + sbc #$50 + sta M65_DMAJOB_SIZE_0 + lda M65_COLGUARD+1 + sbc #$00 + sta M65_DMAJOB_SIZE_1 - // jsr m65_screen_dmasrcdst_screen - // XXX add $50 to DST - // jsr m65_dmagic_oper_copy + // Scroll up screen memory - // jsr m65_screen_dmasrcdst_color - // XXX add $50 to DST - // jsr m65_dmagic_oper_copy + jsr m65_screen_dmasrcdst_screen + jsr m65_screen_dmasrc_add_row + jsr m65_dmagic_oper_copy + + // Scroll up color memory + + jsr m65_screen_dmasrcdst_color + jsr m65_screen_dmasrc_add_row + jsr m65_dmagic_oper_copy + + // Clear the last row - color and screen memory + + phz + + jsr m65_helper_scrlpnt_color + lda COLOR + and #$0F + ldz #$4F +!: + sta_lp (M65_LPNT_SCR), z + dez + bpl !- + + jsr m65_helper_scrlpnt_to_screen + lda #$20 + ldz #$4F +!: + sta_lp (M65_LPNT_SCR), z + dez + bpl !- + + plz rts diff --git a/src/kernal/screen_m65/mega65_clrwin.s b/src/kernal/screen_m65/mega65_clrwin.s index 575a205c..c519f8b4 100644 --- a/src/kernal/screen_m65/mega65_clrwin.s +++ b/src/kernal/screen_m65/mega65_clrwin.s @@ -22,6 +22,8 @@ M65_CLRWIN: // First initialize both pointers + // XXX use m65_helper_scrlpnt_color and m65_helper_scrlpnt_to_screen instead + clc lda M65_COLVIEW+0 adc M65_SCRBASE+0 diff --git a/src/kernal/screen_m65/mega65_screen_helpers.s b/src/kernal/screen_m65/mega65_screen_helpers.s index b4fa7d16..a8192463 100644 --- a/src/kernal/screen_m65/mega65_screen_helpers.s +++ b/src/kernal/screen_m65/mega65_screen_helpers.s @@ -57,3 +57,15 @@ m65_screen_dmasrcdst_color: sta M65_DMAJOB_DST_2 lda #$0F jmp_8 !- + + +m65_screen_dmasrc_add_row: + + clc + lda M65_DMAJOB_SRC_0 + adc #$50 + sta M65_DMAJOB_SRC_0 + bcc !+ + inc M65_DMAJOB_SRC_1 +!: + rts From 75829130215d7fea4d2229725b87d27996d4c13d Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 19:07:05 +0200 Subject: [PATCH 76/96] added DEL key support to MEGA65 native text mode --- src/aliases/,aliases_ram_lowmem_m65.s | 3 +- .../{keyboard => screen}/chrin_keyboard.s | 0 .../chrin_programmable_keys.s | 0 src/kernal/screen_m65/mega65_chrout_screen.s | 4 +- .../screen_m65/mega65_chrout_screen_control.s | 2 - .../mega65_chrout_screen_control_del.s | 102 ++++++++++++++++++ src/kernal/screen_m65/mega65_scrmodeset.s | 8 +- 7 files changed, 112 insertions(+), 7 deletions(-) rename src/kernal/{keyboard => screen}/chrin_keyboard.s (100%) rename src/kernal/{keyboard => screen}/chrin_programmable_keys.s (100%) create mode 100644 src/kernal/screen_m65/mega65_chrout_screen_control_del.s diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 62e1fc2b..767d124d 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -52,7 +52,8 @@ .label M65_TXTWIN_X1 = $590 // text window - bottom-right X coordinate + 1 .label M65_TXTWIN_Y1 = $591 // text window - bottom-right Y coordinate + 1 .label M65_TXTROW_OFF = $592 // $592-$593 offset to the current text row from the viewport start - // $594-$5EB -- UNUSED -- + .label M65_SCRCOLMAX = $594 // maximum allowed column + // $595-$5EB -- UNUSED -- .label M65_DMAGIC_LIST = $5EF // $5EF-$5FF reserved for DMAgic list, 17 bytes .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/kernal/keyboard/chrin_keyboard.s b/src/kernal/screen/chrin_keyboard.s similarity index 100% rename from src/kernal/keyboard/chrin_keyboard.s rename to src/kernal/screen/chrin_keyboard.s diff --git a/src/kernal/keyboard/chrin_programmable_keys.s b/src/kernal/screen/chrin_programmable_keys.s similarity index 100% rename from src/kernal/keyboard/chrin_programmable_keys.s rename to src/kernal/screen/chrin_programmable_keys.s diff --git a/src/kernal/screen_m65/mega65_chrout_screen.s b/src/kernal/screen_m65/mega65_chrout_screen.s index 7a16eaea..c2533579 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen.s +++ b/src/kernal/screen_m65/mega65_chrout_screen.s @@ -270,7 +270,7 @@ m65_chrout_fix_scroll_up_scroll: jsr m65_helper_scrlpnt_color lda COLOR and #$0F - ldz #$4F + ldz M65_SCRCOLMAX !: sta_lp (M65_LPNT_SCR), z dez @@ -278,7 +278,7 @@ m65_chrout_fix_scroll_up_scroll: jsr m65_helper_scrlpnt_to_screen lda #$20 - ldz #$4F + ldz M65_SCRCOLMAX !: sta_lp (M65_LPNT_SCR), z dez diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control.s b/src/kernal/screen_m65/mega65_chrout_screen_control.s index 1bad4541..5773ac94 100644 --- a/src/kernal/screen_m65/mega65_chrout_screen_control.s +++ b/src/kernal/screen_m65/mega65_chrout_screen_control.s @@ -93,8 +93,6 @@ m65_chrout_screen_ESC: nop m65_chrout_screen_BELL: nop -m65_chrout_screen_DEL: - nop m65_chrout_screen_GFX: nop m65_chrout_screen_TXT: diff --git a/src/kernal/screen_m65/mega65_chrout_screen_control_del.s b/src/kernal/screen_m65/mega65_chrout_screen_control_del.s new file mode 100644 index 00000000..54462dd6 --- /dev/null +++ b/src/kernal/screen_m65/mega65_chrout_screen_control_del.s @@ -0,0 +1,102 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +// 'DEL' key support + +m65_chrout_screen_DEL: + + // First check for window mode + + lda M65_SCRWINMODE + bmi m65_chrout_screen_DEL_winmode + + // Not a window mode; check if we are in the first column + + lda M65__TXTCOL + beq m65_chrout_screen_DEL_1stcol + + // Not a window mode, not a first column - we can safely + // delete the character and sroll back the rest of the row + + phz + + jsr m65_helper_scrlpnt_color + jsr m65_chrout_screen_DEL_copy + + ldz M65_SCRCOLMAX + lda COLOR + and #$0F + sta_lp (M65_LPNT_SCR), z + + jsr m65_helper_scrlpnt_to_screen + jsr m65_chrout_screen_DEL_copy + + ldz M65_SCRCOLMAX + lda #$20 + sta_lp (M65_LPNT_SCR), z + + plz + + // End by moving cursor one position left + + jmp m65_chrout_screen_CRSR_LEFT + +m65_chrout_screen_DEL_copy: + + ldz M65__TXTCOL + dez +!: + cpz M65_SCRCOLMAX + beq !+ + + inz + lda_lp (M65_LPNT_SCR), z + dez + sta_lp (M65_LPNT_SCR), z + + inz + jmp_8 !- +!: + rts + + +m65_chrout_screen_DEL_1stcol: + + // Start by moving one position left + + jsr m65_chrout_screen_CRSR_LEFT + + // If we are still in the first column - nothing to do + + lda M65__TXTCOL + beq !+ + + // Deleta character under cursor + + phz + + jsr m65_helper_scrlpnt_color + ldz M65__TXTCOL + + lda COLOR + and #$0F + sta_lp (M65_LPNT_SCR), z + + jsr m65_helper_scrlpnt_to_screen + lda #$20 + sta_lp (M65_LPNT_SCR), z + + plz + + // End of character deletion +!: + jmp m65_chrout_screen_done + + +m65_chrout_screen_DEL_winmode: + + // XXX provide implementation for window mode + + jmp m65_chrout_screen_done + diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index d5eeb887..cf940e6b 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -88,8 +88,9 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 stx VIC_COLPTR+1 // Set the following locations: - // - M65_SCRGUARD, M65_COLGUARD - for max lines of virtual screen - // - M65_COLVIEWMAX - as above, but depending on the mode + // - M65_SCRGUARD, M65_COLGUARD - guards for virtual screen end + // - M65_COLVIEWMAX - guard for viewport start + // - M65_SCRCOLMAX - maximum allowed column ldx #<(MEMCONF_SCRBASE + 80 * MEMCONF_SCRROWS) stx M65_SCRGUARD+0 @@ -106,5 +107,8 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 sta M65_COLVIEWMAX+0 lda m65_scrtab_colviewmax_hi, x sta M65_COLVIEWMAX+1 + lda m65_scrtab_txtwidth,x + dec_a + sta M65_SCRCOLMAX rts From 1d4c953ceea63aeba4cd5ce41960e0cc6e126484 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 19:39:12 +0200 Subject: [PATCH 77/96] various cleanups --- STATUS.md | 2 +- src/basic/,imports.s | 5 +- src/basic/basic_commands/cmd_go_goto_run.s | 9 +-- src/basic/basic_commands/cmd_sys.s | 5 +- src/basic/basic_commands_02/cmd_sysinfo.s | 4 +- src/basic/board_m65/mega65_imports.s | 2 +- src/basic/init/initmsg_m65.s | 4 +- .../board_m65/4000.mega65_vectable_kernal_1.s | 20 +++--- src/kernal/board_m65/mega65_imports.s | 2 +- src/kernal/board_m65/mega65_redirect_api.s | 10 +-- src/kernal/board_x16/cx16_stubs.s | 2 +- src/kernal/extapi_m65/mega65__jumptable.s | 13 ++-- src/kernal/extapi_m65/mega65_mode64.s | 29 -------- src/kernal/extapi_m65/mega65_mode65.s | 36 ---------- .../{mega65_ismode65.s => mega65_modeget.s} | 4 +- src/kernal/extapi_m65/mega65_modeset.s | 71 +++++++++++++++++++ src/kernal/init/e518.cint_legacy.s | 2 +- .../{e5a0.setup_vicii.s => e5a0.vicii_init.s} | 4 +- .../interrupts/ea31.default_irq_handler.s | 2 +- src/kernal/iostack/f333.clrchn.s | 2 +- src/kernal/panic.s | 5 +- src/kernal/screen/chrin_keyboard.s | 2 +- src/kernal/screen/chrout_screen.s | 2 +- .../screen/e56c.screen_calculate_pointers.s | 2 +- src/kernal/screen/screen.s | 4 +- src/kernal/tape/tape_common_screen.s | 5 +- 26 files changed, 125 insertions(+), 123 deletions(-) delete mode 100644 src/kernal/extapi_m65/mega65_mode64.s delete mode 100644 src/kernal/extapi_m65/mega65_mode65.s rename src/kernal/extapi_m65/{mega65_ismode65.s => mega65_modeget.s} (73%) create mode 100644 src/kernal/extapi_m65/mega65_modeset.s rename src/kernal/init/{e5a0.setup_vicii.s => e5a0.vicii_init.s} (97%) diff --git a/STATUS.md b/STATUS.md index b3cff17c..283ab459 100644 --- a/STATUS.md +++ b/STATUS.md @@ -70,7 +70,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | VIC-II | DONE | | | 80 columns, VDC | NOT DONE | | -| 80 columns, Mega65 | PARTIAL | work-in-progress | +| 80 columns, Mega65 | PARTIAL | no windowing mode and C65/M65 extra keys support |
diff --git a/src/basic/,imports.s b/src/basic/,imports.s index f8e402dd..86959543 100644 --- a/src/basic/,imports.s +++ b/src/basic/,imports.s @@ -55,9 +55,8 @@ .label SELDEV = KERNAL().SELDEV #if ROM_LAYOUT_M65 -.label M65_MODE64 = KERNAL().M65_MODE64 -.label M65_MODE65 = KERNAL().M65_MODE65 -.label M65_ISMODE65 = KERNAL().M65_ISMODE65 +.label M65_MODEGET = KERNAL().M65_MODEGET +.label M65_MODESET = KERNAL().M65_MODESET .label M65_SLOW = KERNAL().M65_SLOW .label M65_FAST = KERNAL().M65_FAST .label M65_SETWIN_Y = KERNAL().M65_SETWIN_Y diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 96744238..53b9eba9 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -31,12 +31,13 @@ cmd_go_syntax_error: // If in native mode - switch to C64 compatibilty - jsr M65_ISMODE65 + jsr M65_MODEGET bcs cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts - jsr M65_MODE64 + sec + jsr M65_MODESET // Carry set = switch to C64 mode jmp_8 cmd_go_switchmode_clr_banner !: cmp #65 @@ -44,12 +45,12 @@ cmd_go_syntax_error: // If in C64 compatibility mode - switch to native mode - jsr M65_ISMODE65 + jsr M65_MODEGET bcc cmd_go_rts jsr helper_ask_if_sure bcs cmd_go_rts - jsr M65_MODE65 + jsr M65_MODESET // Carry clear = switch to M65 mode // FALLTROUGH diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index d689b488..8d151300 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -26,9 +26,10 @@ cmd_sys: // Make sure we are in C64 compatibility mode - jsr M65_ISMODE65 + jsr M65_MODEGET bcs cmd_sys_nsys_common - jsr M65_MODE64 + sec + jsr M65_MODESET // set legacy C64 compatibility mode // FALLTROUGH diff --git a/src/basic/basic_commands_02/cmd_sysinfo.s b/src/basic/basic_commands_02/cmd_sysinfo.s index d85cd9b2..094b6996 100644 --- a/src/basic/basic_commands_02/cmd_sysinfo.s +++ b/src/basic/basic_commands_02/cmd_sysinfo.s @@ -21,7 +21,7 @@ cmd_sysinfo: ldx #IDX__STR_SI_HEADER jsr print_packed_misc_str - jsr M65_ISMODE65 + jsr M65_MODEGET bcc !+ ldx #IDX__STR_SI_MODE64 @@ -39,7 +39,7 @@ cmd_sysinfo: jsr print_return - jsr M65_ISMODE65 + jsr M65_MODEGET bcs print_sysinfo_video jsr print_return diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index ce49e8c5..b9c24577 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -26,7 +26,7 @@ .label JREADST = KERNAL_0.JREADST .label JSCREEN = KERNAL_0.JSCREEN .label SELDEV = KERNAL_0.SELDEV -.label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 +.label M65_MODEGET = KERNAL_0.M65_MODEGET .label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY .label M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH .label M65_SETWIN_Y = BASIC_0.proxy_B1_M65_SETWIN_Y diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index 39d24c39..a59a44b7 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -22,10 +22,10 @@ INITMSG: // Display additional information, depending on the mode - jsr M65_ISMODE65 + jsr M65_MODEGET bcc !+ - // Legacy mode + // Legacy C64 compatibility mode ldx #$02 ldy #$21 diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index 07d924d1..ed13e66d 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -13,20 +13,19 @@ .label VK1__IOINIT = $4000 + 2 * 0 .label VK1__RAMTAS = $4000 + 2 * 1 - .label VK1__setup_vicii = $4000 + 2 * 2 + .label VK1__vicii_init = $4000 + 2 * 2 .label VK1__load_tape_normal = $4000 + 2 * 3 .label VK1__load_tape_turbo = $4000 + 2 * 4 .label VK1__load_tape_auto = $4000 + 2 * 5 .label VK1__tape_head_align = $4000 + 2 * 6 .label VK1__m65_chrout_screen = $4000 + 2 * 7 .label VK1__m65_chrin_keyboard = $4000 + 2 * 8 - .label VK1__M65_MODE64 = $4000 + 2 * 9 - .label VK1__M65_MODE65 = $4000 + 2 * 10 - .label VK1__M65_SCRMODEGET = $4000 + 2 * 11 - .label VK1__M65_SCRMODESET = $4000 + 2 * 12 - .label VK1__M65_CLRSCR = $4000 + 2 * 13 - .label VK1__M65_CLRWIN = $4000 + 2 * 14 - .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 15 + .label VK1__M65_MODESET = $4000 + 2 * 9 + .label VK1__M65_SCRMODEGET = $4000 + 2 * 10 + .label VK1__M65_SCRMODESET = $4000 + 2 * 11 + .label VK1__M65_CLRSCR = $4000 + 2 * 12 + .label VK1__M65_CLRWIN = $4000 + 2 * 13 + .label VK1__m65_screen_upd_txtrow_off = $4000 + 2 * 14 #else @@ -34,7 +33,7 @@ .word IOINIT .word RAMTAS - .word setup_vicii + .word vicii_init #if CONFIG_TAPE_NORMAL && !CONFIG_TAPE_AUTODETECT .word load_tape_normal @@ -63,8 +62,7 @@ .word m65_chrout_screen .word m65_chrin_keyboard - .word M65_MODE64 - .word M65_MODE65 + .word M65_MODESET .word M65_SCRMODEGET .word M65_SCRMODESET .word M65_CLRSCR diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 7077b18f..de974bb7 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -12,7 +12,7 @@ .label STOP = KERNAL_0.STOP .label M65_SLOW = KERNAL_0.M65_SLOW .label M65_FAST = KERNAL_0.M65_FAST -.label M65_ISMODE65 = KERNAL_0.M65_ISMODE65 +.label M65_MODEGET = KERNAL_0.M65_MODEGET .label M65_SETWIN_XY = KERNAL_0.M65_SETWIN_XY .label M65_SETWIN_WH = KERNAL_0.M65_SETWIN_WH .label M65_SETWIN_N = KERNAL_0.M65_SETWIN_N diff --git a/src/kernal/board_m65/mega65_redirect_api.s b/src/kernal/board_m65/mega65_redirect_api.s index 8c47f81c..1392852f 100644 --- a/src/kernal/board_m65/mega65_redirect_api.s +++ b/src/kernal/board_m65/mega65_redirect_api.s @@ -5,16 +5,10 @@ // ROM routine call redirect for Mega65 API routines // -M65_MODE64: +M65_MODESET: jsr map_KERNAL_1 - jsr_ind VK1__M65_MODE64 - bra m65_api_end - -M65_MODE65: - - jsr map_KERNAL_1 - jsr_ind VK1__M65_MODE65 + jsr_ind VK1__M65_MODESET bra m65_api_end M65_SCRMODEGET: diff --git a/src/kernal/board_x16/cx16_stubs.s b/src/kernal/board_x16/cx16_stubs.s index 2407b0e5..3a605a9e 100644 --- a/src/kernal/board_x16/cx16_stubs.s +++ b/src/kernal/board_x16/cx16_stubs.s @@ -10,7 +10,7 @@ scnkey_set_keytab: clear_screen: STUB_IMPLEMENTATION() -setup_vicii: +vicii_init: STUB_IMPLEMENTATION() cursor_blink: diff --git a/src/kernal/extapi_m65/mega65__jumptable.s b/src/kernal/extapi_m65/mega65__jumptable.s index 41eb1f5c..bce9afbf 100644 --- a/src/kernal/extapi_m65/mega65__jumptable.s +++ b/src/kernal/extapi_m65/mega65__jumptable.s @@ -8,19 +8,16 @@ // would copy the vector table to given memory location -M65_JMODE64: - jsr M65_MODE64 +M65_JMODEGET: + jsr M65_MODEGET -M65_JMODE65: // XXX consider combining with M65_JMODE64 - jsr M65_MODE65 - -M65_JISMODE65: - jsr M65_ISMODE65 +M65_JISMODESET: + jsr M65_MODESET M65_JSLOW: jsr M65_SLOW -M65_JFAST: // XXX consider combining with M65_JSLOW +M65_JFAST: jsr M65_FAST M65_JSELDEV: diff --git a/src/kernal/extapi_m65/mega65_mode64.s b/src/kernal/extapi_m65/mega65_mode64.s deleted file mode 100644 index 010e85ea..00000000 --- a/src/kernal/extapi_m65/mega65_mode64.s +++ /dev/null @@ -1,29 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -M65_MODE64: - - // Disable interrupts, they might interfere - - sei - - // Set the magic string to mark legacy mode - - lda #$00 - sta M65_MAGICSTR+0 - sta M65_MAGICSTR+1 - sta M65_MAGICSTR+2 - - // Restore VIC-II configuration - - jsr viciv_shutdown - jsr setup_vicii - - // Reenable interrupts - - cli - - // Switch CPU speed back to slow and quit - - jmp M65_SLOW diff --git a/src/kernal/extapi_m65/mega65_mode65.s b/src/kernal/extapi_m65/mega65_mode65.s deleted file mode 100644 index 8dd88f24..00000000 --- a/src/kernal/extapi_m65/mega65_mode65.s +++ /dev/null @@ -1,36 +0,0 @@ -// #LAYOUT# M65 KERNAL_1 #TAKE -// #LAYOUT# * * #IGNORE - - -M65_MODE65: - - // Disable interrupts, they might interfere - - sei - - // Switch CPU speed to fast - - jsr M65_FAST - - // 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 - - // Initialize VIC-IV - - jsr setup_vicii - jsr viciv_init - - // Set screen mode to 80x50 - - lda #$02 - jsr m65_scrmodeset_internal - - // Clear the screen - - jmp M65_CLRSCR diff --git a/src/kernal/extapi_m65/mega65_ismode65.s b/src/kernal/extapi_m65/mega65_modeget.s similarity index 73% rename from src/kernal/extapi_m65/mega65_ismode65.s rename to src/kernal/extapi_m65/mega65_modeget.s index 428233d9..fbea3182 100644 --- a/src/kernal/extapi_m65/mega65_ismode65.s +++ b/src/kernal/extapi_m65/mega65_modeget.s @@ -2,7 +2,9 @@ // #LAYOUT# * * #IGNORE -M65_ISMODE65: // checks if mode is native M65 one, BCC = jump if native mode +M65_MODEGET: + + // Checks if mode is native M65 one; Carry clear = native mode, Carry set = legacy mode pha diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/extapi_m65/mega65_modeset.s new file mode 100644 index 00000000..8a644bc4 --- /dev/null +++ b/src/kernal/extapi_m65/mega65_modeset.s @@ -0,0 +1,71 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +M65_MODESET: + + // Carry clear = set native mode; Carry set = set legacy mode + + bcc m65_mode65 + + // FALLTROUGH + +m65_mode64: + + // Disable interrupts, they might interfere + + sei + + // Set the magic string to mark legacy mode + + lda #$00 + sta M65_MAGICSTR+0 + sta M65_MAGICSTR+1 + sta M65_MAGICSTR+2 + + // Restore VIC-II configuration + + jsr viciv_shutdown + jsr vicii_init + + // Reenable interrupts + + cli + + // Switch CPU speed back to slow and quit + + jmp M65_SLOW + + +m65_mode65: + + // Disable interrupts, they might interfere + + sei + + // Switch CPU speed to fast + + jsr M65_FAST + + // 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 + + // Initialize VIC-IV + + jsr vicii_init + jsr viciv_init + + // Set screen mode to 80x50 + + lda #$02 + jsr m65_scrmodeset_internal + + // Clear the screen + + jmp M65_CLRSCR diff --git a/src/kernal/init/e518.cint_legacy.s b/src/kernal/init/e518.cint_legacy.s index a143692d..04815503 100644 --- a/src/kernal/init/e518.cint_legacy.s +++ b/src/kernal/init/e518.cint_legacy.s @@ -16,7 +16,7 @@ cint_legacy: // $E518 // Setup video and I/O // See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 - jsr setup_vicii + jsr vicii_init // Code below must be placed under $E51B, or some code will break - see here: // - https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=2 diff --git a/src/kernal/init/e5a0.setup_vicii.s b/src/kernal/init/e5a0.vicii_init.s similarity index 97% rename from src/kernal/init/e5a0.setup_vicii.s rename to src/kernal/init/e5a0.vicii_init.s index 1358f461..5cb3d59c 100644 --- a/src/kernal/init/e5a0.setup_vicii.s +++ b/src/kernal/init/e5a0.vicii_init.s @@ -11,12 +11,12 @@ // -setup_vicii: +vicii_init: #if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0) jsr map_KERNAL_1 - jsr_ind VK1__setup_vicii + jsr_ind VK1__vicii_init jmp map_NORMAL #else diff --git a/src/kernal/interrupts/ea31.default_irq_handler.s b/src/kernal/interrupts/ea31.default_irq_handler.s index f15f2305..394b5c21 100644 --- a/src/kernal/interrupts/ea31.default_irq_handler.s +++ b/src/kernal/interrupts/ea31.default_irq_handler.s @@ -17,7 +17,7 @@ default_irq_handler: #if ROM_LAYOUT_M65 - jsr M65_ISMODE65 + jsr M65_MODEGET bcs !+ jsr m65_cursor_blink diff --git a/src/kernal/iostack/f333.clrchn.s b/src/kernal/iostack/f333.clrchn.s index 7e316739..b4829b11 100644 --- a/src/kernal/iostack/f333.clrchn.s +++ b/src/kernal/iostack/f333.clrchn.s @@ -22,7 +22,7 @@ CLRCHN: // FALLTROUGH -clrchn_reset: // entry needed by setup_vicii +clrchn_reset: // entry needed by vicii_init // Set input device number to keyboard lda #$00 diff --git a/src/kernal/panic.s b/src/kernal/panic.s index 45c1c4ac..1dbbf993 100644 --- a/src/kernal/panic.s +++ b/src/kernal/panic.s @@ -25,12 +25,13 @@ panic: // Make sure we are in legacy mode with normal memory mapping jsr map_NORMAL - jsr M65_MODE64 + sec + jsr M65_MODESET // switch to legacy C64 compatibility mode sei #else - jsr setup_vicii + jsr vicii_init #endif diff --git a/src/kernal/screen/chrin_keyboard.s b/src/kernal/screen/chrin_keyboard.s index 074fbdde..5cfe67e2 100644 --- a/src/kernal/screen/chrin_keyboard.s +++ b/src/kernal/screen/chrin_keyboard.s @@ -12,7 +12,7 @@ chrin_keyboard: #if ROM_LAYOUT_M65 - jsr M65_ISMODE65 + jsr M65_MODEGET bcc_16 m65_chrin_keyboard #endif diff --git a/src/kernal/screen/chrout_screen.s b/src/kernal/screen/chrout_screen.s index 596a3ce9..153425d9 100644 --- a/src/kernal/screen/chrout_screen.s +++ b/src/kernal/screen/chrout_screen.s @@ -12,7 +12,7 @@ chrout_screen: #if ROM_LAYOUT_M65 - jsr M65_ISMODE65 + jsr M65_MODEGET bcc_16 m65_chrout_screen #endif diff --git a/src/kernal/screen/e56c.screen_calculate_pointers.s b/src/kernal/screen/e56c.screen_calculate_pointers.s index ab0d632d..3c30b0b4 100644 --- a/src/kernal/screen/e56c.screen_calculate_pointers.s +++ b/src/kernal/screen/e56c.screen_calculate_pointers.s @@ -17,7 +17,7 @@ screen_calculate_pointers: #if ROM_LAYOUT_M65 - jsr M65_ISMODE65 + jsr M65_MODEGET bcc_16 m65_screen_upd_txtrow_off #endif diff --git a/src/kernal/screen/screen.s b/src/kernal/screen/screen.s index 9d11c38b..f83b39b1 100644 --- a/src/kernal/screen/screen.s +++ b/src/kernal/screen/screen.s @@ -28,7 +28,7 @@ SCREEN: #else php - jsr M65_ISMODE65 + jsr M65_MODEGET bcc !+ plp @@ -38,6 +38,8 @@ SCREEN: rts !: + // Screen dimensions depends on text mode + plp pha ldy M65_SCRMODE diff --git a/src/kernal/tape/tape_common_screen.s b/src/kernal/tape/tape_common_screen.s index bd44c5b3..9aa968e8 100644 --- a/src/kernal/tape/tape_common_screen.s +++ b/src/kernal/tape/tape_common_screen.s @@ -25,7 +25,7 @@ tape_screen_on_motor_off: #else - jsr M65_ISMODE65 + jsr M65_MODEGET bcs_16 screen_on // MEGA65 native mode does not have badlines, no need to enable/disable screen rts @@ -51,7 +51,8 @@ tape_screen_off_motor_on: #else - jsr M65_ISMODE65 + jsr M65_MODEGET + // XXX optimize this bcs !+ // MEGA65 native mode does not have badlines, no need to enable/disable screen jsr screen_off !: From c1b302697646ab84e7139ec1404c853980ff110c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 31 Aug 2020 21:09:54 +0200 Subject: [PATCH 78/96] toggling character sets now works in MEGA65 native mode too --- src/aliases/,aliases_ram_over64K_m65.s | 3 ++ src/kernal/board_m65/mega65_dmagic.s | 46 +++++++++---------- src/kernal/board_m65/mega65_native_meminit.s | 42 +++++++++++++++++ src/kernal/board_m65/mega65_viciv_init.s | 2 - src/kernal/extapi_m65/mega65_modeset.s | 4 ++ src/kernal/keyboard/scnkey_set_keytab.s | 26 ++++++++++- .../screen_m65/mega65_chrout_screen_control.s | 5 -- .../mega65_chrout_screen_control_2.s | 16 +++++++ src/kernal/screen_m65/mega65_scrmodeset.s | 10 ++++ 9 files changed, 123 insertions(+), 31 deletions(-) create mode 100644 src/kernal/board_m65/mega65_native_meminit.s diff --git a/src/aliases/,aliases_ram_over64K_m65.s b/src/aliases/,aliases_ram_over64K_m65.s index f26d15a7..0c49297d 100644 --- a/src/aliases/,aliases_ram_over64K_m65.s +++ b/src/aliases/,aliases_ram_over64K_m65.s @@ -6,6 +6,9 @@ // $10000-$17FFF (32KB) - reserved for DOS // $18000-$18FFF (4KB) - chargen copied to RAM, to allow character redefinition + +.const MEMCONF_CHRBASE = $8000 + // $19000-$1B7FF (10KB) - reserved for virtual text screen, 80x128 .const MEMCONF_SCRBASE = $9000 diff --git a/src/kernal/board_m65/mega65_dmagic.s b/src/kernal/board_m65/mega65_dmagic.s index 29268033..22cb5ad8 100644 --- a/src/kernal/board_m65/mega65_dmagic.s +++ b/src/kernal/board_m65/mega65_dmagic.s @@ -25,10 +25,10 @@ m65_dmagic_oper_fill: lda #($03 + $08) // operation: FILL + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the addresses, go to common part + // Adapt the addresses, launch the job jsr m65_dmagic_adapt_dst - jmp_8 m65_dmagic_common + jmp_8 m65_dmagic_launch m65_dmagic_oper_copy: @@ -43,7 +43,7 @@ m65_dmagic_oper_copy: lda #($00 + $08) // operation: COPY + allow interrupts sta M65_DMAGIC_LIST+6 - // Adapt the addresses, go to common part + // Adapt the addresses, launch the job jsr m65_dmagic_adapt_src jsr m65_dmagic_adapt_dst @@ -53,26 +53,6 @@ m65_dmagic_oper_copy: // FALLTROUGH -m65_dmagic_common: - - // Set remaining job parameters - // XXX this should be done during switching to MEGA65 native mode - - lda #$0A - sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) - lda #$80 - sta M65_DMAGIC_LIST+1 // <- $80 = next byte is highest 8 bits of source address - inc_a - sta M65_DMAGIC_LIST+3 // <- $81 = next byte is highest 8 bits of destination address - - lda #$00 - sta M65_DMAGIC_LIST+5 // <- end of options - - sta M65_DMAGIC_LIST+15 // <- set modulo to 0 - sta M65_DMAGIC_LIST+16 - - // FALLTROUGH - m65_dmagic_launch: // Launch the DMA list @@ -137,3 +117,23 @@ m65_dmagic_adapt_dst: sta M65_DMAJOB_DST_2 rts + + +m65_dmagic_init: + + // Set common job parameters + + lda #$0A + sta M65_DMAGIC_LIST+0 // <- $0A = use F018A list format (it is shorter by 1 byte) + lda #$80 + sta M65_DMAGIC_LIST+1 // <- $80 = next byte is highest 8 bits of source address + inc_a + sta M65_DMAGIC_LIST+3 // <- $81 = next byte is highest 8 bits of destination address + + lda #$00 + sta M65_DMAGIC_LIST+5 // <- end of options + + sta M65_DMAGIC_LIST+15 // <- set modulo to 0 + sta M65_DMAGIC_LIST+16 + + rts diff --git a/src/kernal/board_m65/mega65_native_meminit.s b/src/kernal/board_m65/mega65_native_meminit.s new file mode 100644 index 00000000..b7ef61dc --- /dev/null +++ b/src/kernal/board_m65/mega65_native_meminit.s @@ -0,0 +1,42 @@ +// #LAYOUT# M65 KERNAL_1 #TAKE +// #LAYOUT# * * #IGNORE + + +m65_native_meminit: + + // Prepare generic DMAgic list + + jsr m65_dmagic_init + + // Copy MEGA65 charset to target location - set size + + lda #$00 + sta M65_DMAJOB_SIZE_0 + lda #$10 + sta M65_DMAJOB_SIZE_1 + + // Set destination + + lda #$00 + sta M65_DMAJOB_DST_3 + lda #$01 + sta M65_DMAJOB_DST_2 + lda #>MEMCONF_CHRBASE + sta M65_DMAJOB_DST_1 + lda #MEMCONF_CHRBASE + sta VIC_CHARPTR+1 + lda #$01 + sta VIC_CHARPTR+2 + // Set the following locations: // - M65_SCRGUARD, M65_COLGUARD - guards for virtual screen end // - M65_COLVIEWMAX - guard for viewport start From 62f11b325e5f666515f82425cf275b461def4e36 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 21:17:44 +0200 Subject: [PATCH 79/96] MEGA65 CHRIN variant bugfix --- src/kernal/screen_m65/mega65_chrin_keyboard.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index 14ade3dc..bcc6ff2c 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -120,7 +120,7 @@ m65_chrin_keyboard_enter: // Retrieve first byte which is not space jsr m65_helper_scrlpnt_chrin - ldy INDX + ldy M65__TXTCOL iny // FALLTROUGH From 25dec8848a1c99b2f1e5b18eb2f04297a7fccbd3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 21:20:45 +0200 Subject: [PATCH 80/96] correction, previous bugfix was wrong --- src/kernal/screen_m65/mega65_chrin_keyboard.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernal/screen_m65/mega65_chrin_keyboard.s b/src/kernal/screen_m65/mega65_chrin_keyboard.s index bcc6ff2c..9ed62009 100644 --- a/src/kernal/screen_m65/mega65_chrin_keyboard.s +++ b/src/kernal/screen_m65/mega65_chrin_keyboard.s @@ -120,7 +120,7 @@ m65_chrin_keyboard_enter: // Retrieve first byte which is not space jsr m65_helper_scrlpnt_chrin - ldy M65__TXTCOL + ldy M65_COLVIEWMAX // XXX add support for windowed mode here iny // FALLTROUGH From b3096fbb17e53e89b5ac61f7b2b794896bbc4a70 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 21:39:32 +0200 Subject: [PATCH 81/96] native MEGA65 mode now runs with disabled hot registers (fixes IEC access) --- src/aliases/,aliases_hardware_m65.s | 2 ++ src/kernal/board_m65/mega65_imports.s | 2 ++ src/kernal/board_m65/mega65_viciv_init.s | 17 +++++++++++++++++ src/kernal/board_m65/mega65_viciv_shutdown.s | 4 ++++ src/kernal/screen_m65/mega65_scrmodeset.s | 4 ++++ 5 files changed, 29 insertions(+) diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 075f5ac6..80cc491e 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -20,6 +20,8 @@ .label VIC_CHARSTEP = $D058 // 2 bytes - logical characters per line + .label VIC_SRH = $D05D // - various flags, bit 7 = hot registers + .label VIC_SCRNPTR = $D060 // 4 bytes - pointer to start of screen memory .label VIC_COLPTR = $D064 // 2 bytes - pointer to start of color memory diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index de974bb7..496bb7ee 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -38,6 +38,8 @@ .label viciv_unhide = KERNAL_0.viciv_unhide .label viciv_init = KERNAL_0.viciv_init .label viciv_shutdown = KERNAL_0.viciv_shutdown +.label viciv_hotregs_on = KERNAL_0.viciv_hotregs_on +.label viciv_hotregs_off = KERNAL_0.viciv_hotregs_off .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight diff --git a/src/kernal/board_m65/mega65_viciv_init.s b/src/kernal/board_m65/mega65_viciv_init.s index 510063a4..d4bd917a 100644 --- a/src/kernal/board_m65/mega65_viciv_init.s +++ b/src/kernal/board_m65/mega65_viciv_init.s @@ -22,4 +22,21 @@ viciv_init: lda #%01000000 // enable C65 character set sta VIC_CTRLA + // Disable hot registers + + // FALLTROUGH + +viciv_hotregs_off: + + lda VIC_SRH + and #$7F +!: + sta VIC_SRH + rts + +viciv_hotregs_on: + + lda VIC_SRH + ora #$80 + bra !- diff --git a/src/kernal/board_m65/mega65_viciv_shutdown.s b/src/kernal/board_m65/mega65_viciv_shutdown.s index 553cd580..3d76f1af 100644 --- a/src/kernal/board_m65/mega65_viciv_shutdown.s +++ b/src/kernal/board_m65/mega65_viciv_shutdown.s @@ -23,6 +23,10 @@ viciv_shutdown: sta VIC_CTRLA // enable C64 character set sta VIC_CTRLB // disable extended resolution and attributes + // Reenable hot registers + + jsr viciv_hotregs_on + // Hide VIC-IV registers and quit sta VIC_KEY diff --git a/src/kernal/screen_m65/mega65_scrmodeset.s b/src/kernal/screen_m65/mega65_scrmodeset.s index 2a49ec3e..51edf6cd 100644 --- a/src/kernal/screen_m65/mega65_scrmodeset.s +++ b/src/kernal/screen_m65/mega65_scrmodeset.s @@ -46,11 +46,15 @@ m65_scrmodeset_internal: // entry point for M65_MODE65 tax + jsr viciv_hotregs_on + lda m65_scrtab_scrolx,x sta VIC_SCROLX lda m65_scrtab_vic_ctrlb,x sta VIC_CTRLB + jsr viciv_hotregs_off + // Set the logical row length to 80 ldx #$50 From c5be187955bf0b4e23119516b5c323458957310a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 21:49:25 +0200 Subject: [PATCH 82/96] on MEGA65 start in native mode by default --- src/kernal/init/fce2.hw_entry_reset.s | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index c968391d..2b462e84 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -28,6 +28,7 @@ hw_entry_reset: #if ROM_LAYOUT_M65 jsr map_NORMAL // we want normal memory mapping + jsr viciv_shutdown // by default we do not want the VIC-IV #endif @@ -64,6 +65,13 @@ hw_entry_reset: // "Compute's Mapping the 64" p236 jsr JCINT +#if ROM_LAYOUT_M65 + + clc + jsr M65_MODESET // on MEGA65 go to native mode by default + +#endif + // What do we do when finished? A C64 jumps into the BASIC ROM cli // allow interrupts to happen From b8f1c079ba55484466767febeb54ffa3aa3d3a9c Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 22:01:22 +0200 Subject: [PATCH 83/96] added MEGA65 screenshot --- README.md | 3 ++- ...hot-demo.png => screenshot-demo-generic.png} | Bin doc/screenshot-demo-mega65.png | Bin 0 -> 48608 bytes 3 files changed, 2 insertions(+), 1 deletion(-) rename doc/{screenshot-demo.png => screenshot-demo-generic.png} (100%) create mode 100644 doc/screenshot-demo-mega65.png diff --git a/README.md b/README.md index fa697474..1086f20f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,7 @@ # Open ROMs -![screenshot demonstrating some features](./doc/screenshot-demo.png) +![screenshot generic build screenshot](./doc/screenshot-demo-generic.png) +![screenshot MEGA65 build screenshot](./doc/screenshot-demo-mega65.png) A project to create unencumbered open-source ROMs for use on selected retro computers. Besides this manifest, the following documents are available: diff --git a/doc/screenshot-demo.png b/doc/screenshot-demo-generic.png similarity index 100% rename from doc/screenshot-demo.png rename to doc/screenshot-demo-generic.png diff --git a/doc/screenshot-demo-mega65.png b/doc/screenshot-demo-mega65.png new file mode 100644 index 0000000000000000000000000000000000000000..3a836c17e4a40753fc8782956cae0a5008c7e514 GIT binary patch literal 48608 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 J#jo^y{tuRoM!f(4 literal 0 HcmV?d00001 From 9fe0e81d53a2aaf72cf089f7500fdff3016df79f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 2 Sep 2020 22:17:03 +0200 Subject: [PATCH 84/96] safer reset routine for MEGA65 --- src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/board_m65/mega65_reset_part.s | 26 ++++++++++++++++++++++++ src/kernal/extapi_m65/mega65_modeset.s | 5 +---- src/kernal/init/fce2.hw_entry_reset.s | 5 ++--- 4 files changed, 30 insertions(+), 7 deletions(-) create mode 100644 src/kernal/board_m65/mega65_reset_part.s diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 496bb7ee..2ccf33f0 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -41,6 +41,7 @@ .label viciv_hotregs_on = KERNAL_0.viciv_hotregs_on .label viciv_hotregs_off = KERNAL_0.viciv_hotregs_off +.label m65_clr_magictstr = KERNAL_0.m65_clr_magictstr .label m65_scrtab_txtwidth = KERNAL_0.m65_scrtab_txtwidth .label m65_scrtab_txtheight = KERNAL_0.m65_scrtab_txtheight .label m65_screen_set_indx = KERNAL_0.m65_screen_set_indx diff --git a/src/kernal/board_m65/mega65_reset_part.s b/src/kernal/board_m65/mega65_reset_part.s new file mode 100644 index 00000000..b391b735 --- /dev/null +++ b/src/kernal/board_m65/mega65_reset_part.s @@ -0,0 +1,26 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// MEGA65 specific part of the hardware + + +m65_reset_part: + + jsr map_NORMAL // we want normal memory mapping + jsr viciv_shutdown // by default we do not want the VIC-IV + + jsr M65_MODEGET + bcs !+ + + // Clear MEAGA65 native mode mark, it might cause confusion + +m65_clr_magictstr: // entry point for mode switching routine + + lda #$00 + sta M65_MAGICSTR+0 + sta M65_MAGICSTR+1 + sta M65_MAGICSTR+2 + + // FALLTROUGH +!: + rts diff --git a/src/kernal/extapi_m65/mega65_modeset.s b/src/kernal/extapi_m65/mega65_modeset.s index fb46fe96..acbc8dcc 100644 --- a/src/kernal/extapi_m65/mega65_modeset.s +++ b/src/kernal/extapi_m65/mega65_modeset.s @@ -18,10 +18,7 @@ m65_mode64: // Set the magic string to mark legacy mode - lda #$00 - sta M65_MAGICSTR+0 - sta M65_MAGICSTR+1 - sta M65_MAGICSTR+2 + jsr m65_clr_magictstr // Restore VIC-II configuration diff --git a/src/kernal/init/fce2.hw_entry_reset.s b/src/kernal/init/fce2.hw_entry_reset.s index 2b462e84..754ccff8 100644 --- a/src/kernal/init/fce2.hw_entry_reset.s +++ b/src/kernal/init/fce2.hw_entry_reset.s @@ -27,8 +27,7 @@ hw_entry_reset: #if ROM_LAYOUT_M65 - jsr map_NORMAL // we want normal memory mapping - jsr viciv_shutdown // by default we do not want the VIC-IV + jsr m65_reset_part #endif @@ -62,7 +61,7 @@ hw_entry_reset: // also affirmed by c64 prg p269 jsr JRESTOR - // "Compute's Mapping the 64" p236 + // "Compute's Mapping the 64" p236 jsr JCINT #if ROM_LAYOUT_M65 From fde114154e19156fb788eede2fd604797bd78a1b Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 15:52:37 +0200 Subject: [PATCH 85/96] documentation and branding update --- CONFIG.md | 8 +++---- CREDITS.md | 8 +++---- README.md | 2 +- STATUS.md | 8 +++---- doc/Development.md | 23 +++++++++++-------- doc/Extended-BASIC-TODO.md | 16 +++++++------ doc/Extended-BASIC.md | 14 +++++------ src/aliases/,aliases_config.s | 4 ++-- src/aliases/,aliases_cpu.s | 2 +- src/aliases/,aliases_ram_lowmem_m65.s | 2 +- src/basic/assets/startup_banner_m65.s | 6 ++--- src/basic/basic_commands_01/cmd_fast_slow.s | 2 +- .../board_m65/4000.mega65_vectable_basic_1.s | 2 +- src/basic/board_m65/mega65_imports.s | 2 +- src/basic/board_m65/mega65_map_helpers.s | 2 +- src/basic/board_m65/mega65_proxies.s | 2 +- .../board_m65/4000.mega65_vectable_kernal_1.s | 2 +- src/kernal/board_m65/mega65_imports.s | 2 +- src/kernal/board_m65/mega65_map_helpers.s | 2 +- src/kernal/board_m65/mega65_proxies.s | 2 +- src/kernal/board_m65/mega65_redirect_api.s | 2 +- src/kernal/init/fda3.ioinit.s | 2 +- tools/patch_chargen.cc | 2 +- 23 files changed, 62 insertions(+), 55 deletions(-) diff --git a/CONFIG.md b/CONFIG.md index b5a851c9..88b6b7c9 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -84,7 +84,7 @@ It enables some speed/size code optimizations and allows C65 memory mapping to w ### `CONFIG_CPU_M65_45GS02` -Choose if you have a Mega65 FPGA board. It enables some speed/size code optimizations and allows Mega65 memory mapping to work. +Choose if you have a MEGA65 FPGA board. It enables some speed/size code optimizations and allows MEGA65 memory mapping to work. ### `CONFIG_CPU_WDC_65816` @@ -111,7 +111,7 @@ These models additionaly use RAM under BASIC, and the 50K additionally takes ove Uses RAM under BASIC, I/O and KERNAL, takes over `$C000`-`$CFFF` area requires special helper routines installed in `$2A7`-`$2FF` area (normally unused and free for the user). Gives the most free memory for BASIC programs, but it's the slowest (for example, forces disabling optimized LOAD loop for JiffyDOS) and the least compatible model. -It is currently not compatible with Mega65 extended ROMs. +It is currently not compatible with MEGA65 extended ROMs. Comparing to standard memory model, it needs about 180 bytes in BASIC segment and 80 bytes in KERNAL segment - at the moment of doing the test, these values are expected to change often. @@ -147,7 +147,7 @@ Causes screen blanking during JiffyDOS file loading to increase performance. ## Tape support -Note: for Mega65 most of the tape support code is placed in it's extended ROM; very little of the (tiny) KERNAL segment is used. +Note: for MEGA65 most of the tape support code is placed in it's extended ROM; very little of the (tiny) KERNAL segment is used. ### `CONFIG_TAPE_NORMAL` @@ -287,7 +287,7 @@ Feature needs several bytes in BASIC segment. If unsure - enable. If enabled, embeds a tape head align tool into the ROM, it can be started with `←H`. Requires `CONFIG_TAPE_WEDGE`. -Feature needs about 800 bytes in KERNAL segment. Only recomended for machines with extended ROM, like Mega65. +Feature needs about 800 bytes in KERNAL segment. Only recomended for machines with extended ROM, like MEGA65. ### `CONFIG_BCD_SAFE_INTERRUPTS` diff --git a/CREDITS.md b/CREDITS.md index dce673d1..76bd4e40 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -3,7 +3,7 @@ ## for source code/assets we reused -* Retrofan - for his Mega65 banner artwork and PXLfont +* Retrofan - for his MEGA65 banner artwork and PXLfont * TWW/CTR - for his keyboard handling code * Graham - for his PAL/NTSC detection code and compact 8x8 multiplication routine * enthusi/Onslaught - for his example Turbo Tape 64 compatible loader @@ -26,10 +26,10 @@ ## other -* Gábor Lénárt - for [his work](https://github.com/lgblgblgb/xemu) on XEMU Mega65 emulator -* Hernán Di Pietro - for [his work](https://github.com/hernandp/xemu) on XEMU Mega65 emulator +* Gábor Lénárt - for [his work](https://github.com/lgblgblgb/xemu) on XEMU MEGA65 emulator +* Hernán Di Pietro - for [his work](https://github.com/hernandp/xemu) on XEMU MEGA65 emulator * Mads Nielsen - for the [Kick Assembler](http://www.theweb.dk/KickAssembler/Main.html#frontpage) -* Simon Jameson - for his Kick Assembler [pseudocommands](https://github.com/smnjameson/M65_KickAsm_PseudoCommands) for Mega65 CPU support +* Simon Jameson - for his Kick Assembler [pseudocommands](https://github.com/smnjameson/M65_KickAsm_PseudoCommands) for MEGA65 CPU support
diff --git a/README.md b/README.md index 1086f20f..0bb0f62b 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ which typically requires the inclusion of firmware, i.e, "ROMs", while respectin the owners of the copyrights in the ROMs. Therefore the goal of this project is to create a fully open-source and unencumbered set of ROMs for various systems. -The initial focus is the C64 and C65 computers, because of the desire to be able to include open ROMs with the MEGA65 +The initial focus is the C64 and C65 computers, because of the desire to be able to include Open ROMs with the MEGA65 retro computer. In short, this project exists precisely because we respect, and want to help others to respect the intellectual property diff --git a/STATUS.md b/STATUS.md index 283ab459..c0b3c7aa 100644 --- a/STATUS.md +++ b/STATUS.md @@ -22,7 +22,7 @@ Here are the features of the Open ROMs not found in the original ROMs from the 8 * normal tape load error log is limited by free stack space only (no artificial limitation like in original ROMs) * tape format autodetection; normal vs turbo is mostly transparent to user * improved support for tape adapters (for using regular casette players and other audio devices instead of Datasette) and emulators -* built-in tape head align tool (only feasible to use on machines with extended memory, like Mega65) +* built-in tape head align tool (only feasible to use on machines with extended memory, like MEGA65) * uses RAM under ROM and I/O: 51199 bytes free (up to `$CFFF`) by default, but 61438 is also possible * cold/warm start silences multiple SID chips @@ -58,7 +58,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | C64 | DONE | | | C128 | DONE | | -| Mega65 | PARTIAL | code mostly complete, but not tested yet | +| MEGA65 | PARTIAL | code mostly complete, but not tested yet |
@@ -70,7 +70,7 @@ The following ROM features are currently missing: | :----------------: | :------: | :------------------------------------------------: | | VIC-II | DONE | | | 80 columns, VDC | NOT DONE | | -| 80 columns, Mega65 | PARTIAL | no windowing mode and C65/M65 extra keys support | +| 80 columns, MEGA65 | PARTIAL | no windowing mode and C65/M65 extra keys support |
@@ -103,7 +103,7 @@ The following ROM features are currently missing: | JiffyDOS | PARTIAL | LOAD needs improvement for better performance | | DolphinDOS | DONE | | | CIA burst mod | NOT DONE | | -| Mega65 burst | NOT DONE | | +| MEGA65 burst | NOT DONE | |
diff --git a/doc/Development.md b/doc/Development.md index 29655ae6..5f06dd42 100644 --- a/doc/Development.md +++ b/doc/Development.md @@ -18,16 +18,16 @@ Most important: always test your software on the original ROMs too. If your code Please, do not use any internal/unofficial Open ROMs API. They WILL change in an incompatible way, you may believe me. Using unofficial API of the original ROMs is OK if the routine is marked as supported in the [implementation status](../STATUS.md) document. -### Compatibility with Open ROMs for Mega65 +### Compatibility with Open ROMs for MEGA65 -The Mega65 Open ROMs build aims to provide a C64-compatible memory map in range `$00000-$0FFFF`. For `$10000` and above, everything is still subject to change. +The MEGA65 Open ROMs build aims to provide a C64-compatible memory map in range `$00000-$0FFFF`. For `$10000` and above, everything is still subject to change. -Please note, that certain ROM routines are moved to additional Mega65 ROM area (2x8KB is not enough to implement full ROM functionality and additional features) - original locations contain just short compatibility code which remaps memory, calls the real routine, and restores default mapping (that means all blocks unmapped). This shouldn't be a problem for original C64 software, but can make a difference for Mega65-aware code; thus, please follow these simple rules: +Please note, that certain ROM routines are moved to additional MEGA65 ROM area (2x8KB is not enough to implement full ROM functionality and additional features) - original locations contain just short compatibility code which remaps memory, calls the real routine, and restores default mapping (that means all blocks unmapped). This shouldn't be a problem for original C64 software, but can make a difference for MEGA65-aware code; thus, please follow these simple rules: - do not call ROM routines with .B set to anything other than 0 (and .B set to 0x40 or above is a receipe for disaster!) - be aware that ROM routines may restore the default memory mapping by means of MAP/EOM -Open ROMs interrupt handlers do not touch the ROM mapping, range `0x4000-0xBFFF` can be freely mapped without disabling IRQ or NMI. The .Z register is mostly safe to use too - some routines might use it, but they will alwayys restore it's previous state. Please be aware, that for maximum compatibility our IRQ/NMI handlers DO NOT store/restore .Z register. +Open ROMs interrupt handlers do not touch the ROM mapping, range `0x4000-0xBFFF` can be freely mapped without disabling IRQ or NMI. The .Z register is mostly safe to use too - some routines might use it, but they will always restore it's previous state. Please be aware, that for maximum compatibility our IRQ/NMI handlers DO NOT store/restore .Z register. ### API extensions @@ -63,10 +63,11 @@ Bits 3 and 4 are extension to the original variable, compatible with the C128 RO Before modifying NMI vector, set it's high byte to 0. The ROM routine considers such address invalid and won't try to call the custom code, thus preventing a crash if interrupt happens in the worst possible moment. -#### Mega65 native mode +#### MEGA65 native mode -Mega65 build starts in legacy mode, which is intended to be reasonably compatible with the C64 ROMs. However, a native Mega65 mode is planned too, to make it easier to utilise extra features of this machine. Soo far the following has been done: +MEGA65 native mode imlementation has started. Important changes so far: +- Uses VIC-IV features to implement 80-column screen mode; the $0400-$07FF area is utilized by ROM to provide additional features. - Slightly different chargen. On C64 machines pressing C= + G or C= + M key combinations produces the same visual result as C= + H or C= + N, respectively - despite keycap printing suggests they should produce tinner bars. This was intentional change in the C64 ROMs (compared to VIC-20), to prevent colour problems on 80s era TVs. Screen font used in the legacy mode duplicates this change, but the font intended for native mode has this change reverted back. Additionally, the π sign is available for lower/upper case set too. ## Tinkering with Open ROMs @@ -86,7 +87,7 @@ List of the most important make targets: | `test` | builds the 'custom' configuration, launches it using VICE emulator | | `test_generic` | builds the default ROMs, for generic C64/C128, launches using VICE | | `test_generic_x128` | as above, but launches C128 emulator instead | -| `test_mega65` | builds the Mega65 ROM, launches it using XEMU emulator | +| `test_mega65` | builds the MEGA65 ROM, launches it using XEMU emulator | | `test_ultimate64` | builds the Ultimate 64 configuration, launches it using VICE emulator | | `test_hybrid` | builds a hybrid ROM (Open ROMs Kernal + original BASIC), launches it using VICE | | `test_testing` | builds a rather odd testing configuration, launches it using VICE emulator | @@ -158,7 +159,7 @@ This can be found in a private (internal) vector table of `KERNAL_1` segment of // #LAYOUT# * * #IGNORE ``` -This is used for memory mapping helper routines, which are only needed for Mega65 build. They will be placed in `KERNAL_0` segment in such case. And the last example: +This is used for memory mapping helper routines, which are only needed for MEGA65 build. They will be placed in `KERNAL_0` segment in such case. And the last example: ``` // #LAYOUT# STD * #TAKE @@ -167,7 +168,7 @@ This is used for memory mapping helper routines, which are only needed for Mega6 // #LAYOUT# * * #IGNORE ``` -This is for the routine, that on Mega65 goes to `KERNAL_1` segment, but can still be transparently called using fixed location in `KERNAL_0` segment. The code might, for example, look this way: +This is for the routine, that on MEGA65 goes to `KERNAL_1` segment, but can still be transparently called using fixed location in `KERNAL_0` segment. The code might, for example, look this way: ``` ROUTINE_NAME: @@ -187,6 +188,10 @@ ROUTINE_NAME: Last, but not least - the `#TAKE-HIGH` is intended to be used for BASIC routines, which should still be available after the main BASIC ROM is banked out. +### MEGA65 computer-based DOS + +TODO + ### CPU-specific optimizations TODO diff --git a/doc/Extended-BASIC-TODO.md b/doc/Extended-BASIC-TODO.md index 7c683e6a..347d79a4 100644 --- a/doc/Extended-BASIC-TODO.md +++ b/doc/Extended-BASIC-TODO.md @@ -1,7 +1,7 @@ # Planned BASIC features, when V2 compatibility is reached -Ideas for the future, most of them suitable for Mega65 or other power machines only +Ideas for the future, most of them suitable for MEGA65 or other power machines only * sound support * 2D graphics support @@ -18,16 +18,15 @@ Ideas for the future, most of them suitable for Mega65 or other power machines o * `CGOTO` and `CGOSUB` - computatiuonal versions, should accept expressions * `LABEL`, `LGOTO` and `LGOSUB` - jump to label * some kind of subroutines with local variable namespace, possibly loaded from disc (like in Warsaw Basic 3.2) -* for Mega65 mode, move variables to a separate memory area, consider extending variable name length +* for MEGA65 mode, move variables to a separate memory area, consider extending variable name length * `←V` (verify from tape) - if Kernal is extended to offer this feature * modulo function or opeerator * `DPEEK`, `DPOKE`, `QPEEK`, `QPOKE` - 2/4 byte `PEEK` and `POKE` variants -* all the functions/commands accepting memory addresses should be able to access the whole Mega65 memory +* all the functions/commands accepting memory addresses should be able to access the whole MEGA65 memory * ability to limit memory used by basic to standard 38K or to 46K (memory model switch) * `XOR` operator * `AUTO` - line auto numbering * `RENUMBER` for chanign the line numbers -* `IF ... THEN`, `BEGIN ... BEND`; `ELSE` not planned, as it would have slown down the execution * consider `BOOT` command * possibly some commands for creating menus and dialog boxes * more configurable `INPUT` @@ -38,10 +37,8 @@ Ideas for the future, most of them suitable for Mega65 or other power machines o * `DELETE` command to delete several BASIC lines, as in BASIC V10 * `FOR` loop should accept integer variable as index * `FETCH`, `STASH`, `SWAP` - REU support -* `DMA` command for Mega65 +* `DMA` command for MEGA65 * geoRAM support -* `GO 64` / `GO 65` should enable/disable C64 compatibility mode on Mega65 -* `NSYS` for Mega65 - native `SYS` for Mega65, should not switch to C64 compatibilty mode * `DO ... LOOP`, `DO ... UNTIL`, `DO ... WHILE`, `EXIT` * `SEEK#` to read-and-forget n bytes * `RECORD#` command from BASIC V10 @@ -63,3 +60,8 @@ Ideas for the future, most of them suitable for Mega65 or other power machines o * function to generate string of n duplicated characters * function to retrieve fractional part of a number * command to fill text screen area with a character, inverse screen area, scroll, or change fg/bg color of screen area + +# Features not planned + +* `ELSE` - it would have slown down the execution, can be easily substituted +* `BEGIN ... BEND` - similarly, using these would hurt the performance diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 93d70e2a..0934d173 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -1,7 +1,7 @@ # Extended BASIC -NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the Mega65 or Ultimate 64. +NOTE: Command syntax, behaviour details, and tokens are still subject to change! Currently the availability of some depends on the build configuration, in the future most (if not all) extended commands will be available only on machines with extended ROM, like the MEGA65 or Ultimate 64. ## DOS Wedge @@ -35,7 +35,7 @@ Loads the file from tape. Depending on the configuration, it tries to load the f Like above, but merges a BASIC program to the one already stored in memory. -### `←H` (Mega65) +### `←H` (MEGA65) Launches a built-in tape head alignment tool. Destroys program in memory. Press `RUN/STOP` to terminate the tool. @@ -59,7 +59,7 @@ Saves the binary data from the given memory area. NOTE: for now syntax differs f ## Additional BASIC commands - misc -### `COLD` (Mega65) +### `COLD` (MEGA65) Resets the machine. In direct mode asks for confirmation first. @@ -75,7 +75,7 @@ Tries to switch the machine back to 1 MHz operation mode. Tries to restore program destroyed by the `NEW` command or a reset. -### `MEM` (Mega65) +### `MEM` (MEGA65) Displays BASIC memory usage information: * `TEXT` - size of BASIC program text, always at least 2 bytes are used @@ -84,7 +84,7 @@ Displays BASIC memory usage information: * `STRS` - bytes occupied by strings, also the ones belonging to arrays * `FREE` - unused space -### `SYSINFO` (Mega65) +### `SYSINFO` (MEGA65) Displays various system information. @@ -96,10 +96,10 @@ Clears the screen content. Runs the garbage collector - disposes outdated strings. -### `NSYS` (Mega65) +### `NSYS` (MEGA65) A 'native' `SYS` - same as `SYS`, but does not switch to C64 compatibility mode. -### `GO 64`, `GO 65` (Mega65) +### `GO 64`, `GO 65` (MEGA65) Switches machine to C64 compatibility mode or to MEGA65 native mode. Performs `CLR` diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index c42216ca..18f9bb24 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -113,10 +113,10 @@ // Check that memory model and ROM layout configurations is correct { #if ROM_LAYOUT_M65 && !CONFIG_CPU_M65_45GS02 - .error "Mega65 ROM layout requires CONFIG_CPU_M65_45GS02" + .error "MEGA65 ROM layout requires CONFIG_CPU_M65_45GS02" #endif #if ROM_LAYOUT_M65 && !CONFIG_MB_MEGA_65 - .error "Mega65 ROM layout requires CONFIG_MB_MEGA_65" + .error "MEGA65 ROM layout requires CONFIG_MB_MEGA_65" #endif .var selected = 0; diff --git a/src/aliases/,aliases_cpu.s b/src/aliases/,aliases_cpu.s index 2554b234..7ea9898c 100644 --- a/src/aliases/,aliases_cpu.s +++ b/src/aliases/,aliases_cpu.s @@ -86,7 +86,7 @@ // -// Memory mapping for C65 and Mega65 +// Memory mapping for C65 and MEGA65 // #if HAS_OPCODES_4510 diff --git a/src/aliases/,aliases_ram_lowmem_m65.s b/src/aliases/,aliases_ram_lowmem_m65.s index 767d124d..c109804e 100644 --- a/src/aliases/,aliases_ram_lowmem_m65.s +++ b/src/aliases/,aliases_ram_lowmem_m65.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// Names of ZP and low memory locations for the native Mega65 mode +// Names of ZP and low memory locations for the native MEGA65 mode // diff --git a/src/basic/assets/startup_banner_m65.s b/src/basic/assets/startup_banner_m65.s index c3c74cff..de9690b6 100644 --- a/src/basic/assets/startup_banner_m65.s +++ b/src/basic/assets/startup_banner_m65.s @@ -10,7 +10,7 @@ startup_banner: - // Fancy Mega65 banner - from Retrofan, slightly tweaked + // Fancy MEGA65 banner - from Retrofan, slightly tweaked // remove unneeded $1F's (blue) and $9A's (light blue) @@ -34,7 +34,7 @@ startup_banner: .byte $12, $20, $20, $92, $20, $20, $12, $96, $A3, $A3, $A3, $A3, $1F, $92 .byte $0D, $0D, $05, $00 - // Fancy Mega65 banner - from Retrofan + // Fancy MEGA65 banner - from Retrofan // // .byte $9a, $12, $20, $20, $7f, $a9, $20, $20, $1f, $20, $9a, $20, $20, $20 // .byte $20, $1f, $20, $9a, $a9, $20, $20, $20, $92, $a1, $1f, $12, $20, $9a, $a9, $20 @@ -52,7 +52,7 @@ startup_banner: // .byte $20, $20, $1f, $20, $20, $96, $a3, $a3, $a3, $a3, $1f // .byte $92, $0D, $0D, $05, $00 - // Original Mega65 banner - supplied by Deft + // Original MEGA65 banner - supplied by Deft // // .byte $9A,$12,$A3,$A3,$A3,$A3,$A3,$A3,$DF,$9B,$92,$20,$05,$12,$A0,$A0 // .byte $DF,$9B,$92,$20,$05,$12,$A0,$A0,$DF,$9B,$92,$20,$05,$12,$A0,$A0 diff --git a/src/basic/basic_commands_01/cmd_fast_slow.s b/src/basic/basic_commands_01/cmd_fast_slow.s index c49e2cfa..bd740ee3 100644 --- a/src/basic/basic_commands_01/cmd_fast_slow.s +++ b/src/basic/basic_commands_01/cmd_fast_slow.s @@ -5,7 +5,7 @@ #if CONFIG_MB_MEGA_65 - // For Mega65 Kernal routines are called directly + // For MEGA65 Kernal routines are called directly #elif CONFIG_MB_ULTIMATE_64 diff --git a/src/basic/board_m65/4000.mega65_vectable_basic_1.s b/src/basic/board_m65/4000.mega65_vectable_basic_1.s index e135eda1..99294c8c 100644 --- a/src/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/src/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -3,7 +3,7 @@ // #LAYOUT# * * #IGNORE // -// Definitions for communication with Mega65 segment BASIC_1 from BASIC_0 +// Definitions for communication with MEGA65 segment BASIC_1 from BASIC_0 // diff --git a/src/basic/board_m65/mega65_imports.s b/src/basic/board_m65/mega65_imports.s index b9c24577..34ff2132 100644 --- a/src/basic/board_m65/mega65_imports.s +++ b/src/basic/board_m65/mega65_imports.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// Definitions for calling Mega65 segments BASIC_0 and KERNAL_0 routines from BASIC_1 +// Definitions for calling MEGA65 segments BASIC_0 and KERNAL_0 routines from BASIC_1 // #import "BASIC_0_combined.sym" diff --git a/src/basic/board_m65/mega65_map_helpers.s b/src/basic/board_m65/mega65_map_helpers.s index 0f0fa550..7c92e022 100644 --- a/src/basic/board_m65/mega65_map_helpers.s +++ b/src/basic/board_m65/mega65_map_helpers.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// ROM mapping routines for Mega65 +// ROM mapping routines for MEGA65 // // Available memory maps: diff --git a/src/basic/board_m65/mega65_proxies.s b/src/basic/board_m65/mega65_proxies.s index c7e00a33..afc9d6d9 100644 --- a/src/basic/board_m65/mega65_proxies.s +++ b/src/basic/board_m65/mega65_proxies.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// Proxies for calling Mega65 segment BASIC_0 and KERNAL_0 routines from BASIC_1 +// Proxies for calling MEGA65 segment BASIC_0 and KERNAL_0 routines from BASIC_1 // diff --git a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s index ed13e66d..9b337da2 100644 --- a/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s +++ b/src/kernal/board_m65/4000.mega65_vectable_kernal_1.s @@ -3,7 +3,7 @@ // #LAYOUT# * * #IGNORE // -// Definitions for communication with Mega65 segment KERNAL_1 from KERNAL_0 +// Definitions for communication with MEGA65 segment KERNAL_1 from KERNAL_0 // diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 2ccf33f0..68b57db9 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// Definitions for calling Mega65 segment KERNAL_0 routines from KERNAL_1 +// Definitions for calling MEGA65 segment KERNAL_0 routines from KERNAL_1 // #import "KERNAL_0_combined.sym" diff --git a/src/kernal/board_m65/mega65_map_helpers.s b/src/kernal/board_m65/mega65_map_helpers.s index 7e2b41e0..8abb8d7d 100644 --- a/src/kernal/board_m65/mega65_map_helpers.s +++ b/src/kernal/board_m65/mega65_map_helpers.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// ROM mapping routines for Mega65 +// ROM mapping routines for MEGA65 // // Available memory maps: diff --git a/src/kernal/board_m65/mega65_proxies.s b/src/kernal/board_m65/mega65_proxies.s index 1c64dfb5..51651693 100644 --- a/src/kernal/board_m65/mega65_proxies.s +++ b/src/kernal/board_m65/mega65_proxies.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// Proxies for calling Mega65 segment KERNAL_0 routines from KERNAL_1 +// Proxies for calling MEGA65 segment KERNAL_0 routines from KERNAL_1 // diff --git a/src/kernal/board_m65/mega65_redirect_api.s b/src/kernal/board_m65/mega65_redirect_api.s index 1392852f..72e53cce 100644 --- a/src/kernal/board_m65/mega65_redirect_api.s +++ b/src/kernal/board_m65/mega65_redirect_api.s @@ -2,7 +2,7 @@ // #LAYOUT# * * #IGNORE // -// ROM routine call redirect for Mega65 API routines +// ROM routine call redirect for MEGA65 API routines // M65_MODESET: diff --git a/src/kernal/init/fda3.ioinit.s b/src/kernal/init/fda3.ioinit.s index 69cef2cf..b3973e07 100644 --- a/src/kernal/init/fda3.ioinit.s +++ b/src/kernal/init/fda3.ioinit.s @@ -105,7 +105,7 @@ IOINIT: #else - // Mega65 specific handling - it contains 4 SIDs + // MEGA65 specific handling - it contains 4 SIDs sta SID_SIGVOL + __SID_R1_OFFSET sta SID_SIGVOL + __SID_R2_OFFSET diff --git a/tools/patch_chargen.cc b/tools/patch_chargen.cc index 49bef286..325aee72 100644 --- a/tools/patch_chargen.cc +++ b/tools/patch_chargen.cc @@ -1,6 +1,6 @@ // // Utility to patch the character generator file to create -// font for Mega65 native mode and possibly other uses +// font for MEGA65 native mode and possibly other uses // #include "common.h" From fd13b2a65bdda74d54deae5e8a258e33387ba470 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 16:42:00 +0200 Subject: [PATCH 86/96] MEGA65 banner cleanup, fix for native mode autoswitch screen garbage --- src/basic/assets/startup_banner_m65.s | 7 -- src/basic/basic_commands/cmd_sys.s | 1 + .../board_m65/4000.mega65_vectable_basic_1.s | 28 +++--- src/basic/init/e422.initmsg.jmp.s | 7 ++ src/basic/init/initmsg_m65.s | 90 ++++++++++--------- tools/generate_strings.cc | 67 +++++++------- 6 files changed, 105 insertions(+), 95 deletions(-) diff --git a/src/basic/assets/startup_banner_m65.s b/src/basic/assets/startup_banner_m65.s index de9690b6..a09193ed 100644 --- a/src/basic/assets/startup_banner_m65.s +++ b/src/basic/assets/startup_banner_m65.s @@ -69,10 +69,3 @@ startup_banner: // .byte $12,$A0,$A0,$9B,$92,$20,$9A,$7F,$12,$A0,$A0,$9B,$92,$20,$9A,$7F // .byte $12,$DF,$92,$7F,$9B,$20,$9A,$20,$9B,"0.2.0.0",$0D // .byte $0D,$05,$92,$00 - -startup_banner_legacy: - - .text "LEGACY" - .byte $11, $9D, $9D, $9D, $9D, $9D - .text "MODE" - .byte $00 diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index 8d151300..f7aba769 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -30,6 +30,7 @@ cmd_sys: bcs cmd_sys_nsys_common sec jsr M65_MODESET // set legacy C64 compatibility mode + jsr INITMSG_autoswitch // FALLTROUGH diff --git a/src/basic/board_m65/4000.mega65_vectable_basic_1.s b/src/basic/board_m65/4000.mega65_vectable_basic_1.s index 99294c8c..20633a43 100644 --- a/src/basic/board_m65/4000.mega65_vectable_basic_1.s +++ b/src/basic/board_m65/4000.mega65_vectable_basic_1.s @@ -13,21 +13,22 @@ // Label definitions .label VB1__INITMSG = $4000 + 2 * 0 - .label VB1__LINKPRG = $4000 + 2 * 1 - .label VB1__tokenise_line = $4000 + 2 * 2 - .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__do_new = $4000 + 2 * 6 - .label VB1__do_clr = $4000 + 2 * 7 - .label VB1__do_restore = $4000 + 2 * 8 - .label VB1__cmd_mem_cont = $4000 + 2 * 9 - .label VB1__cmd_sysinfo = $4000 + 2 * 10 - .label VB1__prepare_direct_execution = $4000 + 2 * 11 - .label VB1__helper_ask_if_sure = $4000 + 2 * 12 + .label VB1__INITMSG_autoswitch = $4000 + 2 * 1 + .label VB1__LINKPRG = $4000 + 2 * 2 + .label VB1__tokenise_line = $4000 + 2 * 3 + .label VB1__list_single_line = $4000 + 2 * 4 + .label VB1__print_packed_error = $4000 + 2 * 5 + .label VB1__print_packed_misc_str = $4000 + 2 * 6 + .label VB1__do_new = $4000 + 2 * 7 + .label VB1__do_clr = $4000 + 2 * 8 + .label VB1__do_restore = $4000 + 2 * 9 + .label VB1__cmd_mem_cont = $4000 + 2 * 10 + .label VB1__cmd_sysinfo = $4000 + 2 * 11 + .label VB1__prepare_direct_execution = $4000 + 2 * 12 + .label VB1__helper_ask_if_sure = $4000 + 2 * 13 #if CONFIG_DOS_WEDGE - .label VB1__wedge_dos = $4000 + 2 * 13 + .label VB1__wedge_dos = $4000 + 2 * 14 #endif #else @@ -35,6 +36,7 @@ // Vector table (Open ROMs private!) .word INITMSG + .word INITMSG_autoswitch .word LINKPRG .word tokenise_line .word list_single_line diff --git a/src/basic/init/e422.initmsg.jmp.s b/src/basic/init/e422.initmsg.jmp.s index 591ed9ac..f0de165f 100644 --- a/src/basic/init/e422.initmsg.jmp.s +++ b/src/basic/init/e422.initmsg.jmp.s @@ -16,8 +16,15 @@ INITMSG: jsr map_BASIC_1 jsr_ind VB1__INITMSG +!: jmp map_NORMAL +INITMSG_autoswitch: + + jsr map_BASIC_1 + jsr_ind VB1__INITMSG_autoswitch + bra !- + #else jmp initmsg_real diff --git a/src/basic/init/initmsg_m65.s b/src/basic/init/initmsg_m65.s index a59a44b7..bbe77b95 100644 --- a/src/basic/init/initmsg_m65.s +++ b/src/basic/init/initmsg_m65.s @@ -9,16 +9,7 @@ INITMSG: - // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen - - lda #147 - jsr JCHROUT - - // Display main banner - - lda #startup_banner - jsr STROUT + jsr INITMSG_main_banner // Display additional information, depending on the mode @@ -27,34 +18,12 @@ INITMSG: // Legacy C64 compatibility mode - ldx #$02 - ldy #$21 - jsr plot_set + jsr INITMSG_partial - lda #startup_banner_legacy - jsr STROUT - - // Legacy mode - display revision and available memory - - ldx #$05 - ldy #$00 - jsr plot_set - - lda #rom_revision_basic_string - jsr STROUT - - ldx #$05 - ldy #$12 - jsr plot_set - - jsr initmsg_bytes_free - - ldx #$07 - ldy #$00 - jmp plot_set + ldx #IDX__STR_ORS_LEGACY_2 + jsr print_packed_misc_str + bra INITMSG_end !: // Native mode @@ -79,17 +48,54 @@ INITMSG: ldx #IDX__STR_ORS jsr print_packed_misc_str - ldx #IDX__STR_PRE_REV - jsr print_packed_misc_str - - lda #rom_revision_basic_string - jsr STROUT + jsr INITMSG_revision jsr print_return jsr print_return + + // FALLTROUGH + +INITMSG_end: + jsr initmsg_bytes_free ldx #$09 ldy #$00 jmp plot_set + +INITMSG_main_banner: + + // Clear the screen first, some cartridges (like IEEE-488) are leaving a mess on the screen + + lda #147 + jsr JCHROUT + + // Display main banner + + lda #startup_banner + jmp STROUT + +INITMSG_autoswitch: // entry point for 'SYS command' + + jsr INITMSG_main_banner + jsr INITMSG_partial + + jsr print_return + jmp print_return + +INITMSG_partial: + + ldx #IDX__STR_ORS_LEGACY_1 + jsr print_packed_misc_str + + // FALLTROUGH + +INITMSG_revision: + + ldx #IDX__STR_PRE_REV + jsr print_packed_misc_str + + lda #rom_revision_basic_string + jmp STROUT diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index c7f9e128..73d605fd 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -284,43 +284,44 @@ const StringEntryList GLOBAL_Errors = { ListType::STRINGS_BASIC, "errors", const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { // STD M65 U64 X16 --- misc strings as on CBM machines - { true, true, true, true, "STR_RET_QM", "\r?" }, - { true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser - { true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html - { true, true, true, true, "STR_IN", " IN " }, - { false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm + { true, true, true, true, "STR_RET_QM", "\r?" }, + { true, true, true, true, "STR_BYTES", " BASIC BYTES FREE" }, // https://github.com/stefanhaustein/expressionparser + { true, true, true, true, "STR_READY", "\rREADY.\r" }, // https://www.ibm.com/support/knowledgecenter/zosbasics/com.ibm.zos.zconcepts/zconc_whatistsonative.htm https://github.com/stefanhaustein/expressionparser + { true, true, true, true, "STR_ERROR", " ERROR" }, // simply the word error that is attached to the other parts of messages https://fjkraan.home.xs4all.nl/comp/apple2faq/app2asoftfaq.html + { true, true, true, true, "STR_IN", " IN " }, + { false, true, false, false, "STR_IF_SURE", "\rARE YOU SURE? " }, // https://docs.microsoft.com/en-us/windows/win32/uxguide/mess-confirm // STD M65 U64 X16 --- misc strings specific to Open ROMs, not present in CBM ROMs - { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, + { true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, - { false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, + { false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, + { false, true, false, false, "STR_ORS_LEGACY_1", "OPEN ROMS " }, + { false, true, false, false, "STR_ORS_LEGACY_2", "\r\rLEGACY MODE " }, - { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, - { false, true, false, false, "STR_MEM_1", " $" }, - { false, true, false, false, "STR_MEM_2", " " }, - { false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, - { false, true, false, false, "STR_MEM_VARS", "\r VARS" }, - { false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, - { false, true, false, false, "STR_MEM_STRS", "\r STRS" }, - { false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, - - { false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, - { false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, - { false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, - { false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, - { false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, - { false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, - { false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, - { false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, - { false, true, false, false, "STR_SI_HW_21", "MEGAPHONE R1" }, - { false, true, false, false, "STR_SI_HW_40", "NEXYS4 PSRAM" }, - { false, true, false, false, "STR_SI_HW_41", "NEXYS4 DDR" }, - { false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, - { false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, - { false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, - { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, - { false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, + { false, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, + { false, true, false, false, "STR_MEM_1", " $" }, + { false, true, false, false, "STR_MEM_2", " " }, + { false, true, false, false, "STR_MEM_TEXT", "\r TEXT" }, + { false, true, false, false, "STR_MEM_VARS", "\r VARS" }, + { false, true, false, false, "STR_MEM_ARRS", "\r ARRS" }, + { false, true, false, false, "STR_MEM_STRS", "\r STRS" }, + { false, true, false, false, "STR_MEM_FREE", "\r\r FREE" }, + { false, true, false, false, "STR_SI_HEADER", "OPEN ROMS, " }, + { false, true, false, false, "STR_SI_MODE64", "LEGACY MODE" }, + { false, true, false, false, "STR_SI_MODE65", "NATIVE MODE" }, + { false, true, false, false, "STR_SI_HDR_REL", "\rRELEASE " }, + { false, true, false, false, "STR_SI_HDR_HW", "BOARD : " }, + { false, true, false, false, "STR_SI_HW_01", "MEGA65 R1" }, + { false, true, false, false, "STR_SI_HW_02", "MEGA65 R2" }, + { false, true, false, false, "STR_SI_HW_03", "MEGA65 R3" }, + { false, true, false, false, "STR_SI_HW_21", "MEGAPHONE R1" }, + { false, true, false, false, "STR_SI_HW_40", "NEXYS4 PSRAM" }, + { false, true, false, false, "STR_SI_HW_41", "NEXYS4 DDR" }, + { false, true, false, false, "STR_SI_HW_42", "NEXYS4 DDR WIDGET" }, + { false, true, false, false, "STR_SI_HW_FD", "WUKONG A100T" }, + { false, true, false, false, "STR_SI_HW_FE", "SIMULATION VHDL" }, + { false, true, false, false, "STR_SI_HW_XX", "UNKNOWN ID $" }, + { false, true, false, false, "STR_SI_HDR_VID", "\rVIDEO : " }, // Note: depending on configuration, additional strings will be added here } }; From d2a9164757b8059c088671ead2efe681b88f5aad Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 17:05:24 +0200 Subject: [PATCH 87/96] no MEGA65 branding in generaic BASIC ID string --- src/basic/rom_revision/a004.identifier.s | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/basic/rom_revision/a004.identifier.s b/src/basic/rom_revision/a004.identifier.s index 5d780247..c8c4e527 100644 --- a/src/basic/rom_revision/a004.identifier.s +++ b/src/basic/rom_revision/a004.identifier.s @@ -4,8 +4,20 @@ // #LAYOUT# * * #IGNORE -// Computes Mapping the 64, p89 -// 8 character name -// MEGABAS2 = "MEGA BASIC 2" +// Computes Mapping the 64, p89 - 8 character name - .byte $4D,$45,$47,$41,$42,$41,$53,$32 +#if ROM_LAYOUT_M65 + + // 'M65BASIC' + + .byte $4D, $36, $35 // 'M65' + +#else + + // 'ORGBASIC', Open ROMs Generic BASIC + + .byte $4F, $52, $47 // 'ORG' + +#endif + + .byte $42, $41, $53, $49, $43 // 'BASIC' From 9a4e521eff95894283f9712d5557b9967ab5bba3 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 17:40:43 +0200 Subject: [PATCH 88/96] added 'GO 65 SYS' construction to BASIC --- doc/Extended-BASIC.md | 4 +++ src/basic/basic_commands/cmd_go_goto_run.s | 36 +++++++++++++++++----- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 0934d173..9f930095 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -103,3 +103,7 @@ 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` + +### `GO 65 SYS` (MEGA65) + +The same as `GO 65: NSYS`, but does not need tokens unknown to C64 BASIC V2. Intended for usage in 'fat binaries' only. diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 53b9eba9..92f77164 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -6,7 +6,6 @@ cmd_go: jsr fetch_character_skip_spaces - cmp #$A4 // 'TO' keyword beq cmd_goto @@ -35,7 +34,7 @@ cmd_go_syntax_error: bcs cmd_go_rts jsr helper_ask_if_sure - bcs cmd_go_rts + bcs_16 cmd_end sec jsr M65_MODESET // Carry set = switch to C64 mode jmp_8 cmd_go_switchmode_clr_banner @@ -46,12 +45,17 @@ cmd_go_syntax_error: // If in C64 compatibility mode - switch to native mode jsr M65_MODEGET - bcc cmd_go_rts + bcs !+ + jsr cmd_go_sys_check + rts +!: jsr helper_ask_if_sure - bcs cmd_go_rts + bcs_16 cmd_end jsr M65_MODESET // Carry clear = switch to M65 mode + jsr cmd_go_sys_check + // FALLTROUGH cmd_go_switchmode_clr_banner: @@ -60,16 +64,32 @@ cmd_go_switchmode_clr_banner: ldx CURLIN+1 inx - bne !+ - jmp INITMSG -!: - rts + beq_16 INITMSG + lda #147 + jmp JCHROUT + +cmd_go_sys_check: + + // Check for 'GO 65 SYS' construction + + jsr fetch_character_skip_spaces + cmp #$9E // 'SYS' keyword + bne !+ + + pla + pla + jmp cmd_nsys +!: + dew TXTPTR // unconsume character + + // FALLTROUGH cmd_go_rts: rts + #endif cmd_run: From a92e0006b3e4019225566f6da80f1e8c92f5b85a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 18:18:08 +0200 Subject: [PATCH 89/96] extended BASIC simplification --- doc/Extended-BASIC.md | 4 ++-- src/basic/basic_commands/cmd_go_goto_run.s | 26 ++++------------------ 2 files changed, 6 insertions(+), 24 deletions(-) diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 9f930095..b6b6f297 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -104,6 +104,6 @@ A 'native' `SYS` - same as `SYS`, but does not switch to C64 compatibility mode. Switches machine to C64 compatibility mode or to MEGA65 native mode. Performs `CLR` -### `GO 65 SYS` (MEGA65) +### `GO SYS` (MEGA65) -The same as `GO 65: NSYS`, but does not need tokens unknown to C64 BASIC V2. Intended for usage in 'fat binaries' only. +The same as `NSYS`, but does not need tokens unknown to C64 BASIC V2. Intended for usage in 'fat binaries' only. diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index 92f77164..ce3c6d65 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -19,6 +19,9 @@ cmd_go_syntax_error: #else + cmp #$9E // 'SYS' keyword, for 'GO SYS' + beq_16 cmd_nsys + dew TXTPTR // unconsume character // Fetch desired mode @@ -45,17 +48,12 @@ cmd_go_syntax_error: // If in C64 compatibility mode - switch to native mode jsr M65_MODEGET - bcs !+ - jsr cmd_go_sys_check - rts + bcc cmd_go_rts -!: jsr helper_ask_if_sure bcs_16 cmd_end jsr M65_MODESET // Carry clear = switch to M65 mode - jsr cmd_go_sys_check - // FALLTROUGH cmd_go_switchmode_clr_banner: @@ -69,22 +67,6 @@ cmd_go_switchmode_clr_banner: lda #147 jmp JCHROUT -cmd_go_sys_check: - - // Check for 'GO 65 SYS' construction - - jsr fetch_character_skip_spaces - cmp #$9E // 'SYS' keyword - bne !+ - - pla - pla - jmp cmd_nsys -!: - dew TXTPTR // unconsume character - - // FALLTROUGH - cmd_go_rts: rts From 039b863a18ff1f10a29d6623ba994f6377b8407f Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 18:24:00 +0200 Subject: [PATCH 90/96] another BASIC simplification --- doc/Extended-BASIC.md | 8 ++------ src/basic/basic_commands/cmd_go_goto_run.s | 2 +- src/basic/basic_commands/cmd_sys.s | 2 +- src/basic/basic_commands_03_m65/cmd__jumptable_03.s | 2 +- src/basic/basic_commands_03_m65/cmd_nsys.s | 7 ------- tools/generate_strings.cc | 2 +- 6 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 src/basic/basic_commands_03_m65/cmd_nsys.s diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index b6b6f297..44c31c97 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -96,14 +96,10 @@ Clears the screen content. Runs the garbage collector - disposes outdated strings. -### `NSYS` (MEGA65) +### `GO SYS` (MEGA65) -A 'native' `SYS` - same as `SYS`, but does not switch to C64 compatibility mode. +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` - -### `GO SYS` (MEGA65) - -The same as `NSYS`, but does not need tokens unknown to C64 BASIC V2. Intended for usage in 'fat binaries' only. diff --git a/src/basic/basic_commands/cmd_go_goto_run.s b/src/basic/basic_commands/cmd_go_goto_run.s index ce3c6d65..5bfb7281 100644 --- a/src/basic/basic_commands/cmd_go_goto_run.s +++ b/src/basic/basic_commands/cmd_go_goto_run.s @@ -20,7 +20,7 @@ cmd_go_syntax_error: #else cmp #$9E // 'SYS' keyword, for 'GO SYS' - beq_16 cmd_nsys + beq_16 cmd_gosys dew TXTPTR // unconsume character diff --git a/src/basic/basic_commands/cmd_sys.s b/src/basic/basic_commands/cmd_sys.s index f7aba769..f3e63e2c 100644 --- a/src/basic/basic_commands/cmd_sys.s +++ b/src/basic/basic_commands/cmd_sys.s @@ -5,7 +5,7 @@ #if ROM_LAYOUT_M65 -cmd_nsys: +cmd_gosys: // NSYS requires an argument diff --git a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s index c982c4a5..4af16cb7 100644 --- a/src/basic/basic_commands_03_m65/cmd__jumptable_03.s +++ b/src/basic/basic_commands_03_m65/cmd__jumptable_03.s @@ -7,7 +7,7 @@ .const command_03_list = List().add( - cmd_nsys + cmd_rem // XXX just for testing ) diff --git a/src/basic/basic_commands_03_m65/cmd_nsys.s b/src/basic/basic_commands_03_m65/cmd_nsys.s deleted file mode 100644 index 2e8a7c4d..00000000 --- a/src/basic/basic_commands_03_m65/cmd_nsys.s +++ /dev/null @@ -1,7 +0,0 @@ -// #LAYOUT# M65 BASIC_0 #TAKE -// #LAYOUT# * * #IGNORE - - -// PLACEHOLDER for completeness - jumptable contains direct address - -// NSYS command is implemented together with SYS diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 73d605fd..4a021996 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -213,7 +213,7 @@ const StringEntryList GLOBAL_Keywords_03_M65 = { ListType::KEYWORDS, "keywords_ { // STD M65 U64 X16 - { false, true, false, false, "K03_01", "NSYS", }, // Not present in CBM BASIC dialects, Open ROMs specific + { false, true, false, false, "K03_01", "TEST", }, // Not present in CBM BASIC dialects, Open ROMs specific } }; From 4dcda281470633ed7aa95d88703f2211d5340ed5 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 19:08:04 +0200 Subject: [PATCH 91/96] fixed soft reset in MEGA65 native mode --- src/kernal/init/e518.cint_legacy.s | 15 +++++++++++++++ src/kernal/screen/e544.clear_screen.s | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/src/kernal/init/e518.cint_legacy.s b/src/kernal/init/e518.cint_legacy.s index 04815503..23ef60ec 100644 --- a/src/kernal/init/e518.cint_legacy.s +++ b/src/kernal/init/e518.cint_legacy.s @@ -14,10 +14,25 @@ cint_legacy: // $E518 +#if ROM_LAYOUT_M65 + + jsr M65_MODEGET + bcs !+ + + jsr M65_MODESET + bra cint_legacy_end +!: +#endif + // Setup video and I/O // See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 + jsr vicii_init + // FALLTROUGH + +cint_legacy_end: + // Code below must be placed under $E51B, or some code will break - see here: // - https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=2 // Game 'Operacja Proboszcz' is one example. diff --git a/src/kernal/screen/e544.clear_screen.s b/src/kernal/screen/e544.clear_screen.s index 8c3abe1d..a153885e 100644 --- a/src/kernal/screen/e544.clear_screen.s +++ b/src/kernal/screen/e544.clear_screen.s @@ -12,6 +12,14 @@ clear_screen: + +#if ROM_LAYOUT_M65 + + jsr M65_MODEGET + bcc_16 M65_CLRSCR + +#endif + // Clear the line link table - cheecked on original ROMs, // the highest bit set means that the line is NOT a logical // continuation of the previous one From cdb5c1eef67830220285fd5893293c54c19224de Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 19:42:10 +0200 Subject: [PATCH 92/96] autoswitch to legacy mode if loading file below $0800 --- src/kernal/board_m65/mega65_imports.s | 1 + src/kernal/board_m65/mega65_load_autoswitch.s | 44 +++++++++++++++++++ src/kernal/board_m65/mega65_proxies.s | 6 +++ src/kernal/iec/load_iec.s | 9 ++++ src/kernal/tape/tape_common.s | 8 ++++ 5 files changed, 68 insertions(+) create mode 100644 src/kernal/board_m65/mega65_load_autoswitch.s diff --git a/src/kernal/board_m65/mega65_imports.s b/src/kernal/board_m65/mega65_imports.s index 68b57db9..b1d5f35b 100644 --- a/src/kernal/board_m65/mega65_imports.s +++ b/src/kernal/board_m65/mega65_imports.s @@ -69,6 +69,7 @@ .label lvs_return_last_address = KERNAL_0.proxy_K1_lvs_return_last_address .label lvs_device_not_found_error = KERNAL_0.proxy_K1_lvs_device_not_found_error .label lvs_load_verify_error = KERNAL_0.proxy_K1_lvs_load_verify_error +.label m65_load_autoswitch_tape = KERNAL_0.proxy_K1_m65_load_autoswitch_tape .label lvs_check_EAL = KERNAL_0.lvs_check_EAL .label lvs_STAL_to_MEMUSS = KERNAL_0.lvs_STAL_to_MEMUSS diff --git a/src/kernal/board_m65/mega65_load_autoswitch.s b/src/kernal/board_m65/mega65_load_autoswitch.s new file mode 100644 index 00000000..650dd136 --- /dev/null +++ b/src/kernal/board_m65/mega65_load_autoswitch.s @@ -0,0 +1,44 @@ +// #LAYOUT# M65 KERNAL_0 #TAKE +// #LAYOUT# * * #IGNORE + +// +// Automatic switching to legacy C64 mode if loading anything below $0800 +// + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +m65_load_autoswitch_tape: + + lda VERCKK + bne m65_load_autoswitch_done // no autoswitch for VERIFY + + lda STAL+1 + +#endif + +m65_load_autoswitch: + + lda VERCKK + bne m65_load_autoswitch_done // no autoswitch for VERIFY + + lda EAL+1 + + // FALLTROUGH + +m65_load_autoswitch_check: + + cmp #$08 + bcs m65_load_autoswitch_done // no autoswitch if loading above $07FF + + jsr M65_MODEGET + bcs m65_load_autoswitch_done // no autoswitch if already in legacy mode + + sec + jmp M65_MODESET + + // XXX consider displaying something here + +m65_load_autoswitch_done: + + rts diff --git a/src/kernal/board_m65/mega65_proxies.s b/src/kernal/board_m65/mega65_proxies.s index 51651693..2eb02bb8 100644 --- a/src/kernal/board_m65/mega65_proxies.s +++ b/src/kernal/board_m65/mega65_proxies.s @@ -53,6 +53,12 @@ proxy_K1_lvs_load_verify_error: jsr map_NORMAL jmp lvs_load_verify_error +proxy_K1_m65_load_autoswitch_tape: + + jsr map_NORMAL + jsr m65_load_autoswitch_tape + jmp_8 !- + proxy_K1_print_kernal_message: jsr map_NORMAL diff --git a/src/kernal/iec/load_iec.s b/src/kernal/iec/load_iec.s index c9778dd0..09d02bbd 100644 --- a/src/kernal/iec/load_iec.s +++ b/src/kernal/iec/load_iec.s @@ -95,7 +95,16 @@ load_iec: lda STAL+1 sta EAL+1 !: +#if ROM_LAYOUT_M65 + + // Switch to legacy mode if needed + + jsr m65_load_autoswitch + +#endif + // Display start address + jsr lvs_display_loading_verifying #if (CONFIG_IEC_JIFFYDOS || CONFIG_IEC_DOLPHINDOS) && !CONFIG_MEMORY_MODEL_60K diff --git a/src/kernal/tape/tape_common.s b/src/kernal/tape/tape_common.s index e46ce6b1..4b896671 100644 --- a/src/kernal/tape/tape_common.s +++ b/src/kernal/tape/tape_common.s @@ -223,6 +223,14 @@ tape_handle_header: jsr lvs_STAL_to_MEMUSS +#if ROM_LAYOUT_M65 + + // Switch to legacy mode if needed + + jsr m65_load_autoswitch_tape + +#endif + // Print LOADING and start address jsr lvs_display_loading_verifying From 2338bd8a98d87b5f2449943b35e381499a1efb45 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 19:58:47 +0200 Subject: [PATCH 93/96] implemented 'IF' BASIC command --- src/basic/basic_commands/cmd__unimplemented.s | 2 -- src/basic/basic_commands/cmd_if.s | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 src/basic/basic_commands/cmd_if.s diff --git a/src/basic/basic_commands/cmd__unimplemented.s b/src/basic/basic_commands/cmd__unimplemented.s index dc96a1c2..9b76d5f6 100644 --- a/src/basic/basic_commands/cmd__unimplemented.s +++ b/src/basic/basic_commands/cmd__unimplemented.s @@ -21,8 +21,6 @@ cmd_input: nop cmd_read: nop -cmd_if: - nop cmd_gosub: nop cmd_return: diff --git a/src/basic/basic_commands/cmd_if.s b/src/basic/basic_commands/cmd_if.s new file mode 100644 index 00000000..1c52ad63 --- /dev/null +++ b/src/basic/basic_commands/cmd_if.s @@ -0,0 +1,29 @@ +// #LAYOUT# STD * #TAKE +// #LAYOUT# * BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + + +cmd_if: + + // Calculate expression + + jsr FRMEVL + + // Check the result - either string size or floating point 0 vs non-0 + + lda FAC1_exponent + beq_16 cmd_rem + + // Condition fulfilled - look for GOTO or THEN + + jsr fetch_character_skip_spaces + cmp #$89 // 'GOTO' + beq_16 cmd_goto + + cmp #$A7 // 'THEN' + bne_16 do_SYNTAX_error + + pla + pla + + jmp execute_statements From a974b4a763bb5805946a62fe7bbb321b7c98e01a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 20:28:38 +0200 Subject: [PATCH 94/96] added way to detect MEGA65 from the BASIC --- doc/Extended-BASIC.md | 4 ++ src/basic/basic_commands/cmd_if.s | 11 ++++ .../basic_commands/helper_if_mega65_38K.s | 52 ++++++++++++++++++ .../basic_commands/helper_if_mega65_46K_50K.s | 54 +++++++++++++++++++ 4 files changed, 121 insertions(+) create mode 100644 src/basic/basic_commands/helper_if_mega65_38K.s create mode 100644 src/basic/basic_commands/helper_if_mega65_46K_50K.s diff --git a/doc/Extended-BASIC.md b/doc/Extended-BASIC.md index 44c31c97..3de5a66d 100644 --- a/doc/Extended-BASIC.md +++ b/doc/Extended-BASIC.md @@ -103,3 +103,7 @@ 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` + +### `IF MEGA65 THEN`, `IF MEGA65 GOTO` (MEGA65) + +Special check for running under MEGA65. The `MEGA65` string is not tokenized, therefore it will be listed properly even under original BASIC V2. `MEGA65` is not a variable here - it is still possible to normally use the `ME` variable. diff --git a/src/basic/basic_commands/cmd_if.s b/src/basic/basic_commands/cmd_if.s index 1c52ad63..7e3a4488 100644 --- a/src/basic/basic_commands/cmd_if.s +++ b/src/basic/basic_commands/cmd_if.s @@ -5,6 +5,13 @@ cmd_if: +#if ROM_LAYOUT_M65 + + jsr helper_if_mega65 + bcc cmd_if_true + +#endif + // Calculate expression jsr FRMEVL @@ -14,6 +21,10 @@ cmd_if: lda FAC1_exponent beq_16 cmd_rem + // FALLTROUGH + +cmd_if_true: + // Condition fulfilled - look for GOTO or THEN jsr fetch_character_skip_spaces diff --git a/src/basic/basic_commands/helper_if_mega65_38K.s b/src/basic/basic_commands/helper_if_mega65_38K.s new file mode 100644 index 00000000..fd93f63e --- /dev/null +++ b/src/basic/basic_commands/helper_if_mega65_38K.s @@ -0,0 +1,52 @@ +// #LAYOUT# M65 BASIC_0 #TAKE +// #LAYOUT# * * #IGNORE + +#if CONFIG_MEMORY_MODEL_38K + +helper_if_mega65: + + // Injest all spaces + + ldy #$00 +!: + lda (TXTPTR), Y + cmp #$20 + bne !+ + inw TXTPTR + bra !- +!: + + // Check for MEGA65 untokenized keyword + + ldy #$05 +!: + lda (TXTPTR), Y + cmp str_mega65, Y + bne_16 helper_if_mega65_fail + dey + bpl !- + + // Increment TXTPTR by 6 + + clc + lda TXTPTR+0 + adc #$06 + sta TXTPTR+0 + bcc !+ + inc TXTPTR+1 +!: + // Report successful check + + clc + rts + +helper_if_mega65_fail: + + sec + rts + +str_mega65: + + .byte $4D, $45, $47, $41, $36, $35 + +#endif diff --git a/src/basic/basic_commands/helper_if_mega65_46K_50K.s b/src/basic/basic_commands/helper_if_mega65_46K_50K.s new file mode 100644 index 00000000..24b76024 --- /dev/null +++ b/src/basic/basic_commands/helper_if_mega65_46K_50K.s @@ -0,0 +1,54 @@ +// #LAYOUT# M65 BASIC_0 #TAKE-HIGH +// #LAYOUT# * * #IGNORE + +// This has to go $E000 or above - routine below banks out the main BASIC ROM! + +#if CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K + +helper_if_mega65: + + // Unmap BASIC lower ROM + + lda #$26 + sta CPU_R6510 + + // Injest all spaces + + ldy #$00 +!: + lda (TXTPTR), Y + cmp #$20 + bne !+ + inw TXTPTR + bra !- +!: + + // Check for MEGA65 untokenized keyword + + ldy #$05 +!: + lda (TXTPTR), Y + cmp str_mega65, Y + bne_16 remap_BASIC_sec_rts + dey + bpl !- + + // Increment TXTPTR by 6 + + clc + lda TXTPTR+0 + adc #$06 + sta TXTPTR+0 + bcc !+ + inc TXTPTR+1 +!: + // Report successful check + + jmp remap_BASIC_clc_rts + +str_mega65: + + .byte $4D, $45, $47, $41, $36, $35 + + +#endif From c5d3951e4cd034ecace5eec1bb603ba9d3473df0 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 20:33:25 +0200 Subject: [PATCH 95/96] updated binaries --- bin/basic_generic.rom | Bin 8192 -> 8192 bytes bin/basic_ultimate64.rom | Bin 8192 -> 8192 bytes bin/kernal_generic.rom | Bin 8192 -> 8192 bytes bin/kernal_ultimate64.rom | Bin 8192 -> 8192 bytes bin/mega65.rom | Bin 131072 -> 131072 bytes bin/mega65_pxlfont.rom | Bin 131072 -> 131072 bytes tools/release.cc | 10 +++++----- 7 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bin/basic_generic.rom b/bin/basic_generic.rom index ac383f5c74a5e88f7541fd44adbdf6b40750725a..fbaa3d1db264cd5b4558fb963ed90639e8f2a44d 100644 GIT binary patch delta 2105 zcmZuyZBSI#8NT-}EU+vBF317`2avC*lrPPSqM{;KIh{~xZIjHz3yN7ZWb8~k(`XWC z>us&EGrKuv#zd#R_rh7Y%OV#LVRzXeX@jhdk)-X^eq|tlh=z1a`XlB?w(nj0!*+US z?s?zyG3PwzeV_L^ox3}Cn=j6f&OdXgeot-FfxXV;ksNe+AUG5<;5#nCN-J9%#YzWv zuS&3~%wlmbnsbH=_+$^-t2h#vJ%N(X)wGgaz7=mX6oABWO ze0a!(jI(eK`3~#mz_46H$D~(FLsK4_P^KSEo5fMuBKql3aoj4P{s&4HYVy+RU^rw} zqR_M8y0)Q}VGK|{2}mq@Yc9yl7@$j?uz{eUV|{3`2X`vyt5F@S4inuN)C}m+xVq7` zxw{nI4a2D0C8+EsmB~h5j-nVDy&%Kj9hc}sKa{Bn{qa9*h{k=t8cL$`dhjPb#BV9xayI{Gc@jgLoq3_WY1;10qsM2Aw7sOm3Eh|U z=A_=7aKfsyr)aYvK!gZqttU-U9f=RU4vShKZc!J+t>~eb%tcLbaot3TURu}c$D{Lf zqivZLPt#4yjCe-Sqxx&(p>pG_!a$hpZU~!Vhy?6^W2b!m4z_p%iBZ0b|KKMVxV#N_ zB}nCd*aMR3h(@auHbJaIO97N2YbKb`Jz|fk$_0)Thm5d5Wj3i{(QFkk_0d?{VvMyd z+Kt}$lmuc5xXoQ;A?7xV$WUxi`cawJsl|l!_}YW9ngM?VamE(18aohwtdBZEH_%cT z`kuJ*_zN;^MsLfs4ZTh7$7OB5AY17v^r9O*Hw$zuq^(c*$DZ(yKH;}K_Q`IO#$DK{F8pD7)VO6BvcJSRePnY=*l=Q?#INERFP`#)@;3Y{?BXY z9f@Z#q^SX4=_k)66(j~dkmm;4F!PaJz*8O~Cwz~MBVQ%l+}Y#T4EUyt?&oP8Pn-A+ z<}#CN;sLM1&SWagee}6}FJ*?imkQu+xo8ScQ~4WAXz4tUx&}yi%};aZ6s*k&^AEl_ ze4{DgS0qVVP`Z?{0YOKKLXQM;-Q2*P(ug79^{l{v$|6U%#GrF?ZqB>VzId|5%|KG{9ooIKv9)Y&R&-j0t@pshrq| zKOmnO){|w+c9Imew*YRONGruWS|#SI9P-IpE)-?GvvQj9&Po9At2yK&j+9&u?lGJq zb5ow-!>O0p91s)WZFT4oaCe_um3ehPKg)))XMYDFxa=bdX|^mtuua@ftHm9lI2P4-|ZLRjrf8+p-3^92lk=D!_6YPm^ zse0j)ij1}d{p#Hz3vd+xlJbHC3&m#i-Wa+dqvC6{U2LT%HX??51bk&& zAQ#heEjY6W*Np3Rb5J>ej9vIoUF0vB`MHJ4dEPfGXa+p#vbzO+=I2*cR;iW#i34G5 z>>}Cg+qtP>^2_z@X%QZJ1=QmQs6#F&jz~F>E5|(_w%(Mez-@G_3x@2@cBmlvOEs`F=Y&fCS=7gkAO2KyIe9} zA$PKBte?wJTTo$8UaL@Elad<7yWT~UWJ7j-`jp2m?zf9|cF~-auSAVBztwgt=@Eb< zLUtqPA0|WD-?I3JX|u#Q>(R+;IBKC&&klLdx+CG4L+rk~!=)8vW!uUs$&sA0Xn2o7 l2QKFD8#2aF!W=wAUfi+}$)~V(*P9GI{rHtRv#h@|{|1X-u37*9 delta 2055 zcmY+Fe^6A{702HXmLJQm{FX%&uE5n5Ow74-ICCHL)}8Oec=f zj=nb4c4p~?nT$=_eGl%!+g;(oLzZ127~53Wj&aS@Oq-_8A_5|l=_{GBlF4LycGDmB z{qfFu@7_80-g7?Zd(ZATyTj5w>!01UqriQjTJ*RPIIV13^hCX&?(U_ zqKo$-Alc7)I4~=0>yCR}QXttzH>R_8S|M$ub!N_Q46mB62%G22 z!-?}{VQ#*(T%>JbRz&Cf;GkhMT5_qJ)P|SHovgLVqKi>p#DAI~<=NjN2NTYubxb(3 z)Dr0#^?|e%bxe?%glTSaoG7M+)k^{FpQV-dMOJ!?RxL8pDKVC$-zL6r=Hh*YK`#Xy z9&|9E@ZiygP}Hy}331n5k6`OxU&6dkM8{-}lY*kkR;dhn;zy-2{EBBl3c}&38QuMN z%HTk|VF9R+(}b3%?V{9z7N$_WteIgT?m3@?ij9I0Ihj@Y(XG_q{o7&8T_c|_!Fs~2@(3tfKX;sG_`9e8;hXp#IdwUE_GPwKwScfAhuar6f4 z_f43OEG59>ojwtk1rAYWRqKiA`j z1YLL2-2!b9=s}^_Qe#%lg31UA8_rjlhv>09pAF3Agn4|^O|u1>BV1*Sg$n{2^O5MP zb7wRKYcnF3l4&X_DtiBlEX$Gp-u`i)NHx>2k)|ZZfEh-A|D0;@0$?CG`XJzpcgVt2 zsK_`BRjv(rVTH#-p#d;o427a#lC{uTZ55Osou*nj+CPh%G(6&VS*u*D@S7UahX9$3 zP=(O|wN?jQgXq0UoTHHvYh4aEuGt41!e26HooVMWz|)F9>FR^<*Ui(S=+2JocfHcSU)pCGO(t!zI_xpcSa%S zaEOpw5b(=>h?z#~q$0XS+MsginyjsNF?3H?-3=;q)wvk-n;CSCIJ4JtkTyMA=JX-` zaL&7IAxI7^&|s_pv%5U1ET{*B2x}BX{s!oe9LD~-5L>o=d!4U65 zO|vmej^x&n{(NK;RRScbpSs3TfmdN%W@MRDuerv_t=xj#AN4AUunWr^K2Al+jJ7Pf z7#xfeOTwN?*R+~}UmHjAWqNFHR62%VA4i}JtPkTchKc>|G@5BUELKf^VB2dNapPTc zWOdqBHd!C}+nPgLps`EsbL~>8#{Hp;mZkIfLltDT9j%^5-7-q=qbH;e`aS7Y zdR#h6Uzd*Hu~D*=*J#J@O^PBg0GMjIfEl&c#Av1MlAj)tCg@RV5~L`l4>wN6c-*J# zMRyha-3a+Kf5ZA}<$@55h#HSSa63F=Y~-hdDyuZR{(+~W_^v_<)}G*IddV-=p2&?$ zXFx5vE(blH)_EERLf4OnfK%VOPVyoBp>&{D;2Z!F)_C<&LM)c8_ zuYB~;m{*TIgZk9ys2F!n=7?C(#(mODMhd>2^+_*ncQIXi z(D6~6@Zc;|mLb<{+pW*P!0u`}TwPmJW3R0zuN2mp;Kl{9=`IwC^&qm&xR~<+oDqq` TAZ9lGlA&*XbMc&tUp)T;HF1^L diff --git a/bin/basic_ultimate64.rom b/bin/basic_ultimate64.rom index 8c71b1f147f124856e09df85c3e7d032673bed6b..ab9365d22c3d7dde45b2820b720b4e3955479b75 100644 GIT binary patch delta 2566 zcmY*b4Nz3q6@G6Y?Bc@8zbvA7MOZ+70)lbHA2bA9Oc^Y*fy`&vC>YvJ#TGVyEE^d zbKgCC?z!iF=R5bvrX!o8PE8F>y}Dz|OPhCYEo+M%L8z(2-!F6cD?6{JMYUBzQLE}f zF>e%^>8wuVwh@j^U&%VrDqE|Ldb6K`>215n2tz!|vq~)QFKE^JOL+h0R?gqR8_7jh zzX+xcLZ*-dAk%V>QKH{($Yk5_Jy4$=y{}`Py#6laCmmm z&wwZ$f{=tNBQ2VSm?YJ;V!G;TvCQ(c@M;lX8FokbsHHM4ARIee8Gc7NL2Z>OzY&h( zOA{zKqIi!~{N>6Tf3~a!PZox^1o@35N40kM6_1pJT)k9Rplq8~3q!O<7@>Ow9|Ur5 z)WV|Elc5+`Cv5|pHQi`eH#+IUJ8Xz}l}so(Kq(H1L-Rf{$DY@bkA6q)s?RWrere@I41v6PZUkxqM^Oism#6L#x}; z3)C3-h z+Q5u5u|CWc3(}9|dEPi%00*UogW9&}0x1fAJ+5RBnLGgwKk=fAJs_VB5nFg8`;?@q z*Xh2qoMX77F@Lj!d7fCvLG`jlk34v2isl$+S)rch&N4y+51A&vR_{=$C&*)UMiuAe zQG-=d30_`gb43QVd6CWvpF(L6ypRE^MPCPD*k$JdD;3}Xz|w`5e4p<>#}iLkPy+L6|HF+*4_ z-WOg(Fj$K!25@pGnGGu}`=>)>oeX=9Q9W!KKNeEZQOOEJI2T?8}1L=>*Og>^YDF|a^-fYI7 zcB8rOi3QRh0FG~X%$>NWdpv~sE?IShKZ@^=n5Zl^o~(^pr+Vxl??e?YW7<)|w~`vY zsz|E28XvmdUqU9#K)07@npcSXL?UTTSYABn#LTc|OpL{E4kPPDx_@g> z*pCkmBOpN5iO+N}jPm(_yg3wLq79wtAV1eDrFlVL&CZ`p-ou@+43gKA*XKO7D&-fr z*|$1d_L{~)MC;#W*pItLLo>M1!~cqbAMBBQmYhjyQ}S{Q6GoZ?B)d68vM=$l7``DY zoCArMDxiNbLZZTta13ROw_`yI#ARWyH~3%Djq^dTk|KU+R2{kYoc|GTb6!(E)j}pu zS^)~Eh(hPHmpp_F19jY8ysH@4%3z$X77WmPGihcFhp&p%AXKA8W2n-K4!dccP)pwu z_R&MaUV2cd!SinND0xE|KJVknsifuc*f)$f_>>ZP#kLiFW5d5~C%;cwu{_b%V)9P# z5{IwY&0V}Q^L~%W+BRGMf=7e+8yiVoQm4A*BFC51=|i2w!z0H?E5OGNr0|ReNZiu8 z?NvR!QeXd&Ywq)rQ_1du$1e^JeNy-Fu*dt$k?ld>%;=@D*Ding<&|!i^6PPpy4^!w zm&*rZuMHH}n9JsI4S+K2vfEwc=F-LGbjPz>#*g5ZfhruZC|nVuVpfQkOyVJhlb$UP zyaVh5)H4UvbKN2aap@(HX#ZG%!)HitYD%)J*DO?+g>th1f47AVRG&U@BW4~pLip4w z)ioFCPc2KH8EuWCRaX^^huuflT(sK4v~5BE8X^mqZRge&6p=TU8KQxg*2!54^}sy| yDD%{^Vj~xNmSTmKtH`EBz6 delta 2467 zcmY*beN+_J6`v2-T^E+GU1R~lhw_aW5N+3Q(SU1wTB4qQnC4^vF{{=#?H@fYB*iw4 zwHlkn7ppeL?hN}D1{PUBSXe-`3C6WGUDMN?oHnr_-;$V#IjJ%IV|!;k?Xh#t?0xgz zn>+XZ-u?aV9@%tcQ|ucP{)rtGTgx|>?_SZA*w=)z^{47X!l{N((`^f9Xl|OxZcOx| zwn3+f1`57XdHlXdVMM=xwn;u#2$ndF!8Jm#+{p(U1e<_P-bHVA2G@jmJl7Xwz-;v6 zzj)9Ek1tU%q2&RektTzaKYOUfD!{aphh@bGE0K}M;!YO8f3BD(=8FYlpE~fv$G>c=TvUDe@G%m!l8EFx%!46n2@yps)O>Ktczk zNMd3D9g(OJ{f+#FD`3ASJ={;Y`a$w7K0kU=#&=qX!Y^M)t3s@Rj=BNZkP+Q?DV$h^ z?~{+ri}V71dJ4@9llZ7q%gk`FTh*fnBZ@vWuNXr!+QPahdko$6IK^j2%gCgDOUnF! z)2!r(tCUIc8weg&Bfb~E<0cynrCh6<{MeAJnX>5TlOFaW`#^}t{|cavOJLJmh#cL> zenyt))|zzEd4@lp@X!@CkR*|Vy2T6Y2C;vF7TM-lv7RoQW5fnQgYpl$UEImLlSyb>HhO*x|>FPk7%Ku&0#JKHm=7ouPaRd!M9^dwe z0c<7@44pCi+No2$3f|z^yP!1YtVFAkTcQV$o6IiASbJ8o(wESSZRkpmlbg<^bx(}< zJu$9*VqEihOg0&F*gmq~c!E3EK^_P2o8HHn# zNAQR*4o(HVLVfvY#{}Nh0cY4U;IwW{NK9(B z96n~6Jyz|hKUU*uI93arNpV6EccFvqO~{E4dSTagx;=E;A>iv?BALF+70Be@rt2Hd z_qd;f?&GX5NxTXN{CvV_B?mcmdDSU_uBJ_iK7lQ-g|0!wG5NNK?0D?;{ zr7haJOG5R7sEmSCd)CatXA-@3JATgZ8c`DQi~UIIp!>Il#r^nTKLW8z^kUq{FxvD1 zwVYPN3zag$edK3WjcXUJ)okDC)V=(2S1WlwbzM<`tZ^%Jt7}z(8nE906K{QmVSnE? z99hAQ1HvyExHQpwCpC}MrLRv1=lG_gi3Vy4_$oo!7%>^j2%gB6w4Euoxe{oSMy*K# zu5Q(=5er(th$T1v!vORPXBc?s0z;s{y^ME4~ez(pjd$E^a27iw<++&E(Xg!`4W(4+!XtAJXXd03{!jkR)Xs-ud!JAK&@sn1B4i zW%pe&G5JN!)O6HEc4l_&7xx-}KJWhI)BDeT_TGD{ENRyzX*dv&1|?|-p8Mr~m>QAf zL8%u8{gTHcky{yQ6;Lq8$EWLo9ngO&Ti~ORR&2sj<%(T7q$$GV&jag$`#}5$K>Vo| zC5$&-0gLvJgm}E0EXzz!z3z30l@77OA;Rl&RB!c}12+>MK_W!Rtl~asCf%7^QjfZw zv9xMbtDdMy^g%PNb}>y`(V@#EZt+guwqiATVR3Fe2*+AAUz0=lF9Z~OWAREGQ~^w5 pRUh1;F3`^1G>+5y;n&3+9l(iWkzx{(HlAi^{o|(EFsC)u{{XqnL7D&n diff --git a/bin/kernal_generic.rom b/bin/kernal_generic.rom index d7a3ffaa5fb7bf383a7b769a2358fe08383eb252..990b2455cb631754ccfd3ace0e12b4799edf1875 100644 GIT binary patch delta 234 zcmV^<|@z*<|)t$<|xnx z<|ohs<|Zg$sV0R1pahE1M@&ZJAS=Ad0MG+W)1k?LumeoK;7p^Ds$>G2uagh~PXe#I zvta=$0h3n*DU-AUZXF5#0(;C3bTzHds#6BOs^Q<@zq{kVys^EpI`pa7*|ks|OS z$fa$OBBf@~2BmE&e~}`{rEHNR$fawMBFLp`ks_b~gm9%{V5ugB0iXnm(ML>1;~*=% z$pFv;OxvN!fUpBhzTix&k*Z_@z_F7M0Z#&*x3ggZDgh~?8RQo58npoM5rt5-0fkYu z0)(XsYPw=+NS+8HE<97KImJle7YE9eV;(4$S{_HLcI8rU?eBzu@HKyWhXO lvAwao;o*}%19<|Quamk1os)|KDU*N%LjyQ6IkUzDIvbh&X;T0I diff --git a/bin/kernal_ultimate64.rom b/bin/kernal_ultimate64.rom index c67a3b2e1cb62de5532b0aab8c01f6475d34ef8c..67f8e1acb27d1a88739356ac41b2f1a8ecfdbd58 100644 GIT binary patch delta 277 zcmV+w0qXvMK!89mOtPj-vZkUL^<|@z*<|)t$<|xnx z<|ohs<|Zg$sV0R1pahE1M@&ZJAS=Ad0MG+W!lB84umeoK;7m4=s#^>Bv`n(5OtPjR zgrt)Y0Tu$Ivy&(RHv+G_vta=$0h3n*DH~v_r54E|uoI|-7Z_;+g%*|ogh#0Wg-A^P zx0BBTQymHa0(;C3bTzHds#69Cs^Q<@zq{kVys^Epb)ukrN}6hXgzWIWRM`#soSWhV^qb delta 277 zcmZp0XmAkr*|ZFZRx&93*sh?tP~pHvg^lP^T^HSb+#V}v?>WhEf!SyA=93K@ zn0@v=@L4x;RW$duEf5P8X0M+tz$nJ_eD7opMsudQ+czgNYB9Pjl6)feL24_*2f@~W zt&FXKTbWvex;zvfF3wo>;>C*#k5)>yimeoD6;DW5wN&h+(gxubt>O}y%&lV67+Ty{ zGPHX5WN(>#o+((inkks?%>NS8wdYqY<78X4|G|^TyYKJcvvKdn-47p5wr8$nI=XQ3 ZF6OzDyO}g6H?TM}TNqhxKE`4t4FGeodGP=M diff --git a/bin/mega65.rom b/bin/mega65.rom index 2ef6602a60b21edc06799335ac54efa7ab0e4ba9..a80de589f83b66351a75d7d17bda5816e74856ed 100644 GIT binary patch delta 11666 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 Nw?w`C|Nc|y{{t ROM_DEFINITIONS = 8192, // file size 0x1F52, // signature offset 1 0, // signature offset 2 - 0x0004, // BASIC ID offset + 0x0007, // BASIC ID offset 0 // KERNAL ID offset }, @@ -52,14 +52,14 @@ const std::vector ROM_DEFINITIONS = 128 * 1024, // file size 0xBF52, // signature offset 1 0xE4B9, // signature offset 2 - 0xA004, // BASIC ID offset + 0xA007, // BASIC ID offset 0xFF80 // KERNAL ID offset }, }; const uint32_t MAX_FILE_SIZE = 128 * 1024; -const std::vector STR_MEGABAS = { 0x4D, 0x45, 0x47, 0x41, 0x42, 0x41, 0x53, 0x32 }; +const std::vector STR_BASIC = { 0x42, 0x41, 0x53, 0x49, 0x43 }; const std::vector STR_OR = { 0x4F, 0x52 }; const std::vector STR_SNAPSHOT = { 0x28, 0x44, 0x45, 0x56, 0x45, 0x4C, 0x20, 0x53, 0x4E, 0x41, 0x50, 0x53, 0x48, 0x4F, 0x54, 0x29, @@ -409,7 +409,7 @@ void ROMFile::recognizeSrcFile() if (srcFileContent.size() != SPEC.fileSize) continue; if ((SPEC.idBasicOffset != 0) && - memcmp(&srcFileContent[SPEC.idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + memcmp(&srcFileContent[SPEC.idBasicOffset], STR_BASIC.data(), STR_BASIC.size()) != 0) { continue; } @@ -440,7 +440,7 @@ void ROMFile::dropUnmatchingDst() // Drop unmatching destination file data if (!dstFileContent.empty() && (descPtr->idBasicOffset != 0) && - memcmp(&dstFileContent[descPtr->idBasicOffset], STR_MEGABAS.data(), STR_MEGABAS.size()) != 0) + memcmp(&dstFileContent[descPtr->idBasicOffset], STR_BASIC.data(), STR_BASIC.size()) != 0) { dstFileContent.clear(); } From bfc8291e41cda6423ff44afedc4dceb79f5203cd Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 3 Sep 2020 21:14:14 +0200 Subject: [PATCH 96/96] explained all similarities >3 --- strings/00A54591 | 3 +++ strings/4241534943 | 3 +++ strings/48A94648 | 4 ++++ strings/490FDAA2A5 | 4 ++++ strings/60A9802CA9 | 3 +++ 5 files changed, 17 insertions(+) create mode 100644 strings/00A54591 create mode 100644 strings/4241534943 create mode 100644 strings/48A94648 create mode 100644 strings/490FDAA2A5 create mode 100644 strings/60A9802CA9 diff --git a/strings/00A54591 b/strings/00A54591 new file mode 100644 index 00000000..ceb2ae9a --- /dev/null +++ b/strings/00A54591 @@ -0,0 +1,3 @@ +$00 + LDA $45 + STA (zeropage addres does not match), Y + +Instruction + some parts. Trivial - not copyrightable. diff --git a/strings/4241534943 b/strings/4241534943 new file mode 100644 index 00000000..7fa01f86 --- /dev/null +++ b/strings/4241534943 @@ -0,0 +1,3 @@ +'BASIC' in PETSCII + +Programming language name. Not copyrightable. diff --git a/strings/48A94648 b/strings/48A94648 new file mode 100644 index 00000000..c31ba8e6 --- /dev/null +++ b/strings/48A94648 @@ -0,0 +1,4 @@ +PHA + LDA #$46 + PHA + +Pushing return address to stack (one byte matched by accident). Not creative - not copyrightable. + diff --git a/strings/490FDAA2A5 b/strings/490FDAA2A5 new file mode 100644 index 00000000..13c5eb0a --- /dev/null +++ b/strings/490FDAA2A5 @@ -0,0 +1,4 @@ +2*PI mantissa + LDA (zeropage address does not match) + +Part of widely used floating point constant (which is generated automatically) + a part of instruction - not creative, not copyrightable. + diff --git a/strings/60A9802CA9 b/strings/60A9802CA9 new file mode 100644 index 00000000..4cd8f179 --- /dev/null +++ b/strings/60A9802CA9 @@ -0,0 +1,3 @@ +RTS + LDA #$80 + BIT (to skip 2 bytes) + LDA (value does not match) + +Routine starting with .A loaded with one of 2 values, depending on entrance address. Common technique on 6502. Not creative - not copyrightable.