2 * Fast486 386/486 CPU Emulation Library
5 * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25 /* DEFINES ********************************************************************/
27 #define FAST486_NUM_GEN_REGS 8
28 #define FAST486_NUM_SEG_REGS 6
29 #define FAST486_NUM_CTRL_REGS 8
30 #define FAST486_NUM_DBG_REGS 8
32 #define FAST486_CR0_PE (1 << 0)
33 #define FAST486_CR0_MP (1 << 1)
34 #define FAST486_CR0_EM (1 << 2)
35 #define FAST486_CR0_TS (1 << 3)
36 #define FAST486_CR0_ET (1 << 4)
37 #define FAST486_CR0_NE (1 << 5)
38 #define FAST486_CR0_WP (1 << 16)
39 #define FAST486_CR0_AM (1 << 18)
40 #define FAST486_CR0_NW (1 << 29)
41 #define FAST486_CR0_CD (1 << 30)
42 #define FAST486_CR0_PG (1 << 31)
44 #define FAST486_IDT_TASK_GATE 0x5
45 #define FAST486_IDT_INT_GATE 0x6
46 #define FAST486_IDT_TRAP_GATE 0x7
47 #define FAST486_IDT_INT_GATE_32 0xE
48 #define FAST486_IDT_TRAP_GATE_32 0xF
50 #define FAST486_PREFIX_SEG (1 << 0)
51 #define FAST486_PREFIX_OPSIZE (1 << 1)
52 #define FAST486_PREFIX_ADSIZE (1 << 2)
53 #define FAST486_PREFIX_LOCK (1 << 3)
54 #define FAST486_PREFIX_REPNZ (1 << 4)
55 #define FAST486_PREFIX_REP (1 << 5)
57 struct _FAST486_STATE
;
58 typedef struct _FAST486_STATE FAST486_STATE
, *PFAST486_STATE
;
60 typedef enum _FAST486_GEN_REGS
70 } FAST486_GEN_REGS
, *PFAST486_GEN_REGS
;
72 typedef enum _FAST486_SEG_REGS
80 } FAST486_SEG_REGS
, *PFAST486_SEG_REGS
;
82 typedef enum _FAST486_CTRL_REGS
92 } FAST486_CTRL_REGS
, *PFAST486_CTRL_REGS
;
94 typedef enum _FAST486_DBG_REGS
104 } FAST486_DBG_REGS
, *PFAST486_DBG_REGS
;
106 typedef enum _FAST486_EXCEPTIONS
108 FAST486_EXCEPTION_DE
= 0x00,
109 FAST486_EXCEPTION_DB
= 0x01,
110 FAST486_EXCEPTION_BP
= 0x03,
111 FAST486_EXCEPTION_OF
= 0x04,
112 FAST486_EXCEPTION_BR
= 0x05,
113 FAST486_EXCEPTION_UD
= 0x06,
114 FAST486_EXCEPTION_NM
= 0x07,
115 FAST486_EXCEPTION_DF
= 0x08,
116 FAST486_EXCEPTION_TS
= 0x0A,
117 FAST486_EXCEPTION_NP
= 0x0B,
118 FAST486_EXCEPTION_SS
= 0x0C,
119 FAST486_EXCEPTION_GP
= 0x0D,
120 FAST486_EXCEPTION_PF
= 0x0E,
121 FAST486_EXCEPTION_MF
= 0x10,
122 FAST486_EXCEPTION_AC
= 0x11,
123 FAST486_EXCEPTION_MC
= 0x12
124 } FAST486_EXCEPTIONS
, *PFAST486_EXCEPTIONS
;
128 (NTAPI
*FAST486_MEM_READ_PROC
)
130 PFAST486_STATE State
,
138 (NTAPI
*FAST486_MEM_WRITE_PROC
)
140 PFAST486_STATE State
,
148 (NTAPI
*FAST486_IO_READ_PROC
)
150 PFAST486_STATE State
,
158 (NTAPI
*FAST486_IO_WRITE_PROC
)
160 PFAST486_STATE State
,
168 (NTAPI
*FAST486_IDLE_PROC
)
175 (NTAPI
*FAST486_BOP_PROC
)
177 PFAST486_STATE State
,
181 typedef union _FAST486_REG
193 } FAST486_REG
, *PFAST486_REG
;
195 typedef struct _FAST486_SEG_REG
199 /* Descriptor cache */
203 ULONG Executable
: 1;
204 ULONG SystemType
: 1;
210 } FAST486_SEG_REG
, *PFAST486_SEG_REG
;
219 ULONG Executable
: 1;
220 ULONG SystemType
: 1;
227 ULONG Granularity
: 1;
229 } FAST486_GDT_ENTRY
, *PFAST486_GDT_ENTRY
;
235 ULONG ParamCount
: 5;
238 ULONG SystemType
: 1;
241 ULONG OffsetHigh
: 16;
242 } FAST486_CALL_GATE
, *PFAST486_CALL_GATE
;
253 ULONG OffsetHigh
: 16;
254 } FAST486_IDT_ENTRY
, *PFAST486_IDT_ENTRY
;
256 typedef struct _FAST486_TABLE_REG
260 } FAST486_TABLE_REG
, *PFAST486_TABLE_REG
;
262 typedef union _FAST486_FLAGS_REG
291 // ULONG Reserved : 10;
293 } FAST486_FLAGS_REG
, *PFAST486_FLAGS_REG
;
295 typedef struct _FAST486_TSS
323 } FAST486_TSS
, *PFAST486_TSS
;
325 struct _FAST486_STATE
327 FAST486_MEM_READ_PROC MemReadCallback
;
328 FAST486_MEM_WRITE_PROC MemWriteCallback
;
329 FAST486_IO_READ_PROC IoReadCallback
;
330 FAST486_IO_WRITE_PROC IoWriteCallback
;
331 FAST486_IDLE_PROC IdleCallback
;
332 FAST486_BOP_PROC BopCallback
;
333 FAST486_REG GeneralRegs
[FAST486_NUM_GEN_REGS
];
334 FAST486_SEG_REG SegmentRegs
[FAST486_NUM_SEG_REGS
];
335 FAST486_REG InstPtr
, SavedInstPtr
;
336 FAST486_FLAGS_REG Flags
;
337 FAST486_TABLE_REG Gdtr
, Idtr
, Ldtr
, Tss
;
338 ULONG ControlRegisters
[FAST486_NUM_CTRL_REGS
];
339 ULONG DebugRegisters
[FAST486_NUM_DBG_REGS
];
340 ULONG ExceptionCount
;
342 FAST486_SEG_REGS SegmentOverride
;
347 /* FUNCTIONS ******************************************************************/
351 Fast486Continue(PFAST486_STATE State
);
355 Fast486StepInto(PFAST486_STATE State
);
359 Fast486StepOver(PFAST486_STATE State
);
363 Fast486StepOut(PFAST486_STATE State
);
367 Fast486DumpState(PFAST486_STATE State
);
371 Fast486Reset(PFAST486_STATE State
);
375 Fast486Interrupt(PFAST486_STATE State
, UCHAR Number
);
379 Fast486ExecuteAt(PFAST486_STATE State
, USHORT Segment
, ULONG Offset
);
383 Fast486SetStack(PFAST486_STATE State
, USHORT Segment
, ULONG Offset
);
389 PFAST486_STATE State
,
390 FAST486_SEG_REGS Segment
,
394 #endif // _FAST486_H_