[FAST486]
authorAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 30 Nov 2013 02:03:51 +0000 (02:03 +0000)
committerAleksandar Andrejevic <aandrejevic@reactos.org>
Sat, 30 Nov 2013 02:03:51 +0000 (02:03 +0000)
FPU instructions never generate #UD. If CR0.EM is set, they generate #NM.
If there is no FPU and CR0.EM is cleared, they do nothing.
Add a helper macro FPU_ST for accessing FPU registers.
Add a compile-time option to disable the FPU.

svn path=/branches/ntvdm/; revision=61150

lib/fast486/fast486.c
lib/fast486/fpu.c
lib/fast486/fpu.h

index f28e9c9..efdeb63 100644 (file)
@@ -266,8 +266,10 @@ Fast486Reset(PFAST486_STATE State)
     State->Idtr.Size = 0x3FF;
     State->Idtr.Address = 0;
 
+#ifndef FAST486_NO_FPU
     /* Initialize CR0 */
     State->ControlRegisters[FAST486_REG_CR0] |= FAST486_CR0_ET;
+#endif
 
     /* Restore the callbacks and TLB */
     State->MemReadCallback  = MemReadCallback;
index f071c38..a73e079 100644 (file)
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD8)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeD9)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDA)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDB)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDC)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDD)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDE)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 FAST486_OPCODE_HANDLER(Fast486FpuOpcodeDF)
 {
+    FPU_CHECK();
+
+#ifndef FAST486_NO_FPU
     // TODO: NOT IMPLEMENTED
     UNIMPLEMENTED;
-    Fast486Exception(State, FAST486_EXCEPTION_UD);
+
     return FALSE;
+#else
+    /* Do nothing */
+    return TRUE;
+#endif
 }
 
 /* EOF */
index 370aab3..63128a4 100644 (file)
 
 /* DEFINES ********************************************************************/
 
+#define FPU_CHECK() if (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_EM) \
+                    { \
+                        Fast486Exception(State, FAST486_EXCEPTION_NM); \
+                        return FALSE; \
+                    }
+#define FPU_ST(i) State->FpuRegisters[(State->FpuStatus.Top + (i)) % FAST486_NUM_FPU_REGS]
+
 enum
 {
     FPU_SINGLE_PRECISION = 0,