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

📄 prefix_none.h

📁 DOSBox emulates a full x86 pc with sound and dos. Its main use is to run old dosgames on platforms w
💻 H
📖 第 1 页 / 共 3 页
字号:
				}			} else {				GetEAa;Bit16u iw=(Bit16s)Fetchbs();				switch (which) {				case 0x00:ADDW(eaa,iw,LoadMw,SaveMw);break;				case 0x01: ORW(eaa,iw,LoadMw,SaveMw);break;				case 0x02:ADCW(eaa,iw,LoadMw,SaveMw);break;				case 0x03:SBBW(eaa,iw,LoadMw,SaveMw);break;				case 0x04:ANDW(eaa,iw,LoadMw,SaveMw);break;				case 0x05:SUBW(eaa,iw,LoadMw,SaveMw);break;				case 0x06:XORW(eaa,iw,LoadMw,SaveMw);break;				case 0x07:CMPW(eaa,iw,LoadMw,SaveMw);break;				}			}			break;		}	CASE_B(0x84)												/* TEST Eb,Gb */		RMEbGb(TESTB);		break;	CASE_W(0x85)												/* TEST Ew,Gw */		RMEwGw(TESTW);		break;	CASE_B(0x86)												/* XCHG Eb,Gb */		{				GetRMrb;Bit8u oldrmrb=*rmrb;			if (rm >= 0xc0 ) {GetEArb;*rmrb=*earb;*earb=oldrmrb;}			else {GetEAa;*rmrb=LoadMb(eaa);SaveMb(eaa,oldrmrb);}			break;		}	CASE_W(0x87)												/* XCHG Ew,Gw */		{				GetRMrw;Bit16u oldrmrw=*rmrw;			if (rm >= 0xc0 ) {GetEArw;*rmrw=*earw;*earw=oldrmrw;}			else {GetEAa;*rmrw=LoadMw(eaa);SaveMw(eaa,oldrmrw);}			break;		}	CASE_B(0x88)												/* MOV Eb,Gb */		{				GetRMrb;			if (rm >= 0xc0 ) {GetEArb;*earb=*rmrb;}			else {				if (cpu.pmode) {					if (GCC_UNLIKELY((rm==0x05) && (!cpu.code.big))) {						Descriptor desc;						cpu.gdt.GetDescriptor(SegValue(core.base_val_ds),desc);						if ((desc.Type()==DESC_CODE_R_NC_A) || (desc.Type()==DESC_CODE_R_NC_NA)) {							CPU_Exception(EXCEPTION_GP,SegValue(core.base_val_ds) & 0xfffc);							continue;						}					}				}				GetEAa;SaveMb(eaa,*rmrb);			}			break;		}	CASE_W(0x89)												/* MOV Ew,Gw */		{				GetRMrw;			if (rm >= 0xc0 ) {GetEArw;*earw=*rmrw;}			else {GetEAa;SaveMw(eaa,*rmrw);}			break;		}	CASE_B(0x8a)												/* MOV Gb,Eb */		{				GetRMrb;			if (rm >= 0xc0 ) {GetEArb;*rmrb=*earb;}			else {GetEAa;*rmrb=LoadMb(eaa);}			break;		}	CASE_W(0x8b)												/* MOV Gw,Ew */		{				GetRMrw;			if (rm >= 0xc0 ) {GetEArw;*rmrw=*earw;}			else {GetEAa;*rmrw=LoadMw(eaa);}			break;		}	CASE_W(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 ) {GetEArw;*earw=val;}			else {GetEAa;SaveMw(eaa,val);}			break;		}	CASE_W(0x8d)												/* LEA Gw */		{			//Little hack to always use segprefixed version			BaseDS=BaseSS=0;			GetRMrw;			if (TEST_PREFIX_ADDR) {				*rmrw=(Bit16u)(*EATable[256+rm])();			} else {				*rmrw=(Bit16u)(*EATable[rm])();			}			break;		}	CASE_B(0x8e)												/* MOV Sw,Ew */		{			GetRM;Bit16u val;Bitu which=(rm>>3)&7;			if (rm >= 0xc0 ) {GetEArw;val=*earw;}			else {GetEAa;val=LoadMw(eaa);}			switch (which) {			case 0x02:					/* MOV SS,Ew */				CPU_Cycles++; //Always do another instruction			case 0x00:					/* MOV ES,Ew */			case 0x03:					/* MOV DS,Ew */			case 0x05:					/* MOV GS,Ew */			case 0x04:					/* MOV FS,Ew */				if (CPU_SetSegGeneral((SegNames)which,val)) RUNEXCEPTION();				break;			default:				goto illegal_opcode;			}			break;		}								CASE_W(0x8f)												/* POP Ew */		{			Bit16u val=Pop_16();			GetRM;			if (rm >= 0xc0 ) {GetEArw;*earw=val;}			else {GetEAa;SaveMw(eaa,val);}			break;		}	CASE_B(0x90)												/* NOP */		break;	CASE_W(0x91)												/* XCHG CX,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_cx;reg_cx=temp; }		break;	CASE_W(0x92)												/* XCHG DX,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_dx;reg_dx=temp; }		break;	CASE_W(0x93)												/* XCHG BX,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_bx;reg_bx=temp; }		break;	CASE_W(0x94)												/* XCHG SP,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_sp;reg_sp=temp; }		break;	CASE_W(0x95)												/* XCHG BP,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_bp;reg_bp=temp; }		break;	CASE_W(0x96)												/* XCHG SI,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_si;reg_si=temp; }		break;	CASE_W(0x97)												/* XCHG DI,AX */		{ Bit16u temp=reg_ax;reg_ax=reg_di;reg_di=temp; }		break;	CASE_W(0x98)												/* CBW */		reg_ax=(Bit8s)reg_al;break;	CASE_W(0x99)												/* CWD */		if (reg_ax & 0x8000) reg_dx=0xffff;else reg_dx=0;		break;	CASE_W(0x9a)												/* CALL Ap */		{ 			FillFlags();			Bit16u newip=Fetchw();Bit16u newcs=Fetchw();			CPU_CALL(false,newcs,newip,GETIP);#if CPU_TRAP_CHECK			if (GETFLAG(TF)) {					cpudecoder=CPU_Core_Normal_Trap_Run;				return CBRET_NONE;			}#endif			continue;		}	CASE_B(0x9b)												/* WAIT */		break; /* No waiting here */	CASE_W(0x9c)												/* PUSHF */		FillFlags();		if (CPU_PUSHF(false)) RUNEXCEPTION();		break;	CASE_W(0x9d)												/* POPF */		if (CPU_POPF(false)) 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_B(0x9e)												/* SAHF */		SETFLAGSb(reg_ah);		break;	CASE_B(0x9f)												/* LAHF */		FillFlags();		reg_ah=reg_flags&0xff;		break;	CASE_B(0xa0)												/* MOV AL,Ob */		{			GetEADirect;			reg_al=LoadMb(eaa);		}		break;	CASE_W(0xa1)												/* MOV AX,Ow */		{			GetEADirect;			reg_ax=LoadMw(eaa);		}		break;	CASE_B(0xa2)												/* MOV Ob,AL */		{			GetEADirect;			SaveMb(eaa,reg_al);		}		break;	CASE_W(0xa3)												/* MOV Ow,AX */		{			GetEADirect;			SaveMw(eaa,reg_ax);		}		break;	CASE_B(0xa4)												/* MOVSB */		DoString(R_MOVSB);break;	CASE_W(0xa5)												/* MOVSW */		DoString(R_MOVSW);break;	CASE_B(0xa6)												/* CMPSB */		DoString(R_CMPSB);break;	CASE_W(0xa7)												/* CMPSW */		DoString(R_CMPSW);break;	CASE_B(0xa8)												/* TEST AL,Ib */		ALIb(TESTB);break;	CASE_W(0xa9)												/* TEST AX,Iw */		AXIw(TESTW);break;	CASE_B(0xaa)												/* STOSB */		DoString(R_STOSB);break;	CASE_W(0xab)												/* STOSW */		DoString(R_STOSW);break;	CASE_B(0xac)												/* LODSB */		DoString(R_LODSB);break;	CASE_W(0xad)												/* LODSW */		DoString(R_LODSW);break;	CASE_B(0xae)												/* SCASB */		DoString(R_SCASB);break;	CASE_W(0xaf)												/* SCASW */		DoString(R_SCASW);break;	CASE_B(0xb0)												/* MOV AL,Ib */		reg_al=Fetchb();break;	CASE_B(0xb1)												/* MOV CL,Ib */		reg_cl=Fetchb();break;	CASE_B(0xb2)												/* MOV DL,Ib */		reg_dl=Fetchb();break;	CASE_B(0xb3)												/* MOV BL,Ib */		reg_bl=Fetchb();break;	CASE_B(0xb4)												/* MOV AH,Ib */		reg_ah=Fetchb();break;	CASE_B(0xb5)												/* MOV CH,Ib */		reg_ch=Fetchb();break;	CASE_B(0xb6)												/* MOV DH,Ib */		reg_dh=Fetchb();break;	CASE_B(0xb7)												/* MOV BH,Ib */		reg_bh=Fetchb();break;	CASE_W(0xb8)												/* MOV AX,Iw */		reg_ax=Fetchw();break;	CASE_W(0xb9)												/* MOV CX,Iw */		reg_cx=Fetchw();break;	CASE_W(0xba)												/* MOV DX,Iw */		reg_dx=Fetchw();break;	CASE_W(0xbb)												/* MOV BX,Iw */		reg_bx=Fetchw();break;	CASE_W(0xbc)												/* MOV SP,Iw */		reg_sp=Fetchw();break;	CASE_W(0xbd)												/* MOV BP.Iw */		reg_bp=Fetchw();break;	CASE_W(0xbe)												/* MOV SI,Iw */		reg_si=Fetchw();break;	CASE_W(0xbf)												/* MOV DI,Iw */		reg_di=Fetchw();break;	CASE_B(0xc0)												/* GRP2 Eb,Ib */		GRP2B(Fetchb());break;	CASE_W(0xc1)												/* GRP2 Ew,Ib */		GRP2W(Fetchb());break;	CASE_W(0xc2)												/* RETN Iw */		reg_eip=Pop_16();		reg_esp+=Fetchw();		continue;	CASE_W(0xc3)												/* RETN */		reg_eip=Pop_16();		continue;	CASE_W(0xc4)												/* LES */		{				GetRMrw;GetEAa;			if (CPU_SetSegGeneral(es,LoadMw(eaa+2))) RUNEXCEPTION();			*rmrw=LoadMw(eaa);			break;		}	CASE_W(0xc5)												/* LDS */		{				GetRMrw;GetEAa;			if (CPU_SetSegGeneral(ds,LoadMw(eaa+2))) RUNEXCEPTION();			*rmrw=LoadMw(eaa);			break;		}	CASE_B(0xc6)												/* MOV Eb,Ib */		{			GetRM;			if (rm >= 0xc0) {GetEArb;*earb=Fetchb();}			else {GetEAa;SaveMb(eaa,Fetchb());}			break;		}	CASE_W(0xc7)												/* MOV EW,Iw */		{			GetRM;			if (rm >= 0xc0) {GetEArw;*earw=Fetchw();}			else {GetEAa;SaveMw(eaa,Fetchw());}			break;		}	CASE_W(0xc8)												/* ENTER Iw,Ib */		{			Bitu bytes=Fetchw();			Bitu level=Fetchb();			CPU_ENTER(false,bytes,level);		}		break;	CASE_W(0xc9)												/* LEAVE */		reg_esp&=cpu.stack.notmask;		reg_esp|=(reg_ebp&cpu.stack.mask);		reg_bp=Pop_16();		break;	CASE_W(0xca)												/* RETF Iw */		{			Bitu words=Fetchw();			FillFlags();			CPU_RET(false,words,GETIP);			continue;		}	CASE_W(0xcb)												/* RETF */					FillFlags();		CPU_RET(false,0,GETIP);		continue;	CASE_B(0xcc)												/* INT3 */		FillFlags();#if C_DEBUG			if (DEBUG_Breakpoint())			return debugCallback;#endif					CPU_SW_Interrupt_NoIOPLCheck(3,GETIP);#if CPU_TRAP_CHECK		cpu.trap_skip=true;#endif		continue;	CASE_B(0xcd)												/* INT Ib */			{			Bit8u num=Fetchb();			FillFlags();#if C_DEBUG			if (DEBUG_IntBreakpoint(num)) {				return debugCallback;			}#endif			CPU_SW_Interrupt(num,GETIP);#if CPU_TRAP_CHECK			cpu.trap_skip=true;#endif			continue;		}	CASE_B(0xce)												/* INTO */		if (get_OF()) {			FillFlags();			CPU_SW_Interrupt(4,GETIP);#if CPU_TRAP_CHECK			cpu.trap_skip=true;#endif			continue;		}		break;	CASE_W(0xcf)												/* IRET */		{			FillFlags();			CPU_IRET(false,GETIP);#if CPU_TRAP_CHECK			if (GETFLAG(TF)) {					cpudecoder=CPU_Core_Normal_Trap_Run;				return CBRET_NONE;			}

⌨️ 快捷键说明

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