diff --git a/src/cpu/core_full/op.h b/src/cpu/core_full/op.h index 3d755dc0..c00aa096 100644 --- a/src/cpu/core_full/op.h +++ b/src/cpu/core_full/op.h @@ -539,8 +539,26 @@ switch (inst.code.op) { BSWAP(inst.op1.d); break; case O_FPU: - LOG_MSG("FPU opcode %X unhandled",inst.entry); - break; + switch (((inst.rm>=0xc0) << 3) | inst.code.save) { + case 0x00: FPU_ESC0_EA(inst.rm,inst.rm_eaa);break; + case 0x01: FPU_ESC1_EA(inst.rm,inst.rm_eaa);break; + case 0x02: FPU_ESC2_EA(inst.rm,inst.rm_eaa);break; + case 0x03: FPU_ESC3_EA(inst.rm,inst.rm_eaa);break; + case 0x04: FPU_ESC4_EA(inst.rm,inst.rm_eaa);break; + case 0x05: FPU_ESC5_EA(inst.rm,inst.rm_eaa);break; + case 0x06: FPU_ESC6_EA(inst.rm,inst.rm_eaa);break; + case 0x07: FPU_ESC7_EA(inst.rm,inst.rm_eaa);break; + + case 0x08: FPU_ESC0_Normal(inst.rm);break; + case 0x09: FPU_ESC1_Normal(inst.rm);break; + case 0x0a: FPU_ESC2_Normal(inst.rm);break; + case 0x0b: FPU_ESC3_Normal(inst.rm);break; + case 0x0c: FPU_ESC4_Normal(inst.rm);break; + case 0x0d: FPU_ESC5_Normal(inst.rm);break; + case 0x0e: FPU_ESC6_Normal(inst.rm);break; + case 0x0f: FPU_ESC7_Normal(inst.rm);break; + } + goto nextopcode; case 0: break; default: diff --git a/src/cpu/core_full/optable.h b/src/cpu/core_full/optable.h index 03534e70..b06b0ffd 100644 --- a/src/cpu/core_full/optable.h +++ b/src/cpu/core_full/optable.h @@ -153,10 +153,10 @@ static OpCode OpCodeTable[1024]={ {D_SETALC ,0 ,0 ,0 },{D_XLATw ,0 ,0 ,0 }, //TODO FPU /* 0xd8 - 0xdf */ -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, +{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,1 ,0 }, +{L_MODRM ,O_FPU ,2 ,0 },{L_MODRM ,O_FPU ,3 ,0 }, +{L_MODRM ,O_FPU ,4 ,0 },{L_MODRM ,O_FPU ,5 ,0 }, +{L_MODRM ,O_FPU ,6 ,0 },{L_MODRM ,O_FPU ,7 ,0 }, /* 0xe0 - 0xe7 */ {L_Ibx ,O_LOOPNZ ,S_AIPw ,0 },{L_Ibx ,O_LOOPZ ,S_AIPw ,0 }, @@ -510,10 +510,10 @@ static OpCode OpCodeTable[1024]={ {L_Ib ,O_AAM ,0 ,0 },{L_Ib ,O_AAD ,0 ,0 }, {D_SETALC ,0 ,0 ,0 },{D_XLATd ,0 ,0 ,0 }, /* 0x2d8 - 0x2df */ -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, -{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,0 ,0 }, +{L_MODRM ,O_FPU ,0 ,0 },{L_MODRM ,O_FPU ,1 ,0 }, +{L_MODRM ,O_FPU ,2 ,0 },{L_MODRM ,O_FPU ,3 ,0 }, +{L_MODRM ,O_FPU ,4 ,0 },{L_MODRM ,O_FPU ,5 ,0 }, +{L_MODRM ,O_FPU ,6 ,0 },{L_MODRM ,O_FPU ,7 ,0 }, /* 0x2e0 - 0x2e7 */ {L_Ibx ,O_LOOPNZ ,S_AIPd ,0 },{L_Ibx ,O_LOOPZ ,S_AIPd ,0 },