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 ********************************************************************/
29 #define SIGN_FLAG_BYTE 0x80
30 #define SIGN_FLAG_WORD 0x8000
31 #define SIGN_FLAG_LONG 0x80000000
32 #define REAL_MODE_FLAGS_MASK 0x57FD5
33 #define PROT_MODE_FLAGS_MASK 0x50DD5
35 /* Block size for string operations */
36 #define STRING_BLOCK_SIZE 4096
38 #define GET_SEGMENT_RPL(s) ((s) & 3)
39 #define GET_SEGMENT_INDEX(s) ((s) & 0xFFF8)
40 #define SEGMENT_TABLE_INDICATOR (1 << 2)
41 #define EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14))
43 #define NO_LOCK_PREFIX()\
44 if (State->PrefixFlags & FAST486_PREFIX_LOCK)\
46 Fast486Exception(State, FAST486_EXCEPTION_UD);\
50 #define TOGGLE_OPSIZE(x)\
51 if (State->PrefixFlags & FAST486_PREFIX_OPSIZE) x = !x;
53 #define TOGGLE_ADSIZE(x)\
54 if (State->PrefixFlags & FAST486_PREFIX_ADSIZE) x = !x;
56 #define SWAP(x, y) { (x) ^= (y); (y) ^= (x); (x) ^= (y); }
58 #define ALIGNMENT_CHECK(x, a) if (State->Flags.Ac \
59 && (State->ControlRegisters[FAST486_REG_CR0] & FAST486_CR0_AM)\
61 && (((x) % (a)) != 0))\
63 Fast486Exception(State, FAST486_EXCEPTION_AC);\
67 #define PAGE_ALIGN(x) ((x) & 0xFFFFF000)
68 #define PAGE_OFFSET(x) ((x) & 0x00000FFF)
69 #define GET_ADDR_PDE(x) ((x) >> 22)
70 #define GET_ADDR_PTE(x) (((x) >> 12) & 0x3FF)
71 #define INVALID_TLB_FIELD 0xFFFFFFFF
74 #define PAGE_SIZE 4096
77 typedef struct _FAST486_MOD_REG_RM
79 FAST486_GEN_REGS Register
;
83 FAST486_GEN_REGS SecondRegister
;
86 } FAST486_MOD_REG_RM
, *PFAST486_MOD_REG_RM
;
90 typedef union _FAST486_PAGE_DIR
97 ULONG WriteThrough
: 1;
100 ULONG AlwaysZero
: 1;
103 ULONG TableAddress
: 20;
106 } FAST486_PAGE_DIR
, *PFAST486_PAGE_DIR
;
108 C_ASSERT(sizeof(FAST486_PAGE_DIR
) == sizeof(ULONG
));
110 typedef union _FAST486_PAGE_TABLE
117 ULONG WriteThrough
: 1;
121 ULONG AlwaysZero
: 1;
127 } FAST486_PAGE_TABLE
, *PFAST486_PAGE_TABLE
;
129 C_ASSERT(sizeof(FAST486_PAGE_DIR
) == sizeof(ULONG
));
133 /* FUNCTIONS ******************************************************************/
138 PFAST486_STATE State
,
139 FAST486_SEG_REGS SegmentReg
,
149 PFAST486_STATE State
,
150 FAST486_SEG_REGS SegmentReg
,
157 Fast486InterruptInternal
159 PFAST486_STATE State
,
160 USHORT SegmentSelector
,
167 Fast486ExceptionWithErrorCode
169 PFAST486_STATE State
,
170 FAST486_EXCEPTIONS ExceptionCode
,
174 /* INLINED FUNCTIONS **********************************************************/
176 #include "common.inl"