OSDN Git Service

sprite pix processing ok!!! ppu-work-160915
authorastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 14 Sep 2016 14:27:16 +0000 (23:27 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Wed, 14 Sep 2016 14:27:16 +0000 (23:27 +0900)
de0_cv_nes/ppu/render.vhd
doc/mos6502-ppu.xlsx

index bf271d9..f49f3ed 100644 (file)
@@ -540,6 +540,7 @@ begin
                     reg_disp_attr   <= reg_v_data;\r
 \r
                 ----fetch pattern table low byte.\r
+                --pattern table at 0x0000\r
                 elsif (reg_prf_x mod 8 = 5) then\r
                      --vram addr is incremented every 8 cycle.\r
                      reg_v_addr <= "0" & pi_ppu_ctrl(PPUBPA) &\r
@@ -551,38 +552,36 @@ begin
                      --vram addr is incremented every 8 cycle.\r
                      reg_v_addr <= "0" & pi_ppu_ctrl(PPUBPA) &\r
                                           reg_disp_nt(7 downto 0)\r
-                                        & "0" & conv_std_logic_vector(reg_prf_y, 9)(2 downto 0)\r
-                                        + "00000000001000";\r
+                                        & "1" & conv_std_logic_vector(reg_prf_y, 9)(2 downto 0);\r
                 end if;\r
 \r
             --sprite pattern fetch.\r
+            --TODO: must take it into consideration, reg_nes_y = 262 case.\r
             elsif (is_spr_pfetch(pi_ppu_mask(PPUSSP), reg_nes_x, reg_nes_y) = 1) then\r
                 ----fetch pattern table low byte.\r
                 if (reg_nes_x mod 8 = 5) then\r
                     if (reg_spr_attr((reg_nes_x - 256) / 8)(SPRVFL) = '0') then\r
                         reg_v_addr <= "0" & pi_ppu_ctrl(PPUSPA) & \r
                                     reg_spr_tile_tmp & "0" & \r
-                                    (conv_std_logic_vector(reg_nes_y, 3) + "001" - reg_spr_y_tmp(2 downto 0));\r
+                                    (conv_std_logic_vector(reg_nes_y, 3) - reg_spr_y_tmp(2 downto 0) + "001");\r
                     else\r
                         --flip sprite vertically.\r
                         reg_v_addr <= "0" & pi_ppu_ctrl(PPUSPA) & \r
                                     reg_spr_tile_tmp & "0" & \r
-                                    (reg_spr_y_tmp(2 downto 0) - conv_std_logic_vector(reg_nes_y, 3) - "010");\r
+                                    (reg_spr_y_tmp(2 downto 0) - conv_std_logic_vector(reg_nes_y, 3) + "110");\r
                     end if;\r
 \r
                 ----fetch pattern table high byte.\r
                 elsif (reg_nes_x mod 8 = 7) then\r
                     if (reg_spr_attr((reg_nes_x - 256) / 8)(SPRVFL) = '0') then\r
                         reg_v_addr <= "0" & pi_ppu_ctrl(PPUSPA) & \r
-                                    reg_spr_tile_tmp & "0" & \r
-                                    (conv_std_logic_vector(reg_nes_y, 3) + "001" - reg_spr_y_tmp(2 downto 0))\r
-                                        + "00000000001000";\r
+                                    reg_spr_tile_tmp & "1" & \r
+                                    (conv_std_logic_vector(reg_nes_y, 3) - reg_spr_y_tmp(2 downto 0) + "001");\r
                     else\r
                         --flip sprite vertically.\r
                         reg_v_addr <= "0" & pi_ppu_ctrl(PPUSPA) & \r
-                                    reg_spr_tile_tmp & "0"  & \r
-                                    (reg_spr_y_tmp(2 downto 0) - conv_std_logic_vector(reg_nes_y, 3) - "010")\r
-                                        + "00000000001000";\r
+                                    reg_spr_tile_tmp & "1" & \r
+                                    (reg_spr_y_tmp(2 downto 0) - conv_std_logic_vector(reg_nes_y, 3) + "110");\r
                     end if;\r
                 end if;\r
             else\r
@@ -633,7 +632,10 @@ begin
 \r
     --palette table state machine...\r
     plt_ac_p : process (pi_rst_n, pi_base_clk)\r
-    variable spr_i : integer range -1 to 7;\r
+    --spr_i: 0 - 7 is the sprite display number.\r
+    --       8 is sprite in the back.\r
+    --       9 is sprite in front.\r
+    variable spr_i : integer range 0 to 9;\r
 \r
 function is_disp (\r
     pm_sbg          : in std_logic;\r
@@ -654,15 +656,35 @@ procedure get_visible_sprite (
     ) is\r
 begin\r
     if (pm_ssp = '1') then\r
-        for i in 0 to 7 loop\r
-            if (reg_spr_x(i) = "00000000" and\r
-                (reg_spr_ptn_h(i)(0) or reg_spr_ptn_l(i)(0)) = '1' ) then\r
-                spr_i := i;\r
-                exit;\r
-            end if;\r
-        end loop;\r
+        if (reg_spr_x(0) = "00000000" and\r
+            (reg_spr_ptn_h(0)(0) or reg_spr_ptn_l(0)(0)) = '1' ) then\r
+            spr_i := 0;\r
+        elsif (reg_spr_x(1) = "00000000" and\r
+            (reg_spr_ptn_h(1)(0) or reg_spr_ptn_l(1)(0)) = '1' ) then\r
+            spr_i := 1;\r
+        elsif (reg_spr_x(2) = "00000000" and\r
+            (reg_spr_ptn_h(2)(0) or reg_spr_ptn_l(2)(0)) = '1' ) then\r
+            spr_i := 2;\r
+        elsif (reg_spr_x(3) = "00000000" and\r
+            (reg_spr_ptn_h(3)(0) or reg_spr_ptn_l(3)(0)) = '1' ) then\r
+            spr_i := 3;\r
+        elsif (reg_spr_x(4) = "00000000" and\r
+            (reg_spr_ptn_h(4)(0) or reg_spr_ptn_l(4)(0)) = '1' ) then\r
+            spr_i := 4;\r
+        elsif (reg_spr_x(5) = "00000000" and\r
+            (reg_spr_ptn_h(5)(0) or reg_spr_ptn_l(5)(0)) = '1' ) then\r
+            spr_i := 5;\r
+        elsif (reg_spr_x(6) = "00000000" and\r
+            (reg_spr_ptn_h(6)(0) or reg_spr_ptn_l(6)(0)) = '1' ) then\r
+            spr_i := 6;\r
+        elsif (reg_spr_x(7) = "00000000" and\r
+            (reg_spr_ptn_h(7)(0) or reg_spr_ptn_l(7)(0)) = '1' ) then\r
+            spr_i := 7;\r
+        else\r
+            spr_i := 8;\r
+        end if;\r
     else\r
-        spr_i := -1;\r
+        spr_i := 8;\r
     end if;\r
 end;\r
 \r
@@ -686,8 +708,8 @@ end;
 \r
                 if (reg_v_cur_state = AD_SET2 or reg_v_cur_state = REG_SET2) then\r
                     --check sprite pattern first.\r
-                    get_visible_sprite(pi_ppu_mask(PPUSBG));\r
-                    if (spr_i >= 0) then\r
+                    get_visible_sprite(pi_ppu_mask(PPUSSP));\r
+                    if (spr_i < 8) then\r
                         --sprite display.\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
@@ -950,7 +972,7 @@ end;
                             reg_s_oam_ce_n <= '1';\r
                             reg_s_oam_wr_n <= '1';\r
                             if (reg_spr_eval_cnt = 0 and\r
-                                (pi_spr_data <= reg_nes_y and reg_nes_y < pi_spr_data + 8)) then\r
+                                (pi_spr_data - 1 <= reg_nes_y and reg_nes_y < pi_spr_data + 7)) then\r
                                 --evaluate and found sprite in the range.\r
                                 --increment s-oam.\r
                                 reg_s_oam_cpy_cnt <= reg_s_oam_cpy_cnt + 1;\r
index ebe5e74..47a8754 100644 (file)
Binary files a/doc/mos6502-ppu.xlsx and b/doc/mos6502-ppu.xlsx differ