From e87ca840dbb02ade940abcdb535f5517233e191d Mon Sep 17 00:00:00 2001 From: astoria-d Date: Mon, 19 Aug 2013 21:06:04 +0900 Subject: [PATCH] - vram read bug fixed --- simulation/ppu/ppu.vhd | 22 +++++++++++++++++----- simulation/ppu/render.vhd | 4 +++- tools/test-image/sample1.asm | 22 ++++++++++++++++++++++ 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/simulation/ppu/ppu.vhd b/simulation/ppu/ppu.vhd index 34ed509..74166a2 100644 --- a/simulation/ppu/ppu.vhd +++ b/simulation/ppu/ppu.vhd @@ -48,7 +48,8 @@ component ppu_render oam_bus_ce_n : in std_logic; plt_bus_ce_n : in std_logic; oam_plt_addr : in std_logic_vector (7 downto 0); - oam_plt_data : inout std_logic_vector (7 downto 0) + oam_plt_data : inout std_logic_vector (7 downto 0); + v_bus_busy_n : out std_logic ); end component; @@ -157,8 +158,10 @@ signal ppu_addr : std_logic_vector (13 downto 0); signal ppu_addr_in : std_logic_vector (13 downto 0); signal ppu_addr_cnt : std_logic_vector (0 downto 0); signal ppu_data : std_logic_vector (dsize - 1 downto 0); -signal read_data : std_logic; +signal ppu_data_out : std_logic_vector (dsize - 1 downto 0); +signal read_data_n : std_logic; signal ppu_latch_rst_n : std_logic; +signal v_bus_busy_n : std_logic; signal oam_bus_ce_n : std_logic; signal plt_bus_ce_n : std_logic; @@ -173,7 +176,7 @@ begin pos_x, pos_y, nes_r, nes_g, nes_b, ppu_ctrl, ppu_mask, read_status, ppu_status, ppu_scroll_x, ppu_scroll_y, r_nw, oam_bus_ce_n, plt_bus_ce_n, - oam_plt_addr, oam_plt_data); + oam_plt_addr, oam_plt_data, v_bus_busy_n); vga_inst : vga_ctl port map (clk, vga_clk, rst_n, pos_x, pos_y, nes_r, nes_g, nes_b, @@ -215,6 +218,9 @@ begin ppu_data_inst : d_flip_flop generic map(dsize) port map (clk_n, rst_n, '1', ppu_data_we_n, cpu_d, ppu_data); + ppu_data_out_inst : d_flip_flop generic map(dsize) + port map (clk_n, rst_n, '1', read_data_n, ppu_data, ppu_data_out); + reg_set_p : process (rst_n, ce_n, r_nw, cpu_addr, cpu_d, ppu_status(ST_VBL), ppu_ctrl(PPUNEN)) @@ -298,6 +304,12 @@ begin ppu_addr_cnt_ce_n <= '1'; ppu_addr_we_n <= '1'; end if; + + if (cpu_addr = PPUDATA and r_nw = '0') then + read_data_n <= '0'; + else + read_data_n <= '1'; + end if; else ppu_ctrl_we_n <= '1'; ppu_mask_we_n <= '1'; @@ -308,9 +320,8 @@ begin ppu_scroll_cnt_ce_n <= '1'; ppu_addr_we_n <= '1'; ppu_addr_cnt_ce_n <= '1'; - read_status <= '0'; - read_data <= '0'; + read_data_n <= '1'; end if; --if (rst_n = '1' and ce_n = '0') end process; @@ -388,6 +399,7 @@ begin if (cpu_addr = PPUDATA and ppu_clk_cnt = "00") then ppu_data_we_n <= '0'; + vram_a <= ppu_addr(13 downto 8); if (ppu_addr(13 downto 8) = "111111") then --case palette tbl. plt_bus_ce_n <= '0'; diff --git a/simulation/ppu/render.vhd b/simulation/ppu/render.vhd index 79d0d07..c43a143 100644 --- a/simulation/ppu/render.vhd +++ b/simulation/ppu/render.vhd @@ -26,7 +26,8 @@ entity ppu_render is oam_bus_ce_n : in std_logic; plt_bus_ce_n : in std_logic; oam_plt_addr : in std_logic_vector (7 downto 0); - oam_plt_data : inout std_logic_vector (7 downto 0) + oam_plt_data : inout std_logic_vector (7 downto 0); + v_bus_busy_n : out std_logic ); end ppu_render; @@ -382,6 +383,7 @@ begin (cur_y < conv_std_logic_vector(VSCAN, X_SIZE) or cur_y = conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE)) else '1'; + v_bus_busy_n <= d_oe_n; io_cnt_inst : counter_register generic map (1, 1) port map (clk, cnt_x_res_n, '0', '1', (others => '0'), io_cnt); diff --git a/tools/test-image/sample1.asm b/tools/test-image/sample1.asm index 20f35a6..a766f8a 100644 --- a/tools/test-image/sample1.asm +++ b/tools/test-image/sample1.asm @@ -744,6 +744,28 @@ bvc_test: sbc #$a bvc bvc_test + ;;;;vram access test... + lda #$00 + sta $2001 ;;disable bg + + LDA #$1e + STA $2006 + LDA #$c0 + STA $2006 ;;;ppuaddr=1ec0 + LDA #$03 + STA $01 + LDY #$00 + STY $00 + LDA $2007 ;;;;from here acc broke... + LDA $2007 + + ;;show bg... + lda #$1e + sta $2001 + + ;;;enable nmi + lda #$88 + sta $2000 ;;done... ;;infinite loop. -- 2.11.0