--- np2/i386c/ia32/instructions/fpu/fpdummy.c 2011/01/15 17:17:24 1.8 +++ np2/i386c/ia32/instructions/fpu/fpdummy.c 2011/12/20 03:06:05 1.9 @@ -7,12 +7,19 @@ void FWAIT(void) { +#if !defined(USE_FPU) + EXCEPTION(NM_EXCEPTION, 0); +#else // TRACEOUT(("use FPU - FWAIT")); +#endif } void ESC0(void) { +#if !defined(USE_FPU) + EXCEPTION(NM_EXCEPTION, 0); +#else UINT32 op, madr; GET_PCBYTE(op); @@ -21,6 +28,7 @@ ESC0(void) } else { madr = calc_ea_dst(op); } +#endif } void @@ -30,6 +38,19 @@ ESC1(void) GET_PCBYTE(op); // TRACEOUT(("use FPU d9 %.2x", op)); +#if !defined(USE_FPU) + if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); + } else { + madr = calc_ea_dst(op); + if (((op >> 3) & 7) != 7) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FSTCW */ + TRACEOUT(("FSTCW")); + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); + } +#else if (op >= 0xc0) { } else { madr = calc_ea_dst(op); @@ -38,11 +59,15 @@ ESC1(void) cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); } } +#endif } void ESC2(void) { +#if !defined(USE_FPU) + EXCEPTION(NM_EXCEPTION, 0); +#else UINT32 op, madr; GET_PCBYTE(op); @@ -51,6 +76,7 @@ ESC2(void) } else { madr = calc_ea_dst(op); } +#endif } void @@ -60,15 +86,26 @@ ESC3(void) GET_PCBYTE(op); // TRACEOUT(("use FPU db %.2x", op)); +#if !defined(USE_FPU) + if (op != 0xe3) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FNINIT */ + (void)madr; +#else if (op >= 0xc0) { } else { madr = calc_ea_dst(op); } +#endif } void ESC4(void) { +#if !defined(USE_FPU) + EXCEPTION(NM_EXCEPTION, 0); +#else UINT32 op, madr; GET_PCBYTE(op); @@ -77,6 +114,7 @@ ESC4(void) } else { madr = calc_ea_dst(op); } +#endif } void @@ -86,15 +124,32 @@ ESC5(void) GET_PCBYTE(op); // TRACEOUT(("use FPU dd %.2x", op)); +#if !defined(USE_FPU) if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { + if (((op >> 3) & 7) != 7) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FSTSW */ madr = calc_ea_dst(op); + TRACEOUT(("FSTSW")); + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0); } +#else + if (op >= 0xc0) { + } else { + madr = calc_ea_dst(op); + } +#endif } void ESC6(void) { +#if !defined(USE_FPU) + EXCEPTION(NM_EXCEPTION, 0); +#else UINT32 op, madr; GET_PCBYTE(op); @@ -103,6 +158,7 @@ ESC6(void) } else { madr = calc_ea_dst(op); } +#endif } void @@ -112,8 +168,21 @@ ESC7(void) GET_PCBYTE(op); // TRACEOUT(("use FPU df %.2x", op)); +#if !defined(USE_FPU) + if (op >= 0xc0) { + if (op != 0xe0) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FSTSW AX */ + TRACEOUT(("FSTSW AX")); + CPU_AX = 0; + } else { + EXCEPTION(NM_EXCEPTION, 0); + } +#else if (op >= 0xc0) { } else { madr = calc_ea_dst(op); } +#endif }