--- np2/i386c/ia32/instructions/fpu/fpdummy.c 2004/03/08 12:45:58 1.4 +++ np2/i386c/ia32/instructions/fpu/fpdummy.c 2012/06/18 14:13:08 1.14 @@ -1,17 +1,10 @@ -/* $Id: fpdummy.c,v 1.4 2004/03/08 12:45:58 yui Exp $ */ - #include "compiler.h" #include "cpu.h" #include "ia32.mcr" +#include "fp.h" void -FWAIT(void) -{ - TRACEOUT(("use FPU - FWAIT")); -} - -void ESC0(void) { UINT32 op, madr; @@ -19,8 +12,10 @@ ESC0(void) GET_PCBYTE(op); TRACEOUT(("use FPU d8 %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } } @@ -32,8 +27,24 @@ ESC1(void) GET_PCBYTE(op); TRACEOUT(("use FPU d9 %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + switch (op & 0x38) { + case 0x28: + TRACEOUT(("FLDCW")); + (void) cpu_vmemoryread_w(CPU_INST_SEGREG_INDEX, madr); + break; + + case 0x38: + TRACEOUT(("FSTCW")); + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); + break; + + default: + EXCEPTION(NM_EXCEPTION, 0); + break; + } } } @@ -45,8 +56,10 @@ ESC2(void) GET_PCBYTE(op); TRACEOUT(("use FPU da %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } } @@ -58,8 +71,14 @@ ESC3(void) GET_PCBYTE(op); TRACEOUT(("use FPU db %.2x", op)); if (op >= 0xc0) { + if (op != 0xe3) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FNINIT */ + (void)madr; } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } } @@ -71,8 +90,10 @@ ESC4(void) GET_PCBYTE(op); TRACEOUT(("use FPU dc %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } } @@ -84,8 +105,15 @@ ESC5(void) GET_PCBYTE(op); TRACEOUT(("use FPU dd %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + if (((op >> 3) & 7) != 7) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FSTSW */ + TRACEOUT(("FSTSW")); + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); } } @@ -97,8 +125,10 @@ ESC6(void) GET_PCBYTE(op); TRACEOUT(("use FPU de %.2x", op)); if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } } @@ -110,7 +140,14 @@ ESC7(void) GET_PCBYTE(op); TRACEOUT(("use FPU df %.2x", op)); if (op >= 0xc0) { + if (op != 0xe0) { + EXCEPTION(NM_EXCEPTION, 0); + } + /* FSTSW AX */ + TRACEOUT(("FSTSW AX")); + CPU_AX = 0xffff; } else { madr = calc_ea_dst(op); + EXCEPTION(NM_EXCEPTION, 0); } }