--- np2/i386c/ia32/instructions/fpu/fpdummy.c 2004/02/05 16:43:45 1.2 +++ np2/i386c/ia32/instructions/fpu/fpdummy.c 2012/01/29 03:22:24 1.12 @@ -1,23 +1,142 @@ -/* $Id: fpdummy.c,v 1.2 2004/02/05 16:43:45 monaka Exp $ */ - #include "compiler.h" #include "cpu.h" #include "ia32.mcr" +#include "fp.h" void -FWAIT(void) +ESC0(void) { + UINT32 op, madr; + + 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); + } } void -ESC0(void) +ESC1(void) +{ + UINT32 op, madr; + + GET_PCBYTE(op); + TRACEOUT(("use FPU d9 %.2x", op)); + if (op >= 0xc0) { + EXCEPTION(NM_EXCEPTION, 0); + } else { + madr = calc_ea_dst(op); + if ((op & 0x38) == 0x38) { + TRACEOUT(("FSTCW")); + cpu_vmemorywrite_w(CPU_INST_SEGREG_INDEX, madr, 0xffff); + } + } +} + +void +ESC2(void) +{ + UINT32 op, madr; + + 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); + } +} + +void +ESC3(void) +{ + UINT32 op, madr; + + 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); + } +} + +void +ESC4(void) +{ + UINT32 op, madr; + + 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); + } +} + +void +ESC5(void) +{ + UINT32 op, madr; + + 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); + } +} + +void +ESC6(void) +{ + UINT32 op, madr; + + 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); + } +} + +void +ESC7(void) { - DWORD op, madr; + UINT32 op, madr; 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); } }