From 5c220ef0229990936b97ab3610ed63605a90aeac Mon Sep 17 00:00:00 2001 From: =?utf8?q?Herm=C3=A8s=20B=C3=A9lusca-Ma=C3=AFto?= Date: Fri, 1 Nov 2013 02:28:47 +0000 Subject: [PATCH] [FAST486] 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 | 2 +- subsystems/ntvdm/bop.c | 270 +++++++++++++++++++++++++++++++++++- subsystems/ntvdm/bop.h | 6 + subsystems/ntvdm/emulator.c | 16 +-- subsystems/ntvdm/emulator.h | 5 +- 5 files changed, 280 insertions(+), 19 deletions(-) diff --git a/lib/fast486/fast486.c b/lib/fast486/fast486.c index 52d93c1540e..2b00cbdf559 100644 --- a/lib/fast486/fast486.c +++ b/lib/fast486/fast486.c @@ -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; diff --git a/subsystems/ntvdm/bop.c b/subsystems/ntvdm/bop.c index 41d95102943..a201dc1f2ea 100644 --- a/subsystems/ntvdm/bop.c +++ b/subsystems/ntvdm/bop.c @@ -13,12 +13,12 @@ #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; diff --git a/subsystems/ntvdm/bop.h b/subsystems/ntvdm/bop.h index 38a39e7eeed..61a45eb3ba3 100644 --- a/subsystems/ntvdm/bop.h +++ b/subsystems/ntvdm/bop.h @@ -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 */ diff --git a/subsystems/ntvdm/emulator.c b/subsystems/ntvdm/emulator.c index df2e8434c2e..4a7ed723540 100644 --- a/subsystems/ntvdm/emulator.c +++ b/subsystems/ntvdm/emulator.c @@ -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) diff --git a/subsystems/ntvdm/emulator.h b/subsystems/ntvdm/emulator.h index ea295ea6654..53ced8f6f44 100644 --- a/subsystems/ntvdm/emulator.h +++ b/subsystems/ntvdm/emulator.h @@ -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 -- 2.17.1