📄 t80_mcode.vhd
字号:
IncDec_16 <= "0110"; when others => null; end case; else -- LD (nn),HL 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'; Set_BusB_To <= "0101"; -- L when 4 => Inc_WZ <= '1'; Set_Addr_To <= aZI; Write <= '1'; Set_BusB_To <= "0100"; -- H when 5 => Write <= '1'; when others => null; end case; end if; when "11111001" => -- LD SP,HL TStates <= "110"; LDSPHL <= '1'; when "11000101"|"11010101"|"11100101"|"11110101" => -- PUSH qq MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => TStates <= "101"; IncDec_16 <= "1111"; Set_Addr_TO <= aSP; if DPAIR = "11" then Set_BusB_To <= "0111"; else Set_BusB_To(2 downto 1) <= DPAIR; Set_BusB_To(0) <= '0'; Set_BusB_To(3) <= '0'; end if; when 2 => IncDec_16 <= "1111"; Set_Addr_To <= aSP; if DPAIR = "11" then Set_BusB_To <= "1011"; else Set_BusB_To(2 downto 1) <= DPAIR; Set_BusB_To(0) <= '1'; Set_BusB_To(3) <= '0'; end if; Write <= '1'; when 3 => Write <= '1'; when others => null; end case; when "11000001"|"11010001"|"11100001"|"11110001" => -- POP qq MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aSP; when 2 => IncDec_16 <= "0111"; Set_Addr_To <= aSP; Read_To_Reg <= '1'; if DPAIR = "11" then Set_BusA_To(3 downto 0) <= "1011"; else Set_BusA_To(2 downto 1) <= DPAIR; Set_BusA_To(0) <= '1'; end if; when 3 => IncDec_16 <= "0111"; Read_To_Reg <= '1'; if DPAIR = "11" then Set_BusA_To(3 downto 0) <= "0111"; else Set_BusA_To(2 downto 1) <= DPAIR; Set_BusA_To(0) <= '0'; end if; when others => null; end case;-- EXCHANGE, BLOCK TRANSFER AND SEARCH GROUP when "11101011" => if Mode /= 3 then -- EX DE,HL ExchangeDH <= '1'; end if; when "00001000" => if Mode = 3 then -- LD (nn),SP 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'; Set_BusB_To <= "1000"; when 4 => Inc_WZ <= '1'; Set_Addr_To <= aZI; Write <= '1'; Set_BusB_To <= "1001"; when 5 => Write <= '1'; when others => null; end case; elsif Mode < 2 then -- EX AF,AF' ExchangeAF <= '1'; end if; when "11011001" => if Mode = 3 then -- RETI 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'; SetEI <= '1'; when others => null; end case; elsif Mode < 2 then -- EXX ExchangeRS <= '1'; end if; when "11100011" => if Mode /= 3 then -- EX (SP),HL MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aSP; when 2 => Read_To_Reg <= '1'; Set_BusA_To <= "0101"; Set_BusB_To <= "0101"; Set_Addr_To <= aSP; when 3 => IncDec_16 <= "0111"; Set_Addr_To <= aSP; TStates <= "100"; Write <= '1'; when 4 => Read_To_Reg <= '1'; Set_BusA_To <= "0100"; Set_BusB_To <= "0100"; Set_Addr_To <= aSP; when 5 => IncDec_16 <= "1111"; TStates <= "101"; Write <= '1'; when others => null; end case; end if;-- 8 BIT ARITHMETIC AND LOGICAL GROUP when "10000000"|"10000001"|"10000010"|"10000011"|"10000100"|"10000101"|"10000111" |"10001000"|"10001001"|"10001010"|"10001011"|"10001100"|"10001101"|"10001111" |"10010000"|"10010001"|"10010010"|"10010011"|"10010100"|"10010101"|"10010111" |"10011000"|"10011001"|"10011010"|"10011011"|"10011100"|"10011101"|"10011111" |"10100000"|"10100001"|"10100010"|"10100011"|"10100100"|"10100101"|"10100111" |"10101000"|"10101001"|"10101010"|"10101011"|"10101100"|"10101101"|"10101111" |"10110000"|"10110001"|"10110010"|"10110011"|"10110100"|"10110101"|"10110111" |"10111000"|"10111001"|"10111010"|"10111011"|"10111100"|"10111101"|"10111111" => -- ADD A,r -- ADC A,r -- SUB A,r -- SBC A,r -- AND A,r -- OR A,r -- XOR A,r -- CP A,r Set_BusB_To(2 downto 0) <= SSS; Set_BusA_To(2 downto 0) <= "111"; Read_To_Reg <= '1'; Save_ALU <= '1'; when "10000110"|"10001110"|"10010110"|"10011110"|"10100110"|"10101110"|"10110110"|"10111110" => -- ADD A,(HL) -- ADC A,(HL) -- SUB A,(HL) -- SBC A,(HL) -- AND A,(HL) -- OR A,(HL) -- XOR A,(HL) -- CP A,(HL) MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aXY; when 2 => Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusB_To(2 downto 0) <= SSS; Set_BusA_To(2 downto 0) <= "111"; when others => null; end case; when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => -- ADD A,n -- ADC A,n -- SUB A,n -- SBC A,n -- AND A,n -- OR A,n -- XOR A,n -- CP A,n MCycles <= "010"; if MCycle = "010" then Inc_PC <= '1'; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusB_To(2 downto 0) <= SSS; Set_BusA_To(2 downto 0) <= "111"; end if; when "00000100"|"00001100"|"00010100"|"00011100"|"00100100"|"00101100"|"00111100" => -- INC r Set_BusB_To <= "1010"; Set_BusA_To(2 downto 0) <= DDD; Read_To_Reg <= '1'; Save_ALU <= '1'; PreserveC <= '1'; ALU_Op <= "0000"; when "00110100" => -- INC (HL) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aXY; when 2 => TStates <= "100"; Set_Addr_To <= aXY; Read_To_Reg <= '1'; Save_ALU <= '1'; PreserveC <= '1'; ALU_Op <= "0000"; Set_BusB_To <= "1010"; Set_BusA_To(2 downto 0) <= DDD; when 3 => Write <= '1'; when others => null; end case; when "00000101"|"00001101"|"00010101"|"00011101"|"00100101"|"00101101"|"00111101" => -- DEC r Set_BusB_To <= "1010"; Set_BusA_To(2 downto 0) <= DDD; Read_To_Reg <= '1'; Save_ALU <= '1'; PreserveC <= '1'; ALU_Op <= "0010"; when "00110101" => -- DEC (HL) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aXY; when 2 => TStates <= "100"; Set_Addr_To <= aXY; ALU_Op <= "0010"; Read_To_Reg <= '1'; Save_ALU <= '1'; PreserveC <= '1'; Set_BusB_To <= "1010"; Set_BusA_To(2 downto 0) <= DDD; when 3 => Write <= '1'; when others => null; end case;-- GENERAL PURPOSE ARITHMETIC AND CPU CONTROL GROUPS when "00100111" => -- DAA Set_BusA_To(2 downto 0) <= "111"; Read_To_Reg <= '1'; ALU_Op <= "1100"; Save_ALU <= '1'; when "00101111" => -- CPL I_CPL <= '1'; when "00111111" => -- CCF I_CCF <= '1'; when "00110111" => -- SCF I_SCF <= '1'; when "00000000" => if NMICycle = '1' then -- NMI MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => TStates <= "101"; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1101"; when 2 => TStates <= "100"; Write <= '1'; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1100"; when 3 => TStates <= "100"; Write <= '1'; when others => null; end case; elsif IntCycle = '1' then -- INT (IM 2) MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 1 => LDZ <= '1'; TStates <= "101"; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1101"; when 2 => TStates <= "100"; Write <= '1'; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1100"; when 3 => TStates <= "100"; Write <= '1'; when 4 => Inc_PC <= '1'; LDZ <= '1'; when 5 => Jump <= '1'; when others => null; end case; else -- NOP end if; when "01110110" => -- HALT Halt <= '1'; when "11110011" => -- DI SetDI <= '1'; when "11111011" => -- EI SetEI <= '1';-- 16 BIT ARITHMETIC GROUP when "00001001"|"00011001"|"00101001"|"00111001" => -- ADD HL,ss MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => NoRead <= '1'; ALU_Op <= "0000"; 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"; Arith16 <= '1'; 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); when others => Set_BusB_To <= "1001"; end case; Arith16 <= '1'; when others => end case; when "00000011"|"00010011"|"00100011"|"00110011" => -- INC ss TStates <= "110"; IncDec_16(3 downto 2) <= "01"; IncDec_16(1 downto 0) <= DPair; when "00001011"|"00011011"|"00101011"|"00111011" => -- DEC ss TStates <= "110"; IncDec_16(3 downto 2) <= "11"; IncDec_16(1 downto 0) <= DPair;-- ROTATE AND SHIFT GROUP when "00000111" -- RLCA |"00010111" -- RLA |"00001111" -- RRCA |"00011111" => -- RRA Set_BusA_To(2 downto 0) <= "111"; ALU_Op <= "1000"; Read_To_Reg <= '1'; Save_ALU <= '1';-- JUMP GROUP when "11000011" => -- JP nn MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Inc_PC <= '1'; Jump <= '1'; when others => null; end case; when "11000010"|"11001010"|"11010010"|"11011010"|"11100010"|"11101010"|"11110010"|"11111010" => if IR(5) = '1' and Mode = 3 then case IRB(4 downto 3) is when "00" => -- LD ($FF00+C),A MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aBC; Set_BusB_To <= "0111"; when 2 => Write <= '1'; IORQ <= '1'; when others => end case; when "01" => -- LD (nn),A MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Set_Addr_To <= aZI; Inc_PC <= '1'; Set_BusB_To <= "0111"; when 4 => Write <= '1'; when others => null; end case; when "10" => -- LD A,($FF00+C) MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 => Set_Addr_To <= aBC; when 2 => Read_To_Acc <= '1'; IORQ <= '1'; when others => end case; when "11" => -- LD A,(nn) MCycles <= "100"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Set_Addr_To <= aZI; Inc_PC <= '1';
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -