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.
27 /* DEFINES ********************************************************************/
30 #define FASTCALL __fastcall
33 #define FAST486_NUM_GEN_REGS 8
34 #define FAST486_NUM_SEG_REGS 6
35 #define FAST486_NUM_CTRL_REGS 3
36 #define FAST486_NUM_DBG_REGS 6
38 #define FAST486_CR0_PE (1 << 0)
39 #define FAST486_CR0_MP (1 << 1)
40 #define FAST486_CR0_EM (1 << 2)
41 #define FAST486_CR0_TS (1 << 3)
42 #define FAST486_CR0_ET (1 << 4)
43 #define FAST486_CR0_NE (1 << 5)
44 #define FAST486_CR0_WP (1 << 16)
45 #define FAST486_CR0_AM (1 << 18)
46 #define FAST486_CR0_NW (1 << 29)
47 #define FAST486_CR0_CD (1 << 30)
48 #define FAST486_CR0_PG (1 << 31)
50 #define FAST486_DR4_B0 (1 << 0)
51 #define FAST486_DR4_B1 (1 << 1)
52 #define FAST486_DR4_B2 (1 << 2)
53 #define FAST486_DR4_B3 (1 << 3)
54 #define FAST486_DR4_BD (1 << 13)
55 #define FAST486_DR4_BS (1 << 14)
56 #define FAST486_DR4_BT (1 << 15)
58 #define FAST486_DR5_L0 (1 << 0)
59 #define FAST486_DR5_G0 (1 << 1)
60 #define FAST486_DR5_L1 (1 << 2)
61 #define FAST486_DR5_G1 (1 << 3)
62 #define FAST486_DR5_L2 (1 << 4)
63 #define FAST486_DR5_G2 (1 << 5)
64 #define FAST486_DR5_L3 (1 << 6)
65 #define FAST486_DR5_G3 (1 << 7)
66 #define FAST486_DR5_LE (1 << 8)
67 #define FAST486_DR5_GE (1 << 9)
68 #define FAST486_DR5_GD (1 << 13)
70 #define FAST486_DBG_BREAK_EXEC 0
71 #define FAST486_DBG_BREAK_WRITE 1
72 #define FAST486_DBG_BREAK_READWRITE 3
74 #define FAST486_DR4_RESERVED 0xFFFF1FF0
75 #define FAST486_DR5_RESERVED 0x0000DC00
77 #define FAST486_IDT_TASK_GATE 0x5
78 #define FAST486_IDT_INT_GATE 0x6
79 #define FAST486_IDT_TRAP_GATE 0x7
80 #define FAST486_IDT_INT_GATE_32 0xE
81 #define FAST486_IDT_TRAP_GATE_32 0xF
83 #define FAST486_PREFIX_SEG (1 << 0)
84 #define FAST486_PREFIX_OPSIZE (1 << 1)
85 #define FAST486_PREFIX_ADSIZE (1 << 2)
86 #define FAST486_PREFIX_LOCK (1 << 3)
87 #define FAST486_PREFIX_REPNZ (1 << 4)
88 #define FAST486_PREFIX_REP (1 << 5)
90 struct _FAST486_STATE
;
91 typedef struct _FAST486_STATE FAST486_STATE
, *PFAST486_STATE
;
93 typedef enum _FAST486_GEN_REGS
103 } FAST486_GEN_REGS
, *PFAST486_GEN_REGS
;
105 typedef enum _FAST486_SEG_REGS
113 } FAST486_SEG_REGS
, *PFAST486_SEG_REGS
;
115 typedef enum _FAST486_CTRL_REGS
120 } FAST486_CTRL_REGS
, *PFAST486_CTRL_REGS
;
122 typedef enum _FAST486_DBG_REGS
130 FAST486_REG_DR6
= 4, // alias to DR4
131 FAST486_REG_DR7
= 5 // alias to DR5
132 } FAST486_DBG_REGS
, *PFAST486_DBG_REGS
;
134 typedef enum _FAST486_EXCEPTIONS
136 FAST486_EXCEPTION_DE
= 0x00,
137 FAST486_EXCEPTION_DB
= 0x01,
138 FAST486_EXCEPTION_BP
= 0x03,
139 FAST486_EXCEPTION_OF
= 0x04,
140 FAST486_EXCEPTION_BR
= 0x05,
141 FAST486_EXCEPTION_UD
= 0x06,
142 FAST486_EXCEPTION_NM
= 0x07,
143 FAST486_EXCEPTION_DF
= 0x08,
144 FAST486_EXCEPTION_TS
= 0x0A,
145 FAST486_EXCEPTION_NP
= 0x0B,
146 FAST486_EXCEPTION_SS
= 0x0C,
147 FAST486_EXCEPTION_GP
= 0x0D,
148 FAST486_EXCEPTION_PF
= 0x0E,
149 FAST486_EXCEPTION_MF
= 0x10,
150 FAST486_EXCEPTION_AC
= 0x11,
151 FAST486_EXCEPTION_MC
= 0x12
152 } FAST486_EXCEPTIONS
, *PFAST486_EXCEPTIONS
;
154 typedef enum _FAST486_INT_STATUS
156 FAST486_INT_NONE
= 0,
157 FAST486_INT_EXECUTE
= 1,
158 FAST486_INT_SIGNAL
= 2
159 } FAST486_INT_STATUS
, *PFAST486_INT_STATUS
;
163 (NTAPI
*FAST486_MEM_READ_PROC
)
165 PFAST486_STATE State
,
173 (NTAPI
*FAST486_MEM_WRITE_PROC
)
175 PFAST486_STATE State
,
183 (NTAPI
*FAST486_IO_READ_PROC
)
185 PFAST486_STATE State
,
194 (NTAPI
*FAST486_IO_WRITE_PROC
)
196 PFAST486_STATE State
,
205 (NTAPI
*FAST486_IDLE_PROC
)
212 (NTAPI
*FAST486_BOP_PROC
)
214 PFAST486_STATE State
,
220 (NTAPI
*FAST486_INT_ACK_PROC
)
225 typedef union _FAST486_REG
237 } FAST486_REG
, *PFAST486_REG
;
239 typedef struct _FAST486_SEG_REG
243 /* Descriptor cache */
247 ULONG Executable
: 1;
248 ULONG SystemType
: 1;
254 } FAST486_SEG_REG
, *PFAST486_SEG_REG
;
256 #pragma pack(push, 1)
266 ULONG Executable
: 1;
267 ULONG SystemType
: 1;
274 ULONG Granularity
: 1;
276 } FAST486_GDT_ENTRY
, *PFAST486_GDT_ENTRY
;
278 /* Verify the structure size */
279 C_ASSERT(sizeof(FAST486_GDT_ENTRY
) == sizeof(ULONGLONG
));
285 ULONG ParamCount
: 5;
288 ULONG SystemType
: 1;
291 ULONG OffsetHigh
: 16;
292 } FAST486_CALL_GATE
, *PFAST486_CALL_GATE
;
294 /* Verify the structure size */
295 C_ASSERT(sizeof(FAST486_CALL_GATE
) == sizeof(ULONGLONG
));
306 ULONG OffsetHigh
: 16;
307 } FAST486_IDT_ENTRY
, *PFAST486_IDT_ENTRY
;
309 /* Verify the structure size */
310 C_ASSERT(sizeof(FAST486_IDT_ENTRY
) == sizeof(ULONGLONG
));
314 typedef struct _FAST486_TABLE_REG
318 } FAST486_TABLE_REG
, *PFAST486_TABLE_REG
;
320 typedef union _FAST486_FLAGS_REG
349 // ULONG Reserved : 10;
351 } FAST486_FLAGS_REG
, *PFAST486_FLAGS_REG
;
353 typedef struct _FAST486_TSS
381 } FAST486_TSS
, *PFAST486_TSS
;
383 struct _FAST486_STATE
385 FAST486_MEM_READ_PROC MemReadCallback
;
386 FAST486_MEM_WRITE_PROC MemWriteCallback
;
387 FAST486_IO_READ_PROC IoReadCallback
;
388 FAST486_IO_WRITE_PROC IoWriteCallback
;
389 FAST486_IDLE_PROC IdleCallback
;
390 FAST486_BOP_PROC BopCallback
;
391 FAST486_INT_ACK_PROC IntAckCallback
;
392 FAST486_REG GeneralRegs
[FAST486_NUM_GEN_REGS
];
393 FAST486_SEG_REG SegmentRegs
[FAST486_NUM_SEG_REGS
];
394 FAST486_REG InstPtr
, SavedInstPtr
;
395 FAST486_FLAGS_REG Flags
;
396 FAST486_TABLE_REG Gdtr
, Idtr
, Ldtr
, Tss
;
397 ULONG ControlRegisters
[FAST486_NUM_CTRL_REGS
];
398 ULONG DebugRegisters
[FAST486_NUM_DBG_REGS
];
399 ULONG ExceptionCount
;
401 FAST486_SEG_REGS SegmentOverride
;
402 FAST486_INT_STATUS IntStatus
;
407 /* FUNCTIONS ******************************************************************/
411 Fast486Initialize(PFAST486_STATE State
,
412 FAST486_MEM_READ_PROC MemReadCallback
,
413 FAST486_MEM_WRITE_PROC MemWriteCallback
,
414 FAST486_IO_READ_PROC IoReadCallback
,
415 FAST486_IO_WRITE_PROC IoWriteCallback
,
416 FAST486_IDLE_PROC IdleCallback
,
417 FAST486_BOP_PROC BopCallback
,
418 FAST486_INT_ACK_PROC IntAckCallback
,
423 Fast486Reset(PFAST486_STATE State
);
427 Fast486Continue(PFAST486_STATE State
);
431 Fast486StepInto(PFAST486_STATE State
);
435 Fast486StepOver(PFAST486_STATE State
);
439 Fast486StepOut(PFAST486_STATE State
);
443 Fast486DumpState(PFAST486_STATE State
);
447 Fast486Interrupt(PFAST486_STATE State
, UCHAR Number
);
451 Fast486InterruptSignal(PFAST486_STATE State
);
455 Fast486ExecuteAt(PFAST486_STATE State
, USHORT Segment
, ULONG Offset
);
459 Fast486SetStack(PFAST486_STATE State
, USHORT Segment
, ULONG Offset
);
465 PFAST486_STATE State
,
466 FAST486_SEG_REGS Segment
,
470 #endif // _FAST486_H_