📄 dyn_fpu_dh.h
字号:
LOG(LOG_FPU,LOG_ERROR)("8087 only fpu code used esc 3: group 4: subfuntion :%d",sub); break; case 0x02: //FNCLEX FCLEX cache_addb(0xdb); cache_addb(decode.modrm.val); break; case 0x03: //FNINIT FINIT gen_call_function((void*)&FPU_FNINIT_DH,""); cache_addb(0xdb); cache_addb(decode.modrm.val); 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_FLD_32,"%Ddr",DREG(EA)); cache_addb(0xdb); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); break; case 0x01: /* FISTTP */ LOG(LOG_FPU,LOG_WARN)("ESC 3 EA:Unhandled group %d subfunction %d",group,sub); break; case 0x02: /* FIST */ cache_addb(0xdb); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_32,"%Ddr",DREG(EA)); break; case 0x03: /* FISTP */ cache_addb(0xdb); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_32,"%Ddr",DREG(EA)); break; case 0x05: /* FLD 80 Bits Real */ gen_call_function((void*)&FPU_FLD_80,"%Ddr",DREG(EA)); cache_addb(0xdb); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); break; case 0x07: /* FSTP 80 Bits Real */ cache_addb(0xdb); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_80,"%Ddr",DREG(EA)); break; default: LOG(LOG_FPU,LOG_WARN)("ESC 3 EA:Unhandled group %d subfunction %d",group,sub); } }}static void dh_fpu_esc4(){ dyn_get_modrm(); Bitu group=(decode.modrm.val >> 3) & 7; Bitu sub=(decode.modrm.val & 7); if (decode.modrm.val >= 0xc0) { cache_addb(0xdc); cache_addb(decode.modrm.val); } else { dyn_fill_ea(); gen_call_function((void*)&FPU_FLD_64,"%Ddr",DREG(EA)); cache_addb(0xdc); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); }}static void dh_fpu_esc5(){ dyn_get_modrm(); if (decode.modrm.val >= 0xc0) { cache_addb(0xdd); cache_addb(decode.modrm.val); } else { dyn_fill_ea(); Bitu group=(decode.modrm.val >> 3) & 7; Bitu sub=(decode.modrm.val & 7); switch(group){ case 0x00: /* FLD double real*/ gen_call_function((void*)&FPU_FLD_64,"%Ddr",DREG(EA)); cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); 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*/ cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_64,"%Ddr",DREG(EA)); break; case 0x03: /* FSTP double real*/ cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_64,"%Ddr",DREG(EA)); break; case 0x04: /* FRSTOR */ gen_call_function((void*)&FPU_FRSTOR_DH,"%Ddr",DREG(EA)); cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp_state[0]))); break; case 0x06: /* FSAVE */ cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp_state[0]))); gen_call_function((void*)&FPU_FSAVE_DH,"%Ddr",DREG(EA)); cache_addb(0xdb); cache_addb(0xe3); break; case 0x07: /* FNSTSW */ cache_addb(0xdd); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_16,"%Ddr",DREG(EA)); break; default: LOG(LOG_FPU,LOG_WARN)("ESC 5 EA:Unhandled group %d subfunction %d",group,sub); } }}static void dh_fpu_esc6(){ dyn_get_modrm(); Bitu group=(decode.modrm.val >> 3) & 7; Bitu sub=(decode.modrm.val & 7); if (decode.modrm.val >= 0xc0) { cache_addb(0xde); cache_addb(decode.modrm.val); } else { dyn_fill_ea(); gen_call_function((void*)&FPU_FLD_16,"%Ddr",DREG(EA)); cache_addb(0xde); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); }}static void dh_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*/ cache_addb(0xdf); cache_addb(decode.modrm.val); break; case 0x02: /* FSTP STi*/ case 0x03: /* FSTP STi*/ cache_addb(0xdf); cache_addb(decode.modrm.val); break; case 0x04: switch(sub){ case 0x00: /* FNSTSW AX*/ cache_addb(0xdd); cache_addb(0x05|(0x07<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_load_host(&(dyn_dh_fpu.temp.m1),DREG(TMPB),4); gen_dop_word(DOP_MOV,false,DREG(EAX),DREG(TMPB)); gen_releasereg(DREG(TMPB)); 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_FLD_16,"%Ddr",DREG(EA)); cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); break; case 0x01: LOG(LOG_FPU,LOG_WARN)("ESC 7 EA:Unhandled group %d subfunction %d",group,sub); break; case 0x02: /* FIST Bit16s */ cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_16,"%Ddr",DREG(EA)); break; case 0x03: /* FISTP Bit16s */ cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_16,"%Ddr",DREG(EA)); break; case 0x04: /* FBLD packed BCD */ gen_call_function((void*)&FPU_FLD_80,"%Ddr",DREG(EA)); cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); break; case 0x05: /* FILD Bit64s */ gen_call_function((void*)&FPU_FLD_64,"%Ddr",DREG(EA)); cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); break; case 0x06: /* FBSTP packed BCD */ cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_80,"%Ddr",DREG(EA)); break; case 0x07: /* FISTP Bit64s */ cache_addb(0xdf); cache_addb(0x05|(decode.modrm.reg<<3)); cache_addd((Bit32u)(&(dyn_dh_fpu.temp.m1))); gen_call_function((void*)&FPU_FST_64,"%Ddr",DREG(EA)); 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 + -