From eab80c4a731745e325658fda04220b525b0c99b8 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 11:56:45 +0100 Subject: [PATCH 1/9] IremM62: add DIP switches --- .../IremM62 Hardware/meta/Battle Road.mra | 5 ++++ Arcade_MiST/IremM62 Hardware/meta/Horizon.mra | 5 ++++ .../IremM62 Hardware/meta/Kid Niki.mra | 6 +++++ .../IremM62 Hardware/meta/Kung Fu Master.mra | 6 +++++ .../IremM62 Hardware/meta/Lode Runner 2.mra | 6 +++++ .../IremM62 Hardware/meta/Lode Runner 3.mra | 5 ++++ .../IremM62 Hardware/meta/Lode Runner 4.mra | 6 +++++ .../IremM62 Hardware/meta/Lode Runner.mra | 5 ++++ .../IremM62 Hardware/meta/Spelunker 2.mra | 5 ++++ .../IremM62 Hardware/meta/Spelunker.mra | 5 ++++ .../IremM62 Hardware/meta/Youjyudn.mra | 4 +++ .../IremM62 Hardware/rtl/IremM62_MiST.sv | 25 +++++-------------- .../IremM62 Hardware/rtl/input_mapper.vhd | 2 +- .../IremM62 Hardware/rtl/target_top.vhd | 3 ++- 14 files changed, 67 insertions(+), 21 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra index 4f87b99c..e0d6edd6 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Battle Road.mra @@ -4,6 +4,11 @@ battroad Irem iremm62 + + + + + 6 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra index c3e1b9d2..1bb386bd 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Horizon.mra @@ -4,6 +4,11 @@ horizon Irem iremm62 + + + + + 5 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra index 5ad3dd77..682dd16c 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kid Niki.mra @@ -4,6 +4,12 @@ kidniki Irem iremm62 + + + + + + 7 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra index 269b8cb2..41e0ab5c 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Kung Fu Master.mra @@ -4,6 +4,12 @@ kungfum Irem iremm62 + + + + + + 4 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra index d10cc3b6..13000754 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 2.mra @@ -4,6 +4,12 @@ ldrun2 Irem iremm62 + + + + + + 1 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra index 062f118b..02b1d9d7 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 3.mra @@ -4,6 +4,11 @@ ldrun3 Irem iremm62 + + + + + 2 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra index b0ddec8c..566812f9 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra @@ -4,6 +4,12 @@ ldrun4 Irem iremm62 + + + + + + 3 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra index 8a84b361..875959b6 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner.mra @@ -4,6 +4,11 @@ ldrun Irem iremm62 + + + + + 0 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra index 2cc69d13..2dce2b3d 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker 2.mra @@ -4,6 +4,11 @@ spelunk2 Irem iremm62 + + + + + 0A diff --git a/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra index 9e796c7e..f10b9127 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Spelunker.mra @@ -4,6 +4,11 @@ spelunkr Irem iremm62 + + + + + 9 diff --git a/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra index 230ebd45..7ef87bef 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Youjyudn.mra @@ -4,6 +4,10 @@ youjyudn Irem iremm62 + + + + 0B diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 9e4d628f..5aa277f3 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -39,6 +39,7 @@ localparam CONF_STR = { "O1,Video Timings,Original,PAL 50Hz;", "O34,Scanlines,Off,25%,50%,75%;", "O5,Blending,Off,On;", + "DIP;", "O6,Service,Off,On;", "T0,Reset;", "V,v1.0.",`BUILD_DATE @@ -51,28 +52,13 @@ wire blend = status[5]; wire service = status[6]; reg [1:0] orientation = 2'b10; +wire [7:0] DSW1 = {/*coinage*/4'hf, ~status[11:8]}; always @(*) begin orientation = 2'b10; case (core_mod) - 7'h0: ;// LDRUN - 7'h1: ;// LDRUN2 - 7'h2: ;// LDRUN3 - 7'h3: ;// LDRUN4 - 7'h4: ;// KUNGFUM - 7'h5: ;// HORIZON - 7'h6: // BATTROAD - begin - orientation = 2'b11; - end - 7'h7: ;// KIDNIKI - 7'h8: ;// LOTLOT - 7'h9: ;// SPELUNKR - 7'hA: ;// SPELUNK2 - 7'hB: // YOUJYUDN - begin - orientation = 2'b01; - end + 7'h6: orientation = 2'b11; // BATTROAD + 7'hB: orientation = 2'b01; // YOUJYUDN default: ; endcase end @@ -262,6 +248,7 @@ target_top target_top( .hwsel(core_mod), .palmode(palmode), .audio_out(audio), + .switches_i(DSW1), .usr_coin1(m_coin1), .usr_coin2(m_coin2), .usr_service(service), @@ -317,7 +304,7 @@ mist_video #(.COLOR_DEPTH(4), .SD_HCNT_WIDTH(11)) mist_video( .VGA_B ( VGA_B ), .VGA_VS ( VGA_VS ), .VGA_HS ( VGA_HS ), - .rotate ( { 1'b1, rotate } ), + .rotate ( { orientation[1], rotate } ), .ce_divider ( 1'b1 ), .scandoubler_disable( scandoublerD ), .scanlines ( scanlines ), diff --git a/Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd b/Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd index c4a27579..e04aa3b8 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/input_mapper.vhd @@ -73,7 +73,7 @@ begin inputs(0).d <= jamma_v(0).d; inputs(1).d <= jamma_v(1).d; inputs(2).d <= jamma_v(2).d; - inputs(3).d <= "11111110"; -- 1C/1C, 10/30/50K, 3 lives + inputs(3).d <= dips(7 downto 0); -- DSW1 inputs(4).d <= jamma.service & "1111100"; -- PORT_START("DSW2") -- PORT_DIPNAME( 0x01, 0x01, DEF_STR( Flip_Screen ) ) PORT_DIPLOCATION("SW2:1") diff --git a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd index 07a167b8..4e530dbd 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/target_top.vhd @@ -17,6 +17,8 @@ entity target_top is port( hwsel : in HWSEL_t; palmode : in std_logic; audio_out : out std_logic_vector(11 downto 0); + switches_i : from_SWITCHES_t; + usr_coin1 : in std_logic; usr_coin2 : in std_logic; usr_service : in std_logic; @@ -64,7 +66,6 @@ architecture SYN of target_top is signal clkrst_i : from_CLKRST_t; signal buttons_i : from_BUTTONS_t; - signal switches_i : from_SWITCHES_t; signal leds_o : to_LEDS_t; signal inputs_i : from_INPUTS_t; signal video_i : from_VIDEO_t; From 3ad6aa47472cc15a5c3291dc68069b365b12b198 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 12:15:29 +0100 Subject: [PATCH 2/9] IremM62: cleanup not used parts --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 1 - Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD | 3 +- Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd | 39 -- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 6 +- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 60 --- .../IremM62 Hardware/rtl/platform_pkg.vhd | 47 -- .../rtl/platform_variant_pkg.vhd | 438 ---------------- .../IremM62 Hardware/rtl/video_controller.vhd | 482 ------------------ 8 files changed, 2 insertions(+), 1074 deletions(-) delete mode 100644 Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd delete mode 100644 Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index 5b049ef3..ab2cdabc 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -260,7 +260,6 @@ set_global_assignment -name VHDL_FILE rtl/input_mapper.vhd set_global_assignment -name VHDL_FILE rtl/dpram.vhd set_global_assignment -name VHDL_FILE rtl/sprom.vhd set_global_assignment -name VHDL_FILE rtl/spram.vhd -set_global_assignment -name VHDL_FILE rtl/clk_div.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD index 25934e3d..c9d8dc48 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Inputs.VHD @@ -8,8 +8,7 @@ entity inputs is generic ( NUM_DIPS : integer := 8; - NUM_INPUTS : integer := 2; - CLK_1US_DIV : natural := 30 + NUM_INPUTS : integer := 2 ); port ( diff --git a/Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd b/Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd deleted file mode 100644 index a28f4e77..00000000 --- a/Arcade_MiST/IremM62 Hardware/rtl/clk_div.vhd +++ /dev/null @@ -1,39 +0,0 @@ -library ieee; -use ieee.std_logic_1164.all; - -entity clk_div is - generic - ( - DIVISOR : natural - ); - port - ( - clk : in std_logic; - reset : in std_logic; - - clk_en : out std_logic - ); -end clk_div; - -architecture SYN of clk_div is - -begin - - process (clk, reset) - variable count : integer range 0 to DIVISOR-1; - begin - if reset = '1' then - count := 0; - clk_en <= '0'; - elsif rising_edge(clk) then - clk_en <= '0'; - if count = DIVISOR-1 then - clk_en <= '1'; - count := 0; - else - count := count + 1; - end if; - end if; - end process; - -end SYN; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index 9de02abc..d19bf44c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -61,9 +61,6 @@ architecture SYN of PACE is alias clk_sys : std_logic is clkrst_i.clk(0); - constant CLK_1US_COUNTS : integer := - integer(27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY); - signal mapped_inputs : from_MAPPED_INPUTS_t(0 to PACE_INPUTS_NUM_BYTES-1); signal to_tilemap_ctl : to_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); @@ -90,8 +87,7 @@ begin generic map ( NUM_DIPS => PACE_NUM_SWITCHES, - NUM_INPUTS => PACE_INPUTS_NUM_BYTES, - CLK_1US_DIV => CLK_1US_COUNTS + NUM_INPUTS => PACE_INPUTS_NUM_BYTES ) port map ( diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 5963d17e..8a414934 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -555,12 +555,6 @@ begin BLK_GFX_ROMS : block - - type gfx_rom_d_a is array(M62_CHAR_ROM'range) of std_logic_vector(7 downto 0); - signal chr_rom_d : gfx_rom_d_a; - type spr_rom_d_a is array(0 to 11) of std_logic_vector(7 downto 0); - signal spr_rom : spr_rom_d_a; - begin -- external background ROMs @@ -574,64 +568,10 @@ begin tilemap_o(2).tile_d(23 downto 0) <= gfx3_do(7 downto 0) & gfx3_do(15 downto 8) & gfx3_do(23 downto 16); - -- internal background ROMs --- GEN_CHAR_ROMS : for i in M62_CHAR_ROM'range generate --- char_rom_inst : entity work.sprom --- generic map --- ( --- init_file => "./roms/" & --- M62_CHAR_ROM(i) & ".hex", --- widthad_a => 13 --- ) --- port map --- ( --- clock => clk_video, --- address => tilemap_i(1).tile_a(12 downto 0), --- q => chr_rom_d(i) --- ); --- end generate GEN_CHAR_ROMS; --- --- tilemap_o(1).tile_d(23 downto 0) <= chr_rom_d(0) & chr_rom_d(1) & chr_rom_d(2); - -- external sprite ROMs gfx2_addr <= sprite_i.a(15 downto 0); sprite_o.d(23 downto 0) <= gfx2_do(7 downto 0) & gfx2_do(15 downto 8) & gfx2_do(23 downto 16); - -- internal sprite ROMs --- GEN_SPRITE_ROMS : for i in M62_SPRITE_ROM'range generate --- sprite_rom_inst : entity work.sprom --- generic map --- ( --- init_file => "./roms/" & --- M62_SPRITE_ROM(i) & ".hex", --- widthad_a => 13 --- ) --- port map --- ( --- clock => clk_video, --- address(12 downto 5) => sprite_i.a(12 downto 5), --- address(4 downto 0) => sprite_i.a(4 downto 0), --- q => spr_rom(i) --- ); --- end generate GEN_SPRITE_ROMS; --- --- sprite_o.d(sprite_o.d'left downto 24) <= (others => '0'); --- sprite_o.d(23 downto 0) <= spr_rom(0) & --- spr_rom(1) & --- spr_rom(2) --- when sprite_i.a(14 downto 13) = "00" else --- spr_rom(3) & --- spr_rom(4) & --- spr_rom(5) --- when sprite_i.a(14 downto 13) = "01" else --- spr_rom(6) & --- spr_rom(7) & --- spr_rom(8) --- when sprite_i.a(14 downto 13) = "10" else --- spr_rom(9) & --- spr_rom(10) & --- spr_rom(11); - end block BLK_GFX_ROMS; BLK_VRAM : block diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd index 2d480471..b4358f33 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_pkg.vhd @@ -8,61 +8,14 @@ use work.platform_variant_pkg.all; use work.video_controller_pkg.all; package platform_pkg is --- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_VGA_640x480_60Hz; --- constant PACE_CLK0_DIVIDE_BY : natural := 3; --- constant PACE_CLK0_MULTIPLY_BY : natural := 5; -- 24*5/3 = 40MHz --- constant PACE_CLK1_DIVIDE_BY : natural := 19; --- constant PACE_CLK1_MULTIPLY_BY : natural := 20; -- 24*20/19 = 25.263158MHz --- constant PACE_VIDEO_H_SCALE : integer := 1; --- constant PACE_VIDEO_V_SCALE : integer := 1; --- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; --- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; - --- constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_ARCADE_STD_336x240_60Hz; --- constant PACE_CLK0_DIVIDE_BY : natural := 19; --- constant PACE_CLK0_MULTIPLY_BY : natural := 20; -- 27*20/19 = 24MHz --- constant PACE_CLK1_DIVIDE_BY : natural := 19; --- constant PACE_CLK1_MULTIPLY_BY : natural := 5; -- 27*5/19 = 7.157895MHz --- constant PACE_VIDEO_H_SCALE : integer := 1; --- constant PACE_VIDEO_V_SCALE : integer := 1; --- constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '0'; --- constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '0'; - - constant PACE_VIDEO_CONTROLLER_TYPE : PACEVideoController_t := PACE_VIDEO_IREMM62; - constant PACE_CLK0_DIVIDE_BY : natural := 9; - constant PACE_CLK0_MULTIPLY_BY : natural := 8; -- 27*8/9 = 24MHz - constant PACE_CLK1_DIVIDE_BY : natural := 27; - constant PACE_CLK1_MULTIPLY_BY : natural := 8; -- 27*8/9 = 24MHz - constant PACE_VIDEO_H_SCALE : integer := 1; - constant PACE_VIDEO_V_SCALE : integer := 1; - constant PACE_ENABLE_ADV724 : std_logic := '1'; - constant USE_VIDEO_VBLANK_INTERRUPT : boolean := false; - constant PACE_VIDEO_H_SYNC_POLARITY : std_logic := '1'; - constant PACE_VIDEO_V_SYNC_POLARITY : std_logic := '1'; - - constant PACE_VIDEO_BORDER_RGB : RGB_t := RGB_BLACK; - --- constant M62_VIDEO_H_SIZE : integer := 384; --- constant M62_VIDEO_H_OFFSET : integer := (512-M62_VIDEO_H_SIZE)/2; - constant M62_VIDEO_V_SIZE : integer := 256; constant PACE_VIDEO_NUM_BITMAPS : natural := 0; constant PACE_VIDEO_NUM_TILEMAPS : natural := 2; constant PACE_VIDEO_NUM_SPRITES : natural := 64; --- constant PACE_VIDEO_H_SIZE : integer := M62_VIDEO_H_SIZE; - constant PACE_VIDEO_V_SIZE : integer := M62_VIDEO_V_SIZE; - constant PACE_VIDEO_L_CROP : integer := 8; - constant PACE_VIDEO_R_CROP : integer := 8; constant PACE_VIDEO_PIPELINE_DELAY : integer := 5; constant PACE_INPUTS_NUM_BYTES : integer := 6; - constant CLK0_FREQ_MHz : natural := - 27 * PACE_CLK0_MULTIPLY_BY / PACE_CLK0_DIVIDE_BY; - constant CPU_FREQ_MHz : natural := 3; - - constant M62_CPU_CLK_ENA_DIVIDE_BY : natural := CLK0_FREQ_MHz / CPU_FREQ_MHz; - type from_PLATFORM_IO_t is record not_used : std_logic; end record; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd index 0fa48fe8..bf1dec99 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform_variant_pkg.vhd @@ -25,449 +25,11 @@ package platform_variant_pkg is subtype HWSEL_t is integer range 0 to 11; type rom_a is array (natural range <>) of string; - - constant M62_ROM : rom_a(0 to 3) := - ( - 0 => "lr-a-4e", - 1 => "lr-a-4d", - 2 => "lr-a-4b", - 3 => "lr-a-4a" - ); - constant M62_ROM_WIDTHAD : natural := 13; - - constant M62_CHAR_ROM : rom_a(0 to 2) := - ( - 0 => "lr-e-2d", - 1 => "lr-e-2j", - 2 => "lr-e-2f" - ); - - constant M62_SPRITE_ROM : rom_a(0 to 2) := - ( - 0 => "lr-b-4k", - 1 => "lr-b-3n", - 2 => "lr-b-4c" - ); type pal_rgb_t is array (0 to 2) of std_logic_vector(7 downto 0); type pal_a is array (natural range <>) of pal_rgb_t; - constant tile_pal : pal_a(0 to 255) := - ( - 17 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 25 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 33 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 40 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 41 => (0=>"11011100", 1=>"01100010", 2=>"00000011"), -- DC6203 - 42 => (0=>"00000011", 1=>"11111111", 2=>"11001100"), -- 03FFCC - 43 => (0=>"11011100", 1=>"11011100", 2=>"00000011"), -- DCDC03 - 44 => (0=>"11011100", 1=>"10110111", 2=>"01010000"), -- DCB750 - 45 => (0=>"10000100", 1=>"10100110", 2=>"10100110"), -- 84A6A6 - 46 => (0=>"10010100", 1=>"01100010", 2=>"01100010"), -- 946262 - 49 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 50 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 51 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 52 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 53 => (0=>"11111111", 1=>"00000011", 2=>"11111111"), -- FF03FF - 54 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 55 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 56 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 57 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 63 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 72 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 73 => (0=>"11001100", 1=>"00000011", 2=>"11110000"), -- CC03F0 - 74 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 75 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 76 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 77 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 78 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 79 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 80 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 81 => (0=>"11110000", 1=>"11011100", 2=>"00000011"), -- F0DC03 - 82 => (0=>"11110000", 1=>"10010100", 2=>"00000011"), -- F09403 - 83 => (0=>"11111111", 1=>"11111111", 2=>"10100110"), -- FFFFA6 - 84 => (0=>"10000100", 1=>"10000100", 2=>"11111111"), -- 8484FF - 85 => (0=>"11011100", 1=>"10010100", 2=>"00000011"), -- DC9403 - 86 => (0=>"00000011", 1=>"11011100", 2=>"11011100"), -- 03DCDC - 89 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 91 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 93 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 95 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 97 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 98 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 99 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 101 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 102 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 103 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 105 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 106 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 107 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 108 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 109 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 110 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 111 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 113 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 114 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 115 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 116 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 117 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 118 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 119 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 121 => (0=>"11111111", 1=>"11001100", 2=>"00000011"), -- FFCC03 - 122 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 123 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 124 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 125 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 126 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 127 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 136 => (0=>"10000100", 1=>"10000100", 2=>"10000100"), -- 848484 - 137 => (0=>"10010100", 1=>"10010100", 2=>"10010100"), -- 949494 - 138 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 139 => (0=>"11011100", 1=>"10110111", 2=>"10000100"), -- DCB784 - 140 => (0=>"01100010", 1=>"01100010", 2=>"11001100"), -- 6262CC - 141 => (0=>"11001100", 1=>"11001100", 2=>"11001100"), -- CCCCCC - 142 => (0=>"10110111", 1=>"11011100", 2=>"11110000"), -- B7DCF0 - 143 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 145 => (0=>"11110000", 1=>"11001100", 2=>"10010100"), -- F0CC94 - 146 => (0=>"10000100", 1=>"10000100", 2=>"10000100"), -- 848484 - 147 => (0=>"10000100", 1=>"10000100", 2=>"10000100"), -- 848484 - 148 => (0=>"11001100", 1=>"11001100", 2=>"11001100"), -- CCCCCC - 149 => (0=>"11001100", 1=>"11001100", 2=>"10100110"), -- CCCCA6 - 150 => (0=>"10110111", 1=>"10110111", 2=>"10110111"), -- B7B7B7 - 153 => (0=>"10110111", 1=>"00000011", 2=>"11001100"), -- B703CC - 154 => (0=>"00000011", 1=>"10010100", 2=>"00000011"), -- 039403 - 155 => (0=>"11011100", 1=>"10110111", 2=>"10000100"), -- DCB784 - 156 => (0=>"01100010", 1=>"01100010", 2=>"11001100"), -- 6262CC - 157 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 158 => (0=>"10100110", 1=>"11011100", 2=>"10100110"), -- A6DCA6 - 159 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 160 => (0=>"10000100", 1=>"10000100", 2=>"10000100"), -- 848484 - 161 => (0=>"10110111", 1=>"00000011", 2=>"11001100"), -- B703CC - 162 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 163 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 164 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 165 => (0=>"11001100", 1=>"10100110", 2=>"11011100"), -- CCA6DC - 166 => (0=>"10110111", 1=>"11011100", 2=>"11110000"), -- B7DCF0 - 167 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 168 => (0=>"10000100", 1=>"10000100", 2=>"10000100"), -- 848484 - 169 => (0=>"10100110", 1=>"01110000", 2=>"00000011"), -- A67003 - 170 => (0=>"11001100", 1=>"10100110", 2=>"00000011"), -- CCA603 - 171 => (0=>"11110000", 1=>"11011100", 2=>"00000011"), -- F0DC03 - 173 => (0=>"10100110", 1=>"10000100", 2=>"01110000"), -- A68470 - 174 => (0=>"10110111", 1=>"11011100", 2=>"11110000"), -- B7DCF0 - 175 => (0=>"10110111", 1=>"10110111", 2=>"10110111"), -- B7B7B7 - 176 => (0=>"10010100", 1=>"11001100", 2=>"11001100"), -- 94CCCC - 177 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 178 => (0=>"01100010", 1=>"10010100", 2=>"00000011"), -- 629403 - 179 => (0=>"11011100", 1=>"10100110", 2=>"01010000"), -- DCA650 - 180 => (0=>"00000011", 1=>"01100010", 2=>"01010000"), -- 036250 - 181 => (0=>"11001100", 1=>"01110000", 2=>"00000011"), -- CC7003 - 182 => (0=>"10010100", 1=>"11001100", 2=>"11001100"), -- 94CCCC - 183 => (0=>"11001100", 1=>"11011100", 2=>"10000100"), -- CCDC84 - 184 => (0=>"11001100", 1=>"11011100", 2=>"10000100"), -- CCDC84 - 185 => (0=>"10010100", 1=>"01100010", 2=>"00000011"), -- 946203 - 186 => (0=>"01100010", 1=>"10010100", 2=>"00000011"), -- 629403 - 187 => (0=>"11011100", 1=>"10100110", 2=>"01010000"), -- DCA650 - 188 => (0=>"00000011", 1=>"01100010", 2=>"01010000"), -- 036250 - 189 => (0=>"11001100", 1=>"01110000", 2=>"00000011"), -- CC7003 - 190 => (0=>"10110111", 1=>"10000100", 2=>"01010000"), -- B78450 - 192 => (0=>"11001100", 1=>"11011100", 2=>"10000100"), -- CCDC84 - 193 => (0=>"01110000", 1=>"01000001", 2=>"00000011"), -- 704103 - 194 => (0=>"10100110", 1=>"10000100", 2=>"01010000"), -- A68450 - 195 => (0=>"11011100", 1=>"10100110", 2=>"00000011"), -- DCA603 - 197 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 198 => (0=>"10010100", 1=>"10000100", 2=>"01110000"), -- 948470 - 199 => (0=>"10110111", 1=>"10100110", 2=>"10010100"), -- B7A694 - 200 => (0=>"11011100", 1=>"10100110", 2=>"01010000"), -- DCA650 - 201 => (0=>"01110000", 1=>"01000001", 2=>"00000011"), -- 704103 - 202 => (0=>"10100110", 1=>"10000100", 2=>"01010000"), -- A68450 - 203 => (0=>"11011100", 1=>"10100110", 2=>"00000011"), -- DCA603 - 204 => (0=>"11001100", 1=>"11011100", 2=>"10000100"), -- CCDC84 - 205 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 206 => (0=>"10010100", 1=>"10000100", 2=>"01110000"), -- 948470 - 207 => (0=>"10110111", 1=>"10100110", 2=>"10010100"), -- B7A694 - 208 => (0=>"11011100", 1=>"10100110", 2=>"01010000"), -- DCA650 - 209 => (0=>"11110000", 1=>"00000011", 2=>"10000100"), -- F00384 - 210 => (0=>"11001100", 1=>"11011100", 2=>"10000100"), -- CCDC84 - 212 => (0=>"00000011", 1=>"00000011", 2=>"11110000"), -- 0303F0 - 213 => (0=>"11001100", 1=>"10110111", 2=>"11001100"), -- CCB7CC - 214 => (0=>"10010100", 1=>"11001100", 2=>"11001100"), -- 94CCCC - 215 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 224 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 225 => (0=>"11011100", 1=>"01100010", 2=>"00000011"), -- DC6203 - 227 => (0=>"11011100", 1=>"11011100", 2=>"00000011"), -- DCDC03 - 228 => (0=>"00000011", 1=>"10100110", 2=>"11011100"), -- 03A6DC - 230 => (0=>"10100110", 1=>"11011100", 2=>"11011100"), -- A6DCDC - 232 => (0=>"10100110", 1=>"11011100", 2=>"10100110"), -- A6DCA6 - 234 => (0=>"10110111", 1=>"01110000", 2=>"01100010"), -- B77062 - 236 => (0=>"11110000", 1=>"10100110", 2=>"10010100"), -- F0A694 - 240 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 242 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 243 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 244 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 245 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 247 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 248 => (0=>"10100110", 1=>"10100110", 2=>"11011100"), -- A6A6DC - 249 => (0=>"10100110", 1=>"11011100", 2=>"10100110"), -- A6DCA6 - 250 => (0=>"11001100", 1=>"10010100", 2=>"01110000"), -- CC9470 - 251 => (0=>"10110111", 1=>"01110000", 2=>"01100010"), -- B77062 - 252 => (0=>"11001100", 1=>"01110000", 2=>"10000100"), -- CC7084 - 253 => (0=>"11110000", 1=>"10100110", 2=>"10010100"), -- F0A694 - others => (others => "00000011") - ); - - constant sprite_pal : pal_a(0 to 255) := - ( - 1 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 2 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 3 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 4 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 5 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 7 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 9 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 10 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 11 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 12 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 13 => (0=>"11111111", 1=>"00000011", 2=>"11111111"), -- FF03FF - 14 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 15 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 17 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 18 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 19 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 20 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 21 => (0=>"11111111", 1=>"00000011", 2=>"11111111"), -- FF03FF - 22 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 23 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 25 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 26 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 27 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 28 => (0=>"00000011", 1=>"00110001", 2=>"11111111"), -- 0331FF - 29 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 30 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 31 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 33 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 34 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 35 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 36 => (0=>"00000011", 1=>"00110001", 2=>"11111111"), -- 0331FF - 37 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 38 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 39 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 41 => (0=>"11011100", 1=>"00000011", 2=>"00000011"), -- DC0303 - 42 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 43 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 44 => (0=>"00000011", 1=>"10100110", 2=>"11111111"), -- 03A6FF - 45 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 46 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 47 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 49 => (0=>"11011100", 1=>"00000011", 2=>"00000011"), -- DC0303 - 51 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 52 => (0=>"00000011", 1=>"10100110", 2=>"11111111"), -- 03A6FF - 53 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 54 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 55 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 57 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 58 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 59 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 60 => (0=>"00000011", 1=>"10000100", 2=>"11111111"), -- 0384FF - 61 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 62 => (0=>"10100110", 1=>"11001100", 2=>"11001100"), -- A6CCCC - 63 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 65 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 66 => (0=>"00000011", 1=>"11110000", 2=>"01100010"), -- 03F062 - 67 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 68 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 69 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 71 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 73 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 75 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 76 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 77 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 78 => (0=>"00000011", 1=>"11110000", 2=>"01100010"), -- 03F062 - 79 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 81 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 82 => (0=>"00000011", 1=>"10100110", 2=>"00000011"), -- 03A603 - 83 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 84 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 86 => (0=>"00000011", 1=>"11110000", 2=>"11110000"), -- 03F0F0 - 87 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 89 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 91 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 92 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 94 => (0=>"00000011", 1=>"11110000", 2=>"11110000"), -- 03F0F0 - 95 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 98 => (0=>"11110000", 1=>"10100110", 2=>"00000011"), -- F0A603 - 99 => (0=>"11110000", 1=>"10110111", 2=>"10000100"), -- F0B784 - 100 => (0=>"00000011", 1=>"10010100", 2=>"11011100"), -- 0394DC - 101 => (0=>"11111111", 1=>"11001100", 2=>"10100110"), -- FFCCA6 - 102 => (0=>"11001100", 1=>"11110000", 2=>"11110000"), -- CCF0F0 - 103 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 105 => (0=>"01110000", 1=>"01000001", 2=>"00000011"), -- 704103 - 106 => (0=>"10100110", 1=>"10000100", 2=>"01010000"), -- A68450 - 107 => (0=>"11011100", 1=>"10100110", 2=>"00000011"), -- DCA603 - 109 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 110 => (0=>"10010100", 1=>"10000100", 2=>"01110000"), -- 948470 - 111 => (0=>"10110111", 1=>"10100110", 2=>"10010100"), -- B7A694 - 113 => (0=>"11110000", 1=>"00110001", 2=>"00110001"), -- F03131 - 114 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 115 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 116 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 117 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 118 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 119 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 121 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 122 => (0=>"10000100", 1=>"11001100", 2=>"00000011"), -- 84CC03 - 123 => (0=>"11111111", 1=>"10110111", 2=>"00000011"), -- FFB703 - 124 => (0=>"00000011", 1=>"01000001", 2=>"11011100"), -- 0341DC - 125 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 126 => (0=>"00000011", 1=>"10010100", 2=>"00000011"), -- 039403 - 127 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 129 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 130 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 131 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 132 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 133 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 135 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 137 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 138 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 139 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 140 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 141 => (0=>"11111111", 1=>"00000011", 2=>"11111111"), -- FF03FF - 142 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 143 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 145 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 146 => (0=>"01100010", 1=>"01100010", 2=>"01100010"), -- 626262 - 147 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 148 => (0=>"00000011", 1=>"00000011", 2=>"11111111"), -- 0303FF - 149 => (0=>"11111111", 1=>"00000011", 2=>"11111111"), -- FF03FF - 150 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 151 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 153 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 154 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 155 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 156 => (0=>"00000011", 1=>"00110001", 2=>"11111111"), -- 0331FF - 157 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 158 => (0=>"00000011", 1=>"11111111", 2=>"11111111"), -- 03FFFF - 159 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 161 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 162 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 163 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 164 => (0=>"00000011", 1=>"00110001", 2=>"11111111"), -- 0331FF - 165 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 166 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 167 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 169 => (0=>"11011100", 1=>"00000011", 2=>"00000011"), -- DC0303 - 170 => (0=>"00000011", 1=>"11111111", 2=>"00000011"), -- 03FF03 - 171 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 172 => (0=>"00000011", 1=>"10100110", 2=>"11111111"), -- 03A6FF - 173 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 174 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 175 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 177 => (0=>"11011100", 1=>"00000011", 2=>"00000011"), -- DC0303 - 179 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 180 => (0=>"00000011", 1=>"10100110", 2=>"11111111"), -- 03A6FF - 181 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 182 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 183 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 185 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 186 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 187 => (0=>"11111111", 1=>"10100110", 2=>"00000011"), -- FFA603 - 188 => (0=>"00000011", 1=>"10000100", 2=>"11111111"), -- 0384FF - 189 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 190 => (0=>"10100110", 1=>"11001100", 2=>"11001100"), -- A6CCCC - 191 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 193 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 194 => (0=>"00000011", 1=>"11110000", 2=>"01100010"), -- 03F062 - 195 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 196 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 197 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 199 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 201 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 203 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 204 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 205 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 206 => (0=>"00000011", 1=>"11110000", 2=>"01100010"), -- 03F062 - 207 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 209 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 210 => (0=>"00000011", 1=>"10100110", 2=>"00000011"), -- 03A603 - 211 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 212 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 214 => (0=>"00000011", 1=>"11110000", 2=>"11110000"), -- 03F0F0 - 215 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 217 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 219 => (0=>"11111111", 1=>"11111111", 2=>"00000011"), -- FFFF03 - 220 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 222 => (0=>"00000011", 1=>"11110000", 2=>"11110000"), -- 03F0F0 - 223 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 226 => (0=>"11110000", 1=>"10100110", 2=>"00000011"), -- F0A603 - 227 => (0=>"11110000", 1=>"10110111", 2=>"10000100"), -- F0B784 - 228 => (0=>"00000011", 1=>"10010100", 2=>"11011100"), -- 0394DC - 229 => (0=>"11111111", 1=>"11001100", 2=>"10100110"), -- FFCCA6 - 230 => (0=>"11001100", 1=>"11110000", 2=>"11110000"), -- CCF0F0 - 231 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 233 => (0=>"01110000", 1=>"01000001", 2=>"00000011"), -- 704103 - 234 => (0=>"10100110", 1=>"10000100", 2=>"01010000"), -- A68450 - 235 => (0=>"11011100", 1=>"10100110", 2=>"00000011"), -- DCA603 - 237 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 238 => (0=>"10010100", 1=>"10000100", 2=>"01110000"), -- 948470 - 239 => (0=>"10110111", 1=>"10100110", 2=>"10010100"), -- B7A694 - 241 => (0=>"11110000", 1=>"00110001", 2=>"00110001"), -- F03131 - 242 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 243 => (0=>"10100110", 1=>"01100010", 2=>"00000011"), -- A66203 - 244 => (0=>"00000011", 1=>"01000001", 2=>"11111111"), -- 0341FF - 245 => (0=>"11111111", 1=>"10100110", 2=>"10000100"), -- FFA684 - 246 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 247 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - 249 => (0=>"11111111", 1=>"00000011", 2=>"00000011"), -- FF0303 - 250 => (0=>"10000100", 1=>"11001100", 2=>"00000011"), -- 84CC03 - 251 => (0=>"11111111", 1=>"10110111", 2=>"00000011"), -- FFB703 - 252 => (0=>"00000011", 1=>"01000001", 2=>"11011100"), -- 0341DC - 253 => (0=>"11111111", 1=>"11111111", 2=>"11111111"), -- FFFFFF - 254 => (0=>"00000011", 1=>"10010100", 2=>"00000011"), -- 039403 - 255 => (0=>"11110000", 1=>"11110000", 2=>"11110000"), -- F0F0F0 - others => (others => "00000011") - ); - -- table of sprite heights type prom_a is array (natural range <>) of integer range 0 to 3; --- ldrun --- constant sprite_prom : prom_a(0 to 31) := --- ( --- 4 => 0, --- 5 => 0, --- 6 => 0, --- 7 => 0, --- 12 => 0, --- 13 => 0, --- 14 => 0, --- 15 => 0, --- 20 => 0, --- 21 => 0, --- 22 => 0, --- 23 => 0, --- 28 => 0, --- 29 => 0, --- 30 => 0, --- 31 => 0, --- others => 1 --- ); - --- kungfum --- constant sprite_prom : prom_a(0 to 31) := --- ( --- 0 => 0, --- 1 => 0, --- 8 => 0, --- 9 => 0, --- 12 => 2, --- 13 => 2, --- 14 => 2, --- 15 => 2, --- 16 => 0, --- 21 => 0, --- 23 => 0, --- 24 => 0, --- 27 => 0, --- others => 1 --- ); end package platform_variant_pkg; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd deleted file mode 100644 index 99087b74..00000000 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_controller.vhd +++ /dev/null @@ -1,482 +0,0 @@ -library IEEE; -use ieee.std_logic_1164.all; -use ieee.numeric_std.all; - -library work; -use work.video_controller_pkg.all; -use ieee.numeric_std.all; - -entity pace_video_controller is - generic - ( - CONFIG : PACEVideoController_t := PACE_VIDEO_NONE; - DELAY : integer := 1; - V_SIZE : integer; - L_CROP : integer range 0 to 255; - R_CROP : integer range 0 to 255; - H_SCALE : integer; - V_SCALE : integer; - H_SYNC_POL : std_logic := '1'; - V_SYNC_POL : std_logic := '1'; - BORDER_RGB : RGB_t := RGB_BLACK - ); - port - ( - -- clocking etc - video_i : in from_VIDEO_t; - H_SIZE : integer; - - -- register interface - reg_i : in VIDEO_REG_t; - - -- video input data - rgb_i : in RGB_t; - - -- control signals (out) - video_ctl_o : out from_VIDEO_CTL_t; - - -- video output control & data - video_o : out to_VIDEO_t - ); -end pace_video_controller; - -architecture SYN of pace_video_controller is - - constant SIM_DELAY : time := 2 ns; - - signal VIDEO_H_SIZE : integer; - constant VIDEO_V_SIZE : integer := V_SIZE * V_SCALE; - - subtype reg_t is integer range 0 to 2047; - - alias clk : std_logic is video_i.clk; - alias clk_ena : std_logic is video_i.clk_ena; - alias reset : std_logic is video_i.reset; - - -- registers - signal h_front_porch_r : reg_t := 0; - signal h_sync_r : reg_t := 0; - signal h_back_porch_r : reg_t := 0; - signal h_border_r : reg_t := 0; - signal h_video_r : reg_t := 0; - signal v_front_porch_r : reg_t := 0; - signal v_sync_r : reg_t := 0; - signal v_back_porch_r : reg_t := 0; - signal v_border_r : reg_t := 0; - signal v_video_r : reg_t := 0; - - signal border_rgb_r : RGB_t := ((others=>'0'), (others=>'0'), (others=>'0')); - - -- derived values - signal h_sync_start : reg_t := 0; - signal h_back_porch_start : reg_t := 0; - signal h_left_border_start : reg_t := 0; - signal h_video_start : reg_t := 0; - signal h_right_border_start : reg_t := 0; - signal h_line_end : reg_t := 0; - signal v_sync_start : reg_t := 0; - signal v_back_porch_start : reg_t := 0; - signal v_top_border_start : reg_t := 0; - signal v_video_start : reg_t := 0; - signal v_bottom_border_start : reg_t := 0; - signal v_screen_end : reg_t := 0; - - signal hsync_s : std_logic := '0'; - signal vsync_s : std_logic := '0'; - signal hactive_s : std_logic := '0'; - signal vactive_s : std_logic := '0'; - signal hblank_s : std_logic := '0'; - signal vblank_s : std_logic := '0'; - - subtype count_t is integer range 0 to 2047; - signal x_count : count_t := 0; - signal y_count : count_t := 0; - - signal x_s : unsigned(10 downto 0) := (others => '0'); - signal y_s : unsigned(10 downto 0) := (others => '0'); - - --signal extended_reset : std_logic := '1'; - alias extended_reset : std_logic is video_i.reset; - -begin - - VIDEO_H_SIZE <= H_SIZE * H_SCALE; - video_ctl_o.video_h_offset <= to_integer(shift_right(to_unsigned(512-VIDEO_H_SIZE, 9), 1)); - - -- registers - reg_proc: process (reset, clk, VIDEO_H_SIZE) - - begin - --if reset = '1' then - case CONFIG is - - when PACE_VIDEO_VGA_240x320_60Hz => - -- P3M, clk=11.136MHz, clk_ena=5.568MHz - h_front_porch_r <= 272-240; - h_sync_r <= 5; - h_back_porch_r <= 22; - h_border_r <= (240-VIDEO_H_SIZE)/2; - v_front_porch_r <= 326-320; - v_sync_r <= 1; - v_back_porch_r <= 5; - v_border_r <= (320-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_320x480_60Hz => - -- VGA, clk=12.588MHz - --# 320x240 @ 60 Hz, 31.5 kHz hsync, 4:3 aspect ratio - --Modeline "320x240" 12.588 320 336 384 400 240 245 246 262 Doublescan - h_front_porch_r <= 16; - h_sync_r <= 48; - h_back_porch_r <= 16; - h_border_r <= (320-VIDEO_H_SIZE)/2; - v_front_porch_r <= (5*2); - v_sync_r <= (1*2); - v_back_porch_r <= (16*2); - v_border_r <= (480-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_640x480_60Hz => - -- VGA, clk=25.175MHz - h_front_porch_r <= 16; - h_sync_r <= 96; - h_back_porch_r <= 48; - h_border_r <= (640-VIDEO_H_SIZE)/2; - v_front_porch_r <= 10; - v_sync_r <= 2; - v_back_porch_r <= 33; - v_border_r <= (480-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_800x600_60Hz => - -- SVGA, clk=40MHz - h_front_porch_r <= 40; - h_sync_r <= 128; - h_back_porch_r <= 88; - h_border_r <= (800-VIDEO_H_SIZE)/2; - v_front_porch_r <= 1; - v_sync_r <= 4; - v_back_porch_r <= 23; - v_border_r <= (600-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_1024x768_60Hz => - -- XVGA, clk=65MHz - h_front_porch_r <= 24; - h_sync_r <= 136; - h_back_porch_r <= 160; - h_border_r <= (1024-VIDEO_H_SIZE)/2; - v_front_porch_r <= 3; - v_sync_r <= 6; - v_back_porch_r <= 29; - v_border_r <= (768-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_1366x768_60Hz => - -- XVGA(NAVICO ROCKY), clk=72MHz - h_front_porch_r <= 88; --64; - h_sync_r <= 44; --112; - h_back_porch_r <= 148; --248; - h_border_r <= (1366-VIDEO_H_SIZE)/2; - v_front_porch_r <= 4; --3; - v_sync_r <= 5; --6; - v_back_porch_r <= 36; --18; - v_border_r <= (768-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_1280x800_60Hz => - -- Sentinel Mode 36, clk=103.2MHz - h_front_porch_r <= 64; - h_sync_r <= 32; - h_back_porch_r <= 362-32-64; - h_border_r <= (1280-VIDEO_H_SIZE)/2; - v_front_porch_r <= 3; - v_sync_r <= 4; - v_back_porch_r <= 38-4-3; - v_border_r <= (800-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_1280x1024_60Hz => - -- SXGA, clk=108MHz - h_front_porch_r <= 48; - h_sync_r <= 112; - h_back_porch_r <= 248; - h_border_r <= (1280-VIDEO_H_SIZE)/2; - v_front_porch_r <= 1; - v_sync_r <= 3; - v_back_porch_r <= 38; - v_border_r <= (1024-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_VGA_1680x1050_60Hz => - -- WSXGA+, clk=147.14MHz - h_front_porch_r <= 104; - h_sync_r <= 184; - h_back_porch_r <= 288; - v_front_porch_r <= 1; - v_sync_r <= 3; - v_back_porch_r <= 33; - -- WSXGA+, clk=118MHz - --h_front_porch_r <= 48; - --h_sync_r <= 32; - --h_back_porch_r <= 80; - --v_front_porch_r <= 3; - --v_sync_r <= 6; - --v_back_porch_r <= 21; - h_border_r <= (1680-VIDEO_H_SIZE)/2; - v_border_r <= (1050-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_ARCADE_STD_336x240_60Hz => - -- arcade standard resolution, clk=7.16MHz - h_front_porch_r <= 34; - h_sync_r <= 34; - h_back_porch_r <= 51; - h_border_r <= (336-VIDEO_H_SIZE)/2; - v_front_porch_r <= 3; - v_sync_r <= 3; - v_back_porch_r <= 16; - v_border_r <= (240-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_ARCADE_STD_336x240_60Hz_28M64 => - -- arcade standard resolution, clk=28.64MHz - h_front_porch_r <= 4*34; - h_sync_r <= 4*34; - h_back_porch_r <= 4*51; - h_border_r <= 4*(336-VIDEO_H_SIZE)/2; - v_front_porch_r <= 3; - v_sync_r <= 3; - v_back_porch_r <= 16; - v_border_r <= (240-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_CVBS_720x288p_50Hz => - -- generic composite, clk=13.5MHz - h_front_porch_r <= (8+12); - h_sync_r <= 64; - h_back_porch_r <= (144-64-(8+12)); - h_border_r <= (720-VIDEO_H_SIZE)/2; - v_front_porch_r <= 1; - v_sync_r <= 3; - v_back_porch_r <= 20; - v_border_r <= (288-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_LCM_320x240_60Hz => - -- DE1/2, clk=18MHz - h_front_porch_r <= 59; - h_sync_r <= 1; - h_back_porch_r <= 151; - h_border_r <= (320-VIDEO_H_SIZE)*3/2; - v_front_porch_r <= 8; - v_sync_r <= 1; - v_back_porch_r <= 13; - v_border_r <= (240-VIDEO_V_SIZE)/2; - - when PACE_VIDEO_IREMM62 => - -- Irem M62 original timings - -- 512x282@8MHz or 384x282@6Mhz, (384x256 or 256x256 active display), 55 Hz - -- use 312 lines here, for 50 Hz PAL compatiblity. - h_front_porch_r <= 12; - h_sync_r <= 38; - h_back_porch_r <= 62; - h_border_r <= 0;--(576-VIDEO_H_SIZE)/2; - v_front_porch_r <= 10+15; - v_sync_r <= 3; - v_back_porch_r <= 13+15; - v_border_r <= 0;--(288-VIDEO_V_SIZE)/2; - - when others => - null; - end case; - - h_video_r <= VIDEO_H_SIZE; - v_video_r <= VIDEO_V_SIZE; - border_rgb_r <= BORDER_RGB; - - --end if; - end process reg_proc; - - -- register some arithmetic - init_proc: process (reset, clk, clk_ena) - begin - if reset = '1' then - null; - elsif rising_edge(clk) then - h_sync_start <= h_front_porch_r - 1; - h_back_porch_start <= h_sync_start + h_sync_r; - h_left_border_start <= h_back_porch_start + h_back_porch_r; - h_video_start <= h_left_border_start + h_border_r; - h_right_border_start <= h_video_start + h_video_r; - h_line_end <= h_right_border_start + h_border_r; - v_sync_start <= v_front_porch_r - 1; - v_back_porch_start <= v_sync_start + v_sync_r; - v_top_border_start <= v_back_porch_start + v_back_porch_r; - v_video_start <= v_top_border_start + v_border_r; - v_bottom_border_start <= v_video_start + v_video_r; - v_screen_end <= v_bottom_border_start + v_border_r; - end if; - end process init_proc; - - reset_proc: process (reset, clk) - variable count_v : integer; - begin - if reset = '1' then - --extended_reset <= '1'; - count_v := 7; - elsif rising_edge(clk) then - if count_v = 0 then - --extended_reset <= '0'; - else - count_v := count_v - 1; - end if; - end if; - end process reset_proc; - - -- video control outputs - timer_proc: process (extended_reset, clk, clk_ena) - begin - if extended_reset = '1' then - hblank_s <= '1'; - vblank_s <= '1'; - hactive_s <= '0'; - vactive_s <= '0'; - hsync_s <= not H_SYNC_POL; - x_count <= 0; - y_count <= 0; - elsif rising_edge(clk) and clk_ena = '1' then - if x_count = h_line_end then - hblank_s <= '1'; - hactive_s <= '0'; -- for 0 borders - if y_count = v_screen_end then - vblank_s <= '1'; - vactive_s <= '0'; -- for 0 borders - y_count <= 0; - else - y_s <= y_s + 1; - if y_count = v_sync_start then - vsync_s <= V_SYNC_POL; - elsif y_count = v_back_porch_start then - vsync_s <= not V_SYNC_POL; - elsif y_count = v_video_start then - vblank_s <= '0'; -- for 0 borders - vactive_s <= '1'; - y_s <= (others => '0'); - -- check the borders last in case they're 0 - elsif y_count = v_top_border_start then - vblank_s <= '0'; - elsif y_count = v_bottom_border_start then - vactive_s <= '0'; - end if; - y_count <= y_count + 1; - end if; - x_count <= 0; - else - x_s <= x_s + 1; - if x_count = h_sync_start then - hsync_s <= H_SYNC_POL; - elsif x_count = h_back_porch_start then - hsync_s <= not H_SYNC_POL; - elsif x_count = h_video_start then - hblank_s <= '0'; -- for 0 borders - hactive_s <= '1'; - x_s <= (others => '0'); - -- check the borders last in case they're 0 - elsif x_count = h_left_border_start then - hblank_s <= '0'; - elsif x_count = h_right_border_start then - hactive_s <= '0'; - end if; - x_count <= x_count + 1; - end if; - end if; -- rising_edge(clk) and clk_ena = '1' - end process timer_proc; - - -- pass-through for tile/bitmap & sprite controllers - video_ctl_o.clk <= clk; - video_ctl_o.clk_ena <= clk_ena; - - -- for video DACs and TFT output - video_o.clk <= clk; - - BLK_VIDEO_O : block - - constant PIPELINE_DELAY : natural := DELAY+1; - - -- won't synthesize correctly under ISE if these are variables - signal hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - signal vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - - begin - - video_o_proc: process (extended_reset, clk, clk_ena) - variable hsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - variable vsync_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - --variable hactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - --variable vactive_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - variable hblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - variable vblank_v_r : std_logic_vector(PIPELINE_DELAY-1 downto 0) := (others => '0'); - alias hsync_v : std_logic is hsync_v_r(hsync_v_r'left); - alias vsync_v : std_logic is vsync_v_r(vsync_v_r'left); - alias hactive_v : std_logic is hactive_v_r(hactive_v_r'left); - alias vactive_v : std_logic is vactive_v_r(vactive_v_r'left); - alias hblank_v : std_logic is hblank_v_r(hblank_v_r'left); - alias vblank_v : std_logic is vblank_v_r(vblank_v_r'left); - variable stb_cnt_v : unsigned(3 downto 0); -- up to 16x scaling - begin - if extended_reset = '1' then - hsync_v_r := (others => not H_SYNC_POL); - vsync_v_r := (others => not V_SYNC_POL); - hactive_v_r <= (others => '0'); - vactive_v_r <= (others => '0'); - hblank_v_r := (others => '0'); - vblank_v_r := (others => '0'); - stb_cnt_v := (others => '1'); - elsif rising_edge(clk) and clk_ena = '1' then - - -- hblank - -- register control signals and handle scaling --- video_ctl_o.hblank <= not hactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers - video_ctl_o.vblank <= not vactive_s after SIM_DELAY; -- used only by the bitmap/tilemap/sprite controllers - -- handle scaling - video_ctl_o.stb <= stb_cnt_v(H_SCALE-1) after SIM_DELAY; - if hactive_s = '1' and vactive_s = '1' then - stb_cnt_v := stb_cnt_v + 2; - elsif hblank_s = '0' and vblank_s = '0' then - stb_cnt_v := (others => '1'); - end if; - video_ctl_o.x <= std_logic_vector(resize(x_s(x_s'left downto H_SCALE-1), video_ctl_o.x'length)) after SIM_DELAY; - video_ctl_o.y <= std_logic_vector(resize(y_s(y_s'left downto V_SCALE-1), video_ctl_o.y'length)) after SIM_DELAY; - - -- register video outputs - if hactive_v = '1' and vactive_v = '1' then - -- set hblank used only by the bitmap/tilemap/sprite controllers early - if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY-7) or - x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY-7) then - video_ctl_o.hblank <= '1'; - else - video_o.rgb <= rgb_i after SIM_DELAY; - video_ctl_o.hblank <= '0'; -- used only by the bitmap/tilemap/sprite controllers - end if; - - -- active video - if x_s(x_s'left downto H_SCALE-1) < (L_CROP + PIPELINE_DELAY) or - x_s(x_s'left downto H_SCALE-1) >= (H_SIZE - R_CROP + PIPELINE_DELAY) then - video_o.rgb <= RGB_BLACK after SIM_DELAY; - else - video_o.rgb <= rgb_i after SIM_DELAY; - end if; - elsif hblank_v = '0' and vblank_v = '0' then - -- border - video_o.rgb <= border_rgb_r after SIM_DELAY; - else - video_o.rgb.r <= (others => '0') after SIM_DELAY; - video_o.rgb.g <= (others => '0') after SIM_DELAY; - video_o.rgb.b <= (others => '0') after SIM_DELAY; - end if; - video_o.hsync <= hsync_v after SIM_DELAY; - video_o.vsync <= vsync_v after SIM_DELAY; - video_o.hblank <= hblank_v after SIM_DELAY; - video_o.vblank <= vblank_v after SIM_DELAY; - -- pipelined signals - hsync_v_r := hsync_v_r(hsync_v_r'left-1 downto 0) & hsync_s; - vsync_v_r := vsync_v_r(vsync_v_r'left-1 downto 0) & vsync_s; - hactive_v_r <= hactive_v_r(hactive_v_r'left-1 downto 0) & hactive_s; - vactive_v_r <= vactive_v_r(vactive_v_r'left-1 downto 0) & vactive_s; - hblank_v_r := hblank_v_r(hblank_v_r'left-1 downto 0) & hblank_s; - vblank_v_r := vblank_v_r(vblank_v_r'left-1 downto 0) & vblank_s; - end if; - end process video_o_proc; - - end block BLK_VIDEO_O; - -end SYN; From 9a02517201eccd3ae01de3017739aec3eb42e974 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 12:47:05 +0100 Subject: [PATCH 3/9] IremM62: enable 2 player controls for Lode Runner 4 --- Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra | 1 + Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra index 566812f9..4d05bfcb 100644 --- a/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra +++ b/Arcade_MiST/IremM62 Hardware/meta/Lode Runner 4.mra @@ -6,6 +6,7 @@ iremm62 + diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 5aa277f3..8d3808be 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -40,7 +40,7 @@ localparam CONF_STR = { "O34,Scanlines,Off,25%,50%,75%;", "O5,Blending,Off,On;", "DIP;", - "O6,Service,Off,On;", + "O7,Service,Off,On;", "T0,Reset;", "V,v1.0.",`BUILD_DATE }; @@ -49,14 +49,19 @@ wire palmode = status[1]; wire rotate = status[2]; wire [1:0] scanlines = status[4:3]; wire blend = status[5]; -wire service = status[6]; +wire service = status[7]; +wire joyswap = status[6]; reg [1:0] orientation = 2'b10; +reg oneplayer; wire [7:0] DSW1 = {/*coinage*/4'hf, ~status[11:8]}; always @(*) begin orientation = 2'b10; + oneplayer = 1; + case (core_mod) + 7'h3: oneplayer = 0; // LDRUN4 7'h6: orientation = 2'b11; // BATTROAD 7'hB: orientation = 2'b01; // YOUJYUDN default: ; @@ -339,8 +344,8 @@ arcade_inputs inputs ( .joystick_1 ( joystick_1 ), .rotate ( rotate ), .orientation ( orientation ), - .joyswap ( 1'b0 ), - .oneplayer ( 1'b1 ), + .joyswap ( joyswap ), + .oneplayer ( oneplayer ), .controls ( {m_tilt, m_coin4, m_coin3, m_coin2, m_coin1, m_four_players, m_three_players, m_two_players, m_one_player} ), .player1 ( {m_fireF, m_fireE, m_fireD, m_fireC, m_fireB, m_fireA, m_up, m_down, m_left, m_right} ), .player2 ( {m_fire2F, m_fire2E, m_fire2D, m_fire2C, m_fire2B, m_fire2A, m_up2, m_down2, m_left2, m_right2} ) From bbf75222113d7333dff5a022a82fd31317ce04dc Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 15:42:56 +0100 Subject: [PATCH 4/9] Move jt5205 to common --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 6 +++--- .../IremM62 Hardware/rtl => common/Sound}/jt5205/LICENSE | 0 .../IremM62 Hardware/rtl => common/Sound}/jt5205/README.md | 0 .../IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205.qip | 0 .../IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205.v | 0 .../rtl => common/Sound}/jt5205/jt5205_adpcm.v | 0 .../rtl => common/Sound}/jt5205/jt5205_interpol2x.v | 0 .../rtl => common/Sound}/jt5205/jt5205_timing.v | 6 +++--- 8 files changed, 6 insertions(+), 6 deletions(-) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/LICENSE (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/README.md (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205.qip (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205.v (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205_adpcm.v (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205_interpol2x.v (100%) rename {Arcade_MiST/IremM62 Hardware/rtl => common/Sound}/jt5205/jt5205_timing.v (94%) diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index ab2cdabc..759c007f 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -235,6 +235,7 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(IremM62_MiST) # --------------------------- set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM62_MiST.sv set_global_assignment -name VHDL_FILE rtl/target_top.vhd set_global_assignment -name VHDL_FILE rtl/platform_variant_pkg.vhd @@ -263,8 +264,8 @@ set_global_assignment -name VHDL_FILE rtl/spram.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/sdram.sv set_global_assignment -name VHDL_FILE rtl/pll_mist.vhd set_global_assignment -name SYSTEMVERILOG_FILE rtl/YM2149.sv -set_global_assignment -name QIP_FILE rtl/jt5205/jt5205.qip set_global_assignment -name VHDL_FILE rtl/Sound_Board.vhd +set_global_assignment -name QIP_FILE ../../common/Sound/jt5205/jt5205.qip set_global_assignment -name QIP_FILE ../../common/mist/mist.qip set_global_assignment -name QIP_FILE ../../common/CPU/T80/T80.qip set_global_assignment -name VHDL_FILE ../../common/CPU/T80/Z80.vhd @@ -273,5 +274,4 @@ set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp -set_global_assignment -name SIGNALTAP_FILE output_files/snd.stp -set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file +set_global_assignment -name SIGNALTAP_FILE output_files/snd.stp \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE b/common/Sound/jt5205/LICENSE similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/LICENSE rename to common/Sound/jt5205/LICENSE diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md b/common/Sound/jt5205/README.md similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/README.md rename to common/Sound/jt5205/README.md diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip b/common/Sound/jt5205/jt5205.qip similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.qip rename to common/Sound/jt5205/jt5205.qip diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v b/common/Sound/jt5205/jt5205.v similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205.v rename to common/Sound/jt5205/jt5205.v diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v b/common/Sound/jt5205/jt5205_adpcm.v similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_adpcm.v rename to common/Sound/jt5205/jt5205_adpcm.v diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_interpol2x.v b/common/Sound/jt5205/jt5205_interpol2x.v similarity index 100% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_interpol2x.v rename to common/Sound/jt5205/jt5205_interpol2x.v diff --git a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v b/common/Sound/jt5205/jt5205_timing.v similarity index 94% rename from Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v rename to common/Sound/jt5205/jt5205_timing.v index 2906f1ed..a8dd1f09 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/jt5205/jt5205_timing.v +++ b/common/Sound/jt5205/jt5205_timing.v @@ -41,12 +41,12 @@ end always @(posedge clk) begin - if (lim == 1) begin - cnt <= 1'b0; + if (sel == 2'd3) begin + cnt <= 7'd0; vclk_o <= 1'b0; end if(cen) begin - if (lim != 1) cnt <= cnt + 7'd1; + if (sel != 2'd3) cnt <= cnt + 7'd1; pre <= 1'b0; preb <= 1'b0; From d605552e9e3a861d75787fc06966a425248f2293 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 18:58:42 +0100 Subject: [PATCH 5/9] Robotron HW: add a vblank signal, fix the blitter for Bubbles --- .../rtl/robotron_cpu/robotron_cpu.vhd | 25 ++++++++++++------- .../rtl/robotron_cpu/sc1.vhd | 3 --- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/robotron_cpu.vhd b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/robotron_cpu.vhd index d2eee8b4..92398aaa 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/robotron_cpu.vhd +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/robotron_cpu.vhd @@ -124,8 +124,8 @@ entity robotron_cpu is SIN_FIRE : in std_logic; SIN_BOMB : in std_logic; - -- To sound board - HAND : in std_logic := '1'; + -- To sound board + HAND : in std_logic := '1'; PB : out std_logic_vector(5 downto 0) ); end robotron_cpu; @@ -159,7 +159,8 @@ architecture Behavioral of robotron_cpu is signal horizontal_sync : std_logic; signal vertical_sync : std_logic; - signal video_blank : boolean := true; + signal video_hblank : boolean := true; + signal video_vblank : boolean := true; ------------------------------------------------------------------- @@ -519,10 +520,16 @@ begin if clock_12_phase(5) = '1' then if std_match(video_address(5 downto 0), "11-1--") then - video_blank <= true; + video_hblank <= true; elsif std_match(video_address(5 downto 0), "0---1-") then - video_blank <= false; + video_hblank <= false; end if; + if std_match(video_address(13 downto 6), "11111---") then + video_vblank <= true; + elsif std_match(video_address(13 downto 6), "00000000") then + video_vblank <= false; + end if; + end if; if clock_12_phase( 0) = '1' or @@ -533,7 +540,7 @@ begin ram_lower_enable <= true; ram_upper_enable <= true; - if video_blank then + if video_hblank or video_vblank then vgaRed <= (others => '0'); vgaGreen <= (others => '0'); vgaBlue <= (others => '0'); @@ -548,7 +555,7 @@ begin clock_12_phase( 5) = '1' or clock_12_phase( 9) = '1' then pixel_nibbles <= memory_data_in; - end if; + end if; if clock_12_phase( 2) = '1' or clock_12_phase( 6) = '1' or clock_12_phase(10) = '1' then @@ -556,7 +563,7 @@ begin pixel_byte_l <= color_table(to_integer(unsigned(pixel_nibbles(3 downto 0)))); pixel_byte_h <= color_table(to_integer(unsigned(pixel_nibbles(7 downto 4)))); - if video_blank then + if video_hblank or video_vblank then vgaRed <= (others => '0'); vgaGreen <= (others => '0'); vgaBlue <= (others => '0'); @@ -743,7 +750,7 @@ begin blt: entity work.sc1 port map( clk => clock, - sc2 => blitter_sc2, + sc2 => blitter_sc2, reg_cs => blt_reg_cs, reg_data_in => blt_reg_data_in, diff --git a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/sc1.vhd b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/sc1.vhd index d40a0fe2..ce0f79eb 100644 --- a/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/sc1.vhd +++ b/Arcade_MiST/Williams 6809 rev.1 Hardware/Robotron Hardware/rtl/robotron_cpu/sc1.vhd @@ -177,9 +177,6 @@ begin blt_shift <= (others => '0'); state <= state_src; - if reg_width = 0 or reg_height = 0 then - state <= state_idle; - end if; end if; when state_src => From c978469c62955212adf32c18eba650c34c642813 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Mon, 16 Mar 2020 19:21:40 +0100 Subject: [PATCH 6/9] IremM62: sprite/tilemap position adjust --- Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd | 2 +- Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd index d6b3d8d1..f8b55288 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/spritectl.vhd @@ -149,7 +149,7 @@ begin end if; if video_ctl.stb = '1' then - x := unsigned(reg_i.x) + 256 - 64 + PACE_VIDEO_PIPELINE_DELAY; + x := unsigned(reg_i.x) + 256 - 64 + PACE_VIDEO_PIPELINE_DELAY + 1; if hwsel /= HW_KIDNIKI then x:=x-8; end if; if hires = '0' then x := x - 64; end if; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index a1454861..40273437 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -61,7 +61,8 @@ begin ctl_o.tile_a(ctl_o.tile_a'left downto 15) <= (others => '0'); -- tilemap scroll - x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128 + 8) when unsigned(y) < 6*8 and HWSEL = HW_KUNGFUM else + x <= std_logic_vector(unsigned(video_ctl.x) - 256 + 128 + 8) when unsigned(y) < 6*8 and hwsel = HW_KUNGFUM else + std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64 + 10) when hwsel = HW_LDRUN4 else std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 64 + 8) when hires = '1' else std_logic_vector(unsigned(video_ctl.x) - 256 + unsigned(hscroll(8 downto 0)) + 128 + 8); y <= std_logic_vector(unsigned(video_ctl.y) - 256 + unsigned(vscroll(8 downto 0)) + 128) when hwsel = HW_SPELUNKR or hwsel = HW_SPELUNK2 else From f83fe1c55436884ef39a99b4340f71cf3be88751 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 19 Mar 2020 12:32:01 +0100 Subject: [PATCH 7/9] IremM62: implement sprite/tilemap priority handling --- Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD | 5 +-- Arcade_MiST/IremM62 Hardware/rtl/pace.vhd | 3 ++ Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 32 ++++++++++++++++++- .../IremM62 Hardware/rtl/sprite_array.vhd | 4 +-- .../IremM62 Hardware/rtl/sprite_pkg.vhd | 1 - .../IremM62 Hardware/rtl/tilemapctl.vhd | 1 + .../IremM62 Hardware/rtl/video_mixer.vhd | 4 +-- 7 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD index 98d367e6..5e70698a 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD +++ b/Arcade_MiST/IremM62 Hardware/rtl/Graphics.VHD @@ -28,6 +28,7 @@ entity Graphics is sprite_ctl_i : in to_SPRITE_CTL_t; sprite_ctl_o : out from_SPRITE_CTL_t; spr0_hit : out std_logic; + sprite_pri : in std_logic; sprite_rgb : in RGB_t; graphics_i : in to_GRAPHICS_t; @@ -47,8 +48,6 @@ architecture SYN of Graphics is signal bitmap_ctl_o_s : from_BITMAP_CTL_a(1 to PACE_VIDEO_NUM_BITMAPS); signal tilemap_ctl_o_s : from_TILEMAP_CTL_a(1 to PACE_VIDEO_NUM_TILEMAPS); signal sprite_ctl_o_s : from_SPRITE_CTL_t; - signal sprite_pri : std_logic; - signal rgb_data : RGB_t; -- before OSD is mixed in @@ -229,7 +228,6 @@ begin GEN_NO_SPRITES : if PACE_VIDEO_NUM_SPRITES = 0 generate sprite_ctl_o_s <= ((others => '0'), '0', (others => '0')); - sprite_pri <= '0'; spr0_hit <= '0'; end generate GEN_NO_SPRITES; @@ -261,7 +259,6 @@ begin pal_a => sprite_ctl_o_s.pal_a, set => sprite_ctl_o_s.set, - pri => sprite_pri, spr0_set => spr0_hit ); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd index d19bf44c..ccb93af1 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/pace.vhd @@ -74,6 +74,7 @@ architecture SYN of PACE is signal to_sprite_ctl2 : to_SPRITE_CTL_t; signal from_sprite_ctl : from_SPRITE_CTL_t; signal spr0_hit : std_logic; + signal sprite_pri : std_logic; signal to_graphics : to_GRAPHICS_t; signal from_graphics : from_GRAPHICS_t; @@ -132,6 +133,7 @@ begin sprite_o => to_sprite_ctl, spr0_hit => spr0_hit, sprite_rgb => sprite_rgb, + sprite_pri => sprite_pri, graphics_i => from_graphics, graphics_o => to_graphics, @@ -173,6 +175,7 @@ begin sprite_ctl_i => to_sprite_ctl, sprite_ctl_o => from_sprite_ctl, spr0_hit => spr0_hit, + sprite_pri => sprite_pri, sprite_rgb => sprite_rgb, graphics_i => to_graphics, diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index 8a414934..28dfec6c 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -44,6 +44,7 @@ entity platform is sprite_i : in from_SPRITE_CTL_t; sprite_o : out to_SPRITE_CTL_t; spr0_hit : in std_logic; + sprite_pri : out std_logic; sprite_rgb : out RGB_t; -- various graphics information @@ -854,7 +855,6 @@ begin hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or - hwsel = HW_LDRUN4 or hwsel = HW_BATTROAD else sprite_i.pal_a; @@ -928,6 +928,36 @@ begin ); sp_pal_b_wr <= '1' when dl_wr = '1' and dl_addr(11 downto 8) = x"2" else '0'; -- 200-2FF + -- sprite priority + -- B Board: + -- J1: selects whether bit 4 of obj color code selects or not high priority over tiles + -- J2: selects whether bit 4 of obj color code goes to A7 of obj color PROMS + -- G Board + -- JP1-4 - Tiles with color code >= the value set here have priority over sprites + -- J1: selects whether bit 4 of obj color code selects or not high priority over tiles + + process(hwsel, tilemap_i(1).pal_a, sprite_i.pal_a) + variable bg_trans: std_logic; + begin + sprite_pri <= '1'; + bg_trans := '0'; + if tilemap_i(1).pal_a(2 downto 0) = "000" then + bg_trans := '1'; + end if; + if (hwsel = HW_YOUJYUDN or hwsel = HW_HORIZON) and tilemap_i(1).pal_a(7 downto 4) >= x"8" then + sprite_pri <= bg_trans; + end if; + if hwsel = HW_LDRUN and tilemap_i(1).pal_a(7 downto 4) >= x"c" then + sprite_pri <= sprite_i.pal_a(7) or bg_trans; + end if; + if (hwsel = HW_LDRUN2 or hwsel = HW_LDRUN3 or hwsel = HW_BATTROAD) and tilemap_i(1).pal_a(7 downto 4) >= x"4" then + sprite_pri <= sprite_i.pal_a(7) or bg_trans; + end if; + if hwsel = HW_KIDNIKI and tilemap_i(1).tile_a(13 downto 11) = "111" then + sprite_pri <= bg_trans; + end if; + end process; + -- unused outputs sprite_o.ld <= '0'; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd index 953b995c..f164c951 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_array.vhd @@ -41,7 +41,7 @@ entity sprite_array is -- video data pal_a : out std_logic_vector(7 downto 0); set : out std_logic; - pri : out std_logic; + --pri : out std_logic; spr0_set : out std_logic ); end entity sprite_array; @@ -141,7 +141,7 @@ begin end loop; end if; set <= spr_on_v; - pri <= spr_pri_v; + --pri <= spr_pri_v; end process; -- for NES, and perhaps others diff --git a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd index f81083cc..1b436c0e 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/sprite_pkg.vhd @@ -80,7 +80,6 @@ package sprite_pkg is -- video data pal_a : out std_logic_vector(7 downto 0); set : out std_logic; - pri : out std_logic; spr0_set : out std_logic ); end component sprite_array; diff --git a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd index 40273437..1491a2bf 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/tilemapctl.vhd @@ -154,6 +154,7 @@ begin hwsel = HW_LOTLOT or hwsel = HW_LDRUN or hwsel = HW_LDRUN2 or + hwsel = HW_LDRUN3 or hwsel = HW_BATTROAD then flipx := attr_d_r(5); diff --git a/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd b/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd index 123a3410..68811683 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/video_mixer.vhd @@ -52,8 +52,8 @@ begin sprite_rgb when sprite_set = '1' else bg_rgb; elsif PACE_VIDEO_NUM_TILEMAPS = 2 generate - rgb_o <= sprite_rgb when sprite_set = '1' and sprite_pri = '1' else - tilemap_ctl_o(2).rgb when tilemap_ctl_o(2).set = '1' else + rgb_o <= tilemap_ctl_o(2).rgb when tilemap_ctl_o(2).set = '1' else + sprite_rgb when sprite_set = '1' and sprite_pri = '1' else tilemap_ctl_o(1).rgb when tilemap_ctl_o(1).set = '1' else sprite_rgb when sprite_set = '1' else bg_rgb; From 4d75414b642532f832b90260b14817d04a98cd42 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 19 Mar 2020 13:20:24 +0100 Subject: [PATCH 8/9] MiST: update data_io --- common/mist/data_io.v | 46 ++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/common/mist/data_io.v b/common/mist/data_io.v index 8aac528a..dc641fad 100644 --- a/common/mist/data_io.v +++ b/common/mist/data_io.v @@ -34,10 +34,12 @@ module data_io // ARM -> FPGA download output reg ioctl_download = 0, // signal indicating an active download - output reg [7:0] ioctl_index, // menu index used to upload the file + output reg [7:0] ioctl_index, // menu index used to upload the file ([7:6] - extension index, [5:0] - menu index) output reg ioctl_wr, // strobe indicating ioctl_dout valid output reg [24:0] ioctl_addr, - output reg [7:0] ioctl_dout + output reg [7:0] ioctl_dout, + output reg [23:0] ioctl_fileext, // file extension + output reg [31:0] ioctl_filesize // file size ); parameter START_ADDR = 25'd0; @@ -50,23 +52,26 @@ reg [7:0] data_w2 = 0; reg rclk = 0; reg rclk2 = 0; reg addr_reset = 0; - reg downloading_reg = 0; reg [7:0] index_reg = 0; localparam DIO_FILE_TX = 8'h53; localparam DIO_FILE_TX_DAT = 8'h54; localparam DIO_FILE_INDEX = 8'h55; +localparam DIO_FILE_INFO = 8'h56; // data_io has its own SPI interface to the io controller -always@(posedge SPI_SCK, posedge SPI_SS2) begin +always@(posedge SPI_SCK, posedge SPI_SS2) begin : SPI_RECEIVER reg [6:0] sbuf; reg [7:0] cmd; reg [3:0] cnt; + reg [5:0] bytecnt; reg [24:0] addr; - if(SPI_SS2) cnt <= 0; - else begin + if(SPI_SS2) begin + bytecnt <= 0; + cnt <= 0; + end else begin // don't shift in last bit. It is evaluated directly // when writing to ram if(cnt != 15) sbuf <= { sbuf[5:0], SPI_DI}; @@ -97,14 +102,27 @@ always@(posedge SPI_SCK, posedge SPI_SS2) begin // expose file (menu) index if((cmd == DIO_FILE_INDEX) && (cnt == 15)) index_reg <= {sbuf, SPI_DI}; + + // receiving FAT directory entry (mist-firmware/fat.h - DIRENTRY) + if((cmd == DIO_FILE_INFO) && (cnt == 15)) begin + bytecnt <= bytecnt + 1'd1; + case (bytecnt) + 8'h08: ioctl_fileext[23:16] <= {sbuf, SPI_DI}; + 8'h09: ioctl_fileext[15: 8] <= {sbuf, SPI_DI}; + 8'h0A: ioctl_fileext[ 7: 0] <= {sbuf, SPI_DI}; + 8'h1C: ioctl_filesize[ 7: 0] <= {sbuf, SPI_DI}; + 8'h1D: ioctl_filesize[15: 8] <= {sbuf, SPI_DI}; + 8'h1E: ioctl_filesize[23:16] <= {sbuf, SPI_DI}; + 8'h1F: ioctl_filesize[31:24] <= {sbuf, SPI_DI}; + endcase + end end end - // direct SD Card->FPGA transfer generate if (ROM_DIRECT_UPLOAD == 1) begin -always@(posedge SPI_SCK, posedge SPI_SS4) begin +always@(posedge SPI_SCK, posedge SPI_SS4) begin : SPI_DIRECT_RECEIVER reg [6:0] sbuf2; reg [2:0] cnt2; reg [9:0] bytecnt; @@ -137,13 +155,14 @@ end end endgenerate -always@(posedge clk_sys) begin +always@(posedge clk_sys) begin : DATA_OUT // bring flags from spi clock domain into core clock domain reg rclkD, rclkD2; reg rclk2D, rclk2D2; reg addr_resetD, addr_resetD2; reg wr_int, wr_int_direct; reg [24:0] addr; + reg [31:0] filepos; { rclkD, rclkD2 } <= { rclk, rclkD }; { rclk2D ,rclk2D2 } <= { rclk2, rclk2D }; @@ -151,7 +170,7 @@ always@(posedge clk_sys) begin ioctl_wr <= 0; - ioctl_download <= downloading_reg; + if (!downloading_reg) ioctl_download <= 0; if (~clkref_n) begin wr_int <= 0; @@ -167,12 +186,17 @@ always@(posedge clk_sys) begin // detect transfer start from the SPI receiver if(addr_resetD ^ addr_resetD2) begin addr <= START_ADDR; + filepos <= 0; ioctl_index <= index_reg; + ioctl_download <= 1; end // detect new byte from the SPI receiver if (rclkD ^ rclkD2) wr_int <= 1; - if (rclk2D ^ rclk2D2) wr_int_direct <= 1; + if (rclk2D ^ rclk2D2 && filepos != ioctl_filesize) begin + filepos <= filepos + 1'd1; + wr_int_direct <= 1; + end end endmodule From ab46579e13b7ff5c8e64a3b4740e458f0ed0fa85 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Thu, 19 Mar 2020 13:35:34 +0100 Subject: [PATCH 9/9] IremM62: ROM direct download --- Arcade_MiST/IremM62 Hardware/IremM62.qsf | 5 +++-- Arcade_MiST/IremM62 Hardware/README.txt | 13 +++++++++++++ Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv | 10 +++++++--- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/IremM62.qsf b/Arcade_MiST/IremM62 Hardware/IremM62.qsf index 759c007f..fcb19d5b 100644 --- a/Arcade_MiST/IremM62 Hardware/IremM62.qsf +++ b/Arcade_MiST/IremM62 Hardware/IremM62.qsf @@ -76,6 +76,7 @@ set_location_assignment PIN_88 -to SPI_DI set_location_assignment PIN_126 -to SPI_SCK set_location_assignment PIN_127 -to SPI_SS2 set_location_assignment PIN_91 -to SPI_SS3 +set_location_assignment PIN_90 -to SPI_SS4 set_location_assignment PIN_13 -to CONF_DATA0 set_location_assignment PIN_49 -to SDRAM_A[0] set_location_assignment PIN_44 -to SDRAM_A[1] @@ -235,7 +236,6 @@ set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top # end ENTITY(IremM62_MiST) # --------------------------- set_location_assignment PLL_1 -to pll|altpll_component|auto_generated|pll1 -set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top set_global_assignment -name SYSTEMVERILOG_FILE rtl/IremM62_MiST.sv set_global_assignment -name VHDL_FILE rtl/target_top.vhd set_global_assignment -name VHDL_FILE rtl/platform_variant_pkg.vhd @@ -274,4 +274,5 @@ set_global_assignment -name SIGNALTAP_FILE output_files/sp.stp set_global_assignment -name SIGNALTAP_FILE output_files/tilemap.stp set_global_assignment -name SIGNALTAP_FILE output_files/sprite.stp set_global_assignment -name SIGNALTAP_FILE output_files/cpu.stp -set_global_assignment -name SIGNALTAP_FILE output_files/snd.stp \ No newline at end of file +set_global_assignment -name SIGNALTAP_FILE output_files/snd.stp +set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/Arcade_MiST/IremM62 Hardware/README.txt b/Arcade_MiST/IremM62 Hardware/README.txt index 797e18ee..182a0689 100644 --- a/Arcade_MiST/IremM62 Hardware/README.txt +++ b/Arcade_MiST/IremM62 Hardware/README.txt @@ -11,3 +11,16 @@ Games supported: - Spelunker 1-2 - Kid Niki - Youjyudn + + +MiST port usage +=============== + +- Create ROM and ARC files from the MRA files using the MRA utility. + Example: mra -A -z /path/to/mame/roms Horizon.mra +- Copy the ROM files to the root of the SD Card +- Copy the RBF and ARC files to the same folder on the SD Card + +MRA utility: https://github.com/sebdel/mra-tools-c/ + +Note: you need at least firmware version 200311. diff --git a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv index 8d3808be..bfc09cf8 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv +++ b/Arcade_MiST/IremM62 Hardware/rtl/IremM62_MiST.sv @@ -8,10 +8,11 @@ module IremM62_MiST( output AUDIO_L, output AUDIO_R, input SPI_SCK, - output SPI_DO, + inout SPI_DO, input SPI_DI, input SPI_SS2, input SPI_SS3, + input SPI_SS4, input CONF_DATA0, input CLOCK_27, @@ -97,7 +98,8 @@ wire [7:0] key_code; wire key_strobe; user_io #( - .STRLEN(($size(CONF_STR)>>3))) + .STRLEN(($size(CONF_STR)>>3)), + .ROM_DIRECT_UPLOAD(1'b1)) user_io( .clk_sys (clk_sys ), .conf_str (CONF_STR ), @@ -153,11 +155,13 @@ wire ioctl_wr; wire [24:0] ioctl_addr; wire [7:0] ioctl_dout; -data_io data_io( +data_io #(.ROM_DIRECT_UPLOAD(1'b1)) data_io( .clk_sys ( clk_sys ), .SPI_SCK ( SPI_SCK ), .SPI_SS2 ( SPI_SS2 ), + .SPI_SS4 ( SPI_SS4 ), .SPI_DI ( SPI_DI ), + .SPI_DO ( SPI_DO ), .ioctl_download( ioctl_downl ), .ioctl_index ( ioctl_index ), .ioctl_wr ( ioctl_wr ),