#include "ntvdm.h"
#ifndef NEW_EMULATOR
-#include <softx86/softx86.h>
-#include <softx86/softx87.h>
+#include <softx86.h>
+#include <softx87.h>
+#else
+#include <soft386.h>
#endif
/* DEFINES ********************************************************************/
#define EMULATOR_FLAG_VIP (1 << 20)
#define EMULATOR_FLAG_ID (1 << 21)
-/* CR0 */
-#define EMULATOR_CR0_PE (1 << 0)
-#define EMULATOR_CR0_MP (1 << 1)
-#define EMULATOR_CR0_EM (1 << 2)
-#define EMULATOR_CR0_TS (1 << 3)
-#define EMULATOR_CR0_ET (1 << 4)
-#define EMULATOR_CR0_NE (1 << 5)
-#define EMULATOR_CR0_WP (1 << 16)
-#define EMULATOR_CR0_AM (1 << 18)
-#define EMULATOR_CR0_NW (1 << 29)
-#define EMULATOR_CR0_CD (1 << 30)
-#define EMULATOR_CR0_PG (1 << 31)
-
-/* GDT Access byte */
-#define GDT_SEG_ACCESSED (1 << 0)
-#define GDT_DATA_WRITEABLE (1 << 1)
-#define GDT_CODE_READABLE (1 << 1)
-#define GDT_CONFORMING (1 << 2)
-#define GDT_DIRECTION (1 << 2)
-#define GDT_CODE_SEGMENT (1 << 3)
-#define GDT_PRESENT (1 << 7)
-
-/* GDT flags */
-#define GDT_32BIT_SEGMENT (1 << 2)
-#define GDT_PAGE_GRANULARITY (1 << 3)
-
/* Common definitions */
-#define EMULATOR_NUM_GENERAL_REGS 8
-#define EMULATOR_NUM_SEGMENT_REGS 6
-#define EMULATOR_NUM_CONTROL_REGS 8
-#define EMULATOR_NUM_DEBUG_REGS 8
-#define MAX_GDT_ENTRIES 8192
#define EMULATOR_BOP 0xC4C4
#define EMULATOR_INT_BOP 0xBEEF
#define STACK_INT_NUM 0
EMULATOR_REG_GS
};
-typedef union
-{
- struct
- {
- BYTE LowByte;
- BYTE HighByte;
- };
- WORD LowWord;
- DWORD Long;
-} EMULATOR_REGISTER, *PEMULATOR_REGISTER;
-
-typedef struct
-{
- ULONG Limit : 16;
- ULONG Base : 24;
- ULONG AccessByte : 8;
- ULONG LimitHigh : 4;
- ULONG Flags : 4;
- ULONG BaseHigh : 8;
-} EMULATOR_GDT_ENTRY;
-
-typedef struct
-{
- ULONG Offset : 16;
- ULONG Selector : 16;
- ULONG Zero : 8;
- ULONG TypeAndAttributes : 8;
- ULONG OffsetHigh : 16;
-} EMULATOR_IDT_ENTRY;
-
-typedef struct
-{
- WORD Size;
- DWORD Address;
-} EMULATOR_TABLE_REGISTER;
-
-typedef struct
-{
- EMULATOR_REGISTER Registers[EMULATOR_NUM_GENERAL_REGS
- + EMULATOR_NUM_SEGMENT_REGS];
- EMULATOR_REGISTER Flags;
- EMULATOR_REGISTER InstructionPointer;
- EMULATOR_REGISTER ControlRegisters[EMULATOR_NUM_CONTROL_REGS];
- EMULATOR_REGISTER DebugRegisters[EMULATOR_NUM_DEBUG_REGS];
- ULONGLONG TimeStampCounter;
- BOOLEAN OperandSizeOverload;
- BOOLEAN AddressSizeOverload;
- EMULATOR_TABLE_REGISTER Gdtr, Idtr;
- EMULATOR_GDT_ENTRY CachedDescriptors[EMULATOR_NUM_SEGMENT_REGS];
- UINT ExceptionCount;
-} EMULATOR_CONTEXT, *PEMULATOR_CONTEXT;
-
-typedef VOID (*EMULATOR_OPCODE_HANDLER)(PEMULATOR_CONTEXT Context, BYTE Opcode);
-
#ifndef NEW_EMULATOR
extern softx86_ctx EmulatorContext;
extern softx87_ctx FpuEmulatorContext;
#else
-extern EMULATOR_CONTEXT EmulatorContext;
+extern SOFT386_STATE EmulatorContext;
#endif
/* FUNCTIONS ******************************************************************/
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_AX].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_AX].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_AX].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_AX].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_AX].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_AX].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_AX].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_AX].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_AX].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_AX].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_AX].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_AX].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_AX].b.hi;
#else
- return EmulatorContext.Registers[EMULATOR_REG_AX].HighByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_AX].HighByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_AX].b.hi = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_AX].HighByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_AX].HighByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_AX].b.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_AX].LowByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_AX].LowByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_AX].b.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_AX].LowByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_AX].LowByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BX].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BX].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BX].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BX].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BX].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BX].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BX].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BX].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BX].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BX].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BX].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BX].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BX].b.hi;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BX].HighByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BX].HighByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BX].b.hi = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BX].HighByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BX].HighByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BX].b.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BX].LowByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BX].LowByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BX].b.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BX].LowByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BX].LowByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_CX].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_CX].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_CX].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_CX].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_CX].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_CX].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_CX].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_CX].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_CX].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_CX].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_CX].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_CX].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_CX].b.hi;
#else
- return EmulatorContext.Registers[EMULATOR_REG_CX].HighByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_CX].HighByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_CX].b.hi = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_CX].HighByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_CX].HighByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_CX].b.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_CX].LowByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_CX].LowByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_CX].b.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_CX].LowByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_CX].LowByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DX].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DX].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DX].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DX].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DX].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DX].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DX].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DX].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DX].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DX].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DX].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DX].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DX].b.hi;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DX].HighByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DX].HighByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DX].b.hi = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DX].HighByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DX].HighByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DX].b.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DX].LowByte;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DX].LowByte;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DX].b.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DX].LowByte = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DX].LowByte = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BP].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BP].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BP].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BP].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BP].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BP].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_BP].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_BP].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_BP].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_BP].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_BP].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_BP].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_SI].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_SI].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_SI].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_SI].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_SI].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_SI].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_SI].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_SI].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_SI].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_SI].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_SI].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_SI].LowWord = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DI].val;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DI].Long;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DI].Long;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DI].val = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DI].Long = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DI].Long = Value;
#endif
}
#ifndef NEW_EMULATOR
return EmulatorContext.state->general_reg[EMULATOR_REG_DI].w.lo;
#else
- return EmulatorContext.Registers[EMULATOR_REG_DI].LowWord;
+ return EmulatorContext.GeneralRegs[EMULATOR_REG_DI].LowWord;
#endif
}
#ifndef NEW_EMULATOR
EmulatorContext.state->general_reg[EMULATOR_REG_DI].w.lo = Value;
#else
- EmulatorContext.Registers[EMULATOR_REG_DI].LowWord = Value;
+ EmulatorContext.GeneralRegs[EMULATOR_REG_DI].LowWord = Value;
#endif
}