📄 t80_mcode.vhd
字号:
when 4 => Read_To_Acc <= '1'; when others => null; end case; end case; else -- JP cc,nn MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Inc_PC <= '1'; if is_cc_true(F, to_bitvector(IR(5 downto 3))) then Jump <= '1'; end if; when others => null; end case; end if; when "00011000" => if Mode /= 2 then -- JR e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if; when "00111000" => if Mode /= 2 then -- JR C,e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; if F(Flag_C) = '0' then MCycles <= "010"; end if; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if; when "00110000" => if Mode /= 2 then -- JR NC,e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; if F(Flag_C) = '1' then MCycles <= "010"; end if; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if; when "00101000" => if Mode /= 2 then -- JR Z,e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; if F(Flag_Z) = '0' then MCycles <= "010"; end if; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if; when "00100000" => if Mode /= 2 then -- JR NZ,e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; if F(Flag_Z) = '1' then MCycles <= "010"; end if; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if; when "11101001" => -- JP (HL) JumpXY <= '1'; when "00010000" => if Mode = 3 then I_DJNZ <= '1'; elsif Mode < 2 then -- DJNZ,e MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => TStates <= "101"; I_DJNZ <= '1'; Set_BusB_To <= "1010"; Set_BusA_To(2 downto 0) <= "000"; Read_To_Reg <= '1'; Save_ALU <= '1'; ALU_Op <= "0010"; when 2 => I_DJNZ <= '1'; Inc_PC <= '1'; when 3 => NoRead <= '1'; JumpE <= '1'; TStates <= "101"; when others => null; end case; end if;-- CALL AND RETURN GROUP when "11001101" => -- CALL nn MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => IncDec_16 <= "1111"; Inc_PC <= '1'; TStates <= "100"; Set_Addr_To <= aSP; LDW <= '1'; Set_BusB_To <= "1101"; when 4 => Write <= '1'; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1100"; when 5 => Write <= '1'; Call <= '1'; when others => null; end case; when "11000100"|"11001100"|"11010100"|"11011100"|"11100100"|"11101100"|"11110100"|"11111100" => if IR(5) = '0' or Mode /= 3 then -- CALL cc,nn MCycles <= "101"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; LDZ <= '1'; when 3 => Inc_PC <= '1'; LDW <= '1'; if is_cc_true(F, to_bitvector(IR(5 downto 3))) then IncDec_16 <= "1111"; Set_Addr_TO <= aSP; TStates <= "100"; Set_BusB_To <= "1101"; else MCycles <= "011"; end if; when 4 => Write <= '1'; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1100"; when 5 => Write <= '1'; Call <= '1'; when others => null; end case; end if; when "11001001" => -- RET MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => TStates <= "101"; Set_Addr_TO <= aSP; when 2 => IncDec_16 <= "0111"; Set_Addr_To <= aSP; LDZ <= '1'; when 3 => Jump <= '1'; IncDec_16 <= "0111"; when others => null; end case; when "11000000"|"11001000"|"11010000"|"11011000"|"11100000"|"11101000"|"11110000"|"11111000" => if IR(5) = '1' and Mode = 3 then case IRB(4 downto 3) is when "00" => -- LD ($FF00+nn),A MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; Set_Addr_To <= aIOA; Set_BusB_To <= "0111"; when 3 => Write <= '1'; when others => null; end case; when "01" => -- ADD SP,n MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => ALU_Op <= "0000"; Inc_PC <= '1'; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_BusA_To <= "1000"; Set_BusB_To <= "0110"; when 3 => NoRead <= '1'; Read_To_Reg <= '1'; Save_ALU <= '1'; ALU_Op <= "0001"; Set_BusA_To <= "1001"; Set_BusB_To <= "1110"; -- Incorrect unsigned !!!!!!!!!!!!!!!!!!!!! when others => end case; when "10" => -- LD A,($FF00+nn) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; Set_Addr_To <= aIOA; when 3 => Read_To_Acc <= '1'; when others => null; end case; when "11" => -- LD HL,SP+n -- Not correct !!!!!!!!!!!!!!!!!!! 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 => Set_BusA_To(2 downto 0) <= "101"; -- L Read_To_Reg <= '1'; Inc_WZ <= '1'; Set_Addr_To <= aZI; when 5 => Set_BusA_To(2 downto 0) <= "100"; -- H Read_To_Reg <= '1'; when others => null; end case; end case; else -- RET cc MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 => if is_cc_true(F, to_bitvector(IR(5 downto 3))) then Set_Addr_TO <= aSP; else MCycles <= "001"; end if; TStates <= "101"; when 2 => IncDec_16 <= "0111"; Set_Addr_To <= aSP; LDZ <= '1'; when 3 => Jump <= '1'; IncDec_16 <= "0111"; when others => null; end case; end if; when "11000111"|"11001111"|"11010111"|"11011111"|"11100111"|"11101111"|"11110111"|"11111111" => -- RST p 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 => Write <= '1'; IncDec_16 <= "1111"; Set_Addr_To <= aSP; Set_BusB_To <= "1100"; when 3 => Write <= '1'; RstP <= '1'; when others => null; end case;-- INPUT AND OUTPUT GROUP when "11011011" => if Mode /= 3 then -- IN A,(n) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; Set_Addr_To <= aIOA; when 3 => Read_To_Acc <= '1'; IORQ <= '1'; when others => null; end case; end if; when "11010011" => if Mode /= 3 then -- OUT (n),A MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 2 => Inc_PC <= '1'; Set_Addr_To <= aIOA; Set_BusB_To <= "0111"; when 3 => Write <= '1'; IORQ <= '1'; when others => null; end case; end if;-------------------------------------------------------------------------------------------------------------------------------------------------------------- MULTIBYTE INSTRUCTIONS------------------------------------------------------------------------------------------------------------------------------------------------------------ when "11001011" => if Mode /= 2 then Prefix <= "01"; end if; when "11101101" => if Mode < 2 then Prefix <= "10"; end if; when "11011101"|"11111101" => if Mode < 2 then Prefix <= "11"; end if; end case; when "01" =>---------------------------------------------------------------------------------- CB prefixed instructions-------------------------------------------------------------------------------- Set_BusA_To(2 downto 0) <= IR(2 downto 0); Set_BusB_To(2 downto 0) <= IR(2 downto 0); case IRB is when "00000000"|"00000001"|"00000010"|"00000011"|"00000100"|"00000101"|"00000111" |"00010000"|"00010001"|"00010010"|"00010011"|"00010100"|"00010101"|"00010111" |"00001000"|"00001001"|"00001010"|"00001011"|"00001100"|"00001101"|"00001111" |"00011000"|"00011001"|"00011010"|"00011011"|"00011100"|"00011101"|"00011111" |"00100000"|"00100001"|"00100010"|"00100011"|"00100100"|"00100101"|"00100111" |"00101000"|"00101001"|"00101010"|"00101011"|"00101100"|"00101101"|"00101111" |"00110000"|"00110001"|"00110010"|"00110011"|"00110100"|"00110101"|"00110111" |"00111000"|"00111001"|"00111010"|"00111011"|"00111100"|"00111101"|"00111111" => -- RLC r -- RL r -- RRC r -- RR r -- SLA r -- SRA r -- SRL r -- SLL r (Undocumented) / SWAP r if MCycle = "001" then ALU_Op <= "1000"; Read_To_Reg <= '1'; Save_ALU <= '1'; end if; when "00000110"|"00010110"|"00001110"|"00011110"|"00101110"|"00111110"|"00100110"|"00110110" => -- RLC (HL) -- RL (HL) -- RRC (HL) -- RR (HL) -- SRA (HL) -- SRL (HL) -- SLA (HL) -- SLL (HL) (Undocumented) / SWAP (HL) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 | 7 => Set_Addr_To <= aXY; when 2 => ALU_Op <= "1000"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_Addr_To <= aXY; TStates <= "100"; when 3 => Write <= '1'; when others => end case; when "01000000"|"01000001"|"01000010"|"01000011"|"01000100"|"01000101"|"01000111" |"01001000"|"01001001"|"01001010"|"01001011"|"01001100"|"01001101"|"01001111" |"01010000"|"01010001"|"01010010"|"01010011"|"01010100"|"01010101"|"01010111" |"01011000"|"01011001"|"01011010"|"01011011"|"01011100"|"01011101"|"01011111" |"01100000"|"01100001"|"01100010"|"01100011"|"01100100"|"01100101"|"01100111" |"01101000"|"01101001"|"01101010"|"01101011"|"01101100"|"01101101"|"01101111" |"01110000"|"01110001"|"01110010"|"01110011"|"01110100"|"01110101"|"01110111" |"01111000"|"01111001"|"01111010"|"01111011"|"01111100"|"01111101"|"01111111" => -- BIT b,r if MCycle = "001" then Set_BusB_To(2 downto 0) <= IR(2 downto 0); ALU_Op <= "1001"; end if; when "01000110"|"01001110"|"01010110"|"01011110"|"01100110"|"01101110"|"01110110"|"01111110" => -- BIT b,(HL) MCycles <= "010"; case to_integer(unsigned(MCycle)) is when 1 | 7 => Set_Addr_To <= aXY; when 2 => ALU_Op <= "1001"; TStates <= "100"; when others => end case; when "11000000"|"11000001"|"11000010"|"11000011"|"11000100"|"11000101"|"11000111" |"11001000"|"11001001"|"11001010"|"11001011"|"11001100"|"11001101"|"11001111" |"11010000"|"11010001"|"11010010"|"11010011"|"11010100"|"11010101"|"11010111" |"11011000"|"11011001"|"11011010"|"11011011"|"11011100"|"11011101"|"11011111" |"11100000"|"11100001"|"11100010"|"11100011"|"11100100"|"11100101"|"11100111" |"11101000"|"11101001"|"11101010"|"11101011"|"11101100"|"11101101"|"11101111" |"11110000"|"11110001"|"11110010"|"11110011"|"11110100"|"11110101"|"11110111" |"11111000"|"11111001"|"11111010"|"11111011"|"11111100"|"11111101"|"11111111" => -- SET b,r if MCycle = "001" then ALU_Op <= "1010"; Read_To_Reg <= '1'; Save_ALU <= '1'; end if; when "11000110"|"11001110"|"11010110"|"11011110"|"11100110"|"11101110"|"11110110"|"11111110" => -- SET b,(HL) MCycles <= "011"; case to_integer(unsigned(MCycle)) is when 1 | 7 => Set_Addr_To <= aXY; when 2 => ALU_Op <= "1010"; Read_To_Reg <= '1'; Save_ALU <= '1'; Set_Addr_To <= aXY; TStates <= "100"; when 3 => Write <= '1'; when others => end case; 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" => -- RES b,r
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -