📄 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 + -