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

📄 t80_mcode.vhd

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