From 033877c832f0391793b04c2d9ac4bdc8f0fb18a2 Mon Sep 17 00:00:00 2001 From: Gyorgy Szombathelyi Date: Sat, 7 Mar 2020 22:44:06 +0100 Subject: [PATCH] IremM62: fix CPU interrupt --- Arcade_MiST/IremM62 Hardware/rtl/platform.vhd | 50 +++++++------------ 1 file changed, 19 insertions(+), 31 deletions(-) diff --git a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd index d2bf9828..2e531306 100644 --- a/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd +++ b/Arcade_MiST/IremM62 Hardware/rtl/platform.vhd @@ -86,6 +86,7 @@ architecture SYN of platform is signal cpu_io_rd : std_logic; signal cpu_io_wr : std_logic; signal cpu_irq : std_logic; + signal cpu_intack : std_logic; -- ROM signals signal rom_cs : std_logic; @@ -301,7 +302,7 @@ begin intreq => cpu_irq, intvec => cpu_d_i, - intack => open, + intack => cpu_intack, nmi => '0' ); @@ -359,41 +360,28 @@ begin BLK_INTERRUPTS : block - signal vblank_int : std_logic; + signal vblank_r : std_logic; begin - - process (clk_sys, rst_sys) - variable vblank_r : std_logic_vector(3 downto 0); - alias vblank_prev : std_logic is vblank_r(vblank_r'left); - alias vblank_um : std_logic is vblank_r(vblank_r'left-1); - -- 1us duty for VBLANK_INT - variable count : integer range 0 to CLK0_FREQ_MHz * 100; - begin - if rst_sys = '1' then - vblank_int <= '0'; - vblank_r := (others => '0'); - count := count'high; - elsif rising_edge(clk_sys) then - -- rising edge vblank only - if vblank_prev = '0' and vblank_um = '1' then - count := 0; - end if; - if count /= count'high then - vblank_int <= '1'; - count := count + 1; - else - vblank_int <= '0'; - end if; - vblank_r := vblank_r(vblank_r'left-1 downto 0) & graphics_i.vblank; - end if; -- rising_edge(clk_sys) - end process; -- generate INT - cpu_irq <= vblank_int; - + process (clk_sys, rst_sys) + begin + if rst_sys = '1' then + cpu_irq <= '0'; + elsif rising_edge(clk_sys) then + vblank_r <= graphics_i.vblank; + if vblank_r = '0' and graphics_i.vblank = '1' then + cpu_irq <= '1'; + end if; + if cpu_intack = '1' then + cpu_irq <= '0'; + end if; + end if; + end process; + end block BLK_INTERRUPTS; - + BLK_INPUTS : block begin in_d_o <= inputs_i(0).d when cpu_a(2 downto 0) = "000" else