[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
This commit is contained in:
Hermès Bélusca-Maïto 2013-11-01 02:28:47 +00:00
parent 13b771ac15
commit 5c220ef022
5 changed files with 280 additions and 19 deletions

View file

@ -219,7 +219,7 @@ VOID
NTAPI NTAPI
Fast486Reset(PFAST486_STATE State) Fast486Reset(PFAST486_STATE State)
{ {
USHORT i; FAST486_SEG_REGS i;
FAST486_MEM_READ_PROC MemReadCallback = State->MemReadCallback; FAST486_MEM_READ_PROC MemReadCallback = State->MemReadCallback;
FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback; FAST486_MEM_WRITE_PROC MemWriteCallback = State->MemWriteCallback;

View file

@ -13,12 +13,12 @@
#include "emulator.h" #include "emulator.h"
#include "bios.h" #include "bios.h"
#include "bop.h"
#include "dos.h" #include "dos.h"
#include "vga.h" //#include "vga.h"
#include "pic.h" //#include "pic.h"
#include "ps2.h" //#include "ps2.h"
#include "timer.h" //#include "timer.h"
LPCWSTR ExceptionName[] = LPCWSTR ExceptionName[] =
{ {
@ -32,6 +32,266 @@ LPCWSTR ExceptionName[] =
L"FPU Not Available" 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) VOID WINAPI Exception(BYTE ExceptionNumber, LPWORD Stack)
{ {
WORD CodeSegment, InstructionPointer; WORD CodeSegment, InstructionPointer;

View file

@ -7,4 +7,10 @@
* Hermes Belusca-Maito (hermes.belusca@sfr.fr) * 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 */ /* EOF */

View file

@ -12,6 +12,7 @@
#include "emulator.h" #include "emulator.h"
#include "bios.h" #include "bios.h"
#include "bop.h"
#include "dos.h" #include "dos.h"
#include "vga.h" #include "vga.h"
#include "pic.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) static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode)
{ {
WORD StackSegment, StackPointer; WORD StackSegment, StackPointer;
@ -238,16 +238,10 @@ static VOID WINAPI EmulatorBiosOperation(PFAST486_STATE State, UCHAR BopCode)
/* Get the stack */ /* Get the stack */
Stack = (LPWORD)SEG_OFF_TO_PTR(StackSegment, StackPointer); Stack = (LPWORD)SEG_OFF_TO_PTR(StackSegment, StackPointer);
switch (BopCode) if (BopProc[BopCode] != NULL)
{ BopProc[BopCode](Stack);
case EMULATOR_INT_BOP: else
ControlBop(Stack); DPRINT1("Invalid BOP code %u\n", BopCode);
break;
default:
DPRINT1("Invalid BOP code %u\n", BopCode);
break;
}
} }
static UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State) static UCHAR WINAPI EmulatorIntAcknowledge(PFAST486_STATE State)

View file

@ -35,8 +35,9 @@
#define EMULATOR_FLAG_ID (1 << 21) #define EMULATOR_FLAG_ID (1 << 21)
/* Common definitions */ /* Common definitions */
#define EMULATOR_BOP 0xC4C4 #define EMULATOR_BOP 0xC4C4
#define EMULATOR_INT_BOP 0xFF #define EMULATOR_INT_BOP 0xFF
#define EMULATOR_MAX_BOP_NUM 0xFF + 1
#define STACK_COUNTER 0 #define STACK_COUNTER 0
#define STACK_INT_NUM 1 #define STACK_INT_NUM 1