[SOFT386]
[reactos.git] / lib / soft386 / common.h
1 /*
2 * COPYRIGHT: GPL - See COPYING in the top level directory
3 * PROJECT: 386/486 CPU Emulation Library
4 * FILE: common.h
5 * PURPOSE: Common functions used internally by Soft386 (header file).
6 * PROGRAMMERS: Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
7 */
8
9 #ifndef _COMMON_H_
10 #define _COMMON_H_
11
12 /* DEFINES ********************************************************************/
13
14 #ifndef FASTCALL
15 #define FASTCALL __fastcall
16 #endif
17
18 #define SIGN_FLAG_BYTE 0x80
19 #define SIGN_FLAG_WORD 0x8000
20 #define SIGN_FLAG_LONG 0x80000000
21
22 #define GET_SEGMENT_RPL(s) ((s) & 3)
23 #define GET_SEGMENT_INDEX(s) ((s) & 0xFFF8)
24 #define EXCEPTION_HAS_ERROR_CODE(x) (((x) == 8) || ((x) >= 10 && (x) <= 14))
25
26 #define PAGE_ALIGN(x) ((x) & 0xFFFFF000)
27 #define PAGE_OFFSET(x) ((x) & 0x00000FFF)
28
29 #ifndef PAGE_SIZE
30 #define PAGE_SIZE 4096
31 #endif
32
33 typedef struct _SOFT386_MOD_REG_RM
34 {
35 INT Register;
36 BOOLEAN Memory;
37 union
38 {
39 INT SecondRegister;
40 ULONG MemoryAddress;
41 };
42 } SOFT386_MOD_REG_RM, *PSOFT386_MOD_REG_RM;
43
44 #pragma pack(push, 1)
45
46 typedef union _SOFT386_PAGE_DIR
47 {
48 struct
49 {
50 ULONG Present : 1;
51 ULONG Writeable : 1;
52 ULONG Usermode : 1;
53 ULONG WriteThrough : 1;
54 ULONG NoCache : 1;
55 ULONG Accessed : 1;
56 ULONG AlwaysZero : 1;
57 ULONG Size : 1;
58 ULONG Unused : 4;
59 ULONG TableAddress : 20;
60 };
61 ULONG Value;
62 } SOFT386_PAGE_DIR, *PSOFT386_PAGE_DIR;
63
64 typedef union _SOFT386_PAGE_TABLE
65 {
66 struct
67 {
68 ULONG Present : 1;
69 ULONG Writeable : 1;
70 ULONG Usermode : 1;
71 ULONG WriteThrough : 1;
72 ULONG NoCache : 1;
73 ULONG Accessed : 1;
74 ULONG Dirty : 1;
75 ULONG AlwaysZero : 1;
76 ULONG Global : 1;
77 ULONG Unused : 3;
78 ULONG Address : 20;
79 };
80 ULONG Value;
81 } SOFT386_PAGE_TABLE, *PSOFT386_PAGE_TABLE;
82
83 #pragma pack(pop)
84
85 /* FUNCTIONS ******************************************************************/
86
87 inline
88 BOOLEAN
89 Soft386ReadMemory
90 (
91 PSOFT386_STATE State,
92 INT SegmentReg,
93 ULONG Offset,
94 BOOLEAN InstFetch,
95 PVOID Buffer,
96 ULONG Size
97 );
98
99 inline
100 BOOLEAN
101 Soft386WriteMemory
102 (
103 PSOFT386_STATE State,
104 INT SegmentReg,
105 ULONG Offset,
106 PVOID Buffer,
107 ULONG Size
108 );
109
110 inline
111 BOOLEAN
112 Soft386StackPush
113 (
114 PSOFT386_STATE State,
115 ULONG Value
116 );
117
118 inline
119 BOOLEAN
120 Soft386StackPop
121 (
122 PSOFT386_STATE State,
123 PULONG Value
124 );
125
126 inline
127 BOOLEAN
128 Soft386LoadSegment
129 (
130 PSOFT386_STATE State,
131 INT Segment,
132 USHORT Selector
133 );
134
135 inline
136 BOOLEAN
137 Soft386FetchByte
138 (
139 PSOFT386_STATE State,
140 PUCHAR Data
141 );
142
143 inline
144 BOOLEAN
145 Soft386FetchWord
146 (
147 PSOFT386_STATE State,
148 PUSHORT Data
149 );
150
151 inline
152 BOOLEAN
153 Soft386FetchDword
154 (
155 PSOFT386_STATE State,
156 PULONG Data
157 );
158
159 inline
160 BOOLEAN
161 Soft386InterruptInternal
162 (
163 PSOFT386_STATE State,
164 USHORT SegmentSelector,
165 ULONG Offset,
166 BOOLEAN InterruptGate
167 );
168
169 inline
170 BOOLEAN
171 Soft386GetIntVector
172 (
173 PSOFT386_STATE State,
174 UCHAR Number,
175 PSOFT386_IDT_ENTRY IdtEntry
176 );
177
178 VOID
179 FASTCALL
180 Soft386ExceptionWithErrorCode
181 (
182 PSOFT386_STATE State,
183 INT ExceptionCode,
184 ULONG ErrorCode
185 );
186
187 inline
188 VOID
189 Soft386Exception
190 (
191 PSOFT386_STATE State,
192 INT ExceptionCode
193 );
194
195 inline
196 BOOLEAN
197 Soft386CalculateParity
198 (
199 UCHAR Number
200 );
201
202 inline
203 BOOLEAN
204 Soft386ParseModRegRm
205 (
206 PSOFT386_STATE State,
207 BOOLEAN AddressSize,
208 PSOFT386_MOD_REG_RM ModRegRm
209 );
210
211 inline
212 BOOLEAN
213 Soft386ReadModrmByteOperands
214 (
215 PSOFT386_STATE State,
216 PSOFT386_MOD_REG_RM ModRegRm,
217 PUCHAR RegValue,
218 PUCHAR RmValue
219 );
220
221 inline
222 BOOLEAN
223 Soft386ReadModrmWordOperands
224 (
225 PSOFT386_STATE State,
226 PSOFT386_MOD_REG_RM ModRegRm,
227 PUSHORT RegValue,
228 PUSHORT RmValue
229 );
230
231 inline
232 BOOLEAN
233 Soft386ReadModrmDwordOperands
234 (
235 PSOFT386_STATE State,
236 PSOFT386_MOD_REG_RM ModRegRm,
237 PULONG RegValue,
238 PULONG RmValue
239 );
240
241 inline
242 BOOLEAN
243 Soft386WriteModrmByteOperands
244 (
245 PSOFT386_STATE State,
246 PSOFT386_MOD_REG_RM ModRegRm,
247 BOOLEAN WriteRegister,
248 UCHAR Value
249 );
250
251 inline
252 BOOLEAN
253 Soft386WriteModrmWordOperands
254 (
255 PSOFT386_STATE State,
256 PSOFT386_MOD_REG_RM ModRegRm,
257 BOOLEAN WriteRegister,
258 USHORT Value
259 );
260
261 inline
262 BOOLEAN
263 Soft386WriteModrmDwordOperands
264 (
265 PSOFT386_STATE State,
266 PSOFT386_MOD_REG_RM ModRegRm,
267 BOOLEAN WriteRegister,
268 ULONG Value
269 );
270
271 #endif // _COMMON_H_
272
273 /* EOF */