OSDN Git Service

merged master
authorastoria-d <astoria-d@mail.goo.ne.jp>
Sun, 3 Jul 2016 05:49:12 +0000 (14:49 +0900)
committerastoria-d <astoria-d@mail.goo.ne.jp>
Sun, 3 Jul 2016 05:49:12 +0000 (14:49 +0900)
28 files changed:
.gitignore
de1_nes/address_decoder.vhd
de1_nes/apu/apu.vhd
de1_nes/cpu/alu.vhd
de1_nes/cpu/decoder.vhd
de1_nes/de1_nes.qsf
de1_nes/de1_nes.vhd
de1_nes/dummy-mos6502.vhd
de1_nes/mem/chr_rom.vhd
de1_nes/ppu/ppu.vhd
de1_nes/ppu/vga_ppu.vhd
de1_nes/sample1-chr.hex
de1_nes/sample1-prg.hex
de1_nes/simulation/modelsim/de1_nes_run_msim_gate_vhdl.do
de1_nes/simulation/modelsim/de1_nes_run_msim_rtl_vhdl.do
de1_nes/simulation/modelsim/motones_modelsim.mpf
de1_nes/simulation/modelsim/rom-file.nes
de1_nes/testbench_motones_sim.vhd
doc/de1-memory-doc.xlsx
doc/mos6502-ppu.xlsx
tools/ppu-regression-test/Makefile
tools/ppu-regression-test/character.chr
tools/ppu-regression-test/dd-img.sh
tools/ppu-regression-test/pattern-img.png [deleted file]
tools/ppu-regression-test/sample1.asm
tools/regression-test/.gitignore
tools/regression-test/Makefile
tools/regression-test/regression.asm

index 9c3cdb1..e23bf05 100644 (file)
@@ -18,5 +18,9 @@ ref-sdr-sdram-vhdl.zip
 DE1_control_panel
 ~$*
 *.lnk
+<<<<<<< HEAD
 bin2hex*
+=======
 cc65/
+
+>>>>>>> bc7cef00d67db16adec9f9c03eeacb3e3a09bbdf
index fc99f36..b8f7467 100644 (file)
@@ -143,68 +143,46 @@ begin
     main_p : process (clk, v_addr, v_data, wr_n)
     begin
         if (v_addr(13) = '1') then
-            ---name tbl
-            if ((v_addr(12) and v_addr(11) and v_addr(10) 
-                        and v_addr(9) and v_addr(8)) = '0') then
-                if (nt_v_mirror = '1') then
-                    --bit 10 is the name table selector.
-                    if (v_addr(10) = '0') then
-                        --name table 0 enable.
-                        nt1_ce_n_in <= '1';
-                        if (wr_n = '0') then
-                            --write
-                            nt0_ce_n_in <= not clk;
-                        elsif (rd_n = '0') then 
-                            --read
-                            nt0_ce_n_in <= '0';
-                        else
-                            nt0_ce_n_in <= '1';
-                        end if;
+            if (v_addr(13 downto 8) = "111111") then
+                --palette ram
+                nt0_ce_n_in <= '1';
+                nt1_ce_n_in <= '1';
+            else
+                ---name tbl
+                if (((v_addr(11) or v_addr(10)) = '0') 
+                    or (nt_v_mirror = '1' and v_addr(11) = '1' and v_addr(10) = '0')
+                    or (nt_v_mirror = '0' and v_addr(11) = '0' and v_addr(10) = '1')
+                    ) then
+                    --name table 0 enable.
+                    nt1_ce_n_in <= '1';
+                    if (wr_n = '0') then
+                        --write
+                        nt0_ce_n_in <= not clk;
+                    elsif (rd_n = '0') then 
+                        --read
+                        nt0_ce_n_in <= '0';
                     else
-                        --name table 1 enable.
                         nt0_ce_n_in <= '1';
-                        if (wr_n = '0') then
-                            --write
-                            nt1_ce_n_in <= clk;
-                        elsif (rd_n = '0') then 
-                            --read
-                            nt1_ce_n_in <= '0';
-                        else
-                            nt1_ce_n_in <= '1';
-                        end if;
                     end if;
-                else
-                    --horizontal mirror.
-                    --bit 11 is the name table selector.
-                    if (v_addr(11) = '0') then
-                        --name table 0 enable.
-                        nt1_ce_n_in <= '1';
-                        if (wr_n = '0') then
-                            --write
-                            nt0_ce_n_in <= clk;
-                        elsif (rd_n = '0') then 
-                            --read
-                            nt0_ce_n_in <= '0';
-                        else
-                            nt0_ce_n_in <= '1';
-                        end if;
+                elsif (((v_addr(11) and v_addr(10)) = '1') 
+                    or (nt_v_mirror = '1' and v_addr(11) = '0' and v_addr(10) = '1')
+                    or (nt_v_mirror = '0' and v_addr(11) = '1' and v_addr(10) = '0')
+                    ) then
+                    --name table 1 enable.
+                    nt0_ce_n_in <= '1';
+                    if (wr_n = '0') then
+                        --write
+                        nt1_ce_n_in <= clk;
+                    elsif (rd_n = '0') then 
+                        --read
+                        nt1_ce_n_in <= '0';
                     else
-                        --name table 1 enable.
-                        nt0_ce_n_in <= '1';
-                        if (wr_n = '0') then
-                            --write
-                            nt1_ce_n_in <= clk;
-                        elsif (rd_n = '0') then 
-                            --read
-                            nt1_ce_n_in <= '0';
-                        else
-                            nt1_ce_n_in <= '1';
-                        end if;
+                        nt1_ce_n_in <= '1';
                     end if;
-                end if; --if (nt_v_mirror = '1') then
-            else
-                nt0_ce_n_in <= '1';
-                nt1_ce_n_in <= '1';
+                else
+                    nt0_ce_n_in <= '1';
+                    nt1_ce_n_in <= '1';
+                end if;
             end if;
         else
             nt0_ce_n_in <= '1';
index c3d9937..3194314 100644 (file)
@@ -63,16 +63,17 @@ signal dma_addr         : std_logic_vector (dsize * 2 - 1 downto 0);
 signal dma_cnt_ce_n     : std_logic_vector(0 downto 0);
 signal dma_cnt_ce       : std_logic;
 signal dma_start_n      : std_logic;
+signal dma_write_we_n   : std_logic;
 signal dma_end_n        : std_logic;
 signal dma_process_n    : std_logic;
 signal dma_rst_n        : std_logic;
-signal dma_status_we_n  : std_logic;
 signal dma_status       : std_logic_vector(1 downto 0);
 signal dma_next_status  : std_logic_vector(1 downto 0);
 
 constant DMA_ST_IDLE    : std_logic_vector(1 downto 0) := "00";
 constant DMA_ST_SETUP   : std_logic_vector(1 downto 0) := "01";
 constant DMA_ST_PROCESS : std_logic_vector(1 downto 0) := "10";
+constant DMA_ST_COMPLETE : std_logic_vector(1 downto 0) := "11";
 
 begin
 
@@ -88,42 +89,40 @@ begin
             port map (clk, dma_rst_n, dma_cnt_ce, '1', (others => '0'), 
                                                 dma_addr(dsize - 1 downto 0));
     dma_h_inst : d_flip_flop generic map(dsize)
-            port map (clk_n, '1', '1', dma_start_n, cpu_d, 
+            port map (clk_n, '1', '1', dma_write_we_n, cpu_d, 
                                                 dma_addr(dsize * 2 - 1 downto dsize));
 
     dma_status_inst : d_flip_flop generic map(2)
-            port map (clk_n, rst_n, '1', dma_status_we_n, dma_next_status, dma_status);
+            port map (clk_n, rst_n, '1', '0', dma_next_status, dma_status);
 
     dma_val_inst : d_flip_flop generic map(dsize)
             port map (clk_n, rst_n, '1', dma_process_n, cpu_d, oam_data);
 
-    --apu register access process
-    reg_set_p : process (rst_n, ce_n, r_nw, cpu_addr, cpu_d)
+    dma_write_we_n <= '0'
+            when (ce_n = '0' and r_nw = '0'and cpu_addr(4 downto 0) = OAM_DMA) else
+                '1';
+
+    --dma start process
+    reg_set_p : process (rst_n, clk_n)
     begin
-        if (rst_n = '1' and ce_n = '0') then
-            if (r_nw = '0') then
-                --apu write
-                cpu_d <= (others => 'Z');
-                if (cpu_addr(4 downto 0) = OAM_DMA) then
-                    dma_start_n <= '0';
-                else
-                    dma_start_n <= '1';
-                end if;
-            elsif (r_nw = '1') then
-                --apu read
-                if (cpu_addr(4 downto 0) = OAM_JP1) then
-                    cpu_d <= (others => '0');
-                elsif (cpu_addr(4 downto 0) = OAM_JP2) then
-                    cpu_d <= (others => '0');
-                else
-                    --return dummy zero vale.
-                    cpu_d <= (others => '0');
-                end if;
-            end if;
-        else
-            cpu_d <= (others => 'Z');
+        if (rst_n = '0') then
             dma_start_n <= '1';
-        end if; --if (rst_n = '1' and ce_n = '0') 
+            rdy <= '1';
+        elsif (rising_edge(clk_n)) then
+            if (ce_n = '0' and r_nw = '0' and cpu_addr(4 downto 0) = OAM_DMA) then
+                dma_start_n <= '0';
+            else
+                dma_start_n <= '1';
+            end if; --if (ce_n = '0') 
+
+            if (ce_n = '0' and r_nw = '0' and cpu_addr(4 downto 0) = OAM_DMA) then
+                --pull rdy pin down to stop cpu bus accessing.
+                rdy <= '0';
+            elsif (dma_end_n = '0') then
+                --pull rdy pin up to re-enable cpu bus accessing.
+                rdy <= '1';
+            end if; --if (ce_n = '0') 
+        end if; --if (rst_n = '0') then
     end process;
 
     --dma operation process
@@ -139,11 +138,12 @@ begin
         elsif (rising_edge(clk)) then
             if (dma_status = DMA_ST_IDLE) then
                 if (dma_start_n = '0') then
-                    dma_status_we_n <= '0';
                     dma_next_status <= DMA_ST_SETUP;
+                else
+                    dma_next_status <= DMA_ST_IDLE;
                 end if;
-                dma_process_n <= '1';
                 dma_end_n <= '1';
+                dma_process_n <= '1';
                 cpu_addr <= (others => 'Z');
                 cpu_d <= (others => 'Z');
                 r_nw <= 'Z';
@@ -154,13 +154,10 @@ begin
                 dma_next_status <= DMA_ST_PROCESS;
             elsif (dma_status = DMA_ST_PROCESS) then
                 if (dma_addr(dsize - 1 downto 0) = "11111111" and dma_cnt_ce_n(0) = '1') then
-                    dma_status_we_n <= '0';
-                    dma_next_status <= DMA_ST_IDLE;
-                    dma_end_n <= '0';
+                    dma_next_status <= DMA_ST_COMPLETE;
                 else
-                    dma_status_we_n <= '1';
+                    dma_next_status <= DMA_ST_PROCESS;
                     dma_process_n <= '0';
-                    dma_end_n <= '1';
                 end if;
 
                 if (dma_cnt_ce_n(0) = '0') then
@@ -172,24 +169,38 @@ begin
                     cpu_addr <= OAMDATA;
                     cpu_d <= oam_data;
                 end if;
+            elsif (dma_status = DMA_ST_COMPLETE) then
+                dma_next_status <= DMA_ST_IDLE;
+                dma_process_n <= '1';
+                dma_end_n <= '0';
+                r_nw <= 'Z';
+                cpu_addr <= (others => 'Z');
+                cpu_d <= (others => 'Z');
             end if;--if (dma_status = DMA_ST_IDLE) then
         end if;--if (rst_n = '0') then
     end process;
 
-    rdy_p : process (rst_n, clk_n)
-    begin
-        if (rst_n = '0') then
-            rdy <= '1';
-        elsif (rising_edge(clk_n)) then
-            if (dma_start_n = '0') then
-                --pull rdy pin down to stop cpu bus accessing.
-                rdy <= '0';
-            elsif (dma_end_n = '0') then
-                --pull rdy pin up to re-enable cpu bus accessing.
-                rdy <= '1';
-            end if;
-        end if;
-    end process;
+--    --joy pad process..
+--    jp_p : process (rst_n, clk_n)
+--    begin
+--        if (rst_n = '0') then
+--            cpu_d <= (others => 'Z');
+--        elsif (rising_edge(clk)) then
+--            if (ce_n = '0' and r_nw = '1') then
+--                --joy pad read
+--                --return dummy zero vale.
+--                if (cpu_addr(4 downto 0) = OAM_JP1) then
+--                    cpu_d <= (others => '0');
+--                elsif (cpu_addr(4 downto 0) = OAM_JP2) then
+--                    cpu_d <= (others => '0');
+--                else
+--                    cpu_d <= (others => 'Z');
+--                end if;
+--            else
+--                cpu_d <= (others => 'Z');
+--            end if; --if (ce_n = '0') 
+--        end if; --if (rst_n = '0') then
+--    end process;
 
 end rtl;
 
index e061855..fb369ec 100644 (file)
@@ -458,7 +458,7 @@ end procedure;
             ---save BAH.
             ah_buf_we_n <= '0';
             ah_reg_in <= int_d_bus;
-        elsif (exec_cycle = T5) then
+        elsif (exec_cycle = T5 or exec_cycle = T0) then
             ah_buf_we_n <= '1';
 
             --output ah/al reg.
@@ -499,6 +499,8 @@ end procedure;
             ea_carry <= addr_c;
 
         elsif (exec_cycle = T4) then
+            ah_buf_we_n <= '1';
+
             ---add y reg.
             a_sel <= ADDR_ADC;
 
@@ -517,15 +519,21 @@ end procedure;
             al_reg_in <= addr_out;
             tmp_buf_we_n <= '0';
             tmp_reg_in <= ah_reg;
-        elsif (exec_cycle = T5) then
+        elsif (exec_cycle = T5 or exec_cycle = T0) then
             al_buf_we_n <= '1';
             tmp_buf_we_n <= '1';
             ea_carry <= '0';
-            a_sel <= ADDR_INC;
-            addr1 <= tmp_reg;
-            ---next page.
-            abh <= addr_out;
-            abl <= al_reg;
+
+            if (pg_next_n = '0') then
+                a_sel <= ADDR_INC;
+                addr1 <= tmp_reg;
+                ---next page.
+                abh <= addr_out;
+                abl <= al_reg;
+            else
+                abh <= tmp_reg;
+                abl <= al_reg;
+            end if;
         else
             al_buf_we_n <= '1';
             ah_buf_we_n <= '1';
index 9cdf007..c179f08 100644 (file)
@@ -145,6 +145,7 @@ signal wk_acc_cmd         : std_logic_vector(3 downto 0);
 signal wk_x_cmd           : std_logic_vector(3 downto 0);
 signal wk_y_cmd           : std_logic_vector(3 downto 0);
 signal wk_stat_alu_we_n   : std_logic;
+signal ea_carry_reg       : std_logic;
 
 begin
 
@@ -153,6 +154,9 @@ begin
     pch_inc_reg : d_flip_flop_bit 
             port map(set_clk, '1', '1', '0', pch_inc_input, pch_inc_n);
 
+    ea_carry_inst: d_flip_flop_bit 
+            port map(trig_clk, '1', '1', '0', ea_carry, ea_carry_reg);
+
     --acc,x,y next cycle is changed when it goes page across.
     --The conditional branch instructions all have the form xxy10000
     next_cycle <= wk_next_cycle;
@@ -511,7 +515,7 @@ begin
 
         wk_next_cycle <= T0;
         d_print("absx step 1");
-    elsif (exec_cycle = T0 and ea_carry = '1') then
+    elsif (exec_cycle = T0 and ea_carry_reg = '1') then
         --case page boundary crossed.
         --redo inst.
         d_print("absx 5 (page boudary crossed.)");
@@ -718,7 +722,11 @@ begin
         end if;
         wk_next_cycle <= T4;
     elsif exec_cycle = T4 then
-        pg_next_n <= '0';
+        if (ea_carry_reg = '1') then
+            pg_next_n <= '0';
+        else
+            pg_next_n <= '1';
+        end if;
         abs_latch_out;
         if (is_x = true) then
             ea_x_out;
@@ -770,7 +778,13 @@ begin
         --page handling.
         back_oe(wk_y_cmd, '1');
         indir_y_n <= '0';
-        pg_next_n <= '0';
+        
+        --ea_carry reg is suspicious. timing is not garanteed...
+        if (ea_carry_reg = '1') then
+            pg_next_n <= '0';
+        else
+            pg_next_n <= '1';
+        end if;
         r_nw <= '0';
         wk_next_cycle <= T0;
     end if;
@@ -949,7 +963,11 @@ begin
     elsif exec_cycle = T4 then
         abs_latch_out;
         ea_x_out;
-        pg_next_n <= '0';
+        if (ea_carry_reg = '1') then
+            pg_next_n <= '0';
+        else
+            pg_next_n <= '1';
+        end if;
 
         --keep data in the alu reg.
         arith_en_n <= '0';
@@ -1097,7 +1115,7 @@ end  procedure;
                 --case dma is runnting.
                 disable_pins;
                 inst_we_n <= '1';
-                ad_oe_n <= '0';
+                ad_oe_n <= '1';
                 dl_al_oe_n <= '1';
                 pcl_inc_n <= '1';
                 pcl_cmd <= "1111";
index 8bc7614..1967905 100644 (file)
@@ -69,61 +69,30 @@ set_location_assignment PIN_B11 -to v_sync_n
 set_location_assignment PIN_L1 -to base_clk\r
 set_location_assignment PIN_R22 -to rst_n\r
 \r
-##DRAM\r
-set_location_assignment PIN_W4 -to dram_addr[0]\r
-set_location_assignment PIN_W5 -to dram_addr[1]\r
-set_location_assignment PIN_Y3 -to dram_addr[2]\r
-set_location_assignment PIN_Y4 -to dram_addr[3]\r
-set_location_assignment PIN_R6 -to dram_addr[4]\r
-set_location_assignment PIN_R5 -to dram_addr[5]\r
-set_location_assignment PIN_P6 -to dram_addr[6]\r
-set_location_assignment PIN_P5 -to dram_addr[7]\r
-set_location_assignment PIN_P3 -to dram_addr[8]\r
-set_location_assignment PIN_N4 -to dram_addr[9]\r
-set_location_assignment PIN_W3 -to dram_addr[10]\r
-set_location_assignment PIN_N6 -to dram_addr[11]\r
-set_location_assignment PIN_U3 -to dram_bank[0]\r
-set_location_assignment PIN_V4 -to dram_bank[1]\r
-set_location_assignment PIN_T3 -to dram_cas_n\r
-set_location_assignment PIN_N3 -to dram_cke\r
-set_location_assignment PIN_U4 -to dram_clk\r
-set_location_assignment PIN_T6 -to dram_cs_n\r
-set_location_assignment PIN_U1 -to dram_dq[0]\r
-set_location_assignment PIN_U2 -to dram_dq[1]\r
-set_location_assignment PIN_V1 -to dram_dq[2]\r
-set_location_assignment PIN_V2 -to dram_dq[3]\r
-set_location_assignment PIN_W1 -to dram_dq[4]\r
-set_location_assignment PIN_W2 -to dram_dq[5]\r
-set_location_assignment PIN_Y1 -to dram_dq[6]\r
-set_location_assignment PIN_Y2 -to dram_dq[7]\r
-set_location_assignment PIN_N1 -to dram_dq[8]\r
-set_location_assignment PIN_N2 -to dram_dq[9]\r
-set_location_assignment PIN_P1 -to dram_dq[10]\r
-set_location_assignment PIN_P2 -to dram_dq[11]\r
-set_location_assignment PIN_R1 -to dram_dq[12]\r
-set_location_assignment PIN_R2 -to dram_dq[13]\r
-set_location_assignment PIN_T1 -to dram_dq[14]\r
-set_location_assignment PIN_T2 -to dram_dq[15]\r
-set_location_assignment PIN_R7 -to dram_ldqm\r
-set_location_assignment PIN_T5 -to dram_ras_n\r
-set_location_assignment PIN_M5 -to dram_udqm\r
-set_location_assignment PIN_R8 -to dram_we_n\r
+#chr rom mirror setting\r
+set_location_assignment PIN_L2 -to nt_v_mirror\r
+\r
 \r
 #project files\r
 set_global_assignment -name VHDL_FILE address_decoder.vhd\r
 set_global_assignment -name VHDL_FILE motonesfpga_common.vhd\r
 set_global_assignment -name VHDL_FILE clock/clock_divider.vhd\r
-#set_global_assignment -name VHDL_FILE mem/prg_rom.vhd\r
-set_global_assignment -name VHDL_FILE mem/chr_rom.vhd\r
 set_global_assignment -name VHDL_FILE mem/ram.vhd\r
 set_global_assignment -name VHDL_FILE apu/apu.vhd\r
+\r
+#ppu block...\r
+set_global_assignment -name VHDL_FILE mem/chr_rom.vhd\r
+set_global_assignment -name VHDL_FILE ppu/ppu.vhd\r
 set_global_assignment -name VHDL_FILE ppu/ppu_registers.vhd\r
 set_global_assignment -name VHDL_FILE ppu/vga_ppu.vhd\r
-set_global_assignment -name VHDL_FILE ppu/ppu.vhd\r
+\r
+#cpu block...\r
+#set_global_assignment -name VHDL_FILE mem/prg_rom.vhd\r
 #set_global_assignment -name VHDL_FILE cpu/alu.vhd\r
 #set_global_assignment -name VHDL_FILE cpu/cpu_registers.vhd\r
 #set_global_assignment -name VHDL_FILE cpu/decoder.vhd\r
 #set_global_assignment -name VHDL_FILE cpu/mos6502.vhd\r
+\r
 set_global_assignment -name VHDL_FILE "dummy-mos6502.vhd"\r
 set_global_assignment -name VHDL_FILE de1_nes.vhd\r
 \r
index d50cc08..2fdf12b 100644 (file)
@@ -44,8 +44,7 @@ entity de1_nes is
     signal dbg_disp_nt, dbg_disp_attr : out std_logic_vector (7 downto 0);
     signal dbg_disp_ptn_h, dbg_disp_ptn_l : out std_logic_vector (15 downto 0);
     signal dbg_nmi  : out std_logic;
-    
-    
+
 --NES instance
         base_clk       : in std_logic;
         rst_n          : in std_logic;
@@ -55,7 +54,8 @@ entity de1_nes is
         v_sync_n    : out std_logic;
         r           : out std_logic_vector(3 downto 0);
         g           : out std_logic_vector(3 downto 0);
-        b           : out std_logic_vector(3 downto 0)
+        b           : out std_logic_vector(3 downto 0);
+        nt_v_mirror : in std_logic\r
          );
 end de1_nes;
 
@@ -211,8 +211,7 @@ architecture rtl of de1_nes is
                 clk             : in std_logic;
                 ce_n            : in std_logic;     --active low.
                 addr            : in std_logic_vector (abus_size - 1 downto 0);
-                data            : out std_logic_vector (dbus_size - 1 downto 0);
-                nt_v_mirror     : out std_logic
+                data            : out std_logic_vector (dbus_size - 1 downto 0)
         );
     end component;
 
@@ -271,7 +270,6 @@ architecture rtl of de1_nes is
     signal vram_ad  : std_logic_vector (7 downto 0);
     signal vram_a   : std_logic_vector (13 downto 8);
     signal v_addr   : std_logic_vector (13 downto 0);
-    signal nt_v_mirror  : std_logic;
     signal pt_ce_n  : std_logic;
     signal nt0_ce_n : std_logic;
     signal nt1_ce_n : std_logic;
@@ -323,13 +321,16 @@ begin
     clock_inst : clock_divider port map 
         (base_clk, rst_n, cpu_clk, ppu_clk, mem_clk, vga_clk);
 
+    addr_dec_inst : address_decoder generic map (addr_size, data_size) \r
+        port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);\r
+\r
     --mos 6502 cpu instance
     cpu_inst : mos6502 generic map (data_size, addr_size) 
         port map (
     dbg_instruction_dummy,
-    dbg_int_d_bus_dummy,
+    dbg_int_d_bus,
     dbg_exec_cycle_dummy,
-    dbg_ea_carry_dummy,
+    dbg_ea_carry,
  --   dbg_index_bus,
  --   dbg_acc_bus,
     dbg_status_dummy,
@@ -345,9 +346,6 @@ begin
                 rst_n, irq_n, nmi_n, dbe, r_nw, 
                 phi1, phi2, addr, d_io);
 
-    addr_dec_inst : address_decoder generic map (addr_size, data_size) 
-        port map (phi2, mem_clk, r_nw, addr, rom_ce_n, ram_ce_n, ppu_ce_n, apu_ce_n);
-
     --main ROM/RAM instance
 --    prg_rom_inst : prg_rom generic map (rom_32k, data_size)
 --            port map (mem_clk, rom_ce_n, addr(rom_32k - 1 downto 0), d_io);
@@ -359,51 +357,12 @@ begin
     prg_ram_inst : ram generic map (ram_2k, data_size)
             port map (mem_clk, ram_ce_n, ram_oe_n, R_nW, addr(ram_2k - 1 downto 0), d_io);
 
-    dbg_exec_cycle(2 downto 1) <= dbg_vga_x(9 downto 8);
-    dbg_int_d_bus <= dbg_vga_x(7 downto 0);
-    dbg_exec_cycle(0) <= dbg_nes_x(8);
-    dbg_instruction <= dbg_nes_x(7 downto 0);
-    dbg_exec_cycle(3) <= dbg_emu_ppu_clk;
-
-    dbg_exec_cycle(4) <= dbg_nes_y(8);
-    dbg_status <= dbg_nes_y(7 downto 0);
-
-
-    dbg_ppu_scrl_x(0) <= ale;
-    dbg_ppu_scrl_x(1) <= rd_n;
-    dbg_ppu_scrl_x(2) <= wr_n;
-    dbg_ppu_scrl_x(3) <= nt0_ce_n;
-    dbg_ppu_scrl_x(4) <= vga_clk;
-    dbg_ppu_scrl_x(5) <= rom_ce_n;
-    dbg_ppu_scrl_x(6) <= ram_ce_n;
-    dbg_ppu_scrl_x(7) <= addr(15);
-    dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);
-    dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);
---    dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;
---    dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;
-
-    dbg_cpu_clk <= cpu_clk;
-    dbg_mem_clk <= mem_clk;
-    dbg_r_nw <= r_nw;
-    dbg_addr <= addr;
-    dbg_d_io <= d_io;
-    dbg_vram_ad  <= vram_ad ;\r
-    dbg_vram_a  <= vram_a ;\r
-\r
-    dbg_sp(7 downto 6) <= dbg_ppu_clk_cnt;\r
-    dbg_sp(5 downto 0) <= v_addr (13 downto 8);\r
-    dbg_x <= v_addr (7 downto 0);\r
-\r
-    dbg_nmi <= nmi_n;
---    nmi_n <= dummy_nmi;
---    dbg_ppu_ctrl <= dbg_pcl;
---    dbg_ppu_mask <= dbg_pch;
     --nes ppu instance
     ppu_inst: ppu port map (  
         dbg_ppu_ce_n                                        ,
         dbg_ppu_ctrl, dbg_ppu_mask, dbg_ppu_status          ,
         dbg_ppu_addr                                        ,
-        dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y_dummy        ,
+        dbg_ppu_data, dbg_ppu_scrl_x_dummy, dbg_ppu_scrl_y        ,
 
         dbg_ppu_clk                      ,
         dbg_vga_clk                      ,
@@ -412,7 +371,7 @@ begin
         dbg_nes_y                        ,
         dbg_vga_y                        ,
         dbg_disp_nt, dbg_disp_attr                          ,
-        dbg_disp_ptn_h, dbg_disp_ptn_l     ,
+        dbg_disp_ptn_h, dbg_disp_ptn_l_dummy     ,
         dbg_plt_ce_rn_wn                 ,
         dbg_plt_addr                     ,
         dbg_plt_data                     ,
@@ -465,7 +424,7 @@ begin
                 port map(vga_clk, ale_n, ale, vram_ad, v_addr(7 downto 0));
 
     vchr_rom : chr_rom generic map (chr_rom_8k, data_size)
-            port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad, nt_v_mirror);
+            port map (mem_clk, pt_ce_n, v_addr(chr_rom_8k - 1 downto 0), vram_ad);
 
     --name table/attr table
     vram_nt0 : ram generic map (vram_1k, data_size)
@@ -477,6 +436,54 @@ begin
     --APU/DMA instance
     apu_inst : apu
         port map (cpu_clk, apu_ce_n, rst_n, r_nw, addr, d_io, rdy);
-
+\r
+\r
+\r
+-----------------------------------------------------------\r
+-----------------------------------------------------------\r
+------------------debug pin setting....--------------------    
+-----------------------------------------------------------\r
+-----------------------------------------------------------\r
+\r
+--    dbg_exec_cycle(2 downto 1) <= dbg_vga_x(9 downto 8);\r
+--    dbg_int_d_bus <= dbg_vga_x(7 downto 0);\r
+    dbg_exec_cycle(0) <= dbg_nes_x(8);\r
+    dbg_instruction <= dbg_nes_x(7 downto 0);\r
+--    dbg_exec_cycle(3) <= dbg_emu_ppu_clk;\r
+\r
+    dbg_exec_cycle(4) <= dbg_nes_y(8);\r
+    dbg_status <= dbg_nes_y(7 downto 0);\r
+\r
+    dbg_ppu_scrl_x(0) <= ale;\r
+    dbg_ppu_scrl_x(1) <= rd_n;\r
+    dbg_ppu_scrl_x(2) <= wr_n;\r
+    dbg_ppu_scrl_x(3) <= nt0_ce_n;\r
+\r
+--    dbg_ppu_scrl_x(4) <= vga_clk;\r
+--    dbg_ppu_scrl_x(5) <= rom_ce_n;\r
+--    dbg_ppu_scrl_x(6) <= ram_ce_n;\r
+--    dbg_ppu_scrl_x(7) <= addr(15);\r
+--    dbg_ppu_scrl_y(2 downto 0) <= dbg_p_oam_ce_rn_wn(2 downto 0);\r
+--    dbg_ppu_scrl_y(5 downto 3) <= dbg_plt_ce_rn_wn(2 downto 0);\r
+    dbg_disp_ptn_l (7 downto 0) <= dbg_p_oam_addr;\r
+    dbg_disp_ptn_l (15 downto 8) <= dbg_p_oam_data;\r
+\r
+    dbg_cpu_clk <= cpu_clk;\r
+    dbg_mem_clk <= mem_clk;\r
+    dbg_r_nw <= r_nw;\r
+    dbg_addr <= addr;\r
+    dbg_d_io <= d_io;\r
+    dbg_vram_ad  <= vram_ad ;\r
+    dbg_vram_a  <= vram_a ;\r
+\r
+    dbg_sp(7 downto 6) <= dbg_ppu_clk_cnt;\r
+    dbg_sp(5 downto 0) <= v_addr (13 downto 8);\r
+    dbg_x <= v_addr (7 downto 0);\r
+\r
+    dbg_nmi <= nmi_n;\r
+--    nmi_n <= dummy_nmi;\r
+--    dbg_ppu_ctrl <= dbg_pcl;\r
+--    dbg_ppu_mask <= dbg_pch;\r
+\r
 end rtl;
 
index 2f8c908..de2768e 100644 (file)
@@ -48,12 +48,15 @@ begin
     use ieee.std_logic_arith.conv_std_logic_vector;\r
 \r
     variable init_step_cnt, plt_step_cnt, \r
-            nt_step_cnt, spr_step_cnt, dma_step_cnt, enable_ppu_step_cnt : integer;\r
+            nt_step_cnt, spr_step_cnt, dma_step_cnt, scl_step_cnt, \r
+            enable_ppu_step_cnt, nmi_step_cnt : integer;\r
     variable init_done : std_logic;\r
     variable global_step_cnt : integer;\r
     constant cpu_io_multi : integer := 3; --io happens every 4 cpu cycle.\r
     variable i, j : integer;\r
     variable ch : integer := 16#41# ;\r
+    variable nmi_oam_x : integer range 0 to 255;\r
+    variable nmi_scl_y : integer range 0 to 255;\r
 \r
 procedure io_out (ad: in integer; dt : in integer) is\r
 begin\r
@@ -82,7 +85,11 @@ end;
             nt_step_cnt := 0;\r
             spr_step_cnt := 0;\r
             dma_step_cnt := 0;\r
+            scl_step_cnt := 0;\r
             enable_ppu_step_cnt := 0;\r
+            nmi_step_cnt := 0;\r
+            nmi_oam_x := 0;\r
+            nmi_scl_y := 200;\r
 \r
         elsif (rising_edge(input_clk)) then\r
 \r
@@ -203,7 +210,7 @@ end;
                             --set vram addr 2005 (first row, 6th col)\r
                             io_out(16#2006#, 16#20#);\r
                         elsif (nt_step_cnt = 1 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#06#);\r
+                            io_out(16#2006#, 16#3b#);\r
                         elsif (nt_step_cnt = 2 * cpu_io_multi) then\r
                             --set name tbl data\r
                             --0x44, 45, 45 = DEE\r
@@ -215,142 +222,38 @@ end;
 \r
 \r
                         elsif (nt_step_cnt = 5 * cpu_io_multi) then\r
-                            --set vram addr 23c1 (attribute)\r
-                            io_out(16#2006#, 16#23#);\r
+                            io_out(16#2006#, 16#20#);\r
                         elsif (nt_step_cnt = 6 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#c1#);\r
+                            io_out(16#2006#, 16#2a#);\r
                         elsif (nt_step_cnt = 7 * cpu_io_multi) then\r
-                                    --attr=11011000\r
-                            io_out(16#2007#, 16#d8#);\r
-\r
+                            io_out(16#2007#, 16#44#);\r
 \r
                         elsif (nt_step_cnt = 8 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#20#);\r
+                            io_out(16#2006#, 16#24#);\r
                         elsif (nt_step_cnt = 9 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#60#);\r
-\r
+                            io_out(16#2006#, 16#43#);\r
                         elsif (nt_step_cnt = 10 * cpu_io_multi) then\r
-                            io_out(16#2007#, 48);\r
+                            io_out(16#2007#, 16#6d#);\r
                         elsif (nt_step_cnt = 11 * cpu_io_multi) then\r
-                            io_out(16#2007#, 49);\r
+                            io_out(16#2007#, 16#6f#);\r
                         elsif (nt_step_cnt = 12 * cpu_io_multi) then\r
-                            io_out(16#2007#, 50);\r
+                            io_out(16#2007#, 16#74#);\r
                         elsif (nt_step_cnt = 13 * cpu_io_multi) then\r
-                            io_out(16#2007#, 51);\r
+                            io_out(16#2007#, 16#6f#);\r
+                            \r
                         elsif (nt_step_cnt = 14 * cpu_io_multi) then\r
-                            io_out(16#2007#, 52);\r
+                            io_out(16#2006#, 16#2e#);\r
                         elsif (nt_step_cnt = 15 * cpu_io_multi) then\r
-                            io_out(16#2007#, 53);\r
+                            io_out(16#2006#, 16#93#);\r
                         elsif (nt_step_cnt = 16 * cpu_io_multi) then\r
-                            io_out(16#2007#, 54);\r
-                        elsif (nt_step_cnt = 17 * cpu_io_multi) then\r
-                            io_out(16#2007#, 55);\r
-                        elsif (nt_step_cnt = 18 * cpu_io_multi) then\r
-                            io_out(16#2007#, 56);\r
-\r
-    --                    elsif (nt_step_cnt = 5 * cpu_io_multi) then\r
-    --                        --set vram addr 21d1\r
-    --                        io_out(16#2006#, 16#21#);\r
-    --                    elsif (nt_step_cnt = 6 * cpu_io_multi) then\r
-    --                        io_out(16#2006#, 16#E6#);\r
-    --                    elsif (nt_step_cnt = 7 * cpu_io_multi) then\r
-    --                        --msg=DEE TEST !!!\r
-    --                        io_out(16#2007#, 16#44#);\r
-    --                    elsif (nt_step_cnt = 8 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#45#);\r
-    --                    elsif (nt_step_cnt = 9 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#45#);\r
-    --                    elsif (nt_step_cnt = 10 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#00#);\r
-    --                    elsif (nt_step_cnt = 11 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#54#);\r
-    --                    elsif (nt_step_cnt = 12 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#45#);\r
-    --                    elsif (nt_step_cnt = 13 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#53#);\r
-    --                    elsif (nt_step_cnt = 14 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#54#);\r
-    --                    elsif (nt_step_cnt = 15 * cpu_io_multi) then\r
-    --                        io_out(16#2007#, 16#21#);\r
-\r
-                        --display test pattern\r
-                        elsif (nt_step_cnt = 19 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#20#);\r
-                        elsif (nt_step_cnt = 20 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#20#);\r
-                        \r
-                        elsif (nt_step_cnt = 21 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#01#);\r
-                        elsif (nt_step_cnt = 22 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#02#);\r
-                        elsif (nt_step_cnt = 23 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#03#);\r
-                        elsif (nt_step_cnt = 24 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#04#);\r
-                        elsif (nt_step_cnt = 25 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#05#);\r
-                        elsif (nt_step_cnt = 26 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#06#);\r
-                        elsif (nt_step_cnt = 27 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#07#);\r
-                        elsif (nt_step_cnt = 28 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#08#);\r
-                        elsif (nt_step_cnt = 29 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#09#);\r
-                        elsif (nt_step_cnt = 30 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0a#);\r
-                        elsif (nt_step_cnt = 31 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0b#);\r
-                        elsif (nt_step_cnt = 32 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0c#);\r
-                        elsif (nt_step_cnt = 33 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0d#);\r
-                        elsif (nt_step_cnt = 34 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0e#);\r
-                        elsif (nt_step_cnt = 35 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#0f#);\r
+                            io_out(16#2007#, 16#59#);\r
 \r
-                        elsif (nt_step_cnt = 36 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#20#);\r
-                        elsif (nt_step_cnt = 37 * cpu_io_multi) then\r
-                            io_out(16#2006#, 16#40#);\r
-                        \r
-                        elsif (nt_step_cnt = 38 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#10#);\r
-                        elsif (nt_step_cnt = 39 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#11#);\r
-                        elsif (nt_step_cnt = 40 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#12#);\r
-                        elsif (nt_step_cnt = 41 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#13#);\r
-                        elsif (nt_step_cnt = 42 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#14#);\r
-                        elsif (nt_step_cnt = 43 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#15#);\r
-                        elsif (nt_step_cnt = 44 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#16#);\r
-                        elsif (nt_step_cnt = 45 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#17#);\r
-                        elsif (nt_step_cnt = 46 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#18#);\r
-                        elsif (nt_step_cnt = 47 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#19#);\r
-                        elsif (nt_step_cnt = 48 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1a#);\r
-                        elsif (nt_step_cnt = 49 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1b#);\r
-                        elsif (nt_step_cnt = 50 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1c#);\r
-                        elsif (nt_step_cnt = 51 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1d#);\r
-                        elsif (nt_step_cnt = 52 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1e#);\r
-                        elsif (nt_step_cnt = 53 * cpu_io_multi) then\r
-                            io_out(16#2007#, 16#1f#);\r
+                        elsif (nt_step_cnt = 17 * cpu_io_multi) then\r
+                            io_out(16#2007#, 16#00#);\r
 \r
                         else\r
                             io_brk;\r
-                            if (nt_step_cnt > 4 * cpu_io_multi) then\r
+                            if (nt_step_cnt > 17 * cpu_io_multi) then\r
                                 global_step_cnt := global_step_cnt + 1;\r
                             end if;\r
                         end if;\r
@@ -417,7 +320,7 @@ end;
                         else\r
                             io_brk;\r
                             if (spr_step_cnt > 4 * cpu_io_multi) then\r
-                                global_step_cnt := global_step_cnt + 1;\r
+                                global_step_cnt := global_step_cnt + 2;\r
                             end if;\r
                         end if;\r
                         spr_step_cnt := spr_step_cnt + 1;\r
@@ -464,30 +367,75 @@ end;
                         dma_step_cnt := dma_step_cnt + 1;\r
 \r
                     elsif (global_step_cnt = 5) then\r
+                        --step4 = scroll test.\r
+                        if (scl_step_cnt = 0) then\r
+                            --x scroll pos=123\r
+                            io_out(16#2005#, 123);\r
+                        elsif (scl_step_cnt = 1 * cpu_io_multi) then\r
+                            --y scroll pos=100\r
+                            io_out(16#2005#, 100);\r
+\r
+                        else\r
+                            io_brk;\r
+                            if (scl_step_cnt > 1 * cpu_io_multi) then\r
+                                global_step_cnt := global_step_cnt + 1;\r
+                            end if;\r
+                        end if;\r
+                        scl_step_cnt := scl_step_cnt + 1;\r
+\r
+                    elsif (global_step_cnt = 6) then\r
                         --final step = enable ppu.\r
                         if (enable_ppu_step_cnt = 0 * cpu_io_multi) then\r
-                            --scroll reg set x.\r
-                            io_out(16#2005#, 0);\r
-                        elsif (enable_ppu_step_cnt = 1 * cpu_io_multi) then\r
-                            --scroll reg set y.\r
-                            io_out(16#2005#, 0);\r
-                        elsif (enable_ppu_step_cnt = 2 * cpu_io_multi) then\r
                             --show bg\r
                             --PPUMASK=1e (show bg and sprite)\r
                             --PPUMASK=0e (show bg only)\r
                             io_out(16#2001#, 16#1e#);\r
-                        elsif (enable_ppu_step_cnt = 3 * cpu_io_multi) then\r
+                        elsif (enable_ppu_step_cnt = 1 * cpu_io_multi) then\r
                             --enable nmi\r
                             --PPUCTRL=80\r
                             io_out(16#2000#, 16#80#);\r
                         else\r
                             io_brk;\r
-                            if (enable_ppu_step_cnt > 4 * cpu_io_multi) then\r
+                            if (enable_ppu_step_cnt > 1 * cpu_io_multi) then\r
                                 global_step_cnt := global_step_cnt + 1;\r
                             end if;\r
                         end if;\r
                         enable_ppu_step_cnt := enable_ppu_step_cnt + 1;\r
 \r
+                    elsif (global_step_cnt = 7) then\r
+                        ----nmi tests.....\r
+                        if (nmi_n = '0') then\r
+\r
+                            if (nmi_step_cnt = 0 * cpu_io_multi) then\r
+                                --set sprite addr=00 (first sprite)\r
+                                io_out(16#2003#, 16#03#);\r
+                            elsif (nmi_step_cnt = 1 * cpu_io_multi) then\r
+                                --set sprite data: x=100\r
+                                io_out(16#2004#, nmi_oam_x);\r
+                            elsif (nmi_step_cnt = 2 * cpu_io_multi) then\r
+                                --scroll x=0\r
+--                                io_out(16#2005#, nmi_scl_y);\r
+                            elsif (nmi_step_cnt = 3 * cpu_io_multi) then\r
+                                --scroll y++\r
+--                                io_out(16#2005#, nmi_scl_y);\r
+                            else\r
+                                nmi_oam_x := nmi_oam_x + 1;\r
+                                if (nmi_step_cnt mod 10 = 0) then\r
+                                    nmi_scl_y := nmi_scl_y + 1;\r
+                                end if;\r
+                                io_brk;\r
+                                if (nmi_step_cnt > 3 * cpu_io_multi) then\r
+                                    global_step_cnt := global_step_cnt + 1;\r
+                                end if;\r
+                            end if;\r
+                            nmi_step_cnt := nmi_step_cnt + 1;\r
+                        end if;\r
+                    elsif (global_step_cnt = 8) then\r
+                        ----back to nmi tests.....\r
+                        if (nmi_n = '1') then\r
+                            nmi_step_cnt := 0;\r
+                            global_step_cnt := global_step_cnt - 1;\r
+                        end if;\r
                     else\r
                         io_brk;\r
                         init_done := '1';\r
index 2dededc..e204125 100644 (file)
@@ -12,8 +12,7 @@ entity chr_rom is
             clk             : in std_logic;
             ce_n            : in std_logic;     --active low.
             addr            : in std_logic_vector (abus_size - 1 downto 0);
-            data            : out std_logic_vector (dbus_size - 1 downto 0);
-            nt_v_mirror     : out std_logic
+            data            : out std_logic_vector (dbus_size - 1 downto 0)
         );
 end chr_rom;
 
@@ -49,25 +48,6 @@ function rom_fill return rom_array is
         return ret;
     end rom_fill;
 
-function vmirror return std_logic is 
-    type binary_file is file of character;
-    FILE nes_file : binary_file OPEN read_mode IS "rom-file.nes" ;
-    variable read_data : character;
-    variable i : integer;
-    variable ret : std_logic_vector(7 downto 0);
-    begin
-        --read NES cardridge header part
-        for i in 0 to 15 loop
-            read(nes_file, read_data);
-            if (i = 6) then
-                ret :=
-                    conv_std_logic_vector(character'pos(read_data), 8);
-            end if;
-        end loop;
-        d_print("nes header read ok.");
-        return ret(0);
-    end vmirror;
-
 --for GHDL environment
 --itinialize with the rom_fill function.
 --signal p_rom : rom_array := rom_fill;
@@ -79,9 +59,6 @@ attribute ram_init_file of p_rom : signal is "sample1-chr.hex";
 
 begin
     
-    --nt_v_mirror <= vmirror;
-    nt_v_mirror <= '1';
-
     p : process (clk)
     begin
     if (rising_edge(clk)) then
index bf02b9d..7c7ea41 100644 (file)
@@ -144,6 +144,17 @@ component counter_register
     );
 end component;
 
+component d_flip_flop_bit
+    port (  
+            clk     : in std_logic;
+            res_n   : in std_logic;
+            set_n   : in std_logic;
+            we_n    : in std_logic;
+            d       : in std_logic;
+            q       : out std_logic
+        );
+end component;
+
 constant dsize     : integer := 8;
 
 constant PPUCTRL   : std_logic_vector(2 downto 0) := "000";
@@ -207,6 +218,7 @@ signal plt_bus_ce_n     : std_logic;
 signal oam_plt_addr     : std_logic_vector (dsize - 1 downto 0);
 signal oam_plt_data     : std_logic_vector (dsize - 1 downto 0);
 signal plt_data_out     : std_logic_vector (dsize - 1 downto 0);
+signal ST_VBL_old       : std_logic;
 
 begin
 
@@ -305,6 +317,10 @@ begin
     plt_data_out_inst : d_flip_flop generic map(dsize)
             port map (ppu_clk_n, rst_n, '1', ppu_data_we_n, oam_plt_data, plt_data_out);
 
+    ST_VBL_old_inst : d_flip_flop_bit
+            port map (ppu_clk_n, rst_n, '1', '0', ppu_status(ST_VBL), ST_VBL_old);
+
+
     reg_set_p : process (rst_n, ce_n, r_nw, cpu_addr)
     begin
 
@@ -313,21 +329,19 @@ begin
             ppu_mask_we_n    <= '1';
             oam_addr_we_n    <= '1';
             oam_data_we_n    <= '1';
-            ppu_scroll_x_we_n    <= '1';
-            ppu_scroll_y_we_n    <= '1';
             ppu_scroll_cnt_ce_n  <= '1';
             read_status <= '0';
             read_data_n <= '1';
         elsif (rst_n = '1' and ce_n = '0') then
 
             --register set.
-            if(cpu_addr = PPUCTRL) then
+            if(cpu_addr = PPUCTRL and r_nw = '0') then
                 ppu_ctrl_we_n <= '0';
             else
                 ppu_ctrl_we_n <= '1';
             end if;
 
-            if(cpu_addr = PPUMASK) then
+            if(cpu_addr = PPUMASK and r_nw = '0') then
                 ppu_mask_we_n <= '0';
             else
                 ppu_mask_we_n <= '1';
@@ -340,30 +354,21 @@ begin
                 read_status <= '0';
             end if;
 
-            if(cpu_addr = OAMADDR) then
+            if(cpu_addr = OAMADDR and r_nw = '0') then
                 oam_addr_we_n <= '0';
             else
                 oam_addr_we_n <= '1';
             end if;
 
-            if(cpu_addr = OAMDATA) then
+            if(cpu_addr = OAMDATA and r_nw = '0') then
                 oam_data_we_n <= '0';
             else
                 oam_data_we_n <= '1';
             end if;
 
-            if(cpu_addr = PPUSCROLL) then
+            if(cpu_addr = PPUSCROLL and r_nw = '0') then
                 ppu_scroll_cnt_ce_n <= '0';
-                if (ppu_scroll_cnt(0) = '0') then
-                    ppu_scroll_x_we_n <= '0';
-                    ppu_scroll_y_we_n <= '1';
-                else
-                    ppu_scroll_y_we_n <= '0';
-                    ppu_scroll_x_we_n <= '1';
-                end if;
             else
-                ppu_scroll_x_we_n <= '1';
-                ppu_scroll_y_we_n <= '1';
                 ppu_scroll_cnt_ce_n <= '1';
             end if;
 
@@ -377,8 +382,6 @@ begin
             ppu_mask_we_n    <= '1';
             oam_addr_we_n    <= '1';
             oam_data_we_n    <= '1';
-            ppu_scroll_x_we_n    <= '1';
-            ppu_scroll_y_we_n    <= '1';
             ppu_scroll_cnt_ce_n  <= '1';
             read_status <= '0';
             read_data_n <= '1';
@@ -388,6 +391,28 @@ begin
 
     ppu_clk_cnt_res_n <= not ce_n;
 
+    --scroll reg...
+    scl_reg_p : process (rst_n, ppu_clk)
+    begin
+        if (rst_n = '0') then
+            ppu_scroll_x_we_n <= '1';
+            ppu_scroll_y_we_n <= '1';
+        elsif (rising_edge(ppu_clk)) then
+            if (ppu_scroll_cnt_ce_n = '0' and ppu_clk_cnt = "01" and r_nw = '0') then
+                if (ppu_scroll_cnt(0) = '1') then
+                    ppu_scroll_x_we_n <= '0';
+                    ppu_scroll_y_we_n <= '1';
+                else
+                    ppu_scroll_y_we_n <= '0';
+                    ppu_scroll_x_we_n <= '1';
+                end if;
+            else
+                ppu_scroll_x_we_n <= '1';
+                ppu_scroll_y_we_n <= '1';
+            end if;
+        end if;
+    end process;
+
     --cpu nmi generation...
     clk_nmi_p : process (rst_n, ppu_clk)
     begin
@@ -395,8 +420,12 @@ begin
             vblank_n <= '1';
         elsif (rising_edge(ppu_clk)) then
             if (ppu_status(ST_VBL) = '1' and ppu_ctrl(PPUNEN) = '1') then
-                --start vblank.
-                vblank_n <= '0';
+                --nmi takes place only when ST_VBL arises...
+                --doesn't work....
+--                if (ST_VBL_old = '0') then
+                    --start vblank.
+                    vblank_n <= '0';
+--                end if;
             else
                 --clear flag.
                 vblank_n <= '1';
@@ -405,7 +434,7 @@ begin
     end process;
     
     --cpu and ppu clock timing adjustment...
-    clk_cnt_set_p : process (rst_n, ce_n, r_nw, cpu_addr, ppu_clk)
+    clk_cnt_set_p : process (rst_n, ce_n, r_nw, cpu_addr, ppu_clk, cpu_d, ppu_clk_cnt, ppu_addr_cnt)
     begin
         if (rst_n = '0') then
             ppu_latch_rst_n <= '0';
index d90bae0..734be44 100644 (file)
@@ -669,6 +669,8 @@ signal spr_y_tmp        : std_logic_vector (dsize - 1 downto 0);
 signal spr_tile_tmp     : std_logic_vector (dsize - 1 downto 0);\r
 signal spr_ptn_in       : std_logic_vector (dsize - 1 downto 0);\r
 \r
+signal sprite0_evaluated    : std_logic;\r
+signal sprite0_displayed    : std_logic;\r
 \r
 begin\r
     dbg_ppu_clk <= ppu_clk;\r
@@ -747,11 +749,9 @@ begin
 \r
     prf_y <= cur_y + ppu_scroll_y\r
                     when cur_x < conv_std_logic_vector(HSCAN, X_SIZE) and\r
-                         cur_y + ppu_scroll_y <\r
-                            conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE) else\r
+                         cur_y < conv_std_logic_vector(VSCAN, X_SIZE) else\r
              cur_y + ppu_scroll_y + "000000001" \r
-                    when cur_y + ppu_scroll_y <\r
-                            conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE) else\r
+                    when cur_y < conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE) else\r
              "000000000"; \r
 \r
     nt_inst : d_flip_flop generic map(dsize)\r
@@ -984,51 +984,51 @@ begin
         end if; --if (rst_n = '0') then\r
     end process;\r
 \r
-    clk_p : process (rst_n, ppu_clk, read_status)\r
+    clk_p : process (rst_n, ppu_clk)\r
 \r
 procedure output_rgb is\r
 variable pl_addr : integer;\r
 variable pl_index : integer;\r
-variable dot_output : boolean;\r
 begin\r
-    dot_output := false;\r
-\r
-    --first show sprite.\r
-    if (ppu_mask(PPUSSP) = '1') then\r
-        for i in 0 to 7 loop\r
-            if (spr_x_cnt(i) = "00000000") then\r
-                if ((spr_ptn_h(i)(0) or spr_ptn_l(i)(0)) = '1') then\r
-                    dot_output := true;\r
-                    exit;\r
-                end if;\r
-            end if;\r
-        end loop;\r
-    end if;\r
-\r
-    if (dot_output = true and ppu_mask(PPUSBG) = '1' and \r
-            (disp_ptn_h(0) or disp_ptn_l(0)) = '1') then\r
-        --raise sprite 0 hit.\r
-        ppu_status(ST_SP0) <= '1';\r
-    end if;\r
-\r
-    --first color in the palette is transparent color.\r
-    if (ppu_mask(PPUSBG) = '1' and dot_output = false and \r
-            (disp_ptn_h(0) or disp_ptn_l(0)) = '1') then\r
-        dot_output := true;\r
+    if (rst_n = '0') then\r
+        b <= (others => '0');\r
+        g <= (others => '0');\r
+        r <= (others => '0');\r
+    else\r
+        if ((cur_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+            (cur_y < conv_std_logic_vector(VSCAN, X_SIZE))) then\r
+            --if or if not bg/sprite is shown, output color anyway \r
+            --sinse universal bg color is included..\r
+            pl_index := conv_integer(plt_data(5 downto 0));\r
+            b <= nes_color_palette(pl_index) (11 downto 8);\r
+            g <= nes_color_palette(pl_index) (7 downto 4);\r
+            r <= nes_color_palette(pl_index) (3 downto 0);\r
+        else\r
+            b <= (others => '0');\r
+            g <= (others => '0');\r
+            r <= (others => '0');\r
+        end if;\r
     end if;\r
-\r
-    --if or if not bg/sprite is shown, output color anyway \r
-    --sinse universal bg color is included..\r
-    pl_index := conv_integer(plt_data(5 downto 0));\r
-    b <= nes_color_palette(pl_index) (11 downto 8);\r
-    g <= nes_color_palette(pl_index) (7 downto 4);\r
-    r <= nes_color_palette(pl_index) (3 downto 0);\r
 end;\r
-procedure stop_rgb is\r
+\r
+procedure set_sp0_hit is\r
 begin\r
-    b <= (others => '0');\r
-    g <= (others => '0');\r
-    r <= (others => '0');\r
+    if (rst_n = '0') then\r
+        ppu_status(ST_SP0) <= '0';\r
+    else\r
+        if ((cur_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
+            (cur_y < conv_std_logic_vector(VSCAN, X_SIZE))) then\r
+            if (sprite0_displayed = '1' \r
+                and (ppu_mask(PPUSSP) = '1' and (spr_x_cnt(0) & (spr_ptn_h(0)(0) or spr_ptn_l(0)(0)) = "000000001"))\r
+                and (ppu_mask(PPUSBG) = '1' and ((disp_ptn_h(0) or disp_ptn_l(0)) = '1'))\r
+                    ) then\r
+                --raise sprite 0 hit.\r
+                ppu_status(ST_SP0) <= '1';\r
+            end if;\r
+        else\r
+            ppu_status(ST_SP0) <= '0';\r
+        end if;\r
+    end if;\r
 end;\r
 \r
     begin\r
@@ -1036,7 +1036,6 @@ end;
             nt_we_n <= '1';\r
             ppu_status <= (others => '0');\r
             s_oam_data <= (others => 'Z');\r
-            stop_rgb;\r
         else\r
 \r
             if (ppu_clk'event and ppu_clk = '1') then\r
@@ -1201,6 +1200,11 @@ end;
                                     s_oam_cnt_ce_n <= '0';\r
                                     --copy remaining oam entry.\r
                                     p_oam_cnt_ce_n <= '1';\r
+                                    \r
+                                    --check sprite 0 is used.\r
+                                    if (p_oam_cnt = "00000000") then\r
+                                        sprite0_evaluated <= '1';\r
+                                    end if;\r
                                 else\r
                                     --goto next entry\r
                                     p_oam_cnt_ce_n <= '0';\r
@@ -1310,6 +1314,11 @@ end;
                         else\r
                             spr_ptn_h_we_n(conv_integer(s_oam_addr_cpy(4 downto 2) - "001")) <= '1';\r
                         end if;\r
+                        \r
+                        --check sprite 0 is used in the next line.\r
+                        if (sprite0_evaluated = '1') then\r
+                            sprite0_displayed <= '1';\r
+                        end if;\r
 \r
                     elsif (cur_x > conv_std_logic_vector(320, X_SIZE)) then\r
                         --clear last write enable.\r
@@ -1335,29 +1344,29 @@ end;
                         spr_x_ce_n <= "11111111";\r
                         spr_ptn_ce_n <= "11111111";\r
                     end if; --if ((cur_x < conv_std_logic_vector(HSCAN, X_SIZE)) \r
-                end if; --if (ppu_mask(PPUSSP) = '1') then\r
+                else\r
+                    --sprite evaluation are cleared during the blank line.\r
+                    sprite0_evaluated <= '0';\r
+                    sprite0_displayed <= '0';\r
+                end if; --if (ppu_mask(PPUSSP) = '1') \r
+                        --(cur_y < conv_std_logic_vector(VSCAN, X_SIZE) or \r
+                        --cur_y = conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE))) then\r
+                \r
 \r
                 --output visible area only.\r
-                if ((cur_x < conv_std_logic_vector(HSCAN, X_SIZE)) and\r
-                    (cur_y < conv_std_logic_vector(VSCAN, X_SIZE))) then\r
-                    --output image.\r
-                    output_rgb;\r
-                else\r
-                    stop_rgb;\r
-                end if;\r
+                output_rgb;\r
 \r
                 --flag operation\r
-                if ((cur_x = conv_std_logic_vector(1, X_SIZE)) and\r
-                    (cur_y = conv_std_logic_vector(VSCAN + 1, X_SIZE))) then\r
+                --TODO: sprite overflow is not inplemented!\r
+                ppu_status(ST_SOF) <= '0';\r
+                set_sp0_hit;\r
+\r
+                if ((cur_y > conv_std_logic_vector(VSCAN, X_SIZE))) then\r
                     --vblank start\r
                     ppu_status(ST_VBL) <= '1';\r
-                elsif ((cur_x = conv_std_logic_vector(1, X_SIZE)) and\r
-                    (cur_y = conv_std_logic_vector(VSCAN_MAX - 1, X_SIZE))) then\r
-                    ppu_status(ST_SP0) <= '0';\r
+                else\r
                     --vblank end\r
                     ppu_status(ST_VBL) <= '0';\r
-                    --TODO: sprite overflow is not inplemented!\r
-                    ppu_status(ST_SOF) <= '0';\r
                 end if;\r
             end if; --if (clk'event and clk = '1') then\r
 \r
index 490c75e..0311569 100644 (file)
@@ -1,19 +1,19 @@
-:2000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000E8\r
-:200020000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD8\r
-:20004000FF00000000000000000000000000000000FF0000000000000000000000000000A2\r
-:200060000000FF00000000000000000000000000000000FF00000000000000000000000082\r
-:200080000000000000000000FFFFFFFF000000000000000000000000808080808080808064\r
-:2000A000000000000000000040404040404040400000000000000000202020202020202040\r
-:2000C000000000000000000010101010101010100000000000000000F0F0F0F0F0F0F0F020\r
-:2000E0000103070F1F3F7FFF0103070F1F3F7FFFFF00FF00FF00FF00000000000000000018\r
-:200100000000000000000000AAAAAAAAAAAAAAAA8142241818244281814224181824428193\r
-:20012000FFFF0000FFFF000000000000000000000000000000000000CCCCCCCCCCCCCCCC63\r
-:20014000FFFFC3C3C3C3FFFFFFFFC3C3C3C3FFFF00003C3C3C3C000000000000000000009F\r
-:20016000AA55AA55AA55AA5500000000000000000000000000000000CCCC3333CCCC333387\r
-:20018000AA54A850A0408000AA54A850A040800055AA54A850A04080000000000000000008\r
-:2001A000663399CC663399CC663399CC663399CC000000000000000018183C3C6666C3C34D\r
-:2001C000C0F03C0F0F3CF0C000000000000000000000000000000000183C7EFFFF7E3C1887\r
-:2001E000181818FFFF181818181818FFFF181818F0F0F0F0F0F0F0F000000000FFFFFFFF67\r
+:200000000000000000000000000000000000000000000000000000000000000000000000E0\r
+:200020000000000000000000000000000000000000000000000000000000000000000000C0\r
+:200040000000000000000000000000000000000000000000000000000000000000000000A0\r
+:20006000000000000000000000000000000000000000000000000000000000000000000080\r
+:20008000000000000000000000000000000000000000000000000000000000000000000060\r
+:2000A000000000000000000000000000000000000000000000000000000000000000000040\r
+:2000C000000000000000000000000000000000000000000000000000000000000000000020\r
+:2000E000000000000000000000000000000000000000000000000000000000000000000000\r
+:200100000000000000000000000000000000000000000000000000000000000000000000DF\r
+:200120000000000000000000000000000000000000000000000000000000000000000000BF\r
+:2001400000000000000000000000000000000000000000000000000000000000000000009F\r
+:2001600000000000000000000000000000000000000000000000000000000000000000007F\r
+:2001800000000000000000000000000000000000000000000000000000000000000000005F\r
+:2001A00000000000000000000000000000000000000000000000000000000000000000003F\r
+:2001C00000000000000000000000000000000000000000000000000000000000000000001F\r
+:2001E0000000000000000000000000000000000000000000000000000000000000000000FF\r
 :20020000000000000000000000000000000000001C3E3E3E1C1C1C1C183C3C1818001800C0\r
 :20022000367E7E7E00000000246C6C00000000007E7EFFFFFFFF7E7E6C6CFE6CFE6C6C0006\r
 :200240007EFFFFFE7FFFFE7E7CD6D07C16D67C00F3F7FEFC3F7FEFCFE2A4E8102E4A8E0040\r
index df6c1ef..85aa6f1 100644 (file)
-:2000000078A2FF9AA9008D00208D0120A93F8D0620A9008D0620A9118D0720A9018D072066\r
-:20002000A9038D0720A9138D0720A90F8D0720A9048D0720A9148D0720A9248D0720A90F79\r
-:200040008D0720A9088D0720A9188D0720A9288D0720A9058D0720A90C8D0720A91C8D0769\r
-:2000600020A92C8D0720A9008D0720A9248D0720A91B8D0720A9118D0720A9008D0720A90D\r
-:20008000328D0720A9168D0720A9208D0720A9008D0720A9268D0720A9018D0720A9318DE5\r
-:2000A0000720A9208D0620A9068D0620A9448D0720A9458D0720A9458D0720A9218D0620D9\r
-:2000C000A9E68D0620A9208D0620A9208D0620A9018D0720A9028D0720A9038D0720A9041C\r
-:2000E0008D0720A9058D0720A9068D0720A9078D0720A9088D0720A9098D0720A90A8D0711\r
-:2001000020A90B8D0720A90C8D0720A90D8D0720A90E8D0720A90F8D0720A9208D0620A988\r
-:20012000408D0620A9118D0720A9128D0720A9138D0720A9148D0720A9158D0720A9168D50\r
-:200140000720A9178D0720A9188D0720A9198D0720A91A8D0720A91B8D0720A91C8D0720B1\r
-:20016000A91D8D0720A91E8D0720A91F8D0720A9238D0620A9C18D0620A9D88D0720A90094\r
-:200180008D0320A9028D0420A94D8D0420A9038D0420A9648D0420A9328D0420A94F8D047C\r
-:2001A00020A9018D0420A91E8D0420A93C8D0420A9508D0420A9018D0420A9218D0420A98D\r
-:2001C0003D8D0420A9518D0420A9028D0420A92D8D0420A91E8D0120A9808D00204CDD81AE\r
-:2001E0004000000000000000000000000000000000000000000000000000000000000000BF\r
-:200200000000000000000000000000000000000000000000000000000000000000000000DE\r
-:200220000000000000000000000000000000000000000000000000000000000000000000BE\r
-:2002400000000000000000000000000000000000000000000000000000000000000000009E\r
-:2002600000000000000000000000000000000000000000000000000000000000000000007E\r
-:2002800000000000000000000000000000000000000000000000000000000000000000005E\r
+:2000000078A2FF9A20628E20188EAD908E8500AD918E850120B88D20B88D20B88D20B88D21\r
+:2000200020B88D20B88D20009420FE8B20C68A20488A20DF8920E88720F883202C81204355\r
+:2000400081201883ADAB8E8500ADAC8E850120B88D4C6B80AD3D9FD005A900200000ADBF5D\r
+:200060008E8500ADC08E850120B88DA9238D0620A9C18D0620A9D88D0720A9008D0520A9B2\r
+:20008000008D0520A93C8D0603A91E8D01208D0503A9808D00208D04034C998020108EADEF\r
+:2000A000208F8500AD218F850120B88DA9088D0320A9148D0420A94D8D0420A9038D0420F1\r
+:2000C000A9648D04206020108EAD318F8500AD328F850120B88DA9508D0C02A9648D0D02BC\r
+:2000E000A9038D0E02A9648D0F02A95A8D1002A9648D1102A9038D1202A9328D1302A964E6\r
+:200100008D2002A9658D2102A9038D2202A9C88D2302A91E8D3002A9448D3102A9038D3254\r
+:2001200002A9C88D3302A9028D14406020108EAD4F8F8500AD508F850120B88D209C8020FD\r
+:20014000C68060A212A0E5A9558D7804A9C3187D6604C918F003205480A9558D4B05A9F111\r
+:2001600018796604C946F003205480A9558D1C05A91C8566A9058567A9C338E154C96EF098\r
+:2001800003205480A9558D2204A922850AA904850BA9C301F8C9D7F003205480A9558D9E0B\r
+:2001A00005A98C8554A9058555A012A9C33154C941F003205480A9668D7106A98C8554A946\r
+:2001C000058555A0E5A9C35154C9A5F003205480A9159D5503CD6703F003205480A96799DB\r
+:2001E0005503EC3A04D003205480CD3A04F003205480A9FF85A2A90485A3A9888190ADFF32\r
+:2002000004C9E5D003205480C988F003205480A9FF85FFA9058500A9D181EDADFF05C9E587\r
+:20022000D003205480C9D1F003205480A9F185FFA9058500A003A9A591FFADF405C9A5F0A0\r
+:2002400003205480A9FF85FFA9068500A012A9DD91FFAD1107C9DDF003205480A9558D782A\r
+:2002600004387E6604AD7804C9AAF003205480A2E5A9A58D7604383E9103AD7604C94BF0C6\r
+:20028000032054804C0183A902C903D07A00000000000000000000000000000000000000D6\r
 :2002A00000000000000000000000000000000000000000000000000000000000000000003E\r
 :2002C00000000000000000000000000000000000000000000000000000000000000000001E\r
 :2002E0000000000000000000000000000000000000000000000000000000000000000000FE\r
-:200300000000000000000000000000000000000000000000000000000000000000000000DD\r
-:200320000000000000000000000000000000000000000000000000000000000000000000BD\r
-:2003400000000000000000000000000000000000000000000000000000000000000000009D\r
-:2003600000000000000000000000000000000000000000000000000000000000000000007D\r
-:2003800000000000000000000000000000000000000000000000000000000000000000005D\r
-:2003A00000000000000000000000000000000000000000000000000000000000000000003D\r
-:2003C00000000000000000000000000000000000000000000000000000000000000000001D\r
-:2003E0000000000000000000000000000000000000000000000000000000000000000000FD\r
-:200400000000000000000000000000000000000000000000000000000000000000000000DC\r
-:200420000000000000000000000000000000000000000000000000000000000000000000BC\r
-:2004400000000000000000000000000000000000000000000000000000000000000000009C\r
-:2004600000000000000000000000000000000000000000000000000000000000000000007C\r
-:2004800000000000000000000000000000000000000000000000000000000000000000005C\r
-:2004A00000000000000000000000000000000000000000000000000000000000000000003C\r
-:2004C00000000000000000000000000000000000000000000000000000000000000000001C\r
-:2004E0000000000000000000000000000000000000000000000000000000000000000000FC\r
-:200500000000000000000000000000000000000000000000000000000000000000000000DB\r
-:200520000000000000000000000000000000000000000000000000000000000000000000BB\r
-:2005400000000000000000000000000000000000000000000000000000000000000000009B\r
-:2005600000000000000000000000000000000000000000000000000000000000000000007B\r
-:2005800000000000000000000000000000000000000000000000000000000000000000005B\r
-:2005A00000000000000000000000000000000000000000000000000000000000000000003B\r
-:2005C00000000000000000000000000000000000000000000000000000000000000000001B\r
-:2005E0000000000000000000000000000000000000000000000000000000000000000000FB\r
-:200600000000000000000000000000000000000000000000000000000000000000000000DA\r
-:200620000000000000000000000000000000000000000000000000000000000000000000BA\r
-:2006400000000000000000000000000000000000000000000000000000000000000000009A\r
-:2006600000000000000000000000000000000000000000000000000000000000000000007A\r
-:2006800000000000000000000000000000000000000000000000000000000000000000005A\r
-:2006A00000000000000000000000000000000000000000000000000000000000000000003A\r
-:2006C00000000000000000000000000000000000000000000000000000000000000000001A\r
-:2006E0000000000000000000000000000000000000000000000000000000000000000000FA\r
-:200700000000000000000000000000000000000000000000000000000000000000000000D9\r
-:200720000000000000000000000000000000000000000000000000000000000000000000B9\r
-:20074000000000000000000000000000000000000000000000000000000000000000000099\r
-:20076000000000000000000000000000000000000000000000000000000000000000000079\r
-:20078000000000000000000000000000000000000000000000000000000000000000000059\r
-:2007A000000000000000000000000000000000000000000000000000000000000000000039\r
-:2007C000000000000000000000000000000000000000000000000000000000000000000019\r
-:2007E0000000000000000000000000000000000000000000000000000000000000000000F9\r
-:200800000000000000000000000000000000000000000000000000000000000000000000D8\r
-:200820000000000000000000000000000000000000000000000000000000000000000000B8\r
-:20084000000000000000000000000000000000000000000000000000000000000000000098\r
-:20086000000000000000000000000000000000000000000000000000000000000000000078\r
-:20088000000000000000000000000000000000000000000000000000000000000000000058\r
-:2008A000000000000000000000000000000000000000000000000000000000000000000038\r
-:2008C000000000000000000000000000000000000000000000000000000000000000000018\r
-:2008E0000000000000000000000000000000000000000000000000000000000000000000F8\r
-:200900000000000000000000000000000000000000000000000000000000000000000000D7\r
-:200920000000000000000000000000000000000000000000000000000000000000000000B7\r
-:20094000000000000000000000000000000000000000000000000000000000000000000097\r
-:20096000000000000000000000000000000000000000000000000000000000000000000077\r
-:20098000000000000000000000000000000000000000000000000000000000000000000057\r
-:2009A000000000000000000000000000000000000000000000000000000000000000000037\r
-:2009C000000000000000000000000000000000000000000000000000000000000000000017\r
-:2009E0000000000000000000000000000000000000000000000000000000000000000000F7\r
-:200A00000000000000000000000000000000000000000000000000000000000000000000D6\r
-:200A20000000000000000000000000000000000000000000000000000000000000000000B6\r
-:200A4000000000000000000000000000000000000000000000000000000000000000000096\r
-:200A6000000000000000000000000000000000000000000000000000000000000000000076\r
-:200A8000000000000000000000000000000000000000000000000000000000000000000056\r
-:200AA000000000000000000000000000000000000000000000000000000000000000000036\r
-:200AC000000000000000000000000000000000000000000000000000000000000000000016\r
-:200AE0000000000000000000000000000000000000000000000000000000000000000000F6\r
-:200B00000000000000000000000000000000000000000000000000000000000000000000D5\r
-:200B20000000000000000000000000000000000000000000000000000000000000000000B5\r
-:200B4000000000000000000000000000000000000000000000000000000000000000000095\r
-:200B6000000000000000000000000000000000000000000000000000000000000000000075\r
-:200B8000000000000000000000000000000000000000000000000000000000000000000055\r
-:200BA000000000000000000000000000000000000000000000000000000000000000000035\r
-:200BC000000000000000000000000000000000000000000000000000000000000000000015\r
-:200BE0000000000000000000000000000000000000000000000000000000000000000000F5\r
-:200C00000000000000000000000000000000000000000000000000000000000000000000D4\r
-:200C20000000000000000000000000000000000000000000000000000000000000000000B4\r
-:200C4000000000000000000000000000000000000000000000000000000000000000000094\r
-:200C6000000000000000000000000000000000000000000000000000000000000000000074\r
-:200C8000000000000000000000000000000000000000000000000000000000000000000054\r
-:200CA000000000000000000000000000000000000000000000000000000000000000000034\r
-:200CC000000000000000000000000000000000000000000000000000000000000000000014\r
-:200CE0000000000000000000000000000000000000000000000000000000000000000000F4\r
-:200D00000000000000000000000000000000000000000000000000000000000000000000D3\r
-:200D20000000000000000000000000000000000000000000000000000000000000000000B3\r
-:200D4000000000000000000000000000000000000000000000000000000000000000000093\r
-:200D6000000000000000000000000000000000000000000000000000000000000000000073\r
-:200D8000000000000000000000000000000000000000000000000000000000000000000053\r
-:200DA000000000000000000000000000000000000000000000000000000000000000000033\r
-:200DC000000000000000000000000000000000000000000000000000000000000000000013\r
-:200DE0000000000000000000000000000000000000000000000000000000000000000000F3\r
-:200E00000000000000000000000000000000000000000000000000000000000000000000D2\r
-:200E20000000000000000000000000000000000000000000000000000000000000000000B2\r
-:200E4000000000000000000000000000000000000000000000000000000000000000000092\r
-:200E6000000000000000000000000000000000000000000000000000000000000000000072\r
-:200E8000000000000000000000000000000000000000000000000000000000000000000052\r
-:200EA000000000000000000000000000000000000000000000000000000000000000000032\r
-:200EC000000000000000000000000000000000000000000000000000000000000000000012\r
-:200EE0000000000000000000000000000000000000000000000000000000000000000000F2\r
-:200F00000000000000000000000000000000000000000000000000000000000000000000D1\r
-:200F20000000000000000000000000000000000000000000000000000000000000000000B1\r
-:200F4000000000000000000000000000000000000000000000000000000000000000000091\r
-:200F6000000000000000000000000000000000000000000000000000000000000000000071\r
-:200F8000000000000000000000000000000000000000000000000000000000000000000051\r
-:200FA000000000000000000000000000000000000000000000000000000000000000000031\r
-:200FC000000000000000000000000000000000000000000000000000000000000000000011\r
-:200FE0000000000000000000000000000000000000000000000000000000E0810080000010\r
+:2003000000A901C901F08020108EADF38E8500ADF48E850120B88D60AD3E9FD00160A000B3\r
+:20032000A2418600A2008A990002C8A500C95BD004A9418500E600990002C8A90399000229\r
+:20034000C88A6903AA2A990002C8D0DAA9028D144020108EAD128F8500AD138F850120B834\r
+:200360008D60AD3E9FD00160A000C8C8C8B90002186901990002C8D0F1A9028D1440602070\r
+:20038000898320DF8320628340CE0603D050AD050329E78D01208D0503A93C8D0603AD075C\r
+:2003A00003F008CE0703A9314CB083EE0703A932AE00038E0620AE01038E0620A2338E0709\r
+:2003C00020AE00038E0620EE0103AE01038E06208D0720AD050309188D01208D050360A96A\r
+:2003E000008D05208D0203AE0303E8E0F0D002A2008E05208E030360ADE28E8500ADE38E72\r
+:20040000850120B88D08A9004828A9EA086829EFC9A0F003205480A9004828A9000868290A\r
+:20042000EFC922F003205480A9004828A2A4086829EFC9A0F003205480A9004828A2000801\r
+:200440006829EFC922F003205480A9004828A02B086829EFC920F003205480A9004828A055\r
+:20046000BB086829EFC9A0F003205480A9004828A000086829EFC922F003205480A9FBA989\r
+:20048000C348288D0105086829EFC9E3F003205480A2FBA9C348288E0F05086829EFC9E32C\r
+:2004A000F003205480A000A9C348288C1005086829EFC9E3F003205480A9C34828AA086827\r
+:2004C00029EFC9E1F003205480A9004828AA086829EFC922F003205480A9C34828A8086862\r
+:2004E00029EFC9E1F003205480C0C3F003205480A9004828A8086829EFC922F003205480CE\r
+:20050000C000F003205480A9C34828BA086829EFC9E1F003205480BA8AA8A900AA9AA9C340\r
+:200520004828BA086829EFC963F003205480E000F00320548098AA9AA259A9C348288A08EA\r
+:200540006829EFC961F003205480A2ACA9C348288A086829EFC9E1F003205480A200A9C32F\r
+:2005600048288A086829EFC963F003205480BA8AA8A200A9C348289A086829EFC963F0003E\r
+:20058000A29AA9C348289A086829EFC9E1F00098AA9AA000A9C3482898086829EFC963F0F3\r
+:2005A00003205480A0B5A9C3482898086829EFC9E1F003205480A9C34828A0C0845018A991\r
+:2005C00030655008AA6829EFC9A0F003205480E0F0F003205480A9C34828A0EE8C5005387A\r
+:2005E000A9AD6D500508AA6829EFC9A1F003205480E09CF003205480A9C34828A0EE8C51B6\r
+:200600000538A9116D500508AA6829EFC923F003205480E000F003205480A9C34828A04B8E\r
+:200620008C520538A9646D520508AA6829EFC9E0F003205480E0B0F003205480A9C34828B9\r
+:20064000A08E84E4A9B3A23035B408AA6829EFC9E1F003205480E082F003205480A9C3482D\r
+:2006600028A07E8CE404A981A2303DB40408AA6829EFC963F003205480E000F003205480C3\r
+:20068000A9C34828A9B30A08AA6829EFC961F003205480E066F003205480A9C34828A961C2\r
+:2006A000857BA2CE16AD086829EFC9E0F003205480B4ADC0C2F003205480A9C34828A98020\r
+:2006C00085E506E5086829EFC963F003205480A4E5C000F003205480A9C34828A90085E50B\r
+:2006E000A90124E5086829EFC923F003205480A9C34828A94A8D4004A9012C400408682999\r
+:20070000EFC963F003205480A9C34828A9918DE504A9E5A0F2D9F303086829EFC961F003B7\r
+:20072000205480A9C34828A2E58EE504A9E5A0F2D9F303086829EFC963F003205480A9C3F5\r
+:200740004828A27E8ED705A9E58510A9048511A0F2A945D110086829EFC9E0F003205480C0\r
+:20076000BA8650A2D9A9C348289A086829EFC9E1F000A200A9C348289A086829EFC963F01A\r
+:2007800000A6509AA000A90BA9C3482898086829EFC963F00320548098C900F0032054801E\r
+:2007A000A0B0A900A9C3482898086829EFC9E1F00320548098C9B0F003205480A9768572A5\r
+:2007C000A9058573A9918D7605A2A3A9C34828A99961CF08AA6829EFC961F003205480E07B\r
+:2007E0002BF0032054802860AD628F8500AD638F850120B88D18900320548038B0032054B4\r
+:2008000080A900F00320548018E9053003205480D003205480186906100320548038A992D3\r
+:20082000E946700320548038A992E9125003205480A900A200F07B4CB288EAEAEAEAEAEAB5\r
+:20084000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA58\r
+:20086000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA38\r
+:20088000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA18\r
+:2008A000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE8E001F080A900A200F07B4C3889C8\r
+:2008C000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAD8\r
+:2008E000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAB8\r
+:20090000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEA97\r
+:20092000EAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE8E001F08018A96469\r
+:20094000204A89C9C8F00E205480204E89602052896069646038A9C84C658969324C6A8985\r
+:200960004C5B8969324C60896932C9FBF00320548038A9C36C778989897F8984898E896C77\r
+:200980007B8969E669E66C7D896C798969E6C9AAF003205480A92348A94648A96E48380842\r
+:2009A00078081808A9FF08A90008A9FF28F003205480283003205480289003205480282831\r
+:2009C000B0032054805868C96EF00320548068C946F00320548068C923F00320548060ADEC\r
+:2009E000748F8500AD758F850120B88DA939856BA9A18DCC04A99F85FFA2FD066BA56BC9A5\r
+:200A000072F003205480CECC04ADCC04C9A0F0032054805ECF03ADCC04C950F00320548065\r
+:200A2000F602A5FFC9A0F0032054801836023602A5FFC981F0032054803876027602A5FFA1\r
+:200A4000C9E0F00320548060AD868F8500AD878F850120B88DA97885A1A90585A2A9B7A293\r
+:200A6000E1A08A85A98E990A9D800D941F91A1C5A9F003205480EC990AF003205480CD6104\r
+:200A80000EF003205480C400F003205480CD0206F003205480A9F185B0A90585B1A27CA980\r
+:200AA000618134ADF105C961F003205480A9AA8520A9048521A0EC8CAA04A21BA105C9EC43\r
+:200AC000F00320548060AD988F8500AD998F850120B88D18A90D69FAC907F003205480A925\r
+:200AE00037855EA9C98571A9B6255E2471F003205480A93B8D2104A9D78D1B05A9EB8DCC66\r
+:200B000006AE2104E88A4D1B05A8CCCC06F003205480A217A0A1A92F8D5903A990999001D2\r
+:200B20008A19900138FD4203A8C068F003205480A2CDA9F18535A9AC85BCA98D3568A09AEA\r
+:200B4000592200AAE02DF003205480A9388590A9088591A9D98D0209A90AA0CA187190C9A6\r
+:200B6000E3F003205480A93385C0A90485C1A9D08D3304A26BA922386155C9F3F003205471\r
+:200B800080A93485C1A90485C2A9F58D3404E8A91F2155C915F003205480A93585C2A9049E\r
+:200BA00085C3A0758C3504E8A975C155F003205480A93685C3A90485C4A9888D3604E8A96A\r
+:200BC000C14155C949F003205480A93785C4A90485C5A92E8D3704E8A9910155C9BFF00313\r
+:200BE000205480A93885C5A90485C6A97F8D3804E8A96A18E155C9EAF00320548060ADAA53\r
+:200C00008F8500ADAB8F850120B88DA980180AF003205480B00320548010032054800AF014\r
+:200C20000320548090032054801003205480A9400AD00320548090032054803003205480C7\r
+:200C4000C980F003205480A9A50AC94AF0032054800AC994F003205480A901084828B003EF\r
+:200C600020548018900320548028A9400848287003205480B8500320548028A203CAD00388\r
+:200C8000205480E002F0032054801003205480CAD003205480E001F00320548010032054B0\r
+:200CA00080CAF003205480E000F0032054801003205480CAD0032054803003205480E0FF9E\r
+:200CC000F003205480A2803003205480CA1003205480E07FF003205480A05088C04FF00353\r
+:200CE00020548088C04EF003205480C8C04FF003205480E8E080F003205480A901184AF09A\r
+:200D000003205480B0032054804AF0032054809003205480A95A4AC92DF003205480A9A505\r
+:200D2000386AC9D2F0032054806A9003205480C9E9F003205480182A2AC9A5F00320548044\r
+:200D4000B00320548008A9004828900320548038B0032054807808682904D0032054805831\r
+:200D600008682904F00320548028A901AA1003205480D003205480E001F003205480CA8A89\r
+:200D80001003205480F003205480A901A8C8C898C003F003205480BA8600A2309AA9DD48C7\r
+:200DA000BAE02FF003205480A6009AA9EEAD3001C9DDF0032054806020108EAD00038D06E0\r
+:200DC00020AD01038D0620A000B1008D0720F004C84CC98D98291FC91FF009A9008D07200E\r
+:200DE000C84CD48DAD01038C01036D01038D0103AAAD000390061869018D0003C923D00F6E\r
+:200E00008AC9C0D00AA9208D0003A9008D010360AD3D9FD00268686020108EA9008D002053\r
+:200E20008D04038D01208D0503A93F8D0620A9008D0620A200A020BD428E8D0720E888D001\r
+:200E4000F6600F0010200F0414240F0818280F0C1C2C0F0010200F0616260F0818280F0AF8\r
+:200E60001A2AAD3D9FF028A9208D0003A9018D0103A9008D0203A9008D0303A9008D040345\r
+:200E8000A9008D0503A9008D0603A9008D070360928E72656772657373696F6E2074657368\r
+:200EA000742073746172742E2E2E00AD8E74657374207375636365656465642E2E2E00C1DB\r
+:200EC0008E74657374206661696C656421212100D28E6164647265737320746573742E2E5A\r
+:200EE0002E00E48E73746174757320746573742E2E2E00F58E7061676520626F7264657286\r
+:200F00002063726F7373696E6720746573742E2E2E00148F646D6120746573742E2E2E00A0\r
+:200F2000228F73707269746520746573742E2E2E00338F73696D706C6520737072697465FC\r
+:200F400020746573742028646D61292E2E2E00518F70707520696E737420746573742E2E35\r
+:200F60002E00648F613520696E737420746573742E2E2E00768F613420696E737420746501\r
+:200F800073742E2E2E00888F613320696E737420746573742E2E2E009A8F613220696E73C7\r
+:200FA0007420746573742E2E2E00AC8F73696E676C65206279746520696E73742074657378\r
+:200FC000742E2E2E0000000000000000000000000000000000000000000000000000000013\r
+:200FE0000000000000000000000000000000000000000000000000000000000000000000F1\r
 :201000000000000000000000000000000000000000000000000000000000000000000000D0\r
 :201020000000000000000000000000000000000000000000000000000000000000000000B0\r
 :20104000000000000000000000000000000000000000000000000000000000000000000090\r
 :2013A00000000000000000000000000000000000000000000000000000000000000000002D\r
 :2013C00000000000000000000000000000000000000000000000000000000000000000000D\r
 :2013E0000000000000000000000000000000000000000000000000000000000000000000ED\r
-:201400000000000000000000000000000000000000000000000000000000000000000000CC\r
-:201420000000000000000000000000000000000000000000000000000000000000000000AC\r
-:2014400000000000000000000000000000000000000000000000000000000000000000008C\r
-:2014600000000000000000000000000000000000000000000000000000000000000000006C\r
-:2014800000000000000000000000000000000000000000000000000000000000000000004C\r
-:2014A00000000000000000000000000000000000000000000000000000000000000000002C\r
-:2014C00000000000000000000000000000000000000000000000000000000000000000000C\r
-:2014E0000000000000000000000000000000000000000000000000000000000000000000EC\r
-:201500000000000000000000000000000000000000000000000000000000000000000000CB\r
-:201520000000000000000000000000000000000000000000000000000000000000000000AB\r
-:2015400000000000000000000000000000000000000000000000000000000000000000008B\r
-:2015600000000000000000000000000000000000000000000000000000000000000000006B\r
-:2015800000000000000000000000000000000000000000000000000000000000000000004B\r
-:2015A00000000000000000000000000000000000000000000000000000000000000000002B\r
-:2015C00000000000000000000000000000000000000000000000000000000000000000000B\r
-:2015E0000000000000000000000000000000000000000000000000000000000000000000EB\r
-:201600000000000000000000000000000000000000000000000000000000000000000000CA\r
-:201620000000000000000000000000000000000000000000000000000000000000000000AA\r
-:2016400000000000000000000000000000000000000000000000000000000000000000008A\r
-:2016600000000000000000000000000000000000000000000000000000000000000000006A\r
-:2016800000000000000000000000000000000000000000000000000000000000000000004A\r
-:2016A00000000000000000000000000000000000000000000000000000000000000000002A\r
-:2016C00000000000000000000000000000000000000000000000000000000000000000000A\r
-:2016E0000000000000000000000000000000000000000000000000000000000000000000EA\r
-:201700000000000000000000000000000000000000000000000000000000000000000000C9\r
-:201720000000000000000000000000000000000000000000000000000000000000000000A9\r
-:20174000000000000000000000000000000000000000000000000000000000000000000089\r
-:20176000000000000000000000000000000000000000000000000000000000000000000069\r
-:20178000000000000000000000000000000000000000000000000000000000000000000049\r
-:2017A000000000000000000000000000000000000000000000000000000000000000000029\r
-:2017C000000000000000000000000000000000000000000000000000000000000000000009\r
-:2017E0000000000000000000000000000000000000000000000000000000000000000000E9\r
-:201800000000000000000000000000000000000000000000000000000000000000000000C8\r
-:201820000000000000000000000000000000000000000000000000000000000000000000A8\r
-:20184000000000000000000000000000000000000000000000000000000000000000000088\r
-:20186000000000000000000000000000000000000000000000000000000000000000000068\r
-:20188000000000000000000000000000000000000000000000000000000000000000000048\r
-:2018A000000000000000000000000000000000000000000000000000000000000000000028\r
-:2018C000000000000000000000000000000000000000000000000000000000000000000008\r
-:2018E0000000000000000000000000000000000000000000000000000000000000000000E8\r
-:201900000000000000000000000000000000000000000000000000000000000000000000C7\r
-:201920000000000000000000000000000000000000000000000000000000000000000000A7\r
-:20194000000000000000000000000000000000000000000000000000000000000000000087\r
-:20196000000000000000000000000000000000000000000000000000000000000000000067\r
-:20198000000000000000000000000000000000000000000000000000000000000000000047\r
-:2019A000000000000000000000000000000000000000000000000000000000000000000027\r
-:2019C000000000000000000000000000000000000000000000000000000000000000000007\r
-:2019E0000000000000000000000000000000000000000000000000000000000000000000E7\r
-:201A00000000000000000000000000000000000000000000000000000000000000000000C6\r
-:201A20000000000000000000000000000000000000000000000000000000000000000000A6\r
-:201A4000000000000000000000000000000000000000000000000000000000000000000086\r
-:201A6000000000000000000000000000000000000000000000000000000000000000000066\r
-:201A8000000000000000000000000000000000000000000000000000000000000000000046\r
-:201AA000000000000000000000000000000000000000000000000000000000000000000026\r
-:201AC000000000000000000000000000000000000000000000000000000000000000000006\r
-:201AE0000000000000000000000000000000000000000000000000000000000000000000E6\r
-:201B00000000000000000000000000000000000000000000000000000000000000000000C5\r
-:201B20000000000000000000000000000000000000000000000000000000000000000000A5\r
-:201B4000000000000000000000000000000000000000000000000000000000000000000085\r
-:201B6000000000000000000000000000000000000000000000000000000000000000000065\r
-:201B8000000000000000000000000000000000000000000000000000000000000000000045\r
-:201BA000000000000000000000000000000000000000000000000000000000000000000025\r
-:201BC000000000000000000000000000000000000000000000000000000000000000000005\r
-:201BE0000000000000000000000000000000000000000000000000000000000000000000E5\r
-:201C00000000000000000000000000000000000000000000000000000000000000000000C4\r
-:201C20000000000000000000000000000000000000000000000000000000000000000000A4\r
-:201C4000000000000000000000000000000000000000000000000000000000000000000084\r
-:201C6000000000000000000000000000000000000000000000000000000000000000000064\r
-:201C8000000000000000000000000000000000000000000000000000000000000000000044\r
-:201CA000000000000000000000000000000000000000000000000000000000000000000024\r
-:201CC000000000000000000000000000000000000000000000000000000000000000000004\r
-:201CE0000000000000000000000000000000000000000000000000000000000000000000E4\r
-:201D00000000000000000000000000000000000000000000000000000000000000000000C3\r
-:201D20000000000000000000000000000000000000000000000000000000000000000000A3\r
-:201D4000000000000000000000000000000000000000000000000000000000000000000083\r
-:201D6000000000000000000000000000000000000000000000000000000000000000000063\r
-:201D8000000000000000000000000000000000000000000000000000000000000000000043\r
-:201DA000000000000000000000000000000000000000000000000000000000000000000023\r
-:201DC000000000000000000000000000000000000000000000000000000000000000000003\r
-:201DE0000000000000000000000000000000000000000000000000000000000000000000E3\r
-:201E00000000000000000000000000000000000000000000000000000000000000000000C2\r
-:201E20000000000000000000000000000000000000000000000000000000000000000000A2\r
-:201E4000000000000000000000000000000000000000000000000000000000000000000082\r
-:201E6000000000000000000000000000000000000000000000000000000000000000000062\r
-:201E8000000000000000000000000000000000000000000000000000000000000000000042\r
-:201EA000000000000000000000000000000000000000000000000000000000000000000022\r
-:201EC000000000000000000000000000000000000000000000000000000000000000000002\r
-:201EE0000000000000000000000000000000000000000000000000000000000000000000E2\r
-:201F00000000000000000000000000000000000000000000000000000000000000000000C1\r
-:201F20000000000000000000000000000000000000000000000000000000000000000000A1\r
+:201400004C059F2A2A2A2A2A2A2A2A2A2A2A2A2A302A2A2A2A2A2A2A2A2A2A2A2A2A2A2A14\r
+:201420002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A6C\r
+:201440002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A4C\r
+:201460002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2C\r
+:201480002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0C\r
+:2014A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEC\r
+:2014C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ACC\r
+:2014E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEA4CCA\r
+:20150000089F2A2A2A2A2A2A2A2A2A2A2A2A2A2A312A2A2A2A2A2A2A2A2A2A2A2A2A2A2A31\r
+:201520002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A6B\r
+:201540002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A4B\r
+:201560002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2B\r
+:201580002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0B\r
+:2015A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEB\r
+:2015C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ACB\r
+:2015E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEA4C0BE8\r
+:201600009F2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A322A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0D\r
+:201620002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A6A\r
+:201640002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A4A\r
+:201660002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A\r
+:201680002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A0A\r
+:2016A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEA\r
+:2016C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2ACA\r
+:2016E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEA4C0E9F6F\r
+:20170000332A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A80\r
+:201720002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A69\r
+:201740002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A49\r
+:201760002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A29\r
+:201780002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A09\r
+:2017A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE9\r
+:2017C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC9\r
+:2017E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AA25FEAE87E\r
+:20180000E060F0032054804C119F2A2A2A2A2A2A342A2A2A2A2A2A2A2A2A2A2A2A2A2A2AFF\r
+:201820002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A68\r
+:201840002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A48\r
+:201860002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A28\r
+:201880002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A08\r
+:2018A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE8\r
+:2018C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC8\r
+:2018E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AEAE8\r
+:20190000E8E061F0032054804C149F2A2A2A2A2A352A2A2A2A2A2A2A2A2A2A2A2A2A2A2A3B\r
+:201920002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A67\r
+:201940002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A47\r
+:201960002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A27\r
+:201980002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A07\r
+:2019A0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE7\r
+:2019C0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC7\r
+:2019E0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A38A93BEA49\r
+:201A0000699BC9D7F0032054804C179F2A2A2A2A362A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE5\r
+:201A20002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A66\r
+:201A40002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A46\r
+:201A60002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A26\r
+:201A80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A06\r
+:201AA0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE6\r
+:201AC0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC6\r
+:201AE0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A38A977EA092D\r
+:201B0000F0C9F7F0032054804C1A9F2A2A2A2A2A372A2A2A2A2A2A2A2A2A2A2A2A2A2A2AAA\r
+:201B20002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A65\r
+:201B40002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A45\r
+:201B60002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A25\r
+:201B80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A05\r
+:201BA0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE5\r
+:201BC0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC5\r
+:201BE0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A38A9C18D2006A991EAED200611\r
+:201C0000C9D0F0032054804C1D9F2A2A2A2A2A2A382A2A2A2A2A2A2A2A2A2A2A2A2A2A2A92\r
+:201C20002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A64\r
+:201C40002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A44\r
+:201C60002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A24\r
+:201C80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A04\r
+:201CA0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE4\r
+:201CC0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC4\r
+:201CE0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A209FEA6CFA9CF5\r
+:201D00004C239F2A2A2A2A2A2A2A2A2A2A2A2A2A392A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE4\r
+:201D20002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A63\r
+:201D40002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A43\r
+:201D60002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A23\r
+:201D80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A03\r
+:201DA0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE3\r
+:201DC0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC3\r
+:201DE0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A269FEA6CFB5F\r
+:201E00009D4C299F2A2A2A2A2A2A2A2A2A2A2A2A31302A2A2A2A2A2A2A2A2A2A2A2A2A2A6C\r
+:201E20002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A62\r
+:201E40002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A42\r
+:201E60002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A22\r
+:201E80002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A02\r
+:201EA0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AE2\r
+:201EC0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2AC2\r
+:201EE0002A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2A2C9FEA6C29\r
+:201F0000FC9E4C2F9F4CFE944CFD954CFC964CFC974CFF984CFC994CFB9A4CF49B4CFC9C30\r
+:201F20004C009D4CFD9D4C019E4CFE9E4C029FADD08E8500ADD18E850120B88D6001010029\r
 :201F4000000000000000000000000000000000000000000000000000000000000000000081\r
 :201F6000000000000000000000000000000000000000000000000000000000000000000061\r
 :201F8000000000000000000000000000000000000000000000000000000000000000000041\r
 :201FA000000000000000000000000000000000000000000000000000000000000000000021\r
 :201FC000000000000000000000000000000000000000000000000000000000000000000001\r
-:201FE0000000000000000000000000000000000000000000000000000000000000000000E1\r
+:201FE00000000000000000000000000000000000000000000000000000007F83008000005F\r
 :00000001FF\r
index edd9e22..0c47241 100644 (file)
@@ -16,7 +16,7 @@ vsim -t 1ps +transport_int_delays +transport_path_delays -sdftyp /sim_board=de1_
 \r
 add wave -divider cpu\r
 add wave -label rst_n       sim:/testbench_motones_sim/sim_board/rst_n\r
-add wave -label nmi   sim:/testbench_motones_sim/sim_board/dbg_nmi\r
+add wave -label nmi         sim:/testbench_motones_sim/sim_board/dbg_nmi\r
 add wave -label cpu_clk       sim:/testbench_motones_sim/sim_board/dbg_cpu_clk\r
 #add wave -label vga_clk   sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(4)\r
 #add wave -label mem_clk sim:/testbench_motones_sim/sim_board/dbg_mem_clk\r
@@ -26,25 +26,25 @@ add wave -label cpu_clk       sim:/testbench_motones_sim/sim_board/dbg_cpu_clk
 add wave -label r_nw       sim:/testbench_motones_sim/sim_board/dbg_r_nw\r
 add wave -label addr       -radix hex sim:/testbench_motones_sim/sim_board/dbg_addr\r
 add wave -label d_io       -radix hex sim:/testbench_motones_sim/sim_board/dbg_d_io\r
-#add wave -label instruction -radix hex sim:/testbench_motones_sim/sim_board/dbg_instruction\r
+add wave -label instruction -radix hex sim:/testbench_motones_sim/sim_board/dbg_instruction\r
 \r
 \r
 add wave -divider ce-pins\r
-#add wave -label rom_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(5)\r
-#add wave -label ram_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(6)\r
+add wave -label rom_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(5)\r
+add wave -label ram_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(6)\r
 \r
 #add wave -radix hex sim:/testbench_motones_sim/sim_board/dbg_int_d_bus\r
-#add wave -label exec_cycle -radix hex sim:/testbench_motones_sim/sim_board/dbg_exec_cycle\r
-#add wave -label ea_carry   -radix decimal -unsigned  sim:/testbench_motones_sim/sim_board/dbg_ea_carry     \r
+add wave -label exec_cycle -radix hex sim:/testbench_motones_sim/sim_board/dbg_exec_cycle\r
+add wave -label ea_carry   -radix decimal -unsigned  sim:/testbench_motones_sim/sim_board/dbg_ea_carry     \r
 #add wave -label wait_a58_branch_next -radix hex sim:/testbench_motones_sim/sim_board/dbg_wait_a58_branch_next     \r
 \r
 \r
 \r
-add wave -divider regs\r
-\r
+#add wave -divider regs\r
+#\r
 #add wave -label pcl  -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_ctrl\r
 #add wave -label pch  -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_mask\r
-\r
+#\r
 #add wave -label acc    -radix hex sim:/testbench_motones_sim/sim_board/dbg_acc\r
 #add wave -label sp     -radix hex sim:/testbench_motones_sim/sim_board/dbg_sp\r
 #add wave -label x      -radix hex sim:/testbench_motones_sim/sim_board/dbg_x\r
@@ -52,71 +52,68 @@ add wave -divider regs
 #add wave -label status -radix hex sim:/testbench_motones_sim/sim_board/dbg_status\r
 \r
 \r
-#add wave -divider ppu\r
+add wave -divider ppu\r
 add wave -label ppu_clk    sim:/testbench_motones_sim/sim_board/dbg_ppu_clk\r
 add wave -label ppu_ce_n          sim:/testbench_motones_sim/sim_board/dbg_ppu_ce_n\r
 add wave -label ppu_ctrl  -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_ctrl\r
 add wave -label ppu_mask  -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_mask\r
-#add wave -label ppu_status   -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_status\r
+add wave -label ppu_status   -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_status\r
 add wave -label ppu_addr -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_addr\r
 add wave -label ppu_data -radix hex sim:/testbench_motones_sim/sim_board/dbg_ppu_data\r
+add wave -label ppu_scrl_x -radix decimal -unsigned  sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x\r
+add wave -label ppu_scrl_y -radix decimal -unsigned  sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y\r
 \r
 \r
 add wave -divider vga_pos\r
-add wave -label vga_x           -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(2 downto 1) & sim:/testbench_motones_sim/sim_board/dbg_int_d_bus (7 downto 0)}\r
-add wave -label nes_y           -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(4) & sim:/testbench_motones_sim/sim_board/dbg_status (7 downto 0)}\r
-\r
-add wave -label emu_ppu_clk           sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(3)\r
-add wave -label nes_x           -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(0) & sim:/testbench_motones_sim/sim_board/dbg_instruction (7 downto 0)}\r
+add wave -label nes_x           -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(0) & \r
+                                                           sim:/testbench_motones_sim/sim_board/dbg_instruction(7 downto 0)}\r
+add wave -label nes_y           -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_exec_cycle(4) & \r
+                                                           sim:/testbench_motones_sim/sim_board/dbg_status(7 downto 0)}\r
 add wave -label dbg_disp_nt     -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_nt\r
 add wave -label dbg_disp_attr   -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_attr\r
-add wave -label dbg_disp_ptn_h  -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h\r
-add wave -label dbg_disp_ptn_l  -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_l\r
+#add wave -label dbg_disp_ptn_h  -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h\r
+#add wave -label dbg_disp_ptn_l  -radix hex sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_l\r
 \r
 add wave -divider vram\r
-\r
-\r
-add wave  -label ppu_clk_cnt -radix decimal -unsigned  {sim:/testbench_motones_sim/sim_board/dbg_sp(7 downto 6)}\r
-\r
 add wave -label ale sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(0)\r
 add wave -label rd_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(1)\r
 add wave -label wr_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(2)\r
 add wave -label nt0_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_x(3)\r
-###add wave  -radix hex -label vram_addr {sim:/testbench_motones_sim/sim_board/dbg_vram_a(13 downto 8) & sim:/testbench_motones_sim/sim_board/dbg_vram_ad(7 downto 0)}\r
-add wave  -radix hex -label v_addr {sim:/testbench_motones_sim/sim_board/dbg_sp(5 downto 0) & sim:/testbench_motones_sim/sim_board/dbg_x(7 downto 0)}\r
+\r
+add wave  -radix hex -label v_addr {sim:/testbench_motones_sim/sim_board/dbg_sp(5 downto 0)}\r
 add wave  -radix hex -label vram_ad sim:/testbench_motones_sim/sim_board/dbg_vram_ad\r
 \r
-###\r
-###\r
-###add wave -label plt_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(5)\r
-###add wave -label plt_r_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(4)\r
-###add wave -label plt_w_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(3)\r
-###add wave  -radix hex -label plt_addr {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h(12 downto 8)}\r
-###add wave  -radix hex -label plt_data {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h(7 downto 0)}\r
-###\r
-###\r
-###\r
-###add wave -divider vga_out\r
-###add wave -label h_sync_n    sim:/testbench_motones_sim/sim_board/v_sync_n\r
-###add wave -label v_sync_n    sim:/testbench_motones_sim/sim_board/h_sync_n\r
-###add wave -label r           -radix hex sim:/testbench_motones_sim/sim_board/r\r
-###add wave -label g           -radix hex sim:/testbench_motones_sim/sim_board/g\r
-###add wave -label b           -radix hex sim:/testbench_motones_sim/sim_board/b\r
+#add wave -label plt_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(5)\r
+#add wave -label plt_r_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(4)\r
+#add wave -label plt_w_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(3)\r
+#add wave -label oam_ce_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(2)\r
+#add wave -label oam_r_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(1)\r
+#add wave -label oam_w_n sim:/testbench_motones_sim/sim_board/dbg_ppu_scrl_y(0)\r
+#add wave  -radix hex -label plt_addr {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h(12 downto 8)}\r
+#add wave  -radix hex -label plt_data {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_h(7 downto 0)}\r
+\r
+\r
+add wave -divider oam\r
+add wave  -radix hex -label p_oam_addr {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_l (7 downto 0)}\r
+add wave  -radix hex -label p_oam_data {sim:/testbench_motones_sim/sim_board/dbg_disp_ptn_l (15 downto 8)}\r
+\r
+#add wave -divider vga_out\r
+#add wave -label h_sync_n    sim:/testbench_motones_sim/sim_board/v_sync_n\r
+#add wave -label v_sync_n    sim:/testbench_motones_sim/sim_board/h_sync_n\r
+#add wave -label r           -radix hex sim:/testbench_motones_sim/sim_board/r\r
+#add wave -label g           -radix hex sim:/testbench_motones_sim/sim_board/g\r
+#add wave -label b           -radix hex sim:/testbench_motones_sim/sim_board/b\r
 \r
 \r
 view structure\r
 view signals\r
 #run -all\r
-run 1 us\r
+run 8 us\r
 wave zoom full\r
 \r
 #wave zoom range 3339700 ps 5138320 ps\r
 \r
-run 54 us\r
-\r
-run 77 us\r
-\r
-run 10 us\r
+run 100 us\r
 \r
 ##wave addcursor 907923400 ps\r
 \r
index 6a9c26d..4f3ec78 100644 (file)
@@ -11,42 +11,44 @@ if {[file exists rtl_work]} {
 vlib rtl_work\r
 vmap work rtl_work\r
 \r
-vcom -93 -work work {../../motonesfpga_common.vhd}\r
-vcom -93 -work work {../../mem/ram.vhd}\r
-vcom -93 -work work {../../ppu/ppu_registers.vhd}\r
-vcom -93 -work work {../../clock/clock_divider.vhd}\r
-vcom -93 -work work {../../address_decoder.vhd}\r
-vcom -93 -work work {../../de1_nes.vhd}\r
-vcom -93 -work work {../../mem/chr_rom.vhd}\r
-vcom -93 -work work {../../ppu/vga_ppu.vhd}\r
-vcom -93 -work work {../../ppu/ppu.vhd}\r
-vcom -93 -work work {../../dummy-mos6502.vhd}\r
-\r
-vcom -93 -work work {../../apu/apu.vhd}\r
-#vcom -93 -work work {../../mem/prg_rom.vhd}\r
-#vcom -93 -work work {../../cpu/cpu_registers.vhd}\r
-#vcom -93 -work work {../../cpu/mos6502.vhd}\r
-#vcom -93 -work work {../../cpu/decoder.vhd}\r
-#vcom -93 -work work {../../cpu/alu.vhd}\r
-\r
-vcom -93 -work work {../../testbench_motones_sim.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/address_decoder.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/motonesfpga_common.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/clock/clock_divider.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/mem/ram.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/apu/apu.vhd}\r
+\r
+#ppu block...\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/mem/chr_rom.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/ppu/ppu.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/ppu/ppu_registers.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/ppu/vga_ppu.vhd}\r
+\r
+#cpu block...\r
+#vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/mem/prg_rom.vhd}\r
+#vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/cpu/alu.vhd}\r
+#vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/cpu/cpu_registers.vhd}\r
+#vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/cpu/decoder.vhd}\r
+#vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/cpu/mos6502.vhd}\r
+\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/dummy-mos6502.vhd}\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/de1_nes.vhd}\r
+\r
+vcom -93 -work work {D:/daisuke/nes/repo/motonesfpga/de1_nes/testbench_motones_sim.vhd}\r
 \r
 vsim -t 1ps -L lpm -L altera -L altera_mf -L sgate -L cycloneii -L rtl_work -L work testbench_motones_sim\r
 \r
-##add wave sim:/testbench_motones_sim/sim_board/ppu_clk\r
 \r
 add wave -label rst_n sim:/testbench_motones_sim/sim_board/rst_n;\r
-add wave -label rdy sim:/testbench_motones_sim/sim_board/rdy\r
+add wave -label nmi_n sim:/testbench_motones_sim/sim_board/cpu_inst/nmi_n;\r
 add wave -label r_nw sim:/testbench_motones_sim/sim_board/r_nw;\r
 add wave -label cpu_clk sim:/testbench_motones_sim/sim_board/cpu_clk\r
-add wave -label nmi_n sim:/testbench_motones_sim/sim_board/nmi_n\r
 add wave -label addr -radix hex sim:/testbench_motones_sim/sim_board/addr\r
 add wave -label d_io -radix hex sim:/testbench_motones_sim/sim_board/d_io\r
 \r
 #add wave -label instruction -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/instruction\r
 #add wave -label int_d_bus -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/int_d_bus\r
 #add wave -label exec_cycle -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/exec_cycle\r
-\r
+#\r
 #add wave -divider regs\r
 #add wave -label acc -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/acc/q\r
 #add wave -label status_val -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/status_register/status_val\r
@@ -57,70 +59,82 @@ add wave -label d_io -radix hex sim:/testbench_motones_sim/sim_board/d_io
 \r
 ##add wave -radix hex sim:/testbench_motones_sim/sim_board/cpu_inst/status_reg\r
 \r
-add wave -divider apu\r
-\r
-\r
-\r
 add wave -divider ppu\r
-\r
+add wave  -label cpu_addr -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/cpu_addr\r
+add wave  -label cpu_d -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/cpu_d\r
 add wave -label ppu_ce_n sim:/testbench_motones_sim/sim_board/ppu_inst/ce_n\r
-add wave -label ppu_clk sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk\r
-\r
-add wave -label ppu_clk_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk_cnt\r
-\r
+#add wave -label ppu_clk sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk\r
+#add wave -label ppu_clk_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk_cnt\r
 add wave -label ppu_ctl -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_ctrl\r
 add wave -label ppu_mask -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_mask\r
 add wave -label ppu_status -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_status\r
-\r
-\r
-add wave -label ppu_addr_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_cnt\r
+#add wave -label ppu_addr_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_cnt\r
 #add wave -label ppu_addr_we_n -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_we_n\r
 #add wave -label ppu_addr_in -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_in\r
 #add wave -label ppu_addr_inc1 -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_inc1\r
 #add wave -label ppu_addr_inc32 -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr_inc32\r
-\r
 add wave -label ppu_addr -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_addr\r
 add wave -label ppu_data -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_data\r
-#add wave -label ppu_scr_x -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scrl_x\r
-#add wave -label ppu_scr_y -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scrl_y\r
 \r
 \r
+add wave -divider ppu_scrl\r
+#add wave -label ppu_ce_n sim:/testbench_motones_sim/sim_board/ppu_inst/ce_n\r
+#add wave -label ppu_clk sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk\r
+#add wave -label ppu_scroll_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_cnt\r
+#add wave -label ppu_clk_cnt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_clk_cnt\r
+#\r
+#add wave -label ppu_scroll_cnt_ce_n sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_cnt_ce_n\r
+#add wave -label ppu_scroll_x_we_n sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_x_we_n\r
+#add wave -label ppu_scroll_y_we_n sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_y_we_n\r
+add wave -label ppu_scr_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_x\r
+add wave -label ppu_scr_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/ppu_scroll_y\r
+\r
 \r
-add wave -divider vram\r
-add wave  -radix hex -label nt0_ce_n sim:/testbench_motones_sim/sim_board/nt0_ce_n\r
-add wave  -radix hex -label v_addr sim:/testbench_motones_sim/sim_board/v_addr\r
-add wave  -radix hex -label vram_ad sim:/testbench_motones_sim/sim_board/vram_ad\r
+add wave -divider render\r
+#add wave -label vba_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/vga_x\r
+add wave -label nes_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/nes_x\r
+#add wave -label vga_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/vga_y\r
+add wave -label nes_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/nes_y\r
 \r
-add wave  -label ale sim:/testbench_motones_sim/sim_board/ale\r
-add wave  -label rd_n sim:/testbench_motones_sim/sim_board/rd_n\r
-add wave  -label wr_n sim:/testbench_motones_sim/sim_board/wr_n\r
 \r
+add wave -label cur_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/cur_x\r
+add wave -label prf_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/prf_x\r
+add wave -label cur_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/cur_y\r
+add wave -label prf_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/prf_y\r
+\r
+add wave -label disp_nt -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/disp_nt\r
+add wave -label disp_attr -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/disp_attr\r
+add wave -label attr_val -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/attr_val\r
 \r
-add wave -divider render\r
 \r
 #add wave -radix hex sim:/testbench_motones_sim/sim_board/ppu_inst/nes_r \\r
 #sim:/testbench_motones_sim/sim_board/ppu_inst/nes_g \\r
 #sim:/testbench_motones_sim/sim_board/ppu_inst/nes_b\r
 \r
-add wave -label vga_clk sim:/testbench_motones_sim/sim_board/ppu_inst/vga_clk\r
-add wave -label emu_ppu_clk sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/ppu_clk\r
-\r
 add wave -label h_sync_n sim:/testbench_motones_sim/sim_board/ppu_inst/h_sync_n\r
 add wave -label v_sync_n sim:/testbench_motones_sim/sim_board/ppu_inst/v_sync_n\r
 \r
-add wave -label vga_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/x_inst/q\r
-add wave -label vga_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/y_inst/q\r
 \r
-add wave -label nes_x -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/cur_x\r
-add wave -label nes_y -radix decimal -unsigned sim:/testbench_motones_sim/sim_board/ppu_inst/vga_render_inst/ppu_render_inst/cur_y\r
+\r
+#add wave -divider apu\r
+#add wave  -label cpu_addr sim:/testbench_motones_sim/sim_board/apu_inst/dma_start_n\r
+#add wave  -label dma_next_status -radix hex sim:/testbench_motones_sim/sim_board/apu_inst/dma_next_status\r
+#add wave  -label dma_status -radix hex sim:/testbench_motones_sim/sim_board/apu_inst/dma_status\r
+#add wave  -label dma_cnt_ce sim:/testbench_motones_sim/sim_board/apu_inst/dma_cnt_ce\r
+#add wave  -label rdy sim:/testbench_motones_sim/sim_board/apu_inst/rdy\r
+#add wave  -label dma_write_we_n sim:/testbench_motones_sim/sim_board/apu_inst/dma_write_we_n\r
+#add wave  -label dma_addr -radix hex sim:/testbench_motones_sim/sim_board/apu_inst/dma_addr\r
+#add wave  -label dma_start_n sim:/testbench_motones_sim/sim_board/apu_inst/dma_start_n\r
+#add wave  -label dma_end_n sim:/testbench_motones_sim/sim_board/apu_inst/dma_end_n\r
+\r
 \r
 \r
 view structure\r
 view signals\r
 \r
-run 10 us\r
+run 8 us\r
+run 6000 us\r
 wave zoom full\r
+#run 10000 us\r
 \r
-run 440 us\r
-#run 65 us\r
 \r
index d5b1180..e7e1e49 100644 (file)
@@ -401,7 +401,7 @@ ConcurrentFileLimit = 40
 ; Specify whether or not a WLF file should be deleted when the\r
 ; simulation ends.  A value of 1 will cause the WLF file to be deleted.\r
 ; The default is 0 (do not delete WLF file when simulation ends).\r
-WLFDeleteOnQuit = 1\r
+WLFDeleteOnQuit = 1\r
 \r
 ; Automatic SDF compilation\r
 ; Disables automatic compilation of SDF files in flows that support it.\r
index 2840dcb..ecd1ba4 100644 (file)
Binary files a/de1_nes/simulation/modelsim/rom-file.nes and b/de1_nes/simulation/modelsim/rom-file.nes differ
index 67529a3..3b5d9ce 100644 (file)
@@ -54,7 +54,8 @@ architecture stimulus of testbench_motones_sim is
         v_sync_n    : out std_logic;
         r           : out std_logic_vector(3 downto 0);
         g           : out std_logic_vector(3 downto 0);
-        b           : out std_logic_vector(3 downto 0)
+        b           : out std_logic_vector(3 downto 0);
+        nt_v_mirror : in std_logic
          );
     end component;
 
@@ -70,6 +71,7 @@ architecture stimulus of testbench_motones_sim is
     signal b           : std_logic_vector(3 downto 0);
     signal joypad1     : std_logic_vector(7 downto 0);
     signal joypad2     : std_logic_vector(7 downto 0);
+    signal nt_v_mirror : std_logic;
 
     constant powerup_time   : time := 2 us;
     constant reset_time     : time := 890 ns;
@@ -149,7 +151,7 @@ dbg_disp_ptn_h, dbg_disp_ptn_l ,
 dbg_nmi,
     
     base_clk, reset_input, joypad1, joypad2, 
-            h_sync_n, v_sync_n, r, g, b);
+            h_sync_n, v_sync_n, r, g, b, nt_v_mirror);
 
     --- input reset.
     reset_p: process
@@ -192,5 +194,7 @@ dbg_nmi,
         end if;
     end process;
 
+    --set chr rom mirror setting.
+    nt_v_mirror <= '1';
 end stimulus;
 
index 1a111b8..6807d93 100644 (file)
Binary files a/doc/de1-memory-doc.xlsx and b/doc/de1-memory-doc.xlsx differ
index 2c4fc32..8e3d34b 100644 (file)
Binary files a/doc/mos6502-ppu.xlsx and b/doc/mos6502-ppu.xlsx differ
index 67c9e91..7deb8fc 100644 (file)
@@ -5,16 +5,7 @@ OBJECTS        =       $(ASMSOURCES:.asm=.o)
 LIBRARIES =\r
 #-------------------------------------------------------------------------------\r
 all :  $(OBJECTS) $(LIBRARIES)\r
-       ld65 -o regression.nes --config sample1.cfg --obj $(OBJECTS)\r
-       ./dd-img.sh regression\r
-       cp sample1-chr.hex ../../de1_nes/\r
-#      cp sample1-prg.hex ../../de1_nes/\r
-#      cp regression.nes ../../de1_nes/simulation/modelsim/rom-file.nes\r
-\r
-    \r
-run : all\r
-       VirtuaNES.exe regression.nes\r
-\r
+       ld65 -o sample1.nes --config sample1.cfg --obj $(OBJECTS)\r
 \r
 .SUFFIXES : .asm .o\r
 \r
@@ -22,7 +13,8 @@ run : all
        ca65 -t none $*.asm\r
 \r
 clean :\r
-       -rm *.nes\r
+       -rm sample1.nes\r
        -rm *.o\r
-       -rm *.bin *.hex\r
+       -rm *.hex\r
+       -rm *.bin\r
 \r
index a6fe672..87cdeba 100644 (file)
Binary files a/tools/ppu-regression-test/character.chr and b/tools/ppu-regression-test/character.chr differ
index 32fe828..7fcad38 100755 (executable)
@@ -20,9 +20,9 @@ echo "processing...."
 dd if=$in_file of=$out_file1 bs=16 skip=1 count=2048 2> /dev/null
 dd if=$in_file of=$out_file2 bs=16 skip=2049 2> /dev/null
 #4k img creation
-dd if=$in_name-prg.bin of=$in_name-prg-8k.bin bs=512 count=16
+dd if=sample1-prg.bin of=sample1-prg-4k.bin bs=512 count=8
 
-bin2hex $in_name-prg-8k.bin sample1-prg.hex
-bin2hex $in_name-chr.bin sample1-chr.hex
+bin2hex sample1-prg-4k.bin sample1-prg.hex
+bin2hex sample1-chr.bin sample1-chr.hex
 
 echo "done."
diff --git a/tools/ppu-regression-test/pattern-img.png b/tools/ppu-regression-test/pattern-img.png
deleted file mode 100644 (file)
index 7d7c251..0000000
Binary files a/tools/ppu-regression-test/pattern-img.png and /dev/null differ
index f57ed4f..27c1d73 100644 (file)
 .segment "STARTUP"\r
 .proc  Reset\r
 \r
+;;; de1 env decoder bug test\r
+;;;LDA   $8182, y\r
+;;;STA   $2007\r
+;;;INY   \r
+;;;DEX   \r
+;;;;;BPL   #-10\r
+;;;LDA   $8182, y\r
+;;;STA   $2007\r
+;;;INY   \r
+;;;DEX   \r
+;;;;;BPL   #-10\r
+;;;LDA   #$3d\r
+;;;STA   $0302               ;;;>>>invalid store address!!!! @ 907,921,200 ps\r
+\r
+\r
+\r
 \r
 ; interrupt off, initialize sp.\r
        sei\r
        sta     $2001\r
 \r
 \r
-    ;;bg palette\r
        lda     #$3f\r
        sta     $2006\r
        lda     #$00\r
        sta     $2006\r
 \r
-       lda     #$11\r
-       sta     $2007\r
-       lda     #$01\r
-       sta     $2007\r
-       lda     #$03\r
-       sta     $2007\r
-       lda     #$13\r
-       sta     $2007\r
-\r
-       lda     #$0f\r
-       sta     $2007\r
-       lda     #$04\r
-       sta     $2007\r
-       lda     #$14\r
-       sta     $2007\r
-       lda     #$24\r
-       sta     $2007\r
-\r
-       lda     #$0f\r
-       sta     $2007\r
-       lda     #$08\r
-       sta     $2007\r
-       lda     #$18\r
-       sta     $2007\r
-       lda     #$28\r
-       sta     $2007\r
-\r
-       lda     #$05\r
-       sta     $2007\r
-       lda     #$0c\r
-       sta     $2007\r
-       lda     #$1c\r
-       sta     $2007\r
-       lda     #$2c\r
-       sta     $2007\r
-\r
-    ;;sprite..\r
-       lda     #$00\r
-       sta     $2007\r
-       lda     #$24\r
-       sta     $2007\r
-       lda     #$1b\r
-       sta     $2007\r
-       lda     #$11\r
-       sta     $2007\r
-\r
-       lda     #$00\r
-       sta     $2007\r
-       lda     #$32\r
-       sta     $2007\r
-       lda     #$16\r
+    ;;load palette.\r
+       ldx     #$00\r
+       ldy     #$20\r
+copypal:\r
+       lda     palettes, x\r
        sta     $2007\r
-       lda     #$20\r
-       sta     $2007\r
-\r
-       lda     #$00\r
-       sta     $2007\r
-       lda     #$26\r
-       sta     $2007\r
-       lda     #$01\r
-       sta     $2007\r
-       lda     #$31\r
-       sta     $2007\r
-\r
-\r
+       inx\r
+       dey\r
+       bne     copypal\r
 \r
-    ;;name table set.\r
        lda     #$20\r
        sta     $2006\r
-       lda     #$06\r
+       lda     #$ab\r
        sta     $2006\r
+       ldx     #$00\r
+       ldy     #$0d\r
 \r
-;;0x44, 45, 45 = DEE\r
-       lda     #$44\r
+    ;;load name table.\r
+copymap:\r
+       lda     string, x\r
        sta     $2007\r
-       lda     #$45\r
-       sta     $2007\r
-       lda     #$45\r
-       sta     $2007\r
-\r
+       inx\r
+       dey\r
+       bne     copymap\r
 \r
-       lda     #$20\r
-       sta     $2006\r
-       lda     #$60\r
-       sta     $2006\r
-\r
-       lda     #48\r
-       sta     $2007\r
-       lda     #49\r
-       sta     $2007\r
-       lda     #50\r
-       sta     $2007\r
-       lda     #51\r
-       sta     $2007\r
-       lda     #52\r
-       sta     $2007\r
-       lda     #53\r
-       sta     $2007\r
-       lda     #54\r
-       sta     $2007\r
-       lda     #55\r
-       sta     $2007\r
-       lda     #56\r
+    ;;scroll reg set.\r
+       lda     #$00\r
+       sta     $2005\r
+       sta     $2005\r
 \r
+;;;;----------------------\r
+    ;;load name tbl.\r
+    ldy #$00\r
+    ldx #$40    ;;name table entry cnt.\r
 \r
+    lda #$20\r
+    sta $2006\r
+    lda #$c0\r
+    sta $2006\r
 \r
-       lda     #$21\r
-       sta     $2006\r
-       lda     #$e6\r
-       sta     $2006\r
+nt_st:\r
+    lda nt1, y\r
+    sta $2007\r
+    iny\r
+    dex\r
+    bpl nt_st\r
 \r
-;;test pattern\r
-       lda     #$20\r
-       sta     $2006\r
-       lda     #$20\r
-       sta     $2006\r
+    ;;load attr tbl.\r
+    ldy #$00\r
+    ldx #$08    ;;attribute entry cnt\r
 \r
-       lda     #$01\r
-       sta     $2007\r
-       lda     #$02\r
-       sta     $2007\r
-       lda     #$03\r
-       sta     $2007\r
-       lda     #$04\r
-       sta     $2007\r
-       lda     #$05\r
-       sta     $2007\r
-       lda     #$06\r
-       sta     $2007\r
-       lda     #$07\r
-       sta     $2007\r
-       lda     #$08\r
-       sta     $2007\r
-       lda     #$09\r
-       sta     $2007\r
-       lda     #$0a\r
-       sta     $2007\r
-       lda     #$0b\r
-       sta     $2007\r
-       lda     #$0c\r
-       sta     $2007\r
-       lda     #$0d\r
-       sta     $2007\r
-       lda     #$0e\r
-       sta     $2007\r
-       lda     #$0f\r
-       sta     $2007\r
+    lda #$23\r
+    sta $2006\r
+    lda #$c8\r
+    sta $2006\r
 \r
-       lda     #$20\r
-       sta     $2006\r
-       lda     #$40\r
-       sta     $2006\r
+at_st:\r
+    lda at1, y\r
+    sta $2007\r
+    iny\r
+    dex\r
+    bpl at_st\r
 \r
-       lda     #$10\r
-       sta     $2007\r
-       lda     #$11\r
-       sta     $2007\r
-       lda     #$12\r
-       sta     $2007\r
-       lda     #$13\r
-       sta     $2007\r
-       lda     #$14\r
-       sta     $2007\r
-       lda     #$15\r
-       sta     $2007\r
-       lda     #$16\r
-       sta     $2007\r
-       lda     #$17\r
-       sta     $2007\r
-       lda     #$18\r
-       sta     $2007\r
-       lda     #$19\r
-       sta     $2007\r
-       lda     #$1a\r
-       sta     $2007\r
-       lda     #$1b\r
-       sta     $2007\r
-       lda     #$1c\r
-       sta     $2007\r
-       lda     #$1d\r
-       sta     $2007\r
-       lda     #$1e\r
-       sta     $2007\r
-       lda     #$1f\r
-       sta     $2007\r
+    ;;set universal bg color.\r
+    lda #$3d\r
+    sta $0302\r
+    jsr set_bg_col\r
+\r
+    ;;set scroll reg.\r
+    ;;lda #$a6\r
+    lda #$05\r
+    sta $0300\r
+    lda #00\r
+    sta $0301\r
+    jsr set_scroll\r
+\r
+    ;;set next page name table\r
+    ldy #$00\r
+    ldx #$0b\r
 \r
+    lda #$24\r
+    sta $2006\r
+    lda #$c0\r
+    sta $2006\r
 \r
-;;attr\r
-       lda     #$23\r
-       sta     $2006\r
-       lda     #$c1\r
-       sta     $2006\r
+nt2_st:\r
+    lda nt2, y\r
+    sta $2007\r
+    iny\r
+    dex\r
+    bpl nt2_st\r
 \r
-;;--attr=11011000\r
-       lda     #$d8\r
-       sta     $2007\r
+    ;;next page attr.\r
+    lda #$27\r
+    sta $2006\r
+    lda #$d0\r
+    sta $2006\r
 \r
+    lda #$e4\r
+    sta $2007\r
 \r
+;;---------------------\r
 ;;;set sprite\r
     ;;sprite addr=00\r
     lda #$00\r
     sta $2003\r
-\r
-    ;;sprite data: y=02\r
-    lda #3\r
+    ;;sprite data: y=60\r
+    lda #$3c\r
     sta $2004\r
     ;;tile=0x4d (ascii 'M')\r
     lda #$4d\r
     sta $2004\r
-    lda #$01\r
-    sta $2004\r
-    ;x=100\r
-    lda #$64\r
-    sta $2004\r
-\r
-    lda #$32\r
-    sta $2004\r
-    lda #$4f\r
-    sta $2004\r
-    lda #$01\r
-    sta $2004\r
-    lda #$1e\r
-    sta $2004\r
-\r
-    lda #60\r
-    sta $2004\r
-    lda #$50\r
-    sta $2004\r
-    lda #$01\r
-    sta $2004\r
-    lda #$21\r
-    sta $2004\r
-\r
-\r
-    lda #$3d\r
-    sta $2004\r
-    lda #$51\r
-    sta $2004\r
-    lda #$02\r
+    lda #$00\r
     sta $2004\r
-    lda #45\r
+    ;x=39\r
+    lda #$27\r
     sta $2004\r
 \r
-    ;;dma test data.\r
-    ldy #$00\r
-    ldx #$41\r
-    stx $00\r
-    ldx #$00\r
-dma_set:\r
-    ;;y pos\r
-    txa\r
-    sta $0200, y\r
-    iny\r
-    ;;tile index\r
-    lda $00\r
-    cmp #$5b\r
-    bne inc_tile\r
-    lda #$41\r
-    sta $00\r
-inc_tile:\r
-    inc $00\r
-    sta $0200, y\r
-    iny\r
-    ;;attribute\r
-    lda #$01\r
-    sta $0200, y\r
-    iny\r
-    ;;x pos\r
-    txa\r
-    adc #$03\r
-    tax\r
-    rol\r
-    sta $0200, y\r
-    iny\r
-    bne dma_set\r
-\r
-    ;;dma start.\r
-    lda #$02\r
-    sta $4014\r
-\r
-\r
-\r
-    ;;init scroll point.\r
-    lda #$00\r
-    sta $2005\r
-    lda #248\r
-    sta $2005\r
+;;;    ;;dma test data.\r
+;;;    ldy #$00\r
+;;;    ldx #$41\r
+;;;    stx $00\r
+;;;    ldx #$00\r
+;;;dma_set:\r
+;;;    ;;y pos\r
+;;;    txa\r
+;;;    sta $0200, y\r
+;;;    iny\r
+;;;    ;;tile index\r
+;;;    lda $00\r
+;;;    cmp #$5b\r
+;;;    bne inc_tile\r
+;;;    lda #$41\r
+;;;    sta $00\r
+;;;inc_tile:\r
+;;;    inc $00\r
+;;;    sta $0200, y\r
+;;;    iny\r
+;;;    ;;attribute\r
+;;;    lda #$01\r
+;;;    sta $0200, y\r
+;;;    iny\r
+;;;    ;;x pos\r
+;;;    txa\r
+;;;    adc #$03\r
+;;;    tax\r
+;;;    rol\r
+;;;    sta $0200, y\r
+;;;    iny\r
+;;;    bne dma_set\r
+;;;\r
+;;;    ;;dma start.\r
+;;;    lda #$02\r
+;;;    sta $4014\r
 \r
     ;;show bg...\r
        lda     #$1e\r
@@ -331,40 +213,114 @@ inc_tile:
     ;;done...\r
     ;;infinite loop.\r
 mainloop:\r
+\r
+    ;;read ppu status reg while displaying\r
+    ;;vram read test\r
+    ldx #$0a\r
+l1:\r
+    nop\r
+    dex\r
+    bne l1\r
+\r
+    ldx #$0a\r
+read_status:\r
+    lda $2002\r
+    dex\r
+    bne read_status\r
+\r
        jmp     mainloop\r
 .endproc\r
 \r
 \r
 nmi_test:\r
-;    jsr set_scroll\r
-;    jsr set_bg_col\r
-    jsr set_dma\r
+    jsr set_scroll\r
+    jsr set_bg_col\r
 \r
     rti\r
 \r
-set_dma:\r
-    ldy #0\r
+add_nl:\r
+    clc\r
+    txa\r
+    pha\r
 \r
-y_loop:\r
-    lda $0200, y\r
+    lda $01\r
+    sta $2006\r
 \r
-    clc\r
-    adc #$1\r
-    sta $0200, y\r
+    lda $00\r
+    adc #$20\r
+    sta $00\r
+    sta $2006\r
 \r
-    iny\r
-    iny\r
-    iny\r
-    iny\r
+    bcc no_carry\r
+    lda $01\r
+    adc #$00\r
+    sta $01\r
+    sta $2006\r
+    lda $00\r
+    sta $2006\r
+no_carry:\r
 \r
-    bne y_loop\r
+    pla\r
+    tax\r
+    rts\r
 \r
-    ;;dma start.\r
-    lda #$02\r
-    sta $4014\r
+set_scroll:\r
+    lda $0300\r
+    sta $2005\r
+    clc\r
+    adc #$05\r
+    sta $0300\r
+    lda $0301\r
+    sta $2005\r
+    clc\r
+    adc #04\r
+;;    sta $0301\r
+    rts\r
 \r
+set_bg_col:\r
+    lda #$3f\r
+    sta $2006\r
+    lda #$10\r
+    sta $2006\r
+    lda $0302\r
+    sta $2007\r
+    cmp #$30\r
+    bne bg_dec\r
+    lda #$3d\r
+    sta $0302\r
+    jmp bg_done\r
+bg_dec:\r
+    dec $0302\r
+bg_done:\r
     rts\r
 \r
+nt1:\r
+       .byte   $41, $42, $43, $44, $45, $46, $47, $48, $49, $4a, $4b, $4c, $4d, $4e, $4f, $50\r
+       .byte   $61, $62, $63, $64, $65, $66, $67, $68, $69, $6a, $6b, $6c, $6d, $6e, $6f, $70\r
+       .byte   $80, $81, $82, $83, $84, $85, $86, $87, $88, $89, $8a, $8b, $8c, $8d, $8e, $8f\r
+       .byte   $90, $91, $92, $93, $94, $95, $96, $97, $98, $99, $9a, $9b, $9c, $9d, $9e, $9f\r
+nt2:\r
+       .byte   $6b, $6a, $69, $68, $67, $66, $65, $64, $63, $62, $61\r
+       .byte   $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $3a\r
+\r
+at1:\r
+       .byte   $1b, $e4, $a5, $5a\r
+       .byte   $e4, $1b, $5a, $a5\r
+\r
+palettes:\r
+;;;bg palette\r
+       .byte   $0f, $00, $10, $20\r
+       .byte   $0f, $04, $14, $24\r
+       .byte   $0f, $08, $18, $28\r
+       .byte   $0f, $0c, $1c, $2c\r
+;;;spr palette\r
+       .byte   $0f, $00, $10, $20\r
+       .byte   $0f, $06, $16, $26\r
+       .byte   $0f, $08, $18, $28\r
+       .byte   $0f, $0a, $1a, $2a\r
+\r
+string:\r
+       .byte   "test2!"\r
 \r
 ;;;for DE1 internal memory constraints.\r
 .segment "VECINFO_4k"\r
index c4feea4..74bb108 100644 (file)
@@ -1,3 +1,5 @@
+memo.txt\r
+ascii-code-memo.xlsx\r
 disas*\r
 *.log\r
-*-32k
\ No newline at end of file
+*.*-*k\r
index e2c03c7..d865238 100644 (file)
@@ -7,9 +7,9 @@ LIBRARIES =
 all :  $(OBJECTS) $(LIBRARIES)\r
        ld65 -o regression.nes --config linker.cfg --obj $(OBJECTS)\r
        ./dd-img.sh regression\r
+       cp regression.nes ../../de1_nes/simulation/modelsim/rom-file.nes\r
        cp sample1-chr.hex ../../de1_nes/\r
-#      cp sample1-prg.hex ../../de1_nes/\r
-#      cp regression.nes ../../de1_nes/simulation/modelsim/rom-file.nes\r
+       cp sample1-prg.hex ../../de1_nes/\r
 \r
     \r
 run : all\r
index f61a92b..12dacd5 100644 (file)
     jsr print_ln\r
     jsr print_ln\r
 \r
-\r
-;;;;;following tests all ok\r
-;    jsr single_inst_test\r
-;    a2_inst_test\r
-;    a3_inst_test\r
-;    a4_inst_test\r
-;    a5_inst_test\r
-\r
     ;;test start...\r
     jsr addr_test\r
     jsr single_inst_test\r
@@ -59,6 +51,9 @@
     jsr status_test\r
     jsr ppu_test\r
 \r
+    jsr pg_border_test\r
+    jsr dma_test\r
+\r
 .endproc\r
 \r
 \r
@@ -125,9 +120,500 @@ mainloop:
        jmp     mainloop\r
 \r
 \r
+.proc sprite_test\r
+    jsr check_ppu\r
+    lda ad_sprite_test\r
+    sta $00\r
+    lda ad_sprite_test+1\r
+    sta $01\r
+    jsr print_ln\r
+\r
+\r
+;;set sprite addr=08 (third sprite)\r
+       lda     #$08\r
+       sta     $2003\r
+;;set sprite data: y=20\r
+       lda     #20\r
+       sta     $2004\r
+;;tile=0x4d (ascii 'M')\r
+       lda     #$4d\r
+       sta     $2004\r
+;;set sprite attr=03 (palette 03)\r
+       lda     #$03\r
+       sta     $2004\r
+;;set sprite data: x=100\r
+       lda     #$64\r
+       sta     $2004\r
+\r
+    rts\r
+.endproc\r
+\r
+.proc simple_dma_test\r
+    jsr check_ppu\r
+    lda ad_simple_dma_test\r
+    sta $00\r
+    lda ad_simple_dma_test+1\r
+    sta $01\r
+    jsr print_ln\r
+\r
+;;set sprite addr=0C (forth sprite)\r
+;;set sprite data: y=80\r
+       lda     #80\r
+       sta     $020C\r
+;;tile=0x4d (ascii 'd')\r
+       lda     #$64\r
+       sta     $020D\r
+;;set sprite attr=03 (palette 03)\r
+       lda     #$03\r
+       sta     $020E\r
+;;set sprite data: x=100\r
+       lda     #$64\r
+       sta     $020F\r
+\r
+    ;;more sprite...\r
+       lda     #90\r
+       sta     $0210\r
+       lda     #$64\r
+       sta     $0211\r
+       lda     #$03\r
+       sta     $0212\r
+       lda     #50\r
+       sta     $0213\r
+\r
+       lda     #100\r
+       sta     $0220\r
+       lda     #$65\r
+       sta     $0221\r
+       lda     #$03\r
+       sta     $0222\r
+       lda     #200\r
+       sta     $0223\r
+\r
+       lda     #30\r
+       sta     $0230\r
+       lda     #$44\r
+       sta     $0231\r
+       lda     #$03\r
+       sta     $0232\r
+       lda     #200\r
+       sta     $0233\r
+\r
+    ;;dma start.\r
+    lda #$02\r
+    sta $4014\r
+\r
+    rts\r
+.endproc\r
+\r
+\r
+.proc ppu_test\r
+    jsr check_ppu\r
+    lda ad_ppu_test\r
+    sta $00\r
+    lda ad_ppu_test+1\r
+    sta $01\r
+    jsr print_ln\r
+\r
+    jsr sprite_test\r
+    jsr simple_dma_test\r
+    rts\r
+.endproc\r
+\r
+\r
+.proc pg_border_test\r
+    ldx #$12\r
+    ldy #$e5\r
+    \r
+    ;;a2 abs, x\r
+    ;;a2 (ind, x)\r
+    ;;a2 (ind), y\r
+    ;;a3 abs, x\r
+    ;;a3 (ind, x)\r
+    ;;a3 (ind), y\r
+    ;;a4 abs, y\r
+    ;;branch\r
+\r
+\r
+    ;;;a2 inst...\r
+    \r
+    ;;no page crossing\r
+    lda #$55\r
+    ;;0466+12=478\r
+    sta $0478\r
+\r
+    lda #$c3\r
+    clc\r
+    adc $0466, x\r
+    ;;c3+55=118\r
+    cmp #$18\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$55\r
+    ;;0466+e5=54b\r
+    sta $054b\r
+\r
+    lda #$f1\r
+    clc\r
+    adc $0466, y\r
+    ;;f1+55=146\r
+    cmp #$46\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;no page crossing\r
+    lda #$55\r
+    sta $051c\r
+    ;@051c=55\r
+\r
+    lda #$1c\r
+    sta $66\r
+    lda #$05\r
+    sta $67\r
+    ;;(66)=051c\r
+    \r
+    lda #$c3\r
+    sec\r
+    ;;54+12=66\r
+    sbc ($54, x)\r
+    ;;c3-55=6e\r
+    cmp #$6e\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$55\r
+    sta $0422\r
+    ;@0422=55\r
+\r
+    lda #$22\r
+    sta $0a\r
+    lda #$04\r
+    sta $0b\r
+    ;;(0a)=0422\r
+    \r
+    lda #$c3\r
+    ;;f8+12=10a\r
+    ora ($f8, x)\r
+    ;;c3 | 55=d7\r
+    cmp #$d7\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;no page crossing\r
+    lda #$55\r
+    sta $059e\r
+    ;@059e=55\r
+\r
+    lda #$8c\r
+    sta $54\r
+    lda #$05\r
+    sta $55\r
+    ;;(54)=058c\r
+    \r
+    ldy #$12\r
+    lda #$c3\r
+    ;;058c+12=59e\r
+    and ($54), y\r
+    ;;c3 & 55=41\r
+    cmp #$41\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$66\r
+    sta $0671\r
+    ;@0671=55\r
+\r
+    lda #$8c\r
+    sta $54\r
+    lda #$05\r
+    sta $55\r
+    ;;(54)=058c\r
+    \r
+    ldy #$e5\r
+    lda #$c3\r
+    ;;058c+e5=0671\r
+    eor ($54), y\r
+    ;;c3 ^ 66 = a5\r
+    cmp #$a5\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;;;a3 inst...\r
+    ;;no page crossing\r
+    lda #$15\r
+    sta $0355, x\r
+    ;;0355+12=0367\r
+    ;;@0367=15\r
+\r
+    ;;c3+55=118\r
+    cmp $0367\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$67\r
+    sta $0355, y\r
+    ;;0355+e5=043a\r
+    ;;@043a=67\r
+\r
+    ;;c3+55=118\r
+    cpx $043a\r
+    bne :+\r
+    jsr test_failure\r
+:\r
+    cmp $043a\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;no page crossing\r
+    lda #$ff\r
+    sta $a2\r
+    lda #$04\r
+    sta $a3\r
+    ;;(a2)=04ff\r
+\r
+    ;;90+12=a2\r
+    lda #$88\r
+    sta ($90, x)\r
+\r
+    lda $04ff\r
+    cmp #$e5\r
+    bne :+\r
+    jsr test_failure\r
+:\r
+    cmp #$88\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$ff\r
+    sta $ff\r
+    lda #$05\r
+    sta $00\r
+    ;;(ff)=05ff\r
+\r
+    ;;ed+12=ff\r
+    lda #$d1\r
+    sta ($ed, x)\r
+\r
+    lda $05ff\r
+    cmp #$e5\r
+    bne :+\r
+    jsr test_failure\r
+:\r
+    cmp #$d1\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;no page crossing\r
+    lda #$f1\r
+    sta $ff\r
+    lda #$05\r
+    sta $00\r
+    ;;(ff)=05f1\r
+    \r
+    ldy #$03\r
+    lda #$a5\r
+    ;;05f1+3=05f4\r
+    sta ($ff), y\r
+\r
+\r
+    lda $05f4\r
+\r
+    cmp #$a5\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    lda #$ff\r
+    sta $ff\r
+    lda #$06\r
+    sta $00\r
+    ;;(ff)=06ff\r
+    \r
+    ldy #$12\r
+    lda #$dd\r
+    ;;06ff+12=711\r
+    sta ($ff), y\r
+\r
+\r
+    lda $0711\r
+\r
+    cmp #$dd\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;a4 inst....\r
+    ;;no page crossing\r
+    lda #$55\r
+    sta $0478\r
+\r
+    ;;0466+12=478\r
+    sec\r
+    ror $0466, x\r
+\r
+    lda $0478\r
+\r
+    cmp #$aa\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+    ;;page crossing\r
+    ldx #$e5\r
+    lda #$a5\r
+    sta $0476\r
+\r
+    ;;0391+e5=476\r
+    sec\r
+    rol $0391, x\r
+\r
+    lda $0476\r
+\r
+    cmp #$4b\r
+    beq :+\r
+    jsr test_failure\r
+:\r
+\r
+\r
+    ;;branch test...\r
+    jmp @br_start\r
+\r
+@br_back:\r
+    lda #$02\r
+    cmp #$03\r
+    bne @br_fwd\r
+\r
+    ;;branch across the page border.\r
+.repeat 116\r
+    .byte   $00\r
+.endrepeat\r
+\r
+@br_start:\r
+    lda #$01\r
+    cmp #$01\r
+    beq @br_back\r
+\r
+@br_fwd:\r
+\r
+\r
+    jsr check_ppu\r
+    lda ad_pg_border_test\r
+    sta $00\r
+    lda ad_pg_border_test+1\r
+    sta $01\r
+    jsr print_ln\r
+\r
+    rts\r
+.endproc\r
+\r
+.proc dma_test\r
+    lda full_dma_test\r
+    bne :+\r
+    rts\r
+:\r
+\r
+    ;;dma test data.\r
+    ldy #$00\r
+    ldx #$41\r
+    stx $00\r
+    ldx #$00\r
+dma_set:\r
+    ;;y pos\r
+    txa\r
+    sta $0200, y\r
+    iny\r
+    ;;tile index\r
+    lda $00\r
+    cmp #$5b\r
+    bne inc_tile\r
+    lda #$41\r
+    sta $00\r
+inc_tile:\r
+    inc $00\r
+    sta $0200, y\r
+    iny\r
+    ;;attribute\r
+    lda #$03\r
+    sta $0200, y\r
+    iny\r
+    ;;x pos\r
+    txa\r
+    adc #$03\r
+    tax\r
+    rol\r
+    sta $0200, y\r
+    iny\r
+    bne dma_set\r
+\r
+    ;;dma start.\r
+    lda #$02\r
+    sta $4014\r
+\r
+    jsr check_ppu\r
+    lda ad_dma_test\r
+    sta $00\r
+    lda ad_dma_test+1\r
+    sta $01\r
+    jsr print_ln\r
+\r
+    rts\r
+.endproc\r
+\r
+\r
+.proc update_dma\r
+    lda full_dma_test\r
+    bne :+\r
+    rts\r
+:\r
+\r
+    ldy #0\r
+\r
+y_loop:\r
+    iny\r
+    iny\r
+    iny\r
+\r
+    lda $0200, y\r
+    clc\r
+    adc #$1\r
+    sta $0200, y\r
+\r
+    iny\r
+\r
+    bne y_loop\r
+\r
+    ;;dma start.\r
+    lda #$02\r
+    sta $4014\r
+\r
+    rts\r
+.endproc\r
+\r
 nmi_test:\r
     jsr update_counter\r
     jsr update_scroll\r
+    jsr update_dma\r
 \r
     rti\r
 \r
@@ -184,6 +670,10 @@ nmi_test:
 \r
 @cnt_done:\r
 \r
+    lda #50\r
+       sta $2005\r
+    lda #200\r
+       sta $2005\r
     rts\r
 .endproc\r
 \r
@@ -198,7 +688,7 @@ nmi_test:
     bne :+\r
     ldx #0\r
 :\r
-    ldx #$00\r
+    ldx #80\r
     stx $2005\r
     stx scroll_y\r
 \r
@@ -1263,18 +1753,6 @@ nmi_test:
     rts\r
 .endproc\r
 \r
-.proc ppu_test\r
-    jsr check_ppu\r
-    lda ad_ppu_test\r
-    sta $00\r
-    lda ad_ppu_test+1\r
-    sta $01\r
-    jsr print_ln\r
-\r
-    rts\r
-.endproc\r
-\r
-\r
 ;;a5 instructions:\r
 ;;bcc   brk     php\r
 ;;bcs   bvc     pla\r
@@ -2314,6 +2792,7 @@ nmi_test:
 .endproc\r
 \r
 \r
+;;;read only global datas\r
 \r
 ;;;;string datas\r
 ad_start_msg:\r
@@ -2346,6 +2825,31 @@ ad_status_test:
     .byte   "status test..."\r
     .byte   $00\r
 \r
+\r
+ad_pg_border_test:\r
+    .addr   :+\r
+:\r
+    .byte   "page border crossing test..."\r
+    .byte   $00\r
+\r
+ad_dma_test:\r
+    .addr   :+\r
+:\r
+    .byte   "dma test..."\r
+    .byte   $00\r
+\r
+ad_sprite_test:\r
+    .addr   :+\r
+:\r
+    .byte   "sprite test..."\r
+    .byte   $00\r
+\r
+ad_simple_dma_test:\r
+    .addr   :+\r
+:\r
+    .byte   "simple sprite test (dma)..."\r
+    .byte   $00\r
+\r
 ad_ppu_test:\r
     .addr   :+\r
 :\r
@@ -2382,10 +2886,6 @@ ad_single_test:
     .byte   "single byte inst test..."\r
     .byte   $00\r
 \r
-;;;read only global datas\r
-use_ppu:\r
-    .byte   $01\r
-\r
 \r
 ;;;;address fixed test code..\r
 .segment "SEG_5K"\r
@@ -2724,6 +3224,12 @@ use_ppu:
     rts\r
 .endproc\r
 \r
+;;ppu test flag.\r
+use_ppu:\r
+    .byte   $01\r
+\r
+full_dma_test:\r
+    .byte   $01\r
 \r
 ;;;;r/w global variables.\r
 .segment "BSS"\r