📄 ir_decoder_spec.vhd
字号:
WHEN "01000110" | "01000111" => -- ORL A,@Ri "46" - "47"
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= orl_instr;
dest_cmd <= use_acc;
WHEN "01001000" | "01001001" | "01001010" | "01001011" |
"01001100" | "01001101" | "01001110" | "01001111" => -- ORL 48-4F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= orl_instr;
dest_cmd <= use_acc;
WHEN "01010010" => -- ANL direct_T,A "52"
t1_cmd <= direct_T; data_t1 <= "001" ;
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "01010011" => -- ANL "53"
t1_cmd <= immed; data_t1 <= "010" ;
t2_cmd <= direct_T; data_t2 <= "001";
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "01010100" => -- ANL "54"
t1_cmd <= immed; data_t1 <= "001" ;
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= use_acc;
WHEN "01010101" => -- ANL "55"
t1_cmd <= direct_T; data_t1 <= "001"; -- use byte
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= use_acc;
WHEN "01010110" | "01010111" => -- ANL "56" - "57"
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= use_acc;
WHEN "01011000" | "01011001" | "01011010" | "01011011" |
"01011100" | "01011101" | "01011110" | "01011111" => -- ANL 58-5F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"101"
dest_cmd <= use_acc;
WHEN "01100010" => -- XRL "62"
t1_cmd <= direct_T; data_t1 <= "001" ;
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "01100011" => -- XRL "63"
t1_cmd <= immed; data_t1 <= "010" ;
t2_cmd <= direct_T; data_t2 <= "001";
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "01100100" => -- XRL "64"
t1_cmd <= immed; data_t1 <= "001" ;
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= use_acc;
WHEN "01100101" => -- XRL "65"
t1_cmd <= direct_T; data_t1 <= "001"; -- use byte
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= use_acc;
WHEN "01100110" | "01100111" => -- XRL "66" - "67"
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= use_acc;
WHEN "01101000" | "01101001" | "01101010" | "01101011" |
"01101100" | "01101101" | "01101110" | "01101111" => -- XRL 68-6F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= ir(6 DOWNTO 4); --"110"
dest_cmd <= use_acc;
WHEN "00010000" => -- JBC "10"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= nothing;
alu_cmd <= clr_bit; data_alu <= mov_instr;
use_cy <= '0';
--dest_cmd <= bit_addr; data_dest <= "001";
dest_cmd <= same_as_t1;
WHEN "00100000" => -- JB "20"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= nothing;
alu_cmd <= bit_logic; data_alu <= mov_instr;
use_cy <= '0';
dest_cmd <= nothing;
WHEN "00110000" => -- JNB "30"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= nothing;
alu_cmd <= cpl_bit_logic; data_alu <= mov_instr;
use_cy <= '0';
dest_cmd <= nothing;
WHEN "01000000" => -- JC "40"
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= bit_logic; data_alu <= mov_instr;
use_cy <= '1';
dest_cmd <= nothing;
WHEN "01010000" => -- JNC "50"
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= cpl_bit_logic; data_alu <= mov_instr;
use_cy <= '1';
dest_cmd <= nothing;
WHEN "01100000" => -- JZ "60"
t1_cmd <= zeros;
t2_cmd <= use_acc;
alu_cmd <= compare_1_2; data_alu <= "000";
dest_cmd <= nothing;
WHEN "01110000" => -- JNZ "70"
t1_cmd <= zeros;
t2_cmd <= use_acc;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= nothing;
WHEN "01110010" => -- ORL C, bit "72"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= bit_logic; data_alu <= orl_instr;
set_cy <= '1';
dest_cmd <= nothing;
WHEN "10000010" => -- ANL C, bit "82"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= bit_logic; data_alu <= anl_instr;
set_cy <= '1';
dest_cmd <= nothing;
WHEN "10100000" => -- ORL C, /bit "A0"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= cpl_bit_logic; data_alu <= orl_instr;
set_cy <= '1';
dest_cmd <= nothing;
WHEN "10110000" => -- ANL C, bit "B0"
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= cpl_bit_logic; data_alu <= anl_instr;
set_cy <= '1';
dest_cmd <= nothing;
WHEN "01110100" => -- MOV A,#data 74
t1_cmd <= immed; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= use_acc;
WHEN "01110101" => -- MOV 75
t1_cmd <= immed; data_t1 <= "010";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= direct_T; data_dest <= "001";
WHEN "01110110" | "01110111" => -- MOV 76-7
t1_cmd <= immed; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= indirect_T; data_dest <="00"&ir(0);
WHEN "01111000" | "01111001" | "01111010" | "01111011" |
"01111100" | "01111101" | "01111110" | "01111111" => -- MOV 78-F
t1_cmd <= immed; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0);
WHEN "10000000" => -- SJMP rel 80
t1_cmd <= zeros;
t2_cmd <= zeros;
alu_cmd <= compare_1_2;
dest_cmd <= nothing;
WHEN "10000101" => -- MOV direct_T, direct_T 85
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= direct_T; data_dest <= "010";
WHEN "10000110" | "10000111" => -- MOV direct_T,ARi 86-7
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= direct_T; data_dest <= "001";
WHEN "10001000" | "10001001" | "10001010" | "10001011" |
"10001100" | "10001101" | "10001110" | "10001111" => -- MOV 88-F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= direct_T; data_dest <= "001";
WHEN "10010010" => -- MOV bit, C 92
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
use_cy <= '1';
alu_cmd <= bit_logic; data_alu <= mov_instr;
--dest_cmd <= bit_addr; data_dest <= "001";
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "10100010" => -- MOV C, bit A2
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= bit_logic; data_alu <= mov_instr;
set_cy <= '1';
dest_cmd <= nothing;
WHEN "10110010" => -- CPL bit B2
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= cpl_bit_logic; data_alu <= mov_instr;
--dest_cmd <= bit_addr; data_dest <= "001";
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "11000010" => -- CLR bit C2
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= clr_bit;
--dest_cmd <= bit_addr; data_dest <= "001";
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "11010010" => -- SET bit D2
t1_cmd <= bit_addr; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= set_bit;
--dest_cmd <= bit_addr; data_dest <= "001";
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "10110011" => -- CPL Cy
t1_cmd <= zeros;
t2_cmd <= zeros;
use_cy <= '1'; set_cy <= '1';
alu_cmd <= cpl_bit_logic; data_alu <= mov_instr;
dest_cmd <= nothing;
WHEN "11000011" => -- CLR Cy
t1_cmd <= zeros;
t2_cmd <= zeros;
use_cy <= '1'; set_cy <= '1';
alu_cmd <= clr_bit;
dest_cmd <= nothing;
WHEN "11010011" => -- SET Cy
t1_cmd <= zeros;
t2_cmd <= zeros;
use_cy <= '1'; set_cy <= '1';
alu_cmd <= set_bit;
dest_cmd <= nothing;
WHEN "10010100" => -- SUBB "94"
t1_cmd <= immed; data_t1 <= "001" ;
t2_cmd <= use_acc;
alu_cmd <= add_instr;
IF cy_int = '0' THEN -- no borrow needed
data_alu <= "101"; -- cpl & inc (2's complement)
ELSE
data_alu <= "100"; -- cpl but don't inc to make it 2's cpl - 1
END IF;
set_cy <= '1'; set_ac_ov <= '1';
dest_cmd <= use_acc;
WHEN "10010101" => -- SUBB "95"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -