URL
https://opencores.org/ocsvn/v65c816/v65c816/trunk
Subversion Repositories v65c816
Compare Revisions
- This comparison shows the changes necessary to convert path
/v65c816
- from Rev 1 to Rev 2
- ↔ Reverse comparison
Rev 1 → Rev 2
/trunk/AddSubBCD.vhd
0,0 → 1,85
library IEEE; |
use IEEE.std_logic_1164.all; |
use ieee.numeric_std.all; |
library work; |
|
entity AddSubBCD is |
port( |
A : in std_logic_vector(15 downto 0); |
B : in std_logic_vector(15 downto 0); |
CI : in std_logic; |
ADD : in std_logic; |
BCD : in std_logic; |
w16 : in std_logic; |
S : out std_logic_vector(15 downto 0); |
CO : out std_logic; |
VO : out std_logic |
); |
end AddSubBCD; |
|
architecture rtl of AddSubBCD is |
|
signal VO1, VO3 : std_logic; |
signal CO0, CO1, CO2, CO3 : std_logic; |
|
begin |
|
add0 : entity work.BCDAdder |
port map ( |
A => A(3 downto 0), |
B => B(3 downto 0), |
CI => CI, |
|
S => S(3 downto 0), |
CO => CO0, |
|
ADD => ADD, |
BCD => BCD |
); |
|
add1 : entity work.BCDAdder |
port map ( |
A => A(7 downto 4), |
B => B(7 downto 4), |
CI => CO0, |
|
S => S(7 downto 4), |
CO => CO1, |
VO => VO1, |
|
ADD => ADD, |
BCD => BCD |
); |
|
add2 : entity work.BCDAdder |
port map ( |
A => A(11 downto 8), |
B => B(11 downto 8), |
CI => CO1, |
|
S => S(11 downto 8), |
CO => CO2, |
|
ADD => ADD, |
BCD => BCD |
); |
|
add3 : entity work.BCDAdder |
port map ( |
A => A(15 downto 12), |
B => B(15 downto 12), |
CI => CO2, |
|
S => S(15 downto 12), |
CO => CO3, |
VO => VO3, |
|
ADD => ADD, |
BCD => BCD |
); |
|
|
VO <= VO1 when w16 = '0' else VO3; |
CO <= CO1 when w16 = '0' else CO3; |
|
end rtl; |
/trunk/BCDAdder.vhd
0,0 → 1,131
library IEEE; |
use IEEE.STD_LOGIC_1164.ALL; |
library STD; |
use IEEE.NUMERIC_STD.ALL; |
library work; |
|
entity bit_adder is |
port( |
A : in std_logic; |
B : in std_logic; |
CI : in std_logic; |
S : out std_logic; |
CO : out std_logic |
); |
end bit_adder; |
|
architecture rtl of bit_adder is |
|
begin |
|
S <= (not A and not B and CI) or |
(not A and B and not CI) or |
( A and not B and not CI) or |
( A and B and CI); |
|
CO <= (not A and B and CI) or |
( A and not B and CI) or |
( A and B and not CI) or |
( A and B and CI); |
|
end rtl; |
|
|
|
library IEEE; |
use IEEE.STD_LOGIC_1164.ALL; |
library STD; |
use IEEE.NUMERIC_STD.ALL; |
library work; |
|
entity adder4 is |
port( |
A : in std_logic_vector(3 downto 0); |
B : in std_logic_vector(3 downto 0); |
CI : in std_logic; |
S : out std_logic_vector(3 downto 0); |
CO : out std_logic |
); |
end adder4; |
|
architecture rtl of adder4 is |
|
component bit_adder is |
port( |
A : in std_logic; |
B : in std_logic; |
CI : in std_logic; |
S : out std_logic; |
CO : out std_logic |
); |
end component; |
|
signal CO0, CO1, CO2 : std_logic; |
|
begin |
|
b_add0: bit_adder port map (A(0), B(0), CI, S(0), CO0); |
b_add1: bit_adder port map (A(1), B(1), CO0, S(1), CO1); |
b_add2: bit_adder port map (A(2), B(2), CO1, S(2), CO2); |
b_add3: bit_adder port map (A(3), B(3), CO2, S(3), CO); |
|
end rtl; |
|
|
library IEEE; |
use IEEE.STD_LOGIC_1164.ALL; |
library STD; |
use IEEE.NUMERIC_STD.ALL; |
library work; |
|
entity BCDAdder is |
port( |
A : in std_logic_vector(3 downto 0); |
B : in std_logic_vector(3 downto 0); |
CI : in std_logic; |
|
S : out std_logic_vector(3 downto 0); |
CO : out std_logic; |
VO : out std_logic; |
|
ADD : in std_logic; |
BCD : in std_logic |
); |
end BCDAdder; |
|
architecture rtl of BCDAdder is |
|
signal B2 : std_logic_vector(3 downto 0); |
signal BIN_S : std_logic_vector(3 downto 0); |
signal BIN_CO : std_logic; |
signal BCD_B : std_logic_vector(3 downto 0); |
signal BCD_CO : std_logic; |
|
begin |
|
B2 <= B xor (3 downto 0 => not ADD); |
|
bin_adder : entity work.adder4 |
port map( |
A => A, |
B => B2, |
CI => CI, |
S => BIN_S, |
CO => BIN_CO |
); |
|
BCD_CO <= (BIN_S(3) and BIN_S(2)) or (BIN_S(3) and BIN_S(1)) or (BIN_CO xor not ADD); |
BCD_B <= not ADD & ((BCD_CO and BCD) xor not ADD) & ((BCD_CO and BCD) xor not ADD) & not ADD; |
|
bcd_corr_adder : entity work.adder4 |
port map( |
A => BIN_S, |
B => BCD_B, |
CI => not ADD, |
S => S |
); |
|
CO <= BIN_CO when BCD = '0' else BCD_CO xor not ADD; |
VO <= (not (A(3) xor B2(3))) and (A(3) xor BIN_S(3)); |
|
end rtl; |
/trunk/V65C816.pdf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
trunk/V65C816.pdf
Property changes :
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Index: trunk/addrmux.vhd
===================================================================
--- trunk/addrmux.vhd (nonexistent)
+++ trunk/addrmux.vhd (revision 2)
@@ -0,0 +1,42 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit two-way multiplexer
+entity addrmux is
+ port( sel: in STD_LOGIC_VECTOR(2 downto 0);
+ a: in STD_LOGIC_VECTOR(23 downto 0);
+ b: in STD_LOGIC_VECTOR(23 downto 0);
+ dbr: in STD_LOGIC_VECTOR(7 downto 0);
+ s: in STD_LOGIC_VECTOR(15 downto 0);
+ xr: in STD_LOGIC_VECTOR(15 downto 0);
+ yr: in STD_LOGIC_VECTOR(15 downto 0);
+ y: out STD_LOGIC_VECTOR(23 downto 0)
+ );
+end addrmux;
+
+architecture comb of addrmux is
+constant ADPC: STD_LOGIC_VECTOR(2 downto 0) := "000"; -- select PC
+constant ADMP: STD_LOGIC_VECTOR(2 downto 0) := "001"; -- select MP
+constant ADSP: STD_LOGIC_VECTOR(2 downto 0) := "010"; -- select SP
+constant ADDI: STD_LOGIC_VECTOR(2 downto 0) := "011"; -- select Direct
+constant ADXR: STD_LOGIC_VECTOR(2 downto 0) := "100"; -- select X register
+constant ADYR: STD_LOGIC_VECTOR(2 downto 0) := "101"; -- select Y register
+constant ADNP: STD_LOGIC_VECTOR(2 downto 0) := "000"; -- no operation (PC)
+begin
+ process(sel,a,b,s,xr,yr,dbr)
+ begin
+ case sel is
+ when ADPC => y <= a; -- program counter
+ when ADMP => y <= b; -- memory data pointer
+ when ADSP => y <= "00000000" & s; -- stack address space
+ when ADDI => y <= "00000000" & b(15 downto 0); -- direct address space
+ when ADXR => y <= dbr & xr; -- DBR\X register
+ when ADYR => y <= dbr & yr; -- DBR\Y register
+ when others => y <= a;
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/alu_bin.vhd
===================================================================
--- trunk/alu_bin.vhd (nonexistent)
+++ trunk/alu_bin.vhd (revision 2)
@@ -0,0 +1,390 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8/16 bit binary alu
+-- Written by Valerio Venturi
+entity alu_bin is
+ port( alu_byp: in STD_LOGIC; -- ALU bypass (no operation)
+ bcd: in STD_LOGIC; -- BCD mode
+ size: in STD_LOGIC; -- operations size: 1 = 8 bit, 0 = 16 bit
+ cin: in STD_LOGIC; -- carry/borrow in
+ vin: in STD_LOGIC; -- overflow in
+ op1: in STD_LOGIC_VECTOR(15 downto 0); -- 16 bit operand #1
+ op2: in STD_LOGIC_VECTOR(15 downto 0); -- 16 bit operand #2
+ fc: in STD_LOGIC_VECTOR(4 downto 0); -- function code
+ cf: out STD_LOGIC; -- carry/borrow out
+ zf: out STD_LOGIC; -- zero flag out
+ nf: out STD_LOGIC; -- negative flag out
+ vf: out STD_LOGIC; -- overflow flag out
+ pc_cf: out STD_LOGIC; -- carry/borrow out for PC operation
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- 16 bit result out
+ );
+end alu_bin;
+
+architecture comb of alu_bin is
+-- ALU function codes
+constant NOP_A: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- no operation
+constant SUM_A: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- sum with carry
+constant SUB_A: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- subtract with borrow
+constant AND_A: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- and
+constant OR_A: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- or
+constant XOR_A: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- xor
+constant INC_A: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- increment by 1
+constant DEC_A: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- decrement by 1
+constant SHL_A: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- shift left
+constant SHR_A: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- shift right
+constant ROL_A: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- rotation left
+constant ROR_A: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- rotation right
+constant SWC_A: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- sum without carry (used for indexing and branches)
+constant SWC_N: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- subtract without borrow (used only by branches with negative offset)
+constant BIT_A: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- bit test (used by BIT opcode)
+constant DAA_A: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- decimal adjustement for BCD sum
+constant DAS_A: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- decimal adjustement for BCD subtract
+constant CMP_A: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- compare
+constant TSB_A: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- test and set bit
+constant TRB_A: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- test and reset bit
+constant EXT_A: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- extend sign
+constant NEG_A: STD_LOGIC_VECTOR(4 downto 0) := "10100"; -- negate
+
+signal c: STD_LOGIC;
+signal pc_c: STD_LOGIC;
+signal v_8: STD_LOGIC;
+signal v_16: STD_LOGIC;
+signal v_flg: STD_LOGIC;
+signal add_op: STD_LOGIC;
+signal bcd_c: STD_LOGIC;
+signal bcd_v: STD_LOGIC;
+signal n_size: STD_LOGIC;
+signal bcd_sum: STD_LOGIC_VECTOR(15 downto 0);
+signal n8_op2: STD_LOGIC_VECTOR(7 downto 0);
+signal n16_op2: STD_LOGIC_VECTOR(15 downto 0);
+signal y8: STD_LOGIC_VECTOR(8 downto 0);
+signal y16: STD_LOGIC_VECTOR(16 downto 0);
+signal y: STD_LOGIC_VECTOR(15 downto 0);
+signal i_op1: STD_LOGIC_VECTOR(7 downto 0);
+signal i_op2: STD_LOGIC_VECTOR(7 downto 0);
+
+
+component AddSubBCD is
+ port(
+ A: in std_logic_vector(15 downto 0);
+ B: in std_logic_vector(15 downto 0);
+ CI: in std_logic;
+ ADD: in std_logic;
+ BCD: in std_logic;
+ w16: in std_logic;
+ S: out std_logic_vector(15 downto 0);
+ CO: out std_logic;
+ VO: out std_logic
+ );
+end component;
+
+
+begin
+n_size <= not size;
+u1:AddSubBCD port map(A=>op1,
+ B=>op2,
+ CI=>cin,
+ ADD=>add_op,
+ BCD=>'1',
+ W16=>n_size,
+ S=>bcd_sum,
+ CO=>bcd_c,
+ vO=>bcd_v
+ );
+
+ i_op1 <= op1(7 downto 0);
+ i_op2 <= op2(7 downto 0);
+ n8_op2 <= (not i_op2);
+ n16_op2 <= (not op2);
+ process(size,bcd,alu_byp,fc,i_op1,i_op2,n8_op2,n16_op2,op1,op2,bcd_sum,cin,y16(7))
+ begin
+ if size = '1' then
+ -- 8 bit
+ if alu_byp = '1' then
+ y8(y8'left) <= '0';
+ y8(y8'left-1 downto y8'right) <= i_op1;
+ add_op <= '0';
+ else
+ case fc is
+ when SUM_A =>
+ add_op <= '1';
+ if bcd = '0' then
+ y8 <= ('0' & i_op1) + ('0' & i_op2) + ("00000000" & cin); -- ADC with carry in
+ else
+ y8 <= '0' & bcd_sum(7 downto 0);
+ end if;
+ when SUB_A =>
+ add_op <= '0';
+ if bcd = '0' then
+ y8 <= ('0' & i_op1) + ('0' & n8_op2) + ("00000000" & cin); -- SBC with borrow in
+ else
+ y8 <= '0' & bcd_sum(7 downto 0);
+ end if;
+ when BIT_A => y8 <= ('0' & i_op1) and ('0' & i_op2); -- BIT test
+ add_op <= '0';
+ when AND_A => y8 <= ('0' & i_op1) and ('0' & i_op2); -- AND
+ add_op <= '0';
+ when OR_A => y8 <= ('0' & i_op1) or ('0' & i_op2); -- OR
+ add_op <= '0';
+ when XOR_A => y8 <= ('0' & i_op1) xor ('0' & i_op2); -- XOR
+ add_op <= '0';
+ when INC_A => y8 <= i_op1 + "000000001"; -- INC
+ add_op <= '0';
+ when DEC_A => y8 <= i_op1 - "000000001"; -- DEC
+ add_op <= '0';
+ when SHL_A => y8(8 downto 1) <= i_op1; y8(0) <= '0'; -- ASL
+ add_op <= '0';
+ when SHR_A => y8 <= "00" & i_op1(i_op1'left downto i_op1'right+1); -- LSR
+ add_op <= '0';
+ when ROL_A => y8(8 downto 1) <= i_op1; y8(0) <= cin; -- ROL
+ add_op <= '0';
+ when ROR_A => y8 <= '0' & cin & i_op1(i_op1'left downto i_op1'right+1); -- ROR
+ add_op <= '0';
+ when SWC_A => y8 <= ('0' & i_op1) + ('0' & i_op2); -- ADD without carry in
+ add_op <= '0';
+ when DAA_A => y8 <= '0' & bcd_sum(7 downto 0); -- ADD without carry in (used for DAA decimal adjustement)
+ add_op <= '0';
+ when DAS_A => y8 <= '0' & bcd_sum(7 downto 0); -- SUB without borrow in (used for DAS decimal adjustement)
+ add_op <= '1';
+ when CMP_A => y8 <= ('1' & i_op1) - ('0' & i_op2); -- SBC without borrow in (used for compare)
+ add_op <= '0';
+ when TSB_A => y8 <= ('0' & i_op1) or ('0' & i_op2); -- TSB
+ add_op <= '0';
+ when TRB_A => y8 <= ('0' & not i_op1) and ('0' & i_op2); -- TRB
+ add_op <= '0';
+ when NEG_A => y8 <= "000000000" - ('0' & i_op1); -- NEG
+ add_op <= '0';
+ when EXT_A => y8(y8'left) <= '0'; y8(y8'left-1 downto y8'right) <= i_op1; -- NOP
+ add_op <= '0';
+ when others => y8(y8'left) <= '0'; y8(y8'left-1 downto y8'right) <= i_op1; -- NOP
+ add_op <= '0';
+ end case;
+ end if;
+ y16 <= (others => '0');
+ else
+ -- 16 bit
+ if alu_byp = '1' then
+ y16(y16'left) <= '0';
+ y16(y16'left-1 downto y16'right) <= op1;
+ add_op <= '0';
+ else
+ case fc is
+ when SUM_A =>
+ add_op <= '1';
+ if bcd = '0' then
+ y16 <= ('0' & op1) + ('0' & op2) + ("0000000000000000" & cin); -- ADC with carry in
+ else
+ y16 <= '0' & bcd_sum;
+ end if;
+ when SUB_A =>
+ add_op <= '0';
+ if bcd = '0' then
+ y16 <= ('0' & op1) + ('0' & n16_op2) + ("0000000000000000" & cin); -- SBC with borrow in
+ else
+ y16 <= '0' & bcd_sum;
+ end if;
+ when BIT_A => y16 <= ('0' & op1) and ('0' & op2); -- BIT test
+ add_op <= '0';
+ when AND_A => y16 <= ('0' & op1) and ('0' & op2); -- AND
+ add_op <= '0';
+ when OR_A => y16 <= ('0' & op1) or ('0' & op2); -- OR
+ add_op <= '0';
+ when XOR_A => y16 <= ('0' & op1) xor ('0' & op2); -- XOR
+ add_op <= '0';
+ when INC_A => y16 <= op1 + "00000000000000001"; -- INC
+ add_op <= '0';
+ when DEC_A => y16 <= op1 - "00000000000000001"; -- DEC
+ add_op <= '0';
+ when SHL_A => y16(16 downto 1) <= op1; y16(0) <= '0'; -- ASL
+ add_op <= '0';
+ when SHR_A => y16 <= "00" & op1(op1'left downto op1'right+1); -- LSR
+ add_op <= '0';
+ when ROL_A => y16(16 downto 1) <= op1; y16(0) <= cin; -- ROL
+ add_op <= '0';
+ when ROR_A => y16 <= '0' & cin & op1(op1'left downto op1'right+1); -- ROR
+ add_op <= '0';
+ when SWC_A => y16 <= ('0' & op1) + ('0' & op2); -- ADD without carry in
+ add_op <= '0';
+ when DAA_A => y16 <= '0' & bcd_sum; -- ADD without carry in (used for DAA decimal adjustement)
+ add_op <= '0';
+ when DAS_A => y16 <= '0' & bcd_sum; -- SUB without borrow in (used for DAS decimal adjustement)
+ add_op <= '1';
+ when CMP_A => y16 <= ('1' & op1) - ('0' & op2); -- SBC without borrow in (used for compare)
+ add_op <= '0';
+ when TSB_A => y16 <= ('0' & op1) or ('0' & op2); -- TSB
+ add_op <= '0';
+ when TRB_A => y16 <= ('0' & not op1) and ('0' & op2); -- TRB
+ add_op <= '0';
+ when EXT_A => if op1(7) = '1' then -- if negative
+ y16(16 downto 8) <= "111111111"; -- extend sign to msb
+ y16(7 downto 0) <= op1(7 downto 0);
+ else
+ y16(16 downto 8) <= "000000000";
+ y16(7 downto 0) <= op1(7 downto 0);
+ end if;
+ add_op <= '0';
+ when NEG_A => y16 <= "00000000000000000" - ('0' & op1); -- NEG
+ add_op <= '0';
+ when others => y16(y16'left) <= '0'; y16(y16'left-1 downto y16'right) <= op1; -- NOP
+ add_op <= '0';
+ end case;
+ end if;
+ y8 <= (others => '0');
+ end if;
+ end process;
+
+
+
+ -- flag "C" carry/borrow logic
+ process(size,bcd,bcd_c,fc,op1,y8,y16,cin)
+ begin
+ if size = '1' then
+ case fc is
+ when SUM_A =>
+ if bcd = '0' then
+ c <= y8(y8'left);
+ else
+ c <= bcd_c;
+ end if;
+ pc_c <= '0';
+ when SUB_A =>
+ if bcd = '0' then
+ c <= y8(y8'left);
+ else
+ c <= bcd_c;
+ end if;
+ pc_c <= '0';
+ when SWC_A => pc_c <= y8(y8'left);
+ c <= cin;
+ when SHL_A => c <= y8(y8'left);
+ pc_c <= '0';
+ when SHR_A => c <= op1(op1'right);
+ pc_c <= '0';
+ when ROL_A => c <= y8(y8'left);
+ pc_c <= '0';
+ when ROR_A => c <= op1(op1'right);
+ pc_c <= '0';
+ when DAA_A => c <= y8(y8'left);
+ pc_c <= '0';
+ when DAS_A => c <= cin;
+ pc_c <= '0';
+ when BIT_A => c <= cin;
+ pc_c <= '0';
+ when CMP_A => c <= y8(y8'left);
+ pc_c <= '0';
+ when others => c <= cin;
+ pc_c <= '0';
+ end case;
+ else
+ case fc is
+ when SUM_A =>
+ if bcd = '0' then
+ c <= y16(y16'left);
+ else
+ c <= bcd_c;
+ end if;
+ pc_c <= '0';
+ when SUB_A =>
+ if bcd = '0' then
+ c <= y16(y16'left);
+ else
+ c <= bcd_c;
+ end if;
+ pc_c <= '0';
+ when SWC_A => pc_c <= y16(8);
+ c <= cin;
+ when SHL_A => c <= y16(y16'left);
+ pc_c <= '0';
+ when SHR_A => c <= op1(op1'right);
+ pc_c <= '0';
+ when ROL_A => c <= y16(y16'left);
+ pc_c <= '0';
+ when ROR_A => c <= op1(op1'right);
+ pc_c <= '0';
+ when DAA_A => c <= y16(y16'left);
+ pc_c <= '0';
+ when DAS_A => c <= cin;
+ pc_c <= '0';
+ when BIT_A => c <= cin;
+ pc_c <= '0';
+ when CMP_A => c <= y16(y16'left);
+ pc_c <= '0';
+ when others => c <= cin;
+ pc_c <= '0';
+ end case;
+ end if;
+ end process;
+
+ -- flag "V" overflow logic
+ v_8 <= not (((op1(7) nor op2(7)) and y8(6)) nor ((op1(7) nand op2(7)) nor y8(6)));
+ v_16 <= not (((op1(15) nor op2(15)) and y16(14)) nor ((op1(15) nand op2(15)) nor y16(14)));
+ v_flg <= v_8 when size = '1' else v_16;
+ process(size,fc,bcd,i_op2,op2,v_flg,bcd_v,vin)
+ begin
+ case fc is
+ when SUM_A =>
+ if bcd = '0' then
+ vf <= v_flg;
+ else
+ vf <= bcd_v;
+ end if;
+ when SUB_A =>
+ if bcd = '0' then
+ vf <= v_flg;
+ else
+ vf <= bcd_v;
+ end if;
+ when BIT_A =>
+ if size = '1' then
+ vf <= op2(6);
+ else
+ vf <= op2(14);
+ end if;
+ when others => vf <= vin;
+ end case;
+ end process;
+
+ -- flag "N" negative result logic
+ process(size,fc,i_op2,y8,y16)
+ begin
+ if size = '1' then
+ case fc is
+ when BIT_A => nf <= i_op2(i_op2'left);
+ when others => nf <= y8(y8'left-1);
+ end case;
+ else
+ case fc is
+ when BIT_A => nf <= i_op2(i_op2'left);
+ when others => nf <= y16(y16'left-1);
+ end case;
+ end if;
+ end process;
+
+ -- flag "Z" zero result logic (always set with zero results)
+ process(size,y8,y16)
+ begin
+ if size = '1' then
+ if y8(y8'left-1 downto y8'right) = "00000000" then
+ zf <= '1';
+ else
+ zf <= '0';
+ end if;
+ else
+ if y16(y16'left-1 downto y16'right) = "0000000000000000" then
+ zf <= '1';
+ else
+ zf <= '0';
+ end if;
+ end if;
+ end process;
+
+ y <= op1(15 downto 8) & y8(y8'left-1 downto y8'right) when size = '1' else y16(y16'left-1 downto y16'right);
+
+
+ cf <= c;
+ pc_cf <= pc_c;
+ dout <= y;
+end comb;
Index: trunk/ar.vhd
===================================================================
--- trunk/ar.vhd (nonexistent)
+++ trunk/ar.vhd (revision 2)
@@ -0,0 +1,73 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit accumulator register "A"
+entity ar is
+ port( clk: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC;
+ ld_msb: in STD_LOGIC;
+ ld_mul_lsb: in STD_LOGIC;
+ d: in STD_LOGIC;
+ end_count: out STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ mul_lsb: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end ar;
+
+architecture rtl of ar is
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+signal op: STD_LOGIC_VECTOR(3 downto 0);
+begin
+ op <= ld_mul_lsb & d & ld_msb & ld_lsb;
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if size = '1' then
+ case op is
+ when "0001" => reg(7 downto 0) <= din(7 downto 0); -- load lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "0010" => reg(15 downto 8) <= din(7 downto 0); -- load msb
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "0011" => reg(7 downto 0) <= din(7 downto 0); -- load msb & lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "0100" => reg <= reg - "0000000000000001"; -- decrement
+ when "1000" => reg <= mul_lsb; -- load multiplication lsb result
+ when others => reg <= reg;
+ end case;
+ else
+ case op is
+ when "0001" => reg(7 downto 0) <= din(7 downto 0); -- load lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "0010" => reg(15 downto 8) <= din(7 downto 0); -- load msb
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "0011" => reg <= din; -- load msb & lsb
+ when "0100" => reg <= reg - "0000000000000001"; -- decrement
+ when "1000" => reg <= mul_lsb; -- load multiplication lsb result
+ when others => reg <= reg;
+ end case;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+
+ -- used for MVN/MVP instructions
+ process(reg)
+ begin
+ if reg = "1111111111111111" then
+ end_count <= '1';
+ else
+ end_count <= '0';
+ end if;
+ end process;
+end rtl;
+
+
Index: trunk/br.vhd
===================================================================
--- trunk/br.vhd (nonexistent)
+++ trunk/br.vhd (revision 2)
@@ -0,0 +1,41 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit register "B" (DBR)
+entity br is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(7 downto 0);
+ dout: out STD_LOGIC_VECTOR(7 downto 0)
+ );
+end br;
+
+architecture rtl of br is
+signal reg: STD_LOGIC_VECTOR(7 downto 0);
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "00000000";
+ else
+ if ld = '1' then
+ reg <= din;
+ else
+ reg <= reg;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/branch.vhd
===================================================================
--- trunk/branch.vhd (nonexistent)
+++ trunk/branch.vhd (revision 2)
@@ -0,0 +1,36 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- branch resolving logic
+entity branch is
+ port( op: in STD_LOGIC_VECTOR(3 downto 0);
+ n: in STD_LOGIC;
+ v: in STD_LOGIC;
+ z: in STD_LOGIC;
+ c: in STD_LOGIC;
+ bres: out STD_LOGIC
+ );
+end branch;
+
+architecture comb of branch is
+begin
+ process(op,n,v,z,c)
+ begin
+ case op is
+ when "1000" => bres <= '1'; -- BRA
+ when "0001" => bres <= not n; -- BPL
+ when "0011" => bres <= n; -- BMI
+ when "0101" => bres <= not v; -- BVC
+ when "0111" => bres <= v; -- BVS
+ when "1111" => bres <= z; -- BEQ
+ when "1101" => bres <= not z; -- BNE
+ when "1001" => bres <= not c; -- BCC
+ when "1011" => bres <= c; -- BCS
+ when others => bres <= '0';
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/cpufsm.vhd
===================================================================
--- trunk/cpufsm.vhd (nonexistent)
+++ trunk/cpufsm.vhd (revision 2)
@@ -0,0 +1,223 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- CPU FSM main state machine
+entity cpufsm is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ireq: in STD_LOGIC;
+ aim: in STD_LOGIC;
+ bcarry: in STD_LOGIC;
+ icarry: in STD_LOGIC;
+ p1: in STD_LOGIC_VECTOR(2 downto 0);
+ e_ei: in STD_LOGIC;
+ mc_ei: in STD_LOGIC;
+ addsub: in STD_LOGIC;
+ dec_mode: in STD_LOGIC;
+ fetch: out STD_LOGIC;
+ op_sync: out STD_LOGIC;
+ pci: out STD_LOGIC;
+ pq: out STD_LOGIC_VECTOR(2 downto 0);
+ fb: out STD_LOGIC;
+ od: out STD_LOGIC;
+ mc_nop: out STD_LOGIC
+ );
+end cpufsm;
+
+architecture rtl of cpufsm is
+type states is (s0,s1,s2,s3,s4,s5,s6);
+attribute ENUM_ENCODING:STRING;
+attribute ENUM_ENCODING of states: type is "000000001 000000010 000000100 000001000 000010000 000100000 001000000"; -- one hot encoding for all states
+signal present,nxt:states;
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ present <= present;
+ else
+ present <= nxt;
+ end if;
+ end if;
+ end process;
+
+ process(present,ireq,bcarry,icarry,p1,e_ei,mc_ei,aim,clr,addsub,dec_mode)
+ begin
+ case present is
+ -- reset
+ when s0 =>
+ fetch <= '0';
+ op_sync <= '0';
+ pci <= '0';
+ pq <= "000";
+ fb <= '1'; -- force BRK
+ od <= '1'; -- clear microcode sequencer
+ mc_nop <= '0';
+ if clr = '1' then
+ nxt <= s0;
+ else
+ nxt <= s2;
+ end if;
+
+ -- fetch opcode
+ when s1 =>
+ pq <= "000";
+ if ireq = '1' then -- if interrupt request
+ od <= '0';
+ fetch <= '0';
+ fb <= '0';
+ pci <= '0'; -- PC doesn't increment
+ op_sync <= '0';
+ mc_nop <= '1'; -- stop microcode execution
+ nxt <= s6; -- goto s6
+ else
+ od <= '1'; -- clear microcode sequencer
+ fetch <= '1'; -- fetch opcode
+ fb <= '0';
+ pci <= '1'; -- PC increment
+ if addsub = '1'then -- if ADD/SUB opcode may require an extra cycle for DAA/DAS adjustement
+ op_sync <= '0';
+ mc_nop <= '0';
+ nxt <= s5; -- goto s5
+ else
+ if e_ei = '1' then -- if end of instruction is reached on fetch
+ mc_nop <= '1';
+ if clr = '1' then -- if reset
+ op_sync <= '0';
+ nxt <= s0; -- goto reset
+ else
+ op_sync <= '1'; -- remain in this state to fetch a new opcode
+ nxt <= s1;
+ end if;
+ else
+ mc_nop <= '0';
+ op_sync <= '0'; -- goto s2
+ nxt <= s2;
+ end if;
+ end if;
+ end if;
+
+ -- wait until end of instruction
+ when s2 =>
+ fetch <= '0';
+ pq <= p1;
+ fb <= '0';
+ od <= '0';
+ mc_nop <= '0';
+ pci <= '0';
+ if aim = '1' then -- opcode with indexed mode
+ op_sync <= '0';
+ nxt <= s3;
+ else
+ if mc_ei = '1' then -- if end of instruction is reached
+ if clr = '1' then
+ op_sync <= '0';
+ nxt <= s0;
+ else
+ op_sync <= '1';
+ nxt <= s1;
+ end if;
+ else
+ op_sync <= '0';
+ nxt <= s2;
+ end if;
+ end if;
+
+ when s3 => -- opcode with absolute indexed mode
+ fetch <= '0';
+ pq <= p1;
+ fb <= '0';
+ od <= '0';
+ pci <= '0';
+ if mc_ei = '1' then -- if end of instruction is reached
+ if icarry = '0' then
+ mc_nop <= '1';
+ if clr = '1' then
+ op_sync <= '0';
+ nxt <= s0;
+ else
+ op_sync <= '1';
+ nxt <= s1;
+ end if;
+ else
+ op_sync <= '0';
+ mc_nop <= '0';
+ nxt <= s4;
+ end if;
+ else
+ op_sync <= '0';
+ mc_nop <= '0';
+ nxt <= s3;
+ end if;
+
+ when s4 => -- opcode with absolute indexed mode: add carry to msb PC
+ fetch <= '0';
+ pq <= p1;
+ fb <= '0';
+ od <= '0';
+ pci <= '0';
+ if clr = '1' then
+ mc_nop <= '0';
+ op_sync <= '0';
+ nxt <= s0;
+ else
+ mc_nop <= '1';
+ op_sync <= '1';
+ nxt <= s1;
+ end if;
+
+ -- ADD/SUB decimal adjustement extra cycle
+ when s5 =>
+ fetch <= '0';
+ pq <= p1;
+ fb <= '0';
+ od <= '0';
+ pci <= '0';
+ if mc_ei = '1' then
+ if dec_mode = '0' then
+ mc_nop <= '1';
+ else
+ mc_nop <= '0';
+ end if;
+ if clr = '1' then
+ op_sync <= '0';
+ nxt <= s0;
+ else
+ op_sync <= '1';
+ nxt <= s1;
+ end if;
+ else
+ mc_nop <= '0';
+ op_sync <= '0';
+ nxt <= s5;
+ end if;
+
+ when s6 =>
+ pq <= "000";
+ od <= '1'; -- clear microcode sequencer
+ fetch <= '0';
+ fb <= '1'; -- force load BRK to opcode register
+ pci <= '0'; -- PC doesn't increment
+ op_sync <= '1';
+ mc_nop <= '0';
+ nxt <= s2; -- goto s2
+
+ -- illegal state covering
+ when others =>
+ fetch <= '0';
+ op_sync <= '0';
+ pci <= '0';
+ pq <= "000";
+ fb <= '0';
+ od <= '1';
+ mc_nop <= '0';
+ nxt <= s0;
+
+ end case;
+ end process;
+end rtl;
+
+
Index: trunk/data_mux.vhd
===================================================================
--- trunk/data_mux.vhd (nonexistent)
+++ trunk/data_mux.vhd (revision 2)
@@ -0,0 +1,32 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit three-way multiplexer
+entity data_mux is
+ port( s: in STD_LOGIC_VECTOR(3 downto 0);
+ a: in STD_LOGIC_VECTOR(7 downto 0);
+ b: in STD_LOGIC_VECTOR(7 downto 0);
+ c: in STD_LOGIC_VECTOR(7 downto 0);
+ d: in STD_LOGIC_VECTOR(7 downto 0);
+ y: out STD_LOGIC_VECTOR(7 downto 0)
+ );
+end data_mux;
+
+architecture comb of data_mux is
+
+begin
+ process(s,a,b,c,d)
+ begin
+ case s is
+ when "1110" => y <= a;
+ when "1101" => y <= b;
+ when "1011" => y <= c;
+ when "0111" => y <= d;
+ when others => y <= a;
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/decreg.vhd
===================================================================
--- trunk/decreg.vhd (nonexistent)
+++ trunk/decreg.vhd (revision 2)
@@ -0,0 +1,110 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- register operation decode
+entity decreg is
+ port( r: in STD_LOGIC_VECTOR(5 downto 0);
+ y: out STD_LOGIC_VECTOR(29 downto 0)
+ );
+end decreg;
+
+architecture comb of decreg is
+constant NOP_R: STD_LOGIC_VECTOR(5 downto 0) := "000000"; -- no operation
+constant ALL_R: STD_LOGIC_VECTOR(5 downto 0) := "000001"; -- register A load lsb
+constant ALM_R: STD_LOGIC_VECTOR(5 downto 0) := "000010"; -- register A load msb
+constant A16_R: STD_LOGIC_VECTOR(5 downto 0) := "000011"; -- register A load msb & lsb
+constant XLL_R: STD_LOGIC_VECTOR(5 downto 0) := "000100"; -- register X load lsb
+constant XLM_R: STD_LOGIC_VECTOR(5 downto 0) := "000101"; -- register X load msb
+constant X16_R: STD_LOGIC_VECTOR(5 downto 0) := "000110"; -- register X load msb & lsb
+constant YLL_R: STD_LOGIC_VECTOR(5 downto 0) := "000111"; -- register Y load lsb
+constant YLM_R: STD_LOGIC_VECTOR(5 downto 0) := "001000"; -- register Y load msb
+constant Y16_R: STD_LOGIC_VECTOR(5 downto 0) := "001001"; -- register Y load msb & lsb
+constant DLL_R: STD_LOGIC_VECTOR(5 downto 0) := "001010"; -- register D load lsb
+constant DLM_R: STD_LOGIC_VECTOR(5 downto 0) := "001011"; -- register D load msb
+constant D16_R: STD_LOGIC_VECTOR(5 downto 0) := "001100"; -- register D load msb & lsb
+constant OLD_R: STD_LOGIC_VECTOR(5 downto 0) := "001101"; -- register O load lsb
+constant OMD_R: STD_LOGIC_VECTOR(5 downto 0) := "001110"; -- register O load msb
+constant SLD_R: STD_LOGIC_VECTOR(5 downto 0) := "001111"; -- register S load lsb
+constant SLM_R: STD_LOGIC_VECTOR(5 downto 0) := "010000"; -- register S load msb
+constant S16_R: STD_LOGIC_VECTOR(5 downto 0) := "010001"; -- register S load msb & lsb
+constant SUP_R: STD_LOGIC_VECTOR(5 downto 0) := "010010"; -- register S increment by 1
+constant SDW_R: STD_LOGIC_VECTOR(5 downto 0) := "010011"; -- register S decrement by 1
+constant SAU_R: STD_LOGIC_VECTOR(5 downto 0) := "010100"; -- register A (lsb) load/register S increment by 1
+constant SXU_R: STD_LOGIC_VECTOR(5 downto 0) := "010101"; -- register X (lsb) load/register S increment by 1
+constant SXM_R: STD_LOGIC_VECTOR(5 downto 0) := "010110"; -- register X (msb) load/register S increment by 1
+constant SYU_R: STD_LOGIC_VECTOR(5 downto 0) := "010111"; -- register Y (lsb) load/register S increment by 1
+constant SYM_R: STD_LOGIC_VECTOR(5 downto 0) := "011000"; -- register Y (msb) load/register S increment by 1
+constant KLD_R: STD_LOGIC_VECTOR(5 downto 0) := "011001"; -- register K (PBR) load
+constant BLD_R: STD_LOGIC_VECTOR(5 downto 0) := "011010"; -- register B (DBR) load
+constant KCL_R: STD_LOGIC_VECTOR(5 downto 0) := "011011"; -- register K (PBR) clear and register S decrement by 1
+constant BCL_R: STD_LOGIC_VECTOR(5 downto 0) := "011100"; -- register B (DBR) clear
+constant SKC_R: STD_LOGIC_VECTOR(5 downto 0) := "011101"; -- register B (DBR) clear and register S decrement by 1
+constant DEA_R: STD_LOGIC_VECTOR(5 downto 0) := "011110"; -- register A decrement (MVN/MVP)
+constant O16_R: STD_LOGIC_VECTOR(5 downto 0) := "011111"; -- register O load msb & lsb
+constant OSU_R: STD_LOGIC_VECTOR(5 downto 0) := "100000"; -- register O load lsb/register S increment by 1
+constant MVN_R: STD_LOGIC_VECTOR(5 downto 0) := "100001"; -- register XY increment by 1, A decremented by 1
+constant MVP_R: STD_LOGIC_VECTOR(5 downto 0) := "100010"; -- register XY decrement by 1, A decremented by 1
+constant MUL_R: STD_LOGIC_VECTOR(5 downto 0) := "100011"; -- register A/B load multiplication lsb result, register X load multiplication msb result
+constant MUI_R: STD_LOGIC_VECTOR(5 downto 0) := "100100"; -- multiplication init
+constant MUS_R: STD_LOGIC_VECTOR(5 downto 0) := "100101"; -- multiplication (unsigned) start
+constant MSS_R: STD_LOGIC_VECTOR(5 downto 0) := "100110"; -- multiplication (signed) start
+constant WAI_R: STD_LOGIC_VECTOR(5 downto 0) := "100111"; -- WAI set flipflop
+constant STP_R: STD_LOGIC_VECTOR(5 downto 0) := "101000"; -- STP set flipflop
+constant BLS_R: STD_LOGIC_VECTOR(5 downto 0) := "101001"; -- register B (DBR) load/register S incremented by 1
+constant DLS_R: STD_LOGIC_VECTOR(5 downto 0) := "101010"; -- register D load msb & lsb/register S incremented by 1
+
+begin
+ process(r)
+ begin
+ case r is
+ when NOP_R => y <= "000000000000000000000000000000";
+ when ALL_R => y <= "000000000000000000000000000001";
+ when ALM_R => y <= "000000000000000000000000000010";
+ when A16_R => y <= "000000000000000000000000000011";
+ when DEA_R => y <= "000000000000000000000000000100";
+ when XLL_R => y <= "000000000000000000000000001000";
+ when XLM_R => y <= "000000000000000000000000010000";
+ when X16_R => y <= "000000000000000000000000011000";
+ when YLL_R => y <= "000000000000000000000010000000";
+ when YLM_R => y <= "000000000000000000000100000000";
+ when Y16_R => y <= "000000000000000000000110000000";
+ when DLL_R => y <= "000000000000000000100000000000";
+ when DLM_R => y <= "000000000000000001000000000000";
+ when D16_R => y <= "000000000000000001100000000000";
+ when OLD_R => y <= "000000000000000100000000000000";
+ when OMD_R => y <= "000000000000001000000000000000";
+ when SLD_R => y <= "000000000000010000000000000000";
+ when SLM_R => y <= "000000000000100000000000000000";
+ when S16_R => y <= "000000000000110000000000000000";
+ when SUP_R => y <= "000000000001000000000000000000";
+ when SDW_R => y <= "000000000010000000000000000000";
+ when SAU_R => y <= "000000000001000000000000000001";
+ when SXU_R => y <= "000000000001000000000000001000";
+ when SXM_R => y <= "000000000001000000000000010000";
+ when SYU_R => y <= "000000000001000000000010000000";
+ when SYM_R => y <= "000000000001000000000100000000";
+ when KLD_R => y <= "000000000100000000000000000000";
+ when BLD_R => y <= "000000001000000000000000000000";
+ when KCL_R => y <= "000000010010000000000000000000";
+ when BCL_R => y <= "000000100000000000000000000000";
+ when SKC_R => y <= "000000100010000000000000000000";
+ when O16_R => y <= "000000000000000010000000000000";
+ when OSU_R => y <= "000000000001000100000000000000";
+ when MVN_R => y <= "000000000000000000010001000100";
+ when MVP_R => y <= "000000000000000000001000100100";
+ when MUL_R => y <= "000001000000000000000000000000";
+ when MUI_R => y <= "000010000000000000000000000000";
+ when MUS_R => y <= "000100000000000000000000000000";
+ when MSS_R => y <= "001000000000000000000000000000";
+ when WAI_R => y <= "010000000000000000000000000000";
+ when STP_R => y <= "100000000000000000000000000000";
+ when BLS_R => y <= "000000001001000000000000000000";
+ when DLS_R => y <= "000000000001000001100000000000";
+ when others => y <= "000000000000000000000000000000";
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/dmux.vhd
===================================================================
--- trunk/dmux.vhd (nonexistent)
+++ trunk/dmux.vhd (revision 2)
@@ -0,0 +1,35 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8/16 bit three-way multiplexer
+-- this multiplexer select the operand source for ALU operand #2 (op2) input
+entity dmux is
+ port( sel: in STD_LOGIC_VECTOR(2 downto 0);
+ a: in STD_LOGIC_VECTOR(15 downto 0);
+ b: in STD_LOGIC_VECTOR(7 downto 0);
+ y: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end dmux;
+
+architecture comb of dmux is
+constant NOP_D: STD_LOGIC_VECTOR(2 downto 0) := "000";
+constant ORD_D: STD_LOGIC_VECTOR(2 downto 0) := "001"; -- selects 16 bit operand register
+constant EXT_D: STD_LOGIC_VECTOR(2 downto 0) := "010"; -- selects 8 bit external data bus
+constant EXM_D: STD_LOGIC_VECTOR(2 downto 0) := "011"; -- selects msb 8 bit external data bus and lsb operand register
+constant BCD_D: STD_LOGIC_VECTOR(2 downto 0) := "100"; -- not used
+
+begin
+ process(sel,a,b)
+ begin
+ case sel is
+ when ORD_D => y <= a; -- selects 16 bit operand register
+ when EXT_D => y <= "00000000" & b; -- selects 8 bit external data bus
+ when EXM_D => y <= b & a(7 downto 0); -- selects msb 8 bit external data bus and lsb operand register
+ when others => y <= "0000000000000000";
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/dr.vhd
===================================================================
--- trunk/dr.vhd (nonexistent)
+++ trunk/dr.vhd (revision 2)
@@ -0,0 +1,47 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit zero page/direct register "D"
+entity dr is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end dr;
+
+architecture rtl of dr is
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+signal op: STD_LOGIC_VECTOR(1 downto 0);
+begin
+ op <= ld_msb & ld_lsb;
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "0000000000000000";
+ else
+ case op is
+ when "01" => reg(7 downto 0) <= din(7 downto 0); -- load lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "10" => reg(15 downto 8) <= din(7 downto 0); -- load msb
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "11" => reg <= din; -- load msb & lsb
+ when others => reg <= reg;
+ end case;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/intlog.vhd
===================================================================
--- trunk/intlog.vhd (nonexistent)
+++ trunk/intlog.vhd (revision 2)
@@ -0,0 +1,151 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- interrupt request logic
+entity intlog is
+ port( clk: in STD_LOGIC;
+ iack: in STD_LOGIC; -- interrupt acknowledge by microcode
+ r: in STD_LOGIC; -- RESET request
+ n: in STD_LOGIC; -- NMI request
+ i: in STD_LOGIC; -- IRQ request
+ brk: in STD_LOGIC; -- BRK opcode
+ cop: in STD_LOGIC; -- COP opcode
+ e: in STD_LOGIC; -- native\emulation mode
+ gmask: in STD_LOGIC; -- global interrupt mask valid for IRQ and NMI (used by two byte instruction)
+ imask: in STD_LOGIC; -- interrupt mask (valid only for IRQ)
+ ioffs: in STD_LOGIC_VECTOR(7 downto 0); -- interrupt servicing offset
+ ireq: out STD_LOGIC; -- global interrupt requestb (IRQ/NMI)
+ voffs: out STD_LOGIC_VECTOR(7 downto 0) -- interrupt vector offset
+ );
+end intlog;
+
+architecture rtl of intlog is
+signal irq_sync: STD_LOGIC_VECTOR(1 downto 0);
+signal nmi_sync: STD_LOGIC_VECTOR(1 downto 0);
+signal res_sync: STD_LOGIC_VECTOR(1 downto 0);
+signal irq_req: STD_LOGIC;
+signal i_nmi_req: STD_LOGIC;
+signal nmi_req: STD_LOGIC;
+signal res_req: STD_LOGIC;
+signal nmi_clr: STD_LOGIC;
+signal res_clr: STD_LOGIC;
+
+begin
+ process(clk) -- IRQ/NMI synchronization
+ begin
+ if(clk'event and clk = '1')then
+ res_sync <= res_sync(res_sync'left-1 downto res_sync'right) & r; -- RES sampling
+ nmi_sync <= nmi_sync(nmi_sync'left-1 downto nmi_sync'right) & n; -- NMI sampling
+ irq_sync <= irq_sync(irq_sync'left-1 downto irq_sync'right) & i; -- IRQ sampling
+ if res_clr = '1' then -- RES ack
+ res_req <= '0';
+ else
+ if res_sync = "11" then -- level detection for RES
+ res_req <= '1';
+ else
+ res_req <= res_req;
+ end if;
+ end if;
+ if nmi_clr = '1' then -- NMI ack
+ i_nmi_req <= '0';
+ else
+ if nmi_sync = "01" then -- edge detection for NMI
+ i_nmi_req <= '1';
+ else
+ i_nmi_req <= i_nmi_req;
+ end if;
+ end if;
+ end if;
+ end process;
+ nmi_req <= '1' when gmask = '0' and i_nmi_req = '1' else '0';
+
+
+ process(gmask, imask, irq_sync)
+ begin
+ if gmask = '0' and imask = '0' then
+ if irq_sync = "11" then
+ irq_req <= '1';
+ else
+ irq_req <= '0';
+ end if;
+ else
+ irq_req <= '0';
+ end if;
+ end process;
+
+ -- priority encoder and vector offset generation (vector bits 7..0)
+ process(e, res_req, nmi_req, irq_req, brk, cop)
+ begin
+ if e = '0' then -- native mode
+ if res_req = '1' then
+ voffs <= x"FC"; -- RESET 0x00FFFC
+ else
+ if nmi_req = '1' then
+ voffs <= x"EA"; -- NMI 0x00FFEA
+ else
+ if irq_req = '1' then
+ voffs <= x"EE"; -- IRQ 0x00FFEE
+ else
+ if brk = '1' then
+ voffs <= x"E6"; -- BRK 0x00FFE6
+ else
+ if cop = '1' then
+ voffs <= x"E4"; -- COP 0x00FFE4
+ else
+ voffs <= "XXXXXXXX";
+ end if;
+ end if;
+ end if;
+ end if;
+ end if;
+ else -- emulation mode
+ if res_req = '1' then
+ voffs <= x"FC"; -- RESET 0x00FFFC
+ else
+ if nmi_req = '1' then -- NMI 0x00FFFA
+ voffs <= x"FA";
+ else
+ if irq_req = '1' then -- IRQ 0x00FFFE
+ voffs <= x"FE";
+ else
+ if brk = '1' then -- BRK 0x00FFFE
+ voffs <= x"FE";
+ else
+ if cop = '1' then -- COP 0x00FFF4
+ voffs <= x"F4";
+ else
+ voffs <= "XXXXXXXX";
+ end if;
+ end if;
+ end if;
+ end if;
+ end if;
+ end if;
+
+ end process;
+
+ process(iack,ioffs) -- interrupt acknowledge and flags clear
+ begin
+ if iack = '1' then
+ case ioffs is
+ when x"FC" => res_clr <= '1'; -- RESET acknowledge
+ nmi_clr <= '1'; -- also NMI acknowledge
+ when x"EA" => nmi_clr <= '1'; -- NMI acknowledge (native mode)
+ res_clr <= '0';
+ when x"FA" => nmi_clr <= '1'; -- NMI acknowledge (emulation mode)
+ res_clr <= '0';
+ when others => res_clr <= '0';
+ nmi_clr <= '0';
+ end case;
+ else
+ res_clr <= '0';
+ nmi_clr <= '0';
+ end if;
+ end process;
+
+ ireq <= res_req or nmi_req or irq_req;
+end rtl;
+
+
Index: trunk/kr.vhd
===================================================================
--- trunk/kr.vhd (nonexistent)
+++ trunk/kr.vhd (revision 2)
@@ -0,0 +1,41 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit register "K" (PBR)
+entity kr is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(7 downto 0);
+ dout: out STD_LOGIC_VECTOR(7 downto 0)
+ );
+end kr;
+
+architecture rtl of kr is
+signal reg: STD_LOGIC_VECTOR(7 downto 0);
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "00000000";
+ else
+ if ld = '1' then
+ reg <= din;
+ else
+ reg <= reg;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/mcpla.vhd
===================================================================
--- trunk/mcpla.vhd (nonexistent)
+++ trunk/mcpla.vhd (revision 2)
@@ -0,0 +1,6610 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- microcode 65C816
+-- Written by Valerio Venturi
+-- output fields format:
+-- fields:
+-- RSEL: registers output multiplexer select
+-- REGOP: registers load/increment/decrement etc.
+-- ALUOP: ALU operation
+-- P_OP: register P set/reset bit
+-- MPR: register MP
+-- PCR: register PC
+-- CLI: clear interrupt request
+-- EI: end of microcode sequence
+-- W: read/write control
+-- PD: PC/MP output multiplexer select
+-- VPA: valid program address
+-- VDA: valid data address
+-- ML: memory lock
+entity mcpla is
+ port(em: in STD_LOGIC; -- emulation mode (1)/native mode (0)
+ m: in STD_LOGIC; -- M memory/acc. 8 bit (1), M memory/acc. 16 bit (0)
+ x: in STD_LOGIC; -- X index reg. 8 bit (1), X index reg. 16 bit (0)
+ a: in STD_LOGIC_VECTOR(12 downto 0);
+ q: out STD_LOGIC_VECTOR(44 downto 0)
+ );
+end mcpla;
+
+architecture comb of mcpla is
+
+constant MC_ADDR_LENGTH: INTEGER := 12;
+-- opcode definition:
+-- --
+
+------------------------------------
+-- IMPLIED --
+------------------------------------
+constant NOP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010100000"; -- 0xEA NOP
+
+-- interrupts/coprocessor
+constant BRK_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000000"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000001"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000010"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000011"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000100"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000101"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000110"; -- 0x00 BRK/IRQ/NMI/RES
+constant BRK_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000000111"; -- 0x00 BRK/IRQ/NMI/RES
+
+constant COP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100000"; -- 0x02 COP
+constant COP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100001"; -- 0x02 COP
+constant COP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100010"; -- 0x02 COP
+constant COP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100011"; -- 0x02 COP
+constant COP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100100"; -- 0x02 COP
+constant COP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100101"; -- 0x02 COP
+constant COP_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100110"; -- 0x02 COP
+constant COP_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000100111"; -- 0x02 COP
+
+-- IMPLIED
+constant CLC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110000000"; -- 0x18 CLC 0->C
+constant SEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110000000"; -- 0x38 SEC 1->C
+constant CLI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110000000"; -- 0x58 CLI 0->I
+constant SEI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110000000"; -- 0x78 SEI 1->I
+constant CLV_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110000000"; -- 0xB8 CLV 0->V
+constant CLD_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110000000"; -- 0xD8 CLD 0->D
+constant SED_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110000000"; -- 0xF8 SED 1->D
+constant TAX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010100000"; -- 0xAA TAX A->X
+constant TAY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010000000"; -- 0xA8 TAY A->Y
+constant TXA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010100000"; -- 0x8A TXA X->A
+constant TYA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110000000"; -- 0x98 TYA Y->A
+constant TXY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110110000"; -- 0x9B TXY X->Y
+constant TYX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110110000"; -- 0xBB TYX Y->X
+constant TXS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110100000"; -- 0x9A TXS X->S
+constant TSX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110100000"; -- 0xBA TSX S->X
+constant TCD_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110110000"; -- 0x5B TCD C->D
+constant TDC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110110000"; -- 0x7B TDC D->C
+constant PHP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010000000"; -- 0x08 PHP P->S
+constant PHA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010000000"; -- 0x48 PHA A->S
+constant PHA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010000001"; -- 0x48 PHA A->S
+constant PHX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110100000"; -- 0xDA PHX X->S
+constant PHX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110100001"; -- 0xDA PHX X->S
+constant PHY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110100000"; -- 0x5A PHY X->S
+constant PHY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110100001"; -- 0x5A PHY X->S
+constant PHD_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010110000"; -- 0x0B PHD D->S
+constant PHD_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010110001"; -- 0x0B PHD D->S
+constant PLP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010000000"; -- 0x28 PLP S->P
+constant PLP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010000001"; -- 0x28 PLP S->P
+constant PLA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010000000"; -- 0x68 PLA S->A
+constant PLA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010000001"; -- 0x68 PLA S->A
+constant PLA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010000010"; -- 0x68 PLA S->A
+constant PLA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010000011"; -- 0x68 PLA S->A
+constant PLX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110100000"; -- 0xFA PLX S->X
+constant PLX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110100001"; -- 0xFA PLX S->X
+constant PLX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110100010"; -- 0xFA PLX S->X
+constant PLX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110100011"; -- 0xFA PLX S->X
+constant PLY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110100000"; -- 0x7A PLY S->Y
+constant PLY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110100001"; -- 0x7A PLY S->Y
+constant PLY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110100010"; -- 0x7A PLY S->Y
+constant PLY_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110100011"; -- 0x7A PLY S->Y
+constant PLD_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010110000"; -- 0x2B PLD S->D
+constant PLD_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010110001"; -- 0x2B PLD S->D
+constant PLD_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010110010"; -- 0x2B PLD S->D
+constant INC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110100000"; -- 0x1A INC A +1
+constant DEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110100000"; -- 0x3A DEC A -1
+constant INX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010000000"; -- 0xE8 INX X +1
+constant DEX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010100000"; -- 0xCA DEX X -1
+constant INY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010000000"; -- 0xC8 INY Y +1
+constant DEY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010000000"; -- 0x88 DEY Y -1
+constant RTS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000000000"; -- 0x60 RTS
+constant RTS_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000000001"; -- 0x60 RTS
+constant RTS_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000000010"; -- 0x60 RTS
+constant RTS_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000000011"; -- 0x60 RTS
+constant RTS_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000000100"; -- 0x60 RTS
+constant RTI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000000"; -- 0x40 RTI
+constant RTI_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000001"; -- 0x40 RTI
+constant RTI_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000010"; -- 0x40 RTI
+constant RTI_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000011"; -- 0x40 RTI
+constant RTI_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000100"; -- 0x40 RTI
+constant RTI_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000101"; -- 0x40 RTI
+constant RTI_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000000110"; -- 0x40 RTI
+constant ASL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010100000"; -- 0x0A ASL A
+constant LSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010100000"; -- 0x4A LSR A
+constant ROL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010100000"; -- 0x2A ROL A
+constant ROR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010100000"; -- 0x6A ROR A
+constant TCS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110110000"; -- 0x1B A->S
+constant TSC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110110000"; -- 0x3B S->A
+constant XCE_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110110000"; -- 0xFB XCE E<->C
+constant WDM_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000100000"; -- 0x42 WDM
+constant PHK_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010110000"; -- 0x4B PHK K->S
+constant PHB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010110000"; -- 0x8B PHB B->S
+constant PLB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010110000"; -- 0xAB PLB S->B
+constant PLB_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010110001"; -- 0xAB PLB S->B
+constant RTL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110000"; -- 0x6B RTL
+constant RTL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110001"; -- 0x6B RTL
+constant RTL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110010"; -- 0x6B RTL
+constant RTL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110011"; -- 0x6B RTL
+constant RTL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110100"; -- 0x6B RTL
+constant RTL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110101"; -- 0x6B RTL
+constant RTL_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010110110"; -- 0x6B RTL
+constant XBA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010110000"; -- 0xEB XBA (swap A)
+constant WAI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010110000"; -- 0xCB WAI
+constant WAI_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010110001"; -- 0xCB WAI
+constant STP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110110000"; -- 0xDB STP
+constant STP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110110001"; -- 0xDB STP
+
+------------------------------------
+-- IMMEDIATE --
+------------------------------------
+constant IMLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010010000"; -- 0xA9 LDA #IMM
+constant IMLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101010010001"; -- 0xA9 LDA #IMM
+constant IMLDX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000100000"; -- 0xA2 LDX #IMM
+constant IMLDX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000100001"; -- 0xA2 LDX #IMM
+constant IMLDY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000000000"; -- 0xA0 LDY #IMM
+constant IMLDY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000000001"; -- 0xA0 LDY #IMM
+constant IMADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010010000"; -- 0x69 ADC #IMM
+constant IMADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010010001"; -- 0x69 ADC #IMM
+constant IMADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011010010010"; -- 0x69 ADC #IMM
+constant IMSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010010000"; -- 0xE9 SBC #IMM
+constant IMSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010010001"; -- 0xE9 SBC #IMM
+constant IMSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111010010010"; -- 0xE9 SBC #IMM
+constant IMAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010010000"; -- 0x29 AND #IMM
+constant IMAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001010010001"; -- 0x29 AND #IMM
+constant IMORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010010000"; -- 0x09 ORA #IMM
+constant IMORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000010010001"; -- 0x09 ORA #IMM
+constant IMEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010010000"; -- 0x49 EOR #IMM
+constant IMEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010010010001"; -- 0x49 EOR #IMM
+constant IMCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010010000"; -- 0xC9 CMP #IMM
+constant IMCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110010010001"; -- 0xC9 CMP #IMM
+constant IMCPX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000000000"; -- 0xE0 CPX #IMM
+constant IMCPX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000000001"; -- 0xE0 CPX #IMM
+constant IMCPY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000000000"; -- 0xC0 CPY #IMM
+constant IMCPY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000000001"; -- 0xC0 CPY #IMM
+constant IMBRK_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010010000"; -- 0x89 BRK #IMM
+constant IMBRK_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010010001"; -- 0x89 BRK #IMM
+constant IMSEP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000100000"; -- 0xE2 SEP #IMM
+constant IMREP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000100000"; -- 0xC2 REP #IMM
+constant IMBIT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010010000"; -- 0x89 BIT #IMM
+constant IMBIT_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100010010001"; -- 0x89 BIT #IMM
+
+------------------------------------
+-- ZERO PAGE --
+------------------------------------
+constant ZPLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001010000"; -- 0xA5 LDA ZP
+constant ZPLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001010001"; -- 0xA5 LDA ZP
+constant ZPLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001010010"; -- 0xA5 LDA ZP
+constant ZPLDX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001100000"; -- 0xA6 LDX ZP
+constant ZPLDX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001100001"; -- 0xA6 LDX ZP
+constant ZPLDX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001100010"; -- 0xA6 LDX ZP
+constant ZPLDY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001000000"; -- 0xA4 LDY ZP
+constant ZPLDY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001000001"; -- 0xA4 LDY ZP
+constant ZPLDY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001000010"; -- 0xA4 LDY ZP
+constant ZPSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001010000"; -- 0x85 STA ZP
+constant ZPSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001010001"; -- 0x85 STA ZP
+constant ZPSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001010010"; -- 0x85 STA ZP
+constant ZPSTX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001100000"; -- 0x86 STX ZP
+constant ZPSTX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001100001"; -- 0x86 STX ZP
+constant ZPSTX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001100010"; -- 0x86 STX ZP
+constant ZPSTY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001000000"; -- 0x84 STY ZP
+constant ZPSTY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001000001"; -- 0x84 STY ZP
+constant ZPSTY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001000010"; -- 0x84 STY ZP
+constant ZPSTZ_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001000000"; -- 0x64 STZ ZP
+constant ZPSTZ_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001000001"; -- 0x64 STZ ZP
+constant ZPSTZ_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001000010"; -- 0x64 STZ ZP
+constant ZPADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001010000"; -- 0x65 ADC ZP
+constant ZPADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001010001"; -- 0x65 ADC ZP
+constant ZPADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001010010"; -- 0x65 ADC ZP
+constant ZPADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001010011"; -- 0x65 ADC ZP
+constant ZPSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001010000"; -- 0xE5 SBC ZP
+constant ZPSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001010001"; -- 0xE5 SBC ZP
+constant ZPSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001010010"; -- 0xE5 SBC ZP
+constant ZPSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001010011"; -- 0xE5 SBC ZP
+constant ZPCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001010000"; -- 0xC5 CMP ZP
+constant ZPCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001010001"; -- 0xC5 CMP ZP
+constant ZPCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001010010"; -- 0xC5 CMP ZP
+constant ZPCPX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001000000"; -- 0xE4 CPX ZP
+constant ZPCPX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001000001"; -- 0xE4 CPX ZP
+constant ZPCPX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001000010"; -- 0xE4 CPX ZP
+constant ZPCPY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001000000"; -- 0xC4 CPY ZP
+constant ZPCPY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001000001"; -- 0xC4 CPY ZP
+constant ZPCPY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001000010"; -- 0xC4 CPY ZP
+constant ZPAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001010000"; -- 0x25 AND ZP
+constant ZPAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001010001"; -- 0x25 AND ZP
+constant ZPAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001010010"; -- 0x25 AND ZP
+constant ZPORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001010000"; -- 0x05 ORA ZP
+constant ZPORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001010001"; -- 0x05 ORA ZP
+constant ZPORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001010010"; -- 0x05 ORA ZP
+constant ZPEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001010000"; -- 0x45 EOR ZP
+constant ZPEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001010001"; -- 0x45 EOR ZP
+constant ZPEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001010010"; -- 0x45 EOR ZP
+constant ZPBIT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001000000"; -- 0x24 BIT ZP
+constant ZPBIT_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001000001"; -- 0x24 BIT ZP
+constant ZPBIT_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001000010"; -- 0x24 BIT ZP
+constant ZPASL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100000"; -- 0x06 ASL ZP
+constant ZPASL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100001"; -- 0x06 ASL ZP
+constant ZPASL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100010"; -- 0x06 ASL ZP
+constant ZPASL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100011"; -- 0x06 ASL ZP
+constant ZPASL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100100"; -- 0x06 ASL ZP
+constant ZPASL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001100101"; -- 0x06 ASL ZP
+constant ZPLSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100000"; -- 0x46 LSR ZP
+constant ZPLSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100001"; -- 0x46 LSR ZP
+constant ZPLSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100010"; -- 0x46 LSR ZP
+constant ZPLSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100011"; -- 0x46 LSR ZP
+constant ZPLSR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100100"; -- 0x46 LSR ZP
+constant ZPLSR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001100101"; -- 0x46 LSR ZP
+constant ZPROL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100000"; -- 0x26 ROL ZP
+constant ZPROL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100001"; -- 0x26 ROL ZP
+constant ZPROL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100010"; -- 0x26 ROL ZP
+constant ZPROL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100011"; -- 0x26 ROL ZP
+constant ZPROL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100100"; -- 0x26 ROL ZP
+constant ZPROL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001100101"; -- 0x26 ROL ZP
+constant ZPROR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100000"; -- 0x66 ROR ZP
+constant ZPROR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100001"; -- 0x66 ROR ZP
+constant ZPROR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100010"; -- 0x66 ROR ZP
+constant ZPROR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100011"; -- 0x66 ROR ZP
+constant ZPROR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100100"; -- 0x66 ROR ZP
+constant ZPROR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001100101"; -- 0x66 ROR ZP
+constant ZPINC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100000"; -- 0xE6 INC ZP
+constant ZPINC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100001"; -- 0xE6 INC ZP
+constant ZPINC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100010"; -- 0xE6 INC ZP
+constant ZPINC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100011"; -- 0xE6 INC ZP
+constant ZPINC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100100"; -- 0xE6 INC ZP
+constant ZPINC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001100101"; -- 0xE6 INC ZP
+constant ZPDEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100000"; -- 0xC6 DEC ZP
+constant ZPDEC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100001"; -- 0xC6 DEC ZP
+constant ZPDEC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100010"; -- 0xC6 DEC ZP
+constant ZPDEC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100011"; -- 0xC6 DEC ZP
+constant ZPDEC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100100"; -- 0xC6 DEC ZP
+constant ZPDEC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001100101"; -- 0xC6 DEC ZP
+constant ZPTSB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000000"; -- 0x04 TSB ZP
+constant ZPTSB_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000001"; -- 0x04 TSB ZP
+constant ZPTSB_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000010"; -- 0x04 TSB ZP
+constant ZPTSB_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000011"; -- 0x04 TSB ZP
+constant ZPTSB_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000100"; -- 0x04 TSB ZP
+constant ZPTSB_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000101"; -- 0x04 TSB ZP
+constant ZPTSB_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001000110"; -- 0x04 TSB ZP
+constant ZPTRB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000000"; -- 0x14 TRB ZP
+constant ZPTRB_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000001"; -- 0x14 TRB ZP
+constant ZPTRB_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000010"; -- 0x14 TRB ZP
+constant ZPTRB_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000011"; -- 0x14 TRB ZP
+constant ZPTRB_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000100"; -- 0x14 TRB ZP
+constant ZPTRB_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000101"; -- 0x14 TRB ZP
+constant ZPTRB_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101000110"; -- 0x14 TRB ZP
+
+------------------------------------
+-- ZERO PAGE,X --
+------------------------------------
+constant ZXLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101010000"; -- 0xB5 LDA ZP,X
+constant ZXLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101010001"; -- 0xB5 LDA ZP,X
+constant ZXLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101010010"; -- 0xB5 LDA ZP,X
+constant ZXLDY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101000000"; -- 0xB4 LDY ZP,X
+constant ZXLDY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101000001"; -- 0xB4 LDY ZP,X
+constant ZXLDY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101000010"; -- 0xB4 LDY ZP,X
+constant ZXSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101010000"; -- 0x95 STA ZP,X
+constant ZXSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101010001"; -- 0x95 STA ZP,X
+constant ZXSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101010010"; -- 0x95 STA ZP,X
+constant ZXSTY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101000000"; -- 0x94 STY ZP,X
+constant ZXSTY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101000001"; -- 0x94 STY ZP,X
+constant ZXSTY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101000010"; -- 0x94 STY ZP,X
+constant ZXSTZ_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101000000"; -- 0x74 STZ ZP,X
+constant ZXSTZ_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101000001"; -- 0x74 STZ ZP,X
+constant ZXSTZ_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101000010"; -- 0x74 STZ ZP,X
+constant ZXADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101010000"; -- 0x75 ADC ZP,X
+constant ZXADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101010001"; -- 0x75 ADC ZP,X
+constant ZXADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101010010"; -- 0x75 ADC ZP,X
+constant ZXSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101010000"; -- 0xF5 SBC ZP,X
+constant ZXSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101010001"; -- 0xF5 SBC ZP,X
+constant ZXSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101010010"; -- 0xF5 SBC ZP,X
+constant ZXCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101010000"; -- 0xD5 CMP ZP,X
+constant ZXCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101010001"; -- 0xD5 CMP ZP,X
+constant ZXCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101010010"; -- 0xD5 CMP ZP,X
+constant ZXAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101010000"; -- 0x35 AND ZP,X
+constant ZXAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101010001"; -- 0x35 AND ZP,X
+constant ZXAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101010010"; -- 0x35 AND ZP,X
+constant ZXORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101010000"; -- 0x15 ORA ZP,X
+constant ZXORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101010001"; -- 0x15 ORA ZP,X
+constant ZXORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101010010"; -- 0x15 ORA ZP,X
+constant ZXEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101010000"; -- 0x55 EOR ZP,X
+constant ZXEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101010001"; -- 0x55 EOR ZP,X
+constant ZXEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101010010"; -- 0x55 EOR ZP,X
+constant ZXASL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100000"; -- 0x16 ASL ZP,X
+constant ZXASL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100001"; -- 0x16 ASL ZP,X
+constant ZXASL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100010"; -- 0x16 ASL ZP,X
+constant ZXASL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100011"; -- 0x16 ASL ZP,X
+constant ZXASL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100100"; -- 0x16 ASL ZP,X
+constant ZXASL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101100101"; -- 0x16 ASL ZP,X
+constant ZXLSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100000"; -- 0x56 LSR ZP,X
+constant ZXLSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100001"; -- 0x56 LSR ZP,X
+constant ZXLSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100010"; -- 0x56 LSR ZP,X
+constant ZXLSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100011"; -- 0x56 LSR ZP,X
+constant ZXLSR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100100"; -- 0x56 LSR ZP,X
+constant ZXLSR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101100101"; -- 0x56 LSR ZP,X
+constant ZXROL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100000"; -- 0x36 ROL ZP,X
+constant ZXROL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100001"; -- 0x36 ROL ZP,X
+constant ZXROL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100010"; -- 0x36 ROL ZP,X
+constant ZXROL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100011"; -- 0x36 ROL ZP,X
+constant ZXROL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100100"; -- 0x36 ROL ZP,X
+constant ZXROL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101100101"; -- 0x36 ROL ZP,X
+constant ZXROR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100000"; -- 0x76 ROR ZP,X
+constant ZXROR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100001"; -- 0x76 ROR ZP,X
+constant ZXROR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100010"; -- 0x76 ROR ZP,X
+constant ZXROR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100011"; -- 0x76 ROR ZP,X
+constant ZXROR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100100"; -- 0x76 ROR ZP,X
+constant ZXROR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101100101"; -- 0x76 ROR ZP,X
+constant ZXDEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100000"; -- 0xD6 DEC ZP,X
+constant ZXDEC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100001"; -- 0xD6 DEC ZP,X
+constant ZXDEC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100010"; -- 0xD6 DEC ZP,X
+constant ZXDEC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100011"; -- 0xD6 DEC ZP,X
+constant ZXDEC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100100"; -- 0xD6 DEC ZP,X
+constant ZXDEC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101100101"; -- 0xD6 DEC ZP,X
+constant ZXINC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100000"; -- 0xF6 INC ZP,X
+constant ZXINC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100001"; -- 0xF6 INC ZP,X
+constant ZXINC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100010"; -- 0xF6 INC ZP,X
+constant ZXINC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100011"; -- 0xF6 INC ZP,X
+constant ZXINC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100100"; -- 0xF6 INC ZP,X
+constant ZXINC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101100101"; -- 0xF6 INC ZP,X
+constant ZXBIT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101000000"; -- 0x34 BIT ZP,X
+constant ZXBIT_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101000001"; -- 0x34 BIT ZP,X
+constant ZXBIT_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101000010"; -- 0x34 BIT ZP,X
+
+------------------------------------
+-- ZERO PAGE,Y --
+------------------------------------
+constant ZYLDX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101100000"; -- 0xB6 LDX ZP,Y
+constant ZYLDX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101100001"; -- 0xB6 LDX ZP,Y
+constant ZYLDX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101100010"; -- 0xB6 LDX ZP,Y
+constant ZYLDX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101100011"; -- 0xB6 LDX ZP,Y
+
+constant ZYSTX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101100000"; -- 0x96 STX ZP,Y
+constant ZYSTX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101100001"; -- 0x96 STX ZP,Y
+constant ZYSTX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101100010"; -- 0x96 STX ZP,Y
+
+------------------------------------
+-- INDIRECT --
+------------------------------------
+constant INJMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011000000"; -- 0x6C JMP (IND)
+constant INJMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011000001"; -- 0x6C JMP (IND)
+constant INJMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011000010"; -- 0x6C JMP (IND)
+constant INJMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011000011"; -- 0x6C JMP (IND)
+constant INJML_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111000000"; -- 0xDC JML (IND)
+constant INJML_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111000001"; -- 0xDC JML (IND)
+constant INJML_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111000010"; -- 0xDC JML (IND)
+constant INJML_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111000011"; -- 0xDC JML (IND)
+constant INJML_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111000100"; -- 0xDC JML (IND)
+
+
+------------------------------------
+-- INDIRECT,Y --
+------------------------------------
+constant IYLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010000"; -- 0xB1 LDA [DIR],Y
+constant IYLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010001"; -- 0xB1 LDA [DIR],Y
+constant IYLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010010"; -- 0xB1 LDA [DIR],Y
+constant IYLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010011"; -- 0xB1 LDA [DIR],Y
+constant IYLDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010100"; -- 0xB1 LDA [DIR],Y
+constant IYLDA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100010101"; -- 0xB1 LDA [DIR],Y
+constant IYSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010000"; -- 0x91 STA [DIR],Y
+constant IYSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010001"; -- 0x91 STA [DIR],Y
+constant IYSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010010"; -- 0x91 STA [DIR],Y
+constant IYSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010011"; -- 0x91 STA [DIR],Y
+constant IYSTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010100"; -- 0x91 STA [DIR],Y
+constant IYSTA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100010101"; -- 0x91 STA [DIR],Y
+constant IYADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010000"; -- 0x71 ADC [DIR],Y
+constant IYADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010001"; -- 0x71 ADC [DIR],Y
+constant IYADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010010"; -- 0x71 ADC [DIR],Y
+constant IYADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010011"; -- 0x71 ADC [DIR],Y
+constant IYADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010100"; -- 0x71 ADC [DIR],Y
+constant IYADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100010101"; -- 0x71 ADC [DIR],Y
+constant IYSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010000"; -- 0xF1 SBC [DIR],Y
+constant IYSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010001"; -- 0xF1 SBC [DIR],Y
+constant IYSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010010"; -- 0xF1 SBC [DIR],Y
+constant IYSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010011"; -- 0xF1 SBC [DIR],Y
+constant IYSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010100"; -- 0xF1 SBC [DIR],Y
+constant IYSBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100010101"; -- 0xF1 SBC [DIR],Y
+constant IYCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010000"; -- 0xD1 CMP [DIR],Y
+constant IYCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010001"; -- 0xD1 CMP [DIR],Y
+constant IYCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010010"; -- 0xD1 CMP [DIR],Y
+constant IYCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010011"; -- 0xD1 CMP [DIR],Y
+constant IYCMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010100"; -- 0xD1 CMP [DIR],Y
+constant IYCMP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100010101"; -- 0xD1 CMP [DIR],Y
+constant IYAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010000"; -- 0x31 AND [DIR],Y
+constant IYAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010001"; -- 0x31 AND [DIR],Y
+constant IYAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010010"; -- 0x31 AND [DIR],Y
+constant IYAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010011"; -- 0x31 AND [DIR],Y
+constant IYAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010100"; -- 0x31 AND [DIR],Y
+constant IYAND_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100010101"; -- 0x31 AND [DIR],Y
+constant IYORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010000"; -- 0x11 ORA [DIR],Y
+constant IYORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010001"; -- 0x11 ORA [DIR],Y
+constant IYORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010010"; -- 0x11 ORA [DIR],Y
+constant IYORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010011"; -- 0x11 ORA [DIR],Y
+constant IYORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010100"; -- 0x11 ORA [DIR],Y
+constant IYORA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100010101"; -- 0x11 ORA [DIR],Y
+constant IYEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010000"; -- 0x51 EOR [DIR],Y
+constant IYEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010001"; -- 0x51 EOR [DIR],Y
+constant IYEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010010"; -- 0x51 EOR [DIR],Y
+constant IYEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010011"; -- 0x51 EOR [DIR],Y
+constant IYEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010100"; -- 0x51 EOR [DIR],Y
+constant IYEOR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100010101"; -- 0x51 EOR [DIR],Y
+
+------------------------------------
+-- INDIRECT,X --
+------------------------------------
+constant IXLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000010000"; -- 0xA1 LDA (IND_ZP,X)
+constant IXLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000010001"; -- 0xA1 LDA (IND_ZP,X)
+constant IXLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000010010"; -- 0xA1 LDA (IND_ZP,X)
+constant IXLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000010011"; -- 0xA1 LDA (IND_ZP,X)
+constant IXLDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000010100"; -- 0xA1 LDA (IND_ZP,X)
+constant IXSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000010000"; -- 0x81 STA (IND_ZP,X)
+constant IXSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000010001"; -- 0x81 STA (IND_ZP,X)
+constant IXSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000010010"; -- 0x81 STA (IND_ZP,X)
+constant IXSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000010011"; -- 0x81 STA (IND_ZP,X)
+constant IXSTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000010100"; -- 0x81 STA (IND_ZP,X)
+constant IXAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000010000"; -- 0x21 AND (IND_ZP,X)
+constant IXAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000010001"; -- 0x21 AND (IND_ZP,X)
+constant IXAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000010010"; -- 0x21 AND (IND_ZP,X)
+constant IXAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000010011"; -- 0x21 AND (IND_ZP,X)
+constant IXAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000010100"; -- 0x21 AND (IND_ZP,X)
+constant IXORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000010000"; -- 0x01 ORA (IND_ZP,X)
+constant IXORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000010001"; -- 0x01 ORA (IND_ZP,X)
+constant IXORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000010010"; -- 0x01 ORA (IND_ZP,X)
+constant IXORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000010011"; -- 0x01 ORA (IND_ZP,X)
+constant IXORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000010100"; -- 0x01 ORA (IND_ZP,X)
+constant IXEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000010000"; -- 0x41 EOR (IND_ZP,X)
+constant IXEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000010001"; -- 0x41 EOR (IND_ZP,X)
+constant IXEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000010010"; -- 0x41 EOR (IND_ZP,X)
+constant IXEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000010011"; -- 0x41 EOR (IND_ZP,X)
+constant IXEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000010100"; -- 0x41 EOR (IND_ZP,X)
+constant IXCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000010000"; -- 0xC1 CMP (IND_ZP,X)
+constant IXCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000010001"; -- 0xC1 CMP (IND_ZP,X)
+constant IXCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000010010"; -- 0xC1 CMP (IND_ZP,X)
+constant IXCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000010011"; -- 0xC1 CMP (IND_ZP,X)
+constant IXCMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000010100"; -- 0xC1 CMP (IND_ZP,X)
+constant IXADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000010000"; -- 0x61 ADC (IND_ZP,X)
+constant IXADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000010001"; -- 0x61 ADC (IND_ZP,X)
+constant IXADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000010010"; -- 0x61 ADC (IND_ZP,X)
+constant IXADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000010011"; -- 0x61 ADC (IND_ZP,X)
+constant IXADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000010100"; -- 0x61 ADC (IND_ZP,X)
+constant IXSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000010000"; -- 0xE1 SBC (IND_ZP,X)
+constant IXSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000010001"; -- 0xE1 SBC (IND_ZP,X)
+constant IXSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000010010"; -- 0xE1 SBC (IND_ZP,X)
+constant IXSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000010011"; -- 0xE1 SBC (IND_ZP,X)
+constant IXSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000010100"; -- 0xE1 SBC (IND_ZP,X)
+constant IXJMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111000000"; -- 0x7C JMP (IND,X)
+constant IXJMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111000001"; -- 0x7C JMP (IND,X)
+constant IXJMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111000010"; -- 0x7C JMP (IND,X)
+constant IXJMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111000011"; -- 0x7C JMP (IND,X)
+constant IXJMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111000100"; -- 0x7C JMP (IND,X)
+constant IXJSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000000"; -- 0xFC JSR (IND,X)
+constant IXJSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000001"; -- 0xFC JSR (IND,X)
+constant IXJSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000010"; -- 0xFC JSR (IND,X)
+constant IXJSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000011"; -- 0xFC JSR (IND,X)
+constant IXJSR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000100"; -- 0xFC JSR (IND,X)
+constant IXJSR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111000101"; -- 0xFC JSR (IND,X)
+
+------------------------------------
+-- ABSOLUTE --
+------------------------------------
+constant ABLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011010000"; -- 0xAD LDA ABS
+constant ABLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011010001"; -- 0xAD LDA ABS
+constant ABLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011010010"; -- 0xAD LDA ABS
+constant ABLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011010011"; -- 0xAD LDA ABS
+constant ABLDX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011100000"; -- 0xAE LDX ABS
+constant ABLDX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011100001"; -- 0xAE LDX ABS
+constant ABLDX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011100010"; -- 0xAE LDX ABS
+constant ABLDX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011100011"; -- 0xAE LDX ABS
+constant ABLDY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011000000"; -- 0xAC LDY ABS
+constant ABLDY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011000001"; -- 0xAC LDY ABS
+constant ABLDY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011000010"; -- 0xAC LDY ABS
+constant ABLDY_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011000011"; -- 0xAC LDY ABS
+constant ABSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011010000"; -- 0x8D STA ABS
+constant ABSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011010001"; -- 0x8D STA ABS
+constant ABSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011010010"; -- 0x8D STA ABS
+constant ABSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011010011"; -- 0x8D STA ABS
+constant ABSTX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011100000"; -- 0x8E STX ABS
+constant ABSTX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011100001"; -- 0x8E STX ABS
+constant ABSTX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011100010"; -- 0x8E STX ABS
+constant ABSTX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011100011"; -- 0x8E STX ABS
+constant ABSTY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011000000"; -- 0x8C STY ABS
+constant ABSTY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011000001"; -- 0x8C STY ABS
+constant ABSTY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011000010"; -- 0x8C STY ABS
+constant ABSTY_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011000011"; -- 0x8C STY ABS
+constant ABSTZ_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111000000"; -- 0x9C STZ ABS
+constant ABSTZ_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111000001"; -- 0x9C STZ ABS
+constant ABSTZ_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111000010"; -- 0x9C STZ ABS
+constant ABSTZ_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111000011"; -- 0x9C STZ ABS
+constant ABADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011010000"; -- 0x6D ADC ABS
+constant ABADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011010001"; -- 0x6D ADC ABS
+constant ABADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011010010"; -- 0x6D ADC ABS
+constant ABADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011010011"; -- 0x6D ADC ABS
+constant ABADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011010100"; -- 0x6D ADC ABS
+constant ABSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011010000"; -- 0xED SBC ABS
+constant ABSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011010001"; -- 0xED SBC ABS
+constant ABSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011010010"; -- 0xED SBC ABS
+constant ABSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011010011"; -- 0xED SBC ABS
+constant ABSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011010100"; -- 0xED SBC ABS
+constant ABORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011010000"; -- 0x0D ORA ABS
+constant ABORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011010001"; -- 0x0D ORA ABS
+constant ABORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011010010"; -- 0x0D ORA ABS
+constant ABORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011010011"; -- 0x0D ORA ABS
+constant ABAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011010000"; -- 0x2D AND ABS
+constant ABAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011010001"; -- 0x2D AND ABS
+constant ABAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011010010"; -- 0x2D AND ABS
+constant ABAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011010011"; -- 0x2D AND ABS
+constant ABEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011010000"; -- 0x4D EOR ABS
+constant ABEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011010001"; -- 0x4D EOR ABS
+constant ABEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011010010"; -- 0x4D EOR ABS
+constant ABEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011010011"; -- 0x4D EOR ABS
+constant ABCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011010000"; -- 0xCD CMP ABS
+constant ABCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011010001"; -- 0xCD CMP ABS
+constant ABCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011010010"; -- 0xCD CMP ABS
+constant ABCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011010011"; -- 0xCD CMP ABS
+constant ABCPX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011000000"; -- 0xEC CPX ABS
+constant ABCPX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011000001"; -- 0xEC CPX ABS
+constant ABCPX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011000010"; -- 0xEC CPX ABS
+constant ABCPX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011000011"; -- 0xEC CPX ABS
+constant ABCPY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011000000"; -- 0xCC CPY ABS
+constant ABCPY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011000001"; -- 0xCC CPY ABS
+constant ABCPY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011000010"; -- 0xCC CPY ABS
+constant ABCPY_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011000011"; -- 0xCC CPY ABS
+constant ABJMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011000000"; -- 0x4C JMP ABS
+constant ABJMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011000001"; -- 0x4C JMP ABS
+constant ABJSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000000000"; -- 0x20 JSR ABS
+constant ABJSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000000001"; -- 0x20 JSR ABS
+constant ABJSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000000010"; -- 0x20 JSR ABS
+constant ABJSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000000011"; -- 0x20 JSR ABS
+constant ABBIT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011000000"; -- 0x2C BIT ABS
+constant ABBIT_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011000001"; -- 0x2C BIT ABS
+constant ABBIT_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011000010"; -- 0x2C BIT ABS
+constant ABBIT_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011000011"; -- 0x2C BIT ABS
+constant ABASL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100000"; -- 0x0E ASL ABS
+constant ABASL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100001"; -- 0x0E ASL ABS
+constant ABASL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100010"; -- 0x0E ASL ABS
+constant ABASL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100011"; -- 0x0E ASL ABS
+constant ABASL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100100"; -- 0x0E ASL ABS
+constant ABASL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100101"; -- 0x0E ASL ABS
+constant ABASL_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011100110"; -- 0x0E ASL ABS
+constant ABLSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100000"; -- 0x4E LSR ABS
+constant ABLSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100001"; -- 0x4E LSR ABS
+constant ABLSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100010"; -- 0x4E LSR ABS
+constant ABLSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100011"; -- 0x4E LSR ABS
+constant ABLSR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100100"; -- 0x4E LSR ABS
+constant ABLSR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100101"; -- 0x4E LSR ABS
+constant ABLSR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011100110"; -- 0x4E LSR ABS
+constant ABROL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100000"; -- 0x2E ROL ABS
+constant ABROL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100001"; -- 0x2E ROL ABS
+constant ABROL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100010"; -- 0x2E ROL ABS
+constant ABROL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100011"; -- 0x2E ROL ABS
+constant ABROL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100100"; -- 0x2E ROL ABS
+constant ABROL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100101"; -- 0x2E ROL ABS
+constant ABROL_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011100110"; -- 0x2E ROL ABS
+constant ABROR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100000"; -- 0x6E ROR ABS
+constant ABROR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100001"; -- 0x6E ROR ABS
+constant ABROR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100010"; -- 0x6E ROR ABS
+constant ABROR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100011"; -- 0x6E ROR ABS
+constant ABROR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100100"; -- 0x6E ROR ABS
+constant ABROR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100101"; -- 0x6E ROR ABS
+constant ABROR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011100110"; -- 0x6E ROR ABS
+constant ABINC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100000"; -- 0xEE INC ABS
+constant ABINC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100001"; -- 0xEE INC ABS
+constant ABINC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100010"; -- 0xEE INC ABS
+constant ABINC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100011"; -- 0xEE INC ABS
+constant ABINC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100100"; -- 0xEE INC ABS
+constant ABINC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100101"; -- 0xEE INC ABS
+constant ABINC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011100110"; -- 0xEE INC ABS
+constant ABDEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100000"; -- 0xCE DEC ABS
+constant ABDEC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100001"; -- 0xCE DEC ABS
+constant ABDEC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100010"; -- 0xCE DEC ABS
+constant ABDEC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100011"; -- 0xCE DEC ABS
+constant ABDEC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100100"; -- 0xCE DEC ABS
+constant ABDEC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100101"; -- 0xCE DEC ABS
+constant ABDEC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011100110"; -- 0xCE DEC ABS
+constant ABTSB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000000"; -- 0x0C TSB ABS
+constant ABTSB_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000001"; -- 0x0C TSB ABS
+constant ABTSB_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000010"; -- 0x0C TSB ABS
+constant ABTSB_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000011"; -- 0x0C TSB ABS
+constant ABTSB_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000100"; -- 0x0C TSB ABS
+constant ABTSB_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000101"; -- 0x0C TSB ABS
+constant ABTSB_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000110"; -- 0x0C TSB ABS
+constant ABTSB_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011000111"; -- 0x0C TSB ABS
+constant ABTRB_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000000"; -- 0x1C TRB ABS
+constant ABTRB_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000001"; -- 0x1C TRB ABS
+constant ABTRB_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000010"; -- 0x1C TRB ABS
+constant ABTRB_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000011"; -- 0x1C TRB ABS
+constant ABTRB_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000100"; -- 0x1C TRB ABS
+constant ABTRB_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000101"; -- 0x1C TRB ABS
+constant ABTRB_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000110"; -- 0x1C TRB ABS
+constant ABTRB_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111000111"; -- 0x1C TRB ABS
+
+------------------------------------
+-- ABSOLUTE,X --
+------------------------------------
+constant AXLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111010000"; -- 0xBD LDA ABS,X
+constant AXLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111010001"; -- 0xBD LDA ABS,X
+constant AXLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111010010"; -- 0xBD LDA ABS,X
+constant AXLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111010011"; -- 0xBD LDA ABS,X
+constant AXLDY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111000000"; -- 0xBC LDY ABS,X
+constant AXLDY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111000001"; -- 0xBC LDY ABS,X
+constant AXLDY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111000010"; -- 0xBC LDY ABS,X
+constant AXLDY_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111000011"; -- 0xBC LDY ABS,X
+constant AXSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111010000"; -- 0x9D STA ABS,X
+constant AXSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111010001"; -- 0x9D STA ABS,X
+constant AXSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111010010"; -- 0x9D STA ABS,X
+constant AXSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111010011"; -- 0x9D STA ABS,X
+constant AXSTZ_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111100000"; -- 0x9E STZ ABS,X
+constant AXSTZ_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111100001"; -- 0x9E STZ ABS,X
+constant AXSTZ_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111100010"; -- 0x9E STZ ABS,X
+constant AXSTZ_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111100011"; -- 0x9E STZ ABS,X
+constant AXADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111010000"; -- 0x7D ADC ABS,X
+constant AXADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111010001"; -- 0x7D ADC ABS,X
+constant AXADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111010010"; -- 0x7D ADC ABS,X
+constant AXADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111010011"; -- 0x7D ADC ABS,X
+constant AXSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111010000"; -- 0xFD SBC ABS,X
+constant AXSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111010001"; -- 0xFD SBC ABS,X
+constant AXSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111010010"; -- 0xFD SBC ABS,X
+constant AXSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111010011"; -- 0xFD SBC ABS,X
+constant AXCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111010000"; -- 0xDD CMP ABS,X
+constant AXCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111010001"; -- 0xDD CMP ABS,X
+constant AXCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111010010"; -- 0xDD CMP ABS,X
+constant AXCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111010011"; -- 0xDD CMP ABS,X
+constant AXINC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100000"; -- 0xFE INC ABS,X
+constant AXINC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100001"; -- 0xFE INC ABS,X
+constant AXINC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100010"; -- 0xFE INC ABS,X
+constant AXINC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100011"; -- 0xFE INC ABS,X
+constant AXINC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100100"; -- 0xFE INC ABS,X
+constant AXINC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100101"; -- 0xFE INC ABS,X
+constant AXINC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111100110"; -- 0xFE INC ABS,X
+constant AXDEC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100000"; -- 0xDE DEC ABS,X
+constant AXDEC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100001"; -- 0xDE DEC ABS,X
+constant AXDEC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100010"; -- 0xDE DEC ABS,X
+constant AXDEC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100011"; -- 0xDE DEC ABS,X
+constant AXDEC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100100"; -- 0xDE DEC ABS,X
+constant AXDEC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100101"; -- 0xDE DEC ABS,X
+constant AXDEC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111100110"; -- 0xDE DEC ABS,X
+constant AXASL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100000"; -- 0x1E ASL ABS,X
+constant AXASL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100001"; -- 0x1E ASL ABS,X
+constant AXASL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100010"; -- 0x1E ASL ABS,X
+constant AXASL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100011"; -- 0x1E ASL ABS,X
+constant AXASL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100100"; -- 0x1E ASL ABS,X
+constant AXASL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100101"; -- 0x1E ASL ABS,X
+constant AXASL_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111100110"; -- 0x1E ASL ABS,X
+constant AXLSR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100000"; -- 0x5E LSR ABS,X
+constant AXLSR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100001"; -- 0x5E LSR ABS,X
+constant AXLSR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100010"; -- 0x5E LSR ABS,X
+constant AXLSR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100011"; -- 0x5E LSR ABS,X
+constant AXLSR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100100"; -- 0x5E LSR ABS,X
+constant AXLSR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100101"; -- 0x5E LSR ABS,X
+constant AXLSR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111100110"; -- 0x5E LSR ABS,X
+constant AXROL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100000"; -- 0x3E ROL ABS,X
+constant AXROL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100001"; -- 0x3E ROL ABS,X
+constant AXROL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100010"; -- 0x3E ROL ABS,X
+constant AXROL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100011"; -- 0x3E ROL ABS,X
+constant AXROL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100100"; -- 0x3E ROL ABS,X
+constant AXROL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100101"; -- 0x3E ROL ABS,X
+constant AXROL_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111100110"; -- 0x3E ROL ABS,X
+constant AXROR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100000"; -- 0x7E ROR ABS,X
+constant AXROR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100001"; -- 0x7E ROR ABS,X
+constant AXROR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100010"; -- 0x7E ROR ABS,X
+constant AXROR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100011"; -- 0x7E ROR ABS,X
+constant AXROR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100100"; -- 0x7E ROR ABS,X
+constant AXROR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100101"; -- 0x7E ROR ABS,X
+constant AXROR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111100110"; -- 0x7E ROR ABS,X
+constant AXAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111010000"; -- 0x3D AND ABS,X
+constant AXAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111010001"; -- 0x3D AND ABS,X
+constant AXAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111010010"; -- 0x3D AND ABS,X
+constant AXAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111010011"; -- 0x3D AND ABS,X
+constant AXORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111010000"; -- 0x1D ORA ABS,X
+constant AXORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111010001"; -- 0x1D ORA ABS,X
+constant AXORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111010010"; -- 0x1D ORA ABS,X
+constant AXORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111010011"; -- 0x1D ORA ABS,X
+constant AXEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111010000"; -- 0x5D EOR ABS,X
+constant AXEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111010001"; -- 0x5D EOR ABS,X
+constant AXEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111010010"; -- 0x5D EOR ABS,X
+constant AXEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111010011"; -- 0x5D EOR ABS,X
+constant AXBIT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111000000"; -- 0x3C BIT ABS,X
+constant AXBIT_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111000001"; -- 0x3C BIT ABS,X
+constant AXBIT_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111000010"; -- 0x3C BIT ABS,X
+constant AXBIT_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111000011"; -- 0x3C BIT ABS,X
+
+------------------------------------
+-- ABSOLUTE,Y --
+------------------------------------
+constant AYLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110010000"; -- 0xB9 LDA ABS,Y
+constant AYLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110010001"; -- 0xB9 LDA ABS,Y
+constant AYLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110010010"; -- 0xB9 LDA ABS,Y
+constant AYLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101110010011"; -- 0xB9 LDA ABS,Y
+constant AYLDX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111100000"; -- 0xBE LDX ABS,Y
+constant AYLDX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111100001"; -- 0xBE LDX ABS,Y
+constant AYLDX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111100010"; -- 0xBE LDX ABS,Y
+constant AYLDX_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111100011"; -- 0xBE LDX ABS,Y
+constant AYSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110010000"; -- 0x99 STA ABS,Y
+constant AYSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110010001"; -- 0x99 STA ABS,Y
+constant AYSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110010010"; -- 0x99 STA ABS,Y
+constant AYSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100110010011"; -- 0x99 STA ABS,Y
+constant AYADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110010000"; -- 0x79 ADC ABS,Y
+constant AYADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110010001"; -- 0x79 ADC ABS,Y
+constant AYADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110010010"; -- 0x79 ADC ABS,Y
+constant AYADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110010011"; -- 0x79 ADC ABS,Y
+constant AYADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011110010100"; -- 0x79 ADC ABS,Y
+constant AYSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110010000"; -- 0xF9 SBC ABS,Y
+constant AYSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110010001"; -- 0xF9 SBC ABS,Y
+constant AYSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110010010"; -- 0xF9 SBC ABS,Y
+constant AYSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110010011"; -- 0xF9 SBC ABS,Y
+constant AYSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111110010100"; -- 0xF9 SBC ABS,Y
+constant AYCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110010000"; -- 0xD9 CMP ABS,Y
+constant AYCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110010001"; -- 0xD9 CMP ABS,Y
+constant AYCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110010010"; -- 0xD9 CMP ABS,Y
+constant AYCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110110010011"; -- 0xD9 CMP ABS,Y
+constant AYORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110010000"; -- 0x19 ORA ABS,Y
+constant AYORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110010001"; -- 0x19 ORA ABS,Y
+constant AYORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110010010"; -- 0x19 ORA ABS,Y
+constant AYORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000110010011"; -- 0x19 ORA ABS,Y
+constant AYAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110010000"; -- 0x39 AND ABS,Y
+constant AYAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110010001"; -- 0x39 AND ABS,Y
+constant AYAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110010010"; -- 0x39 AND ABS,Y
+constant AYAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001110010011"; -- 0x39 AND ABS,Y
+constant AYEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110010000"; -- 0x59 EOR ABS,Y
+constant AYEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110010001"; -- 0x59 EOR ABS,Y
+constant AYEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110010010"; -- 0x59 EOR ABS,Y
+constant AYEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010110010011"; -- 0x59 EOR ABS,Y
+
+------------------------------------------------
+-- ABSOLUTE LONG (JUMP...) --
+------------------------------------------------
+constant ABJML_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111000000"; -- 0x5C JML ABS
+constant ABJML_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111000001"; -- 0x5C JML ABS
+constant ABJML_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111000010"; -- 0x5C JML ABS
+constant ABJSL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100000"; -- 0x22 JSL ABS
+constant ABJSL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100001"; -- 0x22 JSL ABS
+constant ABJSL_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100010"; -- 0x22 JSL ABS
+constant ABJSL_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100011"; -- 0x22 JSL ABS
+constant ABJSL_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100100"; -- 0x22 JSL ABS
+constant ABJSL_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000100101"; -- 0x22 JSL ABS
+
+------------------------------------
+-- RELATIVE --
+------------------------------------
+constant BRA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000000000"; -- 0x80 BRA
+constant BCC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100000000"; -- 0x90 BCC
+constant BCS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100000000"; -- 0xB0 BCS
+constant BEQ_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100000000"; -- 0xF0 BEQ
+constant BNE_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100000000"; -- 0xD0 BNE
+constant BPL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100000000"; -- 0x10 BPL
+constant BMI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100000000"; -- 0x30 BMI
+constant BVC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100000000"; -- 0x50 BVC
+constant BVS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100000000"; -- 0x70 BVS
+
+---------------------------------------
+-- RELATIVE LONG --
+---------------------------------------
+constant BRL_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000100000"; -- 0x82 BRL
+constant BRL_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000100001"; -- 0x82 BRL
+
+-------------------------------
+-- STACK --
+-------------------------------
+constant PEA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101000000"; -- 0xF4 PEA
+constant PEA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101000001"; -- 0xF4 PEA
+constant PEA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101000010"; -- 0xF4 PEA
+constant PEA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101000011"; -- 0xF4 PEA
+constant PEI_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101000000"; -- 0xD4 PEI
+constant PEI_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101000001"; -- 0xD4 PEI
+constant PEI_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101000010"; -- 0xD4 PEI
+constant PEI_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101000011"; -- 0xD4 PEI
+constant PEI_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101000100"; -- 0xD4 PEI
+constant PER_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000100000"; -- 0x62 PER
+constant PER_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000100001"; -- 0x62 PER
+constant PER_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000100010"; -- 0x62 PER
+constant PER_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000100011"; -- 0x62 PER
+constant PER_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000100100"; -- 0x62 PER
+
+----------------------------------
+-- DIRECT,Y --
+----------------------------------
+constant DYLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110000"; -- 0xB7 LDA [DIR],Y
+constant DYLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110001"; -- 0xB7 LDA [DIR],Y
+constant DYLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110010"; -- 0xB7 LDA [IND],Y
+constant DYLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110011"; -- 0xB7 LDA [DIR],Y
+constant DYLDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110100"; -- 0xB7 LDA [DIR],Y
+constant DYLDA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110101"; -- 0xB7 LDA [DIR],Y
+constant DYLDA_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101101110110"; -- 0xB7 LDA [DIR],Y
+constant DYSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110000"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110001"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110010"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110011"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110100"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110101"; -- 0x97 STA [DIR],Y
+constant DYSTA_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100101110110"; -- 0x97 STA [DIR],Y
+constant DYADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110000"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110001"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110010"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110011"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110100"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110101"; -- 0x77 ADC [DIR],Y
+constant DYADC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011101110110"; -- 0x77 ADC [DIR],Y
+constant DYSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110000"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110001"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110010"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110011"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110100"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110101"; -- 0xF7 SBC [DIR],Y
+constant DYSBC_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111101110110"; -- 0xF7 SBC [DIR],Y
+constant DYCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110000"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110001"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110010"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110011"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110100"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110101"; -- 0xD7 CMP [DIR],Y
+constant DYCMP_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110101110110"; -- 0xD7 CMP [DIR],Y
+constant DYAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110000"; -- 0x37 AND [DIR],Y
+constant DYAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110001"; -- 0x37 AND [DIR],Y
+constant DYAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110010"; -- 0x37 AND [DIR],Y
+constant DYAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110011"; -- 0x37 AND [DIR],Y
+constant DYAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110100"; -- 0x37 AND [DIR],Y
+constant DYAND_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110101"; -- 0x37 AND [DIR],Y
+constant DYAND_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001101110110"; -- 0x37 AND [DIR],Y
+constant DYORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110000"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110001"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110010"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110011"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110100"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110101"; -- 0x17 ORA [DIR],Y
+constant DYORA_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000101110110"; -- 0x17 ORA [DIR],Y
+constant DYEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110000"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110001"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110010"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110011"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110100"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110101"; -- 0x57 EOR [DIR],Y
+constant DYEOR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101110110"; -- 0x57 EOR [DIR],Y
+
+--------------------------------
+-- DIRECT --
+--------------------------------
+constant DILDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110000"; -- 0xA7 LDA [DIR]
+constant DILDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110001"; -- 0xA7 LDA [DIR]
+constant DILDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110010"; -- 0xA7 LDA [IND]
+constant DILDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110011"; -- 0xA7 LDA [DIR]
+constant DILDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110100"; -- 0xA7 LDA [DIR]
+constant DILDA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101001110101"; -- 0xA7 LDA [DIR]
+constant DISTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110000"; -- 0x87 STA [DIR]
+constant DISTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110001"; -- 0x87 STA [DIR]
+constant DISTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110010"; -- 0x87 STA [DIR]
+constant DISTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110011"; -- 0x87 STA [DIR]
+constant DISTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110100"; -- 0x87 STA [DIR]
+constant DISTA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100001110101"; -- 0x87 STA [DIR]
+constant DIADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110000"; -- 0x67 ADC [DIR]
+constant DIADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110001"; -- 0x67 ADC [DIR]
+constant DIADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110010"; -- 0x67 ADC [DIR]
+constant DIADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110011"; -- 0x67 ADC [DIR]
+constant DIADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110100"; -- 0x67 ADC [DIR]
+constant DIADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011001110101"; -- 0x67 ADC [DIR]
+constant DISBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110000"; -- 0xE7 SBC [DIR]
+constant DISBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110001"; -- 0xE7 SBC [DIR]
+constant DISBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110010"; -- 0xE7 SBC [DIR]
+constant DISBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110011"; -- 0xE7 SBC [DIR]
+constant DISBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110100"; -- 0xE7 SBC [DIR]
+constant DISBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111001110101"; -- 0xE7 SBC [DIR]
+constant DICMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110000"; -- 0xC7 CMP [DIR]
+constant DICMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110001"; -- 0xC7 CMP [DIR]
+constant DICMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110010"; -- 0xC7 CMP [DIR]
+constant DICMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110011"; -- 0xC7 CMP [DIR]
+constant DICMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110100"; -- 0xC7 CMP [DIR]
+constant DICMP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110001110101"; -- 0xC7 CMP [DIR]
+constant DIAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110000"; -- 0x27 AND [DIR]
+constant DIAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110001"; -- 0x27 AND [DIR]
+constant DIAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110010"; -- 0x27 AND [DIR]
+constant DIAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110011"; -- 0x27 AND [DIR]
+constant DIAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110100"; -- 0x27 AND [DIR]
+constant DIAND_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001001110101"; -- 0x27 AND [DIR]
+constant DIORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110000"; -- 0x07 ORA [DIR]
+constant DIORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110001"; -- 0x07 ORA [DIR]
+constant DIORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110010"; -- 0x07 ORA [DIR]
+constant DIORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110011"; -- 0x07 ORA [DIR]
+constant DIORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110100"; -- 0x07 ORA [DIR]
+constant DIORA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000001110101"; -- 0x07 ORA [DIR]
+constant DIEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110000"; -- 0x47 EOR [DIR]
+constant DIEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110001"; -- 0x47 EOR [DIR]
+constant DIEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110010"; -- 0x47 EOR [DIR]
+constant DIEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110011"; -- 0x47 EOR [DIR]
+constant DIEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110100"; -- 0x47 EOR [DIR]
+constant DIEOR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001110101"; -- 0x47 EOR [DIR]
+
+----------------------------------------
+-- ABSOLUTE LONG --
+----------------------------------------
+constant ALLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011110000"; -- 0xAF LDA ABS_LONG
+constant ALLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011110001"; -- 0xAF LDA ABS_LONG
+constant ALLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011110010"; -- 0xAF LDA ABS_LONG
+constant ALLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011110011"; -- 0xAF LDA ABS_LONG
+constant ALLDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101011110100"; -- 0xAF LDA ABS_LONG
+constant ALSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011110000"; -- 0x8F STA ABS_LONG
+constant ALSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011110001"; -- 0x8F STA ABS_LONG
+constant ALSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011110010"; -- 0x8F STA ABS_LONG
+constant ALSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011110011"; -- 0x8F STA ABS_LONG
+constant ALSTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100011110100"; -- 0x8F STA ABS_LONG
+constant ALADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110000"; -- 0x6F ADC ABS_LONG
+constant ALADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110001"; -- 0x6F ADC ABS_LONG
+constant ALADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110010"; -- 0x6F ADC ABS_LONG
+constant ALADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110011"; -- 0x6F ADC ABS_LONG
+constant ALADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110100"; -- 0x6F ADC ABS_LONG
+constant ALADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011011110101"; -- 0x6F ADC ABS_LONG
+constant ALSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110000"; -- 0xEF SBC ABS_LONG
+constant ALSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110001"; -- 0xEF SBC ABS_LONG
+constant ALSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110010"; -- 0xEF SBC ABS_LONG
+constant ALSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110011"; -- 0xEF SBC ABS_LONG
+constant ALSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110100"; -- 0xEF SBC ABS_LONG
+constant ALSBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111011110101"; -- 0xEF SBC ABS_LONG
+constant ALORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011110000"; -- 0x0F ORA ABS_LONG
+constant ALORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011110001"; -- 0x0F ORA ABS_LONG
+constant ALORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011110010"; -- 0x0F ORA ABS_LONG
+constant ALORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011110011"; -- 0x0F ORA ABS_LONG
+constant ALORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000011110100"; -- 0x0F ORA ABS_LONG
+constant ALAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011110000"; -- 0x2F AND ABS_LONG
+constant ALAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011110001"; -- 0x2F AND ABS_LONG
+constant ALAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011110010"; -- 0x2F AND ABS_LONG
+constant ALAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011110011"; -- 0x2F AND ABS_LONG
+constant ALAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001011110100"; -- 0x2F AND ABS_LONG
+constant ALEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011110000"; -- 0x4F EOR ABS_LONG
+constant ALEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011110001"; -- 0x4F EOR ABS_LONG
+constant ALEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011110010"; -- 0x4F EOR ABS_LONG
+constant ALEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011110011"; -- 0x4F EOR ABS_LONG
+constant ALEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010011110100"; -- 0x4F EOR ABS_LONG
+constant ALCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011110000"; -- 0xCF CMP ABS_LONG
+constant ALCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011110001"; -- 0xCF CMP ABS_LONG
+constant ALCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011110010"; -- 0xCF CMP ABS_LONG
+constant ALCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011110011"; -- 0xCF CMP ABS_LONG
+constant ALCMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110011110100"; -- 0xCF CMP ABS_LONG
+
+-----------------------------------------
+-- ABSOLUTE LONG,X --
+-----------------------------------------
+constant AILDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110000"; -- 0xBF LDA ABS_LONG,X
+constant AILDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110001"; -- 0xBF LDA ABS_LONG,X
+constant AILDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110010"; -- 0xBF LDA ABS_LONG,X
+constant AILDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110011"; -- 0xBF LDA ABS_LONG,X
+constant AILDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110100"; -- 0xBF LDA ABS_LONG,X
+constant AILDA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101111110101"; -- 0xBF LDA ABS_LONG,X
+constant AISTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110000"; -- 0x9F STA ABS_LONG,X
+constant AISTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110001"; -- 0x9F STA ABS_LONG,X
+constant AISTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110010"; -- 0x9F STA ABS_LONG,X
+constant AISTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110011"; -- 0x9F STA ABS_LONG,X
+constant AISTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110100"; -- 0x9F STA ABS_LONG,X
+constant AISTA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100111110101"; -- 0x9F STA ABS_LONG,X
+constant AIADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110000"; -- 0x7F ADC ABS_LONG,X
+constant AIADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110001"; -- 0x7F ADC ABS_LONG,X
+constant AIADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110010"; -- 0x7F ADC ABS_LONG,X
+constant AIADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110011"; -- 0x7F ADC ABS_LONG,X
+constant AIADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110100"; -- 0x7F ADC ABS_LONG,X
+constant AIADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011111110101"; -- 0x7F ADC ABS_LONG,X
+constant AISBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110000"; -- 0xFF SBC ABS_LONG,X
+constant AISBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110001"; -- 0xFF SBC ABS_LONG,X
+constant AISBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110010"; -- 0xFF SBC ABS_LONG,X
+constant AISBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110011"; -- 0xFF SBC ABS_LONG,X
+constant AISBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110100"; -- 0xFF SBC ABS_LONG,X
+constant AISBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111111110101"; -- 0xFF SBC ABS_LONG,X
+constant AICMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110000"; -- 0xDF CMP ABS_LONG,X
+constant AICMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110001"; -- 0xDF CMP ABS_LONG,X
+constant AICMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110010"; -- 0xDF CMP ABS_LONG,X
+constant AICMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110011"; -- 0xDF CMP ABS_LONG,X
+constant AICMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110100"; -- 0xDF CMP ABS_LONG,X
+constant AICMP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110111110101"; -- 0xDF CMP ABS_LONG,X
+constant AIAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110000"; -- 0x3F AND ABS_LONG,X
+constant AIAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110001"; -- 0x3F AND ABS_LONG,X
+constant AIAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110010"; -- 0x3F AND ABS_LONG,X
+constant AIAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110011"; -- 0x3F AND ABS_LONG,X
+constant AIAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110100"; -- 0x3F AND ABS_LONG,X
+constant AIAND_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001111110101"; -- 0x3F AND ABS_LONG,X
+constant AIORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110000"; -- 0x1F ORA ABS_LONG,X
+constant AIORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110001"; -- 0x1F ORA ABS_LONG,X
+constant AIORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110010"; -- 0x1F ORA ABS_LONG,X
+constant AIORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110011"; -- 0x1F ORA ABS_LONG,X
+constant AIORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110100"; -- 0x1F ORA ABS_LONG,X
+constant AIORA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000111110101"; -- 0x1F ORA ABS_LONG,X
+constant AIEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110000"; -- 0x5F EOR ABS_LONG,X
+constant AIEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110001"; -- 0x5F EOR ABS_LONG,X
+constant AIEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110010"; -- 0x5F EOR ABS_LONG,X
+constant AIEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110011"; -- 0x5F EOR ABS_LONG,X
+constant AIEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110100"; -- 0x5F EOR ABS_LONG,X
+constant AIEOR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010111110101"; -- 0x5F EOR ABS_LONG,X
+
+-----------------------------------------
+-- STACK RELATIVE --
+-----------------------------------------
+constant SRLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000110000"; -- 0xA3 LDA $XX,S
+constant SRLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000110001"; -- 0xA3 LDA $XX,S
+constant SRLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101000110010"; -- 0xA3 LDA $XX,S
+constant SRSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000110000"; -- 0x83 STA $XX,S
+constant SRSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000110001"; -- 0x83 STA $XX,S
+constant SRSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100000110010"; -- 0x83 STA $XX,S
+constant SRADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000110000"; -- 0x63 ADC $XX,S
+constant SRADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000110001"; -- 0x63 ADC $XX,S
+constant SRADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011000110010"; -- 0x63 ADC $XX,S
+constant SRSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000110000"; -- 0xE3 SBC $XX,S
+constant SRSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000110001"; -- 0xE3 SBC $XX,S
+constant SRSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111000110010"; -- 0xE3 SBC $XX,S
+constant SRCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000110000"; -- 0xC3 CMP $XX,S
+constant SRCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000110001"; -- 0xC3 CMP $XX,S
+constant SRCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110000110010"; -- 0xC3 CMP $XX,S
+constant SRAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000110000"; -- 0x23 AND $XX,S
+constant SRAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000110001"; -- 0x23 AND $XX,S
+constant SRAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001000110010"; -- 0x23 AND $XX,S
+constant SRORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000110000"; -- 0x03 ORA $XX,S
+constant SRORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000110001"; -- 0x03 ORA $XX,S
+constant SRORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000000110010"; -- 0x03 ORA $XX,S
+constant SREOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000110000"; -- 0x43 EOR $XX,S
+constant SREOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000110001"; -- 0x43 EOR $XX,S
+constant SREOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010000110010"; -- 0x43 EOR $XX,S
+
+--------------------------------------------------
+-- STACK RELATIVE INDEXED Y --
+--------------------------------------------------
+constant SYLDA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110000"; -- 0xB3 LDA ($XX,S),Y
+constant SYLDA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110001"; -- 0xB3 LDA ($XX,S),Y
+constant SYLDA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110010"; -- 0xB3 LDA ($XX,S),Y
+constant SYLDA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110011"; -- 0xB3 LDA ($XX,S),Y
+constant SYLDA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110100"; -- 0xB3 LDA ($XX,S),Y
+constant SYLDA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0101100110101"; -- 0xB3 LDA ($XX,S),Y
+constant SYSTA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110000"; -- 0x93 STA ($XX,S),Y
+constant SYSTA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110001"; -- 0x93 STA ($XX,S),Y
+constant SYSTA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110010"; -- 0x93 STA ($XX,S),Y
+constant SYSTA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110011"; -- 0x93 STA ($XX,S),Y
+constant SYSTA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110100"; -- 0x93 STA ($XX,S),Y
+constant SYSTA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0100100110101"; -- 0x93 STA ($XX,S),Y
+constant SYADC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110000"; -- 0x73 ADC ($XX,S),Y
+constant SYADC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110001"; -- 0x73 ADC ($XX,S),Y
+constant SYADC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110010"; -- 0x73 ADC ($XX,S),Y
+constant SYADC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110011"; -- 0x73 ADC ($XX,S),Y
+constant SYADC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110100"; -- 0x73 ADC ($XX,S),Y
+constant SYADC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0011100110101"; -- 0x73 ADC ($XX,S),Y
+constant SYSBC_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110000"; -- 0xF3 SBC ($XX,S),Y
+constant SYSBC_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110001"; -- 0xF3 SBC ($XX,S),Y
+constant SYSBC_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110010"; -- 0xF3 SBC ($XX,S),Y
+constant SYSBC_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110011"; -- 0xF3 SBC ($XX,S),Y
+constant SYSBC_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110100"; -- 0xF3 SBC ($XX,S),Y
+constant SYSBC_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0111100110101"; -- 0xF3 SBC ($XX,S),Y
+constant SYCMP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110000"; -- 0xD3 CMP ($XX,S),Y
+constant SYCMP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110001"; -- 0xD3 CMP ($XX,S),Y
+constant SYCMP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110010"; -- 0xD3 CMP ($XX,S),Y
+constant SYCMP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110011"; -- 0xD3 CMP ($XX,S),Y
+constant SYCMP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110100"; -- 0xD3 CMP ($XX,S),Y
+constant SYCMP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0110100110101"; -- 0xD3 CMP ($XX,S),Y
+constant SYAND_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110000"; -- 0x33 AND ($XX,S),Y
+constant SYAND_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110001"; -- 0x33 AND ($XX,S),Y
+constant SYAND_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110010"; -- 0x33 AND ($XX,S),Y
+constant SYAND_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110011"; -- 0x33 AND ($XX,S),Y
+constant SYAND_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110100"; -- 0x33 AND ($XX,S),Y
+constant SYAND_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0001100110101"; -- 0x33 AND ($XX,S),Y
+constant SYORA_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110000"; -- 0x13 ORA ($XX,S),Y
+constant SYORA_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110001"; -- 0x13 ORA ($XX,S),Y
+constant SYORA_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110010"; -- 0x13 ORA ($XX,S),Y
+constant SYORA_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110011"; -- 0x13 ORA ($XX,S),Y
+constant SYORA_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110100"; -- 0x13 ORA ($XX,S),Y
+constant SYORA_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0000100110101"; -- 0x13 ORA ($XX,S),Y
+constant SYEOR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110000"; -- 0x53 EOR ($XX,S),Y
+constant SYEOR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110001"; -- 0x53 EOR ($XX,S),Y
+constant SYEOR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110010"; -- 0x53 EOR ($XX,S),Y
+constant SYEOR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110011"; -- 0x53 EOR ($XX,S),Y
+constant SYEOR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110100"; -- 0x53 EOR ($XX,S),Y
+constant SYEOR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010100110101"; -- 0x53 EOR ($XX,S),Y
+
+------------------------------------
+-- MOVE BLOCK --
+------------------------------------
+constant MBMVN_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000000"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000001"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000010"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000011"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000100"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000101"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000110"; -- 0x54 MVN $xx,$xx
+constant MBMVN_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010101000111"; -- 0x54 MVN $xx,$xx
+
+constant MBMVP_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000000"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000001"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000010"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000011"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000100"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000101"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000110"; -- 0x44 MVP $xx,$xx
+constant MBMVP_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "0010001000111"; -- 0x44 MVP $xx,$xx
+
+-------------------------------------------------
+-- NEW OPCODES (WDM OPCODE) --
+-------------------------------------------------
+-- IMPLIED
+constant PHR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110000"; -- 0x8B PHR AXY->S (two byte instruction)
+constant PHR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110001"; -- 0x8B PHR AXY->S (two byte instruction)
+constant PHR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110010"; -- 0x8B PHR AXY->S (two byte instruction)
+constant PHR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110011"; -- 0x8B PHR AXY->S (two byte instruction)
+constant PHR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110100"; -- 0x8B PHR AXY->S (two byte instruction)
+constant PHR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100010110101"; -- 0x8B PHR AXY->S (two byte instruction)
+
+constant PLR_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110000"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110001"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110010"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110011"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110100"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110101"; -- 0xAB PLR S->YXA (two byte instruction)
+constant PLR_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1101010110110"; -- 0xAB PLR S->YXA (two byte instruction)
+
+constant SAV_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000000"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000001"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000010"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000011"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000100"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000101"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000110"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100000111"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP8: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100001000"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+constant SAV_OP9: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100001001"; -- 0x90 SAV AXYBDP->S (two byte instruction)
+
+constant RST_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010000"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010001"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010010"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010011"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP4: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010100"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP5: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010101"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP6: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010110"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP7: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100010111"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP8: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100011000"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP9: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100011001"; -- 0x91 RST S->PDBYXA (two byte instruction)
+constant RST_OP10: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100100011010"; -- 0x91 RST S->PDBYXA (two byte instruction)
+
+-- MULTIPLY UNSIGNED 16X16->32 BIT
+constant MPU_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011100000"; -- 0x8E MPU multiply A*X (two byte instruction)
+constant MPU_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011100001"; -- 0x8E MPU multiply A*X (two byte instruction)
+constant MPU_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011100010"; -- 0x8E MPU multiply A*X (two byte instruction)
+constant MPU_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011100011"; -- 0x8E MPU multiply A*X (two byte instruction)
+
+-- MULTIPLY SIGNED 16X16->32 BIT
+constant MPS_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011110000"; -- 0x8F MPS multiply A*X (two byte instruction)
+constant MPS_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011110001"; -- 0x8F MPS multiply A*X (two byte instruction)
+constant MPS_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011110010"; -- 0x8F MPS multiply A*X (two byte instruction)
+constant MPS_OP3: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1100011110011"; -- 0x8F MPS multiply A*X (two byte instruction)
+
+-- REGISTERS EXCHANGE
+constant XYX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1111010110000"; -- 0xEB EXCHANGE X <-> Y (two byte instruction)
+constant XYX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1111010110001"; -- 0xEB EXCHANGE X <-> Y (two byte instruction)
+constant XYX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1111010110010"; -- 0xEB EXCHANGE X <-> Y (two byte instruction)
+constant XAX_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1000010110000"; -- 0x0B EXCHANGE A <-> X (two byte instruction)
+constant XAX_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1000010110001"; -- 0x0B EXCHANGE A <-> X (two byte instruction)
+constant XAX_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1000010110010"; -- 0x0B EXCHANGE A <-> X (two byte instruction)
+constant XAY_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1001010110000"; -- 0x2B EXCHANGE A <-> Y (two byte instruction)
+constant XAY_OP1: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1001010110001"; -- 0x2B EXCHANGE A <-> Y (two byte instruction)
+constant XAY_OP2: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1001010110010"; -- 0x2B EXCHANGE A <-> Y (two byte instruction)
+
+-- MISC
+constant EXT_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1111011000000"; -- 0xEC EXTEND SIGN OF A TO B (two byte instruction)
+constant NEG_OP0: STD_LOGIC_VECTOR(MC_ADDR_LENGTH downto 0) := "1111011010000"; -- 0xED NEGATE A (two byte instruction)
+
+
+-- ALU microcode
+constant NOP_A: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- no operation
+constant SUM_A: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- sum with carry
+constant SUB_A: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- subtract with borrow
+constant AND_A: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- and
+constant OR_A: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- or
+constant XOR_A: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- xor
+constant INC_A: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- increment by 1
+constant DEC_A: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- decrement by 1
+constant SHL_A: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- shift left
+constant SHR_A: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- shift right
+constant ROL_A: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- rotation left
+constant ROR_A: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- rotation right
+constant SWC_A: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- sum without carry (used for indexing and branches)
+constant SWC_N: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- subtract without borrow (used only by branches with negative offset)
+constant BIT_A: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- bit test (used by BIT opcode)
+constant DAA_A: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- decimal adjustement for BCD sum
+constant DAS_A: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- decimal adjustement for BCD subtract
+constant CMP_A: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- compare
+constant TSB_A: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- test and set bit
+constant TRB_A: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- test and reset bit
+constant EXT_A: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- extend sign
+constant NEG_A: STD_LOGIC_VECTOR(4 downto 0) := "10100"; -- negate
+
+-- PCR microcode
+constant NOP_PC: STD_LOGIC_VECTOR(3 downto 0) := "0000"; -- PC no operation
+constant LSB_PC: STD_LOGIC_VECTOR(3 downto 0) := "0001"; -- PC load lsb
+constant MSB_PC: STD_LOGIC_VECTOR(3 downto 0) := "0010"; -- PC load msb
+constant INC_PC: STD_LOGIC_VECTOR(3 downto 0) := "0011"; -- PC increment by 1
+constant LOD_PC: STD_LOGIC_VECTOR(3 downto 0) := "0100"; -- PC load lsb\msb (used by JMP\JSR instructions)
+constant LML_PC: STD_LOGIC_VECTOR(3 downto 0) := "0101"; -- PC load lsb\msb from oper register (used for JML\JSL instructions)
+constant IN2_PC: STD_LOGIC_VECTOR(3 downto 0) := "0110"; -- PC = PC +2 (BRK opcode)
+constant DE3_PC: STD_LOGIC_VECTOR(3 downto 0) := "0111"; -- PC = PC -3 (MVN/MVP opcodes)
+constant BRA_PC: STD_LOGIC_VECTOR(3 downto 0) := "1000"; -- PC branch
+constant BRL_PC: STD_LOGIC_VECTOR(3 downto 0) := "1001"; -- PC branch long
+
+-- MPR (memory data pointer) microcode
+constant NOP_M: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- no operation
+constant LSB_M: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- load lsb
+constant MSB_M: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- load msb
+constant INC_M: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- increment
+constant DEC_M: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- decrement
+constant VEC_M: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- load vector
+constant ZPL_M: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- load ZEROPAGE
+constant ALL_M: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- load all 16 bit register
+constant ICC_M: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- increment MSB with carry
+constant DOX_M: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- add D + offset + X
+constant DOY_M: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- add D + offset + Y
+constant AOS_M: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- add S + offset
+constant ABX_M: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- add opr+X
+constant ABY_M: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- add opr+Y
+constant ADX_M: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- add X
+constant ADY_M: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- add Y
+constant MHB_M: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- load high byte
+constant AOY_M: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- add opr+Y and concatenates SBR
+
+-- address multiplexer microcode
+constant ADPC: STD_LOGIC_VECTOR(2 downto 0) := "000"; -- select PC
+constant ADMP: STD_LOGIC_VECTOR(2 downto 0) := "001"; -- select MP
+constant ADSP: STD_LOGIC_VECTOR(2 downto 0) := "010"; -- select SP
+constant ADDI: STD_LOGIC_VECTOR(2 downto 0) := "011"; -- select Direct
+constant ADXR: STD_LOGIC_VECTOR(2 downto 0) := "100"; -- select X register
+constant ADYR: STD_LOGIC_VECTOR(2 downto 0) := "101"; -- select Y register
+constant ADNP: STD_LOGIC_VECTOR(2 downto 0) := "000"; -- no operation (PC)
+
+-- PR microcode
+constant NOP_P: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- PR no operation
+constant PLD_P: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- PR load
+constant FLD_P: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- NV load
+constant FLC_P: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- NZC load
+constant FLV_P: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- NVZC load
+constant SEC_P: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- 1 => C
+constant CLC_P: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- 0 => C
+constant SEI_P: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- 1 => I
+constant CLI_P: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- 0 => I
+constant SED_P: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- 1 => D
+constant CLD_P: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- 0 => D
+constant CLV_P: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- 0 => V
+constant AUC_P: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- auc => ACR
+constant HAC_P: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- hold ACR
+constant SID_P: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- 1 => I/D
+constant LDZ_P: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- Z load
+constant XCE_P: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- E => C; C => E
+constant SEP_P: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- P = P OR din
+constant REP_P: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- P = P AND not din
+constant WDM_P: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- 1 => op_exp;
+constant WDC_P: STD_LOGIC_VECTOR(4 downto 0) := "10100"; -- 0 => op_exp;
+constant FLW_P: STD_LOGIC_VECTOR(4 downto 0) := "10101"; -- NZ load, 0 -> op_exp
+constant MUF_P: STD_LOGIC_VECTOR(4 downto 0) := "10110"; -- Z load from unsigned multplier
+constant MSF_P: STD_LOGIC_VECTOR(4 downto 0) := "10111"; -- NZ load from unsigned multplier
+
+-- register operation microcode REGOP (decreg)
+constant NOP_R: STD_LOGIC_VECTOR(5 downto 0) := "000000"; -- no operation
+constant ALL_R: STD_LOGIC_VECTOR(5 downto 0) := "000001"; -- register A load lsb
+constant ALM_R: STD_LOGIC_VECTOR(5 downto 0) := "000010"; -- register A load msb
+constant A16_R: STD_LOGIC_VECTOR(5 downto 0) := "000011"; -- register A load msb & lsb
+constant XLL_R: STD_LOGIC_VECTOR(5 downto 0) := "000100"; -- register X load lsb
+constant XLM_R: STD_LOGIC_VECTOR(5 downto 0) := "000101"; -- register X load msb
+constant X16_R: STD_LOGIC_VECTOR(5 downto 0) := "000110"; -- register X load msb & lsb
+constant YLL_R: STD_LOGIC_VECTOR(5 downto 0) := "000111"; -- register Y load lsb
+constant YLM_R: STD_LOGIC_VECTOR(5 downto 0) := "001000"; -- register Y load msb
+constant Y16_R: STD_LOGIC_VECTOR(5 downto 0) := "001001"; -- register Y load msb & lsb
+constant DLL_R: STD_LOGIC_VECTOR(5 downto 0) := "001010"; -- register D load lsb
+constant DLM_R: STD_LOGIC_VECTOR(5 downto 0) := "001011"; -- register D load msb
+constant D16_R: STD_LOGIC_VECTOR(5 downto 0) := "001100"; -- register D load msb & lsb
+constant OLD_R: STD_LOGIC_VECTOR(5 downto 0) := "001101"; -- register O load lsb
+constant OMD_R: STD_LOGIC_VECTOR(5 downto 0) := "001110"; -- register O load msb
+constant SLD_R: STD_LOGIC_VECTOR(5 downto 0) := "001111"; -- register S load lsb
+constant SLM_R: STD_LOGIC_VECTOR(5 downto 0) := "010000"; -- register S load msb
+constant S16_R: STD_LOGIC_VECTOR(5 downto 0) := "010001"; -- register S load msb & lsb
+constant SUP_R: STD_LOGIC_VECTOR(5 downto 0) := "010010"; -- register S increment by 1
+constant SDW_R: STD_LOGIC_VECTOR(5 downto 0) := "010011"; -- register S decrement by 1
+constant SAU_R: STD_LOGIC_VECTOR(5 downto 0) := "010100"; -- register A (lsb) load/register S increment by 1
+constant SXU_R: STD_LOGIC_VECTOR(5 downto 0) := "010101"; -- register X (lsb) load/register S increment by 1
+constant SXM_R: STD_LOGIC_VECTOR(5 downto 0) := "010110"; -- register X (msb) load/register S increment by 1
+constant SYU_R: STD_LOGIC_VECTOR(5 downto 0) := "010111"; -- register Y (lsb) load/register S increment by 1
+constant SYM_R: STD_LOGIC_VECTOR(5 downto 0) := "011000"; -- register Y (msb) load/register S increment by 1
+constant KLD_R: STD_LOGIC_VECTOR(5 downto 0) := "011001"; -- register K (PBR) load
+constant BLD_R: STD_LOGIC_VECTOR(5 downto 0) := "011010"; -- register B (DBR) load
+constant KCL_R: STD_LOGIC_VECTOR(5 downto 0) := "011011"; -- register K (PBR) clear and register S decrement by 1
+constant BCL_R: STD_LOGIC_VECTOR(5 downto 0) := "011100"; -- register B (DBR) clear
+constant SKC_R: STD_LOGIC_VECTOR(5 downto 0) := "011101"; -- register B (DBR) clear and register S decrement by 1
+constant DEA_R: STD_LOGIC_VECTOR(5 downto 0) := "011110"; -- register A decrement (MVN/MVP)
+constant O16_R: STD_LOGIC_VECTOR(5 downto 0) := "011111"; -- register O load msb & lsb
+constant OSU_R: STD_LOGIC_VECTOR(5 downto 0) := "100000"; -- register O load lsb/register S increment by 1
+constant MVN_R: STD_LOGIC_VECTOR(5 downto 0) := "100001"; -- register XY increment by 1, A decremented by 1
+constant MVP_R: STD_LOGIC_VECTOR(5 downto 0) := "100010"; -- register XY decrement by 1, A decremented by 1
+constant MUL_R: STD_LOGIC_VECTOR(5 downto 0) := "100011"; -- register A/B load multiplication lsb result, register X load multiplication msb result
+constant MUI_R: STD_LOGIC_VECTOR(5 downto 0) := "100100"; -- multiplication init
+constant MUS_R: STD_LOGIC_VECTOR(5 downto 0) := "100101"; -- multiplication (unsigned) start
+constant MSS_R: STD_LOGIC_VECTOR(5 downto 0) := "100110"; -- multiplication (signed) start
+constant WAI_R: STD_LOGIC_VECTOR(5 downto 0) := "100111"; -- WAI set flipflop
+constant STP_R: STD_LOGIC_VECTOR(5 downto 0) := "101000"; -- STP set flipflop
+constant BLS_R: STD_LOGIC_VECTOR(5 downto 0) := "101001"; -- register B (DBR) load/register S incremented by 1
+constant DLS_R: STD_LOGIC_VECTOR(5 downto 0) := "101010"; -- register D load msb & lsb/register S incremented by 1
+
+-- register multiplexer microcode RSEL (ALU operand #1)
+constant EXT_O: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- external data bus
+constant ARD_O: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- register A msb & lsb select
+constant ARM_O: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- register A msb select (also returns A swapped)
+constant XRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- register X msb & lsb select
+constant XRM_O: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- register X msb select
+constant YRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- register Y msb & lsb select
+constant YRM_O: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- register Y msb select
+constant SRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- register S lsb select
+constant PRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- register P select
+constant PLR_O: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- register PCL select
+constant PHR_O: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- register PCH select
+constant ORD_O: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- register O msb & lsb select
+constant Z00_O: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- select (all zero output)
+constant DRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- register D msb & lsb select
+constant DRM_O: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- register D msb select
+constant KRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- register K PBR
+constant BRD_O: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- register B PBR
+constant EXM_O: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- external data bus on MSB, O on lsb
+constant OMD_O: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- register O msb select
+constant PCR_O: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- register PC (16 bit) select
+
+-- data multiplexer microcode DMUX (ALU operand #2)
+constant NOP_D: STD_LOGIC_VECTOR(2 downto 0) := "000";
+constant ORD_D: STD_LOGIC_VECTOR(2 downto 0) := "001";
+constant EXT_D: STD_LOGIC_VECTOR(2 downto 0) := "010";
+constant EXM_D: STD_LOGIC_VECTOR(2 downto 0) := "011";
+constant BCD_D: STD_LOGIC_VECTOR(2 downto 0) := "100";
+
+-- read/write control
+constant RDE: STD_LOGIC_VECTOR(1 downto 0) := "11"; -- data bus read
+constant WRE: STD_LOGIC_VECTOR(1 downto 0) := "10"; -- data bus write (combinatorial mode)
+constant WRL: STD_LOGIC_VECTOR(1 downto 0) := "01"; -- data bus write (registered mode)
+
+begin
+ process(em,m,x,a)
+ begin
+ -----------------------------------
+ -- NATIVE MODE --
+ -----------------------------------
+ if em = '0' then
+ -- The PLA is arranged like an ROM, there are an address input "a" and an data output "q". The address of PLA is 13 bit wide
+ -- and composed in this way:
+ --
+ -- W ---- CPU OPCODE ---- --- MPC --
+ -- | | | | |
+ -- | | | | |
+ -- W X--X--X--X--X--X--X--X--Y--Y--Y--Y
+ -- 12-11-10-09-08-07-06-05-04-03-02-01-00
+ --
+ -- the bit (12) W is the two byte instruction bit
+ -- the bits (11-4) (X field) is formed by CPU instruction opcode
+ -- the bits (3-0) (Y field) is formed by the three bit wide microinstruction program counter (MPC)
+ -- The MPC field is cleared at each opcode fetch by FSM and since it's three bit wide there are
+ -- an maximum of eight microinstructions available per opcode
+ --
+ -- The bits 10-3 of PLA address serves to select the microcode group of a related CPU opcode
+ -- and they are stable for all instruction execution time, instead the remaining three bit 2-0 (MPC field) of PLA address
+ -- increment at each clock in order to address the next microcode instructions.
+ -- microcode assembly:
+ -- Due the particulary pipeline structure of this CPU, all microinstructions have an extra cycle hidden on fetch
+ -- of the next opcode instruction and normally this extra cycle is coded as "NOP" (see the last line "when others =>...").
+ -- However there are some instructions where this extra cycle is used for some functions like decimal adjustments etc of
+ -- ADC and SBC instructions (see DAA and DAS).
+ --
+ -- Microcode fields:
+ --
+ -- DMUX: ALU operand #2 multiplexer
+ -- | AI: effective address is indexed (X or Y)
+ -- | | VP: vector pull
+ -- | | | ML: memory lock
+ -- | | | | VPA: valid program address
+ -- | | | | | VDA: valid data address
+ -- | | | | | | EI: end of microcode sequence (the hidden extra cycle it's always executed after this microinstruction)
+ -- | | | | | | | W: read/write control
+ -- | | | | | | | | CLI: clear interrupt request
+ -- | | | | | | | | | PD: PC/MP address output multiplexer select
+ -- | | | | | | | | | | PCR: register PC (program counter)
+ -- | | | | | | | | | | | MPR: register MP (memory pointer)
+ -- | | | | | | | | | | | | P_OP: register P set/reset bit
+ -- | | | | | | | | | | | | | ALUOP: ALU operation
+ -- | | | | | | | | | | | | | | REGOP: registers load/increment/decrement etc.
+ -- | | | | | | | | | | | | | | | RSEL: registers output multiplexer select
+ -- | | | | | | | | | | | | | | | |
+ -- | | | | | | | | | | | | | | | |
+ case a is -- DMUX AI VP ML VPA VDA EI W CLI PD PCR MPR P_OP ALUOP REGOP RSEL
+ ------------------------------------
+ -- IMPLIED --
+ ------------------------------------
+ -- BRK
+ when BRK_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & IN2_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- if no interrupt request then PC=PC+2
+ when BRK_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- PBR->S; SP-1
+ when BRK_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1
+ when BRK_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1
+ when BRK_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & VEC_M & SID_P & NOP_A & KCL_R & PRD_O; -- P->S; VEC->MP; CLI; SEI; CLD
+ when BRK_OP5 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'0'& RDE &'1'& ADMP & LSB_PC & INC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCL; MP+1; 1->B; VP
+ when BRK_OP6 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'1'& RDE &'1'& ADMP & MSB_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCH; EI; VP
+
+ -- COP
+ when COP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & IN2_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- if no interrupt request then PC=PC+2
+ when COP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- PBR->S; SP-1
+ when COP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1
+ when COP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1
+ when COP_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & VEC_M & SID_P & NOP_A & KCL_R & PRD_O; -- P->S; VEC->MP; CLI; SEI; CLD
+ when COP_OP5 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'0'& RDE &'1'& ADMP & LSB_PC & INC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCL; MP+1; 1->B; VP
+ when COP_OP6 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'1'& RDE &'1'& ADMP & MSB_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCH; EI; VP
+
+ -- NOP
+ when NOP_OP0 => q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ -- CLC
+ when CLC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLC_P & NOP_A & NOP_R & EXT_O; -- 0->C; EI
+
+ -- SEC
+ when SEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SEC_P & NOP_A & NOP_R & EXT_O; -- 1->C; EI
+
+ -- CLI
+ when CLI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLI_P & NOP_A & NOP_R & EXT_O; -- 0->I; EI
+
+ -- SEI
+ when SEI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SEI_P & NOP_A & NOP_R & EXT_O; -- 1->I; EI
+
+ -- CLV
+ when CLV_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLV_P & NOP_A & NOP_R & EXT_O; -- 0->V; EI
+
+ -- CLD
+ when CLD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLD_P & NOP_A & NOP_R & EXT_O; -- 0->D; EI
+
+ -- SED
+ when SED_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SED_P & NOP_A & NOP_R & EXT_O; -- 1->D; EI
+
+ -- TAX
+ when TAX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & ARD_O; -- A->X; EI
+
+ -- TXA
+ when TXA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & XRD_O; -- X->A; EI
+
+ -- TAY
+ when TAY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & ARD_O; -- A->Y; EI
+
+ -- TYA
+ when TYA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & YRD_O; -- Y->A; EI
+
+ -- TXY
+ when TXY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & XRD_O; -- X->Y; EI
+
+ -- TYX
+ when TYX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & YRD_O; -- Y->X; EI
+
+ -- TCD
+ when TCD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & D16_R & ARD_O; -- C->D; EI
+
+ -- TDC
+ when TDC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & DRD_O; -- D->C; EI
+
+ -- TXS
+ when TXS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & S16_R & XRD_O; -- X->S; EI
+
+ -- TSX
+ when TSX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & SRD_O; -- S->X; EI
+
+ -- INC A
+ when INC_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & ALL_R & ARD_O; -- A+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & A16_R & ARD_O; -- A+1; EI
+ end if;
+
+ -- DEC A
+ when DEC_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & ALL_R & ARD_O; -- A-1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & A16_R & ARD_O; -- A-1; EI
+ end if;
+
+ -- INX
+ when INX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & X16_R & XRD_O; -- X+1; EI
+
+ -- DEX
+ when DEX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & X16_R & XRD_O; -- X-1; EI
+
+ -- INY
+ when INY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & Y16_R & YRD_O; -- Y+1; EI
+
+ -- DEY
+ when DEY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & Y16_R & YRD_O; -- Y-1; EI
+
+ -- PHP
+ when PHP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PRD_O; -- P->S; SP-1; EI
+
+ -- PHD
+ when PHD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRM_O; -- D (msb) ->S; SP-1;
+ when PHD_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRD_O; -- D (lsb) ->S; SP-1; EI
+
+ -- PHA
+ when PHA_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A (lsb) ->S; SP-1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARM_O; -- A (msb) ->S; SP-1;
+ end if;
+ when PHA_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A (lsb) ->S; SP-1; EI
+ end if;
+
+ -- PHX
+ when PHX_OP0 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X (lsb) ->S; SP-1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRM_O; -- X (msb) ->S; SP-1;
+ end if;
+ when PHX_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X (lsb) ->S; SP-1; EI
+ end if;
+
+ -- PHY
+ when PHY_OP0 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRD_O; -- Y (lsb) ->S; SP-1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRM_O; -- Y (msb) ->S; SP-1;
+ end if;
+ when PHY_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRD_O; -- Y (lsb) ->S; SP-1; EI
+ end if;
+
+ -- PHR (in native mode PHR pushes ALWAYS 16 bit registers)
+ when PHR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARM_O; -- A(msb)->S; SP-1; (two byte instruction)
+ when PHR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A(lsb)->S; SP-1; (two byte instruction)
+ when PHR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRM_O; -- X(msb)->S; SP-1; (two byte instruction)
+ when PHR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X(lsb)->S; SP-1; (two byte instruction)
+ when PHR_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRM_O; -- Y(msb)->S; SP-1; (two byte instruction)
+ when PHR_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & SDW_R & YRD_O; -- Y(lsb)->S; SP-1; EI (two byte instruction)
+
+ -- SAV (in native mode STO pushes ALWAYS AXY 16 bit registers)
+ when SAV_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARM_O; -- A(msb)->S; SP-1; (two byte instruction)
+ when SAV_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A(lsb)->S; SP-1; (two byte instruction)
+ when SAV_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRM_O; -- X(msb)->S; SP-1; (two byte instruction)
+ when SAV_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X(lsb)->S; SP-1; (two byte instruction)
+ when SAV_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRM_O; -- Y(msb)->S; SP-1; (two byte instruction)
+ when SAV_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRD_O; -- Y(lsb)->S; SP-1; (two byte instruction)
+ when SAV_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PRD_O; -- P->S; SP-1; (two byte instruction)
+ when SAV_OP7 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & BRD_O; -- B->S; SP-1; (two byte instruction)
+ when SAV_OP8 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRM_O; -- D (msb) ->S; SP-1; (two byte instruction)
+ when SAV_OP9 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & SDW_R & DRD_O; -- D (lsb) ->S; SP-1; (two byte instruction)
+
+ -- RST (in native mode RST pulls ALWAYS AXY 16 bit registers)
+ when RST_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1 (two byte instruction)
+ when RST_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- S->O (lsb); SP+1
+ when RST_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & DLS_R & EXM_O; -- S msb) & O (lsb) -> D;/SP+1
+ when RST_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & BLS_R & EXT_O; -- S->B; SP +1
+ when RST_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & PLD_P & NOP_A & SUP_R & EXT_O; -- S->P; SP+1
+ when RST_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYU_R & EXT_O; -- S->Y (lsb); SP+1 (two byte instruction)
+ when RST_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYM_R & EXT_O; -- S->Y (msb); SP+1 (two byte instruction)
+ when RST_OP7 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXU_R & EXT_O; -- S->X (lsb); SP+1 (two byte instruction)
+ when RST_OP8 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXM_R & EXT_O; -- S->X (msb); SP+1 (two byte instruction)
+ when RST_OP9 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SAU_R & EXT_O; -- S->A (lsb); SP+1 (two byte instruction)
+ when RST_OP10 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & ALM_R & EXT_O; -- S->A (msb); EI (two byte instruction)
+
+ -- PLP
+ when PLP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & PLD_P & NOP_A & NOP_R & EXT_O; -- S->P; EI
+
+ -- PLD
+ when PLD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLD_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- S->O (lsb); SP+1
+ when PLD_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & D16_R & EXM_O; -- S msb) & O (lsb) -> D;
+
+ -- PLA
+ when PLA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- S->A (lsb); EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- SP->MP; SP+1
+ end if;
+ when PLA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- S->O (msb)
+ end if;
+ when PLA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & ORD_O; -- O->A (msb/lsb)
+ end if;
+
+ -- PLX
+ when PLX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLX_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- S->X (lsb); EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- SP->MP; SP+1
+ end if;
+ when PLX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- S->O (msb)
+ end if;
+ when PLX_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & ORD_O; -- O->X (msb/lsb)
+ end if;
+
+ -- PLY
+ when PLY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLY_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- S->Y (lsb); EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- SP->MP; SP+1
+ end if;
+ when PLY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- S->O (msb)
+ end if;
+ when PLY_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & ORD_O; -- O->X (msb/lsb)
+ end if;
+
+ -- PLR (in native mode PLR pulls ALWAYS 16 bit registers)
+ when PLR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1 (two byte instruction)
+ when PLR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYU_R & EXT_O; -- S->Y (lsb); SP+1 (two byte instruction)
+ when PLR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYM_R & EXT_O; -- S->Y (msb); SP+1 (two byte instruction)
+ when PLR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXU_R & EXT_O; -- S->X (lsb); SP+1 (two byte instruction)
+ when PLR_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXM_R & EXT_O; -- S->X (msb); SP+1 (two byte instruction)
+ when PLR_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SAU_R & EXT_O; -- S->A (lsb); SP+1 (two byte instruction)
+ when PLR_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & ALM_R & EXT_O; -- S->A (msb); EI (two byte instruction)
+
+ -- RTI
+ when RTI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- PC->MEM; MP=01XX (STACK)
+ when RTI_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & PLD_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; MEM->P; SP +1
+ when RTI_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB->O;
+ when RTI_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTI_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MSB->O;
+ when RTI_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTI_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADSP & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; MEM->PBR;
+
+ -- RTS
+ when RTS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTS_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB->O;
+ when RTS_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTS_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MEM->PC
+ when RTS_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC+1; PC->MEM; EI
+
+ -- ASL (A)
+ when ASL_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHL_A & ALL_R & ARD_O; -- A (lsb) SHIFT LEFT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHL_A & A16_R & ARD_O; -- A (msb/lsb) SHIFT LEFT; EI
+ end if;
+
+ -- LSR (A)
+ when LSR_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHR_A & ALL_R & ARD_O; -- A (lsb) SHIFT RIGHT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHR_A & A16_R & ARD_O; -- A (msb/lsb) SHIFT RIGHT; EI
+ end if;
+
+ -- ROL (A)
+ when ROL_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROL_A & ALL_R & ARD_O; -- A (lsb) ROTATE LEFT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROL_A & A16_R & ARD_O; -- A (msb\lsb) ROTATE LEFT; EI
+ end if;
+
+ -- ROR (A)
+ when ROR_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROR_A & ALL_R & ARD_O; -- A (lsb) ROTATE RIGHT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROR_A & A16_R & ARD_O; -- A (msb\lsb) ROTATE RIGHT; EI
+ end if;
+
+ -- EXT (A)
+ when EXT_OP0 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- NOP; EI (two byte instruction)
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & EXT_A & A16_R & ARD_O; -- A (msb/lsb) SHIFT LEFT; EI (two byte instruction)
+ end if;
+
+ -- NEG (A)
+ when NEG_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NEG_A & ALL_R & ARD_O; -- negates A (lsb); EI (two byte instruction)
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NEG_A & A16_R & ARD_O; -- negates A (msb\lsb); EI (two byte instruction)
+ end if;
+
+ -- XYX
+ when XYX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & XRD_O; -- X->O; (two byte instruction)
+ when XYX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & X16_R & YRD_O; -- Y->X;
+ when XYX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & Y16_R & ORD_O; -- O->Y; EI
+
+ -- XAX
+ when XAX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & XRD_O; -- X->O; (two byte instruction)
+ when XAX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & X16_R & ARD_O; -- A->X;
+ when XAX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & A16_R & ORD_O; -- O->A; EI
+
+ -- XAY
+ when XAY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & YRD_O; -- Y->O; (two byte instruction)
+ when XAY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & Y16_R & ARD_O; -- A->Y;
+ when XAY_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & A16_R & ORD_O; -- O->A; EI
+
+ -- TCS
+ when TCS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & S16_R & ARD_O; -- C->S;
+
+ -- TSC
+ when TSC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & SRD_O; -- S->C;
+
+ -- XCE
+ when XCE_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & XCE_P & NOP_A & NOP_R & EXT_O; -- E<>C; EI
+
+ -- WDM
+ when WDM_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDM_P & NOP_A & NOP_R & EXT_O; -- set two byte instruction bit
+
+ -- PHK
+ when PHK_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- K->S; SP-1; EI
+
+ -- PHB
+ when PHB_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & BRD_O; -- B->S; SP-1; EI
+
+ -- PLB
+ when PLB_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLB_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & BLD_R & EXT_O; -- S->B; EI
+
+ -- RTL
+ when RTL_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTL_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB->O;
+ when RTL_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTL_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MSB->O;
+ when RTL_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTL_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; MEM->PBR;
+ when RTL_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC+1; PC->MEM; EI
+
+ -- XBA
+ when XBA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & ARM_O; -- swap A<->B; EI
+
+ -- WAI
+ when WAI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & WAI_R & EXT_O; -- set WAI flipflop
+ when WAI_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ -- STP
+ when STP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & STP_R & EXT_O; -- set STP flipflop
+ when STP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ ------------------------------------
+ -- IMMEDIATE --
+ ------------------------------------
+ -- LDA #xx/#xxxx
+ when IMLDA_OP0 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MEM->A (lsb); PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O (lsb); PC +1; EI
+ end if;
+ when IMLDA_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MEM->A (msb\lsb); PC +1; EI
+ end if;
+
+ -- LDX #xx/#xxxx
+ when IMLDX_OP0 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MEM->X (lsb); PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O (lsb); PC +1; EI
+ end if;
+ when IMLDX_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & X16_R & EXM_O; -- MEM->X (msb\lsb); PC +1; EI
+ end if;
+
+
+ -- LDY #yy/#xxxx
+ when IMLDY_OP0 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MEM->Y (lsb); PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O (lsb); PC +1; EI
+ end if;
+ when IMLDY_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & Y16_R & EXM_O; -- MEM->Y (msb\lsb); PC +1; EI
+ end if;
+
+ -- ADC #xx/#xxxx (immediate)
+ when IMADC_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; PC +1; EI (emulation mode)
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); PC +1;
+ end if;
+ when IMADC_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+
+ -- SBC #xx/#xxxx (immediate)
+ when IMSBC_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-EXT; PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- A=A+EXT; PC +1;
+ end if;
+ when IMSBC_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- MEM->A (msb\lsb); PC +1; EI
+ end if;
+
+ -- CMP #xx/#xxxx (immediate)
+ when IMCMP_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;;
+ end if;
+ when IMCMP_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-(msb\lsb); PC +1; EI
+ end if;
+
+ -- CPX #xx/#xxxx (immediate)
+ when IMCPX_OP0 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-MEM; PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMCPX_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-(msb\lsb); PC +1; EI
+ end if;
+
+
+ -- CPY #xx/#xxxx (immediate)
+ when IMCPY_OP0 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-MEM; PC +1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMCPY_OP1 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- X-(msb\lsb); PC +1; EI
+ end if;
+
+ -- AND #xx/#xxxx (immediate)
+ when IMAND_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A AND MEM -> A; PC +1;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMAND_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A AND MEM ->A (msb\lsb) -> A; PC +1; EI
+ end if;
+
+ -- ORA #xx/#xxxx (immediate)
+ when IMORA_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A AND MEM -> A; PC +1;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMORA_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A OR MEM ->A (msb\lsb) -> A; PC +1; EI
+ end if;
+
+ -- EOR #xx (immediate)
+ when IMEOR_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A XOR MEM -> A; PC +1;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMEOR_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A XOR MEM ->A (msb\lsb) -> A; PC +1; EI
+ end if;
+
+ -- BIT #xx/#xxxx (immediate)
+ when IMBIT_OP0 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & LDZ_P & BIT_A & NOP_R & ARD_O; -- A AND MEM -> A; PC +1;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM (lsb)->O; PC +1;
+ end if;
+ when IMBIT_OP1 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A AND MEM ->A (msb\lsb) -> A; PC +1; EI
+ end if;
+
+ -- SEP #xx (immediate)
+ when IMSEP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & SEP_P & NOP_A & NOP_R & EXT_O; -- P = P OR MEM; PC +1;
+
+ -- REP #xx (immediate)
+ when IMREP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & REP_P & NOP_A & NOP_R & EXT_O; -- P = P AND NOT MEM; PC +1;
+
+ ------------------------------------
+ -- ZERO PAGE --
+ ------------------------------------
+ -- LDA $xx (zero page)
+ when ZPLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPLDA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1; EI
+ end if;
+
+ -- LDX $xx (zero page)
+ when ZPLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDX_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPLDX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & EXM_O; -- MP->MEM; MEM->X; PC+1; EI
+ end if;
+
+ -- LDY $xx (zero page)
+ when ZPLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDY_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPLDY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & EXM_O; -- MP->MEM; MEM->Y; PC+1; EI
+ end if;
+
+ -- STA $xx (zero page)
+ when ZPSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM; PC+1; MP+1;
+ end if;
+ when ZPSTA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM; EI
+ end if;
+
+ -- STX $xx (zero page)
+ when ZPSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTX_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X (lsb) ->MEM; PC+1; MP+1
+ end if;
+ when ZPSTX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRM_O; -- MP->MEM; X (msb) ->MEM; EI
+ end if;
+
+
+ -- STY $xx (zero page)
+ when ZPSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTY_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y (lsb) ->MEM; PC+1; MP+1
+ end if;
+ when ZPSTY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRM_O; -- MP->MEM; X (msb) ->MEM; EI;
+ end if;
+
+
+ -- STZ $xx (zero page)
+ when ZPSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTZ_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0 (lsb) ->MEM; PC+1; MP+1
+ end if;
+ when ZPSTZ_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0 (msb) ->MEM; EI;
+ end if;
+
+ -- ADC $xx (zero page)
+ when ZPADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPADC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPADC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xx (zero page)
+ when ZPSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSBC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ZPSBC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A - MEM(msb)\O(lsb) => A (msb\lsb); EI
+ end if;
+
+ -- CMP $xx (zeropage)
+ when ZPCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCMP_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPCMP_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CPX $xx (zeropage)
+ when ZPCPX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCPX_OP1 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPCPX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CPY $xx (zeropage)
+ when ZPCPY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCPY_OP1 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPCPY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xx (zeropage)
+ when ZPAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPAND_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPAND_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A = A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xx (zeropage)
+ when ZPORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPORA_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPORA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A = A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xx (zeropage)
+ when ZPEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPEOR_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPEOR_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A = A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- BIT $xx (zero page)
+ when ZPBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPBIT_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZPBIT_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ASL $xx (zero page)
+ when ZPASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPASL_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPASL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZPASL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & SHL_A & O16_R & ORD_O; -- O SHIFT LEFT; MP-1
+ end if;
+ when ZPASL_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPASL_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- LSR $xx (zero page)
+ when ZPLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLSR_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPLSR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZPLSR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & SHR_A & O16_R & ORD_O; -- O SHIFT LEFT; MP-1
+ end if;
+ when ZPLSR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPLSR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- ROL $xx (zero page)
+ when ZPROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPROL_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPROL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZPROL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & ROL_A & O16_R & ORD_O; -- O ROTATE LEFT; MP-1
+ end if;
+ when ZPROL_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPROL_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- ROR $xx (zero page)
+ when ZPROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPROR_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPROR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZPROR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & ROR_A & O16_R & ORD_O; -- O ROTATE RIGHT; MP-1
+ end if;
+ when ZPROR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPROR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- INC $xx (zero page)
+ when ZPINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPINC_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPINC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZPINC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLD_P & INC_A & O16_R & ORD_O; -- O = O +1; MP-1
+ end if;
+ when ZPINC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPINC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- DEC $xx (zero page)
+ when ZPDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPDEC_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPDEC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (msb);
+ end if;
+ when ZPDEC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLD_P & DEC_A & O16_R & ORD_O; -- O = O -1; MP-1
+ end if;
+ when ZPDEC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZPDEC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- TSB $xx (zero page)
+ when ZPTSB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPTSB_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPTSB_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (msb);
+ end if;
+ when ZPTSB_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & TSB_A & OLD_R & ARD_O; -- A OR O -> O;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & O16_R & ARD_O; -- A AND O -> Z;
+ end if;
+ when ZPTSB_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & NOP_P & TSB_A & O16_R & ARD_O; -- A OR O -> O; MP -1
+ end if;
+ when ZPTSB_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM;
+ end if;
+ when ZPTSB_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- TRB $xx (zero page)
+ when ZPTRB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPTRB_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZPTRB_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (msb);
+ end if;
+ when ZPTRB_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & TRB_A & OLD_R & ARD_O; -- A NAND O -> O;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & O16_R & ARD_O; -- A AND O -> Z;
+ end if;
+ when ZPTRB_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & NOP_P & TRB_A & O16_R & ARD_O; -- A NAND O -> O; MP -1
+ end if;
+ when ZPTRB_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM;
+ end if;
+ when ZPTRB_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ ------------------------------------
+ -- ZERO PAGE,X --
+ ------------------------------------
+ -- LDA $xx,X (zero page indexed)
+ when ZXLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLDA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; MP+1
+ end if;
+ when ZXLDA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; EI
+ end if;
+
+ -- LDY $xx,X (zero page indexed)
+ when ZXLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLDY_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXLDY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & EXM_O; -- MP->MEM; MEM->Y; PC+1; EI
+ end if;
+
+ -- STA $xx,X (zero page indexed)
+ when ZXSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP+1
+ end if;
+ when ZXSTA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; EI
+ end if;
+
+ -- STY $xx,X (zero page indexed)
+ when ZXSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTY_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; MP +1
+ end if;
+ when ZXSTY_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRM_O; -- MP->MEM; Y->MEM; EI
+ end if;
+
+ -- STZ $xx,X (zero page indexed)
+ when ZXSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTZ_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; MP+1
+ end if;
+ when ZXSTZ_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; EI
+ end if;
+
+ -- ADC $xx,X (zero page indexed)
+ when ZXADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXADC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXADC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xx,X (zero page indexed)
+ when ZXSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSBC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXSBC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- CMP $xx,X (zero page indexed)
+ when ZXCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXCMP_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXCMP_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xx,X (zero page indexed)
+ when ZXAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXAND_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXAND_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A - AND O -> A (msb/lsb); EI
+ end if;
+
+ -- ORA $xx,X (zero page indexed)
+ when ZXORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXORA_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXORA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A - OR O -> A (msb/lsb); EI
+ end if;
+
+ -- EOR $xx,X (zero page indexed)
+ when ZXEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXEOR_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXEOR_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A - XOR O -> A (msb/lsb); EI
+ end if;
+
+ -- ASL $xx,X (zero page indexed)
+ when ZXASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXASL_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXASL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZXASL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & SHL_A & O16_R & ORD_O; -- O SHIFT LEFT; MP-1
+ end if;
+ when ZXASL_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXASL_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- LSR $xx,X (zero page indexed)
+ when ZXLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLSR_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXLSR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZXLSR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & SHR_A & O16_R & ORD_O; -- O SHIFT LEFT; MP-1
+ end if;
+ when ZXLSR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXLSR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- ROL $xx,X (zero page indexed)
+ when ZXROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXROL_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXROL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZXROL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & ROL_A & O16_R & ORD_O; -- O ROTATE LEFT; MP-1
+ end if;
+ when ZXROL_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXROL_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- ROR $xx,X (zero page indexed)
+ when ZXROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXROR_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXROR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZXROR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLC_P & ROR_A & O16_R & ORD_O; -- O ROTATE RIGHT; MP-1
+ end if;
+ when ZXROR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXROR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- INC $xx,X (zero page indexed)
+ when ZXINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXINC_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXINC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ end if;
+ when ZXINC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLD_P & INC_A & O16_R & ORD_O; -- O = O +1; MP-1
+ end if;
+ when ZXINC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXINC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- DEC $xx,X (zero page indexed)
+ when ZXDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXDEC_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; MP +1
+ end if;
+ when ZXDEC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O (msb);
+ end if;
+ when ZXDEC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & DEC_M & FLD_P & DEC_A & O16_R & ORD_O; -- O = O -1; MP-1
+ end if;
+ when ZXDEC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O(lsb)->MEM; MP +1
+ end if;
+ when ZXDEC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O(msb)->MEM; EI
+ end if;
+
+ -- BIT $xx,X (zero page indexed)
+ when ZXBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXBIT_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1; EI
+ end if;
+ when ZXBIT_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT MEM(msb)\O(lsb); EI
+ end if;
+
+
+ ------------------------------------
+ -- ZERO PAGE,Y --
+ ------------------------------------
+ -- LDX $xx,Y (zero page indexed)
+ when ZYLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZYLDX_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP +1
+ end if;
+ when ZYLDX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O
+ end if;
+ when ZYLDX_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & ORD_O; -- O->X
+ end if;
+
+ -- STX $xx,Y (zero page indexed)
+ when ZYSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZYSTX_OP1 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADDI & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; MP +1
+ end if;
+ when ZYSTX_OP2 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRM_O; -- MP->MEM; X->MEM; EI
+ end if;
+
+
+ ------------------------------------
+ -- INDIRECT --
+ ------------------------------------
+ -- JMP ($xxxx) (indirect)
+ when INJMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when INJMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when INJMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MEM->PC; O->PC; EI
+
+ -- JML ($xxxx) (indirect)
+ when INJML_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when INJML_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when INJML_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJML_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJML_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PBR; EI
+
+ ------------------------------------
+ -- INDIRECT,Y --
+ ------------------------------------
+ -- LDA ($xx),Y (zeropage - indirect - indexed)
+ when IYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYLDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYLDA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYLDA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA ($xx),Y (zeropage - indirect - indexed)
+ when IYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYSTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYSTA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP +1
+ end if;
+ when IYSTA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; EI
+ end if;
+
+ -- ADC ($xx),Y (zeropage - indirect - indexed)
+ when IYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYADC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYADC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- A=A+MEM (msb)/O (lsb); EI
+ end if;
+
+ -- SBC ($xx),Y (zeropage - indirect - indexed)
+ when IYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYSBC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYSBC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- CMP ($xx),Y (zeropage - indirect - indexed)
+ when IYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYCMP_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYCMP_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- AND ($xx),Y (zeropage - indirect - indexed)
+ when IYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYAND_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYAND_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM (msb)/O (lsb); EI
+ end if;
+
+ -- ORA ($xx),Y (zeropage - indirect - indexed)
+ when IYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYORA_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYORA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM (msb)/O (lsb); EI
+ end if;
+
+ -- EOR ($xx),Y (zeropage - indirect - indexed)
+ when IYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYEOR_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IYEOR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM (msb)/O (lsb); EI
+ end if;
+
+
+ ------------------------------------
+ -- INDIRECT,X --
+ ------------------------------------
+ -- LDA ($xx,X) (zero page - indexed - indirect)
+ when IXLDA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXLDA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXLDA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA ($xx,X) (zero page - indexed - indirect)
+ when IXSTA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXSTA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- A->MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP +1
+ end if;
+ when IXSTA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; EI
+ end if;
+
+ -- AND ($xx,X) (zero page - indexed - indirect)
+ when IXAND_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXAND_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- MP->MEM; A=A AND MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXAND_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM (msb)/O (lsb); EI
+ end if;
+
+ -- ORA ($xx,X) (zero page - indexed - indirect)
+ when IXORA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXORA_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- MP->MEM; A=A OR MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXORA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM (msb)/O (lsb); EI
+ end if;
+
+ -- EOR ($xx,X) (zero page - indexed - indirect)
+ when IXEOR_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXEOR_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXEOR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM (msb)/O (lsb); EI
+ end if;
+
+ -- ADC ($xx,X) (zero page - indexed - indirect)
+ when IXADC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXADC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A + MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXADC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- A=A+MEM (msb)/O (lsb); EI
+ end if;
+
+ -- SBC ($xx,X) (zero page - indexed - indirect)
+ when IXSBC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXSBC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXSBC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- CMP ($xx,X) (zero page - indexed - indirect)
+ when IXCMP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXCMP_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI=1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when IXCMP_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- JMP ($xxxx,X) (absolute indexed - indirect)
+ when IXJMP_OP0 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when IXJMP_OP1 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ALL_M & AUC_P & SWC_A & NOP_R & XRD_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when IXJMP_OP2 => q <= ORD_D &'1'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ICC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MP_MSB+CARRY, EI
+ when IXJMP_OP3 => q <= ORD_D &'1'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when IXJMP_OP4 => q <= ORD_D &'1'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- JSR ($xxxx,X) (absolute indexed - indirect)
+ when IXJSR_OP0 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when IXJSR_OP1 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when IXJSR_OP2 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when IXJSR_OP3 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ALL_M & AUC_P & SWC_A & NOP_R & XRD_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when IXJSR_OP4 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when IXJSR_OP5 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ ------------------------------------
+ -- ABSOLUTE --
+ ------------------------------------
+ -- LDA $xxxx (absolute)
+ when ABLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDA_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABLDA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- LDX $xxxx (absolute)
+ when ABLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDX_OP2 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->A (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABLDX_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- LDY $xxxx (absolute)
+ when ABLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDY_OP2 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABLDY_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & EXM_O; -- MP->MEM; MEM->Y; PC+1
+ end if;
+
+ -- STA $xxxx (absolute)
+ when ABSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTA_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM;
+ end if;
+ when ABSTA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM;
+ end if;
+
+ -- STX $xxxx (absolute)
+ when ABSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTX_OP2 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X (lsb) ->MEM;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X (lsb) ->MEM;
+ end if;
+ when ABSTX_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRM_O; -- MP->MEM; X (msb) ->MEM;
+ end if;
+
+ -- STY $xxxx (absolute)
+ when ABSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTY_OP2 =>
+ if x = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y (lsb) ->MEM;
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y (lsb) ->MEM;
+ end if;
+ when ABSTY_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRM_O; -- MP->MEM; Y (msb) ->MEM;
+ end if;
+
+ -- STZ $xxxx (absolute)
+ when ABSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTZ_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTZ_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0 (lsb) ->MEM;
+ end if;
+ when ABSTZ_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0 (msb) ->MEM;
+ end if;
+
+ -- JMP $xxxx (absolute)
+ when ABJMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- JSR $xxxx (absolute)
+ when ABJSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJSR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when ABJSR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when ABJSR_OP3 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- BIT $xxxx (absolute)
+ when ABBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABBIT_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABBIT_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- MP->MEM; MEM->ALU; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABBIT_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- MP->MEM; BIT
+ end if;
+
+ -- ADC $xxxx (absolute)
+ when ABADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABADC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABADC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xxxx (absolute)
+ when ABSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSBC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABSBC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A = A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CMP $xxxx (absolute)
+ when ABCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCMP_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABCMP_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CPX $xxxx (absolute)
+ when ABCPX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCPX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCPX_OP2 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABCPX_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CPY $xxxx (absolute)
+ when ABCPY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCPY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCPY_OP2 =>
+ if x = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- X-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABCPY_OP3 =>
+ if x = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xxxx (absolute)
+ when ABORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABORA_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABORA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xxxx (absolute)
+ when ABAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABAND_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABAND_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xxxx (absolute)
+ when ABEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABEOR_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ABEOR_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ASL $xxxx (absolute)
+ when ABASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABASL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABASL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABASL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O (lsb) SHIFT LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABASL_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & SHL_A & O16_R & ORD_O; -- O (msb\lsb) SHIFT LEFT -> O; MP-1
+ end if;
+ when ABASL_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when ABASL_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- LSR $xxxx (absolute)
+ when ABLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLSR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLSR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABLSR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O (lsb) SHIFT RIGHT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABLSR_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & SHR_A & O16_R & ORD_O; -- O (msb\lsb) SHIFT RIGHT -> O; MP-1
+ end if;
+ when ABLSR_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when ABLSR_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- ROL $xxxx (absolute)
+ when ABROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABROL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABROL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABROL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O (lsb) ROTATE LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABROL_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & ROL_A & O16_R & ORD_O; -- O (msb\lsb) ROTATE LEFT -> O; MP-1
+ end if;
+ when ABROL_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when ABROL_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- ROR $xxxx (absolute)
+ when ABROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABROR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABROR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABROR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O (lsb) ROTATE RIGHT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABROR_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & ROR_A & O16_R & ORD_O; -- O (msb\lsb) ROTATE RIGHT -> O; MP-1
+ end if;
+ when ABROR_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when ABROR_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- INC $xxxx (absolute)
+ when ABINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABINC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABINC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABINC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1 -> O (lsb)
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABINC_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLD_P & INC_A & O16_R & ORD_O; -- O = O +1 (msb\lsb) -> O; MP-1
+ end if;
+ when ABINC_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when ABINC_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- DEC $xxxx (absolute)
+ when ABDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABDEC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABDEC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ABDEC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1 -> O (lsb)
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when ABDEC_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLD_P & DEC_A & O16_R & ORD_O; -- O = O -1 (msb\lsb) -> O; MP-1
+ end if;
+ when ABDEC_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP+1
+ when ABDEC_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- TSB $xxxx (absolute)
+ when ABTSB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABTSB_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABTSB_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ end if;
+ when ABTSB_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> O
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O;
+ end if;
+ when ABTSB_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & TSB_A & OLD_R & ARD_O; -- A OR O => O
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & O16_R & ARD_O; -- A AND O -> O
+ end if;
+ when ABTSB_OP5 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & NOP_P & TSB_A & O16_R & ARD_O; -- A OR O => O; MP-1
+ end if;
+ when ABTSB_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP+1
+ when ABTSB_OP7 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- TRB $xxxx (absolute)
+ when ABTRB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABTRB_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABTRB_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ end if;
+ when ABTRB_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> O
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O;
+ end if;
+ when ABTRB_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & TSB_A & OLD_R & ARD_O; -- A OR O => O
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & O16_R & ARD_O; -- A AND O -> O
+ end if;
+ when ABTRB_OP5 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & NOP_P & TRB_A & O16_R & ARD_O; -- A NAND O => O; MP-1
+ end if;
+ when ABTRB_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP+1
+ when ABTRB_OP7 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ ------------------------------------
+ -- ABSOLUTE,X --
+ ------------------------------------
+ -- DMUX: ALU operand #2 multiplexer
+ -- | AI: effective address is indexed (X or Y)
+ -- | | VP: vector pull
+ -- | | | ML: memory lock
+ -- | | | | VPA: vali program address
+ -- | | | | | VDA: valid data address
+ -- | | | | | | EI: end of microcode sequence (the hidden extra cycle it's always executed after this microinstruction)
+ -- | | | | | | | W: read/write control
+ -- | | | | | | | | CLI: clear interrupt request
+ -- | | | | | | | | | PD: PC/MP address output multiplexer select
+ -- | | | | | | | | | | PCR: register PC (program counter)
+ -- | | | | | | | | | | | MPR: register MP (memory pointer)
+ -- | | | | | | | | | | | | P_OP: register P set/reset bit
+ -- | | | | | | | | | | | | | ALUOP: ALU operation
+ -- | | | | | | | | | | | | | | REGOP: registers load/increment/decrement etc.
+ -- | | | | | | | | | | | | | | | RSEL: registers output multiplexer select
+ -- | | | | | | | | | | | | | | | |
+ -- | | | | | | | | | | | | | | | |
+ -- DMUX AI VP ML VPA VDA EI W CLI PD PCR MPR P_OP ALUOP REGOP RSEL
+ -- LDA $xxxx,X (absolute indexed)
+ when AXLDA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLDA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLDA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXLDA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; EI
+ end if;
+
+ -- LDY $xxxx,X (absolute indexed)
+ when AXLDY_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLDY_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLDY_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXLDY_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & Y16_R & EXM_O; -- MP->MEM; MEM->Y; EI
+ end if;
+
+ -- STA $xxxx,X (absolute indexed)
+ when AXSTA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSTA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSTA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP+1
+ end if;
+ when AXSTA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; MP+1
+ end if;
+
+ -- STZ $xxxx,X (absolute indexed)
+ when AXSTZ_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSTZ_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSTZ_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; MP+1
+ end if;
+ when AXSTZ_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; EI
+ end if;
+
+ -- ADC $xxxx,X (absolute indexed)
+ when AXADC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXADC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXADC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXADC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xxxx,X (absolute indexed)
+ when AXSBC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSBC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSBC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXSBC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A - MEM(msb)\O(lsb)=> A (msb\lsb); EI
+ end if;
+
+ -- CMP $xxxx,X (absolute indexed)
+ when AXCMP_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXCMP_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXCMP_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXCMP_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- INC $xxxx,X (absolute indexed)
+ when AXINC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXINC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXINC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXINC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1 -> O (lsb)
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXINC_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLD_P & INC_A & O16_R & ORD_O; -- O = O +1 (msb\lsb) -> O; MP-1
+ end if;
+ when AXINC_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXINC_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- DEC $xxxx,X (absolute indexed)
+ when AXDEC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXDEC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXDEC_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXDEC_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1 -> O (lsb)
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXDEC_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLD_P & DEC_A & O16_R & ORD_O; -- O = O -1 (msb\lsb) -> O; MP-1
+ end if;
+ when AXDEC_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXDEC_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- ASL $xxxx,X (absolute indexed)
+ when AXASL_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXASL_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXASL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXASL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O (lsb) SHIFT LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXASL_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & SHL_A & O16_R & ORD_O; -- O (msb\lsb) SHIFT LEFT -> O; MP-1
+ end if;
+ when AXASL_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXASL_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- LSR $xxxx,X (absolute indexed)
+ when AXLSR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLSR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLSR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXLSR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O (lsb) SHIFT RIGHT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXLSR_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & SHR_A & O16_R & ORD_O; -- O (msb\lsb) SHIFT RIGHT -> O; MP-1
+ end if;
+ when AXLSR_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXLSR_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- ROL $xxxx,X (absolute indexed)
+ when AXROL_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXROL_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXROL_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXROL_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O (lsb) ROTATE LEFT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXROL_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & ROL_A & O16_R & ORD_O; -- O (msb\lsb) ROTATE LEFT -> O; MP-1
+ end if;
+ when AXROL_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXROL_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- ROR $xxxx,X (absolute indexed)
+ when AXROR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXROR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXROR_OP2 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AXROR_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O (lsb) ROTATE RIGHT;
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ end if;
+ when AXROR_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & DEC_M & FLC_P & ROR_A & O16_R & ORD_O; -- O (msb\lsb) ROTATE RIGHT -> O; MP-1
+ end if;
+ when AXROR_OP5 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O (lsb) ->MEM; MP +1
+ when AXROR_OP6 => q <= NOP_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & OMD_O; -- MP->MEM; O (msb) ->MEM;
+
+ -- AND $xxxx,X (absolute indexed)
+ when AXAND_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXAND_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXAND_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & NOP_R & ARD_O; -- A AND EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXAND_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & NOP_R & ARD_O; -- A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xxxx,X (absolute indexed)
+ when AXORA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXORA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXORA_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & NOP_R & ARD_O; -- A OR EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXORA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & NOP_R & ARD_O; -- A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xxxx,X (absolute indexed)
+ when AXEOR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXEOR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXEOR_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & NOP_R & ARD_O; -- A XOR EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXEOR_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & NOP_R & ARD_O; -- A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- BIT $xxxx,X (absolute indexed)
+ when AXBIT_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXBIT_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXBIT_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AXBIT_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A BIT MEM(msb)\O(lsb); EI
+ end if;
+
+ ------------------------------------
+ -- ABSOLUTE,Y --
+ ------------------------------------
+ -- LDA $xxxx,Y (absolute indexed)
+ when AYLDA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYLDA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYLDA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AYLDA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; EI
+ end if;
+
+ -- LDX $xxxx,Y (absolute indexed)
+ when AYLDX_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYLDX_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYLDX_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AYLDX_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & EXM_O; -- MP->MEM; MEM->X; EI
+ end if;
+
+ -- STA $xxxx,Y (absolute indexed)
+ when AYSTA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYSTA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYSTA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP+1
+ end if;
+ when AYSTA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; MP+1
+ end if;
+
+ -- ADC $xxxx,Y (absolute indexed)
+ when AYADC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYADC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYADC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYADC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xxxx,Y (absolute indexed)
+ when AYSBC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYSBC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYSBC_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYSBC_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A - MEM(msb)\O(lsb)=> A (msb\lsb); EI
+ end if;
+
+ -- CMP $xxxx,Y (absolute indexed)
+ when AYCMP_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYCMP_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AYCMP_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYCMP_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xxxx,Y (absolute indexed)
+ when AYAND_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYAND_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYAND_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & NOP_R & ARD_O; -- A AND EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYAND_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & NOP_R & ARD_O; -- A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xxxx,Y (absolute indexed)
+ when AYORA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYORA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYORA_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & NOP_R & ARD_O; -- A OR EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYORA_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & NOP_R & ARD_O; -- A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xxxx,Y (absolute indexed)
+ when AYEOR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYEOR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYEOR_OP2 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & NOP_R & ARD_O; -- A XOR EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AYEOR_OP3 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & NOP_R & ARD_O; -- A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+
+ --------------------------------------
+ -- ABSOLUTE LONG --
+ --------------------------------------
+ -- JML $xxxxxx (absolute long)
+ when ABJML_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJML_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ABJML_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PBR; EI
+
+ -- JSL $xxxxxx (absolute long)
+ when ABJSL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJSL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ABJSL_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- PBR->S; SP-1;
+ when ABJSL_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when ABJSL_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when ABJSL_OP5 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PBR; EI
+
+ ------------------------------------
+ -- RELATIVE --
+ ------------------------------------
+ -- BRA xx
+ when BRA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BEQ xx
+ when BEQ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BNE xx
+ when BNE_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BCC xx
+ when BCC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BCS xx
+ when BCS_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BVC xx
+ when BVC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BVS xx
+ when BVS_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BPL xx
+ when BPL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BMI xx
+ when BMI_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -----------------------------------------
+ -- RELATIVE LONG --
+ -----------------------------------------
+ -- BRL xxxx
+ when BRL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb offset);
+ when BRL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRL_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset
+
+ -------------------------------
+ -- STACK --
+ -------------------------------
+ -- PEA xxxx
+ when PEA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when PEA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; PC+1
+ when PEA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PEA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ -- PEI xx
+ when PEI_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when PEI_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when PEI_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when PEI_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PEI_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ -- PER xxxx
+ when PER_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb offset);
+ when PER_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (msb offset)
+ when PER_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & SWC_A & O16_R & PCR_O; -- O = O + PC
+ when PER_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PER_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ ----------------------------------
+ -- DIRECT,Y --
+ ----------------------------------
+ -- LDA [$xx],Y (zeropage - direct long - indexed)
+ when DYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYLDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYLDA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYLDA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MPR MSB
+ when DYLDA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYLDA_OP5 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYLDA_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA [$xx],Y (zeropage - indirect long - indexed)
+ when DYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYSTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYSTA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYSTA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYSTA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYSTA_OP5 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP +1
+ end if;
+ when DYSTA_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; EI
+ end if;
+
+ -- ADC [$xx],Y (zeropage - indirect long - indexed)
+ when DYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYADC_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYADC_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYADC_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- A=A+MEM (msb)/O (lsb); EI
+ end if;
+
+ -- SBC [$xx],Y (zeropage - indirect long - indexed)
+ when DYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYSBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYSBC_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYSBC_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYSBC_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- CMP [$xx],Y (zeropage - indirect long - indexed)
+ when DYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYCMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYCMP_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYCMP_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYCMP_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- AND [$xx],Y (zeropage - indirect long - indexed)
+ when DYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYAND_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYAND_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYAND_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM (msb)/O (lsb); EI
+ end if;
+
+ -- ORA [$xx],Y (zeropage - indirect long - indexed)
+ when DYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYORA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYORA_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYORA_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM (msb)/O (lsb); EI
+ end if;
+
+ -- EOR [$xx],Y (zeropage - indirect long - indexed)
+ when DYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYEOR_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYEOR_OP5 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DYEOR_OP6 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM (msb)/O (lsb); EI
+ end if;
+
+ --------------------------------
+ -- DIRECT --
+ --------------------------------
+ -- LDA [$xx] (zeropage - direct long)
+ when DILDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DILDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DILDA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DILDA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DILDA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DILDA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA [$xx] (zeropage - indirect long)
+ when DISTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DISTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DISTA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DISTA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DISTA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; MP +1
+ end if;
+ when DISTA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A->MEM; EI
+ end if;
+
+ -- ADC [$xx] (zeropage - indirect long)
+ when DIADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIADC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DIADC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- A=A+MEM (msb)/O (lsb); EI
+ end if;
+
+ -- SBC [$xx] (zeropage - indirect long)
+ when DISBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DISBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DISBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DISBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DISBC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DISBC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- CMP [$xx] (zeropage - indirect long)
+ when DICMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DICMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DICMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DICMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DICMP_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DICMP_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A=A-MEM (msb)/O (lsb); EI
+ end if;
+
+ -- AND [$xx] (zeropage - indirect long)
+ when DIAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIAND_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DIAND_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM (msb)/O (lsb); EI
+ end if;
+
+ -- ORA [$xx] (zeropage - indirect long)
+ when DIORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIORA_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DIORA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM (msb)/O (lsb); EI
+ end if;
+
+ -- EOR [$xx] (zeropage - indirect long)
+ when DIEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIEOR_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when DIEOR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM (msb)/O (lsb); EI
+ end if;
+
+ ----------------------------------------
+ -- ABSOLUTE LONG --
+ ----------------------------------------
+ -- LDA $xxxxxx (absolute long)
+ when ALLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALLDA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when ALLDA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA $xxxxxx (absolute long)
+ when ALSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALSTA_OP3 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM;
+ end if;
+ when ALSTA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM;
+ end if;
+
+ -- ADC $xxxxxx (absolute long)
+ when ALADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALADC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALADC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xxxxxx (absolute long)
+ when ALSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALSBC_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALSBC_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A = A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CMP $xxxxxx (absolute long)
+ when ALCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALCMP_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALCMP_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xxxxxx (absolute long)
+ when ALORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALORA_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALORA_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xxxxxx (absolute long)
+ when ALAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALAND_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALAND_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xxxxxx (absolute long)
+ when ALEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALEOR_OP3 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when ALEOR_OP4 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ ------------------------------------------
+ -- ABSOLUTE LONG,X --
+ ------------------------------------------
+ -- LDA $xxxxxx,X (absolute long indexed X)
+ when AILDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AILDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AILDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AILDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AILDA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A (lsb);
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when AILDA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA $xxxxxx,X (absolute long indexed X)
+ when AISTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AISTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AISTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AISTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AISTA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM;
+ end if;
+ when AISTA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM;
+ end if;
+
+ -- ADC $xxxxxx,X (absolute long indexed X)
+ when AIADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIADC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIADC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AIADC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xxxxxx,X (absolute long indexed X)
+ when AISBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AISBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AISBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AISBC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AISBC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AISBC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A = A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CMP $xxxxxx,X (absolute long indexed X)
+ when AICMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AICMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AICMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AICMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AICMP_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AICMP_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xxxxxx,X (absolute long indexed X)
+ when AIORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIORA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIORA_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AIORA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xxxxxx,X (absolute long indexed X)
+ when AIAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIAND_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIAND_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AIAND_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xxxxxx,X (absolute long indexed X)
+ when AIEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIEOR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIEOR_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when AIEOR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ ----------------------------------------
+ -- STACK RELATIVE --
+ ----------------------------------------
+ -- LDA $xx,S (S + offset)
+ when SRLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRLDA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when SRLDA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA $xx,S (S + offset)
+ when SRSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRSTA_OP1 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM;
+ end if;
+ when SRSTA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM;
+ end if;
+
+ -- ADC $xx,S (S + offset)
+ when SRADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRADC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SRADC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC $xx,S (S + offset)
+ when SRSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRSBC_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SRSBC_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A = A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CMP $xx,S (S + offset)
+ when SRCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRCMP_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SRCMP_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA $xx,S (S + offset)
+ when SRORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRORA_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SRORA_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND $xx,S (S + offset)
+ when SRAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRAND_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SRAND_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR $xx,S (S + offset)
+ when SREOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SREOR_OP1 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SREOR_OP2 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ -------------------------------------------------
+ -- STACK RELATIVE INDEXED Y --
+ -------------------------------------------------
+ -- LDA ($xx,S),Y
+ when SYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYLDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYLDA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb); MP+1
+ end if;
+ when SYLDA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & EXM_O; -- MP->MEM; MEM->A; PC+1
+ end if;
+
+ -- STA ($xx,S),Y
+ when SYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYSTA_OP4 =>
+ if m = '1' then
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A (lsb) ->MEM;
+ end if;
+ when SYSTA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARM_O; -- MP->MEM; A (msb) ->MEM;
+ end if;
+
+ -- ADC ($xx,S),Y
+ when SYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYADC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYADC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYADC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & A16_R & ARD_O; -- MEM(msb)\O(lsb) + A => A (msb\lsb); PC +1; EI
+ end if;
+
+ -- SBC ($xx,S),Y
+ when SYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYSBC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYSBC_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYSBC_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & A16_R & ARD_O; -- A = A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- CMP ($xx,S),Y
+ when SYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYCMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYCMP_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYCMP_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A - MEM(msb)\O(lsb); EI
+ end if;
+
+ -- ORA ($xx,S),Y
+ when SYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYORA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYORA_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYORA_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & A16_R & ARD_O; -- A=A OR MEM(msb)\O(lsb); EI
+ end if;
+
+ -- AND ($xx,S),Y
+ when SYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYAND_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYAND_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYAND_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & A16_R & ARD_O; -- A=A AND MEM(msb)\O(lsb); EI
+ end if;
+
+ -- EOR ($xx,S),Y
+ when SYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYEOR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYEOR_OP4 =>
+ if m = '1' then
+ q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+ else
+ q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM=>O (lsb); MP +1;
+ end if;
+ when SYEOR_OP5 =>
+ if m = '1' then
+ q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ else
+ q <= EXM_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & A16_R & ARD_O; -- A=A XOR MEM(msb)\O(lsb); EI
+ end if;
+
+ ------------------------------------
+ -- MOVE BLOCK --
+ ------------------------------------
+ when MBMVN_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (source)
+ when MBMVN_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADXR & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; read byte
+ when MBMVN_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (destination)
+ when MBMVN_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADYR & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O->MEM; write byte
+ when MBMVN_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MVN_R & EXT_O; -- X +1; Y +1; A -1;
+ when MBMVN_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & DE3_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- check for A = $FFFF
+
+ when MBMVP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (source)
+ when MBMVP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADXR & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; read byte
+ when MBMVP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (destination)
+ when MBMVP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADYR & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O->MEM; write byte
+ when MBMVP_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MVP_R & EXT_O; -- X -1; Y -1; A -1;
+ when MBMVP_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & DE3_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- check for A = $FFFF
+
+ ----------------------------------
+ -- MULTIPLY --
+ ----------------------------------
+ when MPU_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUI_R & EXT_O; -- load A/B & X on multiplier
+ when MPU_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUS_R & EXT_O; -- start multiplication (unsigned)
+ when MPU_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & MUF_P & NOP_A & MUL_R & EXT_O; -- load result on A/B and X
+ when MPU_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ when MPS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUI_R & EXT_O; -- load A/B & X on multiplier
+ when MPS_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MSS_R & EXT_O; -- start multiplication (signed)
+ when MPS_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & MSF_P & NOP_A & MUL_R & EXT_O; -- load result on A/B and X
+ when MPS_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ when others => q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ end case;
+ else
+ -----------------------------------
+ -- EMULATION MODE --
+ -----------------------------------
+ -- DMUX: ALU operand #2 multiplexer
+ -- | AI: effective address is indexed (X or Y)
+ -- | | VP: vector pull
+ -- | | | ML: memory lock
+ -- | | | | VPA: vali program address
+ -- | | | | | VDA: valid data address
+ -- | | | | | | EI: end of microcode sequence (the hidden extra cycle it's always executed after this microinstruction)
+ -- | | | | | | | W: read/write control
+ -- | | | | | | | | CLI: clear interrupt request
+ -- | | | | | | | | | PD: PC/MP address output multiplexer select
+ -- | | | | | | | | | | PCR: register PC (program counter)
+ -- | | | | | | | | | | | MPR: register MP (memory pointer)
+ -- | | | | | | | | | | | | P_OP: register P set/reset bit
+ -- | | | | | | | | | | | | | ALUOP: ALU operation
+ -- | | | | | | | | | | | | | | REGOP: registers load/increment/decrement etc.
+ -- | | | | | | | | | | | | | | | RSEL: registers output multiplexer select
+ -- | | | | | | | | | | | | | | | |
+ -- | | | | | | | | | | | | | | | |
+ case a is -- DMUX AI VP ML VPA VDA EI W CLI PD PCR MPR P_OP ALUOP REGOP RSEL
+ ------------------------------------
+ -- IMPLIED --
+ ------------------------------------
+ -- BRK
+ when BRK_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & IN2_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- if no interrupt request then PC=PC+2
+ when BRK_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1
+ when BRK_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1
+ when BRK_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & VEC_M & SID_P & NOP_A & SDW_R & PRD_O; -- VEC->MP; SEI; CLD; 1->B (stack); P->S;
+ when BRK_OP4 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'0'& RDE &'1'& ADMP & LSB_PC & INC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCL; MP+1; interrupt ack; VP
+ when BRK_OP5 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'1'& RDE &'1'& ADMP & MSB_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCH; EI; VP
+
+ -- COP
+ when COP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & IN2_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC=PC+2
+ when COP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1
+ when COP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRL &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1
+ when COP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & VEC_M & SID_P & NOP_A & SDW_R & PRD_O; -- VEC->MP; SEI; CLD; 1->B (stack); P->S;
+ when COP_OP4 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'0'& RDE &'1'& ADMP & LSB_PC & INC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCL; MP+1; interrupt ack; VP
+ when COP_OP5 => q <= ORD_D &'0'&'1'&'0'&'0'&'1'&'1'& RDE &'1'& ADMP & MSB_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->PCH; EI; VP
+
+ -- NOP
+ when NOP_OP0 => q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ -- CLC
+ when CLC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLC_P & NOP_A & NOP_R & EXT_O; -- 0->C; EI
+
+ -- SEC
+ when SEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SEC_P & NOP_A & NOP_R & EXT_O; -- 1->C; EI
+
+ -- CLI
+ when CLI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLI_P & NOP_A & NOP_R & EXT_O; -- 0->I; EI
+
+ -- SEI
+ when SEI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SEI_P & NOP_A & NOP_R & EXT_O; -- 1->I; EI
+
+ -- CLV
+ when CLV_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLV_P & NOP_A & NOP_R & EXT_O; -- 0->V; EI
+
+ -- CLD
+ when CLD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & CLD_P & NOP_A & NOP_R & EXT_O; -- 0->D; EI
+
+ -- SED
+ when SED_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & SED_P & NOP_A & NOP_R & EXT_O; -- 1->D; EI
+
+ -- TAX
+ when TAX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & ARD_O; -- A->X; EI
+
+ -- TXA
+ when TXA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & XRD_O; -- X->A; EI
+
+ -- TAY
+ when TAY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & ARD_O; -- A->Y; EI
+
+ -- TYA
+ when TYA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & YRD_O; -- Y->A; EI
+
+ -- TXY
+ when TXY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & XRD_O; -- X->Y; EI
+
+ -- TYX
+ when TYX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & YRD_O; -- Y->X; EI
+
+ -- TCD
+ when TCD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & D16_R & ARD_O; -- C->D; EI
+
+ -- TDC
+ when TDC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & DRD_O; -- D->C; EI
+
+ -- TXS
+ when TXS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & S16_R & XRD_O; -- X->S; EI
+
+ -- TSX
+ when TSX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & X16_R & SRD_O; -- S->X; EI
+
+ -- INC A
+ when INC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & ALL_R & ARD_O; -- A+1; EI
+
+ -- DEC A
+ when DEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & ALL_R & ARD_O; -- A-1; EI
+
+ -- INX
+ when INX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & XLL_R & XRD_O; -- X+1; EI
+
+ -- DEX
+ when DEX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & XLL_R & XRD_O; -- X-1; EI
+
+ -- INY
+ when INY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & INC_A & YLL_R & YRD_O; -- Y+1; EI
+
+ -- DEY
+ when DEY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & DEC_A & YLL_R & YRD_O; -- Y-1; EI
+
+ -- PHP
+ when PHP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PRD_O; -- P->S; SP-1; EI
+
+ -- PHD
+ when PHD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRM_O; -- D (msb) ->S; SP-1;
+ when PHD_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRD_O; -- D (lsb) ->S; SP-1; EI
+
+ -- PHA
+ when PHA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A->S; SP-1; EI
+
+ -- PHX
+ when PHX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X->S; SP-1; EI
+
+ -- PHY
+ when PHY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRD_O; -- X->S; SP-1; EI
+
+ -- PHR (in emulation mode PHR pushes ALWAYS XY 8 bit registers and A as 16 bit register)
+ when PHR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARM_O; -- A(msb)->S; SP-1; (two byte instruction)
+ when PHR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A(lsb)->S; SP-1; (two byte instruction)
+ when PHR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X->S; SP-1; (two byte instruction)
+ when PHR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & SDW_R & YRD_O; -- Y->S; SP-1; EI (two byte instruction)
+
+ -- PLP
+ when PLP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & PLD_P & NOP_A & NOP_R & EXT_O; -- S->P; EI
+
+ -- SAV (in emulation mode SAV pushes ALWAYS XY 8 bit registers and A as 16 bit register)
+ when SAV_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARM_O; -- A(msb)->S; SP-1; (two byte instruction)
+ when SAV_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ARD_O; -- A(lsb)->S; SP-1; (two byte instruction)
+ when SAV_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & XRD_O; -- X->S; SP-1; (two byte instruction)
+ when SAV_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & YRD_O; -- Y->S; SP-1; (two byte instruction)
+ when SAV_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & BRD_O; -- B->S; SP-1; (two byte instruction)
+ when SAV_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & DRM_O; -- D (msb) ->S; SP-1; (two byte instruction)
+ when SAV_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & SDW_R & DRD_O; -- D (lsb) ->S; SP-1; (two byte instruction)
+
+ -- RST (in emulation mode RST pulls ALWAYS AXY 8 bit registers)
+ when RST_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1 (two byte instruction)
+ when RST_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- S->O (lsb); SP+1
+ when RST_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & DLS_R & EXM_O; -- S msb) & O (lsb) -> D;/SP+1
+ when RST_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & BLS_R & EXT_O; -- S->B; SP +1
+ when RST_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYU_R & EXT_O; -- S->Y; (two byte instruction)
+ when RST_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXU_R & EXT_O; -- S->X; (two byte instruction)
+ when RST_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SAU_R & EXT_O; -- S->A (lsb); SP+1 (two byte instruction)
+ when RST_OP7 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & ALM_R & EXT_O; -- S->A (msb); EI (two byte instruction)
+
+ -- PLD
+ when PLD_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLD_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OSU_R & EXT_O; -- S->O (lsb); SP+1
+ when PLD_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & D16_R & EXM_O; -- S msb) & O (lsb) -> D;
+
+ -- PLA
+ when PLA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- S->A; EI
+
+ -- PLX
+ when PLX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- S->X; EI
+
+ -- PLY
+ when PLY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- S->Y; EI
+
+ -- PLR (in emulation mode PLR pulls ALWAYS XY 8 bit registers and A as 16 bit register)
+ when PLR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1 (two byte instruction)
+ when PLR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SYU_R & EXT_O; -- S->Y; (two byte instruction)
+ when PLR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SXU_R & EXT_O; -- S->X; (two byte instruction)
+ when PLR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SAU_R & EXT_O; -- S->A (lsb); SP+1 (two byte instruction)
+ when PLR_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & WDC_P & NOP_A & ALM_R & EXT_O; -- S->A (msb); EI (two byte instruction)
+
+ -- RTI
+ when RTI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- PC->MEM; MP=01XX (STACK)
+ when RTI_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & PLD_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; MEM->P; SP +1
+ when RTI_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB PC->O; SP +1;
+ when RTI_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTI_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; MSB->MP; EI
+
+ -- RTS
+ when RTS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTS_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB->O;
+ when RTS_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTS_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MEM->PC
+ when RTS_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC+1; PC->MEM; EI
+
+ -- ASL (A)
+ when ASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHL_A & ALL_R & ARD_O; -- A SHIFT LEFT; EI
+
+ -- LSR (A)
+ when LSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & SHR_A & ALL_R & ARD_O; -- A SHIFT RIGHT; EI
+
+ -- ROL (A)
+ when ROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROL_A & ALL_R & ARD_O; -- A ROTATE LEFT; EI
+
+ -- ROR (A)
+ when ROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLC_P & ROR_A & ALL_R & ARD_O; -- A ROTATE RIGHT; EI
+
+ -- EXT (A)
+ when EXT_OP0 => q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- NOP; EI (two byte instruction)
+
+ -- NEG (A)
+ when NEG_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NEG_A & ALL_R & ARD_O; -- negates A (lsb); EI (two byte instruction)
+
+ -- XYX
+ when XYX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & XRD_O; -- X->O; (two byte instruction)
+ when XYX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & XLL_R & YRD_O; -- Y->X;
+ when XYX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & YLL_R & ORD_O; -- O->Y; EI
+
+ -- XAX
+ when XAX_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & XRD_O; -- X->O; (two byte instruction)
+ when XAX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & XLL_R & ARD_O; -- A->X;
+ when XAX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & ALL_R & ORD_O; -- O->A; EI
+
+ -- XAY
+ when XAY_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & YRD_O; -- Y->O; (two byte instruction)
+ when XAY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & YLL_R & ARD_O; -- A->Y;
+ when XAY_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLW_P & NOP_A & ALL_R & ORD_O; -- O->A; EI
+
+ -- TCS
+ when TCS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & S16_R & ARD_O; -- C->S;
+
+ -- TSC
+ when TSC_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & SRD_O; -- S->C;
+
+ -- XCE
+ when XCE_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & XCE_P & NOP_A & NOP_R & EXT_O; -- E-<>C; EI
+
+ -- WDM
+ when WDM_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDM_P & NOP_A & NOP_R & EXT_O; -- set two byte instruction bit
+
+ -- PHK
+ when PHK_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- K->S; SP-1; EI
+
+ -- PHB
+ when PHB_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & BRD_O; -- B->S; SP-1; EI
+
+ -- PLB
+ when PLB_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MP; SP+1
+ when PLB_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADSP & NOP_PC & NOP_M & FLD_P & NOP_A & BLD_R & EXT_O; -- S->B; EI
+
+ -- RTL
+ when RTL_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTL_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; LSB->O;
+ when RTL_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- SP->MEM; SP +1
+ when RTL_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MSB->O;
+ when RTL_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SUP_R & EXT_O; -- MP->MEM; SP +1;
+ when RTL_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADSP & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; MEM->PBR;
+ when RTL_OP6 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC+1; PC->MEM; EI
+
+ -- XBA
+ when XBA_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLD_P & NOP_A & A16_R & ARM_O; -- swap A<->B; EI
+
+ -- WAI
+ when WAI_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & WAI_R & EXT_O; -- set WAI flipflop
+ when WAI_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ -- STP
+ when STP_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & STP_R & EXT_O; -- set STP flipflop
+ when STP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ ------------------------------------
+ -- IMMEDIATE --
+ ------------------------------------
+ -- LDA #xx
+ when IMLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MEM->A; PC +1; EI
+
+ -- LDX #xx
+ when IMLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MEM->X; PC +1; EI
+
+ -- LDY #yy
+ when IMLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MEM->Y; PC +1; EI
+
+ -- ADC #xx (immediate)
+ when IMADC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; PC +1; EI
+ when IMADC_OP1 => q <= BCD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- SBC #xx (immediate)
+ when IMSBC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-EXT; PC +1; EI
+ when IMSBC_OP1 => q <= BCD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A-BCD ADJ (DAA); PC +1; EI
+
+ -- CMP #xx (immediate)
+ when IMCMP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; PC +1; EI
+
+ -- CPX #xx (immediate)
+ when IMCPX_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-MEM; PC +1; EI
+
+ -- CPY #xx (immediate)
+ when IMCPY_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-MEM; PC +1; EI
+
+ -- AND #xx (immediate)
+ when IMAND_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A AND MEM -> A; PC +1;
+
+ -- ORA #xx (immediate)
+ when IMORA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A OR MEM -> A; PC +1;
+
+ -- EOR #xx (immediate)
+ when IMEOR_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A XOR MEM -> A; PC +1;
+
+ -- BIT #xx (immediate)
+ when IMBIT_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & LDZ_P & BIT_A & NOP_R & ARD_O; -- A AND MEM; PC +1;
+
+ -- SEP #xx (immediate)
+ when IMSEP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & SEP_P & OR_A & ALL_R & ARD_O; -- P = P OR MEM; PC +1;
+
+ -- REP #xx (immediate)
+ when IMREP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & INC_PC & NOP_M & REP_P & OR_A & ALL_R & ARD_O; -- P = P AND NOT MEM; PC +1;
+
+ ------------------------------------
+ -- ZERO PAGE --
+ ------------------------------------
+ -- LDA $xx (zero page)
+ when ZPLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; PC+1; EI
+
+ -- LDX $xx (zero page)
+ when ZPLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; PC+1; EI
+
+ -- LDY $xx (zero page)
+ when ZPLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLDY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; PC+1; EI
+
+ -- STA $xx (zero page)
+ when ZPSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1; EI
+
+ -- STX $xx (zero page)
+ when ZPSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; PC+1; EI
+
+ -- STY $xx (zero page)
+ when ZPSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; PC+1; EI
+
+ -- STZ $xx (zero page)
+ when ZPSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSTZ_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; PC+1; EI
+
+ -- ADC $xx (zero page)
+ when ZPADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+MEM; EI
+ when ZPADC_OP2 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- SBC $xx (zero page)
+ when ZPSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-MEM; EI
+ when ZPSBC_OP2 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A-BCD ADJ (DAS); PC +1; EI
+
+ -- CMP $xx (zeropage)
+ when ZPCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; EI
+
+ -- CPX $xx (zeropage)
+ when ZPCPX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCPX_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-MEM; EI
+
+ -- CPY $xx (zeropage)
+ when ZPCPY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPCPY_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-MEM; EI
+
+ -- AND $xx (zeropage)
+ when ZPAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+
+ -- ORA $xx (zeropage)
+ when ZPORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+
+ -- EOR $xx (zeropage)
+ when ZPEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+
+ -- BIT $xx (zero page)
+ when ZPBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPBIT_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & INC_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- MP->MEM; MEM->ALU; PC+1; EI
+
+ -- ASL $xx (zero page)
+ when ZPASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPASL_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPASL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT;
+ when ZPASL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- LSR $xx (zero page)
+ when ZPLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPLSR_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPLSR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT;
+ when ZPLSR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- ROL $xx (zero page)
+ when ZPROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPROL_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPROL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT;
+ when ZPROL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- ROR $xx (zero page)
+ when ZPROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPROR_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPROR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT;
+ when ZPROR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- INC $xx (zero page)
+ when ZPINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPINC_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPINC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ when ZPINC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- DEC $xx (zero page)
+ when ZPDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPDEC_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPDEC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ when ZPDEC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- TSB $xx (zero page)
+ when ZPTSB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPTSB_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPTSB_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ when ZPTSB_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & TSB_A & OLD_R & ARD_O; -- A OR O -> O
+ when ZPTSB_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ -- TRB $xx (zero page)
+ when ZPTRB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when ZPTRB_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1; EI
+ when ZPTRB_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ when ZPTRB_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & TRB_A & OLD_R & ARD_O; -- A NAND O -> O
+ when ZPTRB_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1; EI
+
+ ------------------------------------
+ -- ZERO PAGE,X --
+ ------------------------------------
+ -- LDA $xx,X (zero page indexed)
+ when ZXLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- LDY $xx,X (zero page indexed)
+ when ZXLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLDY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; EI
+
+ -- STA $xx,X (zero page indexed)
+ when ZXSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- STY $xx,X (zero page indexed)
+ when ZXSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTY_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; EI
+
+ -- STZ $xx,X (zero page indexed)
+ when ZXSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSTZ_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; X->MEM; EI
+
+ -- ADC $xx,X (zero page indexed)
+ when ZXADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+MEM; EI
+ when ZXADC_OP2 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); EI
+
+ -- SBC $xx,X (zero page indexed)
+ when ZXSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-MEM; EI
+ when ZXSBC_OP2 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A-BCD ADJ (DAS); EI
+
+ -- CMP $xx,X (zero page indexed)
+ when ZXCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-MEM; EI
+
+ -- AND $xx,X (zero page indexed)
+ when ZXAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+
+ -- ORA $xx,X (zero page indexed)
+ when ZXORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+
+ -- EOR $xx,X (zero page indexed)
+ when ZXEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+
+ -- ASL $xx,X (zero page indexed)
+ when ZXASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXASL_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXASL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT;
+ when ZXASL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- LSR $xx,X (zero page indexed)
+ when ZXLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXLSR_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXLSR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT;
+ when ZXLSR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- ROL $xx,X (zero page indexed)
+ when ZXROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXROL_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXROL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT;
+ when ZXROL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- ROR $xx,X (zero page indexed)
+ when ZXROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXROR_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXROR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT;
+ when ZXROR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- INC $xx,X (zero page indexed)
+ when ZXINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXINC_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXINC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ when ZXINC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- DEC $xx,X (zero page indexed)
+ when ZXDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXDEC_OP1 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O;
+ when ZXDEC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ when ZXDEC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- BIT $xx,X (zero page indexed)
+ when ZXBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZXBIT_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- A = A AND MEM; EI
+
+ ------------------------------------
+ -- ZERO PAGE,Y --
+ ------------------------------------
+ -- LDX $xx,Y (zero page indexed)
+ when ZYLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZYLDX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADDI & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; EI
+
+ -- STX $xx,Y (zero page indexed)
+ when ZYSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & DOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+=D+O+X; PC+1;
+ when ZYSTX_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADDI & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; EI
+
+ ------------------------------------
+ -- INDIRECT --
+ ------------------------------------
+ -- JMP ($xxxx) (indirect)
+ when INJMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when INJMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when INJMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MEM->PC; O->PC; EI
+
+ -- JML ($xxxx) (indirect)
+ when INJML_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when INJML_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when INJML_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJML_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MP->MEM; MEM->O; MP+1
+ when INJML_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PBR; EI
+
+ ------------------------------------
+ -- INDIRECT,Y --
+ ------------------------------------
+ -- LDA ($xx),Y (zeropage - indirect - indexed)
+ when IYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYLDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYLDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA ($xx),Y (zeropage - indirect - indexed)
+ when IYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYSTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- ADC ($xx),Y (zeropage - indirect - indexed)
+ when IYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+
+ -- SBC ($xx),Y (zeropage - indirect - indexed)
+ when IYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+
+ -- CMP ($xx),Y (zeropage - indirect - indexed)
+ when IYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+
+ -- AND ($xx),Y (zeropage - indirect - indexed)
+ when IYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+
+ -- ORA ($xx),Y (zeropage - indirect - indexed)
+ when IYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+
+ -- EOR ($xx),Y (zeropage - indirect - indexed)
+ when IYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when IYEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when IYEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ABY_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O+Y->MP
+ when IYEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+
+ ------------------------------------
+ -- INDIRECT,X --
+ ------------------------------------
+ -- LDA ($xx,X) (zero page - indexed - indirect)
+ when IXLDA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXLDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI=1
+
+ -- STA ($xx,X) (zero page - indexed - indirect)
+ when IXSTA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- A->MEM; EI=1
+
+ -- AND ($xx,X) (zero page - indexed - indirect)
+ when IXAND_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- MP->MEM; A=A AND MEM; EI=1
+
+ -- ORA ($xx,X) (zero page - indexed - indirect)
+ when IXORA_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- MP->MEM; A=A OR MEM; EI=1
+
+ -- EOR ($xx,X) (zero page - indexed - indirect)
+ when IXEOR_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+
+ -- ADC ($xx,X) (zero page - indexed - indirect)
+ when IXADC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB;
+ when IXADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+ when IXADC_OP4 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- SBC ($xx,X) (zero page - indexed - indirect)
+ when IXSBC_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+ when IXSBC_OP4 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- CMP ($xx,X) (zero page - indexed - indirect)
+ when IXCMP_OP0 => q <= EXT_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ZPL_M & NOP_P & SWC_A & NOP_R & XRD_O; -- ZP+X->MP; PC+1
+ when IXCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- O<=LSB; MP+=1
+ when IXCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ALL_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP<=MSB & LSB (O)
+ when IXCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A=A XOR MEM; EI=1
+
+ -- JMP ($xxxx,X) (absolute indexed - indirect)
+ when IXJMP_OP0 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when IXJMP_OP1 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ALL_M & AUC_P & SWC_A & NOP_R & XRD_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when IXJMP_OP2 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ICC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MEM->A; MP_MSB+CARRY, EI
+ when IXJMP_OP3 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when IXJMP_OP4 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- JSR ($xxxx,X) (absolute indexed - indirect)
+ when IXJSR_OP0 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when IXJSR_OP1 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when IXJSR_OP2 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when IXJSR_OP3 => q <= ORD_D &'1'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ALL_M & AUC_P & SWC_A & NOP_R & XRD_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when IXJSR_OP4 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when IXJSR_OP5 => q <= ORD_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ ------------------------------------
+ -- ABSOLUTE --
+ ------------------------------------
+ -- LDA $xxxx (absolute)
+ when ABLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; PC+1
+
+ -- LDX $xxxx (absolute)
+ when ABLDX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; PC+1
+
+ -- LDY $xxxx (absolute)
+ when ABLDY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLDY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLDY_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->Y; PC+1
+
+ -- STA $xxxx (absolute)
+ when ABSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+
+ -- STX $xxxx (absolute)
+ when ABSTX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & XRD_O; -- MP->MEM; X->MEM; PC+1
+
+ -- STY $xxxx (absolute)
+ when ABSTY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTY_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & YRD_O; -- MP->MEM; Y->MEM; PC+1
+
+ -- STZ $xxxx (absolute)
+ when ABSTZ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSTZ_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSTZ_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; PC+1
+
+ -- JMP $xxxx (absolute)
+ when ABJMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- JSR $xxxx (absolute)
+ when ABJSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJSR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when ABJSR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when ABJSR_OP3 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LOD_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->PC; O->PC; EI
+
+ -- BIT $xxxx (absolute)
+ when ABBIT_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABBIT_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABBIT_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- MP->MEM; MEM->ALU; PC+1
+
+ -- ADC $xxxx (absolute)
+ when ABADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+ when ABADC_OP3 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- SBC $xxxx (absolute)
+ when ABSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABSBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A-EXT; EI
+ when ABSBC_OP3 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A-BCD ADJ (DAA); PC +1; EI
+
+ -- CMP $xxxx (absolute)
+ when ABCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+
+ -- CPX $xxxx (absolute)
+ when ABCPX_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCPX_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCPX_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & XRD_O; -- X-EXT; EI
+
+ -- CPY $xxxx (absolute)
+ when ABCPY_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABCPY_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABCPY_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & YRD_O; -- Y-EXT; EI
+
+ -- ORA $xxxx (absolute)
+ when ABORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+
+ -- AND $xxxx (absolute)
+ when ABAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+
+ -- EOR $xxxx (absolute)
+ when ABEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+
+ -- ASL $xxxx (absolute)
+ when ABASL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABASL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABASL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABASL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT;
+ when ABASL_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- LSR $xxxx (absolute)
+ when ABLSR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABLSR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABLSR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABLSR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT;
+ when ABLSR_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- ROL $xxxx (absolute)
+ when ABROL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABROL_OP1 => q <= ORD_D &'0'&'0'&'1'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABROL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABROL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT;
+ when ABROL_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- ROR $xxxx (absolute)
+ when ABROR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABROR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABROR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABROR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT;
+ when ABROR_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- INC $xxxx (absolute)
+ when ABINC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABINC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABINC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABINC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ when ABINC_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- DEC $xxxx (absolute)
+ when ABDEC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABDEC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABDEC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABDEC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ when ABDEC_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- TSB $xxxx (absolute)
+ when ABTSB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABTSB_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABTSB_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABTSB_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ when ABTSB_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & TSB_A & OLD_R & ARD_O; -- A OR O => O
+ when ABTSB_OP5 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ -- TRB $xxxx (absolute)
+ when ABTRB_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & LSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- LSB->MP; PC+1
+ when ABTRB_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MSB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MSB->MP; PC+1
+ when ABTRB_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; PC+1
+ when ABTRB_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & LDZ_P & AND_A & NOP_R & ARD_O; -- A AND O -> Z
+ when ABTRB_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & TRB_A & OLD_R & ARD_O; -- A NAND O => O
+ when ABTRB_OP5 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; PC+1
+
+ ------------------------------------
+ -- ABSOLUTE,X --
+ ------------------------------------
+ -- DMUX: ALU operand #2 multiplexer
+ -- | AI: effective address is indexed (X or Y)
+ -- | | VP: vector pull
+ -- | | | ML: memory lock
+ -- | | | | VPA: vali program address
+ -- | | | | | VDA: valid data address
+ -- | | | | | | EI: end of microcode sequence (the hidden extra cycle it's always executed after this microinstruction)
+ -- | | | | | | | W: read/write control
+ -- | | | | | | | | CLI: clear interrupt request
+ -- | | | | | | | | | PD: PC/MP address output multiplexer select
+ -- | | | | | | | | | | PCR: register PC (program counter)
+ -- | | | | | | | | | | | MPR: register MP (memory pointer)
+ -- | | | | | | | | | | | | P_OP: register P set/reset bit
+ -- | | | | | | | | | | | | | ALUOP: ALU operation
+ -- | | | | | | | | | | | | | | REGOP: registers load/increment/decrement etc.
+ -- | | | | | | | | | | | | | | | RSEL: registers output multiplexer select
+ -- | | | | | | | | | | | | | | | |
+ -- | | | | | | | | | | | | | | | |
+ -- DMUX AI VP ML VPA VDA EI W CLI PD PCR MPR P_OP ALUOP REGOP RSEL
+ -- LDA $xxxx,X (absolute indexed)
+ when AXLDA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLDA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLDA_OP2 => q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- LDY $xxxx,X (absolute indexed)
+ when AXLDY_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLDY_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLDY_OP2 => q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & YLL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA $xxxx,X (absolute indexed)
+ when AXSTA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSTA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSTA_OP2 => q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- STZ $xxxx,X (absolute indexed)
+ when AXSTZ_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSTZ_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSTZ_OP2 => q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & Z00_O; -- MP->MEM; 0->MEM; EI
+
+ -- ADC $xxxx,X (absolute indexed)
+ when AXADC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXADC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+
+ -- SBC $xxxx,X (absolute indexed)
+ when AXSBC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXSBC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXSBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT; EI
+
+ -- CMP $xxxx,X (absolute indexed)
+ when AXCMP_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXCMP_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXCMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM MP_MSB+CARRY, EI
+
+ -- INC $xxxx,X (absolute indexed)
+ when AXINC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXINC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXINC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXINC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & INC_A & OLD_R & ORD_O; -- O = O +1
+ when AXINC_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- DEC $xxxx,X (absolute indexed)
+ when AXDEC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXDEC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXDEC_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXDEC_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & DEC_A & OLD_R & ORD_O; -- O = O -1
+ when AXDEC_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- ASL $xxxx,X (absolute indexed)
+ when AXASL_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXASL_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXASL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXASL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHL_A & OLD_R & ORD_O; -- O SHIFT LEFT
+ when AXASL_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- LSR $xxxx,X (absolute indexed)
+ when AXLSR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXLSR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXLSR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXLSR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & SHR_A & OLD_R & ORD_O; -- O SHIFT RIGHT
+ when AXLSR_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- ROL $xxxx,X (absolute indexed)
+ when AXROL_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXROL_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXROL_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXROL_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROL_A & OLD_R & ORD_O; -- O ROTATE LEFT
+ when AXROL_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- ROR $xxxx,X (absolute indexed)
+ when AXROR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXROR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXROR_OP2 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O; EI
+ when AXROR_OP3 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & ROR_A & OLD_R & ORD_O; -- O ROTATE RIGHT
+ when AXROR_OP4 => q <= ORD_D &'0'&'0'&'1'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- MP->MEM; O->MEM; EI
+
+ -- AND $xxxx,X (absolute indexed)
+ when AXAND_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXAND_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- MP->MEM; EXT AND A; EI
+
+ -- ORA $xxxx,X (absolute indexed)
+ when AXORA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXORA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- MP->MEM; EXT OR A; EI
+
+ -- EOR $xxxx,X (absolute indexed)
+ when AXEOR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXEOR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- MP->MEM; EXT XOR A; EI
+
+ -- BIT $xxxx,X (absolute indexed)
+ when AXBIT_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AXBIT_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+X->MP_LSB; PC+1;
+ when AXBIT_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & BIT_A & NOP_R & ARD_O; -- MP->MEM; EXT BIT A; EI
+
+ ------------------------------------
+ -- ABSOLUTE,Y --
+ ------------------------------------
+ -- LDA $xxxx,X (absolute indexed)
+ when AYLDA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYLDA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYLDA_OP2 => q <= NOP_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- LDX $xxxx,Y (absolute indexed)
+ when AYLDX_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYLDX_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYLDX_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & ICC_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; MP_MSB+CARRY, EI
+ when AYLDX_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & XLL_R & EXT_O; -- MP->MEM; MEM->X; EI
+
+ -- STA $xxxx,Y (absolute indexed)
+ when AYSTA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYSTA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ICC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; MP_MSB+CARRY, EI
+ when AYSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- ADC $xxxx,Y (absolute indexed)
+ when AYADC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYADC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ICC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; A=A+EXT; MP_MSB+CARRY, EI
+ when AYADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+ when AYADC_OP4 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAA_A & ALL_R & ARD_O; -- A=A+BCD ADJ (DAA); PC +1; EI
+
+ -- SBC $xxxx,Y (absolute indexed)
+ when AYSBC_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYSBC_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYSBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ICC_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP->MEM; A=A-EXT; MP_MSB+CARRY, EI
+ when AYSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+ when AYSBC_OP4 => q <= BCD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & FLV_P & DAS_A & ALL_R & ARD_O; -- A=A-BCD ADJ (DAS); PC +1; EI
+
+ -- CMP $xxxx,Y (absolute indexed)
+ when AYCMP_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYCMP_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYCMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & ICC_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM MP_MSB+CARRY, EI
+ when AYCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+
+ -- AND $xxxx,Y (absolute indexed)
+ when AYAND_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYAND_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & ICC_M & FLD_P & AND_A & ALL_R & ARD_O; -- MP->MEM; EXT AND A; MP_MSB+CARRY, EI
+ when AYAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- MP->MEM; EXT AND A; EI
+
+ -- ORA $xxxx,Y (absolute indexed)
+ when AYORA_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYORA_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & ICC_M & FLD_P & OR_A & ALL_R & ARD_O; -- MP->MEM; EXT OR A; MP_MSB+CARRY, EI
+ when AYORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- MP->MEM; EXT OR A; EI
+
+ -- EOR $xxxx,Y (absolute indexed)
+ when AYEOR_OP0 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when AYEOR_OP1 => q <= NOP_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & ABY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->MP_MSB; MEM->O+Y->MP_LSB; PC+1;
+ when AYEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & ICC_M & FLD_P & XOR_A & ALL_R & ARD_O; -- MP->MEM; EXT XOR A; MP_MSB+CARRY, EI
+ when AYEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- MP->MEM; EXT XOR A; EI
+
+ --------------------------------------
+ -- ABSOLUTE LONG --
+ --------------------------------------
+ -- JML $xxxxxx (absolute long)
+ when ABJML_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJML_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ABJML_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PRB; EI
+
+ -- JSL $xxxxxx (absolute long)
+ when ABJSL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ABJSL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ABJSL_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & KRD_O; -- PBR->S; SP-1;
+ when ABJSL_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PHR_O; -- PCH->S; SP-1;
+ when ABJSL_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & PLR_O; -- PCL->S; SP-1;
+ when ABJSL_OP5 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & LML_PC & NOP_M & NOP_P & NOP_A & KLD_R & EXT_O; -- O->PC; EXT->PBR; EI
+
+ ------------------------------------
+ -- RELATIVE --
+ ------------------------------------
+ -- BRA xx
+ when BRA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BEQ xx
+ when BEQ_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BNE xx
+ when BNE_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BCC xx
+ when BCC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BCS xx
+ when BCS_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BVC xx
+ when BVC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BVS xx
+ when BVS_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BPL xx
+ when BPL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -- BMI xx
+ when BMI_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRA_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset;
+
+ -----------------------------------------
+ -- RELATIVE LONG --
+ -----------------------------------------
+ -- BRL xxxx
+ when BRL_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb offset);
+ when BRL_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'1'& RDE &'0'& ADPC & BRL_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- PC +1 + offset
+
+ -------------------------------
+ -- STACK --
+ -------------------------------
+ -- PEA xxxx
+ when PEA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; PC+1
+ when PEA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; PC+1
+ when PEA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PEA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ -- PEI xx
+ when PEI_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when PEI_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when PEI_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when PEI_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PEI_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ -- PER xxxx
+ when PER_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MP->MEM; MEM->O (lsb offset);
+ when PER_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (msb offset)
+ when PER_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & SWC_A & O16_R & PCR_O; -- O = O + PC
+ when PER_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & OMD_O; -- O (msb) ->S; SP-1;
+ when PER_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADSP & NOP_PC & NOP_M & NOP_P & NOP_A & SDW_R & ORD_O; -- O (lsb) ->S; SP-1;
+
+ ----------------------------------
+ -- DIRECT,Y --
+ ----------------------------------
+ -- LDA [$xx],Y (zeropage - direct long - indexed)
+ when DYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYLDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYLDA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYLDA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYLDA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYLDA_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA [$xx],Y (zeropage - indirect long - indexed)
+ when DYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYSTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYSTA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYSTA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYSTA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYSTA_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- ADC [$xx],Y (zeropage - indirect long - indexed)
+ when DYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYADC_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYADC_OP5 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+
+ -- SBC [$xx],Y (zeropage - indirect long - indexed)
+ when DYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYSBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYSBC_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYSBC_OP5 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+
+ -- CMP [$xx],Y (zeropage - indirect long - indexed)
+ when DYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYCMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYCMP_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYCMP_OP5 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+
+ -- AND [$xx],Y (zeropage - indirect long - indexed)
+ when DYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYAND_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYAND_OP5 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+
+ -- ORA [$xx],Y (zeropage - indirect long - indexed)
+ when DYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYORA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYORA_OP5 => q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+
+ -- EOR [$xx],Y (zeropage - indirect long - indexed)
+ when DYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DYEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DYEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DYEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DYEOR_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & ADY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when DYEOR_OP5 => q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+
+ --------------------------------
+ -- DIRECT --
+ --------------------------------
+ -- LDA [$xx] (zeropage - direct long)
+ when DILDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DILDA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DILDA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DILDA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DILDA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA [$xx] (zeropage - indirect long)
+ when DISTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DISTA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DISTA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DISTA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DISTA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; EI
+
+ -- ADC [$xx] (zeropage - indirect long)
+ when DIADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIADC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIADC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- MP->MEM; A=A+EXT
+
+ -- SBC [$xx] (zeropage - indirect long)
+ when DISBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DISBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DISBC_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DISBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DISBC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- MP->MEM; A=A-EXT
+
+ -- CMP [$xx] (zeropage - indirect long)
+ when DICMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DICMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DICMP_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DICMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DICMP_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- MP->MEM; A-MEM; EI
+
+ -- AND [$xx] (zeropage - indirect long)
+ when DIAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIAND_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIAND_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A = A AND MEM; EI
+
+ -- ORA [$xx] (zeropage - indirect long)
+ when DIORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIORA_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIORA_OP4 => q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A = A OR MEM; EI
+
+ -- EOR [$xx] (zeropage - indirect long)
+ when DIEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & ZPL_M & NOP_P & NOP_A & NOP_R & EXT_O; -- ZP->MP; PC+1
+ when DIEOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & INC_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; (LSB POINTER)
+ when DIEOR_OP2 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MEM->O; (MSB POINTER)
+ when DIEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MEM->B
+ when DIEOR_OP4 => q <= EXT_D &'1'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A = A XOR MEM; EI
+
+ ----------------------------------------
+ -- ABSOLUTE LONG --
+ ----------------------------------------
+ -- LDA $xxxxxx (absolute long)
+ when ALLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALLDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A
+
+ -- STA $xxxxxx (absolute long)
+ when ALSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM;
+
+ -- ADC $xxxxxx (absolute long)
+ when ALADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALADC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- SBC $xxxxxx (absolute long)
+ when ALSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALSBC_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- CMP $xxxxxx (absolute long)
+ when ALCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALCMP_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+
+ -- ORA $xxxxxx (absolute long)
+ when ALORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALORA_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+
+ -- AND $xxxxxx (absolute long)
+ when ALAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALAND_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+
+ -- EOR $xxxxxx (absolute long)
+ when ALEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when ALEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when ALEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when ALEOR_OP3 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+
+ ------------------------------------------
+ -- ABSOLUTE LONG,X --
+ ------------------------------------------
+ -- LDA $xxxxxx,X (absolute long indexed X)
+ when AILDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AILDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AILDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AILDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AILDA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A (lsb);
+
+ -- STA $xxxxxx,X (absolute long indexed X)
+ when AISTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AISTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AISTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AISTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AISTA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+
+ -- ADC $xxxxxx,X (absolute long indexed X)
+ when AIADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIADC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIADC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- SBC $xxxxxx,X (absolute long indexed X)
+ when AISBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AISBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AISBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AISBC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AISBC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- CMP $xxxxxx,X (absolute long indexed X)
+ when AICMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AICMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AICMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AICMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AICMP_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+
+ -- ORA $xxxxxx,X (absolute long indexed X)
+ when AIORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIORA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIORA_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+
+ -- AND $xxxxxx,X (absolute long indexed X)
+ when AIAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIAND_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIAND_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+
+ -- EOR $xxxxxx,X (absolute long indexed X)
+ when AIEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; PC+1
+ when AIEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O; PC+1
+ when AIEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & MHB_M & NOP_P & NOP_A & NOP_R & EXT_O; -- HIGH->MP; PC+1
+ when AIEOR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & ADX_M & NOP_P & NOP_A & NOP_R & EXT_O; -- O+Y->MP (24 bit)
+ when AIEOR_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+
+ ----------------------------------------
+ -- STACK RELATIVE --
+ ----------------------------------------
+ -- LDA $xx,S (S + offset)
+ when SRLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA $xx,S (S + offset)
+ when SRSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+
+ -- ADC $xx,S (S + offset)
+ when SRADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRADC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- SBC $xx,S (S + offset)
+ when SRSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRSBC_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- CMP $xx,S (S + offset)
+ when SRCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRCMP_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+
+ -- ORA $xx,S (S + offset)
+ when SRORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRORA_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+
+ -- AND $xx,S (S + offset)
+ when SRAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SRAND_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+
+ -- EOR $xx,S (S + offset)
+ when SREOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SREOR_OP1 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+
+ -------------------------------------------------
+ -- STACK RELATIVE INDEXED Y --
+ -------------------------------------------------
+ -- LDA ($xx,S),Y
+ when SYLDA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYLDA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYLDA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYLDA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYLDA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & NOP_A & ALL_R & EXT_O; -- MP->MEM; MEM->A; EI
+
+ -- STA ($xx,S),Y
+ when SYSTA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYSTA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYSTA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYSTA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYSTA_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'1'& WRE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ARD_O; -- MP->MEM; A->MEM; PC+1
+
+ -- ADC ($xx,S),Y
+ when SYADC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYADC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYADC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYADC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYADC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUM_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- SBC ($xx,S),Y
+ when SYSBC_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYSBC_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYSBC_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYSBC_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYSBC_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLV_P & SUB_A & ALL_R & ARD_O; -- A=A+EXT; EI
+
+ -- CMP ($xx,S),Y
+ when SYCMP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYCMP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYCMP_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYCMP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYCMP_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLC_P & CMP_A & NOP_R & ARD_O; -- A-EXT; EI
+
+ -- ORA ($xx,S),Y
+ when SYORA_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYORA_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYORA_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYORA_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYORA_OP5 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & OR_A & ALL_R & ARD_O; -- A=A OR MEM; EI
+
+ -- AND ($xx,S),Y
+ when SYAND_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYAND_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYAND_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYAND_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYAND_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & AND_A & ALL_R & ARD_O; -- A=A AND MEM; EI
+
+ -- EOR ($xx,S),Y
+ when SYEOR_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & AOS_M & NOP_P & NOP_A & NOP_R & EXT_O; -- S+OFFSET->MP; PC+1
+ when SYEOR_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & INC_M & NOP_P & NOP_A & OLD_R & EXT_O; -- LSB->O; MP+1
+ when SYEOR_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADMP & NOP_PC & NOP_M & NOP_P & NOP_A & OMD_R & EXT_O; -- MSB->O;
+ when SYEOR_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADMP & NOP_PC & AOY_M & NOP_P & NOP_A & NOP_R & EXT_O; -- MP+O+Y
+ when SYEOR_OP4 => q <= EXT_D &'0'&'0'&'0'&'0'&'1'&'1'& RDE &'0'& ADMP & NOP_PC & NOP_M & FLD_P & XOR_A & ALL_R & ARD_O; -- A=A XOR MEM; EI
+
+ ------------------------------------
+ -- MOVE BLOCK --
+ ------------------------------------
+ when MBMVN_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (source)
+ when MBMVN_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADXR & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; read byte
+ when MBMVN_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (destination)
+ when MBMVN_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADYR & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O->MEM; write byte
+ when MBMVN_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MVN_R & EXT_O; -- X +1; Y +1; A -1;
+ when MBMVN_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & DE3_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- check for A = $FFFF
+
+ when MBMVP_OP0 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (source)
+ when MBMVP_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& RDE &'0'& ADXR & NOP_PC & NOP_M & NOP_P & NOP_A & OLD_R & EXT_O; -- MEM->O; read byte
+ when MBMVP_OP2 => q <= ORD_D &'0'&'0'&'0'&'1'&'0'&'0'& RDE &'0'& ADPC & INC_PC & NOP_M & NOP_P & NOP_A & BLD_R & EXT_O; -- MEM->DBR (destination)
+ when MBMVP_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'1'&'0'& WRE &'0'& ADYR & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & ORD_O; -- O->MEM; write byte
+ when MBMVP_OP4 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MVP_R & EXT_O; -- X -1; Y -1; A -1;
+ when MBMVP_OP5 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & DE3_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- check for A = $FFFF
+
+ ----------------------------------
+ -- MULTIPLY --
+ ----------------------------------
+ when MPU_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUI_R & EXT_O; -- load A/B & X on multiplier
+ when MPU_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUS_R & EXT_O; -- start multiplication (unsigned)
+ when MPU_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & MUF_P & NOP_A & MUL_R & EXT_O; -- load result on A/B and X
+ when MPU_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ when MPS_OP0 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MUI_R & EXT_O; -- load A/B & X on multiplier
+ when MPS_OP1 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & MSS_R & EXT_O; -- start multiplication (signed)
+ when MPS_OP2 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'0'& RDE &'0'& ADPC & NOP_PC & NOP_M & MSF_P & NOP_A & MUL_R & EXT_O; -- load result on A/B and X
+ when MPS_OP3 => q <= ORD_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & WDC_P & NOP_A & NOP_R & EXT_O; -- EI
+
+ when others => q <= NOP_D &'0'&'0'&'0'&'0'&'0'&'1'& RDE &'0'& ADPC & NOP_PC & NOP_M & NOP_P & NOP_A & NOP_R & EXT_O; -- EI
+ end case;
+ end if;
+ end process;
+end comb;
+
+
Index: trunk/mcseq.vhd
===================================================================
--- trunk/mcseq.vhd (nonexistent)
+++ trunk/mcseq.vhd (revision 2)
@@ -0,0 +1,40 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- opcode => microcode address generation
+entity mcseq is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ mc_nop: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ q: out STD_LOGIC_VECTOR(3 downto 0)
+ );
+end mcseq;
+
+architecture comb of mcseq is
+signal reg: STD_LOGIC_VECTOR(3 downto 0);
+begin
+ process(clk)
+ begin
+ if(clk'event and clk = '1')then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "0000";
+ else
+ if mc_nop = '1' then
+ reg <= "1111";
+ else
+ reg <= reg +1;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ q <= reg;
+end comb;
+
+
Index: trunk/mpr.vhd
===================================================================
--- trunk/mpr.vhd (nonexistent)
+++ trunk/mpr.vhd (revision 2)
@@ -0,0 +1,83 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit memory pointer address register
+entity mpr is
+ port( clk: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ dbr_ld: in STD_LOGIC;
+ c: in STD_LOGIC;
+ fc: in STD_LOGIC_VECTOR(4 downto 0);
+ din_l: in STD_LOGIC_VECTOR(7 downto 0);
+ din_h: in STD_LOGIC_VECTOR(7 downto 0);
+ dbr: in STD_LOGIC_VECTOR(7 downto 0);
+ dr: in STD_LOGIC_VECTOR(15 downto 0);
+ op: in STD_LOGIC_VECTOR(15 downto 0);
+ xr: in STD_LOGIC_VECTOR(15 downto 0);
+ yr: in STD_LOGIC_VECTOR(15 downto 0);
+ sr: in STD_LOGIC_VECTOR(15 downto 0);
+ v: in STD_LOGIC_VECTOR(7 downto 0);
+ dout: out STD_LOGIC_VECTOR(23 downto 0)
+ );
+end mpr;
+
+architecture rtl of mpr is
+constant NOP_M: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- no operation
+constant LSB_M: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- load lsb
+constant MSB_M: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- load msb
+constant INC_M: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- increment
+constant DEC_M: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- decrement
+constant VEC_M: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- load vector
+constant ZPL_M: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- load ZEROPAGE
+constant ALL_M: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- load all 16 bit register
+constant ICC_M: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- increment MSB with carry
+constant DOX_M: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- add D + offset + X
+constant DOY_M: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- add D + offset + Y
+constant AOS_M: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- add S + offset
+constant ABX_M: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- add opr+X
+constant ABY_M: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- add opr+Y
+constant ADX_M: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- add X
+constant ADY_M: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- add Y
+constant MHB_M: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- load high byte
+constant AOY_M: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- add opr+Y and concatenates SBR
+
+signal reg: STD_LOGIC_VECTOR(23 downto 0);
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if dbr_ld = '1' then -- on every opcode fetch the high byte of MPR is loaded with DBR value
+ reg(23 downto 16) <= dbr;
+ end if;
+ case fc is
+ when LSB_M => reg(7 downto 0) <= din_l; reg(23 downto 8) <= reg(23 downto 8); -- load LSB (bit 7..0)
+ when MSB_M => reg(15 downto 8) <= din_h; reg(7 downto 0) <= reg(7 downto 0); reg(23 downto 16) <= reg(23 downto 16); -- load MSB (bit 15..8)
+ when ALL_M => reg(15 downto 8) <= din_h; reg(7 downto 0) <= din_l; reg(23 downto 16) <= reg(23 downto 16); -- load LSB/MSB (bit 15..0)
+ when INC_M => reg <= reg +1; -- increment 24 bit
+ when DEC_M => reg <= reg -1; -- decrement 24 bit
+ when VEC_M => reg <= "0000000011111111" & v; -- 0x00FFXX load vector
+ when ZPL_M => reg(15 downto 0) <= dr + ("00000000" & din_l); -- 0x00XXXX zeropage operation (D + 0x0000XX)
+ when ICC_M => reg(15 downto 8) <= reg(15 downto 8) + c; -- increment MSB for indexed addressing mode
+ when DOX_M => reg(15 downto 0) <= dr + ("00000000" & din_l) + xr; -- D+offset+X
+ when DOY_M => reg(15 downto 0) <= dr + ("00000000" & din_l) + yr; -- D+offset+Y
+ when AOS_M => reg(15 downto 0) <= sr + ("00000000" & din_h); reg(23 downto 16) <= "00000000"; -- S+offset
+ when ABX_M => reg(15 downto 0) <= din_h & op(7 downto 0) + xr; -- +O+X
+ when ABY_M => reg(15 downto 0) <= din_h & op(7 downto 0) + yr; -- +O+Y
+ when ADX_M => reg <= reg + ("00000000" & xr); -- +X (24 bit SUM)
+ when ADY_M => reg <= reg + ("00000000" & yr); -- +Y (24 bit SUM)
+ when MHB_M => reg(23 downto 16) <= din_h; reg(15 downto 0) <= op; -- load high byte (bit 23..16)
+ when AOY_M => reg <= (dbr & op) + ("00000000" & yr); -- O+Y (24 bit SUM)
+ when others => reg <= reg;
+ end case;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/multiplier.vhd
===================================================================
--- trunk/multiplier.vhd (nonexistent)
+++ trunk/multiplier.vhd (revision 2)
@@ -0,0 +1,143 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16X16->32 bit multiplier signed/unsigned
+entity multiplier is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ init: in STD_LOGIC;
+ start_u: in STD_LOGIC;
+ start_s: in STD_LOGIC;
+ mpcand: in STD_LOGIC_VECTOR(15 downto 0);
+ mplier: in STD_LOGIC_VECTOR(15 downto 0);
+ busy: out STD_LOGIC;
+ res_lsb: out STD_LOGIC_VECTOR(15 downto 0);
+ res_msb: out STD_LOGIC_VECTOR(15 downto 0);
+ z_flg: out STD_LOGIC;
+ n_flg: out STD_LOGIC
+ );
+end multiplier;
+
+architecture rtl of multiplier is
+type state_type is (s0, s1, s2, s3, s4);
+signal state: state_type;
+signal s: STD_LOGIC;
+signal a: STD_LOGIC_VECTOR(31 downto 0);
+signal b: STD_LOGIC_VECTOR(15 downto 0);
+signal accum: STD_LOGIC_VECTOR(31 downto 0);
+signal sign_a: STD_LOGIC;
+signal sign_b: STD_LOGIC;
+signal mpy: STD_LOGIC_VECTOR(1 downto 0);
+
+begin
+ mpy <= start_s & start_u;
+ process(clk,clr)
+ begin
+ if (clr = '1') THEN
+ state <= s0;
+ elsif rising_edge(clk) then
+ case state is
+ -- wait for init
+ when s0 =>
+ if clr = '1' or init = '1' then
+ s <= '0';
+ a <= "0000000000000000" & mpcand;
+ b <= mplier;
+ accum <= (others => '0');
+ state <= s0;
+ else
+ a <= a;
+ b <= b;
+ accum <= accum;
+ sign_a <= sign_a;
+ sign_b <= sign_a;
+ case mpy is
+ when "01" => s <= '1'; -- start multiply unsigned
+ state <= s1;
+ when "10" => s <= '1'; -- start multiply signed
+ state <= s2;
+ when others => s <= '0';
+ state <= s0;
+ end case;
+ end if;
+
+ -- multiply unsigned
+ when s1 =>
+ sign_a <= sign_a;
+ sign_b <= sign_b;
+ if b = 0 then -- if finished
+ accum <= accum;
+ s <= '0';
+ state <= s0;
+ else
+ if b(0) = '1' then -- if bit #0 = 1 sum the (left) shifted multiplicand to the accumulator
+ accum <= accum + a;
+ else
+ accum <= accum;
+ end if;
+ s <= '1';
+ a <= a(30 downto 0) & '0'; -- shift left moltiplicand
+ b <= '0' & b(15 downto 1); -- shift right multiplier
+ state <= s1;
+ end if;
+
+ -- multiply signed
+ when s2 =>
+ sign_a <= a(15); -- save sign of factors
+ sign_b <= b(15);
+ a <= "00000000000000000" & mpcand(14 downto 0); -- reload factors without sign bits
+ b <= '0' & mplier(14 downto 0);
+ state <= s3;
+
+ when s3 =>
+ sign_a <= sign_a;
+ sign_b <= sign_b;
+ if b = 0 then -- if finished
+ accum <= accum;
+ if (sign_a = '1' and sign_b = '0') or (sign_a = '0' and sign_b = '1') then -- if two's complement is needed
+ s <= '1';
+ state <= s4;
+ else
+ s <= '0';
+ state <= s0;
+ end if;
+ else
+ if b(0) = '1' then -- if bit #0 = 1 sum the (left) shifted multiplicand to the accumulator
+ accum <= accum + a;
+ else
+ accum <= accum;
+ end if;
+ s <= '1';
+ a <= a(30 downto 0) & '0'; -- shift left moltiplicand
+ b <= '0' & b(15 downto 1); -- shift right multiplier
+ state <= s3;
+ end if;
+
+ when s4 =>
+ accum <= 0 - accum; -- two's complement
+ s <= '0';
+ state <= s0;
+
+ -- illegal state covering
+ when others =>
+ a <= a;
+ b <= b;
+ sign_a <= sign_a;
+ sign_b <= sign_b;
+ accum <= accum;
+ s <= '0';
+ state <= s0;
+
+ end case;
+ end if;
+ end process;
+ res_lsb <= accum(15 downto 0);
+ res_msb <= accum(31 downto 16);
+ z_flg <= '1' when accum = "00000000000000000000000000000000" else '0';
+ n_flg <= accum(31);
+ busy <= s;
+end rtl;
+
+
Index: trunk/oper.vhd
===================================================================
--- trunk/oper.vhd (nonexistent)
+++ trunk/oper.vhd (revision 2)
@@ -0,0 +1,49 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit operand hold operand register
+entity oper is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC;
+ ld_msb: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end oper;
+
+architecture rtl of oper is
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "0000000000000000";
+ else
+ if ld = '1' then
+ reg <= din;
+ end if;
+ if ld_lsb = '1' then
+ reg(7 downto 0) <= din(7 downto 0);
+ reg(15 downto 8) <= reg(15 downto 8);
+ end if;
+ if ld_msb = '1' then
+ reg(15 downto 8) <= din(7 downto 0);
+ reg(7 downto 0) <= reg(7 downto 0);
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/opr.vhd
===================================================================
--- trunk/opr.vhd (nonexistent)
+++ trunk/opr.vhd (revision 2)
@@ -0,0 +1,62 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit opcode hold register
+entity opr is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(7 downto 0);
+ brk_f: out STD_LOGIC;
+ cop_f: out STD_LOGIC;
+ dout: out STD_LOGIC_VECTOR(7 downto 0)
+ );
+end opr;
+
+architecture rtl of opr is
+constant BRK_OP: STD_LOGIC_VECTOR(7 downto 0) := "00000000"; -- 0x00 BRK/IRQ/NMI/RES
+constant COP_OP: STD_LOGIC_VECTOR(7 downto 0) := "00000010"; -- 0x02 COP
+signal reg: STD_LOGIC_VECTOR(7 downto 0);
+signal bf: STD_LOGIC;
+signal cf: STD_LOGIC;
+begin
+ process(clk)
+ begin
+ if(clk'event and clk = '1')then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then -- clr serves to force an "BRK" opcode on RES-NMI-IRQ interrupt
+ reg <= BRK_OP;
+ bf <= '0';
+ else
+ if ld = '1' then
+ reg <= din;
+ if din = BRK_OP then -- check if the opcode "BRK" was loaded as normal instruction or it was forced
+ bf <= '1'; -- by an interrupt request, thus in order to set properly the flag "B" of status register
+ cf <= '0';
+ else
+ if din = COP_OP THEN
+ cf <= '1';
+ else
+ cf <= '0';
+ end if;
+ bf <= '0';
+ end if;
+ else
+ reg <= reg;
+ bf <= bf;
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ brk_f <= bf;
+ cop_f <= cf;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/pcr.vhd
===================================================================
--- trunk/pcr.vhd (nonexistent)
+++ trunk/pcr.vhd (revision 2)
@@ -0,0 +1,91 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit program counter register "PC"
+entity pcr is
+ port( clk: in STD_LOGIC;
+ i: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ brk_op: in STD_LOGIC; -- forced BRK (by interrupt request)
+ branch_flg: in STD_LOGIC; -- branch flag
+ mov_f: in STD_LOGIC; -- MVN/MVP end transfer
+ fc: in STD_LOGIC_VECTOR(3 downto 0);
+ din1: in STD_LOGIC_VECTOR(7 downto 0);
+ din2: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end pcr;
+
+architecture rtl of pcr is
+constant NOP_P: STD_LOGIC_VECTOR(3 downto 0) := "0000"; -- PC no operation
+constant LSB_P: STD_LOGIC_VECTOR(3 downto 0) := "0001"; -- PC load lsb
+constant MSB_P: STD_LOGIC_VECTOR(3 downto 0) := "0010"; -- PC load msb
+constant INC_P: STD_LOGIC_VECTOR(3 downto 0) := "0011"; -- PC increment by 1
+constant LOD_P: STD_LOGIC_VECTOR(3 downto 0) := "0100"; -- PC load lsb\msb (used by JMP\JSR instructions)
+constant LML_P: STD_LOGIC_VECTOR(3 downto 0) := "0101"; -- PC load lsb\msb from oper register (used for JML\JSL instructions)
+constant IN2_P: STD_LOGIC_VECTOR(3 downto 0) := "0110"; -- PC = PC +2 (BRK opcode)
+constant DE3_P: STD_LOGIC_VECTOR(3 downto 0) := "0111"; -- PC = PC -3 (MVN/MVP opcodes)
+constant BRA_P: STD_LOGIC_VECTOR(3 downto 0) := "1000"; -- PC branch
+constant BRL_P: STD_LOGIC_VECTOR(3 downto 0) := "1001"; -- PC branch long
+
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+
+begin
+
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if i = '1' then
+ reg <= reg +1;
+ else
+ case fc is
+ when LSB_P => reg(7 downto 0) <= din1; reg(15 downto 8) <= reg(15 downto 8);
+ when MSB_P => reg(15 downto 8) <= din1; reg(7 downto 0) <= reg(7 downto 0);
+ when INC_P => reg <= reg +1;
+ when LOD_P => reg(15 downto 8) <= din1; reg(7 downto 0) <= din2(7 downto 0);
+ when BRA_P =>
+ if branch_flg = '1' THEN -- if branch taken
+ if din1(7) = '0' THEN -- if branch forward
+ reg <= reg + "0000000000000001" + ("00000000" & din1);
+ else -- if branch backwards
+ reg <= reg + "0000000000000001" - ("00000000" & (0 - din1));
+ end if;
+ else -- if branch not taken
+ reg <= reg + "0000000000000001";
+ end if;
+ when BRL_P =>
+ if din1(7) = '0' THEN -- if branch forward
+ reg <= reg + "0000000000000001" + (din1 & din2(7 downto 0));
+ else -- if branch backwards
+ reg <= reg + "0000000000000001" - (0 - (din1 & din2(7 downto 0)));
+ end if;
+
+ when LML_P => reg <= din2;
+ when IN2_P =>
+ if brk_op = '1' then -- if BRK opcode PC=PC+2
+ reg <= reg +1; -- PC already incremented by 1 by cpufsm
+ else
+ reg <= reg;
+ end if;
+ when DE3_P =>
+ if mov_f = '0' then -- if MVN/MVP transfer not finished
+ reg <= reg - "0000000000000011";
+ else
+ reg <= reg;
+ end if;
+ when NOP_P => reg <= reg;
+ when others => reg <= reg;
+ end case;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/pr.vhd
===================================================================
--- trunk/pr.vhd (nonexistent)
+++ trunk/pr.vhd (revision 2)
@@ -0,0 +1,216 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit processor status register P
+-- NV1BDIZC
+-- 76543210
+-- ||||||||
+-- ||||||||--- C/E = carry/borrow flag (emulation bit: 1 = emulation mode, 0 = native mode)
+-- |||||||---- Z = zero flag
+-- ||||||----- I = interrupt mask
+-- |||||------ D = decimal/binary alu mode
+-- ||||------- B/X = index reg. select (1 = 8 bit, 0 = 16 bit) (B Break: 0 on stack after interrupt if E emulation mode = 1)
+-- |||-------- M = memory/acc. select (1 = 8 bit, 0 = 16 bit) (always 1 if E = 1)
+-- ||--------- V = overflow flag
+-- |---------- N = negative flag
+entity pr is
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- clear
+ fwait: in STD_LOGIC;
+ n: in STD_LOGIC; -- N input
+ v: in STD_LOGIC; -- V input
+ z: in STD_LOGIC; -- Z input
+ c: in STD_LOGIC; -- C input
+ mpy_z: in STD_LOGIC; -- Z input from multiplier
+ mpy_n: in STD_LOGIC; -- N input from multiplier
+ swi: in STD_LOGIC; -- software interrupt (BRK/COP opcode flag)
+ acr_in: in STD_LOGIC; -- auxiliary carry in
+ fc: in STD_LOGIC_VECTOR(4 downto 0); -- function code
+ din: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(7 downto 0); -- output
+ acr_out: out STD_LOGIC; -- auxiliary carry out
+ em: out STD_LOGIC; -- emulation (1)/native mode (0)
+ two_op: out STD_LOGIC -- two byte instruction
+ );
+end pr;
+
+architecture rtl of pr is
+constant NOP_P: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- PR no operation
+constant PLD_P: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- PR load
+constant FLD_P: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- NZ load
+constant FLC_P: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- NZC load
+constant FLV_P: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- NVZC load
+constant SEC_P: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- 1 => C
+constant CLC_P: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- 0 => C
+constant SEI_P: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- 1 => I
+constant CLI_P: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- 0 => I
+constant SED_P: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- 1 => D
+constant CLD_P: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- 0 => D
+constant CLV_P: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- 0 => V
+constant AUC_P: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- auc => ACR
+constant HAC_P: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- hold ACR
+constant SID_P: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- 1 => I/D
+constant LDZ_P: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- Z load
+constant XCE_P: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- E => C; C => E
+constant SEP_P: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- P = P OR din
+constant REP_P: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- P = P AND not din
+constant WDM_P: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- 1 => op_exp;
+constant WDC_P: STD_LOGIC_VECTOR(4 downto 0) := "10100"; -- 0 => op_exp;
+constant FLW_P: STD_LOGIC_VECTOR(4 downto 0) := "10101"; -- NZ load, 0 -> op_exp
+constant MUF_P: STD_LOGIC_VECTOR(4 downto 0) := "10110"; -- Z load from unsigned multplier
+constant MSF_P: STD_LOGIC_VECTOR(4 downto 0) := "10111"; -- NZ load from unsigned multplier
+
+signal reg: STD_LOGIC_VECTOR(7 downto 0);
+signal acr: STD_LOGIC; -- carry/borrow used for effective address calculation
+signal eb: STD_LOGIC; -- emulation/native bit
+signal op_exp: STD_LOGIC; -- two opcode bit
+signal swint: STD_LOGIC; -- bit 4 saved on stack when BRK/COP
+
+begin
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= "00110100"; -- on reset M,X,I = '1'
+ acr <= '0';
+ eb <= '1'; -- on reset set emulation mode
+ op_exp <= '0';
+ else
+ case fc is
+ when PLD_P => reg <= din; -- load NVMXDIZC
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when FLD_P => reg <= n & reg(6 downto 2) & z & reg(0); -- load NZ
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when FLC_P => reg <= n & reg(6 downto 2) & z & c; -- load NZC
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when FLV_P => reg <= n & v & reg(5 downto 2) & z & c; -- load NVZC
+ acr <= '0';
+ when SEC_P => reg <= reg or "00000001"; -- 1 => C
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when CLC_P => reg <= reg and "11111110"; -- 0 => C
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when CLI_P => reg <= reg and "11111011"; -- 0 => I
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when SED_P => reg <= reg or "00001000"; -- 1 => D
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when CLD_P => reg <= reg and "11110111"; -- 0 => D
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when LDZ_P => reg(1) <= z; -- z => Z
+ reg(7 downto 2) <= reg(7 downto 2);
+ reg(0) <= reg(0);
+ eb <= eb;
+ op_exp <= op_exp;
+ when SEI_P => reg(7 downto 3) <= reg(7 downto 3);
+ reg(2) <= '1'; -- 1 => I
+ reg(1 downto 0) <= reg(1 downto 0);
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when SID_P => reg(7 downto 4) <= reg(7 downto 4); -- set I and clear D decimal flag (used by interrupt sequence)
+ reg(3) <= '0'; -- 0 -> D
+ reg(2) <= '1'; -- 1 => I
+ reg(1 downto 0) <= reg(1 downto 0);
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when CLV_P => reg <= reg and "10111111"; -- 0 => V
+ acr <= acr;
+ eb <= eb;
+ op_exp <= op_exp;
+ when AUC_P => acr <= acr_in; -- store auxiliary carry (ACR)
+ reg <= reg;
+ eb <= eb;
+ op_exp <= op_exp;
+ when HAC_P => acr <= acr; -- holds auxiliary carry (ACR)
+ reg <= reg;
+ eb <= eb;
+ op_exp <= op_exp;
+ when XCE_P => eb <= reg(0); -- exchange C <=> E (switch emulation/native mode)
+ reg(0) <= eb;
+ reg(7 downto 1) <= reg(7 downto 1);
+ acr <= '0';
+ op_exp <= op_exp;
+ when SEP_P => reg <= reg or din; -- SEP
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when REP_P => reg <= reg and (not din); -- REP
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when WDM_P => op_exp <= '1'; -- set two byte opcode
+ reg <= reg;
+ acr <= '0';
+ eb <= eb;
+ when WDC_P => op_exp <= '0'; -- clear two byte opcode
+ reg <= reg;
+ acr <= '0';
+ eb <= eb;
+ when FLW_P => reg <= n & reg(6 downto 2) & z & reg(0); -- load NZ, 0 => op_exp
+ acr <= '0';
+ eb <= eb;
+ op_exp <= '0';
+ when MUF_P => reg <= "00" & reg(5 downto 2) & mpy_z & '0'; -- load Z from multiplier, C/VN=0
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when MSF_P => reg <= mpy_n & '0' & reg(5 downto 2) & mpy_z & '0'; -- load NZ from multiplier, CV=0
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ when others => reg <= reg;
+ acr <= '0';
+ eb <= eb;
+ op_exp <= op_exp;
+ end case;
+ if eb = '1' then -- in emulation mode M/X are always set to '1'
+ reg(5 downto 4) <= "11";
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ process(fc,reg(4),eb,swi)
+ begin
+ if fc = SID_P then
+ if eb = '0' then
+ swint <= reg(4);
+ else
+ swint <= swi; -- when emulation mode is set the bit 4 reflects BRK opcode (pushed on stack)
+ end if;
+ else
+ swint <= reg(4);
+ end if;
+ end process;
+
+ dout(7 downto 5) <= reg(7 downto 5);
+ dout(4) <= swint; -- save BRK/COP B="1" on stack if emulation mode
+ dout(3 downto 0) <= reg(3 downto 0);
+ acr_out <= acr;
+ em <= eb;
+ two_op <= op_exp;
+end rtl;
+
+
Index: trunk/pre_dec.vhd
===================================================================
--- trunk/pre_dec.vhd (nonexistent)
+++ trunk/pre_dec.vhd (revision 2)
@@ -0,0 +1,167 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- opcode decimal instructions and prefetch prediction logic
+entity pre_dec is
+ port( op: in STD_LOGIC_VECTOR(7 downto 0);
+ fetch: in STD_LOGIC;
+ ei: out STD_LOGIC;
+ dec: out STD_LOGIC
+ );
+end pre_dec;
+
+architecture comb of pre_dec is
+constant NOP_OP: STD_LOGIC_VECTOR(7 downto 0) := "11101010"; -- 0xEA NOP
+constant CLC_OP: STD_LOGIC_VECTOR(7 downto 0) := "00011000"; -- 0x18 CLC 0->C
+constant SEC_OP: STD_LOGIC_VECTOR(7 downto 0) := "00111000"; -- 0x38 SEC 1->C
+constant CLI_OP: STD_LOGIC_VECTOR(7 downto 0) := "01011000"; -- 0x58 CLI 0->I
+constant SEI_OP: STD_LOGIC_VECTOR(7 downto 0) := "01111000"; -- 0x78 SEI 1->I
+constant CLV_OP: STD_LOGIC_VECTOR(7 downto 0) := "10111000"; -- 0xB8 CLV 0->V
+constant CLD_OP: STD_LOGIC_VECTOR(7 downto 0) := "11011000"; -- 0xD8 CLD 0->D
+constant SED_OP: STD_LOGIC_VECTOR(7 downto 0) := "11111000"; -- 0xF8 SED 1->D
+constant TAX_OP: STD_LOGIC_VECTOR(7 downto 0) := "10101010"; -- 0xAA TAX A->X
+constant TAY_OP: STD_LOGIC_VECTOR(7 downto 0) := "10101000"; -- 0xA8 TAY A->Y
+constant TXA_OP: STD_LOGIC_VECTOR(7 downto 0) := "10001010"; -- 0x8A TXA X->A
+constant TYA_OP: STD_LOGIC_VECTOR(7 downto 0) := "10011000"; -- 0x98 TYA Y->A
+constant TXY_OP: STD_LOGIC_VECTOR(7 downto 0) := "10011011"; -- 0x9B TXY X->Y
+constant TYX_OP: STD_LOGIC_VECTOR(7 downto 0) := "10111011"; -- 0xBB TYX Y->X
+constant TXS_OP: STD_LOGIC_VECTOR(7 downto 0) := "10011010"; -- 0x9A TXS X->S
+constant TSX_OP: STD_LOGIC_VECTOR(7 downto 0) := "10111010"; -- 0xBA TSX S->X
+constant TCD_OP: STD_LOGIC_VECTOR(7 downto 0) := "01011011"; -- 0x5B TCD C->D
+constant TDC_OP: STD_LOGIC_VECTOR(7 downto 0) := "01111011"; -- 0x7B TDC D->C
+constant TCS_OP: STD_LOGIC_VECTOR(7 downto 0) := "00011011"; -- 0x1B TCS C->S
+constant TSC_OP: STD_LOGIC_VECTOR(7 downto 0) := "00111011"; -- 0x3B TSC S->C
+constant INX_OP: STD_LOGIC_VECTOR(7 downto 0) := "11101000"; -- 0xE8 INX X +1
+constant DEX_OP: STD_LOGIC_VECTOR(7 downto 0) := "11001010"; -- 0xCA DEX X -1
+constant INY_OP: STD_LOGIC_VECTOR(7 downto 0) := "11001000"; -- 0xC8 INY Y +1
+constant DEY_OP: STD_LOGIC_VECTOR(7 downto 0) := "10001000"; -- 0x88 DEY Y -1
+constant ASL_OP: STD_LOGIC_VECTOR(7 downto 0) := "00001010"; -- 0x0A ASL A
+constant LSR_OP: STD_LOGIC_VECTOR(7 downto 0) := "01001010"; -- 0x4A LSR A
+constant ROL_OP: STD_LOGIC_VECTOR(7 downto 0) := "00101010"; -- 0x2A ROL A
+constant ROR_OP: STD_LOGIC_VECTOR(7 downto 0) := "01101010"; -- 0x6A ROR A
+constant XCE_OP: STD_LOGIC_VECTOR(7 downto 0) := "11111011"; -- 0xFB XCE E<->C
+constant XBA_OP: STD_LOGIC_VECTOR(7 downto 0) := "11101011"; -- 0xEB XBA (swap A/B)
+constant WDM_OP: STD_LOGIC_VECTOR(7 downto 0) := "01000010"; -- 0x42 WDM
+constant ADC1_OP: STD_LOGIC_VECTOR(7 downto 0) := "01100001"; -- 0x61 ADC ($xx,X)
+constant ADC2_OP: STD_LOGIC_VECTOR(7 downto 0) := "01110001"; -- 0x71 ADC ($xx),Y
+constant ADC3_OP: STD_LOGIC_VECTOR(7 downto 0) := "01100101"; -- 0x65 ADC $xx
+constant ADC4_OP: STD_LOGIC_VECTOR(7 downto 0) := "01110101"; -- 0x75 ADC $xx,X
+constant ADC5_OP: STD_LOGIC_VECTOR(7 downto 0) := "01101001"; -- 0x69 ADC #xx
+constant ADC6_OP: STD_LOGIC_VECTOR(7 downto 0) := "01111001"; -- 0x79 ADC $xxxx,Y
+constant ADC7_OP: STD_LOGIC_VECTOR(7 downto 0) := "01111101"; -- 0x7D ADC $xxxx,X
+constant SBC1_OP: STD_LOGIC_VECTOR(7 downto 0) := "11100001"; -- 0xE1 SBC ($xx,X)
+constant SBC2_OP: STD_LOGIC_VECTOR(7 downto 0) := "11110001"; -- 0xF1 SBC ($xx),Y
+constant SBC3_OP: STD_LOGIC_VECTOR(7 downto 0) := "11100101"; -- 0xE5 SBC $xx
+constant SBC4_OP: STD_LOGIC_VECTOR(7 downto 0) := "11110101"; -- 0xF5 SBC $xx,X
+constant SBC5_OP: STD_LOGIC_VECTOR(7 downto 0) := "11101001"; -- 0xE9 SBC #xx
+constant SBC6_OP: STD_LOGIC_VECTOR(7 downto 0) := "11111001"; -- 0xF9 SBC $xxxx,Y
+constant SBC7_OP: STD_LOGIC_VECTOR(7 downto 0) := "11111101"; -- 0xFD SBC $xxxx,X
+
+signal eoi: STD_LOGIC;
+begin
+ process(op)
+ begin
+ case op is
+ when NOP_OP => eoi <= '1';
+ dec <= '0';
+ when CLC_OP => eoi <= '1';
+ dec <= '0';
+ when SEC_OP => eoi <= '1';
+ dec <= '0';
+ when CLI_OP => eoi <= '1';
+ dec <= '0';
+ when SEI_OP => eoi <= '1';
+ dec <= '0';
+ when CLV_OP => eoi <= '1';
+ dec <= '0';
+ when CLD_OP => eoi <= '1';
+ dec <= '0';
+ when SED_OP => eoi <= '1';
+ dec <= '0';
+ when TAX_OP => eoi <= '1';
+ dec <= '0';
+ when TAY_OP => eoi <= '1';
+ dec <= '0';
+ when TCD_OP => eoi <= '1';
+ dec <= '0';
+ when TDC_OP => eoi <= '1';
+ dec <= '0';
+ when TXA_OP => eoi <= '1';
+ dec <= '0';
+ when TYA_OP => eoi <= '1';
+ dec <= '0';
+ when TXY_OP => eoi <= '1';
+ dec <= '0';
+ when TYX_OP => eoi <= '1';
+ dec <= '0';
+ when TXS_OP => eoi <= '1';
+ dec <= '0';
+ when TSX_OP => eoi <= '1';
+ dec <= '0';
+ when TCS_OP => eoi <= '1';
+ dec <= '0';
+ when TSC_OP => eoi <= '1';
+ dec <= '0';
+ when INX_OP => eoi <= '1';
+ dec <= '0';
+ when DEX_OP => eoi <= '1';
+ dec <= '0';
+ when INY_OP => eoi <= '1';
+ dec <= '0';
+ when DEY_OP => eoi <= '1';
+ dec <= '0';
+ when ASL_OP => eoi <= '1';
+ dec <= '0';
+ when LSR_OP => eoi <= '1';
+ dec <= '0';
+ when ROL_OP => eoi <= '1';
+ dec <= '0';
+ when ROR_OP => eoi <= '1';
+ dec <= '0';
+ when XCE_OP => eoi <= '1';
+ dec <= '0';
+ when XBA_OP => eoi <= '1';
+ dec <= '0';
+ when WDM_OP => eoi <= '1';
+ dec <= '0';
+ -- ADC/SBC
+ when ADC1_OP => eoi <= '0';
+ dec <= '1';
+ when ADC2_OP => eoi <= '0';
+ dec <= '1';
+-- when ADC3_OP => eoi <= '0';
+-- dec <= '1';
+ when ADC4_OP => eoi <= '0';
+ dec <= '1';
+ when ADC5_OP => eoi <= '0';
+ dec <= '1';
+ when ADC6_OP => eoi <= '0';
+ dec <= '1';
+ when ADC7_OP => eoi <= '0';
+ dec <= '1';
+ when SBC1_OP => eoi <= '0';
+ dec <= '1';
+ when SBC2_OP => eoi <= '0';
+ dec <= '1';
+ when SBC3_OP => eoi <= '0';
+ dec <= '1';
+ when SBC4_OP => eoi <= '0';
+ dec <= '1';
+ when SBC5_OP => eoi <= '0';
+ dec <= '1';
+ when SBC6_OP => eoi <= '0';
+ dec <= '1';
+ when SBC7_OP => eoi <= '0';
+ dec <= '1';
+ when others => eoi <= '0';
+ dec <= '0';
+ end case;
+ end process;
+ ei <= eoi when fetch = '1' else '0';
+end comb;
+
+
+
+
Index: trunk/regmux.vhd
===================================================================
--- trunk/regmux.vhd (nonexistent)
+++ trunk/regmux.vhd (revision 2)
@@ -0,0 +1,90 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8 bit seven-way multiplexer
+entity regmux is
+ port( sel: in STD_LOGIC_VECTOR(4 downto 0);
+ a: in STD_LOGIC_VECTOR(7 downto 0);
+ b: in STD_LOGIC_VECTOR(15 downto 0);
+ c: in STD_LOGIC_VECTOR(15 downto 0);
+ d: in STD_LOGIC_VECTOR(15 downto 0);
+ e: in STD_LOGIC_VECTOR(15 downto 0);
+ g: in STD_LOGIC_VECTOR(7 downto 0);
+ h: in STD_LOGIC_VECTOR(7 downto 0);
+ i: in STD_LOGIC_VECTOR(7 downto 0);
+ j: in STD_LOGIC_VECTOR(15 downto 0);
+ k: in STD_LOGIC_VECTOR(15 downto 0);
+ l: in STD_LOGIC_VECTOR(7 downto 0);
+ m: in STD_LOGIC_VECTOR(7 downto 0);
+ y: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end regmux;
+
+architecture comb of regmux is
+constant EXT_O: STD_LOGIC_VECTOR(4 downto 0) := "00000"; -- external data bus
+constant ARD_O: STD_LOGIC_VECTOR(4 downto 0) := "00001"; -- register C msb & lsb select
+constant ARM_O: STD_LOGIC_VECTOR(4 downto 0) := "00010"; -- register C msb select (also returns C swapped)
+constant XRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00011"; -- register X msb & lsb select
+constant XRM_O: STD_LOGIC_VECTOR(4 downto 0) := "00100"; -- register X msb select
+constant YRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00101"; -- register Y msb & lsb select
+constant YRM_O: STD_LOGIC_VECTOR(4 downto 0) := "00110"; -- register Y msb select
+constant SRD_O: STD_LOGIC_VECTOR(4 downto 0) := "00111"; -- register S lsb select
+constant PRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01000"; -- register P select
+constant PLR_O: STD_LOGIC_VECTOR(4 downto 0) := "01001"; -- register PCL select
+constant PHR_O: STD_LOGIC_VECTOR(4 downto 0) := "01010"; -- register PCH select
+constant ORD_O: STD_LOGIC_VECTOR(4 downto 0) := "01011"; -- register O msb & lsb select
+constant Z00_O: STD_LOGIC_VECTOR(4 downto 0) := "01100"; -- select (all zero output)
+constant DRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01101"; -- register D msb & lsb select
+constant DRM_O: STD_LOGIC_VECTOR(4 downto 0) := "01110"; -- register D msb select
+constant KRD_O: STD_LOGIC_VECTOR(4 downto 0) := "01111"; -- register K PBR
+constant BRD_O: STD_LOGIC_VECTOR(4 downto 0) := "10000"; -- register B PBR
+constant EXM_O: STD_LOGIC_VECTOR(4 downto 0) := "10001"; -- external data bus on MSB, O on lsb
+constant OMD_O: STD_LOGIC_VECTOR(4 downto 0) := "10010"; -- register O msb select
+constant PCR_O: STD_LOGIC_VECTOR(4 downto 0) := "10011"; -- register PC (16 bit) select
+
+begin
+ process(sel,a,b,c,d,e,g,h,i,j,k,l,m)
+ begin
+ case sel is
+ when EXT_O => y(7 downto 0) <= a;
+ y(15 downto 8) <= (others => '0');
+ when EXM_O => y(15 downto 8) <= a;
+ y(7 downto 0) <= j(7 downto 0);
+ when ARD_O => y <= b;
+ when ARM_O => y(7 downto 0) <= b(15 downto 8);
+ y(15 downto 8) <= b(7 downto 0);
+ when XRD_O => y <= c;
+ when XRM_O => y(7 downto 0) <= c(15 downto 8);
+ y(15 downto 8) <= (others => '0');
+ when YRD_O => y <= d;
+ when YRM_O => y(7 downto 0) <= d(15 downto 8);
+ y(15 downto 8) <= (others => '0');
+ when SRD_O => y <= e;
+ when PRD_O => y(7 downto 0) <= g;
+ y(15 downto 8) <= (others => '0');
+ when PLR_O => y(7 downto 0) <= h;
+ y(15 downto 8) <= (others => '0');
+ when PHR_O => y(7 downto 0) <= i;
+ y(15 downto 8) <= (others => '0');
+ when ORD_O => y <= j;
+ when Z00_O => y <= (others => '0');
+ when DRD_O => y <= k;
+ when DRM_O => y(7 downto 0) <= k(15 downto 8);
+ y(15 downto 8) <= (others => '0');
+ when KRD_O => y(7 downto 0) <= l;
+ y(15 downto 8) <= (others => '0');
+ when BRD_O => y(7 downto 0) <= m;
+ y(15 downto 8) <= (others => '0');
+ when OMD_O => y(7 downto 0) <= j(15 downto 8);
+ y(15 downto 8) <= (others => '0');
+ when PCR_O => y(7 downto 0) <= h;
+ y(15 downto 8) <= i;
+ when others => y(7 downto 0) <= a;
+ y(15 downto 8) <= (others => '0');
+ end case;
+ end process;
+end comb;
+
+
Index: trunk/spr.vhd
===================================================================
--- trunk/spr.vhd (nonexistent)
+++ trunk/spr.vhd (revision 2)
@@ -0,0 +1,68 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 8/16 bit stack pointer register "S"
+entity spr is
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ em: in STD_LOGIC;
+ ld_l: in STD_LOGIC;
+ ld_h: in STD_LOGIC;
+ u: in STD_LOGIC;
+ d: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end spr;
+
+architecture rtl of spr is
+constant SP_6502_VALUE: STD_LOGIC_VECTOR(15 downto 0) := "0000000111111111"; -- $01FF standard 6502 stack pointer
+signal x: STD_LOGIC_VECTOR(3 downto 0);
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+
+begin
+ x(0) <= ld_l;
+ x(1) <= ld_h;
+ x(2) <= u;
+ x(3) <= d;
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if clr = '1' then
+ reg <= SP_6502_VALUE;
+ else
+ if em = '0' then -- native mode (S full 16 bit)
+ case x is
+ when "0001" => reg(7 downto 0) <= din(7 downto 0);
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "0010" => reg(15 downto 8) <= din(7 downto 0);
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "0011" => reg <= din;
+ when "0100" => reg <= reg + 1;
+ when "1000" => reg <= reg - 1;
+ when others => reg <= reg;
+ end case;
+ else -- emulation mode (S is forced to 0x01XX)
+ case x is
+ when "0001" => reg(7 downto 0) <= din(7 downto 0);
+ when "0011" => reg(7 downto 0) <= din(7 downto 0);
+ when "0100" => reg(7 downto 0) <= reg(7 downto 0) + 1;
+ when "1000" => reg(7 downto 0) <= reg(7 downto 0) - 1;
+ when others => reg(7 downto 0) <= reg(7 downto 0);
+ end case;
+ reg(15 downto 8) <= SP_6502_VALUE(15 downto 8);
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/v65c816.vhd
===================================================================
--- trunk/v65c816.vhd (nonexistent)
+++ trunk/v65c816.vhd (revision 2)
@@ -0,0 +1,1054 @@
+----------------------------------------------------------------------
+-- 8 bit microprocessor (65C816) VHDL project --
+-- Full RTL synchronous pipelined architecture --
+-- Project by Valerio Venturi (Italy) --
+-- Date: 5/04/2020 --
+-- Last revision: 5/04/2020 --
+----------------------------------------------------------------------
+
+-- I don't makes any claims, promises or guarantees about the accuracy, completeness, or
+-- adequacy of the contents of this website and expressly disclaims liability for errors and
+-- omissions in the contents of this website. No warranty of any kind, implied, expressed or statutory,
+-- including to fitness for a particular purpose and freedom from computer virus, is given with respect to
+-- the contents of this website or its hyperlinks to other Internet resources.
+-- Reference in this website to any specific commercial products, processes, or services, or
+-- the use of any trade, firm or corporation name is for the information, and does
+-- not constitute endorsement, recommendation, or favoring by me.
+-- All the source code and tutorials are to be used on your own risk. All the ideas and views in this site are my own and
+-- are not by any means related to my past or current employers.
+
+You can use the codes given in this website for non-commercial purposes without my permission. But if you are using it for commercial purposes then contact me with the details of your project for my permission.
+
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- global architecture
+entity v65c816 is
+ port( clk0: in STD_LOGIC; -- PHASE0 clock input
+ res: in STD_LOGIC; -- reset input
+ irq: in STD_LOGIC; -- interrupt request input
+ nmi: in STD_LOGIC; -- not maskable interrupt input
+ rdy: in STD_LOGIC; -- wait state request input (read/write)
+ rdy_out: out STD_LOGIC; -- CPU in wait state (WAI instruction)
+ stp_out: out STD_LOGIC; -- CPU in stop state (STP instruction)
+ rw: out STD_LOGIC; -- read/write out
+ vpa: out STD_LOGIC; -- vpa
+ vda: out STD_LOGIC; -- vda
+ ml: out STD_LOGIC; -- ml
+ vp: out STD_LOGIC; -- vector pull
+ ope: out STD_LOGIC; -- microcode end
+ e: out STD_LOGIC; -- emulation (1)/native mode (0)
+ m: out STD_LOGIC; -- M status
+ x: out STD_LOGIC; -- X status
+ op_exp: out STD_LOGIC; -- two byte instruction running
+ addr: out STD_LOGIC_VECTOR(23 downto 0); -- 16 bit address bus out
+ data_in: in STD_LOGIC_VECTOR(7 downto 0); -- 8 bit input data bus
+ data_out: out STD_LOGIC_VECTOR(7 downto 0) -- 8 bit output data bus
+-- DEBUG
+-- a_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit A register
+-- x_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit X register
+-- y_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Y register
+-- s_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit S register
+-- op_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Operand register
+-- p_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit P register
+-- k_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit K register
+-- b_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit B register
+-- o_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit Opcode register
+-- mcode: out STD_LOGIC_VECTOR(3 downto 0) -- 4 bit microcode sequence register
+ );
+end v65c816;
+
+architecture struct of v65c816 is
+ signal i_res: STD_LOGIC; -- internal global reset RES
+ signal i_irq: STD_LOGIC; -- internal interrupt request IRQ
+ signal i_nmi: STD_LOGIC; -- internal interrupt request NMI
+ signal i_rdy: STD_LOGIC; -- internal wait request RDY
+ signal e_rdy: STD_LOGIC; -- external invertedf RDY
+ signal i_vp: STD_LOGIC; -- internal VP (vector pull)
+ signal int: STD_LOGIC; -- internal global interrupt (instruction boundary synchronized)
+ signal we: STD_LOGIC; -- write enable (combinatorial from PLA)
+ signal we_r: STD_LOGIC; -- write enable (registered)
+ signal ien: STD_LOGIC; -- interrupt IRQ enable
+ signal emu: STD_LOGIC; -- emulation mode
+ signal two_byte_op: STD_LOGIC; -- two byte instruction
+
+ -- microcode signals (register control)
+ signal regop: STD_LOGIC_VECTOR(5 downto 0); -- register operation microcode
+ signal rsel: STD_LOGIC_VECTOR(4 downto 0); -- register select microcode
+ signal a_l_lsb: STD_LOGIC; -- A load lsb
+ signal a_l_msb: STD_LOGIC; -- A load msb
+ signal a_dec: STD_LOGIC; -- A decrement (MVN/MVP)
+ signal x_l_lsb: STD_LOGIC; -- X load lsb
+ signal x_l_msb: STD_LOGIC; -- X load msb
+ signal x_d: STD_LOGIC; -- X decrement
+ signal x_u: STD_LOGIC; -- X increment
+ signal y_d: STD_LOGIC; -- Y decrement
+ signal y_u: STD_LOGIC; -- Y increment
+ signal y_l_lsb: STD_LOGIC; -- Y load lsb
+ signal y_l_msb: STD_LOGIC; -- Y load msb
+ signal d_l_lsb: STD_LOGIC; -- D load lsb
+ signal d_l_msb: STD_LOGIC; -- D load msb
+ signal p_l: STD_LOGIC; -- P load
+ signal k_l: STD_LOGIC; -- program bank register PBR K load
+ signal b_l: STD_LOGIC; -- data bank register DBR B load
+ signal k_cl: STD_LOGIC; -- program bank register PBR K clear
+ signal b_cl: STD_LOGIC; -- data bank register DBR B clear
+ signal o_l: STD_LOGIC; -- OPE load msb & lsb
+ signal o_l_lsb: STD_LOGIC; -- OPE load lsb
+ signal o_l_msb: STD_LOGIC; -- OPE load msb
+ signal sp_ll: STD_LOGIC; -- SP load lsb
+ signal sp_lh: STD_LOGIC; -- SP load msb
+ signal sp_u: STD_LOGIC; -- SP increment
+ signal sp_d: STD_LOGIC; -- SP decrement
+ signal dmux_sel: STD_LOGIC_VECTOR(2 downto 0); -- ALU operand #2 data multiplexer
+ signal kr_clear: STD_LOGIC; -- K clear
+ signal br_clear: STD_LOGIC; -- B clear
+ signal sp_emu: STD_LOGIC; -- '1' when S must be set in emulation mode
+
+ -- microcode signals (ALU control)
+ signal aluop: STD_LOGIC_VECTOR(4 downto 0); -- ALU operation code
+
+ -- microcode signals CPU control logic
+ signal mc_addr: STD_LOGIC_VECTOR(12 downto 0); -- microcode PLA address
+ signal opfetch: STD_LOGIC; -- opcode fetch
+ signal i_sync: STD_LOGIC; -- internal SYNC not latched
+ signal m_sync: STD_LOGIC; -- internal SYNC latched
+ signal opdec: STD_LOGIC; -- opcode decode
+ signal pcmp: STD_LOGIC_VECTOR(2 downto 0); -- PC/MP out control effective
+ signal pcmp_mc: STD_LOGIC_VECTOR(2 downto 0); -- PC/MP out control microcode
+ signal pcinc: STD_LOGIC; -- PC increment
+ signal e_eop: STD_LOGIC; -- early microcode sequence end (for some opcodes)
+ signal mc_eop: STD_LOGIC; -- microcode sequence end
+ signal eop: STD_LOGIC; -- microcode sequence end (effective)
+ signal we_mc: STD_LOGIC; -- microcode write enable
+ signal we_mc_l: STD_LOGIC; -- microcode write enable to latch
+ signal fbrk: STD_LOGIC; -- force BRK opcode (used by hardware interrupts)
+ signal opbrk: STD_LOGIC; -- BRK opcode (used for distinguish between hardware/software interrupts)
+ signal opcop: STD_LOGIC; -- COP opcode
+ signal sw_int: STD_LOGIC; -- software interrupt request
+ signal branch_taken: STD_LOGIC; -- branch condition resolved
+ signal pcc: STD_LOGIC; -- PC carry
+ signal clri: STD_LOGIC; -- clear interrupt request pending microcode
+ signal mc_vda: STD_LOGIC; -- microcode VDA
+ signal mc_vpa: STD_LOGIC; -- microcode VPA
+ signal mc_ml: STD_LOGIC; -- microcode ML
+ signal adc_sbc_mc: STD_LOGIC; -- ADC/SBC opcode (used for decimal adjustment)
+ signal ai_op: STD_LOGIC; -- opcode with absolute indexed addressing mode
+ signal daa_req: STD_LOGIC; -- DAA required
+ signal mcad: STD_LOGIC_VECTOR(11 downto 0); -- microcode address
+ signal mcscan: STD_LOGIC_VECTOR(3 downto 0); -- microcode pointer control
+ signal p_op: STD_LOGIC_VECTOR(4 downto 0); -- microcode control bits register P
+ signal pcr_fc: STD_LOGIC_VECTOR(3 downto 0); -- microcode control PC
+ signal mpr_fc: STD_LOGIC_VECTOR(4 downto 0); -- microcode control MP
+ signal mcbit: STD_LOGIC_VECTOR(44 downto 0); -- microcode control bits
+ signal regbit: STD_LOGIC_VECTOR(29 downto 0); -- microcode control bits on registers
+ signal ivoffs: STD_LOGIC_VECTOR(7 downto 0); -- interrupt vector offset encoding
+ signal mcn: STD_LOGIC; -- microcode does NOPs
+ signal add_sub_op: STD_LOGIC; -- ADC/SBC opcode
+ signal m_bit: STD_LOGIC; -- M bit of status register
+ signal x_bit: STD_LOGIC; -- X bit of status register
+ signal index_size: STD_LOGIC; -- index register size: 1 = 8 bit, 0 = 16 bit
+ signal m_size8: STD_LOGIC; -- memory operation size: 1 = 8 bit
+ signal m_size16: STD_LOGIC; -- memory operation size: 1 = 16 bit
+ signal s_size16: STD_LOGIC; -- memory operation size: 1 = 16 bit for special cases
+ signal m_size: STD_LOGIC; -- memory operation size: 1 = 8 bit, 0 = 16 bit
+ signal acc_size: STD_LOGIC; -- accumulator C size: 1 = 8 bit, 0 = 16 bit
+ signal mov_end: STD_LOGIC; -- MVN/MVP end transfer
+ signal ld_acc: STD_LOGIC; -- load accumulator C register (16 bit)
+ signal ld_xy: STD_LOGIC; -- load X/Y registers (16 bit)
+
+ -- ALU signals
+ signal c_flg: STD_LOGIC; -- ALU carry flag
+ signal z_flg: STD_LOGIC; -- ALU zero flag
+ signal v_flg: STD_LOGIC; -- ALU overflow flag
+ signal n_flg: STD_LOGIC; -- ALU negative flag
+ signal pc_c_alu_flg: STD_LOGIC; -- ALU PC carry flag
+ signal acr_reg: STD_LOGIC; -- ALU auxiliary carry (registered)
+
+ -- multiplier signals
+ signal mul_init: STD_LOGIC; -- multiplier initialize
+ signal mul_start_u: STD_LOGIC; -- multiplier unsigned start
+ signal mul_start_s: STD_LOGIC; -- multiplier signed start
+ signal mul_busy: STD_LOGIC; -- multiplier busy
+ signal mul_r_lsb: STD_LOGIC_VECTOR(15 downto 0); -- multiplier lsb result
+ signal mul_r_msb: STD_LOGIC_VECTOR(15 downto 0); -- multiplier msb result
+ signal mul_l_res: STD_LOGIC; -- load multiplier lsb result on register A/B and multiplier msb result on register X
+ signal mul_z_flg: STD_LOGIC; -- multiplier Z flag
+ signal mul_n_flg: STD_LOGIC; -- multiplier N flag
+
+ -- WAI/STP signals
+ signal wai_ff: STD_LOGIC; -- WAI instruction flipflop
+ signal stp_ff: STD_LOGIC; -- STP instruction flipflop
+ signal wai_set: STD_LOGIC; -- WAI flipflop set
+ signal stp_set: STD_LOGIC; -- STP flipflop set
+
+ -- bus
+ signal dbin: STD_LOGIC_VECTOR(7 downto 0); -- input data bus D0..D7
+ signal dbout: STD_LOGIC_VECTOR(7 downto 0); -- output data bus D0..D7
+ signal a_bus: STD_LOGIC_VECTOR(15 downto 0); -- accumulator register A/B/C bus
+ signal x_bus: STD_LOGIC_VECTOR(15 downto 0); -- index register X bus
+ signal y_bus: STD_LOGIC_VECTOR(15 downto 0); -- index register Y bus
+ signal k_bus: STD_LOGIC_VECTOR(7 downto 0); -- program bank PBR K bus
+ signal b_bus: STD_LOGIC_VECTOR(7 downto 0); -- program data DBR B bus
+ signal d_bus: STD_LOGIC_VECTOR(15 downto 0); -- zero page/direct register D bus
+ signal sp_bus: STD_LOGIC_VECTOR(15 downto 0); -- stack pointer register S bus
+ signal p_bus: STD_LOGIC_VECTOR(7 downto 0); -- status register P bus
+ signal op_bus: STD_LOGIC_VECTOR(7 downto 0); -- opcode register bus
+ signal o_bus: STD_LOGIC_VECTOR(15 downto 0); -- operand register bus
+ signal oper_bus: STD_LOGIC_VECTOR(15 downto 0); -- operand bus (ALU operand #2 bus)
+ signal r_bus: STD_LOGIC_VECTOR(15 downto 0); -- general register bus (ALU operand #2 bus)
+ signal alu_bus: STD_LOGIC_VECTOR(15 downto 0); -- ALU output bus
+ signal pc_bus: STD_LOGIC_VECTOR(15 downto 0); -- program counter register PC bus
+ signal mp_bus: STD_LOGIC_VECTOR(23 downto 0); -- memory data pointer register bus
+ signal ad_bus: STD_LOGIC_VECTOR(15 downto 0); -- address bus
+ signal i_addr_bus: STD_LOGIC_VECTOR(23 downto 0); -- internal 24 bit address bus
+
+ -- 16 bit program counter register (PC)
+ component pcr
+ port( clk: in STD_LOGIC; -- clock
+ i: in STD_LOGIC; -- increment
+ fwait: in STD_LOGIC; -- wait
+ brk_op: in STD_LOGIC; -- forced BRK (by interrupt request)
+ branch_flg: in STD_LOGIC; -- branch flag
+ mov_f: in STD_LOGIC; -- MVN/MVP end transfer
+ fc: in STD_LOGIC_VECTOR(3 downto 0); -- function code
+ din1: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ din2: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 8 bit PBR program bank register K
+ component kr
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- reset
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC; -- load
+ din: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(7 downto 0) -- output
+ );
+ end component;
+
+ -- 8 bit DBR program bank register B
+ component br
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- reset
+ fwait: in STD_LOGIC;
+ ld: in STD_LOGIC; -- load
+ din: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(7 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit memory pointer register (MP)
+ component mpr
+ port( clk: in STD_LOGIC; -- clock
+ fwait: in STD_LOGIC; -- wait
+ dbr_ld: in STD_LOGIC; -- load DBR
+ c: in STD_LOGIC; -- carry
+ fc: in STD_LOGIC_VECTOR(4 downto 0); -- function code
+ din_l: in STD_LOGIC_VECTOR(7 downto 0); -- input LSB
+ din_h: in STD_LOGIC_VECTOR(7 downto 0); -- input MSB
+ dbr: in STD_LOGIC_VECTOR(7 downto 0);
+ dr: in STD_LOGIC_VECTOR(15 downto 0);
+ op: in STD_LOGIC_VECTOR(15 downto 0);
+ xr: in STD_LOGIC_VECTOR(15 downto 0);
+ yr: in STD_LOGIC_VECTOR(15 downto 0);
+ sr: in STD_LOGIC_VECTOR(15 downto 0);
+ v: in STD_LOGIC_VECTOR(7 downto 0); -- vector offset input
+ dout: out STD_LOGIC_VECTOR(23 downto 0) -- output
+ );
+ end component;
+
+ -- 8 bit opcode register opr (pipeline opcode prefetch register)
+ component opr
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- force BRK opcode
+ fwait: in STD_LOGIC; -- wait
+ ld: in STD_LOGIC; -- load
+ din: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ brk_f: out STD_LOGIC; -- BRK opcode
+ cop_f: out STD_LOGIC; -- COP opcode
+ dout: out STD_LOGIC_VECTOR(7 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit operand hold register oper
+ component oper
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- clear
+ fwait: in STD_LOGIC; -- wait
+ ld: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit accumulator register A
+ component ar
+ port( clk: in STD_LOGIC; -- clock
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC; -- accumulator register size: 1 = 8 bit, 0 = 16 bit
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ ld_mul_lsb: in STD_LOGIC; -- load multiplication lsb result
+ d: in STD_LOGIC; -- decrement
+ end_count: out STD_LOGIC; -- '1' when a is 0xFF or 0xFFFF
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ mul_lsb: in STD_LOGIC_VECTOR(15 downto 0); -- input multiplication lsb result
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit index register X
+ component xr
+ port( clk: in STD_LOGIC; -- clock
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC; -- index register size: 1 = 8 bit, 0 = 16 bit
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ ld_mul_msb: in STD_LOGIC;
+ u: in STD_LOGIC; -- increment
+ d: in STD_LOGIC; -- decrement
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ mul_msb: in STD_LOGIC_VECTOR(15 downto 0); -- input multiplication msb result
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit index register Y
+ component yr
+ port( clk: in STD_LOGIC; -- clock
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC; -- index register size: 1 = 8 bit, 0 = 16 bit
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ u: in STD_LOGIC; -- increment
+ d: in STD_LOGIC; -- decrement
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit zero page/direct register D
+ component dr
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- reset
+ fwait: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC; -- load lsb
+ ld_msb: in STD_LOGIC; -- load msb
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+ -- 16 bit stack pointer SP
+ component spr
+ port( clk: in STD_LOGIC; -- clock
+ fwait: in STD_LOGIC; -- wait
+ em: in STD_LOGIC; -- emulation mode (1)/native mode (0)
+ clr: in STD_LOGIC; -- load init value
+ ld_l: in STD_LOGIC; -- load lsb
+ ld_h: in STD_LOGIC; -- load msb
+ u: in STD_LOGIC; -- increment
+ d: in STD_LOGIC; -- decrement
+ din: in STD_LOGIC_VECTOR(15 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- output
+ );
+ end component;
+
+-- 8 bit processor status register P
+-- NV1BDIZC
+-- 76543210
+-- ||||||||
+-- ||||||||--- C/E = carry/borrow flag (emulation bit: 1 = emulation mode, 0 = native mode)
+-- |||||||---- Z = zero flag
+-- ||||||----- I = interrupt mask
+-- |||||------ D = decimal/binary alu mode
+-- ||||------- B/X = index reg. select (1 = 8 bit, 0 = 16 bit) (B Break: 0 on stack after interrupt if E emulation mode = 1)
+-- |||-------- M = memory/acc. select (1 = 8 bit, 0 = 16 bit) (always 1 if E = 1)
+-- ||--------- V = overflow flag
+-- |---------- N = negative flag
+ -- The P register also contains an additional carry/borrow flag (ACR) used for effective address calculation but
+ -- it is not visible at program level
+ component pr
+ port( clk: in STD_LOGIC; -- clock
+ clr: in STD_LOGIC; -- clear
+ fwait: in STD_LOGIC; -- wait
+ n: in STD_LOGIC; -- N input
+ v: in STD_LOGIC; -- V input
+ z: in STD_LOGIC; -- Z input
+ c: in STD_LOGIC; -- C input
+ mpy_z: in STD_LOGIC; -- Z input from multiplier
+ mpy_n: in STD_LOGIC; -- N input from multiplier
+ swi: in STD_LOGIC; -- software interrupt (BRK/COP opcode)
+ acr_in: in STD_LOGIC; -- auxiliary carry in
+ fc: in STD_LOGIC_VECTOR(4 downto 0); -- function code
+ din: in STD_LOGIC_VECTOR(7 downto 0); -- input
+ dout: out STD_LOGIC_VECTOR(7 downto 0); -- output
+ acr_out: out STD_LOGIC; -- auxiliary carry out
+ em: out STD_LOGIC; -- emulation (1)/native mode (0)
+ two_op: out STD_LOGIC -- two byte instruction
+ );
+ end component;
+
+ -- 16 bit (binary/bcd) two-way through pass ALU
+ component alu_bin
+ port( alu_byp: in STD_LOGIC; -- ALU bypass (no operation)
+ bcd: in STD_LOGIC; -- BCD mode
+ size: in STD_LOGIC; -- ALU size operation: 1 = 8 bit, 0 = 16 bit
+ cin: in STD_LOGIC; -- carry/borrow in
+ vin: in STD_LOGIC; -- overflow in
+ op1: in STD_LOGIC_VECTOR(15 downto 0); -- 16 bit operand #1
+ op2: in STD_LOGIC_VECTOR(15 downto 0); -- 16 bit operand #2
+ fc: in STD_LOGIC_VECTOR(4 downto 0); -- function code
+ cf: out STD_LOGIC; -- carry/borrow (byte) out
+ zf: out STD_LOGIC; -- zero flag out
+ nf: out STD_LOGIC; -- negative flag out
+ vf: out STD_LOGIC; -- overflow flag out
+ pc_cf: out STD_LOGIC; -- carry/borrow out for PC operation
+ dout: out STD_LOGIC_VECTOR(15 downto 0) -- 16 bit result out
+ );
+ end component;
+
+ -- PC/MP address multiplexer
+ component addrmux
+ port( sel: in STD_LOGIC_VECTOR(2 downto 0);
+ a: in STD_LOGIC_VECTOR(23 downto 0);
+ b: in STD_LOGIC_VECTOR(23 downto 0);
+ dbr: in STD_LOGIC_VECTOR(7 downto 0);
+ s: in STD_LOGIC_VECTOR(15 downto 0);
+ xr: in STD_LOGIC_VECTOR(15 downto 0);
+ yr: in STD_LOGIC_VECTOR(15 downto 0);
+ y: out STD_LOGIC_VECTOR(23 downto 0)
+ );
+ end component;
+
+ -- register multiplexer
+ component regmux
+ port( sel: in STD_LOGIC_VECTOR(4 downto 0);
+ a: in STD_LOGIC_VECTOR(7 downto 0);
+ b: in STD_LOGIC_VECTOR(15 downto 0);
+ c: in STD_LOGIC_VECTOR(15 downto 0);
+ d: in STD_LOGIC_VECTOR(15 downto 0);
+ e: in STD_LOGIC_VECTOR(15 downto 0);
+ g: in STD_LOGIC_VECTOR(7 downto 0);
+ h: in STD_LOGIC_VECTOR(7 downto 0);
+ i: in STD_LOGIC_VECTOR(7 downto 0);
+ j: in STD_LOGIC_VECTOR(15 downto 0);
+ k: in STD_LOGIC_VECTOR(15 downto 0);
+ l: in STD_LOGIC_VECTOR(7 downto 0);
+ m: in STD_LOGIC_VECTOR(7 downto 0);
+ y: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+ end component;
+
+ -- data multiplexer (register "O" bypass)
+ component dmux is
+ port( sel: in STD_LOGIC_VECTOR(2 downto 0);
+ a: in STD_LOGIC_VECTOR(15 downto 0);
+ b: in STD_LOGIC_VECTOR(7 downto 0);
+ y: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+ end component dmux;
+
+ -- microcode sequencer logic
+ component mcseq
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ mc_nop: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ q: out STD_LOGIC_VECTOR(3 downto 0)
+ );
+ end component;
+
+ -- micropla logic
+ -- output fields format:
+ -- a[12] is two byte instruction bit
+ -- a[11..4] is 8 bit opcode
+ -- a[3..0] is 4 bit microinstruction counter
+ component mcpla
+ port( em: in STD_LOGIC; -- emulation mode (1)/native mode (0)
+ m: in STD_LOGIC; -- M memory/acc. 8 bit (1), M memory/acc. 16 bit (0)
+ x: in STD_LOGIC; -- X index reg. 8 bit (1), X index reg. 16 bit (0)
+ a: in STD_LOGIC_VECTOR(12 downto 0); -- two byte bit & 8 bit opcode & 4 bit microinstruction counter
+ q: out STD_LOGIC_VECTOR(44 downto 0) -- microcode output
+ );
+ end component;
+
+ -- register operation decoding logic
+ component decreg
+ port( r: in STD_LOGIC_VECTOR(5 downto 0);
+ y: out STD_LOGIC_VECTOR(29 downto 0)
+ );
+ end component;
+
+ -- cpu main state machine
+ component cpufsm
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ ireq: in STD_LOGIC;
+ aim: in STD_LOGIC;
+ bcarry: in STD_LOGIC;
+ icarry: in STD_LOGIC;
+ p1: in STD_LOGIC_VECTOR(2 downto 0);
+ e_ei: in STD_LOGIC;
+ mc_ei: in STD_LOGIC;
+ addsub: in STD_LOGIC;
+ dec_mode: in STD_LOGIC;
+ fetch: out STD_LOGIC;
+ op_sync: out STD_LOGIC;
+ pci: out STD_LOGIC;
+ pq: out STD_LOGIC_VECTOR(2 downto 0);
+ fb: out STD_LOGIC;
+ od: out STD_LOGIC;
+ mc_nop: out STD_LOGIC
+ );
+ end component;
+
+ -- interrupt logic
+ component intlog
+ port( clk: in STD_LOGIC;
+ iack: in STD_LOGIC; -- interrupt acknowledge by microcode
+ r: in STD_LOGIC; -- RESET request
+ n: in STD_LOGIC; -- NMI request
+ i: in STD_LOGIC; -- IRQ request
+ brk: in STD_LOGIC; -- BRK opcode
+ cop: in STD_LOGIC; -- COP opcode
+ e: in STD_LOGIC; -- native\emulation mode
+ gmask: in STD_LOGIC; -- interrupt mask valid for IRQ and NMI (used by two byte instruction)
+ imask: in STD_LOGIC; -- interrupt mask (valid only for IRQ)
+ ioffs: in STD_LOGIC_VECTOR(7 downto 0); -- interrupt servicing offset
+ ireq: out STD_LOGIC; -- global interrupt requestb (IRQ/NMI)
+ voffs: out STD_LOGIC_VECTOR(7 downto 0) -- interrupt vector offset
+ );
+ end component;
+
+ -- branch logic
+ component branch
+ port( op: in STD_LOGIC_VECTOR(3 downto 0);
+ n: in STD_LOGIC;
+ v: in STD_LOGIC;
+ z: in STD_LOGIC;
+ c: in STD_LOGIC;
+ bres: out STD_LOGIC
+ );
+ end component;
+
+ -- opcode decimal instructions and prefetch prediction logic
+ component pre_dec
+ port( op: in STD_LOGIC_VECTOR(7 downto 0);
+ fetch: in STD_LOGIC;
+ ei: out STD_LOGIC;
+ dec: out STD_LOGIC
+ );
+ end component;
+
+ -- 16X16->32 bit multiplier signed/unsigned
+ component multiplier
+ port( clk: in STD_LOGIC;
+ clr: in STD_LOGIC;
+ init: in STD_LOGIC;
+ start_u: in STD_LOGIC;
+ start_s: in STD_LOGIC;
+ mpcand: in STD_LOGIC_VECTOR(15 downto 0);
+ mplier: in STD_LOGIC_VECTOR(15 downto 0);
+ busy: out STD_LOGIC;
+ res_lsb: out STD_LOGIC_VECTOR(15 downto 0);
+ res_msb: out STD_LOGIC_VECTOR(15 downto 0);
+ z_flg: out STD_LOGIC;
+ n_flg: out STD_LOGIC
+ );
+ end component;
+
+ begin
+ u1:pcr port map(clk=>clk0,
+ i=>pcinc,
+ fwait=>i_rdy,
+ brk_op=>opbrk,
+ branch_flg=>branch_taken,
+ mov_f=>mov_end,
+ fc=>pcr_fc,
+ din1=>alu_bus(7 downto 0),
+ din2=>o_bus,
+ dout=>pc_bus
+ );
+
+ u2:kr port map(clk=>clk0,
+ clr=>kr_clear,
+ fwait=>i_rdy,
+ ld=>k_l,
+ din=>alu_bus(7 downto 0),
+ dout=>k_bus
+ );
+
+ u3:br port map(clk=>clk0,
+ clr=>br_clear,
+ fwait=>i_rdy,
+ ld=>b_l,
+ din=>alu_bus(7 downto 0),
+ dout=>b_bus
+ );
+
+ u4:mpr port map(clk=>clk0,
+ fwait=>i_rdy,
+ dbr_ld=>opfetch,
+ c=>acr_reg,
+ fc=>mpr_fc,
+ din_l=>alu_bus(7 downto 0),
+ din_h=>dbin,
+ dbr=>b_bus,
+ dr=>d_bus,
+ op=>o_bus,
+ xr=>x_bus,
+ yr=>y_bus,
+ sr=>sp_bus,
+ v=>ivoffs,
+ dout=>mp_bus
+ );
+
+ u5:ar port map(clk=>clk0,
+ fwait=>i_rdy,
+ size=>acc_size,
+ ld_lsb=>a_l_lsb,
+ ld_msb=>a_l_msb,
+ ld_mul_lsb=>mul_l_res,
+ d=>a_dec,
+ end_count=>mov_end,
+ din=>alu_bus,
+ mul_lsb=>mul_r_lsb,
+ dout=>a_bus
+ );
+
+ u6:xr port map(clk=>clk0,
+ fwait=>i_rdy,
+ size=>index_size,
+ ld_lsb=>x_l_lsb,
+ ld_msb=>x_l_msb,
+ ld_mul_msb=>mul_l_res,
+ u=>x_u,
+ d=>x_d,
+ din=>alu_bus,
+ mul_msb=>mul_r_msb,
+ dout=>x_bus
+ );
+
+ u7:yr port map(clk=>clk0,
+ fwait=>i_rdy,
+ size=>index_size,
+ ld_lsb=>y_l_lsb,
+ ld_msb=>y_l_msb,
+ u=>y_u,
+ d=>y_d,
+ din=>alu_bus,
+ dout=>y_bus
+ );
+
+ u8:dr port map(clk=>clk0,
+ clr=>i_res,
+ fwait=>i_rdy,
+ ld_lsb=>d_l_lsb,
+ ld_msb=>d_l_msb,
+ din=>alu_bus,
+ dout=>d_bus
+ );
+
+ u9:spr port map(clk=>clk0,
+ clr=>i_res,
+ fwait=>i_rdy,
+ em=>sp_emu,
+ ld_l=>sp_ll,
+ ld_h=>sp_lh,
+ u=>sp_u,
+ d=>sp_d,
+ din=>alu_bus,
+ dout=>sp_bus
+ );
+
+ u10:pr port map(clk=>clk0,
+ clr=>i_res,
+ fwait=>i_rdy,
+ n=>n_flg,
+ v=>v_flg,
+ z=>z_flg,
+ c=>c_flg,
+ mpy_z=>mul_z_flg,
+ mpy_n=>mul_n_flg,
+ swi=>sw_int,
+ acr_in=>pc_c_alu_flg,
+ fc=>p_op,
+ din=>dbin,
+ dout=>p_bus,
+ acr_out=>acr_reg,
+ em=>emu,
+ two_op=>two_byte_op
+ );
+
+ u11:opr port map(clk=>clk0,
+ clr=>fbrk,
+ fwait=>i_rdy,
+ ld=>opfetch,
+ din=>dbin,
+ brk_f=>opbrk,
+ cop_f=>opcop,
+ dout=>op_bus
+ );
+
+ u12:oper port map(clk=>clk0,
+ clr=>opfetch,
+ fwait=>i_rdy,
+ ld=>o_l,
+ ld_lsb=>o_l_lsb,
+ ld_msb=>o_l_msb,
+ din=>alu_bus,
+ dout=>o_bus
+ );
+
+ u13:alu_bin port map(alu_byp=>acr_reg,
+ bcd=>p_bus(3),
+ size=>m_size,
+ cin=>p_bus(0),
+ vin=>p_bus(6),
+ op1=>r_bus,
+ op2=>oper_bus,
+ fc=>aluop,
+ cf=>c_flg,
+ zf=>z_flg,
+ nf=>n_flg,
+ vf=>v_flg,
+ pc_cf=>pc_c_alu_flg,
+ dout=>alu_bus
+ );
+
+ u14:addrmux port map(sel=>pcmp,
+ a=>i_addr_bus,
+ b=>mp_bus,
+ dbr=>b_bus,
+ s=>sp_bus,
+ xr=>x_bus,
+ yr=>y_bus,
+ y=>addr
+ );
+
+ u15:regmux port map(sel=>rsel,
+ a=>dbin,
+ b=>a_bus,
+ c=>x_bus,
+ d=>y_bus,
+ e=>sp_bus,
+ g=>p_bus,
+ h=>pc_bus(7 downto 0),
+ i=>pc_bus(15 downto 8),
+ j=>o_bus,
+ k=>d_bus,
+ l=>k_bus,
+ m=>b_bus,
+ y=>r_bus
+ );
+
+ u16:dmux port map(sel=>dmux_sel,
+ a=>o_bus,
+ b=>dbin,
+ y=>oper_bus
+ );
+
+ u17:mcseq port map(clk=>clk0,
+ clr=>opdec,
+ mc_nop=>mcn,
+ fwait=>i_rdy or mul_busy,
+ q=>mcscan
+ );
+
+ u18:mcpla port map(em=>emu,
+ m=>m_bit,
+ x=>x_bit,
+ a=>mc_addr,
+ q=>mcbit
+ );
+
+ u19:decreg port map(r=>regop,
+ y=>regbit
+ );
+
+ u20:cpufsm port map(clk=>clk0,
+ clr=>i_res,
+ fwait=>i_rdy,
+ ireq=>int,
+ aim=>ai_op,
+ bcarry=>pcc,
+ icarry=>acr_reg,
+ p1=>pcmp_mc,
+ e_ei=>e_eop,
+ mc_ei=>mc_eop,
+ addsub=>add_sub_op,
+ dec_mode=>p_bus(3),
+ fetch=>opfetch,
+ op_sync=>i_sync,
+ pci=>pcinc,
+ pq=>pcmp,
+ fb=>fbrk,
+ od=>opdec,
+ mc_nop=>mcn
+ );
+
+ u21:intlog port map(clk=>clk0,
+ iack=>clri,
+ r=>i_res,
+ n=>i_nmi,
+ i=>i_irq,
+ brk=>opbrk,
+ cop=>opcop,
+ e=>emu,
+ gmask=>two_byte_op,
+ imask=>ien,
+ ioffs=>mp_bus(7 downto 0),
+ ireq=>int,
+ voffs=>ivoffs
+ );
+
+ u22:branch port map(op=>op_bus(7 downto 4),
+ n=>p_bus(7),
+ v=>p_bus(6),
+ z=>p_bus(1),
+ c=>p_bus(0),
+ bres=>branch_taken
+ );
+
+ u23:pre_dec port map(op=>dbin,
+ fetch=>opfetch,
+ ei=>e_eop,
+ dec=>add_sub_op
+ );
+
+ u24:multiplier port map(clk=>clk0,
+ clr=>i_res,
+ init=>mul_init,
+ start_u=>mul_start_u,
+ start_s=>mul_start_s,
+ mpcand=>a_bus,
+ mplier=>x_bus,
+ busy=>mul_busy,
+ res_lsb=>mul_r_lsb,
+ res_msb=>mul_r_msb,
+ z_flg=>mul_z_flg,
+ n_flg=>mul_n_flg
+ );
+
+ -- asynchronous CPU link section
+ mc_addr <= two_byte_op & mcad;
+ e <= emu; -- emulation mode
+ ien <= p_bus(2); -- P(I) flag
+ i_res <= not res; -- internal reset
+ i_nmi <= not nmi; -- internal NMI
+ i_irq <= not irq; -- internal IRQ
+ e_rdy <= not rdy; -- external RDY inverted
+ i_rdy <= e_rdy or wai_ff or stp_ff; -- internal RDY
+ mcad <= op_bus & mcscan; -- microcode address
+ rsel <= mcbit(4 downto 0); -- registers read microcode
+ regop <= mcbit(10 downto 5); -- registers operation microcode
+ aluop <= mcbit(15 downto 11); -- ALU microcode
+ p_op <= mcbit(20 downto 16); -- register P microcode
+ mpr_fc <= mcbit(25 downto 21); -- MPR microcode
+ pcr_fc <= mcbit(29 downto 26); -- PCR microcode
+ pcmp_mc <= mcbit(32 downto 30); -- PCR/MPR multiplexer microcode
+ clri <= mcbit(33); -- clear interrupt request
+ we_mc <= mcbit(34); -- write enable (combinatorial) microcode
+ we_mc_l <= mcbit(35); -- write enable (latched) microcode
+ mc_eop <= mcbit(36); -- end of instruction reached
+ mc_vda <= mcbit(37); -- microcode VDA
+ mc_vpa <= mcbit(38); -- microcode VPA
+ mc_ml <= mcbit(39); -- microcode ML
+ i_vp <= mcbit(40); -- vector pull
+ ai_op <= mcbit(41); -- opcode with addressing indexed microcode
+ dmux_sel <= mcbit(44 downto 42); -- data multiplexer microcode
+ ope <= eop;
+ i_addr_bus <= k_bus & pc_bus;
+ eop <= '1' when mc_eop = '1' or e_eop = '1' else '0';
+ vp <= not i_vp;
+ op_exp <= two_byte_op;
+ vda <= m_sync or mc_vda;
+ vpa <= m_sync or mc_vpa;
+ ml <= mc_ml;
+ sw_int <= opbrk or opcop;
+
+ -- ALU/memory size
+ m_size8 <= '1' when emu = '1' or m_bit = '1' else
+ '1' when op_bus = x"EB" or op_bus = x"AB" else -- when XBA and PLB opcodes the ALU size is always 8 bit
+ '1' when (op_bus = x"AA" or op_bus = x"A8") and x_bit = '1' else -- when TAX and TAY opcodes and X is '1' the ALU size is 8 bit
+ '1' when (op_bus = x"8A" or op_bus = x"98") and m_bit = '1' else -- when TXA and TXA opcodes and M is '1' the ALU size is 8 bit
+ '1' when op_bus = x"68" and m_bit = '1' else -- when PLA opcode and M is '1' the ALU size is 8 bit
+ '1' when (op_bus = x"FA" or op_bus = x"7A") and x_bit = '1' else -- when PLX or PLY opcode and X = '1' the ALU size is 8 bit
+ '0';
+ m_size16 <= '0' when (op_bus = x"5B" or op_bus = x"7B") else -- when TCD or TDC opcodes the transfer size is always 16 bit
+ '0' when (op_bus = x"1B" or op_bus = x"3B") else -- when TCS or TSC opcodes the transfer size is always 16 bit
+ '0' when (op_bus = x"82" or op_bus = x"62") else -- when BRL or PER opcodes the transfer size is always 16 bit
+ '0' when op_bus = x"2B" else -- when PLD opcode the transfer size is always 16 bit
+ '0' when (op_bus = x"AB" and two_byte_op = '1') and emu = '0' else -- when PLR opcode and native mode
+ '0' when ld_acc = '1' and m_bit = '0' else -- when load accumulator C register
+ '0' when ld_xy = '1' and x_bit = '0' else -- when load X/Y registers (16 bit size)
+ '1';
+ s_size16 <= '0' when op_bus = x"EB" else '1'; -- special case for XBA: accumulator size is 16 bit so it can reloads itself swapped in only one cycle
+ m_size <= m_size8 and m_size16; -- ALU size
+ acc_size <= m_size8 and m_size16 and s_size16; -- accumulator register C size
+ index_size <= emu or x_bit; -- index registers size
+
+ -- S native/emulation mode (set by XCE opcode and E bit)
+ sp_emu <= p_bus(0) when op_bus = x"FB" else emu;
+
+ -- register operations
+ a_l_lsb <= regbit(0); -- A load lsb
+ a_l_msb <= regbit(1); -- A load msb
+ a_dec <= regbit(2); -- A decrement
+ x_l_lsb <= regbit(3); -- X load lsb
+ x_l_msb <= regbit(4); -- X load msb
+ x_d <= regbit(5); -- X -= 1
+ x_u <= regbit(6); -- X += 1
+ y_l_lsb <= regbit(7); -- Y load lsb
+ y_l_msb <= regbit(8); -- Y load msb
+ y_d <= regbit(9); -- Y -= 1
+ y_u <= regbit(10); -- Y += 1
+ d_l_lsb <= regbit(11); -- D load lsb
+ d_l_msb <= regbit(12); -- D load msb
+ o_l <= regbit(13); -- O load msb & lsb
+ o_l_lsb <= regbit(14); -- O load lsb
+ o_l_msb <= regbit(15); -- O load msb
+ sp_ll <= regbit(16); -- S load lsb
+ sp_lh <= regbit(17); -- S load msb
+ sp_u <= regbit(18); -- S += 1
+ sp_d <= regbit(19); -- S -= 1
+ k_l <= regbit(20); -- PBR K load
+ b_l <= regbit(21); -- DBR B load
+ k_cl <= regbit(22); -- PBR K clear
+ b_cl <= regbit(23); -- DBR B clear
+ mul_l_res <= regbit(24); -- load multiplication result on A/B and X
+ mul_init <= regbit(25); -- init multiplier
+ mul_start_u <= regbit(26); -- start multiplier unsigned
+ mul_start_s <= regbit(27); -- start multiplier signed
+ wai_set <= regbit(28); -- WAI enter wait
+ stp_set <= regbit(29); -- STP enter wait
+ we <= we_mc or opfetch; -- write enable
+ m_bit <= p_bus(5) or emu; -- M bit
+ x_bit <= p_bus(4) or emu; -- X bit
+ m <= m_bit;
+ x <= x_bit;
+ kr_clear <= i_res or k_cl;
+ br_clear <= i_res or b_cl;
+ ld_acc <= regbit(0) and regbit(1);
+ ld_xy <= (regbit(3) and regbit(4)) or (regbit(7) and regbit(8));
+ -- VPA latched
+ process(clk0)
+ begin
+ if (clk0'event and clk0 = '1') then
+ if i_rdy = '0' then
+ m_sync <= i_sync;
+ else
+ m_sync <= m_sync;
+ end if;
+ end if;
+ end process;
+
+ -- PC carry logic
+ process(o_bus,pc_c_alu_flg)
+ begin
+ if o_bus(7) = '0' then -- check for positive/negative branch offset (bit 7)
+ pcc <= pc_c_alu_flg;
+ else
+ pcc <= not pc_c_alu_flg;
+ end if;
+ end process;
+
+ -- write enable registered
+ process(clk0)
+ begin
+ if (clk0'event and clk0 = '1') then
+ if i_res = '1' then
+ we_r <= '1';
+ else
+ if i_rdy = '0' then
+ we_r <= we_mc_l;
+ else
+ we_r <= we_r;
+ end if;
+ end if;
+ end if;
+ end process;
+
+ rw <= we and we_r;
+
+ -- WAI
+ process(clk0)
+ begin
+ if (clk0'event and clk0 = '1') then
+ if wai_ff = '0' then
+ if wai_set then
+ wai_ff <= '1';
+ else
+ wai_ff <= wai_ff;
+ end if;
+ else
+ if i_res = '1' or i_nmi = '1' or i_irq = '1' then
+ wai_ff <= '0';
+ else
+ wai_ff <= wai_ff;
+ end if;
+ end if;
+ end if;
+ end process;
+ rdy_out <= not wai_ff;
+
+ -- STP
+ process(clk0)
+ begin
+ if (clk0'event and clk0 = '1') then
+ if stp_ff = '0' then
+ if stp_set then
+ stp_ff <= '1';
+ else
+ stp_ff <= stp_ff;
+ end if;
+ else
+ if i_res = '1' then
+ stp_ff <= '0';
+ else
+ stp_ff <= stp_ff;
+ end if;
+ end if;
+ end if;
+ end process;
+ stp_out <= not stp_ff;
+
+
+ -- data bus tristate (buffer ring gated) control logic
+ --process(clk0,we,we_r,alu_bus)
+ --begin
+ -- if clock = '0' and (we = '0' or we_r = '0') then
+ -- data <= alu_bus;
+ -- else
+ -- data <= "ZZZZZZZZ";
+ -- end if;
+ --end process;
+
+
+ data_out <= alu_bus(7 downto 0);
+ dbin <= data_in or "00000000";
+ -- DEBUG
+-- a_reg <= a_bus;
+-- x_reg <= x_bus;
+-- y_reg <= y_bus;
+-- s_reg <= sp_bus;
+-- op_reg <= o_bus;
+-- p_reg <= p_bus;
+-- k_reg <= k_bus;
+-- b_reg <= b_bus;
+-- o_reg <= op_bus;
+-- mcode <= mcscan;
+
+end struct;
+
+
+
Index: trunk/v65c816_bench.vhd
===================================================================
--- trunk/v65c816_bench.vhd (nonexistent)
+++ trunk/v65c816_bench.vhd (revision 2)
@@ -0,0 +1,262 @@
+---------------------------------------------------------------------------------------
+-- CN3 glue logic --
+-- autoinitializing logic --
+-- full synchronous logic design --
+-- full VHDL-RTL style coding design --
+-- target: ALTERA CPLD MAX II EPM570F256C5 --
+-- project by Valerio Venturi ELMA Riva del Garda (TN) Italy (2009) --
+-- Date: 16/10/2009 --
+---------------------------------------------------------------------------------------
+
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+
+-- global architecture
+entity v65c816_bench is
+end v65c816_bench;
+
+use work.v65c816;
+
+architecture behavior of v65c816_bench is
+ component v65c816 is
+ port( clk0: in STD_LOGIC; -- PHASE0 clock input
+ res: in STD_LOGIC; -- reset input
+ irq: in STD_LOGIC; -- interrupt request input
+ nmi: in STD_LOGIC; -- not maskable interrupt input
+ rdy: in STD_LOGIC; -- wait state input (read/write)
+ rw: out STD_LOGIC; -- read/write out
+ vpa: out STD_LOGIC; -- vpa
+ vda: out STD_LOGIC; -- vda
+ vp: out STD_LOGIC; -- vector pull
+ ope: out STD_LOGIC; -- microcode end
+ e: out STD_LOGIC; -- emulation (1)/native mode (0)
+ m: out STD_LOGIC; -- M status
+ x: out STD_LOGIC; -- X status
+ op_exp: out STD_LOGIC; -- two byte instruction running
+ addr: out STD_LOGIC_VECTOR(23 downto 0); -- 16 bit address bus out
+ data_in: in STD_LOGIC_VECTOR(7 downto 0); -- 8 bit input data bus
+ data_out: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit output data bus
+ a_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit A register
+ x_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit X register
+ y_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Y register
+ s_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit S register
+ op_reg: out STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Operand register
+ p_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit P register
+ k_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit K register
+ b_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit B register
+ o_reg: out STD_LOGIC_VECTOR(7 downto 0); -- 8 bit Opcode register
+ mcode: out STD_LOGIC_VECTOR(3 downto 0) -- 4 bit microcode sequence register
+ );
+ end component;
+
+ signal clk0,res,irq,nmi,rdy,rw,vpa,vda,vp,ope,e,m,x,op_exp: STD_LOGIC;
+ signal addr: STD_LOGIC_VECTOR(23 downto 0);
+ signal data_in: STD_LOGIC_VECTOR(7 downto 0);
+ signal data_out: STD_LOGIC_VECTOR(7 downto 0);
+ signal a_reg: STD_LOGIC_VECTOR(15 downto 0); -- 16 bit A register
+ signal x_reg: STD_LOGIC_VECTOR(15 downto 0); -- 16 bit X register
+ signal y_reg: STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Y register
+ signal s_reg: STD_LOGIC_VECTOR(15 downto 0); -- 16 bit S register
+ signal op_reg: STD_LOGIC_VECTOR(15 downto 0); -- 16 bit Operand register
+ signal p_reg: STD_LOGIC_VECTOR(7 downto 0); -- 8 bit P register
+ signal k_reg: STD_LOGIC_VECTOR(7 downto 0); -- 8 bit K register
+ signal b_reg: STD_LOGIC_VECTOR(7 downto 0); -- 8 bit B register
+ signal o_reg: STD_LOGIC_VECTOR(7 downto 0); -- 8 bit Opcode register
+ signal mcode: STD_LOGIC_VECTOR(3 downto 0); -- 4 bit microcode sequence register
+
+ constant clk_period: time := 50 ns;
+ --signal clock: STD_LOGIC := '0';
+
+ begin
+ u1: v65c816 port map(
+ clk0,
+ res,
+ irq,
+ nmi,
+ rdy,
+ rw,
+ vpa,
+ vda,
+ vp,
+ ope,
+ e,
+ m,
+ x,
+ op_exp,
+ addr,
+ data_in,
+ data_out,
+ a_reg,
+ x_reg,
+ y_reg,
+ s_reg,
+ op_reg,
+ p_reg,
+ k_reg,
+ b_reg,
+ o_reg,
+ mcode
+ );
+
+
+ tst_clock: process -- 10 MHZ (period 100 ns) clock generation
+ variable clktmp: STD_LOGIC := '0';
+ begin
+ clktmp := not clktmp;
+ clk0 <= clktmp;
+ wait for 50 ns;
+ end process;
+
+ stimulus: process
+ begin
+ -- signal initialization before reset
+ res <= '0';
+ irq <= '1';
+ nmi <= '1';
+ rdy <= '1';
+ wait for 350 ns;
+
+ -- device reset completed
+ res <= '1';
+ wait for 600 ns;
+ data_in <= "00000000"; -- fetch lsb reset PC vector 0x00
+ wait for 50 ns;
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11000001"; -- fetch msb reset PC vector 0xc1 (0xc100)
+ wait for 70 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "00011000"; -- CLC
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "11111011"; -- XCE
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ"; -- XCE execution
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "11000010"; -- REP #%00100000
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "00100000"; -- $20
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "10101001"; -- LDA #$0000
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "00000000"; -- $00
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "00000000"; -- $00
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ wait for 50 ns;
+ data_in <= "00011000"; -- CLC
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "01101001"; -- ADC #$0001
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "00000001"; -- $01
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "00000000"; -- $00
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "00111000"; -- SEC
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101001"; -- SBC #0002
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "00000010"; -- $02
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "00000000"; -- $00
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+ data_in <= "ZZZZZZZZ";
+ wait for 50 ns;
+ data_in <= "11101010"; -- NOP
+ wait for 50 ns;
+ data_in <= "ZZZZZZZZ";
+
+
+ --wait for 1000000 ns;
+ wait;
+ end process;
+end behavior;
+
+
+
Index: trunk/xr.vhd
===================================================================
--- trunk/xr.vhd (nonexistent)
+++ trunk/xr.vhd (revision 2)
@@ -0,0 +1,53 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit index register "X"
+entity xr is
+ port( clk: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC;
+ ld_msb: in STD_LOGIC;
+ ld_mul_msb: in STD_LOGIC;
+ u: in STD_LOGIC;
+ d: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ mul_msb: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end xr;
+
+architecture rtl of xr is
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+signal op: STD_LOGIC_VECTOR(4 downto 0);
+begin
+ op <= ld_mul_msb & u & d & ld_msb & ld_lsb;
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ case op is
+ when "00001" => reg(7 downto 0) <= din(7 downto 0); -- load lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "00010" => reg(15 downto 8) <= din(7 downto 0); -- load msb
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "00011" => reg <= din; -- load msb & lsb
+ when "00100" => reg <= reg - "0000000000000001"; -- decrement
+ when "01000" => reg <= reg + "0000000000000001"; -- increment
+ when "10000" => reg <= mul_msb; -- load multiplication msb result
+ when others => reg <= reg;
+ end case;
+ if size = '1' then
+ reg(15 downto 8) <= (others => '0'); -- with size = '1' (X = '1') the msb of index register is always zero
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+
Index: trunk/yr.vhd
===================================================================
--- trunk/yr.vhd (nonexistent)
+++ trunk/yr.vhd (revision 2)
@@ -0,0 +1,54 @@
+library IEEE;
+use IEEE.std_logic_1164.all; -- defines std_logic types
+use IEEE.STD_LOGIC_unsigned.all;
+use IEEE.STD_LOGIC_arith.all;
+
+-- 16 bit index register "Y"
+entity yr is
+ port( clk: in STD_LOGIC;
+ fwait: in STD_LOGIC;
+ size: in STD_LOGIC;
+ ld_lsb: in STD_LOGIC;
+ ld_msb: in STD_LOGIC;
+ u: in STD_LOGIC;
+ d: in STD_LOGIC;
+ din: in STD_LOGIC_VECTOR(15 downto 0);
+ dout: out STD_LOGIC_VECTOR(15 downto 0)
+ );
+end yr;
+
+architecture rtl of yr is
+signal reg: STD_LOGIC_VECTOR(15 downto 0);
+signal op: STD_LOGIC_VECTOR(3 downto 0);
+begin
+ op <= u & d & ld_msb & ld_lsb;
+ process(clk)
+ begin
+ if (clk'event and clk = '1') then
+ if fwait = '1' then
+ reg <= reg;
+ else
+ if fwait = '1' then
+ reg <= reg;
+ else
+ case op is
+ when "0001" => reg(7 downto 0) <= din(7 downto 0); -- load lsb
+ reg(15 downto 8) <= reg(15 downto 8);
+ when "0010" => reg(15 downto 8) <= din(7 downto 0); -- load msb
+ reg(7 downto 0) <= reg(7 downto 0);
+ when "0011" => reg <= din; -- load msb & lsb
+ when "0100" => reg <= reg - "0000000000000001"; -- decrement
+ when "1000" => reg <= reg + "0000000000000001"; -- increment
+ when others => reg <= reg;
+ end case;
+ if size = '1' then
+ reg(15 downto 8) <= (others => '0'); -- with size = '1' (X = '1') the msb of index register is always zero
+ end if;
+ end if;
+ end if;
+ end if;
+ end process;
+ dout <= reg;
+end rtl;
+
+