⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t80_mcode.vhd

📁 DE1-FPGA-Board
💻 VHD
📖 第 1 页 / 共 4 页
字号:
				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 + -