signal reg_spr_ptn_sft_start : std_logic_vector (7 downto 0);\r
signal reg_spr_ptn_l : oam_reg_array;\r
signal reg_spr_ptn_h : oam_reg_array;\r
-signal reg_spr_hit : std_logic;\r
+signal reg_spr0_eval : std_logic;\r
+signal reg_spr0_hit : std_logic;\r
\r
--status register.\r
signal reg_ppu_status : std_logic_vector (7 downto 0);\r
\r
reg_plt_addr <= (others => 'Z');\r
reg_plt_data <= (others => 'Z');\r
- reg_spr_hit <= '0';\r
+ reg_spr0_hit <= '0';\r
elsif (rising_edge(pi_base_clk)) then\r
\r
reg_plt_data <= pi_plt_data;\r
reg_plt_addr <=\r
"1" & reg_spr_attr(spr_i)(1 downto 0) & reg_spr_ptn_h(spr_i)(0) & reg_spr_ptn_l(spr_i)(0);\r
--check sprite hit.\r
- if (spr_i = 0 and (reg_sft_ptn_h(0) or reg_sft_ptn_l(0)) = '1') then\r
- reg_spr_hit <= '1';\r
+ if (spr_i = 0 and (reg_sft_ptn_h(0) or reg_sft_ptn_l(0)) = '1' and\r
+ reg_spr0_eval = '1') then\r
+ reg_spr0_hit <= '1';\r
end if;\r
elsif (conv_std_logic_vector(reg_nes_y, 9)(4) = '0'\r
and (reg_sft_ptn_h(0) or reg_sft_ptn_l(0)) = '1') then\r
else\r
--reset sprite hit.\r
if (reg_nes_y >= VSCAN_NEXT_START - 1) then\r
- reg_spr_hit <= '0';\r
+ reg_spr0_hit <= '0';\r
end if;\r
--release plt bus.\r
reg_plt_ce_n <= 'Z';\r
for i in 0 to 7 loop\r
reg_spr_attr(i) <= (others => '0');\r
end loop;\r
+ \r
+ --sprite 0 check.\r
+ reg_spr0_eval <= '0';\r
else\r
if (rising_edge(pi_base_clk)) then\r
if (is_s_oam_clear(pi_ppu_mask(PPUSSP), reg_nes_x, reg_nes_y) = 1) then\r
reg_s_oam_cpy_cnt <= 0;\r
reg_p_oam_cpy_cnt <= 0;\r
reg_spr_eval_cnt <= 0;\r
+ reg_spr0_eval <= '0';\r
elsif (is_spr_eval(pi_ppu_mask(PPUSSP), reg_nes_x, reg_nes_y) = 1) then\r
--copy data from primary oam ram.\r
reg_s_oam_addr <= conv_std_logic_vector(reg_s_oam_cpy_cnt mod 32, 5);\r
elsif (reg_s_oam_cur_state = REG_SET0) then\r
reg_s_oam_ce_n <= '0';\r
reg_s_oam_wr_n <= '0';\r
+ if (reg_p_oam_cpy_cnt = 0) then\r
+ reg_spr0_eval <= '1';\r
+ end if;\r
elsif (reg_s_oam_cur_state = REG_SET1) then\r
reg_s_oam_ce_n <= '1';\r
reg_s_oam_wr_n <= '1';\r
if (reg_nes_y = VSCAN_NEXT_START - 1) then\r
reg_ppu_status(ST_SP0) <= '0';\r
else\r
- reg_ppu_status(ST_SP0) <= reg_spr_hit;\r
+ reg_ppu_status(ST_SP0) <= reg_spr0_hit;\r
end if;\r
\r
if (reg_nes_y > VSCAN and reg_nes_y < VSCAN_NEXT_START) then\r