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
--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
\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
) 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
\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
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