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

📄 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 页
字号:
/* *  Copyright (C) 2002-2007  The DOSBox Team * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  This program is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU General Public License for more details. * *  You should have received a copy of the GNU General Public License *  along with this program; if not, write to the Free Software *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */	CASE_D(0x01)												/* ADD Ed,Gd */		RMEdGd(ADDD);break;		CASE_D(0x03)												/* ADD Gd,Ed */		RMGdEd(ADDD);break;	CASE_D(0x05)												/* ADD EAX,Id */		EAXId(ADDD);break;	CASE_D(0x06)												/* PUSH ES */				Push_32(SegValue(es));break;	CASE_D(0x07)												/* POP ES */		if (CPU_PopSeg(es,true)) RUNEXCEPTION();		break;	CASE_D(0x09)												/* OR Ed,Gd */		RMEdGd(ORD);break;	CASE_D(0x0b)												/* OR Gd,Ed */		RMGdEd(ORD);break;	CASE_D(0x0d)												/* OR EAX,Id */		EAXId(ORD);break;	CASE_D(0x0e)												/* PUSH CS */				Push_32(SegValue(cs));break;	CASE_D(0x11)												/* ADC Ed,Gd */		RMEdGd(ADCD);break;		CASE_D(0x13)												/* ADC Gd,Ed */		RMGdEd(ADCD);break;	CASE_D(0x15)												/* ADC EAX,Id */		EAXId(ADCD);break;	CASE_D(0x16)												/* PUSH SS */		Push_32(SegValue(ss));break;	CASE_D(0x17)												/* POP SS */		if (CPU_PopSeg(ss,true)) RUNEXCEPTION();		CPU_Cycles++;		break;	CASE_D(0x19)												/* SBB Ed,Gd */		RMEdGd(SBBD);break;	CASE_D(0x1b)												/* SBB Gd,Ed */		RMGdEd(SBBD);break;	CASE_D(0x1d)												/* SBB EAX,Id */		EAXId(SBBD);break;	CASE_D(0x1e)												/* PUSH DS */				Push_32(SegValue(ds));break;	CASE_D(0x1f)												/* POP DS */		if (CPU_PopSeg(ds,true)) RUNEXCEPTION();		break;	CASE_D(0x21)												/* AND Ed,Gd */		RMEdGd(ANDD);break;		CASE_D(0x23)												/* AND Gd,Ed */		RMGdEd(ANDD);break;	CASE_D(0x25)												/* AND EAX,Id */		EAXId(ANDD);break;	CASE_D(0x29)												/* SUB Ed,Gd */		RMEdGd(SUBD);break;	CASE_D(0x2b)												/* SUB Gd,Ed */		RMGdEd(SUBD);break;	CASE_D(0x2d)												/* SUB EAX,Id */		EAXId(SUBD);break;	CASE_D(0x31)												/* XOR Ed,Gd */		RMEdGd(XORD);break;		CASE_D(0x33)												/* XOR Gd,Ed */		RMGdEd(XORD);break;	CASE_D(0x35)												/* XOR EAX,Id */		EAXId(XORD);break;	CASE_D(0x39)												/* CMP Ed,Gd */		RMEdGd(CMPD);break;	CASE_D(0x3b)												/* CMP Gd,Ed */		RMGdEd(CMPD);break;	CASE_D(0x3d)												/* CMP EAX,Id */		EAXId(CMPD);break;	CASE_D(0x40)												/* INC EAX */		INCD(reg_eax,LoadRd,SaveRd);break;	CASE_D(0x41)												/* INC ECX */		INCD(reg_ecx,LoadRd,SaveRd);break;	CASE_D(0x42)												/* INC EDX */		INCD(reg_edx,LoadRd,SaveRd);break;	CASE_D(0x43)												/* INC EBX */		INCD(reg_ebx,LoadRd,SaveRd);break;	CASE_D(0x44)												/* INC ESP */		INCD(reg_esp,LoadRd,SaveRd);break;	CASE_D(0x45)												/* INC EBP */		INCD(reg_ebp,LoadRd,SaveRd);break;	CASE_D(0x46)												/* INC ESI */		INCD(reg_esi,LoadRd,SaveRd);break;	CASE_D(0x47)												/* INC EDI */		INCD(reg_edi,LoadRd,SaveRd);break;	CASE_D(0x48)												/* DEC EAX */		DECD(reg_eax,LoadRd,SaveRd);break;	CASE_D(0x49)												/* DEC ECX */		DECD(reg_ecx,LoadRd,SaveRd);break;	CASE_D(0x4a)												/* DEC EDX */		DECD(reg_edx,LoadRd,SaveRd);break;	CASE_D(0x4b)												/* DEC EBX */		DECD(reg_ebx,LoadRd,SaveRd);break;	CASE_D(0x4c)												/* DEC ESP */		DECD(reg_esp,LoadRd,SaveRd);break;	CASE_D(0x4d)												/* DEC EBP */		DECD(reg_ebp,LoadRd,SaveRd);break;	CASE_D(0x4e)												/* DEC ESI */		DECD(reg_esi,LoadRd,SaveRd);break;	CASE_D(0x4f)												/* DEC EDI */		DECD(reg_edi,LoadRd,SaveRd);break;	CASE_D(0x50)												/* PUSH EAX */		Push_32(reg_eax);break;	CASE_D(0x51)												/* PUSH ECX */		Push_32(reg_ecx);break;	CASE_D(0x52)												/* PUSH EDX */		Push_32(reg_edx);break;	CASE_D(0x53)												/* PUSH EBX */		Push_32(reg_ebx);break;	CASE_D(0x54)												/* PUSH ESP */		Push_32(reg_esp);break;	CASE_D(0x55)												/* PUSH EBP */		Push_32(reg_ebp);break;	CASE_D(0x56)												/* PUSH ESI */		Push_32(reg_esi);break;	CASE_D(0x57)												/* PUSH EDI */		Push_32(reg_edi);break;	CASE_D(0x58)												/* POP EAX */		reg_eax=Pop_32();break;	CASE_D(0x59)												/* POP ECX */		reg_ecx=Pop_32();break;	CASE_D(0x5a)												/* POP EDX */		reg_edx=Pop_32();break;	CASE_D(0x5b)												/* POP EBX */		reg_ebx=Pop_32();break;	CASE_D(0x5c)												/* POP ESP */		reg_esp=Pop_32();break;	CASE_D(0x5d)												/* POP EBP */		reg_ebp=Pop_32();break;	CASE_D(0x5e)												/* POP ESI */		reg_esi=Pop_32();break;	CASE_D(0x5f)												/* POP EDI */		reg_edi=Pop_32();break;	CASE_D(0x60)												/* PUSHAD */	{		Bitu tmpesp = reg_esp;		Push_32(reg_eax);Push_32(reg_ecx);Push_32(reg_edx);Push_32(reg_ebx);		Push_32(tmpesp);Push_32(reg_ebp);Push_32(reg_esi);Push_32(reg_edi);	}; break;	CASE_D(0x61)												/* POPAD */		reg_edi=Pop_32();reg_esi=Pop_32();reg_ebp=Pop_32();Pop_32();//Don't save ESP		reg_ebx=Pop_32();reg_edx=Pop_32();reg_ecx=Pop_32();reg_eax=Pop_32();		break;	CASE_D(0x62)												/* BOUND Ed */		{			Bit32s bound_min, bound_max;			GetRMrd;GetEAa;			bound_min=LoadMd(eaa);			bound_max=LoadMd(eaa+4);			if ( (((Bit32s)*rmrd) < bound_min) || (((Bit32s)*rmrd) > bound_max) ) {				EXCEPTION(5);			}		}		break;	CASE_D(0x63)												/* ARPL Ed,Rd */		{			if (((cpu.pmode) && (reg_flags & FLAG_VM)) || (!cpu.pmode)) goto illegal_opcode;			FillFlags();			GetRMrw;			if (rm >= 0xc0 ) {				GetEArd;Bitu new_sel=(Bit16u)*eard;				CPU_ARPL(new_sel,*rmrw);				*eard=(Bit32u)new_sel;			} else {				GetEAa;Bitu new_sel=LoadMw(eaa);				CPU_ARPL(new_sel,*rmrw);				SaveMd(eaa,(Bit32u)new_sel);			}		}		break;	CASE_D(0x68)												/* PUSH Id */		Push_32(Fetchd());break;	CASE_D(0x69)												/* IMUL Gd,Ed,Id */		RMGdEdOp3(DIMULD,Fetchds());		break;	CASE_D(0x6a)												/* PUSH Ib */		Push_32(Fetchbs());break;	CASE_D(0x6b)												/* IMUL Gd,Ed,Ib */		RMGdEdOp3(DIMULD,Fetchbs());		break;	CASE_D(0x6d)												/* INSD */		if (CPU_IO_Exception(reg_dx,4)) RUNEXCEPTION();		DoString(R_INSD);break;	CASE_D(0x6f)												/* OUTSD */		if (CPU_IO_Exception(reg_dx,4)) RUNEXCEPTION();		DoString(R_OUTSD);break;	CASE_D(0x70)												/* JO */		JumpCond32_b(TFLG_O);break;	CASE_D(0x71)												/* JNO */		JumpCond32_b(TFLG_NO);break;	CASE_D(0x72)												/* JB */		JumpCond32_b(TFLG_B);break;	CASE_D(0x73)												/* JNB */		JumpCond32_b(TFLG_NB);break;	CASE_D(0x74)												/* JZ */  		JumpCond32_b(TFLG_Z);break;	CASE_D(0x75)												/* JNZ */		JumpCond32_b(TFLG_NZ);break;	CASE_D(0x76)												/* JBE */		JumpCond32_b(TFLG_BE);break;	CASE_D(0x77)												/* JNBE */		JumpCond32_b(TFLG_NBE);break;	CASE_D(0x78)												/* JS */		JumpCond32_b(TFLG_S);break;	CASE_D(0x79)												/* JNS */		JumpCond32_b(TFLG_NS);break;	CASE_D(0x7a)												/* JP */		JumpCond32_b(TFLG_P);break;	CASE_D(0x7b)												/* JNP */		JumpCond32_b(TFLG_NP);break;	CASE_D(0x7c)												/* JL */		JumpCond32_b(TFLG_L);break;	CASE_D(0x7d)												/* JNL */		JumpCond32_b(TFLG_NL);break;	CASE_D(0x7e)												/* JLE */		JumpCond32_b(TFLG_LE);break;	CASE_D(0x7f)												/* JNLE */		JumpCond32_b(TFLG_NLE);break;	CASE_D(0x81)												/* Grpl Ed,Id */		{			GetRM;Bitu which=(rm>>3)&7;			if (rm >= 0xc0) {				GetEArd;Bit32u id=Fetchd();				switch (which) {				case 0x00:ADDD(*eard,id,LoadRd,SaveRd);break;				case 0x01: ORD(*eard,id,LoadRd,SaveRd);break;				case 0x02:ADCD(*eard,id,LoadRd,SaveRd);break;				case 0x03:SBBD(*eard,id,LoadRd,SaveRd);break;				case 0x04:ANDD(*eard,id,LoadRd,SaveRd);break;				case 0x05:SUBD(*eard,id,LoadRd,SaveRd);break;				case 0x06:XORD(*eard,id,LoadRd,SaveRd);break;				case 0x07:CMPD(*eard,id,LoadRd,SaveRd);break;				}			} else {				GetEAa;Bit32u id=Fetchd();				switch (which) {				case 0x00:ADDD(eaa,id,LoadMd,SaveMd);break;				case 0x01: ORD(eaa,id,LoadMd,SaveMd);break;				case 0x02:ADCD(eaa,id,LoadMd,SaveMd);break;				case 0x03:SBBD(eaa,id,LoadMd,SaveMd);break;				case 0x04:ANDD(eaa,id,LoadMd,SaveMd);break;				case 0x05:SUBD(eaa,id,LoadMd,SaveMd);break;				case 0x06:XORD(eaa,id,LoadMd,SaveMd);break;				case 0x07:CMPD(eaa,id,LoadMd,SaveMd);break;				}			}		}		break;	CASE_D(0x83)												/* Grpl Ed,Ix */		{			GetRM;Bitu which=(rm>>3)&7;			if (rm >= 0xc0) {				GetEArd;Bit32u id=(Bit32s)Fetchbs();				switch (which) {				case 0x00:ADDD(*eard,id,LoadRd,SaveRd);break;				case 0x01: ORD(*eard,id,LoadRd,SaveRd);break;				case 0x02:ADCD(*eard,id,LoadRd,SaveRd);break;				case 0x03:SBBD(*eard,id,LoadRd,SaveRd);break;				case 0x04:ANDD(*eard,id,LoadRd,SaveRd);break;				case 0x05:SUBD(*eard,id,LoadRd,SaveRd);break;				case 0x06:XORD(*eard,id,LoadRd,SaveRd);break;				case 0x07:CMPD(*eard,id,LoadRd,SaveRd);break;				}			} else {				GetEAa;Bit32u id=(Bit32s)Fetchbs();				switch (which) {				case 0x00:ADDD(eaa,id,LoadMd,SaveMd);break;				case 0x01: ORD(eaa,id,LoadMd,SaveMd);break;				case 0x02:ADCD(eaa,id,LoadMd,SaveMd);break;				case 0x03:SBBD(eaa,id,LoadMd,SaveMd);break;				case 0x04:ANDD(eaa,id,LoadMd,SaveMd);break;				case 0x05:SUBD(eaa,id,LoadMd,SaveMd);break;				case 0x06:XORD(eaa,id,LoadMd,SaveMd);break;				case 0x07:CMPD(eaa,id,LoadMd,SaveMd);break;				}			}		}		break;	CASE_D(0x85)												/* TEST Ed,Gd */		RMEdGd(TESTD);break;	CASE_D(0x87)												/* XCHG Ed,Gd */		{				GetRMrd;Bit32u oldrmrd=*rmrd;			if (rm >= 0xc0 ) {GetEArd;*rmrd=*eard;*eard=oldrmrd;}			else {GetEAa;*rmrd=LoadMd(eaa);SaveMd(eaa,oldrmrd);}			break;		}	CASE_D(0x89)												/* MOV Ed,Gd */		{				GetRMrd;			if (rm >= 0xc0 ) {GetEArd;*eard=*rmrd;}			else {GetEAa;SaveMd(eaa,*rmrd);}			break;		}	CASE_D(0x8b)												/* MOV Gd,Ed */		{				GetRMrd;			if (rm >= 0xc0 ) {GetEArd;*rmrd=*eard;}			else {GetEAa;*rmrd=LoadMd(eaa);}			break;		}	CASE_D(0x8c)												/* Mov Ew,Sw */			{				GetRM;Bit16u val;Bitu which=(rm>>3)&7;				switch (which) {				case 0x00:					/* MOV Ew,ES */					val=SegValue(es);break;				case 0x01:					/* MOV Ew,CS */					val=SegValue(cs);break;				case 0x02:					/* MOV Ew,SS */					val=SegValue(ss);break;				case 0x03:					/* MOV Ew,DS */					val=SegValue(ds);break;				case 0x04:					/* MOV Ew,FS */					val=SegValue(fs);break;				case 0x05:					/* MOV Ew,GS */					val=SegValue(gs);break;				default:					LOG(LOG_CPU,LOG_ERROR)("CPU:8c:Illegal RM Byte");					goto illegal_opcode;				}				if (rm >= 0xc0 ) {GetEArd;*eard=val;}				else {GetEAa;SaveMw(eaa,val);}				break;			}		CASE_D(0x8d)												/* LEA Gd */		{			//Little hack to always use segprefixed version			GetRMrd;			BaseDS=BaseSS=0;			if (TEST_PREFIX_ADDR) {				*rmrd=(Bit32u)(*EATable[256+rm])();			} else {				*rmrd=(Bit32u)(*EATable[rm])();			}			break;		}	CASE_D(0x8f)												/* POP Ed */		{			Bit32u val=Pop_32();			GetRM;			if (rm >= 0xc0 ) {GetEArd;*eard=val;}			else {GetEAa;SaveMd(eaa,val);}			break;		}

⌨️ 快捷键说明

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