2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: 386/486 CPU Emulation Library
5 * PURPOSE: Header file for Soft386.
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
12 /* DEFINES ********************************************************************/
14 #define SOFT386_NUM_GEN_REGS 8
15 #define SOFT386_NUM_SEG_REGS 6
16 #define SOFT386_NUM_CTRL_REGS 8
17 #define SOFT386_NUM_DBG_REGS 8
19 #define SOFT386_CR0_PE (1 << 0)
20 #define SOFT386_CR0_MP (1 << 1)
21 #define SOFT386_CR0_EM (1 << 2)
22 #define SOFT386_CR0_TS (1 << 3)
23 #define SOFT386_CR0_ET (1 << 4)
24 #define SOFT386_CR0_NE (1 << 5)
25 #define SOFT386_CR0_WP (1 << 16)
26 #define SOFT386_CR0_AM (1 << 18)
27 #define SOFT386_CR0_NW (1 << 29)
28 #define SOFT386_CR0_CD (1 << 30)
29 #define SOFT386_CR0_PG (1 << 31)
31 #define SOFT386_IDT_TASK_GATE 0x5
32 #define SOFT386_IDT_INT_GATE 0x6
33 #define SOFT386_IDT_TRAP_GATE 0x7
34 #define SOFT386_IDT_INT_GATE_32 0xE
35 #define SOFT386_IDT_TRAP_GATE_32 0xF
37 #define SOFT386_PREFIX_SEG (1 << 0)
38 #define SOFT386_PREFIX_OPSIZE (1 << 1)
39 #define SOFT386_PREFIX_ADSIZE (1 << 2)
40 #define SOFT386_PREFIX_LOCK (1 << 3)
41 #define SOFT386_PREFIX_REPNZ (1 << 4)
42 #define SOFT386_PREFIX_REP (1 << 5)
44 struct _SOFT386_STATE
;
45 typedef struct _SOFT386_STATE SOFT386_STATE
, *PSOFT386_STATE
;
47 typedef enum _SOFT386_GEN_REGS
57 } SOFT386_GEN_REGS
, *PSOFT386_GEN_REGS
;
59 typedef enum _SOFT386_SEG_REGS
67 } SOFT386_SEG_REGS
, *PSOFT386_SEG_REGS
;
69 typedef enum _SOFT386_CTRL_REGS
79 } SOFT386_CTRL_REGS
, *PSOFT386_CTRL_REGS
;
81 typedef enum _SOFT386_DBG_REGS
91 } SOFT386_DBG_REGS
, *PSOFT386_DBG_REGS
;
93 typedef enum _SOFT386_EXCEPTIONS
95 SOFT386_EXCEPTION_DE
= 0x00,
96 SOFT386_EXCEPTION_DB
= 0x01,
97 SOFT386_EXCEPTION_BP
= 0x03,
98 SOFT386_EXCEPTION_OF
= 0x04,
99 SOFT386_EXCEPTION_BR
= 0x05,
100 SOFT386_EXCEPTION_UD
= 0x06,
101 SOFT386_EXCEPTION_NM
= 0x07,
102 SOFT386_EXCEPTION_DF
= 0x08,
103 SOFT386_EXCEPTION_TS
= 0x0A,
104 SOFT386_EXCEPTION_NP
= 0x0B,
105 SOFT386_EXCEPTION_SS
= 0x0C,
106 SOFT386_EXCEPTION_GP
= 0x0D,
107 SOFT386_EXCEPTION_PF
= 0x0E,
108 SOFT386_EXCEPTION_MF
= 0x10,
109 SOFT386_EXCEPTION_AC
= 0x11,
110 SOFT386_EXCEPTION_MC
= 0x12
111 } SOFT386_EXCEPTIONS
, *PSOFT386_EXCEPTIONS
;
115 (NTAPI
*SOFT386_MEM_READ_PROC
)
117 PSOFT386_STATE State
,
125 (NTAPI
*SOFT386_MEM_WRITE_PROC
)
127 PSOFT386_STATE State
,
135 (NTAPI
*SOFT386_IO_READ_PROC
)
137 PSOFT386_STATE State
,
145 (NTAPI
*SOFT386_IO_WRITE_PROC
)
147 PSOFT386_STATE State
,
155 (NTAPI
*SOFT386_IDLE_PROC
)
160 typedef union _SOFT386_REG
172 } SOFT386_REG
, *PSOFT386_REG
;
174 typedef struct _SOFT386_SEG_REG
178 /* Descriptor cache */
182 ULONG Executable
: 1;
183 ULONG SystemType
: 1;
189 } SOFT386_SEG_REG
, *PSOFT386_SEG_REG
;
198 ULONG Executable
: 1;
199 ULONG SystemType
: 1;
206 ULONG Granularity
: 1;
208 } SOFT386_GDT_ENTRY
, *PSOFT386_GDT_ENTRY
;
219 ULONG OffsetHigh
: 16;
220 } SOFT386_IDT_ENTRY
, *PSOFT386_IDT_ENTRY
;
222 typedef struct _SOFT386_TABLE_REG
226 } SOFT386_TABLE_REG
, *PSOFT386_TABLE_REG
;
228 typedef union _SOFT386_FLAGS_REG
255 // ULONG Reserved : 10;
257 } SOFT386_FLAGS_REG
, *PSOFT386_FLAGS_REG
;
259 typedef struct _SOFT386_TSS
287 } SOFT386_TSS
, *PSOFT386_TSS
;
289 struct _SOFT386_STATE
291 SOFT386_MEM_READ_PROC MemReadCallback
;
292 SOFT386_MEM_WRITE_PROC MemWriteCallback
;
293 SOFT386_IO_READ_PROC IoReadCallback
;
294 SOFT386_IO_WRITE_PROC IoWriteCallback
;
295 SOFT386_IDLE_PROC IdleCallback
;
296 SOFT386_REG GeneralRegs
[SOFT386_NUM_GEN_REGS
];
297 SOFT386_SEG_REG SegmentRegs
[SOFT386_NUM_SEG_REGS
];
299 SOFT386_FLAGS_REG Flags
;
300 SOFT386_TABLE_REG Gdtr
, Idtr
, Ldtr
, Tss
;
301 ULONGLONG TimeStampCounter
;
302 ULONG ControlRegisters
[SOFT386_NUM_CTRL_REGS
];
303 ULONG DebugRegisters
[SOFT386_NUM_DBG_REGS
];
304 ULONG ExceptionCount
;
306 SOFT386_SEG_REGS SegmentOverride
;
310 /* FUNCTIONS ******************************************************************/
314 Soft386Continue(PSOFT386_STATE State
);
318 Soft386StepInto(PSOFT386_STATE State
);
322 Soft386StepOver(PSOFT386_STATE State
);
326 Soft386StepOut(PSOFT386_STATE State
);
330 Soft386DumpState(PSOFT386_STATE State
);
334 Soft386Reset(PSOFT386_STATE State
);
338 Soft386Interrupt(PSOFT386_STATE State
, UCHAR Number
);
342 Soft386ExecuteAt(PSOFT386_STATE State
, USHORT Segment
, ULONG Offset
);
344 #endif // _SOFT386_H_