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

📄 t80_mcode.vhd

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