[NTVDM]
[reactos.git] / subsystems / ntvdm / emulator.h
index 8a24d3a..f1a6256 100644 (file)
 /* INCLUDES *******************************************************************/
 
 #include "ntvdm.h"
+
+#ifndef NEW_EMULATOR
 #include <softx86/softx86.h>
 #include <softx86/softx87.h>
+#endif
 
 /* DEFINES ********************************************************************/
 
+/* FLAGS */
 #define EMULATOR_FLAG_CF (1 << 0)
 #define EMULATOR_FLAG_PF (1 << 2)
 #define EMULATOR_FLAG_AF (1 << 4)
 #define EMULATOR_FLAG_VIF (1 << 19)
 #define EMULATOR_FLAG_VIP (1 << 20)
 #define EMULATOR_FLAG_ID (1 << 21)
-#define SPECIAL_INT_NUM 0xFF
+
+/* 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
 
 enum
 {
@@ -44,7 +82,14 @@ enum
     EMULATOR_EXCEPTION_OVERFLOW,
     EMULATOR_EXCEPTION_BOUND,
     EMULATOR_EXCEPTION_INVALID_OPCODE,
-    EMULATOR_EXCEPTION_NO_FPU
+    EMULATOR_EXCEPTION_NO_FPU,
+    EMULATOR_EXCEPTION_DOUBLE_FAULT,
+    EMULATOR_EXCEPTION_FPU_SEGMENT,
+    EMULATOR_EXCEPTION_INVALID_TSS,
+    EMULATOR_EXCEPTION_NO_SEGMENT,
+    EMULATOR_EXCEPTION_STACK_SEGMENT,
+    EMULATOR_EXCEPTION_GPF,
+    EMULATOR_EXCEPTION_PAGE_FAULT
 };
 
 enum
@@ -61,8 +106,64 @@ enum
     EMULATOR_REG_CS,
     EMULATOR_REG_SS,
     EMULATOR_REG_DS,
+    EMULATOR_REG_FS,
+    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);
+
 /* FUNCTIONS ******************************************************************/
 
 BOOLEAN EmulatorInitialize();