val <= int_dbus;
elsif (load_bus_nz_n = '0') then
---other case: n/z data must be interpreted.
- tmp := val;
- val (6 downto 2) <= tmp (6 downto 2);
- val (0) <= tmp (0);
-
--n bit.
val (7) <= int_dbus(7);
--z bit.
d_we_n : in std_logic;
d_oe_n : in std_logic;
ea_oe_n : in std_logic;
+ inc_n : in std_logic;
+ dec_n : in std_logic;
int_dbus : inout std_logic_vector (dsize - 1 downto 0);
- ea_bus : out std_logic_vector (dsize - 1 downto 0)
+ ea_bus : out std_logic_vector (dsize - 1 downto 0);
+ n : out std_logic;
+ z : out std_logic
);
end index_reg;
);
end component;
+use ieee.std_logic_1164.all;
+use ieee.std_logic_unsigned.all;
+
+signal we_n : std_logic;
signal q : std_logic_vector (dsize - 1 downto 0);
+signal d : std_logic_vector (dsize - 1 downto 0);
begin
int_dbus <= q when d_oe_n = '0' else
ea_bus <= q when ea_oe_n = '0' else
(others => 'Z');
+ --for inx/iny/dex/dey instructions...
+ inc_dec_p : process (clk, int_dbus, inc_n, dec_n)
+ variable inc_work : std_logic_vector (dsize downto 0);
+ variable dec_work : std_logic_vector (dsize downto 0);
+ begin
+ inc_work := ('0' & q) + 1;
+ dec_work := ('0' & q) - 1;
+ if inc_n = '0' then
+ d <= inc_work(dsize - 1 downto 0);
+ z <= not (inc_work(7) or inc_work(6) or
+ inc_work(5) or inc_work(4) or inc_work(3) or
+ inc_work(2) or inc_work(1) or inc_work(0));
+ n <= inc_work(dsize);
+ elsif dec_n = '0' then
+ d <= dec_work(dsize - 1 downto 0);
+ z <= not (dec_work(7) or dec_work(6) or
+ dec_work(5) or dec_work(4) or dec_work(3) or
+ dec_work(2) or dec_work(1) or dec_work(0));
+ n <= dec_work(dsize);
+ else
+ d <= int_dbus;
+ z <= 'Z';
+ n <= 'Z';
+ end if;
+
+ end process;
+
--read from i/o to cpu
+ we_n <= d_we_n and inc_n and dec_n;
dff_inst : dff generic map (dsize)
- port map(clk, d_we_n, '0', int_dbus, q);
+ port map(clk, we_n, '0', d, q);
+
end rtl;
x_we_n : out std_logic;
x_oe_n : out std_logic;
x_ea_oe_n : out std_logic;
+ x_inc_n : out std_logic;
+ x_dec_n : out std_logic;
y_we_n : out std_logic;
y_oe_n : out std_logic;
y_ea_oe_n : out std_logic;
+ y_inc_n : out std_logic;
+ y_dec_n : out std_logic;
ea_calc_n : out std_logic;
ea_zp_n : out std_logic;
ea_pg_next_n : out std_logic;
acc_d_oe_n <= '1';
stat_bus_nz_n <= '1';
stat_set_flg_n <= '1';
+ stat_alu_we_n <= '1';
x_ea_oe_n <= '1';
ea_calc_n <= '1';
ea_pg_next_n <= '1';
+ x_inc_n <= '1';
+ x_dec_n <= '1';
+ y_inc_n <= '1';
+ y_dec_n <= '1';
end;
---common routine for single byte instruction.
elsif instruction = conv_std_logic_vector(16#88#, dsize) then
d_print("dey");
+ y_dec_n <= '0';
+ --set nz bit.
+ stat_alu_we_n <= '0';
+ stat_dec_oe_n <= '1';
+ status_reg <= "10000010";
+ single_inst;
elsif instruction = conv_std_logic_vector(16#e8#, dsize) then
d_print("inx");
+ x_inc_n <= '0';
+ --set nz bit.
+ stat_alu_we_n <= '0';
+ stat_dec_oe_n <= '1';
+ status_reg <= "10000010";
+ single_inst;
elsif instruction = conv_std_logic_vector(16#c8#, dsize) then
d_print("iny");
x_oe_n <= '1';
y_we_n <= '1';
y_oe_n <= '1';
+ x_inc_n <= '1';
+ x_dec_n <= '1';
+ y_inc_n <= '1';
+ y_dec_n <= '1';
stat_dec_oe_n <= '1';
stat_bus_oe_n <= '1';
x_we_n : out std_logic;
x_oe_n : out std_logic;
x_ea_oe_n : out std_logic;
+ x_inc_n : out std_logic;
+ x_dec_n : out std_logic;
y_we_n : out std_logic;
y_oe_n : out std_logic;
y_ea_oe_n : out std_logic;
+ y_inc_n : out std_logic;
+ y_dec_n : out std_logic;
ea_calc_n : out std_logic;
ea_zp_n : out std_logic;
ea_pg_next_n : out std_logic;
d_we_n : in std_logic;
d_oe_n : in std_logic;
ea_oe_n : in std_logic;
+ inc_n : in std_logic;
+ dec_n : in std_logic;
int_dbus : inout std_logic_vector (dsize - 1 downto 0);
- ea_bus : out std_logic_vector (dsize - 1 downto 0)
+ ea_bus : out std_logic_vector (dsize - 1 downto 0);
+ n : out std_logic;
+ z : out std_logic
);
end component;
signal x_we_n : std_logic;
signal x_oe_n : std_logic;
+ signal x_inc_n : std_logic;
+ signal x_dec_n : std_logic;
signal y_we_n : std_logic;
signal y_oe_n : std_logic;
+ signal y_inc_n : std_logic;
+ signal y_dec_n : std_logic;
signal ea_base_l : std_logic_vector(dsize - 1 downto 0);
signal ea_base_h : std_logic_vector(dsize - 1 downto 0);
x_we_n,
x_oe_n,
x_ea_oe_n,
+ x_inc_n,
+ x_dec_n,
y_we_n,
y_oe_n,
y_ea_oe_n,
+ y_inc_n,
+ y_dec_n,
ea_calc_n,
ea_zp_n,
ea_pg_next_n,
--x/y output pin is connected to effective address calcurator
x_reg : index_reg generic map (dsize)
- port map(trigger_clk, x_we_n, x_oe_n, x_ea_oe_n, internal_dbus, ea_index);
+ port map(trigger_clk, x_we_n, x_oe_n, x_ea_oe_n,
+ x_inc_n, x_dec_n, internal_dbus, ea_index,
+ alu_n, alu_z);
y_reg : index_reg generic map (dsize)
- port map(trigger_clk, y_we_n, y_oe_n, y_ea_oe_n, internal_dbus, ea_index);
+ port map(trigger_clk, y_we_n, y_oe_n, y_ea_oe_n,
+ y_inc_n, y_dec_n, internal_dbus, ea_index,
+ alu_n, alu_z);
acc_reg : accumulator generic map (dsize)
port map(trigger_clk,