From e9dfdcd49588923dc8c0381defe67f5d74683d08 Mon Sep 17 00:00:00 2001 From: Newsdee Date: Sun, 9 Oct 2016 19:40:51 +0800 Subject: [PATCH] Added option to switch palette between FCEUX (very common) and Unsaturated-V6 (very close to NTSC). --- cores/nes/mist/NES_mist.v | 20 ++++--- cores/nes/src/nes_palette_fceux.txt | 64 +++++++++++++++++++++ cores/nes/src/nes_palette_unsaturatedv6.txt | 64 +++++++++++++++++++++ cores/nes/src/video.v | 23 ++++++-- 4 files changed, 157 insertions(+), 14 deletions(-) create mode 100644 cores/nes/src/nes_palette_fceux.txt create mode 100644 cores/nes/src/nes_palette_unsaturatedv6.txt diff --git a/cores/nes/mist/NES_mist.v b/cores/nes/mist/NES_mist.v index 1b79f0a..92e35a0 100644 --- a/cores/nes/mist/NES_mist.v +++ b/cores/nes/mist/NES_mist.v @@ -158,13 +158,12 @@ parameter CONF_STR = { "O2,Scanlines,OFF,ON;", "O3,Invert mirroring,OFF,ON;", "O4,Hide overscan,OFF,ON;", - "T5,Start;", - "T6,Select;", - "T7,Reset;", + "O5,Palette,FCEUX,Unsaturated-V6;", + "T6,Reset;", "V,v0.8;" }; -parameter CONF_STR_LEN = 8+25+20+27+24+9+10+9+7; +parameter CONF_STR_LEN = 8+25+20+27+24+32+9+7; wire [7:0] status; wire arm_reset = status[0]; @@ -172,13 +171,17 @@ wire smoothing_osd = status[1]; wire scanlines_osd = status[2]; wire mirroring_osd = status[3]; wire overscan_osd = status[4]; -wire start_osd = status[5]; -wire select_osd = status[6]; -wire reset_osd = status[7]; +wire palette2_osd = status[5]; +wire reset_osd = status[6]; + +// no longer used +wire start_osd = 0; +wire select_osd = 0; wire scandoubler_disable; wire ps2_kbd_clk, ps2_kbd_data; + user_io #(.STRLEN(CONF_STR_LEN)) user_io( .conf_str(CONF_STR), // the spi interface @@ -431,7 +434,8 @@ video video ( .smoothing(!smoothing_osd), .scanlines(scanlines_osd), .overscan(overscan_osd), - + .palette(palette2_osd), + .VGA_HS(VGA_HS), .VGA_VS(VGA_VS), .VGA_R(VGA_R), diff --git a/cores/nes/src/nes_palette_fceux.txt b/cores/nes/src/nes_palette_fceux.txt new file mode 100644 index 0000000..2f34139 --- /dev/null +++ b/cores/nes/src/nes_palette_fceux.txt @@ -0,0 +1,64 @@ +39ce +4464 +5400 +4c08 +3811 +0815 +0014 +002f +00a8 +0100 +0140 +08e0 +2ce3 +0000 +0000 +0000 +5ef7 +75c0 +74e4 +7810 +5c17 +2c1c +00bb +0539 +01d1 +0240 +02a0 +1e40 +4600 +0000 +0000 +0000 +7fff +7ee7 +7e4b +7e28 +7dfe +59df +31df +1e7f +1efe +0b50 +2769 +4feb +6fa0 +3def +0000 +0000 +7fff +7f95 +7f58 +7f3a +7f1f +6f1f +5aff +577f +539f +53fc +5fd5 +67f6 +7bf3 +6318 +0000 +0000 diff --git a/cores/nes/src/nes_palette_unsaturatedv6.txt b/cores/nes/src/nes_palette_unsaturatedv6.txt new file mode 100644 index 0000000..aea4d79 --- /dev/null +++ b/cores/nes/src/nes_palette_unsaturatedv6.txt @@ -0,0 +1,64 @@ +35ad +4060 +4823 +4027 +302b +140b +004a +0068 +00c6 +0121 +0120 +0d00 +2ce0 +0000 +0000 +0000 +5ad6 +6943 +74c9 +748e +5873 +3074 +0cb4 +0130 +01ac +0205 +0220 +2200 +49e0 +0000 +0000 +0000 +7fff +7eac +7e32 +7dd7 +7ddc +65be +361e +167b +02f7 +0350 +1f6b +3f49 +6729 +294a +0000 +0000 +7fff +7f98 +7f5a +7f3c +7f3f +7b3f +635f +577e +4fbd +4fda +5bd7 +67d6 +77d6 +5ef7 +0000 +0000 \ No newline at end of file diff --git a/cores/nes/src/video.v b/cores/nes/src/video.v index 9fe2451..76f8d3c 100644 --- a/cores/nes/src/video.v +++ b/cores/nes/src/video.v @@ -10,6 +10,7 @@ module video( input smoothing, input scanlines, input overscan, + input palette, input sck, input ss, @@ -49,10 +50,20 @@ osd #(10'd0, 10'd0, 3'd4) osd ( ); // NES Palette -> RGB555 conversion -reg [15:0] pallut[0:63]; -initial $readmemh("nes_palette.txt", pallut); -wire [14:0] pixel = pallut[color][14:0]; +reg [15:0] pal_lut[0:63]; +initial $readmemh("nes_palette_original.txt", pal_lut); // MiST legacy +// NTSC UnsaturatedV6 palette +//see: http://www.firebrandx.com/nespalette.html +reg [15:0] pal_unsat_lut[0:63]; +initial $readmemh("nes_palette_unsaturatedv6.txt", pal_unsat_lut); + +// FCEUX palette +reg [15:0] pal_fcelut[0:63]; +initial $readmemh("nes_palette_fceux.txt", pal_fcelut); + +wire [14:0] pixel = palette ? pal_unsat_lut[color][14:0] : pal_fcelut[color][14:0]; + // Horizontal and vertical counters reg [9:0] h, v; wire hpicture = (h < 512); // 512 lines of picture @@ -86,9 +97,9 @@ wire darker = !mode && v[0] && scanlines; // display overlay to hide overscan area // based on Mario3, DoubleDragon2, Shadow of the Ninja wire ol = overscan && ( (h > 512-16) || - (h < 18) || - (v < 8) || - ( v > (mode? 240-10 : 480-20) ) + (h < 20) || + (v < (mode ? 6 : 12)) || + (v > (mode ? 240-10 : 480-20)) ); wire [4:0] vga_r = ol ? {4'b0, pixel_v[4:4]} : (darker ? {1'b0, pixel_v[4:1]} : pixel_v[4:0]);