7 #include "mn10300_sim.h"
9 #include "sys/syscall.h"
13 #include <sys/times.h>
21 static void trace_input
PARAMS ((char *name
, enum op_types type
, int size
));
22 static void trace_output
PARAMS ((enum op_types result
));
23 static int init_text_p
= 0;
24 static asection
*text
;
25 static bfd_vma text_start
;
26 static bfd_vma text_end
;
29 #ifndef SIZE_INSTRUCTION
30 #define SIZE_INSTRUCTION 6
34 #define SIZE_OPERANDS 16
38 #define SIZE_VALUES 11
42 #define SIZE_LOCATION 40
46 trace_input (name
, type
, size
)
60 #define trace_input(NAME, IN1, IN2)
61 #define trace_output(RESULT)
66 void OP_8000 (insn
, extension
)
67 unsigned long insn
, extension
;
69 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = SEXT8 (insn
& 0xff);
73 void OP_80 (insn
, extension
)
74 unsigned long insn
, extension
;
76 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
80 void OP_F1E0 (insn
, extension
)
81 unsigned long insn
, extension
;
83 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
87 void OP_F1D0 (insn
, extension
)
88 unsigned long insn
, extension
;
90 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
94 void OP_9000 (insn
, extension
)
95 unsigned long insn
, extension
;
97 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] = insn
& 0xff;
101 void OP_90 (insn
, extension
)
102 unsigned long insn
, extension
;
104 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
108 void OP_3C (insn
, extension
)
109 unsigned long insn
, extension
;
111 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_SP
];
115 void OP_F2F0 (insn
, extension
)
116 unsigned long insn
, extension
;
118 State
.regs
[REG_SP
] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
122 void OP_F2E4 (insn
, extension
)
123 unsigned long insn
, extension
;
125 State
.regs
[REG_D0
+ (insn
& 0x3)] = PSW
;
129 void OP_F2F3 (insn
, extension
)
130 unsigned long insn
, extension
;
132 PSW
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
136 void OP_F2E0 (insn
, extension
)
137 unsigned long insn
, extension
;
139 State
.regs
[REG_D0
+ (insn
& 0x3)] = State
.regs
[REG_MDR
];
143 void OP_F2F2 (insn
, extension
)
144 unsigned long insn
, extension
;
146 State
.regs
[REG_MDR
] = State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
150 void OP_70 (insn
, extension
)
151 unsigned long insn
, extension
;
153 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
154 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4);
157 /* mov (d8,am), dn */
158 void OP_F80000 (insn
, extension
)
159 unsigned long insn
, extension
;
161 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
162 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
163 + SEXT8 (insn
& 0xff)), 4);
166 /* mov (d16,am), dn */
167 void OP_FA000000 (insn
, extension
)
168 unsigned long insn
, extension
;
170 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
171 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
172 + SEXT16 (insn
& 0xffff)), 4);
175 /* mov (d32,am), dn */
176 void OP_FC000000 (insn
, extension
)
177 unsigned long insn
, extension
;
179 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
180 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
181 + ((insn
& 0xffff) << 16) + extension
), 4);
184 /* mov (d8,sp), dn */
185 void OP_5800 (insn
, extension
)
186 unsigned long insn
, extension
;
188 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
189 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4);
192 /* mov (d16,sp), dn */
193 void OP_FAB40000 (insn
, extension
)
194 unsigned long insn
, extension
;
196 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
197 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4);
200 /* mov (d32,sp), dn */
201 void OP_FCB40000 (insn
, extension
)
202 unsigned long insn
, extension
;
204 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
205 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4);
208 /* mov (di,am), dn */
209 void OP_F300 (insn
, extension
)
210 unsigned long insn
, extension
;
212 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
213 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
214 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4);
217 /* mov (abs16), dn */
218 void OP_300000 (insn
, extension
)
219 unsigned long insn
, extension
;
221 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 4);
224 /* mov (abs32), dn */
225 void OP_FCA40000 (insn
, extension
)
226 unsigned long insn
, extension
;
228 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
229 = load_mem ((((insn
& 0xffff) << 16) + extension
), 4);
233 void OP_F000 (insn
, extension
)
234 unsigned long insn
, extension
;
236 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)]
237 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4);
240 /* mov (d8,am), an */
241 void OP_F82000 (insn
, extension
)
242 unsigned long insn
, extension
;
244 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]
245 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
246 + SEXT8 (insn
& 0xff)), 4);
249 /* mov (d16,am), an */
250 void OP_FA200000 (insn
, extension
)
251 unsigned long insn
, extension
;
253 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]
254 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
255 + SEXT16 (insn
& 0xffff)), 4);
258 /* mov (d32,am), an */
259 void OP_FC200000 (insn
, extension
)
260 unsigned long insn
, extension
;
262 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]
263 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
264 + ((insn
& 0xffff) << 16) + extension
), 4);
267 /* mov (d8,sp), an */
268 void OP_5C00 (insn
, extension
)
269 unsigned long insn
, extension
;
271 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
272 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4);
275 /* mov (d16,sp), an */
276 void OP_FAB00000 (insn
, extension
)
277 unsigned long insn
, extension
;
279 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
280 = load_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4);
283 /* mov (d32,sp), an */
284 void OP_FCB00000 (insn
, extension
)
285 unsigned long insn
, extension
;
287 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
288 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4);
291 /* mov (di,am), an */
292 void OP_F380 (insn
, extension
)
293 unsigned long insn
, extension
;
295 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
296 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
297 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4);
300 /* mov (abs16), an */
301 void OP_FAA00000 (insn
, extension
)
302 unsigned long insn
, extension
;
304 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 4);
307 /* mov (abs32), an */
308 void OP_FCA00000 (insn
, extension
)
309 unsigned long insn
, extension
;
311 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
312 = load_mem ((((insn
& 0xffff) << 16) + extension
), 4);
315 /* mov (d8,am), sp */
316 void OP_F8F000 (insn
, extension
)
317 unsigned long insn
, extension
;
320 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
321 + SEXT8 (insn
& 0xff)), 4);
325 void OP_60 (insn
, extension
)
326 unsigned long insn
, extension
;
328 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4,
329 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
332 /* mov dm, (d8,an) */
333 void OP_F81000 (insn
, extension
)
334 unsigned long insn
, extension
;
336 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
337 + SEXT8 (insn
& 0xff)), 4,
338 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
341 /* mov dm (d16,an) */
342 void OP_FA100000 (insn
, extension
)
343 unsigned long insn
, extension
;
345 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
346 + SEXT16 (insn
& 0xffff)), 4,
347 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
350 /* mov dm (d32,an) */
351 void OP_FC100000 (insn
, extension
)
352 unsigned long insn
, extension
;
354 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
355 + ((insn
& 0xffff) << 16) + extension
), 4,
356 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
359 /* mov dm, (d8,sp) */
360 void OP_4200 (insn
, extension
)
361 unsigned long insn
, extension
;
363 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4,
364 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
367 /* mov dm, (d16,sp) */
368 void OP_FA910000 (insn
, extension
)
369 unsigned long insn
, extension
;
371 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4,
372 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
375 /* mov dm, (d32,sp) */
376 void OP_FC910000 (insn
, extension
)
377 unsigned long insn
, extension
;
379 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4,
380 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
383 /* mov dm, (di,an) */
384 void OP_F340 (insn
, extension
)
385 unsigned long insn
, extension
;
387 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
388 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4,
389 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
392 /* mov dm, (abs16) */
393 void OP_10000 (insn
, extension
)
394 unsigned long insn
, extension
;
396 store_mem ((insn
& 0xffff), 4, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
399 /* mov dm, (abs32) */
400 void OP_FC810000 (insn
, extension
)
401 unsigned long insn
, extension
;
403 store_mem ((((insn
& 0xffff) << 16) + extension
), 4, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
407 void OP_F010 (insn
, extension
)
408 unsigned long insn
, extension
;
410 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 4,
411 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)]);
414 /* mov am, (d8,an) */
415 void OP_F83000 (insn
, extension
)
416 unsigned long insn
, extension
;
418 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
419 + SEXT8 (insn
& 0xff)), 4,
420 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]);
423 /* mov am, (d16,an) */
424 void OP_FA300000 (insn
, extension
)
425 unsigned long insn
, extension
;
427 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
428 + SEXT16 (insn
& 0xffff)), 4,
429 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
432 /* mov am, (d32,an) */
433 void OP_FC300000 (insn
, extension
)
434 unsigned long insn
, extension
;
436 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
437 + ((insn
& 0xffff) << 16) + extension
), 4,
438 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
441 /* mov am, (d8,sp) */
442 void OP_4300 (insn
, extension
)
443 unsigned long insn
, extension
;
445 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 4,
446 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 10)]);
449 /* mov am, (d16,sp) */
450 void OP_FA900000 (insn
, extension
)
451 unsigned long insn
, extension
;
453 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 4,
454 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
457 /* mov am, (d32,sp) */
458 void OP_FC900000 (insn
, extension
)
459 unsigned long insn
, extension
;
461 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 4,
462 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
465 /* mov am, (di,an) */
466 void OP_F3C0 (insn
, extension
)
467 unsigned long insn
, extension
;
469 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
470 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 4,
471 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]);
474 /* mov am, (abs16) */
475 void OP_FA800000 (insn
, extension
)
476 unsigned long insn
, extension
;
478 store_mem ((insn
& 0xffff), 4, State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
481 /* mov am, (abs32) */
482 void OP_FC800000 (insn
, extension
)
483 unsigned long insn
, extension
;
485 store_mem ((((insn
& 0xffff) << 16) + extension
), 4, State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 18)]);
488 /* mov sp, (d8,an) */
489 void OP_F8F400 (insn
, extension
)
490 unsigned long insn
, extension
;
492 store_mem (State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] + SEXT8 (insn
& 0xff),
493 4, State
.regs
[REG_SP
]);
497 void OP_2C0000 (insn
, extension
)
498 unsigned long insn
, extension
;
502 value
= SEXT16 (insn
& 0xffff);
503 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
507 void OP_FCCC0000 (insn
, extension
)
508 unsigned long insn
, extension
;
512 value
= ((insn
& 0xffff) << 16) + extension
;
513 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
517 void OP_240000 (insn
, extension
)
518 unsigned long insn
, extension
;
522 value
= insn
& 0xffff;
523 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
527 void OP_FCDC0000 (insn
, extension
)
528 unsigned long insn
, extension
;
532 value
= ((insn
& 0xffff) << 16) + extension
;
533 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
537 void OP_F040 (insn
, extension
)
538 unsigned long insn
, extension
;
540 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
541 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 1);
544 /* movbu (d8,am), dn */
545 void OP_F84000 (insn
, extension
)
546 unsigned long insn
, extension
;
548 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
549 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
550 + SEXT8 (insn
& 0xff)), 1);
553 /* movbu (d16,am), dn */
554 void OP_FA400000 (insn
, extension
)
555 unsigned long insn
, extension
;
557 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
558 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
559 + SEXT16 (insn
& 0xffff)), 1);
562 /* movbu (d32,am), dn */
563 void OP_FC400000 (insn
, extension
)
564 unsigned long insn
, extension
;
566 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
567 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
568 + ((insn
& 0xffff) << 16) + extension
), 1);
571 /* movbu (d8,sp), dn */
572 void OP_F8B800 (insn
, extension
)
573 unsigned long insn
, extension
;
575 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
576 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xff)), 1);
579 /* movbu (d16,sp), dn */
580 void OP_FAB80000 (insn
, extension
)
581 unsigned long insn
, extension
;
583 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
584 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xffff)), 1);
587 /* movbu (d32,sp), dn */
588 void OP_FCB80000 (insn
, extension
)
589 unsigned long insn
, extension
;
591 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
592 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 1);
595 /* movbu (di,am), dn */
596 void OP_F400 (insn
, extension
)
597 unsigned long insn
, extension
;
599 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
600 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
601 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 1);
604 /* movbu (abs16), dn */
605 void OP_340000 (insn
, extension
)
606 unsigned long insn
, extension
;
608 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 1);
611 /* movbu (abs32), dn */
612 void OP_FCA80000 (insn
, extension
)
613 unsigned long insn
, extension
;
615 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
616 = load_mem ((((insn
& 0xffff) << 16) + extension
), 1);
620 void OP_F050 (insn
, extension
)
621 unsigned long insn
, extension
;
623 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 1,
624 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
627 /* movbu dm, (d8,an) */
628 void OP_F85000 (insn
, extension
)
629 unsigned long insn
, extension
;
631 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
632 + SEXT8 (insn
& 0xff)), 1,
633 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
636 /* movbu dm, (d16,an) */
637 void OP_FA500000 (insn
, extension
)
638 unsigned long insn
, extension
;
640 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
641 + SEXT16 (insn
& 0xffff)), 1,
642 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
645 /* movbu dm, (d32,an) */
646 void OP_FC500000 (insn
, extension
)
647 unsigned long insn
, extension
;
649 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
650 + ((insn
& 0xffff) << 16) + extension
), 1,
651 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
654 /* movbu dm, (d8,sp) */
655 void OP_F89200 (insn
, extension
)
656 unsigned long insn
, extension
;
658 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 1,
659 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
662 /* movbu dm, (d16,sp) */
663 void OP_FA920000 (insn
, extension
)
664 unsigned long insn
, extension
;
666 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 2,
667 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
670 /* movbu dm (d32,sp) */
671 void OP_FC920000 (insn
, extension
)
672 unsigned long insn
, extension
;
674 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2,
675 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
678 /* movbu dm, (di,an) */
679 void OP_F440 (insn
, extension
)
680 unsigned long insn
, extension
;
682 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
683 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 1,
684 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
687 /* movbu dm, (abs16) */
688 void OP_20000 (insn
, extension
)
689 unsigned long insn
, extension
;
691 store_mem ((insn
& 0xffff), 1, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
694 /* movbu dm, (abs32) */
695 void OP_FC820000 (insn
, extension
)
696 unsigned long insn
, extension
;
698 store_mem ((((insn
& 0xffff) << 16) + extension
), 1, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
702 void OP_F060 (insn
, extension
)
703 unsigned long insn
, extension
;
705 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]
706 = load_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 2);
709 /* movhu (d8,am), dn */
710 void OP_F86000 (insn
, extension
)
711 unsigned long insn
, extension
;
713 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]
714 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
715 + SEXT8 (insn
& 0xff)), 2);
718 /* movhu (d16,am), dn */
719 void OP_FA600000 (insn
, extension
)
720 unsigned long insn
, extension
;
722 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
723 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
724 + SEXT16 (insn
& 0xffff)), 2);
727 /* movhu (d32,am), dn */
728 void OP_FC600000 (insn
, extension
)
729 unsigned long insn
, extension
;
731 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]
732 = load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
733 + ((insn
& 0xffff) << 16) + extension
), 2);
736 /* movhu (d8,sp) dn */
737 void OP_F8BC00 (insn
, extension
)
738 unsigned long insn
, extension
;
740 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
741 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xff)), 2);
744 /* movhu (d16,sp), dn */
745 void OP_FABC0000 (insn
, extension
)
746 unsigned long insn
, extension
;
748 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
749 = load_mem ((State
.regs
[REG_SP
] + (insn
& 0xffff)), 2);
752 /* movhu (d32,sp), dn */
753 void OP_FCBC0000 (insn
, extension
)
754 unsigned long insn
, extension
;
756 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
757 = load_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2);
760 /* movhu (di,am), dn */
761 void OP_F480 (insn
, extension
)
762 unsigned long insn
, extension
;
764 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]
765 = load_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
766 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 2);
769 /* movhu (abs16), dn */
770 void OP_380000 (insn
, extension
)
771 unsigned long insn
, extension
;
773 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = load_mem ((insn
& 0xffff), 2);
776 /* movhu (abs32), dn */
777 void OP_FCAC0000 (insn
, extension
)
778 unsigned long insn
, extension
;
780 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
781 = load_mem ((((insn
& 0xffff) << 16) + extension
), 2);
785 void OP_F070 (insn
, extension
)
786 unsigned long insn
, extension
;
788 store_mem (State
.regs
[REG_A0
+ (insn
& 0x3)], 2,
789 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
792 /* movhu dm, (d8,an) */
793 void OP_F87000 (insn
, extension
)
794 unsigned long insn
, extension
;
796 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)]
797 + SEXT8 (insn
& 0xff)), 2,
798 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
801 /* movhu dm, (d16,an) */
802 void OP_FA700000 (insn
, extension
)
803 unsigned long insn
, extension
;
805 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
806 + SEXT16 (insn
& 0xffff)), 2,
807 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
810 /* movhu dm, (d32,an) */
811 void OP_FC700000 (insn
, extension
)
812 unsigned long insn
, extension
;
814 store_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
815 + ((insn
& 0xffff) << 16) + extension
), 2,
816 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
819 /* movhu dm,(d8,sp) */
820 void OP_F89300 (insn
, extension
)
821 unsigned long insn
, extension
;
823 store_mem (State
.regs
[REG_SP
] + (insn
& 0xff), 2,
824 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 10)]);
827 /* movhu dm,(d16,sp) */
828 void OP_FA930000 (insn
, extension
)
829 unsigned long insn
, extension
;
831 store_mem (State
.regs
[REG_SP
] + (insn
& 0xffff), 2,
832 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
835 /* movhu dm,(d32,sp) */
836 void OP_FC930000 (insn
, extension
)
837 unsigned long insn
, extension
;
839 store_mem (State
.regs
[REG_SP
] + (((insn
& 0xffff) << 16) + extension
), 2,
840 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
843 /* movhu dm, (di,an) */
844 void OP_F4C0 (insn
, extension
)
845 unsigned long insn
, extension
;
847 store_mem ((State
.regs
[REG_A0
+ (insn
& 0x3)]
848 + State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]), 2,
849 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)]);
852 /* movhu dm, (abs16) */
853 void OP_30000 (insn
, extension
)
854 unsigned long insn
, extension
;
856 store_mem ((insn
& 0xffff), 2, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
859 /* movhu dm, (abs32) */
860 void OP_FC830000 (insn
, extension
)
861 unsigned long insn
, extension
;
863 store_mem ((((insn
& 0xffff) << 16) + extension
), 2, State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 18)]);
867 void OP_F2D0 (insn
, extension
)
868 unsigned long insn
, extension
;
870 if (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000)
871 State
.regs
[REG_MDR
] = -1;
873 State
.regs
[REG_MDR
] = 0;
877 void OP_10 (insn
, extension
)
878 unsigned long insn
, extension
;
880 State
.regs
[REG_D0
+ (insn
& 0x3)] = SEXT8 (State
.regs
[REG_D0
+ (insn
& 0x3)]);
884 void OP_14 (insn
, extension
)
885 unsigned long insn
, extension
;
887 State
.regs
[REG_D0
+ (insn
& 0x3)] &= 0xff;
891 void OP_18 (insn
, extension
)
892 unsigned long insn
, extension
;
894 State
.regs
[REG_D0
+ (insn
& 0x3)]
895 = SEXT16 (State
.regs
[REG_D0
+ (insn
& 0x3)]);
899 void OP_1C (insn
, extension
)
900 unsigned long insn
, extension
;
902 State
.regs
[REG_D0
+ (insn
& 0x3)] &= 0xffff;
905 /* movm (sp), reg_list */
906 void OP_CE00 (insn
, extension
)
907 unsigned long insn
, extension
;
909 unsigned long sp
= State
.regs
[REG_SP
];
917 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
919 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
921 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
923 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
925 State
.regs
[REG_A0
] = load_mem (sp
, 4);
927 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
929 State
.regs
[REG_D0
] = load_mem (sp
, 4);
935 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
941 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
947 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
953 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
957 /* And make sure to update the stack pointer. */
958 State
.regs
[REG_SP
] = sp
;
961 /* movm reg_list, (sp) */
962 void OP_CF00 (insn
, extension
)
963 unsigned long insn
, extension
;
965 unsigned long sp
= State
.regs
[REG_SP
];
973 store_mem (sp
, 4, State
.regs
[REG_D0
+ 2]);
979 store_mem (sp
, 4, State
.regs
[REG_D0
+ 3]);
985 store_mem (sp
, 4, State
.regs
[REG_A0
+ 2]);
991 store_mem (sp
, 4, State
.regs
[REG_A0
+ 3]);
997 store_mem (sp
, 4, State
.regs
[REG_D0
]);
999 store_mem (sp
, 4, State
.regs
[REG_D0
+ 1]);
1001 store_mem (sp
, 4, State
.regs
[REG_A0
]);
1003 store_mem (sp
, 4, State
.regs
[REG_A0
+ 1]);
1005 store_mem (sp
, 4, State
.regs
[REG_MDR
]);
1007 store_mem (sp
, 4, State
.regs
[REG_LIR
]);
1009 store_mem (sp
, 4, State
.regs
[REG_LAR
]);
1013 /* And make sure to update the stack pointer. */
1014 State
.regs
[REG_SP
] = sp
;
1018 void OP_0 (insn
, extension
)
1019 unsigned long insn
, extension
;
1021 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = 0;
1024 PSW
&= ~(PSW_V
| PSW_C
| PSW_N
);
1028 void OP_E0 (insn
, extension
)
1029 unsigned long insn
, extension
;
1032 unsigned long reg1
, reg2
, value
;
1034 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1035 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1036 value
= reg1
+ reg2
;
1037 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1040 n
= (value
& 0x80000000);
1042 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1043 && (reg2
& 0x80000000) != (value
& 0x80000000));
1045 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1046 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1047 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1051 void OP_F160 (insn
, extension
)
1052 unsigned long insn
, extension
;
1055 unsigned long reg1
, reg2
, value
;
1057 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1058 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1059 value
= reg1
+ reg2
;
1060 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1063 n
= (value
& 0x80000000);
1065 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1066 && (reg2
& 0x80000000) != (value
& 0x80000000));
1068 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1069 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1070 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1074 void OP_F150 (insn
, extension
)
1075 unsigned long insn
, extension
;
1078 unsigned long reg1
, reg2
, value
;
1080 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1081 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1082 value
= reg1
+ reg2
;
1083 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1086 n
= (value
& 0x80000000);
1088 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1089 && (reg2
& 0x80000000) != (value
& 0x80000000));
1091 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1092 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1093 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1097 void OP_F170 (insn
, extension
)
1098 unsigned long insn
, extension
;
1101 unsigned long reg1
, reg2
, value
;
1103 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1104 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1105 value
= reg1
+ reg2
;
1106 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1109 n
= (value
& 0x80000000);
1111 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1112 && (reg2
& 0x80000000) != (value
& 0x80000000));
1114 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1115 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1116 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1120 void OP_2800 (insn
, extension
)
1121 unsigned long insn
, extension
;
1124 unsigned long reg1
, imm
, value
;
1126 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1127 imm
= SEXT8 (insn
& 0xff);
1129 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = value
;
1132 n
= (value
& 0x80000000);
1134 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1135 && (reg1
& 0x80000000) != (value
& 0x80000000));
1137 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1138 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1139 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1143 void OP_FAC00000 (insn
, extension
)
1144 unsigned long insn
, extension
;
1147 unsigned long reg1
, imm
, value
;
1149 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1150 imm
= SEXT16 (insn
& 0xffff);
1152 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1155 n
= (value
& 0x80000000);
1157 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1158 && (reg1
& 0x80000000) != (value
& 0x80000000));
1160 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1161 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1162 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1166 void OP_FCC00000 (insn
, extension
)
1167 unsigned long insn
, extension
;
1170 unsigned long reg1
, imm
, value
;
1172 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1173 imm
= ((insn
& 0xffff) << 16) + extension
;
1175 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1178 n
= (value
& 0x80000000);
1180 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1181 && (reg1
& 0x80000000) != (value
& 0x80000000));
1183 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1184 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1185 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1189 void OP_2000 (insn
, extension
)
1190 unsigned long insn
, extension
;
1193 unsigned long reg1
, imm
, value
;
1195 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)];
1196 imm
= SEXT8 (insn
& 0xff);
1198 State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)] = value
;
1201 n
= (value
& 0x80000000);
1203 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1204 && (reg1
& 0x80000000) != (value
& 0x80000000));
1206 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1207 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1208 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1212 void OP_FAD00000 (insn
, extension
)
1213 unsigned long insn
, extension
;
1216 unsigned long reg1
, imm
, value
;
1218 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1219 imm
= SEXT16 (insn
& 0xffff);
1221 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1224 n
= (value
& 0x80000000);
1226 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1227 && (reg1
& 0x80000000) != (value
& 0x80000000));
1229 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1230 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1231 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1235 void OP_FCD00000 (insn
, extension
)
1236 unsigned long insn
, extension
;
1239 unsigned long reg1
, imm
, value
;
1241 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1242 imm
= ((insn
& 0xffff) << 16) + extension
;
1244 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1247 n
= (value
& 0x80000000);
1249 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1250 && (reg1
& 0x80000000) != (value
& 0x80000000));
1252 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1253 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1254 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1258 void OP_F8FE00 (insn
, extension
)
1259 unsigned long insn
, extension
;
1261 unsigned long reg1
, imm
, value
;
1263 reg1
= State
.regs
[REG_SP
];
1264 imm
= SEXT8 (insn
& 0xff);
1266 State
.regs
[REG_SP
] = value
;
1270 void OP_FAFE0000 (insn
, extension
)
1271 unsigned long insn
, extension
;
1273 unsigned long reg1
, imm
, value
;
1275 reg1
= State
.regs
[REG_SP
];
1276 imm
= SEXT16 (insn
& 0xffff);
1278 State
.regs
[REG_SP
] = value
;
1282 void OP_FCFE0000 (insn
, extension
)
1283 unsigned long insn
, extension
;
1285 unsigned long reg1
, imm
, value
;
1287 reg1
= State
.regs
[REG_SP
];
1288 imm
= ((insn
& 0xffff) << 16) + extension
;
1290 State
.regs
[REG_SP
] = value
;
1294 void OP_F140 (insn
, extension
)
1295 unsigned long insn
, extension
;
1298 unsigned long reg1
, reg2
, value
;
1300 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1301 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1302 value
= reg1
+ reg2
+ ((PSW
& PSW_C
) != 0);
1303 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1306 n
= (value
& 0x80000000);
1308 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1309 && (reg2
& 0x80000000) != (value
& 0x80000000));
1311 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1312 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1313 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1317 void OP_F100 (insn
, extension
)
1318 unsigned long insn
, extension
;
1321 unsigned long reg1
, reg2
, value
;
1323 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1324 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1325 value
= reg2
- reg1
;
1328 n
= (value
& 0x80000000);
1330 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1331 && (reg2
& 0x80000000) != (value
& 0x80000000));
1333 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1334 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1335 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1336 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1340 void OP_F120 (insn
, extension
)
1341 unsigned long insn
, extension
;
1344 unsigned long reg1
, reg2
, value
;
1346 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1347 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1348 value
= reg2
- reg1
;
1351 n
= (value
& 0x80000000);
1353 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1354 && (reg2
& 0x80000000) != (value
& 0x80000000));
1356 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1357 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1358 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1359 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1363 void OP_F110 (insn
, extension
)
1364 unsigned long insn
, extension
;
1367 unsigned long reg1
, reg2
, value
;
1369 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1370 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1371 value
= reg2
- reg1
;
1374 n
= (value
& 0x80000000);
1376 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1377 && (reg2
& 0x80000000) != (value
& 0x80000000));
1379 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1380 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1381 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1382 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1386 void OP_F130 (insn
, extension
)
1387 unsigned long insn
, extension
;
1390 unsigned long reg1
, reg2
, value
;
1392 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1393 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1394 value
= reg2
- reg1
;
1397 n
= (value
& 0x80000000);
1399 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1400 && (reg2
& 0x80000000) != (value
& 0x80000000));
1402 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1403 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1404 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1405 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
1409 void OP_FCC40000 (insn
, extension
)
1410 unsigned long insn
, extension
;
1413 unsigned long reg1
, imm
, value
;
1415 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1416 imm
= ((insn
& 0xffff) << 16) + extension
;
1420 n
= (value
& 0x80000000);
1422 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1423 && (reg1
& 0x80000000) != (value
& 0x80000000));
1425 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1426 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1427 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1428 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] = value
;
1432 void OP_FCD40000 (insn
, extension
)
1433 unsigned long insn
, extension
;
1436 unsigned long reg1
, imm
, value
;
1438 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1439 imm
= ((insn
& 0xffff) << 16) + extension
;
1443 n
= (value
& 0x80000000);
1445 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1446 && (reg1
& 0x80000000) != (value
& 0x80000000));
1448 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1449 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1450 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1451 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
1455 void OP_F180 (insn
, extension
)
1456 unsigned long insn
, extension
;
1459 unsigned long reg1
, reg2
, value
;
1461 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1462 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1463 value
= reg2
- reg1
- ((PSW
& PSW_C
) != 0);
1466 n
= (value
& 0x80000000);
1468 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1469 && (reg2
& 0x80000000) != (value
& 0x80000000));
1471 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1472 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1473 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1474 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
1478 void OP_F240 (insn
, extension
)
1479 unsigned long insn
, extension
;
1481 unsigned long long temp
;
1484 temp
= (State
.regs
[REG_D0
+ (insn
& 0x3)]
1485 * State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
1486 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1487 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1488 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1489 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1490 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1491 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1495 void OP_F250 (insn
, extension
)
1496 unsigned long insn
, extension
;
1498 unsigned long long temp
;
1501 temp
= (State
.regs
[REG_D0
+ (insn
& 0x3)]
1502 * State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]);
1503 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1504 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1505 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1506 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1507 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1508 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1512 void OP_F260 (insn
, extension
)
1513 unsigned long insn
, extension
;
1518 temp
= State
.regs
[REG_MDR
];
1520 temp
|= State
.regs
[REG_D0
+ (insn
& 0x3)];
1521 State
.regs
[REG_MDR
] = temp
% (long)State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1522 temp
/= (long)State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1523 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1524 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1525 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1526 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1527 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1528 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1532 void OP_F270 (insn
, extension
)
1533 unsigned long insn
, extension
;
1535 unsigned long long temp
;
1538 temp
= State
.regs
[REG_MDR
];
1540 temp
|= State
.regs
[REG_D0
+ (insn
& 0x3)];
1541 State
.regs
[REG_MDR
] = temp
% State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1542 temp
/= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1543 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
& 0xffffffff;
1544 State
.regs
[REG_MDR
] = temp
& 0xffffffff00000000LL
;
1545 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1546 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1547 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1548 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1552 void OP_40 (insn
, extension
)
1553 unsigned long insn
, extension
;
1556 unsigned int value
, imm
, reg1
;
1558 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1561 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = value
;
1564 n
= (value
& 0x80000000);
1566 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1567 && (reg1
& 0x80000000) != (value
& 0x80000000));
1569 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1570 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1571 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1575 void OP_41 (insn
, extension
)
1576 unsigned long insn
, extension
;
1578 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)] += 1;
1582 void OP_50 (insn
, extension
)
1583 unsigned long insn
, extension
;
1585 State
.regs
[REG_A0
+ (insn
& 0x3)] += 4;
1589 void OP_A000 (insn
, extension
)
1590 unsigned long insn
, extension
;
1593 unsigned long reg1
, imm
, value
;
1595 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1596 imm
= SEXT8 (insn
& 0xff);
1600 n
= (value
& 0x80000000);
1602 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1603 && (reg1
& 0x80000000) != (value
& 0x80000000));
1605 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1606 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1607 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1611 void OP_A0 (insn
, extension
)
1612 unsigned long insn
, extension
;
1615 unsigned long reg1
, reg2
, value
;
1617 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1618 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1619 value
= reg2
- reg1
;
1622 n
= (value
& 0x80000000);
1624 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1625 && (reg2
& 0x80000000) != (value
& 0x80000000));
1627 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1628 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1629 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1633 void OP_F1A0 (insn
, extension
)
1634 unsigned long insn
, extension
;
1637 unsigned long reg1
, reg2
, value
;
1639 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1640 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1641 value
= reg2
- reg1
;
1644 n
= (value
& 0x80000000);
1646 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1647 && (reg2
& 0x80000000) != (value
& 0x80000000));
1649 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1650 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1651 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1655 void OP_F190 (insn
, extension
)
1656 unsigned long insn
, extension
;
1659 unsigned long reg1
, reg2
, value
;
1661 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1662 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1663 value
= reg2
- reg1
;
1666 n
= (value
& 0x80000000);
1668 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1669 && (reg2
& 0x80000000) != (value
& 0x80000000));
1671 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1672 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1673 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1677 void OP_B000 (insn
, extension
)
1678 unsigned long insn
, extension
;
1681 unsigned long reg1
, imm
, value
;
1683 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)];
1688 n
= (value
& 0x80000000);
1690 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1691 && (reg1
& 0x80000000) != (value
& 0x80000000));
1693 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1694 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1695 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1699 void OP_B0 (insn
, extension
)
1700 unsigned long insn
, extension
;
1703 unsigned long reg1
, reg2
, value
;
1705 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1706 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1707 value
= reg2
- reg1
;
1710 n
= (value
& 0x80000000);
1712 v
= ((reg2
& 0x80000000) != (reg1
& 0x80000000)
1713 && (reg2
& 0x80000000) != (value
& 0x80000000));
1715 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1716 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1717 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1721 void OP_FAC80000 (insn
, extension
)
1722 unsigned long insn
, extension
;
1725 unsigned long reg1
, imm
, value
;
1727 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1728 imm
= SEXT16 (insn
& 0xffff);
1732 n
= (value
& 0x80000000);
1734 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1735 && (reg1
& 0x80000000) != (value
& 0x80000000));
1737 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1738 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1739 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1743 void OP_FCC80000 (insn
, extension
)
1744 unsigned long insn
, extension
;
1747 unsigned long reg1
, imm
, value
;
1749 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
1750 imm
= ((insn
& 0xffff) << 16) + extension
;
1754 n
= (value
& 0x80000000);
1756 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1757 && (reg1
& 0x80000000) != (value
& 0x80000000));
1759 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1760 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1761 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1765 void OP_FAD80000 (insn
, extension
)
1766 unsigned long insn
, extension
;
1769 unsigned long reg1
, imm
, value
;
1771 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1772 imm
= insn
& 0xffff;
1776 n
= (value
& 0x80000000);
1778 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1779 && (reg1
& 0x80000000) != (value
& 0x80000000));
1781 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1782 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1783 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1787 void OP_FCD80000 (insn
, extension
)
1788 unsigned long insn
, extension
;
1791 unsigned long reg1
, imm
, value
;
1793 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)];
1794 imm
= ((insn
& 0xffff) << 16) + extension
;
1798 n
= (value
& 0x80000000);
1800 v
= ((reg1
& 0x80000000) != (imm
& 0x80000000)
1801 && (reg1
& 0x80000000) != (value
& 0x80000000));
1803 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1804 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1805 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1809 void OP_F200 (insn
, extension
)
1810 unsigned long insn
, extension
;
1814 State
.regs
[REG_D0
+ (insn
& 0x3)] &= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1815 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1816 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1817 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1818 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1822 void OP_F8E000 (insn
, extension
)
1823 unsigned long insn
, extension
;
1827 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] &= (insn
& 0xff);
1828 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
1829 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
1830 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1831 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1835 void OP_FAE00000 (insn
, extension
)
1836 unsigned long insn
, extension
;
1840 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] &= (insn
& 0xffff);
1841 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1842 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1843 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1844 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1848 void OP_FCE00000 (insn
, extension
)
1849 unsigned long insn
, extension
;
1853 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1854 &= ((insn
& 0xffff) << 16) + extension
;
1855 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1856 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1857 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1858 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1861 /* and imm16, psw */
1862 void OP_FAFC0000 (insn
, extension
)
1863 unsigned long insn
, extension
;
1865 PSW
&= (insn
& 0xffff);
1869 void OP_F210 (insn
, extension
)
1870 unsigned long insn
, extension
;
1874 State
.regs
[REG_D0
+ (insn
& 0x3)] |= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1875 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1876 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1877 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1878 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1882 void OP_F8E400 (insn
, extension
)
1883 unsigned long insn
, extension
;
1887 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] |= insn
& 0xff;
1888 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
1889 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
1890 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1891 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1895 void OP_FAE40000 (insn
, extension
)
1896 unsigned long insn
, extension
;
1900 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] |= insn
& 0xffff;
1901 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1902 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1903 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1904 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1908 void OP_FCE40000 (insn
, extension
)
1909 unsigned long insn
, extension
;
1913 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1914 |= ((insn
& 0xffff) << 16) + extension
;
1915 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1916 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1917 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1918 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1922 void OP_FAFD0000 (insn
, extension
)
1923 unsigned long insn
, extension
;
1925 PSW
|= (insn
& 0xffff);
1929 void OP_F220 (insn
, extension
)
1930 unsigned long insn
, extension
;
1934 State
.regs
[REG_D0
+ (insn
& 0x3)] ^= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1935 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1936 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1937 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1938 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1942 void OP_FAE80000 (insn
, extension
)
1943 unsigned long insn
, extension
;
1947 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] ^= insn
& 0xffff;
1948 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1949 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1950 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1951 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1955 void OP_FCE80000 (insn
, extension
)
1956 unsigned long insn
, extension
;
1960 State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)]
1961 ^= ((insn
& 0xffff) << 16) + extension
;
1962 z
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] == 0);
1963 n
= (State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)] & 0x80000000) != 0;
1964 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1965 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1969 void OP_F230 (insn
, extension
)
1970 unsigned long insn
, extension
;
1974 State
.regs
[REG_D0
+ (insn
& 0x3)] = ~State
.regs
[REG_D0
+ (insn
& 0x3)];
1975 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
1976 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
1977 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1978 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
1982 void OP_F8EC00 (insn
, extension
)
1983 unsigned long insn
, extension
;
1988 temp
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
1989 temp
&= (insn
& 0xff);
1990 n
= (temp
& 0x80000000) != 0;
1992 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1993 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
1996 /* btst imm16, dn */
1997 void OP_FAEC0000 (insn
, extension
)
1998 unsigned long insn
, extension
;
2003 temp
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
2004 temp
&= (insn
& 0xffff);
2005 n
= (temp
& 0x80000000) != 0;
2007 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2008 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
2011 /* btst imm32, dn */
2012 void OP_FCEC0000 (insn
, extension
)
2013 unsigned long insn
, extension
;
2018 temp
= State
.regs
[REG_D0
+ ((insn
& 0x30000) >> 16)];
2019 temp
&= ((insn
& 0xffff) << 16) + extension
;
2020 n
= (temp
& 0x80000000) != 0;
2022 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2023 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
2026 /* btst imm8,(abs32) */
2027 void OP_FE020000 (insn
, extension
)
2028 unsigned long insn
, extension
;
2033 temp
= load_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1);
2034 temp
&= (extension
& 0xff);
2035 n
= (temp
& 0x80000000) != 0;
2037 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2038 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
2041 /* btst imm8,(d8,an) */
2042 void OP_FAF80000 (insn
, extension
)
2043 unsigned long insn
, extension
;
2048 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
2049 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
2050 temp
&= (insn
& 0xff);
2051 n
= (temp
& 0x80000000) != 0;
2053 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2054 PSW
|= (z
? PSW_Z
: 0) | (n
? PSW_N
: 0);
2058 void OP_F080 (insn
, extension
)
2059 unsigned long insn
, extension
;
2064 temp
= load_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1);
2065 z
= (temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]) == 0;
2066 temp
|= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2067 store_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1, temp
);
2068 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2069 PSW
|= (z
? PSW_Z
: 0);
2072 /* bset imm8, (abs32) */
2073 void OP_FE000000 (insn
, extension
)
2074 unsigned long insn
, extension
;
2079 temp
= load_mem (((insn
& 0xffff) << 16 | (extension
>> 8)), 1);
2080 z
= (temp
& (extension
& 0xff)) == 0;
2081 temp
|= (extension
& 0xff);
2082 store_mem ((((insn
& 0xffff) << 16) | (extension
>> 8)), 1, temp
);
2083 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2084 PSW
|= (z
? PSW_Z
: 0);
2087 /* bset imm8,(d8,an) */
2088 void OP_FAF00000 (insn
, extension
)
2089 unsigned long insn
, extension
;
2094 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
2095 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
2096 z
= (temp
& (insn
& 0xff)) == 0;
2097 temp
|= (insn
& 0xff);
2098 store_mem (State
.regs
[REG_A0
+ ((insn
& 30000)>> 16)], 1, temp
);
2099 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2100 PSW
|= (z
? PSW_Z
: 0);
2104 void OP_F090 (insn
, extension
)
2105 unsigned long insn
, extension
;
2110 temp
= load_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1);
2111 z
= (temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)]) == 0;
2112 temp
= ~temp
& State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2113 store_mem (State
.regs
[REG_A0
+ (insn
& 3)], 1, temp
);
2114 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2115 PSW
|= (z
? PSW_Z
: 0);
2118 /* bclr imm8, (abs32) */
2119 void OP_FE010000 (insn
, extension
)
2120 unsigned long insn
, extension
;
2125 temp
= load_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1);
2126 z
= (temp
& (extension
& 0xff)) == 0;
2127 temp
= ~temp
& (extension
& 0xff);
2128 store_mem (((insn
& 0xffff) << 16) | (extension
>> 8), 1, temp
);
2129 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2130 PSW
|= (z
? PSW_Z
: 0);
2133 /* bclr imm8,(d8,an) */
2134 void OP_FAF40000 (insn
, extension
)
2135 unsigned long insn
, extension
;
2140 temp
= load_mem ((State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)]
2141 + SEXT8 ((insn
& 0xff00) >> 8)), 1);
2142 z
= (temp
& (insn
& 0xff)) == 0;
2143 temp
= ~temp
& (insn
& 0xff);
2144 store_mem (State
.regs
[REG_A0
+ ((insn
& 30000)>> 16)], 1, temp
);
2145 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2146 PSW
|= (z
? PSW_Z
: 0);
2150 void OP_F2B0 (insn
, extension
)
2151 unsigned long insn
, extension
;
2156 temp
= State
.regs
[REG_D0
+ (insn
& 0x3)];
2158 temp
>>= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2159 State
.regs
[REG_D0
+ (insn
& 0x3)] = temp
;
2160 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2161 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2162 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2163 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2167 void OP_F8C800 (insn
, extension
)
2168 unsigned long insn
, extension
;
2173 temp
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
2175 temp
>>= (insn
& 0xff);
2176 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] = temp
;
2177 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
2178 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
2179 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2180 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2184 void OP_F2A0 (insn
, extension
)
2185 unsigned long insn
, extension
;
2189 c
= State
.regs
[REG_D0
+ (insn
& 0x3)] & 1;
2190 State
.regs
[REG_D0
+ (insn
& 0x3)]
2191 >>= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2192 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2193 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2194 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2195 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2199 void OP_F8C400 (insn
, extension
)
2200 unsigned long insn
, extension
;
2204 c
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 1;
2205 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] >>= (insn
& 0xff);
2206 z
= (State
.regs
[REG_D0
+ ((insn
& 0x3) >> 8)] == 0);
2207 n
= (State
.regs
[REG_D0
+ ((insn
& 0x3) >> 8)] & 0x80000000) != 0;
2208 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
);
2209 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2213 void OP_F290 (insn
, extension
)
2214 unsigned long insn
, extension
;
2218 State
.regs
[REG_D0
+ (insn
& 0x3)]
2219 <<= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
2220 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2221 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2222 PSW
&= ~(PSW_Z
| PSW_N
);
2223 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2227 void OP_F8C000 (insn
, extension
)
2228 unsigned long insn
, extension
;
2232 State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] <<= (insn
& 0xff);
2233 z
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] == 0);
2234 n
= (State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)] & 0x80000000) != 0;
2235 PSW
&= ~(PSW_Z
| PSW_N
);
2236 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2240 void OP_54 (insn
, extension
)
2241 unsigned long insn
, extension
;
2245 State
.regs
[REG_D0
+ (insn
& 0x3)] <<= 2;
2246 z
= (State
.regs
[REG_D0
+ (insn
& 0x3)] == 0);
2247 n
= (State
.regs
[REG_D0
+ (insn
& 0x3)] & 0x80000000) != 0;
2248 PSW
&= ~(PSW_Z
| PSW_N
);
2249 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0));
2253 void OP_F284 (insn
, extension
)
2254 unsigned long insn
, extension
;
2256 unsigned long value
;
2259 value
= State
.regs
[REG_D0
+ (insn
& 0x3)];
2263 value
|= ((PSW
& PSW_C
) != 0) ? 0x80000000 : 0;
2264 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
2266 n
= (value
& 0x80000000) != 0;
2267 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2268 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2272 void OP_F280 (insn
, extension
)
2273 unsigned long insn
, extension
;
2275 unsigned long value
;
2278 value
= State
.regs
[REG_D0
+ (insn
& 0x3)];
2279 c
= (value
& 0x80000000) ? 1 : 0;
2282 value
|= ((PSW
& PSW_C
) != 0);
2283 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
2285 n
= (value
& 0x80000000) != 0;
2286 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
2287 PSW
|= ((z
? PSW_Z
: 0) | (n
? PSW_N
: 0) | (c
? PSW_C
: 0));
2291 void OP_C800 (insn
, extension
)
2292 unsigned long insn
, extension
;
2294 /* The dispatching code will add 2 after we return, so
2295 we subtract two here to make things right. */
2297 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2301 void OP_C900 (insn
, extension
)
2302 unsigned long insn
, extension
;
2304 /* The dispatching code will add 2 after we return, so
2305 we subtract two here to make things right. */
2307 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2311 void OP_C100 (insn
, extension
)
2312 unsigned long insn
, extension
;
2314 /* The dispatching code will add 2 after we return, so
2315 we subtract two here to make things right. */
2317 || (((PSW
& PSW_N
) != 0) ^ ((PSW
& PSW_V
) != 0))))
2318 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2322 void OP_C200 (insn
, extension
)
2323 unsigned long insn
, extension
;
2325 /* The dispatching code will add 2 after we return, so
2326 we subtract two here to make things right. */
2327 if (!(((PSW
& PSW_N
) != 0) ^ ((PSW
& PSW_V
) != 0)))
2328 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2332 void OP_C300 (insn
, extension
)
2333 unsigned long insn
, extension
;
2335 /* The dispatching code will add 2 after we return, so
2336 we subtract two here to make things right. */
2338 || (((PSW
& PSW_N
) != 0) ^ ((PSW
& PSW_V
) != 0)))
2339 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2343 void OP_C000 (insn
, extension
)
2344 unsigned long insn
, extension
;
2346 /* The dispatching code will add 2 after we return, so
2347 we subtract two here to make things right. */
2348 if (((PSW
& PSW_N
) != 0) ^ ((PSW
& PSW_V
) != 0))
2349 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2353 void OP_C500 (insn
, extension
)
2354 unsigned long insn
, extension
;
2356 /* The dispatching code will add 2 after we return, so
2357 we subtract two here to make things right. */
2358 if (!(((PSW
& PSW_C
) != 0) || (PSW
& PSW_Z
) != 0))
2359 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2363 void OP_C600 (insn
, extension
)
2364 unsigned long insn
, extension
;
2366 /* The dispatching code will add 2 after we return, so
2367 we subtract two here to make things right. */
2369 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2373 void OP_C700 (insn
, extension
)
2374 unsigned long insn
, extension
;
2376 /* The dispatching code will add 2 after we return, so
2377 we subtract two here to make things right. */
2378 if (((PSW
& PSW_C
) != 0) || (PSW
& PSW_Z
) != 0)
2379 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2383 void OP_C400 (insn
, extension
)
2384 unsigned long insn
, extension
;
2386 /* The dispatching code will add 2 after we return, so
2387 we subtract two here to make things right. */
2389 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2393 void OP_F8E800 (insn
, extension
)
2394 unsigned long insn
, extension
;
2396 /* The dispatching code will add 3 after we return, so
2397 we subtract two here to make things right. */
2399 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2403 void OP_F8E900 (insn
, extension
)
2404 unsigned long insn
, extension
;
2406 /* The dispatching code will add 3 after we return, so
2407 we subtract two here to make things right. */
2409 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2413 void OP_F8EA00 (insn
, extension
)
2414 unsigned long insn
, extension
;
2416 /* The dispatching code will add 3 after we return, so
2417 we subtract two here to make things right. */
2419 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2423 void OP_F8EB00 (insn
, extension
)
2424 unsigned long insn
, extension
;
2426 /* The dispatching code will add 3 after we return, so
2427 we subtract two here to make things right. */
2429 State
.pc
+= SEXT8 (insn
& 0xff) - 3;
2433 void OP_CA00 (insn
, extension
)
2434 unsigned long insn
, extension
;
2436 /* The dispatching code will add 2 after we return, so
2437 we subtract two here to make things right. */
2438 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
2442 void OP_D8 (insn
, extension
)
2443 unsigned long insn
, extension
;
2449 void OP_D9 (insn
, extension
)
2450 unsigned long insn
, extension
;
2456 void OP_D1 (insn
, extension
)
2457 unsigned long insn
, extension
;
2463 void OP_D2 (insn
, extension
)
2464 unsigned long insn
, extension
;
2470 void OP_D3 (insn
, extension
)
2471 unsigned long insn
, extension
;
2477 void OP_D0 (insn
, extension
)
2478 unsigned long insn
, extension
;
2484 void OP_D5 (insn
, extension
)
2485 unsigned long insn
, extension
;
2491 void OP_D6 (insn
, extension
)
2492 unsigned long insn
, extension
;
2498 void OP_D7 (insn
, extension
)
2499 unsigned long insn
, extension
;
2505 void OP_D4 (insn
, extension
)
2506 unsigned long insn
, extension
;
2512 void OP_DA (insn
, extension
)
2513 unsigned long insn
, extension
;
2519 void OP_DB (insn
, extension
)
2520 unsigned long insn
, extension
;
2526 void OP_F0F4 (insn
, extension
)
2527 unsigned long insn
, extension
;
2529 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
2533 void OP_CC0000 (insn
, extension
)
2534 unsigned long insn
, extension
;
2536 State
.pc
+= SEXT16 (insn
& 0xffff) - 3;
2540 void OP_DC000000 (insn
, extension
)
2541 unsigned long insn
, extension
;
2543 State
.pc
+= (((insn
& 0xffffff) << 8) + extension
) - 5;
2546 /* call label:16,reg_list,imm8 */
2547 void OP_CD000000 (insn
, extension
)
2548 unsigned long insn
, extension
;
2550 unsigned int next_pc
, sp
, adjust
;
2553 sp
= State
.regs
[REG_SP
];
2554 next_pc
= State
.pc
+ 2;
2555 State
.mem
[sp
] = next_pc
& 0xff;
2556 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2557 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2558 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2566 State
.regs
[REG_D0
+ 2] = load_mem (sp
+ adjust
, 4);
2572 State
.regs
[REG_D0
+ 3] = load_mem (sp
+ adjust
, 4);
2578 State
.regs
[REG_A0
+ 2] = load_mem (sp
+ adjust
, 4);
2584 State
.regs
[REG_A0
+ 3] = load_mem (sp
+ adjust
, 4);
2590 State
.regs
[REG_D0
] = load_mem (sp
+ adjust
, 4);
2592 State
.regs
[REG_D0
+ 1] = load_mem (sp
+ adjust
, 4);
2594 State
.regs
[REG_A0
] = load_mem (sp
+ adjust
, 4);
2596 State
.regs
[REG_A0
+ 1] = load_mem (sp
+ adjust
, 4);
2598 State
.regs
[REG_MDR
] = load_mem (sp
+ adjust
, 4);
2600 State
.regs
[REG_LIR
] = load_mem (sp
+ adjust
, 4);
2602 State
.regs
[REG_LAR
] = load_mem (sp
+ adjust
, 4);
2606 /* And make sure to update the stack pointer. */
2607 State
.regs
[REG_SP
] -= extension
;
2608 State
.regs
[REG_MDR
] = next_pc
;
2609 State
.pc
+= SEXT16 ((insn
& 0xffff00) >> 8) - 5;
2612 /* call label:32,reg_list,imm8*/
2613 void OP_DD000000 (insn
, extension
)
2614 unsigned long insn
, extension
;
2616 unsigned int next_pc
, sp
, adjust
;
2619 sp
= State
.regs
[REG_SP
];
2620 next_pc
= State
.pc
+ 2;
2621 State
.mem
[sp
] = next_pc
& 0xff;
2622 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2623 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2624 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2626 mask
= (extension
& 0xff00) >> 8;
2632 State
.regs
[REG_D0
+ 2] = load_mem (sp
+ adjust
, 4);
2638 State
.regs
[REG_D0
+ 3] = load_mem (sp
+ adjust
, 4);
2644 State
.regs
[REG_A0
+ 2] = load_mem (sp
+ adjust
, 4);
2650 State
.regs
[REG_A0
+ 3] = load_mem (sp
+ adjust
, 4);
2656 State
.regs
[REG_D0
] = load_mem (sp
+ adjust
, 4);
2658 State
.regs
[REG_D0
+ 1] = load_mem (sp
+ adjust
, 4);
2660 State
.regs
[REG_A0
] = load_mem (sp
+ adjust
, 4);
2662 State
.regs
[REG_A0
+ 1] = load_mem (sp
+ adjust
, 4);
2664 State
.regs
[REG_MDR
] = load_mem (sp
+ adjust
, 4);
2666 State
.regs
[REG_LIR
] = load_mem (sp
+ adjust
, 4);
2668 State
.regs
[REG_LAR
] = load_mem (sp
+ adjust
, 4);
2672 /* And make sure to update the stack pointer. */
2673 State
.regs
[REG_SP
] -= (extension
& 0xff);
2674 State
.regs
[REG_MDR
] = next_pc
;
2675 State
.pc
+= (((insn
& 0xffffff) << 8) | ((extension
& 0xff0000) >> 16)) - 7;
2679 void OP_F0F0 (insn
, extension
)
2680 unsigned long insn
, extension
;
2682 unsigned int next_pc
, sp
;
2684 sp
= State
.regs
[REG_SP
];
2685 next_pc
= State
.pc
+ 2;
2686 State
.mem
[sp
] = next_pc
& 0xff;
2687 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2688 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2689 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2690 State
.regs
[REG_MDR
] = next_pc
;
2691 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
2694 /* calls label:16 */
2695 void OP_FAFF0000 (insn
, extension
)
2696 unsigned long insn
, extension
;
2698 unsigned int next_pc
, sp
;
2700 sp
= State
.regs
[REG_SP
];
2701 next_pc
= State
.pc
+ 4;
2702 State
.mem
[sp
] = next_pc
& 0xff;
2703 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2704 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2705 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2706 State
.regs
[REG_MDR
] = next_pc
;
2707 State
.pc
+= SEXT16 (insn
& 0xffff) - 4;
2710 /* calls label:32 */
2711 void OP_FCFF0000 (insn
, extension
)
2712 unsigned long insn
, extension
;
2714 unsigned int next_pc
, sp
;
2716 sp
= State
.regs
[REG_SP
];
2717 next_pc
= State
.pc
+ 6;
2718 State
.mem
[sp
] = next_pc
& 0xff;
2719 State
.mem
[sp
+1] = (next_pc
& 0xff00) >> 8;
2720 State
.mem
[sp
+2] = (next_pc
& 0xff0000) >> 16;
2721 State
.mem
[sp
+3] = (next_pc
& 0xff000000) >> 24;
2722 State
.regs
[REG_MDR
] = next_pc
;
2723 State
.pc
+= (((insn
& 0xffff) << 16) + extension
) - 6;
2726 /* ret reg_list, imm8 */
2727 void OP_DF0000 (insn
, extension
)
2728 unsigned long insn
, extension
;
2733 State
.regs
[REG_SP
] += insn
& 0xff;
2734 State
.pc
= State
.regs
[REG_MDR
] - 3;
2735 sp
= State
.regs
[REG_SP
];
2737 mask
= (insn
& 0xff00) >> 8;
2742 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
2744 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
2746 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
2748 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
2750 State
.regs
[REG_A0
] = load_mem (sp
, 4);
2752 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
2754 State
.regs
[REG_D0
] = load_mem (sp
, 4);
2760 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
2766 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
2772 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
2778 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
2783 /* retf reg_list,imm8 */
2784 void OP_DE0000 (insn
, extension
)
2785 unsigned long insn
, extension
;
2790 sp
= State
.regs
[REG_SP
] + (insn
& 0xff);
2791 State
.regs
[REG_SP
] = sp
;
2792 State
.pc
= (State
.mem
[sp
] | (State
.mem
[sp
+1] << 8)
2793 | (State
.mem
[sp
+2] << 16) | (State
.mem
[sp
+3] << 24));
2796 sp
= State
.regs
[REG_SP
];
2798 mask
= (insn
& 0xff00) >> 8;
2803 State
.regs
[REG_LAR
] = load_mem (sp
, 4);
2805 State
.regs
[REG_LIR
] = load_mem (sp
, 4);
2807 State
.regs
[REG_MDR
] = load_mem (sp
, 4);
2809 State
.regs
[REG_A0
+ 1] = load_mem (sp
, 4);
2811 State
.regs
[REG_A0
] = load_mem (sp
, 4);
2813 State
.regs
[REG_D0
+ 1] = load_mem (sp
, 4);
2815 State
.regs
[REG_D0
] = load_mem (sp
, 4);
2821 State
.regs
[REG_A0
+ 3] = load_mem (sp
, 4);
2827 State
.regs
[REG_A0
+ 2] = load_mem (sp
, 4);
2833 State
.regs
[REG_D0
+ 3] = load_mem (sp
, 4);
2839 State
.regs
[REG_D0
+ 2] = load_mem (sp
, 4);
2845 void OP_F0FC (insn
, extension
)
2846 unsigned long insn
, extension
;
2850 sp
= State
.regs
[REG_SP
];
2851 State
.pc
= (State
.mem
[sp
] | (State
.mem
[sp
+1] << 8)
2852 | (State
.mem
[sp
+2] << 16) | (State
.mem
[sp
+3] << 24));
2857 void OP_F0FD (insn
, extension
)
2858 unsigned long insn
, extension
;
2864 void OP_F0FE (insn
, extension
)
2865 unsigned long insn
, extension
;
2867 /* We use this for simulated system calls; we may need to change
2868 it to a reserved instruction if we conflict with uses at
2870 int save_errno
= errno
;
2873 /* Registers passed to trap 0 */
2875 /* Function number. */
2876 #define FUNC (load_mem (State.regs[REG_SP] + 4, 4))
2879 #define PARM1 (load_mem (State.regs[REG_SP] + 8, 4))
2880 #define PARM2 (load_mem (State.regs[REG_SP] + 12, 4))
2881 #define PARM3 (load_mem (State.regs[REG_SP] + 16, 4))
2883 /* Registers set by trap 0 */
2885 #define RETVAL State.regs[0] /* return value */
2886 #define RETERR State.regs[1] /* return error code */
2888 /* Turn a pointer in a register into a pointer into real memory. */
2890 #define MEMPTR(x) (State.mem + x)
2894 #if !defined(__GO32__) && !defined(_WIN32)
2899 RETVAL
= execve (MEMPTR (PARM1
), (char **) MEMPTR (PARM2
),
2900 (char **)MEMPTR (PARM3
));
2903 RETVAL
= execve (MEMPTR (PARM1
), (char **) MEMPTR (PARM2
), NULL
);
2908 RETVAL
= mn10300_callback
->read (mn10300_callback
, PARM1
,
2909 MEMPTR (PARM2
), PARM3
);
2913 RETVAL
= (int)mn10300_callback
->write_stdout (mn10300_callback
,
2914 MEMPTR (PARM2
), PARM3
);
2916 RETVAL
= (int)mn10300_callback
->write (mn10300_callback
, PARM1
,
2917 MEMPTR (PARM2
), PARM3
);
2920 RETVAL
= mn10300_callback
->lseek (mn10300_callback
, PARM1
, PARM2
, PARM3
);
2923 RETVAL
= mn10300_callback
->close (mn10300_callback
, PARM1
);
2926 RETVAL
= mn10300_callback
->open (mn10300_callback
, MEMPTR (PARM1
), PARM2
);
2929 /* EXIT - caller can look in PARM1 to work out the
2931 if (PARM1
== 0xdead || PARM1
== 0x1)
2932 State
.exception
= SIGABRT
;
2934 State
.exception
= SIGQUIT
;
2937 case SYS_stat
: /* added at hmsi */
2938 /* stat system call */
2940 struct stat host_stat
;
2943 RETVAL
= stat (MEMPTR (PARM1
), &host_stat
);
2947 /* Just wild-assed guesses. */
2948 store_mem (buf
, 2, host_stat
.st_dev
);
2949 store_mem (buf
+ 2, 2, host_stat
.st_ino
);
2950 store_mem (buf
+ 4, 4, host_stat
.st_mode
);
2951 store_mem (buf
+ 8, 2, host_stat
.st_nlink
);
2952 store_mem (buf
+ 10, 2, host_stat
.st_uid
);
2953 store_mem (buf
+ 12, 2, host_stat
.st_gid
);
2954 store_mem (buf
+ 14, 2, host_stat
.st_rdev
);
2955 store_mem (buf
+ 16, 4, host_stat
.st_size
);
2956 store_mem (buf
+ 20, 4, host_stat
.st_atime
);
2957 store_mem (buf
+ 28, 4, host_stat
.st_mtime
);
2958 store_mem (buf
+ 36, 4, host_stat
.st_ctime
);
2963 RETVAL
= chown (MEMPTR (PARM1
), PARM2
, PARM3
);
2966 RETVAL
= chmod (MEMPTR (PARM1
), PARM2
);
2969 RETVAL
= time (MEMPTR (PARM1
));
2974 RETVAL
= times (&tms
);
2975 store_mem (PARM1
, 4, tms
.tms_utime
);
2976 store_mem (PARM1
+ 4, 4, tms
.tms_stime
);
2977 store_mem (PARM1
+ 8, 4, tms
.tms_cutime
);
2978 store_mem (PARM1
+ 12, 4, tms
.tms_cstime
);
2981 case SYS_gettimeofday
:
2985 RETVAL
= gettimeofday (&t
, &tz
);
2986 store_mem (PARM1
, 4, t
.tv_sec
);
2987 store_mem (PARM1
+ 4, 4, t
.tv_usec
);
2988 store_mem (PARM2
, 4, tz
.tz_minuteswest
);
2989 store_mem (PARM2
+ 4, 4, tz
.tz_dsttime
);
2993 /* Cast the second argument to void *, to avoid type mismatch
2994 if a prototype is present. */
2995 RETVAL
= utime (MEMPTR (PARM1
), (void *) MEMPTR (PARM2
));
3005 void OP_F0FF (insn
, extension
)
3006 unsigned long insn
, extension
;
3012 void OP_CB (insn
, extension
)
3013 unsigned long insn
, extension
;
3018 void OP_F500 (insn
, extension
)
3019 unsigned long insn
, extension
;
3024 void OP_F6F0 (insn
, extension
)
3025 unsigned long insn
, extension
;
3030 void OP_F600 (insn
, extension
)
3031 unsigned long insn
, extension
;
3036 void OP_F90000 (insn
, extension
)
3037 unsigned long insn
, extension
;
3042 void OP_FB000000 (insn
, extension
)
3043 unsigned long insn
, extension
;
3048 void OP_FD000000 (insn
, extension
)
3049 unsigned long insn
, extension
;
3054 void OP_F610 (insn
, extension
)
3055 unsigned long insn
, extension
;
3060 void OP_F91400 (insn
, extension
)
3061 unsigned long insn
, extension
;
3066 void OP_FB140000 (insn
, extension
)
3067 unsigned long insn
, extension
;
3072 void OP_FD140000 (insn
, extension
)
3073 unsigned long insn
, extension
;
3078 void OP_F640 (insn
, extension
)
3079 unsigned long insn
, extension
;
3084 void OP_F650 (insn
, extension
)
3085 unsigned long insn
, extension
;
3090 void OP_F670 (insn
, extension
)
3091 unsigned long insn
, extension
;