DE1_control_panel
~$*
*.lnk
+<<<<<<< HEAD
bin2hex*
+=======
cc65/
+
+>>>>>>> bc7cef00d67db16adec9f9c03eeacb3e3a09bbdf
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';
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
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
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';
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
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;
---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.
ea_carry <= addr_c;
elsif (exec_cycle = T4) then
+ ah_buf_we_n <= '1';
+
---add y reg.
a_sel <= ADDR_ADC;
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';
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
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;
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.)");
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;
--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;
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';
--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";
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
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;
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;
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;
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;
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,
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);
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 ,
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 ,
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)
--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;
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
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
--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
\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
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
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
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;
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;
begin
- --nt_v_mirror <= vmirror;
- nt_v_mirror <= '1';
-
p : process (clk)
begin
if (rising_edge(clk)) then
);
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";
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
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
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';
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;
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';
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
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';
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';
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
\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
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
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
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
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
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
-: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
-: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
\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
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
#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
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
\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
; 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
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;
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;
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
end if;
end process;
+ --set chr rom mirror setting.
+ nt_v_mirror <= '1';
end stimulus;
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
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
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."
.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
;;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
+memo.txt\r
+ascii-code-memo.xlsx\r
disas*\r
*.log\r
-*-32k
\ No newline at end of file
+*.*-*k\r
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
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
jsr status_test\r
jsr ppu_test\r
\r
+ jsr pg_border_test\r
+ jsr dma_test\r
+\r
.endproc\r
\r
\r
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
\r
@cnt_done:\r
\r
+ lda #50\r
+ sta $2005\r
+ lda #200\r
+ sta $2005\r
rts\r
.endproc\r
\r
bne :+\r
ldx #0\r
:\r
- ldx #$00\r
+ ldx #80\r
stx $2005\r
stx scroll_y\r
\r
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
.endproc\r
\r
\r
+;;;read only global datas\r
\r
;;;;string datas\r
ad_start_msg:\r
.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
.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
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