/*
- * COPYRIGHT: GPL - See COPYING in the top level directory
- * PROJECT: 386/486 CPU Emulation Library
- * FILE: soft386.h
- * PURPOSE: Header file for Soft386.
- * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ * Soft386 386/486 CPU Emulation Library
+ * soft386.h
+ *
+ * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef _SOFT386_H_
/* DEFINES ********************************************************************/
-#define SOFT386_NUM_GEN_REGS 8
-#define SOFT386_NUM_SEG_REGS 6
-#define SOFT386_NUM_CTRL_REGS 8
-#define SOFT386_NUM_DBG_REGS 8
-
-#define SOFT386_CR0_PE (1 << 0)
-#define SOFT386_CR0_MP (1 << 1)
-#define SOFT386_CR0_EM (1 << 2)
-#define SOFT386_CR0_TS (1 << 3)
-#define SOFT386_CR0_ET (1 << 4)
-#define SOFT386_CR0_NE (1 << 5)
-#define SOFT386_CR0_WP (1 << 16)
-#define SOFT386_CR0_AM (1 << 18)
-#define SOFT386_CR0_NW (1 << 29)
-#define SOFT386_CR0_CD (1 << 30)
-#define SOFT386_CR0_PG (1 << 31)
-
-#define SOFT386_IDT_TASK_GATE 0x5
-#define SOFT386_IDT_INT_GATE 0x6
-#define SOFT386_IDT_TRAP_GATE 0x7
-#define SOFT386_IDT_INT_GATE_32 0xE
-#define SOFT386_IDT_TRAP_GATE_32 0xF
-
-#define SOFT386_PREFIX_SEG (1 << 0)
-#define SOFT386_PREFIX_OPSIZE (1 << 1)
-#define SOFT386_PREFIX_ADSIZE (1 << 2)
-#define SOFT386_PREFIX_LOCK (1 << 3)
-#define SOFT386_PREFIX_REPNZ (1 << 4)
-#define SOFT386_PREFIX_REP (1 << 5)
+#define SOFT386_NUM_GEN_REGS 8
+#define SOFT386_NUM_SEG_REGS 6
+#define SOFT386_NUM_CTRL_REGS 8
+#define SOFT386_NUM_DBG_REGS 8
+
+#define SOFT386_CR0_PE (1 << 0)
+#define SOFT386_CR0_MP (1 << 1)
+#define SOFT386_CR0_EM (1 << 2)
+#define SOFT386_CR0_TS (1 << 3)
+#define SOFT386_CR0_ET (1 << 4)
+#define SOFT386_CR0_NE (1 << 5)
+#define SOFT386_CR0_WP (1 << 16)
+#define SOFT386_CR0_AM (1 << 18)
+#define SOFT386_CR0_NW (1 << 29)
+#define SOFT386_CR0_CD (1 << 30)
+#define SOFT386_CR0_PG (1 << 31)
+
+#define SOFT386_IDT_TASK_GATE 0x5
+#define SOFT386_IDT_INT_GATE 0x6
+#define SOFT386_IDT_TRAP_GATE 0x7
+#define SOFT386_IDT_INT_GATE_32 0xE
+#define SOFT386_IDT_TRAP_GATE_32 0xF
+
+#define SOFT386_PREFIX_SEG (1 << 0)
+#define SOFT386_PREFIX_OPSIZE (1 << 1)
+#define SOFT386_PREFIX_ADSIZE (1 << 2)
+#define SOFT386_PREFIX_LOCK (1 << 3)
+#define SOFT386_PREFIX_REPNZ (1 << 4)
+#define SOFT386_PREFIX_REP (1 << 5)
struct _SOFT386_STATE;
typedef struct _SOFT386_STATE SOFT386_STATE, *PSOFT386_STATE;
-enum _SOFT386_GEN_REGS
+typedef enum _SOFT386_GEN_REGS
{
SOFT386_REG_EAX,
SOFT386_REG_ECX,
SOFT386_REG_EBP,
SOFT386_REG_ESI,
SOFT386_REG_EDI
-};
+} SOFT386_GEN_REGS, *PSOFT386_GEN_REGS;
-enum _SOFT386_SEG_REGS
+typedef enum _SOFT386_SEG_REGS
{
SOFT386_REG_ES,
SOFT386_REG_CS,
SOFT386_REG_DS,
SOFT386_REG_FS,
SOFT386_REG_GS
-};
+} SOFT386_SEG_REGS, *PSOFT386_SEG_REGS;
-enum _SOFT386_CTRL_REGS
+typedef enum _SOFT386_CTRL_REGS
{
SOFT386_REG_CR0,
SOFT386_REG_CR1,
SOFT386_REG_CR5,
SOFT386_REG_CR6,
SOFT386_REG_CR7
-};
+} SOFT386_CTRL_REGS, *PSOFT386_CTRL_REGS;
-enum _SOFT386_DBG_REGS
+typedef enum _SOFT386_DBG_REGS
{
SOFT386_REG_DR0,
SOFT386_REG_DR1,
SOFT386_REG_DR5,
SOFT386_REG_DR6,
SOFT386_REG_DR7
-};
+} SOFT386_DBG_REGS, *PSOFT386_DBG_REGS;
-enum _SOFT386_EXCEPTIONS
+typedef enum _SOFT386_EXCEPTIONS
{
SOFT386_EXCEPTION_DE = 0x00,
SOFT386_EXCEPTION_DB = 0x01,
SOFT386_EXCEPTION_MF = 0x10,
SOFT386_EXCEPTION_AC = 0x11,
SOFT386_EXCEPTION_MC = 0x12
-};
+} SOFT386_EXCEPTIONS, *PSOFT386_EXCEPTIONS;
typedef
BOOLEAN
PSOFT386_STATE State
);
+typedef
+VOID
+(NTAPI *SOFT386_BOP_PROC)
+(
+ PSOFT386_STATE State,
+ USHORT BopCode
+);
+
typedef union _SOFT386_REG
{
- struct
+ union
{
- UCHAR LowByte;
- UCHAR HighByte;
+ struct
+ {
+ UCHAR LowByte;
+ UCHAR HighByte;
+ };
+ USHORT LowWord;
};
- USHORT LowWord;
- ULONG Long;
+ ULONG Long;
} SOFT386_REG, *PSOFT386_REG;
typedef struct _SOFT386_SEG_REG
USHORT Selector;
/* Descriptor cache */
- ULONG Accessed : 1;
- ULONG ReadWrite : 1;
- ULONG DirConf : 1;
- ULONG Executable : 1;
- ULONG SystemType : 1;
- ULONG Dpl : 2;
- ULONG Present : 1;
- ULONG Size : 1;
+ ULONG Accessed : 1;
+ ULONG ReadWrite : 1;
+ ULONG DirConf : 1;
+ ULONG Executable : 1;
+ ULONG SystemType : 1;
+ ULONG Dpl : 2;
+ ULONG Present : 1;
+ ULONG Size : 1;
ULONG Limit;
ULONG Base;
} SOFT386_SEG_REG, *PSOFT386_SEG_REG;
typedef struct
{
- ULONG Limit : 16;
- ULONG Base : 24;
- ULONG Accessed : 1;
- ULONG ReadWrite : 1;
- ULONG DirConf : 1;
- ULONG Executable : 1;
- ULONG SystemType : 1;
- ULONG Dpl : 2;
- ULONG Present : 1;
- ULONG LimitHigh : 4;
- ULONG Avl : 1;
- ULONG Reserved : 1;
- ULONG Size : 1;
- ULONG Granularity : 1;
- ULONG BaseHigh : 8;
+ ULONG Limit : 16;
+ ULONG Base : 24;
+ ULONG Accessed : 1;
+ ULONG ReadWrite : 1;
+ ULONG DirConf : 1;
+ ULONG Executable : 1;
+ ULONG SystemType : 1;
+ ULONG Dpl : 2;
+ ULONG Present : 1;
+ ULONG LimitHigh : 4;
+ ULONG Avl : 1;
+ ULONG Reserved : 1;
+ ULONG Size : 1;
+ ULONG Granularity : 1;
+ ULONG BaseHigh : 8;
} SOFT386_GDT_ENTRY, *PSOFT386_GDT_ENTRY;
typedef struct
{
ULONG Offset : 16;
ULONG Selector : 16;
- ULONG Zero : 8;
+ ULONG ParamCount : 5;
+ ULONG Reserved : 3;
ULONG Type : 4;
- ULONG Storage : 1;
+ ULONG SystemType : 1;
ULONG Dpl : 2;
ULONG Present : 1;
ULONG OffsetHigh : 16;
+} SOFT386_CALL_GATE, *PSOFT386_CALL_GATE;
+
+typedef struct
+{
+ ULONG Offset : 16;
+ ULONG Selector : 16;
+ ULONG Zero : 8;
+ ULONG Type : 4;
+ ULONG Storage : 1;
+ ULONG Dpl : 2;
+ ULONG Present : 1;
+ ULONG OffsetHigh : 16;
} SOFT386_IDT_ENTRY, *PSOFT386_IDT_ENTRY;
typedef struct _SOFT386_TABLE_REG
typedef union _SOFT386_FLAGS_REG
{
+ USHORT LowWord;
ULONG Long;
+
struct
{
- ULONG Cf : 1;
+ ULONG Cf : 1;
ULONG AlwaysSet : 1;
- ULONG Pf : 1;
+ ULONG Pf : 1;
ULONG Reserved0 : 1;
- ULONG Af : 1;
+ ULONG Af : 1;
ULONG Reserved1 : 1;
- ULONG Zf : 1;
- ULONG Sf : 1;
- ULONG Tf : 1;
- ULONG If : 1;
- ULONG Df : 1;
- ULONG Of : 1;
- ULONG Iopl : 2;
- ULONG Nt : 1;
+ ULONG Zf : 1;
+ ULONG Sf : 1;
+ ULONG Tf : 1;
+ ULONG If : 1;
+ ULONG Df : 1;
+ ULONG Of : 1;
+ ULONG Iopl : 2;
+ ULONG Nt : 1;
ULONG Reserved2 : 1;
- ULONG Rf : 1;
- ULONG Vm : 1;
- ULONG Ac : 1;
- ULONG Vif : 1;
- ULONG Vip : 1;
- ULONG Id : 1;
+ ULONG Rf : 1;
+ ULONG Vm : 1;
+ ULONG Ac : 1;
+ ULONG Vif : 1;
+ ULONG Vip : 1;
+ ULONG Id : 1;
+
+ // ULONG Reserved : 10;
};
} SOFT386_FLAGS_REG, *PSOFT386_FLAGS_REG;
SOFT386_IO_READ_PROC IoReadCallback;
SOFT386_IO_WRITE_PROC IoWriteCallback;
SOFT386_IDLE_PROC IdleCallback;
+ SOFT386_BOP_PROC BopCallback;
SOFT386_REG GeneralRegs[SOFT386_NUM_GEN_REGS];
SOFT386_SEG_REG SegmentRegs[SOFT386_NUM_SEG_REGS];
- SOFT386_REG InstPtr;
+ SOFT386_REG InstPtr, SavedInstPtr;
SOFT386_FLAGS_REG Flags;
SOFT386_TABLE_REG Gdtr, Idtr, Ldtr, Tss;
ULONGLONG TimeStampCounter;
ULONG DebugRegisters[SOFT386_NUM_DBG_REGS];
ULONG ExceptionCount;
ULONG PrefixFlags;
- INT SegmentOverride;
+ SOFT386_SEG_REGS SegmentOverride;
BOOLEAN HardwareInt;
+ UCHAR PendingIntNum;
};
/* FUNCTIONS ******************************************************************/
NTAPI
Soft386Interrupt(PSOFT386_STATE State, UCHAR Number);
+VOID
+NTAPI
+Soft386ExecuteAt(PSOFT386_STATE State, USHORT Segment, ULONG Offset);
+
+VOID
+NTAPI
+Soft386SetStack(PSOFT386_STATE State, USHORT Segment, ULONG Offset);
+
+VOID
+NTAPI
+Soft386SetSegment
+(
+ PSOFT386_STATE State,
+ SOFT386_SEG_REGS Segment,
+ USHORT Selector
+);
+
#endif // _SOFT386_H_
/* EOF */