OSDN Git Service

sprite array boundary bug fixed.
authorastoria-d <astoria-d@mail.goo.ne.jp>
Thu, 22 Sep 2016 07:43:08 +0000 (16:43 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Thu, 22 Sep 2016 07:43:08 +0000 (16:43 +0900)
de0_cv_nes/ppu/render.vhd

index 3bf875e..7c93474 100644 (file)
@@ -311,7 +311,7 @@ signal reg_s_oam_addr       : std_logic_vector (4 downto 0);
 signal reg_s_oam_data       : std_logic_vector (7 downto 0);\r
 signal wr_s_oam_data        : std_logic_vector (7 downto 0);\r
 \r
-signal reg_p_oam_cpy_cnt    : integer range 0 to 255;\r
+signal reg_p_oam_cpy_cnt    : integer range 0 to 256;\r
 signal reg_s_oam_cpy_cnt    : integer range 0 to 32;\r
 signal reg_spr_eval_cnt     : integer range 0 to 3;\r
 \r
@@ -957,16 +957,16 @@ end;
                     reg_spr_eval_cnt <= 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, 5);\r
+                    reg_s_oam_addr <= conv_std_logic_vector(reg_s_oam_cpy_cnt mod 32, 5);\r
                     reg_s_oam_data <= pi_spr_data;\r
                     reg_s_oam_rd_n <= '1';\r
 \r
                     reg_p_oam_ce_n <= '0';\r
                     reg_p_oam_rd_n <= '0';\r
                     reg_p_oam_wr_n <= '1';\r
-                    reg_p_oam_addr <= conv_std_logic_vector(reg_p_oam_cpy_cnt, 8);\r
+                    reg_p_oam_addr <= conv_std_logic_vector(reg_p_oam_cpy_cnt mod 256, 8);\r
 \r
-                    if (reg_s_oam_cpy_cnt < 32) then\r
+                    if (reg_s_oam_cpy_cnt < 32 and reg_p_oam_cpy_cnt < 256) then\r
                         if (reg_s_oam_cur_state = AD_SET0) then\r
                             reg_s_oam_ce_n <= '0';\r
                             reg_s_oam_wr_n <= '1';\r