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

📄 dyn_fpu.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 页
字号:
				gen_protectflags(); 				gen_load_host(&TOP,DREG(EA),4); 				gen_dop_word_imm(DOP_ADD,true,DREG(EA),1); 				gen_dop_word_imm(DOP_AND,true,DREG(EA),7); 				gen_load_host(&TOP,DREG(TMPB),4); 				gen_call_function((void *)&FPU_FUCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));				gen_call_function((void *)&FPU_FPOP,"");				gen_call_function((void *)&FPU_FPOP,"");				break;			default:				LOG(LOG_FPU,LOG_WARN)("ESC 2:Unhandled group %d subfunction %d",group,sub); 				break;			}			break;		default:	   		LOG(LOG_FPU,LOG_WARN)("ESC 2:Unhandled group %d subfunction %d",group,sub);			break;		}	} else {		dyn_fill_ea(); 		gen_call_function((void*)&FPU_FLD_I32_EA,"%Ddr",DREG(EA)); 		gen_load_host(&TOP,DREG(TMPB),4); 		dyn_eatree();	}}static void dyn_fpu_esc3(){	dyn_get_modrm();  	if (decode.modrm.val >= 0xc0) { 		Bitu group=(decode.modrm.val >> 3) & 7;		Bitu sub=(decode.modrm.val & 7);		switch (group) {		case 0x04:			switch (sub) {			case 0x00:				//FNENI			case 0x01:				//FNDIS				LOG(LOG_FPU,LOG_ERROR)("8087 only fpu code used esc 3: group 4: subfuntion :%d",sub);				break;			case 0x02:				//FNCLEX FCLEX				gen_call_function((void*)&FPU_FCLEX,"");				break;			case 0x03:				//FNINIT FINIT				gen_call_function((void*)&FPU_FINIT,"");				break;			case 0x04:				//FNSETPM			case 0x05:				//FRSTPM//				LOG(LOG_FPU,LOG_ERROR)("80267 protected mode (un)set. Nothing done");				break;			default:				E_Exit("ESC 3:ILLEGAL OPCODE group %d subfunction %d",group,sub);			}			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 3:Unhandled group %d subfunction %d",group,sub);			break;		}	} else {		Bitu group=(decode.modrm.val >> 3) & 7;		Bitu sub=(decode.modrm.val & 7);		dyn_fill_ea(); 		switch(group){		case 0x00:	/* FILD */			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_protectflags(); 			gen_load_host(&TOP,DREG(TMPB),4); 			gen_call_function((void*)&FPU_FLD_I32,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x01:	/* FISTTP */			LOG(LOG_FPU,LOG_WARN)("ESC 3 EA:Unhandled group %d subfunction %d",group,sub);			break;		case 0x02:	/* FIST */			gen_call_function((void*)&FPU_FST_I32,"%Ddr",DREG(EA));			break;		case 0x03:	/* FISTP */			gen_call_function((void*)&FPU_FST_I32,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x05:	/* FLD 80 Bits Real */			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_call_function((void*)&FPU_FLD_F80,"%Ddr",DREG(EA));			break;		case 0x07:	/* FSTP 80 Bits Real */			gen_call_function((void*)&FPU_FST_F80,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 3 EA:Unhandled group %d subfunction %d",group,sub);		}	}}static void dyn_fpu_esc4(){	dyn_get_modrm();  	Bitu group=(decode.modrm.val >> 3) & 7;	Bitu sub=(decode.modrm.val & 7);	if (decode.modrm.val >= 0xc0) { 		dyn_fpu_top();		switch(group){		case 0x00:	/* FADD STi,ST*/			gen_call_function((void*)&FPU_FADD,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x01:	/* FMUL STi,ST*/			gen_call_function((void*)&FPU_FMUL,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x02:  /* FCOM*/			gen_call_function((void*)&FPU_FCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;		case 0x03:  /* FCOMP*/			gen_call_function((void*)&FPU_FCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x04:  /* FSUBR STi,ST*/			gen_call_function((void*)&FPU_FSUBR,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x05:  /* FSUB  STi,ST*/			gen_call_function((void*)&FPU_FSUB,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x06:  /* FDIVR STi,ST*/			gen_call_function((void*)&FPU_FDIVR,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x07:  /* FDIV STi,ST*/			gen_call_function((void*)&FPU_FDIV,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		default:			break;		}	} else { 		dyn_fill_ea(); 		gen_call_function((void*)&FPU_FLD_F64_EA,"%Ddr",DREG(EA)); 		gen_load_host(&TOP,DREG(TMPB),4); 		dyn_eatree();	}}static void dyn_fpu_esc5(){	dyn_get_modrm();  	Bitu group=(decode.modrm.val >> 3) & 7;	Bitu sub=(decode.modrm.val & 7);	if (decode.modrm.val >= 0xc0) { 		dyn_fpu_top();		switch(group){		case 0x00: /* FFREE STi */			gen_call_function((void*)&FPU_FFREE,"%Ddr",DREG(EA));			break;		case 0x01: /* FXCH STi*/			gen_call_function((void*)&FPU_FXCH,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;		case 0x02: /* FST STi */			gen_call_function((void*)&FPU_FST,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;		case 0x03:  /* FSTP STi*/			gen_call_function((void*)&FPU_FST,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x04:	/* FUCOM STi */			gen_call_function((void*)&FPU_FUCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;		case 0x05:	/*FUCOMP STi */			gen_call_function((void*)&FPU_FUCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 5:Unhandled group %d subfunction %d",group,sub);			break;        }		gen_releasereg(DREG(EA));		gen_releasereg(DREG(TMPB));	} else {		dyn_fill_ea(); 		switch(group){		case 0x00:  /* FLD double real*/			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_protectflags(); 			gen_load_host(&TOP,DREG(TMPB),4); 			gen_call_function((void*)&FPU_FLD_F64,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x01:  /* FISTTP longint*/			LOG(LOG_FPU,LOG_WARN)("ESC 5 EA:Unhandled group %d subfunction %d",group,sub);			break;		case 0x02:   /* FST double real*/			gen_call_function((void*)&FPU_FST_F64,"%Ddr",DREG(EA));			break;		case 0x03:	/* FSTP double real*/			gen_call_function((void*)&FPU_FST_F64,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x04:	/* FRSTOR */			gen_call_function((void*)&FPU_FRSTOR,"%Ddr",DREG(EA));			break;		case 0x06:	/* FSAVE */			gen_call_function((void*)&FPU_FSAVE,"%Ddr",DREG(EA));			break;		case 0x07:   /*FNSTSW */			gen_protectflags(); 			gen_load_host(&TOP,DREG(TMPB),4); 			gen_call_function((void*)&FPU_SET_TOP,"%Dd",DREG(TMPB));			gen_load_host(&fpu.sw,DREG(TMPB),4); 			gen_call_function((void*)&mem_writew,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 5 EA:Unhandled group %d subfunction %d",group,sub);		}	}}static void dyn_fpu_esc6(){	dyn_get_modrm();  	Bitu group=(decode.modrm.val >> 3) & 7;	Bitu sub=(decode.modrm.val & 7);	if (decode.modrm.val >= 0xc0) { 		dyn_fpu_top();		switch(group){		case 0x00:	/*FADDP STi,ST*/			gen_call_function((void*)&FPU_FADD,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x01:	/* FMULP STi,ST*/			gen_call_function((void*)&FPU_FMUL,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x02:  /* FCOMP5*/			gen_call_function((void*)&FPU_FCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;	/* TODO IS THIS ALLRIGHT ????????? */		case 0x03:  /*FCOMPP*/			if(sub != 1) {				LOG(LOG_FPU,LOG_WARN)("ESC 6:Unhandled group %d subfunction %d",group,sub);				return;			}			gen_load_host(&TOP,DREG(EA),4); 			gen_dop_word_imm(DOP_ADD,true,DREG(EA),1);			gen_dop_word_imm(DOP_AND,true,DREG(EA),7);			gen_call_function((void*)&FPU_FCOM,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			gen_call_function((void*)&FPU_FPOP,""); /* extra pop at the bottom*/			break;		case 0x04:  /* FSUBRP STi,ST*/			gen_call_function((void*)&FPU_FSUBR,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x05:  /* FSUBP  STi,ST*/			gen_call_function((void*)&FPU_FSUB,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x06:	/* FDIVRP STi,ST*/			gen_call_function((void*)&FPU_FDIVR,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x07:  /* FDIVP STi,ST*/			gen_call_function((void*)&FPU_FDIV,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		default:			break;		}		gen_call_function((void*)&FPU_FPOP,"");			} else {		dyn_fill_ea(); 		gen_call_function((void*)&FPU_FLD_I16_EA,"%Ddr",DREG(EA)); 		gen_load_host(&TOP,DREG(TMPB),4); 		dyn_eatree();	}}static void dyn_fpu_esc7(){	dyn_get_modrm();  	Bitu group=(decode.modrm.val >> 3) & 7;	Bitu sub=(decode.modrm.val & 7);	if (decode.modrm.val >= 0xc0) { 		switch (group){		case 0x01: /* FXCH STi*/			dyn_fpu_top();			gen_call_function((void*)&FPU_FXCH,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			break;		case 0x02:  /* FSTP STi*/		case 0x03:  /* FSTP STi*/			dyn_fpu_top();			gen_call_function((void*)&FPU_FST,"%Ddr%Ddr",DREG(TMPB),DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x04:			switch(sub){				case 0x00:     /* FNSTSW AX*/					gen_load_host(&TOP,DREG(TMPB),4);					gen_call_function((void*)&FPU_SET_TOP,"%Ddr",DREG(TMPB)); 					gen_mov_host(&fpu.sw,DREG(EAX),2);					break;				default:					LOG(LOG_FPU,LOG_WARN)("ESC 7:Unhandled group %d subfunction %d",group,sub);					break;			}			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 7:Unhandled group %d subfunction %d",group,sub);			break;		}	} else {		dyn_fill_ea(); 		switch(group){		case 0x00:  /* FILD Bit16s */			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_load_host(&TOP,DREG(TMPB),4); 			gen_call_function((void*)&FPU_FLD_I16,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x01:			LOG(LOG_FPU,LOG_WARN)("ESC 7 EA:Unhandled group %d subfunction %d",group,sub);			break;		case 0x02:   /* FIST Bit16s */			gen_call_function((void*)&FPU_FST_I16,"%Ddr",DREG(EA));			break;		case 0x03:	/* FISTP Bit16s */			gen_call_function((void*)&FPU_FST_I16,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x04:   /* FBLD packed BCD */			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_load_host(&TOP,DREG(TMPB),4);			gen_call_function((void*)&FPU_FBLD,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x05:  /* FILD Bit64s */			gen_call_function((void*)&FPU_PREP_PUSH,"");			gen_load_host(&TOP,DREG(TMPB),4);			gen_call_function((void*)&FPU_FLD_I64,"%Ddr%Ddr",DREG(EA),DREG(TMPB));			break;		case 0x06:	/* FBSTP packed BCD */			gen_call_function((void*)&FPU_FBST,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		case 0x07:  /* FISTP Bit64s */			gen_call_function((void*)&FPU_FST_I64,"%Ddr",DREG(EA));			gen_call_function((void*)&FPU_FPOP,"");			break;		default:			LOG(LOG_FPU,LOG_WARN)("ESC 7 EA:Unhandled group %d subfunction %d",group,sub);			break;		}	}}#endif

⌨️ 快捷键说明

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