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

📄 prefix_66.h

📁 DOSBox emulates a full x86 pc with sound and dos. Its main use is to run old dosgames on platforms w
💻 H
📖 第 1 页 / 共 2 页
字号:
	CASE_D(0x91)												/* XCHG ECX,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_ecx;reg_ecx=temp;break;}	CASE_D(0x92)												/* XCHG EDX,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_edx;reg_edx=temp;break;}		break;	CASE_D(0x93)												/* XCHG EBX,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_ebx;reg_ebx=temp;break;}		break;	CASE_D(0x94)												/* XCHG ESP,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_esp;reg_esp=temp;break;}		break;	CASE_D(0x95)												/* XCHG EBP,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_ebp;reg_ebp=temp;break;}		break;	CASE_D(0x96)												/* XCHG ESI,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_esi;reg_esi=temp;break;}		break;	CASE_D(0x97)												/* XCHG EDI,EAX */		{ Bit32u temp=reg_eax;reg_eax=reg_edi;reg_edi=temp;break;}		break;	CASE_D(0x98)												/* CWDE */		reg_eax=(Bit16s)reg_ax;break;	CASE_D(0x99)												/* CDQ */		if (reg_eax & 0x80000000) reg_edx=0xffffffff;		else reg_edx=0;		break;	CASE_D(0x9a)												/* CALL FAR Ad */		{ 			Bit32u newip=Fetchd();Bit16u newcs=Fetchw();			FillFlags();			CPU_CALL(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK			if (GETFLAG(TF)) {					cpudecoder=CPU_Core_Normal_Trap_Run;				return CBRET_NONE;			}#endif			continue;		}	CASE_D(0x9c)												/* PUSHFD */		FillFlags();		if (CPU_PUSHF(true)) RUNEXCEPTION();		break;	CASE_D(0x9d)												/* POPFD */		if (CPU_POPF(true)) RUNEXCEPTION();		lflags.type=t_UNKNOWN;#if CPU_TRAP_CHECK		if (GETFLAG(TF)) {				cpudecoder=CPU_Core_Normal_Trap_Run;			goto decode_end;		}#endif#if CPU_PIC_CHECK		if (GETFLAG(IF) && PIC_IRQCheck) goto decode_end;#endif		break;	CASE_D(0xa1)												/* MOV EAX,Od */		{			GetEADirect;			reg_eax=LoadMd(eaa);		}		break;	CASE_D(0xa3)												/* MOV Od,EAX */		{			GetEADirect;			SaveMd(eaa,reg_eax);		}		break;	CASE_D(0xa5)												/* MOVSD */		DoString(R_MOVSD);break;	CASE_D(0xa7)												/* CMPSD */		DoString(R_CMPSD);break;	CASE_D(0xa9)												/* TEST EAX,Id */		EAXId(TESTD);break;	CASE_D(0xab)												/* STOSD */		DoString(R_STOSD);break;	CASE_D(0xad)												/* LODSD */		DoString(R_LODSD);break;	CASE_D(0xaf)												/* SCASD */		DoString(R_SCASD);break;	CASE_D(0xb8)												/* MOV EAX,Id */		reg_eax=Fetchd();break;	CASE_D(0xb9)												/* MOV ECX,Id */		reg_ecx=Fetchd();break;	CASE_D(0xba)												/* MOV EDX,Iw */		reg_edx=Fetchd();break;	CASE_D(0xbb)												/* MOV EBX,Id */		reg_ebx=Fetchd();break;	CASE_D(0xbc)												/* MOV ESP,Id */		reg_esp=Fetchd();break;	CASE_D(0xbd)												/* MOV EBP.Id */		reg_ebp=Fetchd();break;	CASE_D(0xbe)												/* MOV ESI,Id */		reg_esi=Fetchd();break;	CASE_D(0xbf)												/* MOV EDI,Id */		reg_edi=Fetchd();break;	CASE_D(0xc1)												/* GRP2 Ed,Ib */		GRP2D(Fetchb());break;	CASE_D(0xc2)												/* RETN Iw */		reg_eip=Pop_32();		reg_esp+=Fetchw();		continue;	CASE_D(0xc3)												/* RETN */		reg_eip=Pop_32();		continue;	CASE_D(0xc4)												/* LES */		{				GetRMrd;GetEAa;			if (CPU_SetSegGeneral(es,LoadMw(eaa+4))) RUNEXCEPTION();			*rmrd=LoadMd(eaa);			break;		}	CASE_D(0xc5)												/* LDS */		{				GetRMrd;GetEAa;			if (CPU_SetSegGeneral(ds,LoadMw(eaa+4))) RUNEXCEPTION();			*rmrd=LoadMd(eaa);			break;		}	CASE_D(0xc7)												/* MOV Ed,Id */		{			GetRM;			if (rm >= 0xc0) {GetEArd;*eard=Fetchd();}			else {GetEAa;SaveMd(eaa,Fetchd());}			break;		}	CASE_D(0xc8)												/* ENTER Iw,Ib */		{			Bitu bytes=Fetchw();			Bitu level=Fetchb();			CPU_ENTER(true,bytes,level);		}		break;	CASE_D(0xc9)												/* LEAVE */		reg_esp&=cpu.stack.notmask;		reg_esp|=(reg_ebp&cpu.stack.mask);		reg_ebp=Pop_32();		break;	CASE_D(0xca)												/* RETF Iw */		{ 			Bitu words=Fetchw();			FillFlags();			CPU_RET(true,words,GETIP);			continue;		}	CASE_D(0xcb)												/* RETF */					{ 			FillFlags();            CPU_RET(true,0,GETIP);			continue;		}	CASE_D(0xcf)												/* IRET */		{			FillFlags();			CPU_IRET(true,GETIP);#if CPU_TRAP_CHECK			if (GETFLAG(TF)) {					cpudecoder=CPU_Core_Normal_Trap_Run;				return CBRET_NONE;			}#endif#if CPU_PIC_CHECK			if (GETFLAG(IF) && PIC_IRQCheck) return CBRET_NONE;#endif			continue;		}	CASE_D(0xd1)												/* GRP2 Ed,1 */		GRP2D(1);break;	CASE_D(0xd3)												/* GRP2 Ed,CL */		GRP2D(reg_cl);break;	CASE_D(0xe0)												/* LOOPNZ */		if (TEST_PREFIX_ADDR) {			JumpCond32_b(--reg_ecx && !get_ZF());		} else {			JumpCond32_b(--reg_cx && !get_ZF());		}		break;	CASE_D(0xe1)												/* LOOPZ */		if (TEST_PREFIX_ADDR) {			JumpCond32_b(--reg_ecx && get_ZF());		} else {			JumpCond32_b(--reg_cx && get_ZF());		}		break;	CASE_D(0xe2)												/* LOOP */		if (TEST_PREFIX_ADDR) {				JumpCond32_b(--reg_ecx);		} else {			JumpCond32_b(--reg_cx);		}		break;	CASE_D(0xe3)												/* JCXZ */		JumpCond32_b(!(reg_ecx & AddrMaskTable[core.prefixes& PREFIX_ADDR]));		break;	CASE_D(0xe5)												/* IN EAX,Ib */		{			Bitu port=Fetchb();			if (CPU_IO_Exception(port,4)) RUNEXCEPTION();			reg_eax=IO_ReadD(port);			break;		}	CASE_D(0xe7)												/* OUT Ib,EAX */		{			Bitu port=Fetchb();			if (CPU_IO_Exception(port,4)) RUNEXCEPTION();			IO_WriteD(port,reg_eax);			break;		}	CASE_D(0xe8)												/* CALL Jd */		{ 			Bit32s addip=Fetchds();			SAVEIP;			Push_32(reg_eip);			reg_eip+=addip;			continue;		}	CASE_D(0xe9)												/* JMP Jd */		{ 			Bit32s addip=Fetchds();			SAVEIP;			reg_eip+=addip;			continue;		}	CASE_D(0xea)												/* JMP Ad */		{ 			Bit32u newip=Fetchd();			Bit16u newcs=Fetchw();			FillFlags();			CPU_JMP(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK			if (GETFLAG(TF)) {					cpudecoder=CPU_Core_Normal_Trap_Run;				return CBRET_NONE;			}#endif			continue;		}	CASE_D(0xeb)												/* JMP Jb */		{ 			Bit32s addip=Fetchbs();			SAVEIP;			reg_eip+=addip;			continue;		}	CASE_D(0xed)												/* IN EAX,DX */		reg_eax=IO_ReadD(reg_dx);		break;	CASE_D(0xef)												/* OUT DX,EAX */		IO_WriteD(reg_dx,reg_eax);		break;	CASE_D(0xf7)												/* GRP3 Ed(,Id) */		{ 			GetRM;Bitu which=(rm>>3)&7;			switch (which) {			case 0x00:											/* TEST Ed,Id */			case 0x01:											/* TEST Ed,Id Undocumented*/				{					if (rm >= 0xc0 ) {GetEArd;TESTD(*eard,Fetchd(),LoadRd,SaveRd);}					else {GetEAa;TESTD(eaa,Fetchd(),LoadMd,SaveMd);}					break;				}			case 0x02:											/* NOT Ed */				{					if (rm >= 0xc0 ) {GetEArd;*eard=~*eard;}					else {GetEAa;SaveMd(eaa,~LoadMd(eaa));}					break;				}			case 0x03:											/* NEG Ed */				{					lflags.type=t_NEGd;					if (rm >= 0xc0 ) {							GetEArd;lf_var1d=*eard;lf_resd=0-lf_var1d;						*eard=lf_resd;					} else {						GetEAa;lf_var1d=LoadMd(eaa);lf_resd=0-lf_var1d;							SaveMd(eaa,lf_resd);					}					break;				}			case 0x04:											/* MUL EAX,Ed */				RMEd(MULD);				break;			case 0x05:											/* IMUL EAX,Ed */				RMEd(IMULD);				break;			case 0x06:											/* DIV Ed */				RMEd(DIVD);				break;			case 0x07:											/* IDIV Ed */				RMEd(IDIVD);				break;			}			break;		}	CASE_D(0xff)												/* GRP 5 Ed */		{			GetRM;Bitu which=(rm>>3)&7;			switch (which) {			case 0x00:											/* INC Ed */				RMEd(INCD);				break;					case 0x01:											/* DEC Ed */				RMEd(DECD);				break;			case 0x02:											/* CALL NEAR Ed */				if (rm >= 0xc0 ) {GetEArd;reg_eip=*eard;}				else {GetEAa;reg_eip=LoadMd(eaa);}				Push_32(GETIP);				continue;			case 0x03:											/* CALL FAR Ed */				{					if (rm >= 0xc0) goto illegal_opcode;					GetEAa;					Bit32u newip=LoadMd(eaa);					Bit16u newcs=LoadMw(eaa+4);					FillFlags();					CPU_CALL(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK					if (GETFLAG(TF)) {							cpudecoder=CPU_Core_Normal_Trap_Run;						return CBRET_NONE;					}#endif					continue;				}			case 0x04:											/* JMP NEAR Ed */					if (rm >= 0xc0 ) {GetEArd;reg_eip=*eard;}				else {GetEAa;reg_eip=LoadMd(eaa);}				continue;			case 0x05:											/* JMP FAR Ed */					{					if (rm >= 0xc0) goto illegal_opcode;					GetEAa;					Bit32u newip=LoadMd(eaa);					Bit16u newcs=LoadMw(eaa+4);					FillFlags();					CPU_JMP(true,newcs,newip,GETIP);#if CPU_TRAP_CHECK					if (GETFLAG(TF)) {							cpudecoder=CPU_Core_Normal_Trap_Run;						return CBRET_NONE;					}#endif					continue;				}				break;			case 0x06:											/* Push Ed */				if (rm >= 0xc0 ) {GetEArd;Push_32(*eard);}				else {GetEAa;Push_32(LoadMd(eaa));}				break;			default:				E_Exit("CPU:66:GRP5:Illegal call %2X",which);				break;			}			break;		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -