[SOFT386]
[reactos.git] / lib / soft386 / extraops.c
1 /*
2 * Soft386 386/486 CPU Emulation Library
3 * extraops.c
4 *
5 * Copyright (C) 2013 Aleksandar Andrejevic <theflash AT sdf DOT lonestar DOT org>
6 *
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.
11 *
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.
16 *
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.
20 */
21
22 /* INCLUDES *******************************************************************/
23
24 // #define WIN32_NO_STATUS
25 // #define _INC_WINDOWS
26 #include <windef.h>
27
28 // #define NDEBUG
29 #include <debug.h>
30
31 #include <soft386.h>
32 #include "opcodes.h"
33 #include "common.h"
34
35 /* PUBLIC VARIABLES ***********************************************************/
36
37 SOFT386_OPCODE_HANDLER_PROC
38 Soft386ExtendedHandlers[SOFT386_NUM_OPCODE_HANDLERS] =
39 {
40 NULL, // TODO: NOT IMPLEMENTED
41 NULL, // TODO: NOT IMPLEMENTED
42 NULL, // TODO: NOT IMPLEMENTED
43 NULL, // TODO: NOT IMPLEMENTED
44 NULL, // TODO: NOT IMPLEMENTED
45 NULL, // TODO: NOT IMPLEMENTED
46 NULL, // TODO: NOT IMPLEMENTED
47 NULL, // TODO: NOT IMPLEMENTED
48 NULL, // TODO: NOT IMPLEMENTED
49 NULL, // TODO: NOT IMPLEMENTED
50 NULL, // TODO: NOT IMPLEMENTED
51 NULL, // TODO: NOT IMPLEMENTED
52 NULL, // TODO: NOT IMPLEMENTED
53 NULL, // TODO: NOT IMPLEMENTED
54 NULL, // TODO: NOT IMPLEMENTED
55 NULL, // TODO: NOT IMPLEMENTED
56 NULL, // TODO: NOT IMPLEMENTED
57 NULL, // TODO: NOT IMPLEMENTED
58 NULL, // TODO: NOT IMPLEMENTED
59 NULL, // TODO: NOT IMPLEMENTED
60 NULL, // TODO: NOT IMPLEMENTED
61 NULL, // TODO: NOT IMPLEMENTED
62 NULL, // TODO: NOT IMPLEMENTED
63 NULL, // TODO: NOT IMPLEMENTED
64 NULL, // TODO: NOT IMPLEMENTED
65 NULL, // TODO: NOT IMPLEMENTED
66 NULL, // TODO: NOT IMPLEMENTED
67 NULL, // TODO: NOT IMPLEMENTED
68 NULL, // TODO: NOT IMPLEMENTED
69 NULL, // TODO: NOT IMPLEMENTED
70 NULL, // TODO: NOT IMPLEMENTED
71 NULL, // TODO: NOT IMPLEMENTED
72 NULL, // TODO: NOT IMPLEMENTED
73 NULL, // TODO: NOT IMPLEMENTED
74 NULL, // TODO: NOT IMPLEMENTED
75 NULL, // TODO: NOT IMPLEMENTED
76 NULL, // TODO: NOT IMPLEMENTED
77 NULL, // TODO: NOT IMPLEMENTED
78 NULL, // TODO: NOT IMPLEMENTED
79 NULL, // TODO: NOT IMPLEMENTED
80 NULL, // TODO: NOT IMPLEMENTED
81 NULL, // TODO: NOT IMPLEMENTED
82 NULL, // TODO: NOT IMPLEMENTED
83 NULL, // TODO: NOT IMPLEMENTED
84 NULL, // TODO: NOT IMPLEMENTED
85 NULL, // TODO: NOT IMPLEMENTED
86 NULL, // TODO: NOT IMPLEMENTED
87 NULL, // TODO: NOT IMPLEMENTED
88 NULL, // TODO: NOT IMPLEMENTED
89 NULL, // TODO: NOT IMPLEMENTED
90 NULL, // TODO: NOT IMPLEMENTED
91 NULL, // TODO: NOT IMPLEMENTED
92 NULL, // TODO: NOT IMPLEMENTED
93 NULL, // TODO: NOT IMPLEMENTED
94 NULL, // TODO: NOT IMPLEMENTED
95 NULL, // TODO: NOT IMPLEMENTED
96 NULL, // TODO: NOT IMPLEMENTED
97 NULL, // TODO: NOT IMPLEMENTED
98 NULL, // TODO: NOT IMPLEMENTED
99 NULL, // TODO: NOT IMPLEMENTED
100 NULL, // TODO: NOT IMPLEMENTED
101 NULL, // TODO: NOT IMPLEMENTED
102 NULL, // TODO: NOT IMPLEMENTED
103 NULL, // TODO: NOT IMPLEMENTED
104 NULL, // TODO: NOT IMPLEMENTED
105 NULL, // TODO: NOT IMPLEMENTED
106 NULL, // TODO: NOT IMPLEMENTED
107 NULL, // TODO: NOT IMPLEMENTED
108 NULL, // TODO: NOT IMPLEMENTED
109 NULL, // TODO: NOT IMPLEMENTED
110 NULL, // TODO: NOT IMPLEMENTED
111 NULL, // TODO: NOT IMPLEMENTED
112 NULL, // TODO: NOT IMPLEMENTED
113 NULL, // TODO: NOT IMPLEMENTED
114 NULL, // TODO: NOT IMPLEMENTED
115 NULL, // TODO: NOT IMPLEMENTED
116 NULL, // TODO: NOT IMPLEMENTED
117 NULL, // TODO: NOT IMPLEMENTED
118 NULL, // TODO: NOT IMPLEMENTED
119 NULL, // TODO: NOT IMPLEMENTED
120 NULL, // TODO: NOT IMPLEMENTED
121 NULL, // TODO: NOT IMPLEMENTED
122 NULL, // TODO: NOT IMPLEMENTED
123 NULL, // TODO: NOT IMPLEMENTED
124 NULL, // TODO: NOT IMPLEMENTED
125 NULL, // TODO: NOT IMPLEMENTED
126 NULL, // TODO: NOT IMPLEMENTED
127 NULL, // TODO: NOT IMPLEMENTED
128 NULL, // TODO: NOT IMPLEMENTED
129 NULL, // TODO: NOT IMPLEMENTED
130 NULL, // TODO: NOT IMPLEMENTED
131 NULL, // TODO: NOT IMPLEMENTED
132 NULL, // TODO: NOT IMPLEMENTED
133 NULL, // TODO: NOT IMPLEMENTED
134 NULL, // TODO: NOT IMPLEMENTED
135 NULL, // TODO: NOT IMPLEMENTED
136 NULL, // TODO: NOT IMPLEMENTED
137 NULL, // TODO: NOT IMPLEMENTED
138 NULL, // TODO: NOT IMPLEMENTED
139 NULL, // TODO: NOT IMPLEMENTED
140 NULL, // TODO: NOT IMPLEMENTED
141 NULL, // TODO: NOT IMPLEMENTED
142 NULL, // TODO: NOT IMPLEMENTED
143 NULL, // TODO: NOT IMPLEMENTED
144 NULL, // TODO: NOT IMPLEMENTED
145 NULL, // TODO: NOT IMPLEMENTED
146 NULL, // TODO: NOT IMPLEMENTED
147 NULL, // TODO: NOT IMPLEMENTED
148 NULL, // TODO: NOT IMPLEMENTED
149 NULL, // TODO: NOT IMPLEMENTED
150 NULL, // TODO: NOT IMPLEMENTED
151 NULL, // TODO: NOT IMPLEMENTED
152 NULL, // TODO: NOT IMPLEMENTED
153 NULL, // TODO: NOT IMPLEMENTED
154 NULL, // TODO: NOT IMPLEMENTED
155 NULL, // TODO: NOT IMPLEMENTED
156 NULL, // TODO: NOT IMPLEMENTED
157 NULL, // TODO: NOT IMPLEMENTED
158 NULL, // TODO: NOT IMPLEMENTED
159 NULL, // TODO: NOT IMPLEMENTED
160 NULL, // TODO: NOT IMPLEMENTED
161 NULL, // TODO: NOT IMPLEMENTED
162 NULL, // TODO: NOT IMPLEMENTED
163 NULL, // TODO: NOT IMPLEMENTED
164 NULL, // TODO: NOT IMPLEMENTED
165 NULL, // TODO: NOT IMPLEMENTED
166 NULL, // TODO: NOT IMPLEMENTED
167 NULL, // TODO: NOT IMPLEMENTED
168 NULL, // TODO: NOT IMPLEMENTED
169 NULL, // TODO: NOT IMPLEMENTED
170 NULL, // TODO: NOT IMPLEMENTED
171 NULL, // TODO: NOT IMPLEMENTED
172 NULL, // TODO: NOT IMPLEMENTED
173 NULL, // TODO: NOT IMPLEMENTED
174 NULL, // TODO: NOT IMPLEMENTED
175 NULL, // TODO: NOT IMPLEMENTED
176 NULL, // TODO: NOT IMPLEMENTED
177 NULL, // TODO: NOT IMPLEMENTED
178 NULL, // TODO: NOT IMPLEMENTED
179 NULL, // TODO: NOT IMPLEMENTED
180 NULL, // TODO: NOT IMPLEMENTED
181 NULL, // TODO: NOT IMPLEMENTED
182 NULL, // TODO: NOT IMPLEMENTED
183 NULL, // TODO: NOT IMPLEMENTED
184 NULL, // TODO: NOT IMPLEMENTED
185 NULL, // TODO: NOT IMPLEMENTED
186 NULL, // TODO: NOT IMPLEMENTED
187 NULL, // TODO: NOT IMPLEMENTED
188 NULL, // TODO: NOT IMPLEMENTED
189 NULL, // TODO: NOT IMPLEMENTED
190 NULL, // TODO: NOT IMPLEMENTED
191 NULL, // TODO: NOT IMPLEMENTED
192 NULL, // TODO: NOT IMPLEMENTED
193 NULL, // TODO: NOT IMPLEMENTED
194 NULL, // TODO: NOT IMPLEMENTED
195 NULL, // TODO: NOT IMPLEMENTED
196 NULL, // TODO: NOT IMPLEMENTED
197 NULL, // TODO: NOT IMPLEMENTED
198 NULL, // TODO: NOT IMPLEMENTED
199 NULL, // TODO: NOT IMPLEMENTED
200 NULL, // TODO: NOT IMPLEMENTED
201 NULL, // TODO: NOT IMPLEMENTED
202 NULL, // TODO: NOT IMPLEMENTED
203 NULL, // TODO: NOT IMPLEMENTED
204 NULL, // TODO: NOT IMPLEMENTED
205 NULL, // TODO: NOT IMPLEMENTED
206 NULL, // TODO: NOT IMPLEMENTED
207 NULL, // TODO: NOT IMPLEMENTED
208 NULL, // TODO: NOT IMPLEMENTED
209 NULL, // TODO: NOT IMPLEMENTED
210 NULL, // TODO: NOT IMPLEMENTED
211 NULL, // TODO: NOT IMPLEMENTED
212 NULL, // TODO: NOT IMPLEMENTED
213 NULL, // TODO: NOT IMPLEMENTED
214 NULL, // TODO: NOT IMPLEMENTED
215 NULL, // TODO: NOT IMPLEMENTED
216 NULL, // TODO: NOT IMPLEMENTED
217 NULL, // TODO: NOT IMPLEMENTED
218 NULL, // TODO: NOT IMPLEMENTED
219 NULL, // TODO: NOT IMPLEMENTED
220 NULL, // TODO: NOT IMPLEMENTED
221 NULL, // TODO: NOT IMPLEMENTED
222 NULL, // TODO: NOT IMPLEMENTED
223 NULL, // TODO: NOT IMPLEMENTED
224 NULL, // TODO: NOT IMPLEMENTED
225 NULL, // TODO: NOT IMPLEMENTED
226 NULL, // TODO: NOT IMPLEMENTED
227 NULL, // TODO: NOT IMPLEMENTED
228 NULL, // TODO: NOT IMPLEMENTED
229 NULL, // TODO: NOT IMPLEMENTED
230 NULL, // TODO: NOT IMPLEMENTED
231 NULL, // TODO: NOT IMPLEMENTED
232 NULL, // TODO: NOT IMPLEMENTED
233 NULL, // TODO: NOT IMPLEMENTED
234 NULL, // TODO: NOT IMPLEMENTED
235 NULL, // TODO: NOT IMPLEMENTED
236 NULL, // TODO: NOT IMPLEMENTED
237 NULL, // TODO: NOT IMPLEMENTED
238 NULL, // TODO: NOT IMPLEMENTED
239 NULL, // TODO: NOT IMPLEMENTED
240 NULL, // TODO: NOT IMPLEMENTED
241 NULL, // TODO: NOT IMPLEMENTED
242 NULL, // TODO: NOT IMPLEMENTED
243 NULL, // TODO: NOT IMPLEMENTED
244 NULL, // TODO: NOT IMPLEMENTED
245 NULL, // TODO: NOT IMPLEMENTED
246 NULL, // TODO: NOT IMPLEMENTED
247 NULL, // TODO: NOT IMPLEMENTED
248 NULL, // TODO: NOT IMPLEMENTED
249 NULL, // TODO: NOT IMPLEMENTED
250 NULL, // TODO: NOT IMPLEMENTED
251 NULL, // TODO: NOT IMPLEMENTED
252 NULL, // TODO: NOT IMPLEMENTED
253 NULL, // TODO: NOT IMPLEMENTED
254 NULL, // TODO: NOT IMPLEMENTED
255 NULL, // TODO: NOT IMPLEMENTED
256 NULL, // TODO: NOT IMPLEMENTED
257 NULL, // TODO: NOT IMPLEMENTED
258 NULL, // TODO: NOT IMPLEMENTED
259 NULL, // TODO: NOT IMPLEMENTED
260 NULL, // TODO: NOT IMPLEMENTED
261 NULL, // TODO: NOT IMPLEMENTED
262 NULL, // TODO: NOT IMPLEMENTED
263 NULL, // TODO: NOT IMPLEMENTED
264 NULL, // TODO: NOT IMPLEMENTED
265 NULL, // TODO: NOT IMPLEMENTED
266 NULL, // TODO: NOT IMPLEMENTED
267 NULL, // TODO: NOT IMPLEMENTED
268 NULL, // TODO: NOT IMPLEMENTED
269 NULL, // TODO: NOT IMPLEMENTED
270 NULL, // TODO: NOT IMPLEMENTED
271 NULL, // TODO: NOT IMPLEMENTED
272 NULL, // TODO: NOT IMPLEMENTED
273 NULL, // TODO: NOT IMPLEMENTED
274 NULL, // TODO: NOT IMPLEMENTED
275 NULL, // TODO: NOT IMPLEMENTED
276 NULL, // TODO: NOT IMPLEMENTED
277 NULL, // TODO: NOT IMPLEMENTED
278 NULL, // TODO: NOT IMPLEMENTED
279 NULL, // TODO: NOT IMPLEMENTED
280 NULL, // TODO: NOT IMPLEMENTED
281 NULL, // TODO: NOT IMPLEMENTED
282 NULL, // TODO: NOT IMPLEMENTED
283 NULL, // TODO: NOT IMPLEMENTED
284 NULL, // TODO: NOT IMPLEMENTED
285 NULL, // TODO: NOT IMPLEMENTED
286 NULL, // TODO: NOT IMPLEMENTED
287 NULL, // TODO: NOT IMPLEMENTED
288 NULL, // TODO: NOT IMPLEMENTED
289 NULL, // TODO: NOT IMPLEMENTED
290 NULL, // TODO: NOT IMPLEMENTED
291 NULL, // TODO: NOT IMPLEMENTED
292 NULL, // TODO: NOT IMPLEMENTED
293 NULL, // TODO: NOT IMPLEMENTED
294 NULL, // TODO: NOT IMPLEMENTED
295 NULL, // TODO: NOT IMPLEMENTED
296 };
297
298 /* PUBLIC FUNCTIONS ***********************************************************/
299
300 SOFT386_OPCODE_HANDLER(Soft386OpcodeExtended)
301 {
302 UCHAR SecondOpcode;
303
304 /* Fetch the second operation code */
305 if (!Soft386FetchByte(State, &SecondOpcode))
306 {
307 /* Exception occurred */
308 return FALSE;
309 }
310
311 if (Soft386ExtendedHandlers[SecondOpcode] != NULL)
312 {
313 /* Call the extended opcode handler */
314 return Soft386ExtendedHandlers[SecondOpcode](State, SecondOpcode);
315 }
316 else
317 {
318 /* This is not a valid opcode */
319 Soft386Exception(State, SOFT386_EXCEPTION_UD);
320 return FALSE;
321 }
322 }