diff --git a/CONFIG.md b/CONFIG.md index 12699fbf..9b0c565f 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -247,6 +247,10 @@ If enabled, STOP key terminates insert/quote mode (like on some _Black Box_ cart Feature needs 12 bytes in KERNAL segment. If unsure - enable. +### `VIC_PALETTE` + +Selects the default system palette - MEGA65 only. + ## Software features ### `PANIC_SCREEN` diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 1c0939e2..769ac1c3 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -77,6 +77,7 @@ ; --- Screen editor ;; #CONFIG# EDIT_STOPQUOTE YES +;; #CONFIG# VIC_PALETTE 0 ; 0 = default; 1 = C65, 2 = Colodore, 3 = VICE, 4 = Frodo, 5 = Deekay ; --- Software features diff --git a/src/aliases/,aliases_config.s b/src/aliases/,aliases_config.s index d334a0d8..fdeeb70f 100644 --- a/src/aliases/,aliases_config.s +++ b/src/aliases/,aliases_config.s @@ -237,6 +237,14 @@ } +; Check that screen settings are correct + +!ifndef CONFIG_MB_M65 { + !ifdef CONFIG_VIC_PALETTE { !error "CONFIG_VIC_PALETTE is only possible for MEGA65 motherboard" } +} +!ifdef CONFIG_MB_MEGA65 { + !ifndef CONFIG_VIC_PALETTE { !error "CONFIG_VIC_PALETTE not specified" } +} ; Check that internal DOS configuration is correct diff --git a/src/aliases/,aliases_hardware_m65.s b/src/aliases/,aliases_hardware_m65.s index 9ca89e57..bfc5e178 100644 --- a/src/aliases/,aliases_hardware_m65.s +++ b/src/aliases/,aliases_hardware_m65.s @@ -27,6 +27,14 @@ !addr VIC_CHARPTR = $D068 ; 3 bytes - pointer to start of character generator + !addr VIC_PALSEL = $D070 ; - palette selection register + + ; Palette memory areas + + !addr PALETTE_R = $D100 + !addr PALETTE_G = $D200 + !addr PALETTE_B = $D300 + ; Keyboard !addr C65_EXTKEYS_PR = $D607 diff --git a/src/kernal/board_m65/mega65_modeset.s b/src/kernal/board_m65/mega65_modeset.s index c02eb04a..8495b111 100644 --- a/src/kernal/board_m65/mega65_modeset.s +++ b/src/kernal/board_m65/mega65_modeset.s @@ -67,6 +67,7 @@ m65_mode65: jsr vicii_init jsr viciv_init + jsr m65_reset_palette ; Initialize various memory structures diff --git a/src/kernal/board_m65/mega65_reset_palette.s b/src/kernal/board_m65/mega65_reset_palette.s new file mode 100644 index 00000000..4ad9f0df --- /dev/null +++ b/src/kernal/board_m65/mega65_reset_palette.s @@ -0,0 +1,244 @@ +;; #LAYOUT# M65 KERNAL_1 #TAKE +;; #LAYOUT# * * #IGNORE + + + +!if (CONFIG_VIC_PALETTE = 0) { !set CONFIG_VIC_PALETTE = 4 } ; override palette to default value + +!if (CONFIG_VIC_PALETTE = 1) { + + ; Original C65 palette, taken from C65 manual + + ; RRGGBB + !set RGB_0 = $000000 ; black + !set RGB_1 = $FFFFFF ; white + !set RGB_2 = $FF0000 ; red + !set RGB_3 = $00FFFF ; cyan + !set RGB_4 = $FF00FF ; purple / magenta + !set RGB_5 = $00FF00 ; green + !set RGB_6 = $0000FF ; blue + !set RGB_7 = $FFFF00 ; yellow + !set RGB_8 = $FF6600 ; orange + !set RGB_9 = $AA4400 ; brown + !set RGB_A = $FF7777 ; light red / pink + !set RGB_B = $555555 ; dark grey + !set RGB_C = $888888 ; medium grey + !set RGB_D = $99FF99 ; light green + !set RGB_E = $9999FF ; light blue + !set RGB_F = $BBBBBB ; light gray + +} else if (CONFIG_VIC_PALETTE = 2) { + + ; A Colodore palette, values taken from VICE emulator + ; Based on http://www.colodore.com/ + + ; RRGGBB + !set RGB_0 = $000000 ; black + !set RGB_1 = $FFFFFF ; white + !set RGB_2 = $96282E ; red + !set RGB_3 = $5BD6CE ; cyan + !set RGB_4 = $9F2DAD ; purple / magenta + !set RGB_5 = $41B936 ; green + !set RGB_6 = $2724C4 ; blue + !set RGB_7 = $EFF347 ; yellow + !set RGB_8 = $9F4815 ; orange + !set RGB_9 = $5E3500 ; brown + !set RGB_A = $DA5F66 ; light red / pink + !set RGB_B = $474747 ; dark grey + !set RGB_C = $787878 ; medium grey + !set RGB_D = $91FF84 ; light green + !set RGB_E = $6864FF ; light blue + !set RGB_F = $AEAEAE ; light gray + +} else if (CONFIG_VIC_PALETTE = 3) { + + ; A VICE emulator palette + + ; RRGGBB + !set RGB_0 = $000000 ; black + !set RGB_1 = $FDFEFC ; white + !set RGB_2 = $BE1A24 ; red + !set RGB_3 = $30E6C6 ; cyan + !set RGB_4 = $B41AE2 ; purple / magenta + !set RGB_5 = $1FD21E ; green + !set RGB_6 = $211BAE ; blue + !set RGB_7 = $DFF60A ; yellow + !set RGB_8 = $B84104 ; orange + !set RGB_9 = $6A3304 ; brown + !set RGB_A = $FE4A57 ; light red / pink + !set RGB_B = $424540 ; dark grey + !set RGB_C = $70746F ; medium grey + !set RGB_D = $59FE59 ; light green + !set RGB_E = $5F53FE ; light blue + !set RGB_F = $A4A7A2 ; light gray + +} else if (CONFIG_VIC_PALETTE = 4) { + + ; A Frodo palette, values taken from VICE emulator + + ; RRGGBB + !set RGB_0 = $000000 ; black + !set RGB_1 = $FDFEFC ; white + !set RGB_2 = $BE1A24 ; red + !set RGB_3 = $30E6C6 ; cyan + !set RGB_4 = $B41AE2 ; purple / magenta + !set RGB_5 = $1FD21E ; green + !set RGB_6 = $211BAE ; blue + !set RGB_7 = $DFF60A ; yellow + !set RGB_8 = $B84104 ; orange + !set RGB_9 = $6A3304 ; brown + !set RGB_A = $FE4A57 ; light red / pink + !set RGB_B = $424540 ; dark grey + !set RGB_C = $70746F ; medium grey + !set RGB_D = $59FE59 ; light green + !set RGB_E = $5F53FE ; light blue + !set RGB_F = $A4A7A2 ; light gray + + +} else if (CONFIG_VIC_PALETTE = 5) { + + ; A Deekay palette, values taken from VICE emulator + + + ; RRGGBB + !set RGB_0 = $000000 ; black + !set RGB_1 = $FFFFFF ; white + !set RGB_2 = $882000 ; red + !set RGB_3 = $68D0A8 ; cyan + !set RGB_4 = $A838A0 ; purple / magenta + !set RGB_5 = $50B818 ; green + !set RGB_6 = $181090 ; blue + !set RGB_7 = $F0E858 ; yellow + !set RGB_8 = $A04800 ; orange + !set RGB_9 = $472B1B ; brown + !set RGB_A = $C87870 ; light red / pink + !set RGB_B = $484848 ; dark grey + !set RGB_C = $808080 ; medium grey + !set RGB_D = $98FF98 ; light green + !set RGB_E = $5090D0 ; light blue + !set RGB_F = $B8B8B8 ; light gray + +} else { !error "Unknown palette ID" } + + + +m65_reset_palette: + + ; Enable RAM palette + + lda VIC_CTRLA + ora #$04 + sta VIC_CTRLA + + + ; XXX loop instead + + lda #%11000000 + sta VIC_PALSEL + jsr m65_reset_palette_selected + + lda #%10000000 + sta VIC_PALSEL + jsr m65_reset_palette_selected + + lda #%01000000 + sta VIC_PALSEL + jsr m65_reset_palette_selected + + lda #%00000000 + sta VIC_PALSEL + jsr m65_reset_palette_selected + + rts + +m65_reset_palette_selected: + + ; First clear the entire palette + + lda #$00 + ldx #$00 +@1: + sta PALETTE_R, x + sta PALETTE_G, x + sta PALETTE_B, x + + inx + bne @1 + + ; Now set default colors + + ldx #$0F +@2: + lda m65_COL_R,x + sta $D100, x + lda m65_COL_G,x + sta $D200, x + lda m65_COL_B,x + sta $D300, x + dex + bpl @2 + + rts + +; Macros to convert colors to C65/M65 palette + +!macro COL_R .x { !byte ((((^.x & $0F) * $10) + ((^.x & $F0) / $10)) & %11101111) } +!macro COL_G .x { !byte (((>.x & $0F) * $10) + ((>.x & $F0) / $10)) } +!macro COL_B .x { !byte (((<.x & $0F) * $10) + ((<.x & $F0) / $10)) } + +m65_COL_R: + + +COL_R RGB_0 + +COL_R RGB_1 + +COL_R RGB_2 + +COL_R RGB_3 + +COL_R RGB_4 + +COL_R RGB_5 + +COL_R RGB_6 + +COL_R RGB_7 + +COL_R RGB_8 + +COL_R RGB_9 + +COL_R RGB_A + +COL_R RGB_B + +COL_R RGB_C + +COL_R RGB_D + +COL_R RGB_E + +COL_R RGB_F + +m65_COL_G: + + +COL_G RGB_0 + +COL_G RGB_1 + +COL_G RGB_2 + +COL_G RGB_3 + +COL_G RGB_4 + +COL_G RGB_5 + +COL_G RGB_6 + +COL_G RGB_7 + +COL_G RGB_8 + +COL_G RGB_9 + +COL_G RGB_A + +COL_G RGB_B + +COL_G RGB_C + +COL_G RGB_D + +COL_G RGB_E + +COL_G RGB_F + +m65_COL_B: + + +COL_B RGB_0 + +COL_B RGB_1 + +COL_B RGB_2 + +COL_B RGB_3 + +COL_B RGB_4 + +COL_B RGB_5 + +COL_B RGB_6 + +COL_B RGB_7 + +COL_B RGB_8 + +COL_B RGB_9 + +COL_B RGB_A + +COL_B RGB_B + +COL_B RGB_C + +COL_B RGB_D + +COL_B RGB_E + +COL_B RGB_F diff --git a/src/kernal/board_m65/mega65_reset_part.s b/src/kernal/board_m65/mega65_reset_part.s index 12086d46..a687df09 100644 --- a/src/kernal/board_m65/mega65_reset_part.s +++ b/src/kernal/board_m65/mega65_reset_part.s @@ -6,15 +6,15 @@ m65_reset_part: - jsr map_NORMAL ; we want normal memory mapping - jsr viciv_shutdown ; by default we do not want the VIC-IV + jsr map_NORMAL ; we want normal memory mapping + jsr viciv_shutdown ; by default we do not want the VIC-IV jsr M65_MODEGET bcs m65_clr_end ; Clear MEAGA65 native mode mark, it might cause confusion -m65_clr_magictstr: ; entry point for mode switching routine +m65_clr_magictstr: ; entry point for mode switching routine lda #$00 sta M65_MAGICSTR+0 diff --git a/src/kernal/board_m65/mega65_viciv_setctrl_AC.s b/src/kernal/board_m65/mega65_viciv_setctrl_AC.s index c49f31de..bc47695d 100644 --- a/src/kernal/board_m65/mega65_viciv_setctrl_AC.s +++ b/src/kernal/board_m65/mega65_viciv_setctrl_AC.s @@ -9,6 +9,7 @@ mega65_viciv_setctrl_AC: sta VIC_CTRLA + ora #%00000100 ; always use RAM color palette lda VIC_CTRLC and #%01101000 diff --git a/src/zvm_m65/zvm_core.s b/src/zvm_m65/zvm_core.s index 6974e18d..499d677d 100644 --- a/src/zvm_m65/zvm_core.s +++ b/src/zvm_m65/zvm_core.s @@ -19,16 +19,27 @@ ZVM_entry: sta CINV+1 ; Make sure $C000-$CFFF ROM is mapped-in, we keep our proxies there + ; Also make sure the palette is taken from RAM lda VIC_CTRLA - ora #%00100000 + ora #%00100100 sta VIC_CTRLA - ; Setup colours, print welcome message + ; Setup colours to ressemble vintage green monitor from the 70s, print welcome message lda #$00 sta VIC_EXTCOL sta VIC_BGCOL0 + sta PALETTE_R+0 + sta PALETTE_G+0 + sta PALETTE_B+0 + + lda #$01 + sta PALETTE_R+5 + lda #$47 + sta PALETTE_G+5 + lda #$02 + sta PALETTE_B+5 jsr PRIMM !byte KEY_GREEN, KEY_ESC, 'o', KEY_CLR, KEY_C65_SHIFT_ON, KEY_TXT, KEY_C65_SHIFT_OFF diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 00407a18..113a2bf6 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -294,7 +294,7 @@ const StringEntryList GLOBAL_MiscStrings = { ListType::STRINGS_BASIC, "misc", { true, true, true, true, true, "STR_BRK_AT", "\rBRK AT $" }, { false, false, true, false, false, "STR_ORS", "OPEN ROMS BASIC & KERNAL\r" }, - { false, false, true, false, false, "STR_ORS_LEGACY", "(LEGACY MODE) " }, + { false, false, true, false, false, "STR_ORS_LEGACY", "(LEGACY MODE) " }, { false, true, true, false, false, "STR_MEM_HDR", "\r\x12 AREA START SIZE \r" }, { false, true, true, false, false, "STR_MEM_1", " $" },