📄 opcode_decoder.vhd
字号:
OP_CAT <= MOVE_cRR_RU; LAST <= M2; D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_UM; D_SA <= ADR_cRR_L; D_RD_O <= IS_M1; D_WE_RR <= IS_M2; PC_OP <= pc(IS_M1, PC_WAIT); when "1001001" => OP_CAT <= MOVE_ci_RR; LAST <= M4; D_SX <= SX_RR; D_SY <= SY_UM; PC_OP <= pc(IS_M3, PC_WAIT); D_OP <= mix(IS_M4); D_WE_RR <= IS_M3_M4; D_SA <= hadr(IS_M3, ADR_cI16_H); D_RD_O <= IS_M2_M3; D_LOCK <= IS_M2; when "1001010" => OP_CAT <= MOVE_ci_RS; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_SM; D_SA <= ADR_cI16_L; D_RD_O <= IS_M2; D_WE_RR <= IS_M3; when "1001011" => OP_CAT <= MOVE_ci_RU; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_UM; D_SA <= ADR_cI16_L; D_RD_O <= IS_M2; D_WE_RR <= IS_M3; when "1001100" => OP_CAT <= MOVE_ci_LL; LAST <= M4; D_SX <= SX_LL; D_SY <= SY_UM; PC_OP <= pc(IS_M3, PC_WAIT); D_OP <= mix(IS_M4); D_SA <= hadr(IS_M3, ADR_cI16_H); D_RD_O <= IS_M2_M3; D_LOCK <= IS_M2; D_WE_LL <= IS_M3_M4; when "1001101" => OP_CAT <= MOVE_ci_LS; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_SM; D_SA <= ADR_cI16_L; D_RD_O <= IS_M2; D_WE_LL <= IS_M3; when "1001110" => OP_CAT <= MOVE_ci_LU; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_UM; D_SA <= ADR_cI16_L; D_RD_O <= IS_M2; D_WE_LL <= IS_M3; when "1001111" => OP_CAT <= MOVE_RR_SP; D_SA <= ADR_cRR_L; D_WE_SP <= SP_LOAD; -- 55555555555555555555555555555555555555555555555555555555555555555555 when "1010000" => -- spare when "1010001" => -- spare when "1010010" => OP_CAT <= LSL_RR_i; LAST <= M2; D_OP <= ALU_X_LSL_Y; D_SX <= SX_RR; D_SY <= SY_UI8; D_WE_RR <= IS_M1; when "1010011" => OP_CAT <= ASR_RR_i; LAST <= M2; D_OP <= ALU_X_ASR_Y; D_SX <= SX_RR; D_SY <= SY_UI8; D_WE_RR <= IS_M1; when "1010100" => OP_CAT <= LSR_RR_i; LAST <= M2; D_OP <= ALU_X_LSR_Y; D_SX <= SX_RR; D_SY <= SY_UI8; D_WE_RR <= IS_M1; when "1010101" => OP_CAT <= LSL_LL_RR; D_OP <= ALU_X_LSL_Y; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1010110" => OP_CAT <= ASR_LL_RR; D_OP <= ALU_X_ASR_Y; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1010111" => OP_CAT <= LSR_LL_RR; D_OP <= ALU_X_LSR_Y; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1011000" => OP_CAT <= ADD_LL_RR; D_OP <= ALU_X_ADD_Y; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1011001" => OP_CAT <= SUB_LL_RR; D_OP <= ALU_X_SUB_Y; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1011010" => OP_CAT <= MOVE_RR_ci; LAST <= M3; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= hadr(IS_M3, ADR_cI16_H); D_WE_O <= IS_M2_M3; D_LOCK <= IS_M2; D_SMQ <= IS_M3; when "1011011" => OP_CAT <= MOVE_R_ci; LAST <= M3; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= ADR_cI16_L; D_WE_O <= IS_M2; when "1011100" => -- long offset / long move OP_CAT <= MOVE_RR_uSP; LAST <= M3; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= hadr(IS_M3, ADR_16SP_H); D_WE_O <= IS_M2_M3; D_LOCK <= IS_M2; D_SMQ <= IS_M3; when "1011101" => -- short offset / long move OP_CAT <= MOVE_RR_uSP; LAST <= M2; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= hadr(IS_M2, ADR_8SP_H); D_WE_O <= IS_M1_M2; D_LOCK <= IS_M1; D_SMQ <= IS_M2; when "1011110" => -- long offset / short move OP_CAT <= MOVE_R_uSP; LAST <= M3; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= ADR_16SP_L; D_WE_O <= IS_M2; D_OP <= ALU_X_OR_Y; when "1011111" => -- short offset / short move OP_CAT <= MOVE_R_uSP; LAST <= M2; D_SX <= SX_RR; D_SY <= SY_SY0; D_OP <= ALU_X_OR_Y; D_SA <= ADR_8SP_L; D_WE_O <= IS_M1; D_OP <= ALU_X_OR_Y; -- 66666666666666666666666666666666666666666666666666666666666666666666 when "1100000" => -- long offset, long move OP_CAT <= MOVE_uSP_RR; LAST <= M4; D_SX <= SX_RR; D_SY <= SY_UM; PC_OP <= pc(IS_M3, PC_WAIT); D_OP <= mix(IS_M3_M4); D_SA <= hadr(IS_M3, ADR_16SP_H); D_RD_O <= IS_M2_M3; D_LOCK <= IS_M2; D_WE_RR <= IS_M3_M4; when "1100001" => -- short offset, long move OP_CAT <= MOVE_uSP_RR; LAST <= M3; D_SX <= SX_RR; D_SY <= SY_UM; PC_OP <= pc(IS_M2, PC_WAIT); D_OP <= mix(IS_M3); D_SA <= hadr(IS_M2, ADR_8SP_H); D_RD_O <= IS_M1_M2; D_LOCK <= IS_M1; D_WE_RR <= IS_M2_M3; when "1100010" => -- long offset, short move OP_CAT <= MOVE_uSP_RS; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_SM; D_SA <= ADR_16SP_L; D_RD_O <= IS_M2; D_WE_RR <= IS_M3; when "1100011" => -- short offset, short move OP_CAT <= MOVE_uSP_RS; LAST <= M2; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_SM; D_SA <= ADR_8SP_L; D_RD_O <= IS_M1; D_WE_RR <= IS_M2; when "1100100" => -- long offset, short move OP_CAT <= MOVE_uSP_RU; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_UM; D_SA <= ADR_16SP_L; D_RD_O <= IS_M2; D_WE_RR <= IS_M3; when "1100101" => -- short offset, short move OP_CAT <= MOVE_uSP_RU; LAST <= M2; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_UM; D_SA <= ADR_8SP_L; D_RD_O <= IS_M1; D_WE_RR <= IS_M2; when "1100110" => -- long offset, long move OP_CAT <= MOVE_uSP_LL; LAST <= M4; D_SX <= SX_LL; D_SY <= SY_UM; PC_OP <= pc(IS_M3, PC_WAIT); D_OP <= mix(IS_M4); D_SA <= hadr(IS_M3, ADR_8SP_H); D_RD_O <= IS_M2_M3; D_LOCK <= IS_M2; D_WE_LL <= IS_M3_M4; when "1100111" => -- short offset, long move OP_CAT <= MOVE_uSP_LL; LAST <= M3; D_SX <= SX_LL; D_SY <= SY_UM; PC_OP <= pc(IS_M2, PC_WAIT); D_OP <= mix(IS_M3); D_SA <= hadr(IS_M2, ADR_8SP_H); D_RD_O <= IS_M1_M2; D_LOCK <= IS_M1; D_WE_LL <= IS_M2_M3; when "1101000" => -- long offset, short move OP_CAT <= MOVE_uSP_LS; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_SM; D_SA <= ADR_16SP_L; D_RD_O <= IS_M2; D_WE_LL <= IS_M3; when "1101001" => -- short offset, short move OP_CAT <= MOVE_uSP_LS; LAST <= M2; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_SM; D_SA <= ADR_8SP_L; D_RD_O <= IS_M1; D_WE_LL <= IS_M2; when "1101010" => -- long offset, short move OP_CAT <= MOVE_uSP_LU; LAST <= M3; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_UM; D_SA <= ADR_16SP_L; D_RD_O <= IS_M2; D_WE_LL <= IS_M3; when "1101011" => -- short offset, short move OP_CAT <= MOVE_uSP_LU; LAST <= M2; D_OP <= ALU_MOVE_Y; D_SX <= SX_RR; D_SY <= SY_UM; D_SA <= ADR_8SP_L; D_RD_O <= IS_M1; D_WE_LL <= IS_M2; when "1101100" => OP_CAT <= LEA_uSP_RR; LAST <= M3; D_OP <= ALU_X_ADD_Y; D_SX <= SX_SP; D_SY <= SY_I16; D_WE_RR <= IS_M2; when "1101101" => OP_CAT <= LEA_uSP_RR; LAST <= M2; D_OP <= ALU_X_ADD_Y; D_SX <= SX_SP; D_SY <= SY_UI8; D_WE_RR <= IS_M1; when "1101110" => OP_CAT <= MOVE_dRR_dLL; LAST <= M3; D_WE_RR <= IS_M1; D_RD_O <= IS_M1; D_WE_O <= IS_M2; D_WE_LL <= IS_M3; PC_OP <= pc(IS_M1_M2, PC_WAIT); case OP_CYC is when M1 => -- decrement RR D_OP <= ALU_X_SUB_Y; D_SX <= SX_RR; D_SY <= SY_SY1; D_SA <= ADR_dRR; when M2 => -- write read memory D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_UM; D_SA <= ADR_dLL; when others => -- decrement LL D_OP <= ALU_X_SUB_Y; D_SX <= SX_LL; D_SY <= SY_SY1; end case; when "1101111" => OP_CAT <= MOVE_RRi_LLi; LAST <= M3; D_WE_RR <= IS_M1; D_RD_O <= IS_M1; D_WE_O <= IS_M2; D_WE_LL <= IS_M3; PC_OP <= pc(IS_M1_M2, PC_WAIT); case OP_CYC is when M1 => -- decrement RR D_OP <= ALU_X_ADD_Y; D_SX <= SX_RR; D_SY <= SY_SY1; D_SA <= ADR_RRi; when M2 => -- write read memory D_OP <= ALU_MOVE_Y; D_SX <= SX_ANY; D_SY <= SY_UM; D_SA <= ADR_dLL; when others => -- decrement LL D_OP <= ALU_X_ADD_Y; D_SX <= SX_LL; D_SY <= SY_SY1; end case; -- 77777777777777777777777777777777777777777777777777777777777777777777 when "1110000" => OP_CAT <= MUL_IS; D_OP <= ALU_MUL_IS; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110001" => OP_CAT <= MUL_IU; D_OP <= ALU_MUL_IU; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110010" => OP_CAT <= DIV_IS; D_OP <= ALU_DIV_IS; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110011" => OP_CAT <= DIV_IU; D_OP <= ALU_DIV_IU; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110100" => OP_CAT <= MD_STEP; D_OP <= ALU_MD_STP; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110101" => OP_CAT <= MD_FIN; D_OP <= ALU_MD_FIN; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110110" => OP_CAT <= MOD_FIN; D_OP <= ALU_MOD_FIN; D_SX <= SX_LL; D_SY <= SY_RR; D_WE_RR <= IS_M1; when "1110111" => OP_CAT <= EI; ENABLE_INT <= IS_M1; when "1111001" => OP_CAT <= DI; DISABLE_INT <= IS_M1; -- undefined -------------------------------------------------------- when others => end case; end if; end process;end Behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -