[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 #include "extraops.h"
35
36 /* PUBLIC VARIABLES ***********************************************************/
37
38 SOFT386_OPCODE_HANDLER_PROC
39 Soft386ExtendedHandlers[SOFT386_NUM_OPCODE_HANDLERS] =
40 {
41 NULL, // TODO: OPCODE 0x00 NOT IMPLEMENTED
42 NULL, // TODO: OPCODE 0x01 NOT IMPLEMENTED
43 NULL, // TODO: OPCODE 0x02 NOT IMPLEMENTED
44 NULL, // TODO: OPCODE 0x03 NOT IMPLEMENTED
45 NULL, // TODO: OPCODE 0x04 NOT IMPLEMENTED
46 NULL, // TODO: OPCODE 0x05 NOT IMPLEMENTED
47 NULL, // TODO: OPCODE 0x06 NOT IMPLEMENTED
48 NULL, // TODO: OPCODE 0x07 NOT IMPLEMENTED
49 NULL, // TODO: OPCODE 0x08 NOT IMPLEMENTED
50 NULL, // TODO: OPCODE 0x09 NOT IMPLEMENTED
51 NULL, // TODO: OPCODE 0x0A NOT IMPLEMENTED
52 NULL, // TODO: OPCODE 0x0B NOT IMPLEMENTED
53 NULL, // TODO: OPCODE 0x0C NOT IMPLEMENTED
54 NULL, // TODO: OPCODE 0x0D NOT IMPLEMENTED
55 NULL, // TODO: OPCODE 0x0E NOT IMPLEMENTED
56 NULL, // TODO: OPCODE 0x0F NOT IMPLEMENTED
57 NULL, // TODO: OPCODE 0x10 NOT IMPLEMENTED
58 NULL, // TODO: OPCODE 0x11 NOT IMPLEMENTED
59 NULL, // TODO: OPCODE 0x12 NOT IMPLEMENTED
60 NULL, // TODO: OPCODE 0x13 NOT IMPLEMENTED
61 NULL, // TODO: OPCODE 0x14 NOT IMPLEMENTED
62 NULL, // TODO: OPCODE 0x15 NOT IMPLEMENTED
63 NULL, // TODO: OPCODE 0x16 NOT IMPLEMENTED
64 NULL, // TODO: OPCODE 0x17 NOT IMPLEMENTED
65 NULL, // TODO: OPCODE 0x18 NOT IMPLEMENTED
66 NULL, // TODO: OPCODE 0x19 NOT IMPLEMENTED
67 NULL, // TODO: OPCODE 0x1A NOT IMPLEMENTED
68 NULL, // TODO: OPCODE 0x1B NOT IMPLEMENTED
69 NULL, // TODO: OPCODE 0x1C NOT IMPLEMENTED
70 NULL, // TODO: OPCODE 0x1D NOT IMPLEMENTED
71 NULL, // TODO: OPCODE 0x1E NOT IMPLEMENTED
72 NULL, // TODO: OPCODE 0x1F NOT IMPLEMENTED
73 NULL, // TODO: OPCODE 0x20 NOT IMPLEMENTED
74 NULL, // TODO: OPCODE 0x21 NOT IMPLEMENTED
75 NULL, // TODO: OPCODE 0x22 NOT IMPLEMENTED
76 NULL, // TODO: OPCODE 0x23 NOT IMPLEMENTED
77 NULL, // TODO: OPCODE 0x24 NOT IMPLEMENTED
78 NULL, // TODO: OPCODE 0x25 NOT IMPLEMENTED
79 NULL, // TODO: OPCODE 0x26 NOT IMPLEMENTED
80 NULL, // TODO: OPCODE 0x27 NOT IMPLEMENTED
81 NULL, // TODO: OPCODE 0x28 NOT IMPLEMENTED
82 NULL, // TODO: OPCODE 0x29 NOT IMPLEMENTED
83 NULL, // TODO: OPCODE 0x2A NOT IMPLEMENTED
84 NULL, // TODO: OPCODE 0x2B NOT IMPLEMENTED
85 NULL, // TODO: OPCODE 0x2C NOT IMPLEMENTED
86 NULL, // TODO: OPCODE 0x2D NOT IMPLEMENTED
87 NULL, // TODO: OPCODE 0x2E NOT IMPLEMENTED
88 NULL, // TODO: OPCODE 0x2F NOT IMPLEMENTED
89 NULL, // TODO: OPCODE 0x30 NOT IMPLEMENTED
90 NULL, // TODO: OPCODE 0x31 NOT IMPLEMENTED
91 NULL, // TODO: OPCODE 0x32 NOT IMPLEMENTED
92 NULL, // TODO: OPCODE 0x33 NOT IMPLEMENTED
93 NULL, // TODO: OPCODE 0x34 NOT IMPLEMENTED
94 NULL, // TODO: OPCODE 0x35 NOT IMPLEMENTED
95 NULL, // TODO: OPCODE 0x36 NOT IMPLEMENTED
96 NULL, // TODO: OPCODE 0x37 NOT IMPLEMENTED
97 NULL, // TODO: OPCODE 0x38 NOT IMPLEMENTED
98 NULL, // TODO: OPCODE 0x39 NOT IMPLEMENTED
99 NULL, // TODO: OPCODE 0x3A NOT IMPLEMENTED
100 NULL, // TODO: OPCODE 0x3B NOT IMPLEMENTED
101 NULL, // TODO: OPCODE 0x3C NOT IMPLEMENTED
102 NULL, // TODO: OPCODE 0x3D NOT IMPLEMENTED
103 NULL, // TODO: OPCODE 0x3E NOT IMPLEMENTED
104 NULL, // TODO: OPCODE 0x3F NOT IMPLEMENTED
105 NULL, // TODO: OPCODE 0x40 NOT IMPLEMENTED
106 NULL, // TODO: OPCODE 0x41 NOT IMPLEMENTED
107 NULL, // TODO: OPCODE 0x42 NOT IMPLEMENTED
108 NULL, // TODO: OPCODE 0x43 NOT IMPLEMENTED
109 NULL, // TODO: OPCODE 0x44 NOT IMPLEMENTED
110 NULL, // TODO: OPCODE 0x45 NOT IMPLEMENTED
111 NULL, // TODO: OPCODE 0x46 NOT IMPLEMENTED
112 NULL, // TODO: OPCODE 0x47 NOT IMPLEMENTED
113 NULL, // TODO: OPCODE 0x48 NOT IMPLEMENTED
114 NULL, // TODO: OPCODE 0x49 NOT IMPLEMENTED
115 NULL, // TODO: OPCODE 0x4A NOT IMPLEMENTED
116 NULL, // TODO: OPCODE 0x4B NOT IMPLEMENTED
117 NULL, // TODO: OPCODE 0x4C NOT IMPLEMENTED
118 NULL, // TODO: OPCODE 0x4D NOT IMPLEMENTED
119 NULL, // TODO: OPCODE 0x4E NOT IMPLEMENTED
120 NULL, // TODO: OPCODE 0x4F NOT IMPLEMENTED
121 NULL, // TODO: OPCODE 0x50 NOT IMPLEMENTED
122 NULL, // TODO: OPCODE 0x51 NOT IMPLEMENTED
123 NULL, // TODO: OPCODE 0x52 NOT IMPLEMENTED
124 NULL, // TODO: OPCODE 0x53 NOT IMPLEMENTED
125 NULL, // TODO: OPCODE 0x54 NOT IMPLEMENTED
126 NULL, // TODO: OPCODE 0x55 NOT IMPLEMENTED
127 NULL, // TODO: OPCODE 0x56 NOT IMPLEMENTED
128 NULL, // TODO: OPCODE 0x57 NOT IMPLEMENTED
129 NULL, // TODO: OPCODE 0x58 NOT IMPLEMENTED
130 NULL, // TODO: OPCODE 0x59 NOT IMPLEMENTED
131 NULL, // TODO: OPCODE 0x5A NOT IMPLEMENTED
132 NULL, // TODO: OPCODE 0x5B NOT IMPLEMENTED
133 NULL, // TODO: OPCODE 0x5C NOT IMPLEMENTED
134 NULL, // TODO: OPCODE 0x5D NOT IMPLEMENTED
135 NULL, // TODO: OPCODE 0x5E NOT IMPLEMENTED
136 NULL, // TODO: OPCODE 0x5F NOT IMPLEMENTED
137 NULL, // TODO: OPCODE 0x60 NOT IMPLEMENTED
138 NULL, // TODO: OPCODE 0x61 NOT IMPLEMENTED
139 NULL, // TODO: OPCODE 0x62 NOT IMPLEMENTED
140 NULL, // TODO: OPCODE 0x63 NOT IMPLEMENTED
141 NULL, // TODO: OPCODE 0x64 NOT IMPLEMENTED
142 NULL, // TODO: OPCODE 0x65 NOT IMPLEMENTED
143 NULL, // TODO: OPCODE 0x66 NOT IMPLEMENTED
144 NULL, // TODO: OPCODE 0x67 NOT IMPLEMENTED
145 NULL, // TODO: OPCODE 0x68 NOT IMPLEMENTED
146 NULL, // TODO: OPCODE 0x69 NOT IMPLEMENTED
147 NULL, // TODO: OPCODE 0x6A NOT IMPLEMENTED
148 NULL, // TODO: OPCODE 0x6B NOT IMPLEMENTED
149 NULL, // TODO: OPCODE 0x6C NOT IMPLEMENTED
150 NULL, // TODO: OPCODE 0x6D NOT IMPLEMENTED
151 NULL, // TODO: OPCODE 0x6E NOT IMPLEMENTED
152 NULL, // TODO: OPCODE 0x6F NOT IMPLEMENTED
153 NULL, // TODO: OPCODE 0x70 NOT IMPLEMENTED
154 NULL, // TODO: OPCODE 0x71 NOT IMPLEMENTED
155 NULL, // TODO: OPCODE 0x72 NOT IMPLEMENTED
156 NULL, // TODO: OPCODE 0x73 NOT IMPLEMENTED
157 NULL, // TODO: OPCODE 0x74 NOT IMPLEMENTED
158 NULL, // TODO: OPCODE 0x75 NOT IMPLEMENTED
159 NULL, // TODO: OPCODE 0x76 NOT IMPLEMENTED
160 NULL, // TODO: OPCODE 0x77 NOT IMPLEMENTED
161 NULL, // TODO: OPCODE 0x78 NOT IMPLEMENTED
162 NULL, // TODO: OPCODE 0x79 NOT IMPLEMENTED
163 NULL, // TODO: OPCODE 0x7A NOT IMPLEMENTED
164 NULL, // TODO: OPCODE 0x7B NOT IMPLEMENTED
165 NULL, // TODO: OPCODE 0x7C NOT IMPLEMENTED
166 NULL, // TODO: OPCODE 0x7D NOT IMPLEMENTED
167 NULL, // TODO: OPCODE 0x7E NOT IMPLEMENTED
168 NULL, // TODO: OPCODE 0x7F NOT IMPLEMENTED
169 Soft386ExtOpcodeConditionalJmp,
170 Soft386ExtOpcodeConditionalJmp,
171 Soft386ExtOpcodeConditionalJmp,
172 Soft386ExtOpcodeConditionalJmp,
173 Soft386ExtOpcodeConditionalJmp,
174 Soft386ExtOpcodeConditionalJmp,
175 Soft386ExtOpcodeConditionalJmp,
176 Soft386ExtOpcodeConditionalJmp,
177 Soft386ExtOpcodeConditionalJmp,
178 Soft386ExtOpcodeConditionalJmp,
179 Soft386ExtOpcodeConditionalJmp,
180 Soft386ExtOpcodeConditionalJmp,
181 Soft386ExtOpcodeConditionalJmp,
182 Soft386ExtOpcodeConditionalJmp,
183 Soft386ExtOpcodeConditionalJmp,
184 Soft386ExtOpcodeConditionalJmp,
185 NULL, // TODO: OPCODE 0x90 NOT IMPLEMENTED
186 NULL, // TODO: OPCODE 0x91 NOT IMPLEMENTED
187 NULL, // TODO: OPCODE 0x92 NOT IMPLEMENTED
188 NULL, // TODO: OPCODE 0x93 NOT IMPLEMENTED
189 NULL, // TODO: OPCODE 0x94 NOT IMPLEMENTED
190 NULL, // TODO: OPCODE 0x95 NOT IMPLEMENTED
191 NULL, // TODO: OPCODE 0x96 NOT IMPLEMENTED
192 NULL, // TODO: OPCODE 0x97 NOT IMPLEMENTED
193 NULL, // TODO: OPCODE 0x98 NOT IMPLEMENTED
194 NULL, // TODO: OPCODE 0x99 NOT IMPLEMENTED
195 NULL, // TODO: OPCODE 0x9A NOT IMPLEMENTED
196 NULL, // TODO: OPCODE 0x9B NOT IMPLEMENTED
197 NULL, // TODO: OPCODE 0x9C NOT IMPLEMENTED
198 NULL, // TODO: OPCODE 0x9D NOT IMPLEMENTED
199 NULL, // TODO: OPCODE 0x9E NOT IMPLEMENTED
200 NULL, // TODO: OPCODE 0x9F NOT IMPLEMENTED
201 NULL, // TODO: OPCODE 0xA0 NOT IMPLEMENTED
202 NULL, // TODO: OPCODE 0xA1 NOT IMPLEMENTED
203 NULL, // TODO: OPCODE 0xA2 NOT IMPLEMENTED
204 NULL, // TODO: OPCODE 0xA3 NOT IMPLEMENTED
205 NULL, // TODO: OPCODE 0xA4 NOT IMPLEMENTED
206 NULL, // TODO: OPCODE 0xA5 NOT IMPLEMENTED
207 NULL, // TODO: OPCODE 0xA6 NOT IMPLEMENTED
208 NULL, // TODO: OPCODE 0xA7 NOT IMPLEMENTED
209 NULL, // TODO: OPCODE 0xA8 NOT IMPLEMENTED
210 NULL, // TODO: OPCODE 0xA9 NOT IMPLEMENTED
211 NULL, // TODO: OPCODE 0xAA NOT IMPLEMENTED
212 NULL, // TODO: OPCODE 0xAB NOT IMPLEMENTED
213 NULL, // TODO: OPCODE 0xAC NOT IMPLEMENTED
214 NULL, // TODO: OPCODE 0xAD NOT IMPLEMENTED
215 NULL, // TODO: OPCODE 0xAE NOT IMPLEMENTED
216 NULL, // TODO: OPCODE 0xAF NOT IMPLEMENTED
217 NULL, // TODO: OPCODE 0xB0 NOT IMPLEMENTED
218 NULL, // TODO: OPCODE 0xB1 NOT IMPLEMENTED
219 NULL, // TODO: OPCODE 0xB2 NOT IMPLEMENTED
220 NULL, // TODO: OPCODE 0xB3 NOT IMPLEMENTED
221 NULL, // TODO: OPCODE 0xB4 NOT IMPLEMENTED
222 NULL, // TODO: OPCODE 0xB5 NOT IMPLEMENTED
223 NULL, // TODO: OPCODE 0xB6 NOT IMPLEMENTED
224 NULL, // TODO: OPCODE 0xB7 NOT IMPLEMENTED
225 NULL, // TODO: OPCODE 0xB8 NOT IMPLEMENTED
226 NULL, // TODO: OPCODE 0xB9 NOT IMPLEMENTED
227 NULL, // TODO: OPCODE 0xBA NOT IMPLEMENTED
228 NULL, // TODO: OPCODE 0xBB NOT IMPLEMENTED
229 NULL, // TODO: OPCODE 0xBC NOT IMPLEMENTED
230 NULL, // TODO: OPCODE 0xBD NOT IMPLEMENTED
231 NULL, // TODO: OPCODE 0xBE NOT IMPLEMENTED
232 NULL, // TODO: OPCODE 0xBF NOT IMPLEMENTED
233 NULL, // TODO: OPCODE 0xC0 NOT IMPLEMENTED
234 NULL, // TODO: OPCODE 0xC1 NOT IMPLEMENTED
235 NULL, // TODO: OPCODE 0xC2 NOT IMPLEMENTED
236 NULL, // TODO: OPCODE 0xC3 NOT IMPLEMENTED
237 NULL, // TODO: OPCODE 0xC4 NOT IMPLEMENTED
238 NULL, // TODO: OPCODE 0xC5 NOT IMPLEMENTED
239 NULL, // TODO: OPCODE 0xC6 NOT IMPLEMENTED
240 NULL, // TODO: OPCODE 0xC7 NOT IMPLEMENTED
241 NULL, // TODO: OPCODE 0xC8 NOT IMPLEMENTED
242 NULL, // TODO: OPCODE 0xC9 NOT IMPLEMENTED
243 NULL, // TODO: OPCODE 0xCA NOT IMPLEMENTED
244 NULL, // TODO: OPCODE 0xCB NOT IMPLEMENTED
245 NULL, // TODO: OPCODE 0xCC NOT IMPLEMENTED
246 NULL, // TODO: OPCODE 0xCD NOT IMPLEMENTED
247 NULL, // TODO: OPCODE 0xCE NOT IMPLEMENTED
248 NULL, // TODO: OPCODE 0xCF NOT IMPLEMENTED
249 NULL, // TODO: OPCODE 0xD0 NOT IMPLEMENTED
250 NULL, // TODO: OPCODE 0xD1 NOT IMPLEMENTED
251 NULL, // TODO: OPCODE 0xD2 NOT IMPLEMENTED
252 NULL, // TODO: OPCODE 0xD3 NOT IMPLEMENTED
253 NULL, // TODO: OPCODE 0xD4 NOT IMPLEMENTED
254 NULL, // TODO: OPCODE 0xD5 NOT IMPLEMENTED
255 NULL, // TODO: OPCODE 0xD6 NOT IMPLEMENTED
256 NULL, // TODO: OPCODE 0xD7 NOT IMPLEMENTED
257 NULL, // TODO: OPCODE 0xD8 NOT IMPLEMENTED
258 NULL, // TODO: OPCODE 0xD9 NOT IMPLEMENTED
259 NULL, // TODO: OPCODE 0xDA NOT IMPLEMENTED
260 NULL, // TODO: OPCODE 0xDB NOT IMPLEMENTED
261 NULL, // TODO: OPCODE 0xDC NOT IMPLEMENTED
262 NULL, // TODO: OPCODE 0xDD NOT IMPLEMENTED
263 NULL, // TODO: OPCODE 0xDE NOT IMPLEMENTED
264 NULL, // TODO: OPCODE 0xDF NOT IMPLEMENTED
265 NULL, // TODO: OPCODE 0xE0 NOT IMPLEMENTED
266 NULL, // TODO: OPCODE 0xE1 NOT IMPLEMENTED
267 NULL, // TODO: OPCODE 0xE2 NOT IMPLEMENTED
268 NULL, // TODO: OPCODE 0xE3 NOT IMPLEMENTED
269 NULL, // TODO: OPCODE 0xE4 NOT IMPLEMENTED
270 NULL, // TODO: OPCODE 0xE5 NOT IMPLEMENTED
271 NULL, // TODO: OPCODE 0xE6 NOT IMPLEMENTED
272 NULL, // TODO: OPCODE 0xE7 NOT IMPLEMENTED
273 NULL, // TODO: OPCODE 0xE8 NOT IMPLEMENTED
274 NULL, // TODO: OPCODE 0xE9 NOT IMPLEMENTED
275 NULL, // TODO: OPCODE 0xEA NOT IMPLEMENTED
276 NULL, // TODO: OPCODE 0xEB NOT IMPLEMENTED
277 NULL, // TODO: OPCODE 0xEC NOT IMPLEMENTED
278 NULL, // TODO: OPCODE 0xED NOT IMPLEMENTED
279 NULL, // TODO: OPCODE 0xEE NOT IMPLEMENTED
280 NULL, // TODO: OPCODE 0xEF NOT IMPLEMENTED
281 NULL, // TODO: OPCODE 0xF0 NOT IMPLEMENTED
282 NULL, // TODO: OPCODE 0xF1 NOT IMPLEMENTED
283 NULL, // TODO: OPCODE 0xF2 NOT IMPLEMENTED
284 NULL, // TODO: OPCODE 0xF3 NOT IMPLEMENTED
285 NULL, // TODO: OPCODE 0xF4 NOT IMPLEMENTED
286 NULL, // TODO: OPCODE 0xF5 NOT IMPLEMENTED
287 NULL, // TODO: OPCODE 0xF6 NOT IMPLEMENTED
288 NULL, // TODO: OPCODE 0xF7 NOT IMPLEMENTED
289 NULL, // TODO: OPCODE 0xF8 NOT IMPLEMENTED
290 NULL, // TODO: OPCODE 0xF9 NOT IMPLEMENTED
291 NULL, // TODO: OPCODE 0xFA NOT IMPLEMENTED
292 NULL, // TODO: OPCODE 0xFB NOT IMPLEMENTED
293 NULL, // TODO: OPCODE 0xFC NOT IMPLEMENTED
294 NULL, // TODO: OPCODE 0xFD NOT IMPLEMENTED
295 NULL, // TODO: OPCODE 0xFE NOT IMPLEMENTED
296 NULL, // TODO: OPCODE 0xFF NOT IMPLEMENTED
297 };
298
299 /* PUBLIC FUNCTIONS ***********************************************************/
300
301 SOFT386_OPCODE_HANDLER(Soft386ExtOpcodeConditionalJmp)
302 {
303 BOOLEAN Jump = FALSE;
304 LONG Offset = 0;
305 BOOLEAN Size = State->SegmentRegs[SOFT386_REG_CS].Size;
306
307 if (State->PrefixFlags & SOFT386_PREFIX_OPSIZE)
308 {
309 /* The OPSIZE prefix toggles the size */
310 Size = !Size;
311 }
312
313 if (State->PrefixFlags & SOFT386_PREFIX_LOCK)
314 {
315 /* Invalid prefix */
316 Soft386Exception(State, SOFT386_EXCEPTION_UD);
317 return FALSE;
318 }
319
320 /* Make sure this is the right instruction */
321 ASSERT((Opcode & 0xF0) == 0x80);
322
323 /* Fetch the offset */
324 if (Size)
325 {
326 if (!Soft386FetchDword(State, (PULONG)&Offset))
327 {
328 /* Exception occurred */
329 return FALSE;
330 }
331 }
332 else
333 {
334 SHORT Value;
335
336 if (!Soft386FetchWord(State, (PUSHORT)&Value))
337 {
338 /* Exception occurred */
339 return FALSE;
340 }
341
342 /* Sign-extend */
343 Offset = (LONG)Value;
344 }
345
346 switch ((Opcode & 0x0F) >> 1)
347 {
348 /* JO / JNO */
349 case 0:
350 {
351 Jump = State->Flags.Of;
352 break;
353 }
354
355 /* JC / JNC */
356 case 1:
357 {
358 Jump = State->Flags.Cf;
359 break;
360 }
361
362 /* JZ / JNZ */
363 case 2:
364 {
365 Jump = State->Flags.Zf;
366 break;
367 }
368
369 /* JBE / JNBE */
370 case 3:
371 {
372 Jump = State->Flags.Cf || State->Flags.Zf;
373 break;
374 }
375
376 /* JS / JNS */
377 case 4:
378 {
379 Jump = State->Flags.Sf;
380 break;
381 }
382
383 /* JP / JNP */
384 case 5:
385 {
386 Jump = State->Flags.Pf;
387 break;
388 }
389
390 /* JL / JNL */
391 case 6:
392 {
393 Jump = State->Flags.Sf != State->Flags.Of;
394 break;
395 }
396
397 /* JLE / JNLE */
398 case 7:
399 {
400 Jump = (State->Flags.Sf != State->Flags.Of) || State->Flags.Zf;
401 break;
402 }
403 }
404
405 if (Opcode & 1)
406 {
407 /* Invert the result */
408 Jump = !Jump;
409 }
410
411 if (Jump)
412 {
413 /* Move the instruction pointer */
414 State->InstPtr.Long += Offset;
415 }
416
417 /* Return success */
418 return TRUE;
419 }
420
421
422 SOFT386_OPCODE_HANDLER(Soft386OpcodeExtended)
423 {
424 UCHAR SecondOpcode;
425
426 /* Fetch the second operation code */
427 if (!Soft386FetchByte(State, &SecondOpcode))
428 {
429 /* Exception occurred */
430 return FALSE;
431 }
432
433 if (Soft386ExtendedHandlers[SecondOpcode] != NULL)
434 {
435 /* Call the extended opcode handler */
436 return Soft386ExtendedHandlers[SecondOpcode](State, SecondOpcode);
437 }
438 else
439 {
440 /* This is not a valid opcode */
441 Soft386Exception(State, SOFT386_EXCEPTION_UD);
442 return FALSE;
443 }
444 }