[NTVDM]: We know that .h files are header files ;)
[reactos.git] / subsystems / ntvdm / emulator.h
index 64edd1f..7627d6e 100644 (file)
@@ -2,7 +2,7 @@
  * COPYRIGHT:       GPL - See COPYING in the top level directory
  * PROJECT:         ReactOS Virtual DOS Machine
  * FILE:            emulator.h
- * PURPOSE:         Minimal x86 machine emulator for the VDM (header file)
+ * PURPOSE:         Minimal x86 machine emulator for the VDM
  * PROGRAMMERS:     Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
  */
 
 /* INCLUDES *******************************************************************/
 
 #include "ntvdm.h"
-
-#ifndef NEW_EMULATOR
-#include <softx86/softx86.h>
-#include <softx86/softx87.h>
-#endif
+#include <fast486.h>
 
 /* 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
-#define STACK_IP 1
-#define STACK_CS 2
-#define STACK_FLAGS 3
+#define STACK_COUNTER   0
+#define STACK_INT_NUM   1
+#define STACK_IP        2
+#define STACK_CS        3
+#define STACK_FLAGS     4
 
 enum
 {
@@ -96,92 +59,37 @@ enum
     EMULATOR_EXCEPTION_PAGE_FAULT
 };
 
-enum
-{
-    EMULATOR_REG_AX,
-    EMULATOR_REG_CX,
-    EMULATOR_REG_DX,
-    EMULATOR_REG_BX,
-    EMULATOR_REG_SP,
-    EMULATOR_REG_BP,
-    EMULATOR_REG_SI,
-    EMULATOR_REG_DI,
-    EMULATOR_REG_ES,
-    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);
+extern FAST486_STATE EmulatorContext;
 
 /* FUNCTIONS ******************************************************************/
 
-BOOLEAN EmulatorInitialize();
-VOID EmulatorSetStack(WORD Segment, WORD Offset);
+VOID WINAPI EmulatorReadMemory
+(
+    PFAST486_STATE State,
+    ULONG Address,
+    PVOID Buffer,
+    ULONG Size
+);
+
+VOID WINAPI EmulatorWriteMemory
+(
+    PFAST486_STATE State,
+    ULONG Address,
+    PVOID Buffer,
+    ULONG Size
+);
+
+UCHAR WINAPI EmulatorIntAcknowledge
+(
+    PFAST486_STATE State
+);
+
+BOOLEAN EmulatorInitialize(VOID);
 VOID EmulatorExecute(WORD Segment, WORD Offset);
 VOID EmulatorInterrupt(BYTE Number);
-VOID EmulatorExternalInterrupt(BYTE Number);
-ULONG EmulatorGetRegister(ULONG Register);
-VOID EmulatorSetRegister(ULONG Register, ULONG Value);
-BOOLEAN EmulatorGetFlag(ULONG Flag);
-VOID EmulatorSetFlag(ULONG Flag);
-VOID EmulatorClearFlag(ULONG Flag);
-VOID EmulatorStep();
-VOID EmulatorCleanup();
+VOID EmulatorInterruptSignal(VOID);
+VOID EmulatorStep(VOID);
+VOID EmulatorCleanup(VOID);
 VOID EmulatorSetA20(BOOLEAN Enabled);
 
 #endif // _EMULATOR_H_