📄 t80_mcode.vhd
字号:
if MCycle = "001" then ALU_Op <= "1011"; Read_To_Reg <= '1'; Save_ALU <= '1'; end if; when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => -- RES b,(HL) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 | 7 => Set_Addr_To <= aXY; when 2 => ALU_Op <= "1011"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_Addr_To <= aXY; TStates <= "100"; when 3 => Write <= '1'; when others => end case; end case; when others =>---------------------------------------------------------------------------------- ED prefixed instructions-------------------------------------------------------------------------------- case IRB is when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000110"|"00000111" |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001110"|"00001111" |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010110"|"00010111" |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011110"|"00011111" |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100110"|"00100111" |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101110"|"00101111" |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110110"|"00110111" |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111110"|"00111111" |"10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000110"|"10000111" |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001110"|"10001111" |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010110"|"10010111" |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011110"|"10011111" | "10100100"|"10100101"|"10100110"|"10100111" | "10101100"|"10101101"|"10101110"|"10101111" | "10110100"|"10110101"|"10110110"|"10110111" | "10111100"|"10111101"|"10111110"|"10111111" |"11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000110"|"11000111" |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001110"|"11001111" |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010110"|"11010111" |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011110"|"11011111" |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100110"|"11100111" |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101110"|"11101111" |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110110"|"11110111" |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111110"|"11111111" => null; -- NOP, undocumented when "01111110"|"01111111" => -- NOP, undocumented null;-- 8 BIT LOAD GROUP when "01010111" => -- LD A,I Special_LD <= "100"; TStates <= "101"; when "01011111" => -- LD A,R Special_LD <= "101"; TStates <= "101"; when "01000111" => -- LD I,A Special_LD <= "110"; TStates <= "101"; when "01001111" => -- LD R,A Special_LD <= "111"; TStates <= "101";-- 16 BIT LOAD GROUP when "01001011"|"01011011"|"01101011"|"01111011" => -- LD dd,(nn) MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Set_Addr_To <= aZI; Inc_PC <= '1'; LDW <= '1'; when 4 => Read_To_Reg <= '1'; if IR(5 downto 4) = "11" then Set_BusA_To <= "1000"; else Set_BusA_To(2 downto 1) <= IR(5 downto 4); Set_BusA_To(0) <= '1'; end if; Inc_WZ <= '1'; Set_Addr_To <= aZI; when 5 => Read_To_Reg <= '1'; if IR(5 downto 4) = "11" then Set_BusA_To <= "1001"; else Set_BusA_To(2 downto 1) <= IR(5 downto 4); Set_BusA_To(0) <= '0'; end if; when others => null; end case; when "01000011"|"01010011"|"01100011"|"01110011" => -- LD (nn),dd MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Set_Addr_To <= aZI; Inc_PC <= '1'; LDW <= '1'; if IR(5 downto 4) = "11" then Set_BusB_To <= "1000"; else Set_BusB_To(2 downto 1) <= IR(5 downto 4); Set_BusB_To(0) <= '1'; Set_BusB_To(3) <= '0'; end if; when 4 => Inc_WZ <= '1'; Set_Addr_To <= aZI; Write <= '1'; if IR(5 downto 4) = "11" then Set_BusB_To <= "1001"; else Set_BusB_To(2 downto 1) <= IR(5 downto 4); Set_BusB_To(0) <= '0'; Set_BusB_To(3) <= '0'; end if; when 5 => Write <= '1'; when others => null; end case; when "10100000" | "10101000" | "10110000" | "10111000" => -- LDI, LDD, LDIR, LDDR MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aXY; IncDec_16 <= "1100"; -- BC when 2 => Set_BusB_To <= "0110"; Set_BusA_To(2 downto 0) <= "111"; ALU_Op <= "0000"; Set_Addr_To <= aDE; if IR(3) = '0' then IncDec_16 <= "0110"; -- IX else IncDec_16 <= "1110"; end if; when 3 => I_BT <= '1'; TStates <= "101"; Write <= '1'; if IR(3) = '0' then IncDec_16 <= "0101"; -- DE else IncDec_16 <= "1101"; end if; when 4 => NoRead <= '1'; TStates <= "101"; when others => null; end case; when "10100001" | "10101001" | "10110001" | "10111001" => -- CPI, CPD, CPIR, CPDR MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aXY; IncDec_16 <= "1100"; -- BC when 2 => Set_BusB_To <= "0110"; Set_BusA_To(2 downto 0) <= "111"; ALU_Op <= "0111"; Save_ALU <= '1'; PreserveC <= '1'; if IR(3) = '0' then IncDec_16 <= "0110"; else IncDec_16 <= "1110"; end if; when 3 => NoRead <= '1'; I_BC <= '1'; TStates <= "101"; when 4 => NoRead <= '1'; TStates <= "101"; when others => null; end case; when "01000100"|"01001100"|"01010100"|"01011100"|"01100100"|"01101100"|"01110100"|"01111100" => -- NEG Alu_OP <= "0010"; Set_BusB_To <= "0111"; Set_BusA_To <= "1010"; Read_To_Acc <= '1'; Save_ALU <= '1'; when "01000110"|"01001110"|"01100110"|"01101110" => -- IM 0 IMode <= "00"; when "01010110"|"01110110" => -- IM 1 IMode <= "01"; when "01011110"|"01110111" => -- IM 2 IMode <= "10";-- 16 bit arithmetic when "01001010"|"01011010"|"01101010"|"01111010" => -- ADC HL,ss MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => NoRead <= '1'; ALU_Op <= "0001"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusA_To(2 downto 0) <= "101"; case to_integer(unsigned(IR(5 downto 4))) is when 0|1|2 => Set_BusB_To(2 downto 1) <= IR(5 downto 4); Set_BusB_To(0) <= '1'; when others => Set_BusB_To <= "1000"; end case; TStates <= "100"; when 3 => NoRead <= '1'; Read_To_Reg <= '1'; Save_ALU <= '1'; ALU_Op <= "0001"; Set_BusA_To(2 downto 0) <= "100"; case to_integer(unsigned(IR(5 downto 4))) is when 0|1|2 => Set_BusB_To(2 downto 1) <= IR(5 downto 4); Set_BusB_To(0) <= '0'; when others => Set_BusB_To <= "1001"; end case; when others => end case; when "01000010"|"01010010"|"01100010"|"01110010" => -- SBC HL,ss MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => NoRead <= '1'; ALU_Op <= "0011"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusA_To(2 downto 0) <= "101"; case to_integer(unsigned(IR(5 downto 4))) is when 0|1|2 => Set_BusB_To(2 downto 1) <= IR(5 downto 4); Set_BusB_To(0) <= '1'; when others => Set_BusB_To <= "1000"; end case; TStates <= "100"; when 3 => NoRead <= '1'; ALU_Op <= "0011"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusA_To(2 downto 0) <= "100"; case to_integer(unsigned(IR(5 downto 4))) is when 0|1|2 => Set_BusB_To(2 downto 1) <= IR(5 downto 4); when others => Set_BusB_To <= "1001"; end case; when others => end case; when "01101111" => -- RLD MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 2 => NoRead <= '1'; Set_Addr_To <= aXY; when 3 => Read_To_Reg <= '1'; Set_BusB_To(2 downto 0) <= "110"; Set_BusA_To(2 downto 0) <= "111"; ALU_Op <= "1101"; TStates <= "100"; Set_Addr_To <= aXY; Save_ALU <= '1'; when 4 => I_RLD <= '1'; Write <= '1'; when others => end case; when "01100111" => -- RRD MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 2 => Set_Addr_To <= aXY; when 3 => Read_To_Reg <= '1'; Set_BusB_To(2 downto 0) <= "110"; Set_BusA_To(2 downto 0) <= "111"; ALU_Op <= "1110"; TStates <= "100"; Set_Addr_To <= aXY; Save_ALU <= '1'; when 4 => I_RRD <= '1'; Write <= '1'; when others => end case; when "01000101"|"01001101"|"01010101"|"01011101"|"01100101"|"01101101"|"01110101"|"01111101" => -- RETI, RETN MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_TO <= aSP; when 2 => IncDec_16 <= "0111"; Set_Addr_To <= aSP; LDZ <= '1'; when 3 => Jump <= '1'; IncDec_16 <= "0111"; I_RETN <= '1'; when others => null; end case; when "01000000"|"01001000"|"01010000"|"01011000"|"01100000"|"01101000"|"01110000"|"01111000" => -- IN r,(C) MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aBC; when 2 => IORQ <= '1'; if IR(5 downto 3) /= "110" then Read_To_Reg <= '1'; Set_BusA_To(2 downto 0) <= IR(5 downto 3); end if; I_INRC <= '1'; when others => end case; when "01000001"|"01001001"|"01010001"|"01011001"|"01100001"|"01101001"|"01110001"|"01111001" => -- OUT (C),r -- OUT (C),0 MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aBC; Set_BusB_To(2 downto 0) <= IR(5 downto 3); if IR(5 downto 3) = "110" then Set_BusB_To(3) <= '1'; end if; when 2 => Write <= '1'; IORQ <= '1'; when others => end case; when "10100010" | "10101010" | "10110010" | "10111010" => -- INI, IND, INIR, INDR MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aBC; Set_BusB_To <= "1010"; Set_BusA_To <= "0000"; Read_To_Reg <= '1'; Save_ALU <= '1'; ALU_Op <= "0010"; when 2 => IORQ <= '1'; Set_BusB_To <= "0110"; Set_Addr_To <= aXY; when 3 => if IR(3) = '0' then IncDec_16 <= "0010"; else IncDec_16 <= "1010"; end if; TStates <= "100"; Write <= '1'; I_BTR <= '1'; when 4 => NoRead <= '1'; TStates <= "101"; when others => null; end case; when "10100011" | "10101011" | "10110011" | "10111011" => -- OUTI, OUTD, OTIR, OTDR MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 1 => TStates <= "101"; Set_Addr_To <= aXY; Set_BusB_To <= "1010"; Set_BusA_To <= "0000"; Read_To_Reg <= '1'; Save_ALU <= '1'; ALU_Op <= "0010"; when 2 => Set_BusB_To <= "0110"; Set_Addr_To <= aBC; when 3 => if IR(3) = '0' then IncDec_16 <= "0010"; else IncDec_16 <= "1010"; end if; IORQ <= '1'; Write <= '1'; I_BTR <= '1'; when 4 => NoRead <= '1'; TStates <= "101"; when others => null; end case; end case; end case; if Mode = 1 then if MCycle = "001" then-- TStates <= "100"; else TStates <= "011"; end if; end if; if Mode = 3 then if MCycle = "001" then-- TStates <= "100"; else TStates <= "100"; end if; end if; if Mode < 2 then if MCycle = "110" then Inc_PC <= '1'; if Mode = 1 then Set_Addr_To <= aXY; TStates <= "100"; Set_BusB_To(2 downto 0) <= SSS; Set_BusB_To(3) <= '0'; end if; if IRB = "00110110" or IRB = "11001011" then Set_Addr_To <= aNone; end if; end if; if MCycle = "111" then if Mode = 0 then TStates <= "101"; end if; if ISet /= "01" then Set_Addr_To <= aXY; end if; Set_BusB_To(2 downto 0) <= SSS; Set_BusB_To(3) <= '0'; if IRB = "00110110" or ISet = "01" then -- LD (HL),n Inc_PC <= '1'; else NoRead <= '1'; end if; end if; end if; end process;end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -