zxuno-git/cores/MasterSystem/src/vdp_main.vhd

136 lines
3.4 KiB
VHDL

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity vdp_main is
port (
clk: in std_logic;
vram_A: out std_logic_vector(13 downto 0);
vram_D: in std_logic_vector(7 downto 0);
cram_A: out std_logic_vector(4 downto 0);
cram_D: in std_logic_vector(5 downto 0);
x: unsigned(8 downto 0);
y: unsigned(7 downto 0);
color: out std_logic_vector (5 downto 0);
-- display_on: in std_logic;
mask_column0: in std_logic;
overscan: in std_logic_vector (3 downto 0);
bg_address: in std_logic_vector (2 downto 0);
bg_scroll_x: in unsigned(7 downto 0);
bg_scroll_y: in unsigned(7 downto 0);
disable_hscroll: in std_logic;
spr_address: in std_logic_vector (5 downto 0);
spr_high_bit: in std_logic;
-- spr_shift: in std_logic;
spr_tall: in std_logic);
end vdp_main;
architecture Behavioral of vdp_main is
component vdp_background is
port (
clk: in std_logic;
reset: in std_logic;
table_address: in std_logic_vector(13 downto 11);
scroll_x: in unsigned(7 downto 0);
disable_hscroll: in std_logic;
y: in unsigned(7 downto 0);
vram_A: out std_logic_vector(13 downto 0);
vram_D: in std_logic_vector(7 downto 0);
color: out std_logic_vector(4 downto 0);
priority: out std_logic);
end component;
component vdp_sprites is
port (
clk: in std_logic;
table_address: in std_logic_vector(13 downto 8);
char_high_bit: in std_logic;
tall: in std_logic;
x: in unsigned(8 downto 0);
y: in unsigned(7 downto 0);
vram_A: out std_logic_vector(13 downto 0);
vram_D: in std_logic_vector(7 downto 0);
color: out std_logic_vector(3 downto 0));
end component;
signal bg_y: unsigned(7 downto 0);
signal bg_vram_A: std_logic_vector(13 downto 0);
signal bg_color: std_logic_vector(4 downto 0);
signal bg_priority: std_logic;
signal spr_vram_A: std_logic_vector(13 downto 0);
signal spr_color: std_logic_vector(3 downto 0);
signal line_reset: std_logic;
begin
process (y,bg_scroll_y)
variable sum: unsigned(8 downto 0);
begin
sum := ('0'&y)+('0'&bg_scroll_y);
if (sum>=224) then
sum := sum-224;
end if;
bg_y <= sum(7 downto 0);
end process;
line_reset <= '1' when x=512-16 else '0';
vdp_bg_inst: vdp_background
port map (
clk => clk,
table_address => bg_address,
reset => line_reset,
disable_hscroll=> disable_hscroll,
scroll_x => bg_scroll_x,
y => bg_y,
vram_A => bg_vram_A,
vram_D => vram_D,
color => bg_color,
priority => bg_priority);
vdp_spr_inst: vdp_sprites
port map (
clk => clk,
table_address => spr_address,
char_high_bit => spr_high_bit,
tall => spr_tall,
x => x,
y => y,
vram_A => spr_vram_A,
vram_D => vram_D,
color => spr_color);
process (x, y, bg_priority, spr_color, bg_color, overscan)
variable spr_active : boolean;
variable bg_active : boolean;
begin
if x<256 and y<192 and (mask_column0='0' or x>=8) then
spr_active := not (spr_color="0000");
bg_active := not (bg_color(3 downto 0)="0000");
if (bg_priority='0' and spr_active) or (bg_priority='1' and not bg_active) then
cram_A <= "1"&spr_color;
else
cram_A <= bg_color;
end if;
else
cram_A <= "1"&overscan;
end if;
end process;
vram_A <= spr_vram_A when x>=256 and x<384 else bg_vram_A;
color <= cram_D;
end Behavioral;