📄 ir_decoder_spec.vhd
字号:
t1_cmd <= direct_T; data_t1 <= "001"; -- use byte
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';
use_cy <= '1';
dest_cmd <= use_acc;
WHEN "10010110" | "10010111" => -- SUBB "96" - "97"
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
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';
use_cy <= '1';
dest_cmd <= use_acc;
WHEN "10011000" | "10011001" | "10011010" | "10011011" |
"10011100" | "10011101" | "10011110" | "10011111" => -- SUBB 98-9F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
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';
use_cy <= '1';
dest_cmd <= use_acc;
WHEN "10100110" | "10100111" => -- MOV A6-7
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= indirect_T; data_dest <= "00"&ir(0);
WHEN "10101000" | "10101001" | "10101010" | "10101011" |
"10101100" | "10101101" | "10101110" | "10101111" => -- MOV A8-AF
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0);
WHEN "10110100" => -- CJNE A,#data,rel B4
t1_cmd <= immed; data_t1 <= "001";
t2_cmd <= use_acc;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= nothing;
WHEN "10110101" => -- CJNE B5
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= use_acc;
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= nothing;
WHEN "10110110" | "10110111" => -- CJNE B6-7
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= immed; data_t2 <= "001";
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= nothing;
WHEN "10111000" | "10111001" | "10111010" | "10111011" |
"10111100" | "10111101" | "10111110" | "10111111" => -- CJNE B8-F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= immed; data_t2 <= "001";
alu_cmd <= pass_tmp1; data_alu <= "000";
dest_cmd <= nothing;
WHEN "11000100" => -- SWAP C4
t1_cmd <= zeros;
t2_cmd <= use_acc;
alu_cmd <= rotate; data_alu <= swap_instr;
dest_cmd <= use_acc;
WHEN "11000101" => -- XCH C5
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= use_acc;
IF alu_second_result = '1' THEN
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
ELSE
alu_cmd <= pass_tmp2;
--dest_cmd <= direct_T;
dest_cmd <= same_as_t1;
END IF;
data_alu <= "000";
data_dest <= "001";
two_dests <= '1';
WHEN "11000110" | "11000111" => -- XCH C6-7
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= use_acc;
IF alu_second_result = '1' THEN
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
ELSE
alu_cmd <= pass_tmp2;
--dest_cmd <= indirect_T;
dest_cmd <= same_as_t1;
END IF;
data_alu <= "000";
data_dest <= "00"&ir(0);
two_dests <= '1';
WHEN "11001000" | "11001001" | "11001010" | "11001011" |
"11001100" | "11001101" | "11001110" | "11001111" => -- XCH C8-F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= use_acc;
IF alu_second_result = '1' THEN
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
ELSE
alu_cmd <= pass_tmp2;
--dest_cmd <= use_reg;
dest_cmd <= same_as_t1;
END IF;
data_alu <= "000";
data_dest <= ir(2 DOWNTO 0);
two_dests <= '1';
WHEN "11010110" | "11010111" => -- XCHD A,@Ri D6-7
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= use_acc;
-- swap the lower nibbles
IF alu_second_result = '1' THEN
alu_cmd <= rotate;
dest_cmd <= use_acc;
ELSE
alu_cmd <= xchd1;
--dest_cmd <= indirect_T;
dest_cmd <= same_as_t1;
END IF;
data_alu <= xchd2;
data_dest <= "00"&ir(0);
two_dests <= '1';
WHEN "11010101" => -- DJNZ direct_T,rel D5
t1_cmd <= direct_T; data_t2 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= t1_dec;
--dest_cmd <= direct_T; data_dest <= "001";
dest_cmd <= same_as_t1;
read_latch <= '1';
WHEN "11011000" | "11011001" | "11011010" | "11011011" |
"11011100" | "11011101" | "11011110" | "11011111" => -- DJNZ Rn D8-F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= zeros;
alu_cmd <= pass_tmp1; data_alu <= t1_dec;
--dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0);
dest_cmd <= same_as_t1;
WHEN "11100100" => -- CLR A E4
t1_cmd <= zeros;
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
WHEN "11110100" => -- CPL A F4
t1_cmd <= zeros;
t2_cmd <= use_acc;
alu_cmd <= logic; data_alu <= cpl_instr;
dest_cmd <= use_acc;
WHEN "11100101" => -- MOV E5
t1_cmd <= direct_T; data_t1 <= "001";
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
WHEN "11100110" | "11100111" => -- MOV E6-7
t1_cmd <= indirect_T; data_t1 <= "00"&ir(0);
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
WHEN "11101000" | "11101001" | "11101010" | "11101011" |
"11101100" | "11101101" | "11101110" | "11101111" => -- MOV E8-F
t1_cmd <= use_reg; data_t1 <= ir(2 DOWNTO 0);
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= use_acc;
WHEN "11110101" => -- MOV F5
t1_cmd <= use_acc;
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= direct_T; data_dest <= "001";
WHEN "11110110" | "11110111" => -- MOV F6-7
t1_cmd <= use_acc;
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= indirect_T; data_dest <= "00"&ir(0);
WHEN "11111000" | "11111001" | "11111010" | "11111011" |
"11111100" | "11111101" | "11111110" | "11111111" => -- MOV F8-F
t1_cmd <= use_acc;
t2_cmd <= zeros;
alu_cmd <= pass_tmp1;
dest_cmd <= use_reg; data_dest <= ir(2 DOWNTO 0);
WHEN "10010011" | "10000011" => -- MOVC
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "11100010" | "11100011" => -- MOVX A,@Ri
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "11100000" => -- MOVX A,@DPTR
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "11110010" | "11110011" => -- MOVX @Ri,A
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "11110000" => -- MOVX @DPTR,A
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
-- THE FOLLOWING SIX INSTRUCTIONS ARE NOT IMPLEMENTED
WHEN "10010000" => -- MOV DPTR, #data16
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "01110011" => -- JMP @A + DPTR
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "10100011" => -- INC DPTR
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "10100100" => -- MUL
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "10000100" => -- DIV
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
WHEN "11010100" => -- DA
t1_cmd <= nothing;
t2_cmd <= nothing;
alu_cmd <= pass_tmp1;
dest_cmd <= nothing;
-- EVERYTHING EXCEPT THESE LAST SIX SHOULD BE IMPLEMENTED
END CASE;
END PROCESS p1;
END ARCHITECTURE spec;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -