[FAST486]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 1 Nov 2013 02:28:47 +0000 (02:28 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Fri, 1 Nov 2013 02:28:47 +0000 (02:28 +0000)
Fix the type of a variable.

[NTVDM]
Introduce a BOP handler table for the 256 possible BOP functions and use it.

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

lib/fast486/fast486.c
subsystems/ntvdm/bop.c
subsystems/ntvdm/bop.h
subsystems/ntvdm/emulator.c
subsystems/ntvdm/emulator.h

index 52d93c1..2b00cbd 100644 (file)
@@ -219,7 +219,7 @@ VOID
 NTAPI
 Fast486Reset(PFAST486_STATE State)
 {
-    USHORT i;
+    FAST486_SEG_REGS i;
 
     FAST486_MEM_READ_PROC  MemReadCallback  = State->MemReadCallback;
     FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;
index 41d9510..a201dc1 100644 (file)
 
 #include "emulator.h"
 #include "bios.h"
+#include "bop.h"
 #include "dos.h"
-#include "vga.h"
-#include "pic.h"
-#include "ps2.h"
-#include "timer.h"
-
+//#include "vga.h"
+//#include "pic.h"
+//#include "ps2.h"
+//#include "timer.h"
 
 LPCWSTR ExceptionName[] =
 {
@@ -32,6 +32,266 @@ LPCWSTR ExceptionName[] =
     L"FPU Not Available"
 };
 
+EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM] =
+{
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    NULL,
+    ControlBop
+};
+
 VOID WINAPI Exception(BYTE ExceptionNumber, LPWORD Stack)
 {
     WORD CodeSegment, InstructionPointer;
index 38a39e7..61a45eb 100644 (file)
@@ -7,4 +7,10 @@
  *                  Hermes Belusca-Maito (hermes.belusca@sfr.fr)
  */
 
+typedef VOID (WINAPI *EMULATOR_BOP_PROC)(LPWORD Stack);
+
+extern EMULATOR_BOP_PROC BopProc[EMULATOR_MAX_BOP_NUM];
+
+VOID WINAPI ControlBop(LPWORD Stack);
+
 /* EOF */
index df2e843..4a7ed72 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "emulator.h"
 #include "bios.h"
+#include "bop.h"
 #include "dos.h"
 #include "vga.h"
 #include "pic.h"
@@ -225,7 +226,6 @@ static VOID WINAPI EmulatorWriteIo(PFAST486_STATE State, ULONG Port, PVOID Buffe
     }
 }
 
-VOID WINAPI ControlBop(LPWORD Stack);
 static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode)
 {
     WORD StackSegment, StackPointer;
@@ -238,16 +238,10 @@ static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode)
     /* Get the stack */
     Stack = (LPWORD)SEG_OFF_TO_PTR(StackSegment, StackPointer);
 
-    switch (BopCode)
-    {
-        case EMULATOR_INT_BOP:
-            ControlBop(Stack);
-            break;
-
-        default:
-            DPRINT1("Invalid BOP code %u\n", BopCode);
-            break;
-    }
+    if (BopProc[BopCode] != NULL)
+        BopProc[BopCode](Stack);
+    else
+        DPRINT1("Invalid BOP code %u\n", BopCode);
 }
 
 static UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State)
index ea295ea..53ced8f 100644 (file)
@@ -35,8 +35,9 @@
 #define EMULATOR_FLAG_ID (1 << 21)
 
 /* Common definitions */
-#define EMULATOR_BOP        0xC4C4
-#define EMULATOR_INT_BOP    0xFF
+#define EMULATOR_BOP            0xC4C4
+#define EMULATOR_INT_BOP        0xFF
+#define EMULATOR_MAX_BOP_NUM    0xFF + 1
 
 #define STACK_COUNTER   0
 #define STACK_INT_NUM   1