From 5ce1f2a4e02b3bc62d778f62412e2f3ec50c23ae Mon Sep 17 00:00:00 2001 From: retrorepair <38870678+retrorepair@users.noreply.github.com> Date: Tue, 13 Apr 2021 15:22:27 +0100 Subject: [PATCH] CRAM Dots --- MegaCD.sv | 26 ++++++++++++++------------ rtl/GEN/gen.sv | 2 ++ rtl/GEN/vdp.vhd | 26 ++++++++++++++++---------- 3 files changed, 32 insertions(+), 22 deletions(-) diff --git a/MegaCD.sv b/MegaCD.sv index 61b6260..930ea70 100644 --- a/MegaCD.sv +++ b/MegaCD.sv @@ -40,9 +40,9 @@ module emu output CE_PIXEL, //Video aspect ratio for HDMI. Most retro systems have ratio 4:3. - //if VIDEO_ARX[12] or VIDEO_ARY[12] is set then [11:0] contains scaled size instead of aspect ratio. - output [12:0] VIDEO_ARX, - output [12:0] VIDEO_ARY, + //if VIDEO_ARX[12] or VIDEO_ARY[12] is set then [11:0] contains scaled size instead of aspect ratio. + output [12:0] VIDEO_ARX, + output [12:0] VIDEO_ARY, output [7:0] VGA_R, output [7:0] VGA_G, @@ -53,9 +53,9 @@ module emu output VGA_F1, output [1:0] VGA_SL, output VGA_SCALER, // Force VGA scaler - - input [11:0] HDMI_WIDTH, - input [11:0] HDMI_HEIGHT, + + input [11:0] HDMI_WIDTH, + input [11:0] HDMI_HEIGHT, `ifdef USE_FB // Use framebuffer in DDRAM (USE_FB=1 in qsf) @@ -224,15 +224,15 @@ always @(posedge CLK_VIDEO) begin end wire vga_de; -video_freak video_freak +video_freak video_freak ( .*, .VGA_DE_IN(vga_de), .ARX((!ar) ? arx : (ar - 1'd1)), .ARY((!ar) ? ary : 12'd0), .CROP_SIZE((en216p & vcrop_en) ? 10'd216 : 10'd0), - .CROP_OFF(voff), - .SCALE(status[56:55]) + .CROP_OFF(voff), + .SCALE(status[56:55]) ); /////////////////////////////////////////////////// @@ -278,12 +278,13 @@ localparam CONF_STR = { "P1OU,320x224 Aspect,Original,Corrected;", "P1o13,Scandoubler Fx,None,HQ2x,CRT 25%,CRT 50%,CRT 75%;", "P1-;", - "d9P1o0,Vertical Crop,Disabled,216p(5x);", - "d9P1oJM,Crop Offset,0,2,4,8,10,12,-12,-10,-8,-6,-4,-2;", + "d9P1o0,Vertical Crop,Disabled,216p(5x);", + "d9P1oJM,Crop Offset,0,2,4,8,10,12,-12,-10,-8,-6,-4,-2;", "P1oNO,Scale,Normal,V-Integer,Narrower HV-Integer,Wider HV-Integer;", - "P1- ;", + "P1- ;", "P1OT,Border,No,Yes;", "P1oFG,Composite Blend,Off,On,Adaptive;", + "P1OA,CRAM Dots,Off,On;", "P1OV,Sprite Limit,Normal,High;", "P1-;", "P1OEF,Audio Filter,Model 1,Model 2,Minimal,No Filter;", @@ -571,6 +572,7 @@ gen gen .HBL(hblank), .VBL(vblank), .BORDER(status[29]), + .CRAM_DOTS(status[10]), .CE_PIX(ce_pix), .FIELD(VGA_F1), .INTERLACE(interlace), diff --git a/rtl/GEN/gen.sv b/rtl/GEN/gen.sv index 32893d5..122c17c 100644 --- a/rtl/GEN/gen.sv +++ b/rtl/GEN/gen.sv @@ -89,6 +89,7 @@ module gen output VBL, output CE_PIX, output TRANSP_DETECT, + input CRAM_DOTS, input BORDER, output INTERLACE, @@ -425,6 +426,7 @@ vdp vdp // .VRAM_SPEED(1), // .VSCROLL_BUG(0), .BORDER_EN(BORDER), + .CRAM_DOTS(CRAM_DOTS), .OBJ_LIMIT_HIGH_EN(OBJ_LIMIT_HIGH), .FIELD_OUT(FIELD), diff --git a/rtl/GEN/vdp.vhd b/rtl/GEN/vdp.vhd index d2bc579..3285a16 100644 --- a/rtl/GEN/vdp.vhd +++ b/rtl/GEN/vdp.vhd @@ -112,6 +112,7 @@ entity vdp is VRAM_SPEED : in std_logic := '1'; -- 0 - full speed, 1 - FIFO throttle emulation VSCROLL_BUG : in std_logic := '1'; -- 0 - use nicer effect, 1 - HW original BORDER_EN : in std_logic := '0'; -- Enable border + CRAM_DOTS : in std_logic := '0'; -- Enable CRAM dots OBJ_LIMIT_HIGH_EN : in std_logic := '0'; -- Enable more sprites and pixels per line TRANSP_DETECT : out std_logic ); @@ -134,6 +135,7 @@ signal CRAM_WE_A : std_logic; signal CRAM_WE_B : std_logic; signal CRAM_Q_A : std_logic_vector(8 downto 0); signal CRAM_Q_B : std_logic_vector(8 downto 0); +signal CRAM_DATA : std_logic_vector(8 downto 0); signal VSRAM0_ADDR_A : std_logic_vector( 4 downto 0); signal VSRAM0_ADDR_B : std_logic_vector( 4 downto 0); @@ -833,6 +835,7 @@ port map( q_b => CRAM_Q_B ); CRAM_WE_B <= '0'; +CRAM_DATA <= CRAM_D_A when CRAM_WE_A = '1' and CRAM_DOTS = '1' else CRAM_Q_B; vsram0 : entity work.DualPortRAM generic map ( @@ -2678,21 +2681,21 @@ begin else case PIX_MODE is when PIX_SHADOW => -- half brightness - FF_B <= '0' & CRAM_Q_B(8 downto 6); - FF_G <= '0' & CRAM_Q_B(5 downto 3); - FF_R <= '0' & CRAM_Q_B(2 downto 0); + FF_B <= '0' & CRAM_DATA(8 downto 6); + FF_G <= '0' & CRAM_DATA(5 downto 3); + FF_R <= '0' & CRAM_DATA(2 downto 0); when PIX_NORMAL => -- normal brightness - FF_B <= CRAM_Q_B(8 downto 6) & '0'; - FF_G <= CRAM_Q_B(5 downto 3) & '0'; - FF_R <= CRAM_Q_B(2 downto 0) & '0'; + FF_B <= CRAM_DATA(8 downto 6) & '0'; + FF_G <= CRAM_DATA(5 downto 3) & '0'; + FF_R <= CRAM_DATA(2 downto 0) & '0'; when PIX_HIGHLIGHT => -- increased brightness - FF_B <= '0' & CRAM_Q_B(8 downto 6) + 7; - FF_G <= '0' & CRAM_Q_B(5 downto 3) + 7; - FF_R <= '0' & CRAM_Q_B(2 downto 0) + 7; + FF_B <= '0' & CRAM_DATA(8 downto 6) + 7; + FF_G <= '0' & CRAM_DATA(5 downto 3) + 7; + FF_R <= '0' & CRAM_DATA(2 downto 0) + 7; end case; end if; @@ -2912,7 +2915,10 @@ begin if FIFO_DELAY(3) /= "00" then FIFO_DELAY(3) <= FIFO_DELAY(3) - 1; end if; end if; - CRAM_WE_A <= '0'; + -- Extend CRAM write enable for CRAM dots + if CE_PIX = '1' then + CRAM_WE_A <= '0'; + end if; SOVR_CLR <= '0'; SCOL_CLR <= '0';