import insight-2000-02-04 snapshot (2nd try)
[external/binutils.git] / sim / mn10200 / simops.c
1 #include "config.h"
2
3 #include <signal.h>
4 #ifdef HAVE_UNISTD_H
5 #include <unistd.h>
6 #endif
7 #include "mn10200_sim.h"
8 #include "simops.h"
9 #include "targ-vals.h"
10 #include "bfd.h"
11 #include <errno.h>
12 #include <sys/stat.h>
13 #include <sys/times.h>
14 #include <sys/time.h>
15
16 #define REG0(X) ((X) & 0x3)
17 #define REG1(X) (((X) & 0xc) >> 2)
18 #define REG0_4(X) (((X) & 0x30) >> 4)
19 #define REG0_8(X) (((X) & 0x300) >> 8)
20 #define REG1_8(X) (((X) & 0xc00) >> 10)
21 #define REG0_16(X) (((X) & 0x30000) >> 16)
22 #define REG1_16(X) (((X) & 0xc0000) >> 18)
23 #define TRUNC(X) ((X) & 0xffffff)
24 \f
25 /* mov imm8, dn */
26 void OP_8000 (insn, extension)
27      unsigned long insn, extension;
28 {
29   State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
30 }
31
32 /* mov dn, dm */
33 void OP_80 (insn, extension)
34      unsigned long insn, extension;
35 {
36   State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
37 }
38
39 /* mov dm, an */
40 void OP_F230 (insn, extension)
41      unsigned long insn, extension;
42 {
43   State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
44 }
45
46 /* mov an, dm */
47 void OP_F2F0 (insn, extension)
48      unsigned long insn, extension;
49 {
50   State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
51 }
52
53 /* mov an, am */
54 void OP_F270 (insn, extension)
55      unsigned long insn, extension;
56 {
57   State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
58 }
59
60 /* mov psw, dn */
61 void OP_F3F0 (insn, extension)
62      unsigned long insn, extension;
63 {
64   State.regs[REG_D0 + REG0 (insn)] = PSW & 0xffff;
65 }
66
67 /* mov dn, psw */
68 void OP_F3D0 (insn, extension)
69      unsigned long insn, extension;
70 {
71   PSW = State.regs[REG_D0 + REG1 (insn)] & 0xffff ;
72 }
73
74 /* mov mdr, dn */
75 void OP_F3E0 (insn, extension)
76      unsigned long insn, extension;
77 {
78   State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR] & 0xffff;
79 }
80
81 /* mov dn, mdr */
82 void OP_F3C0 (insn, extension)
83      unsigned long insn, extension;
84 {
85   State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)] & 0xffff;
86 }
87
88 /* mov (an), dm */
89 void OP_20 (insn, extension)
90      unsigned long insn, extension;
91 {
92   State.regs[REG_D0 + REG0 (insn)]
93     = SEXT16 (load_half (State.regs[REG_A0 + REG1 (insn)]));
94 }
95
96 /* mov (d8,an), dm */
97 void OP_6000 (insn, extension)
98      unsigned long insn, extension;
99 {
100   State.regs[REG_D0 + REG0_8 (insn)]
101     = SEXT16 (load_half ((State.regs[REG_A0 + REG1_8 (insn)]
102                          + SEXT8 (insn & 0xff))));
103 }
104
105 /* mov (d16,an), dm */
106 void OP_F7C00000 (insn, extension)
107      unsigned long insn, extension;
108 {
109   State.regs[REG_D0 + REG0_16 (insn)]
110     = SEXT16 (load_half ((State.regs[REG_A0 + REG1_16 (insn)]
111               + SEXT16 (insn & 0xffff))));
112 }
113
114 /* mov (d24,am), dn */
115 void OP_F4800000 (insn, extension)
116      unsigned long insn, extension;
117 {
118   State.regs[REG_D0 + REG0_16 (insn)]
119     = SEXT16 (load_half ((State.regs[REG_A0 + REG1_16 (insn)]
120                          + SEXT24 (((insn & 0xffff) << 8) + extension))));
121 }
122
123 /* mov (di,an), dm */
124 void OP_F140 (insn, extension)
125      unsigned long insn, extension;
126 {
127   State.regs[REG_D0 + REG0 (insn)]
128     = SEXT16 (load_half ((State.regs[REG_A0 + REG1 (insn)]
129                          + State.regs[REG_D0 + REG0_4 (insn)])));
130 }
131
132 /* mov (abs16), dn */
133 void OP_C80000 (insn, extension)
134      unsigned long insn, extension;
135 {
136   State.regs[REG_D0 + REG0_16 (insn)] = SEXT16 (load_half ((insn & 0xffff)));
137 }
138
139 /* mov (abs24), dn */
140 void OP_F4C00000 (insn, extension)
141      unsigned long insn, extension;
142 {
143   State.regs[REG_D0 + REG0_16 (insn)]
144     = SEXT16 (load_half ((((insn & 0xffff) << 8) + extension)));
145 }
146
147 /* mov (d8,an), am */
148 void OP_7000 (insn, extension)
149      unsigned long insn, extension;
150 {
151   State.regs[REG_A0 + REG0_8 (insn)]
152     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_8 (insn)]
153                          + SEXT8 (insn & 0xff))));
154 }
155
156 /* mov (d16,an), am */
157 void OP_F7B00000 (insn, extension)
158      unsigned long insn, extension;
159 {
160   State.regs[REG_A0 + REG0_16 (insn)]
161     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
162                          + SEXT16 (insn & 0xffff))));
163 }
164
165 /* mov (d24,am), an */
166 void OP_F4F00000 (insn, extension)
167      unsigned long insn, extension;
168 {
169   State.regs[REG_A0 + REG0_16 (insn)]
170     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
171                            + SEXT24 (((insn & 0xffff) << 8) + extension))));
172 }
173
174 /* mov (di,an), am */
175 void OP_F100 (insn, extension)
176      unsigned long insn, extension;
177 {
178   State.regs[REG_A0 + REG0 (insn)]
179     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1 (insn)]
180                            + State.regs[REG_D0 + REG0_4 (insn)])));
181 }
182
183 /* mov (abs16), an */
184 void OP_F7300000 (insn, extension)
185      unsigned long insn, extension;
186 {
187   State.regs[REG_A0 + REG0_16 (insn)] = SEXT24 (load_3_byte ((insn & 0xffff)));
188 }
189
190 /* mov (abs24), an */
191 void OP_F4D00000 (insn, extension)
192      unsigned long insn, extension;
193 {
194   State.regs[REG_A0 + REG0_16 (insn)]
195     = SEXT24 (load_3_byte ((((insn & 0xffff) << 8) + extension)));
196 }
197
198 /* mov dm, (an) */
199 void OP_0 (insn, extension)
200      unsigned long insn, extension;
201 {
202   store_half (State.regs[REG_A0 + REG1 (insn)],
203               State.regs[REG_D0 + REG0 (insn)]);
204 }
205
206 /* mov dm, (d8,an) */
207 void OP_4000 (insn, extension)
208      unsigned long insn, extension;
209 {
210   store_half (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
211               State.regs[REG_D0 + REG0_8 (insn)]);
212 }
213
214 /* mov dm, (d16,an) */
215 void OP_F7800000 (insn, extension)
216      unsigned long insn, extension;
217 {
218   store_half (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
219               State.regs[REG_D0 + REG0_16 (insn)]);
220 }
221
222 /* mov dm, (d24,am) */
223 void OP_F4000000 (insn, extension)
224      unsigned long insn, extension;
225 {
226   store_half ((State.regs[REG_A0 + REG1_16 (insn)]
227                + SEXT24 (((insn & 0xffff) << 8) + extension)),
228               State.regs[REG_D0 + REG0_16 (insn)]);
229 }
230
231 /* mov dm, (di,an) */
232 void OP_F1C0 (insn, extension)
233      unsigned long insn, extension;
234 {
235   store_half ((State.regs[REG_A0 + REG1 (insn)]
236                + State.regs[REG_D0 + REG0_4 (insn)]),
237               State.regs[REG_D0 + REG0 (insn)]);
238 }
239
240 /* mov dn, (abs16) */
241 void OP_C00000 (insn, extension)
242      unsigned long insn, extension;
243 {
244   store_half ((insn & 0xffff), State.regs[REG_D0 + REG0_16 (insn)]);
245 }
246
247 /* mov dn, (abs24) */
248 void OP_F4400000 (insn, extension)
249      unsigned long insn, extension;
250 {
251   store_half (SEXT24 (((insn & 0xffff) << 8) + extension),
252              State.regs[REG_D0 + REG0_16 (insn)]);
253 }
254
255 /* mov am, (d8,an) */
256 void OP_5000 (insn, extension)
257      unsigned long insn, extension;
258 {
259   store_3_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
260                 State.regs[REG_A0 + REG0_8 (insn)]);
261 }
262
263 /* mov am, (d16,an) */
264 void OP_F7A00000 (insn, extension)
265      unsigned long insn, extension;
266 {
267   store_3_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
268                 State.regs[REG_A0 + REG0_16 (insn)]);
269 }
270
271 /* mov am, (d24,an) */
272 void OP_F4100000 (insn, extension)
273      unsigned long insn, extension;
274 {
275   store_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
276                  + SEXT24 (((insn & 0xffff) << 8) + extension)),
277                 State.regs[REG_A0 + REG0_16 (insn)]);
278 }
279
280 /* mov am, (di,an) */
281 void OP_F180 (insn, extension)
282      unsigned long insn, extension;
283 {
284   store_3_byte ((State.regs[REG_A0 + REG1 (insn)]
285                  + State.regs[REG_D0 + REG0_4 (insn)]),
286                 State.regs[REG_A0 + REG0 (insn)]);
287 }
288
289 /* mov an, (abs16) */
290 void OP_F7200000 (insn, extension)
291      unsigned long insn, extension;
292 {
293   store_3_byte ((insn & 0xffff), State.regs[REG_A0 + REG0_16 (insn)]);
294 }
295
296 /* mov an, (abs24) */
297 void OP_F4500000 (insn, extension)
298      unsigned long insn, extension;
299 {
300   store_3_byte (SEXT24 (((insn & 0xffff) << 8) + extension),
301                 State.regs[REG_A0 + REG0_16 (insn)]);
302 }
303
304 /* mov imm16, dn */
305 void OP_F80000 (insn, extension)
306      unsigned long insn, extension;
307 {
308   State.regs[REG_D0 + REG0_16 (insn)] = SEXT16 (insn & 0xffff);
309 }
310
311 /* mov imm24, dn */
312 void OP_F4700000 (insn, extension)
313      unsigned long insn, extension;
314 {
315   State.regs[REG_D0 + REG0_16 (insn)]
316     = SEXT24 (((insn & 0xffff) << 8) + extension);
317 }
318
319 /* mov imm16, an */
320 void OP_DC0000 (insn, extension)
321      unsigned long insn, extension;
322 {
323   State.regs[REG_A0 + REG0_16 (insn)] = insn & 0xffff;
324 }
325
326 /* mov imm24, an */
327 void OP_F4740000 (insn, extension)
328      unsigned long insn, extension;
329 {
330   State.regs[REG_A0 + REG0_16 (insn)]
331     = SEXT24 (((insn & 0xffff) << 8) + extension);
332 }
333
334 /* movx (d8,an), dm */
335 void OP_F57000 (insn, extension)
336      unsigned long insn, extension;
337 {
338   State.regs[REG_D0 + REG0_8 (insn)]
339     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_8 (insn)]
340                            + SEXT8 (insn & 0xff))));
341 }
342
343 /* movx (d16,an), dm */
344 void OP_F7700000 (insn, extension)
345      unsigned long insn, extension;
346 {
347   State.regs[REG_D0 + REG0_16 (insn)]
348     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
349                            + SEXT16 (insn & 0xffff))));
350 }
351
352 /* movx (d24,am), dn */
353 void OP_F4B00000 (insn, extension)
354      unsigned long insn, extension;
355 {
356   State.regs[REG_D0 + REG0_16 (insn)]
357     = SEXT24 (load_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
358                            + SEXT24 (((insn & 0xffff) << 8) + extension))));
359 }
360
361 /* movx dm, (d8,an) */
362 void OP_F55000 (insn, extension)
363      unsigned long insn, extension;
364 {
365   store_3_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
366                 State.regs[REG_D0 + REG0_8 (insn)]);
367 }
368
369 /* movx dm, (d16,an) */
370 void OP_F7600000 (insn, extension)
371      unsigned long insn, extension;
372 {
373   store_3_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
374                 State.regs[REG_D0 + REG0_16 (insn)]);
375 }
376
377 /* movx dm, (d24,am) */
378 void OP_F4300000 (insn, extension)
379      unsigned long insn, extension;
380 {
381   store_3_byte ((State.regs[REG_A0 + REG1_16 (insn)]
382                  + SEXT24 (((insn & 0xffff) << 8) + extension)),
383                 State.regs[REG_D0 + REG0_16 (insn)]);
384 }
385
386 /* movb (d8,an), dm */
387 void OP_F52000 (insn, extension)
388      unsigned long insn, extension;
389 {
390   State.regs[REG_D0 + REG0_8 (insn)]
391     = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_8 (insn)]
392                         + SEXT8 (insn & 0xff))));
393 }
394
395 /* movb (d16,an), dm */
396 void OP_F7D00000 (insn, extension)
397      unsigned long insn, extension;
398 {
399   State.regs[REG_D0 + REG0_16 (insn)]
400     = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
401                         + SEXT16 (insn & 0xffff))));
402 }
403
404 /* movb (d24,am), dn */
405 void OP_F4A00000 (insn, extension)
406      unsigned long insn, extension;
407 {
408   State.regs[REG_D0 + REG0_16 (insn)]
409     = SEXT8 (load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
410                         + SEXT24 (((insn & 0xffff) << 8) + extension))));
411 }
412
413 /* movb (di,an), dm */
414 void OP_F040 (insn, extension)
415      unsigned long insn, extension;
416 {
417   State.regs[REG_D0 + REG0 (insn)]
418     = SEXT8 (load_byte ((State.regs[REG_A0 + REG1 (insn)]
419                         + State.regs[REG_D0 + REG0_4 (insn)])));
420 }
421
422 /* mov (abs24), dn */
423 void OP_F4C40000 (insn, extension)
424      unsigned long insn, extension;
425 {
426   State.regs[REG_D0 + REG0_16 (insn)]
427     = SEXT8 (load_byte ((((insn & 0xffff) << 8) + extension)));
428 }
429
430 /* movb dm, (an) */
431 void OP_10 (insn, extension)
432      unsigned long insn, extension;
433 {
434   store_byte (State.regs[REG_A0 + REG1 (insn)],
435               State.regs[REG_D0 + REG0 (insn)]);
436 }
437
438 /* movb dm, (d8,an) */
439 void OP_F51000 (insn, extension)
440      unsigned long insn, extension;
441 {
442   store_byte (State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff),
443               State.regs[REG_D0 + REG0_8 (insn)]);
444 }
445
446 /* movb dm, (d16,an) */
447 void OP_F7900000 (insn, extension)
448      unsigned long insn, extension;
449 {
450   store_byte (State.regs[REG_A0 + REG1_16 (insn)] + SEXT16 (insn & 0xffff),
451               State.regs[REG_D0 + REG0_16 (insn)]);
452 }
453
454 /* movb dm, (d24,am) */
455 void OP_F4200000 (insn, extension)
456      unsigned long insn, extension;
457 {
458   store_byte ((State.regs[REG_A0 + REG1_16 (insn)]
459               + SEXT24 (((insn & 0xffff) << 8) + extension)),
460               State.regs[REG_D0 + REG0_16 (insn)]);
461 }
462
463 /* movb dm, (di,an) */
464 void OP_F0C0 (insn, extension)
465      unsigned long insn, extension;
466 {
467   store_byte ((State.regs[REG_A0 + REG1 (insn)]
468               + State.regs[REG_D0 + REG0_4 (insn)]),
469               State.regs[REG_D0 + REG0 (insn)]);
470 }
471
472 /* movb dn, (abs16) */
473 void OP_C40000 (insn, extension)
474      unsigned long insn, extension;
475 {
476   store_byte ((insn & 0xffff), State.regs[REG_D0 + REG0_16 (insn)]);
477 }
478
479 /* movb dn, (abs24) */
480 void OP_F4440000 (insn, extension)
481      unsigned long insn, extension;
482 {
483   store_byte (SEXT24 (((insn & 0xffff) << 8) + extension),
484              State.regs[REG_D0 + REG0_16 (insn)]);
485 }
486
487 /* movbu (an), dm */
488 void OP_30 (insn, extension)
489      unsigned long insn, extension;
490 {
491   State.regs[REG_D0 + REG0 (insn)]
492     = load_byte (State.regs[REG_A0 + REG1 (insn)]);
493 }
494
495 /* movbu (d8,an), dm */
496 void OP_F53000 (insn, extension)
497      unsigned long insn, extension;
498 {
499   State.regs[REG_D0 + REG0_8 (insn)]
500     = load_byte ((State.regs[REG_A0 + REG1_8 (insn)] + SEXT8 (insn & 0xff)));
501 }
502
503 /* movbu (d16,an), dm */
504 void OP_F7500000 (insn, extension)
505      unsigned long insn, extension;
506 {
507   State.regs[REG_D0 + REG0_16 (insn)]
508     = load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
509                   + SEXT16 (insn & 0xffff)));
510 }
511
512 /* movbu (d24,am), dn */
513 void OP_F4900000 (insn, extension)
514      unsigned long insn, extension;
515 {
516   State.regs[REG_D0 + REG0_16 (insn)]
517     = load_byte ((State.regs[REG_A0 + REG1_16 (insn)]
518                   + SEXT24 (((insn & 0xffff) << 8) + extension)));
519 }
520
521 /* movbu (di,an), dm */
522 void OP_F080 (insn, extension)
523      unsigned long insn, extension;
524 {
525   State.regs[REG_D0 + REG0 (insn)]
526     = load_byte ((State.regs[REG_A0 + REG1 (insn)]
527                   + State.regs[REG_D0 + REG0_4 (insn)]));
528 }
529
530 /* movbu (abs16), dn */
531 void OP_CC0000 (insn, extension)
532      unsigned long insn, extension;
533 {
534   State.regs[REG_D0 + REG0_16 (insn)] = load_byte ((insn & 0xffff));
535 }
536
537 /* movbu (abs24), dn */
538 void OP_F4C80000 (insn, extension)
539      unsigned long insn, extension;
540 {
541   State.regs[REG_D0 + REG0_16 (insn)]
542     = load_byte ((((insn & 0xffff) << 8) + extension));
543 }
544
545 /* ext dn */
546 void OP_F3C1 (insn, extension)
547      unsigned long insn, extension;
548 {
549   if (State.regs[REG_D0 + REG1 (insn)] & 0x8000)
550     State.regs[REG_MDR] = 0xffff;
551   else
552     State.regs[REG_MDR] = 0;
553 }
554
555 /* extx dn */
556 void OP_B0 (insn, extension)
557      unsigned long insn, extension;
558 {
559   State.regs[REG_D0 + REG0 (insn)] = SEXT16 (State.regs[REG_D0 + REG0 (insn)]);
560 }
561
562 /* extxu dn */
563 void OP_B4 (insn, extension)
564      unsigned long insn, extension;
565 {
566   State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
567 }
568
569 /* extxb dn */
570 void OP_B8 (insn, extension)
571      unsigned long insn, extension;
572 {
573   State.regs[REG_D0 + REG0 (insn)] = SEXT8 (State.regs[REG_D0 + REG0 (insn)]);
574 }
575
576 /* extxbu dn */
577 void OP_BC (insn, extension)
578      unsigned long insn, extension;
579 {
580   State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG0 (insn)] & 0xff;
581 }
582
583 /* add dn,dm */
584 void OP_90 (insn, extension)
585      unsigned long insn, extension;
586 {
587   int z, c, n, v, zx, cx, nx, vx;
588   unsigned long reg1, reg2, value;
589
590   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
591   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
592   value = TRUNC (reg1 + reg2);
593   State.regs[REG_D0 + REG0 (insn)] = value;
594
595   z = ((value & 0xffff) == 0);
596   zx = (value == 0);
597   n = (value & 0x8000);
598   nx = (value & 0x800000);
599   c = ((value & 0xffff) < (reg1 & 0xffff))
600        || ((value & 0xffff) < (reg2 & 0xffff));
601   cx = (value < reg1) || (value < reg2);
602   v = ((reg2 & 0x8000) == (reg1 & 0x8000)
603        && (reg2 & 0x8000) != (value & 0x8000));
604   vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
605         && (reg2 & 0x800000) != (value & 0x800000));
606
607   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
608            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
609   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
610           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
611           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
612           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
613 }
614
615 /* add dm, an */
616 void OP_F200 (insn, extension)
617      unsigned long insn, extension;
618 {
619   int z, c, n, v, zx, cx, nx, vx;
620   unsigned long reg1, reg2, value;
621
622   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
623   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
624   value = TRUNC (reg1 + reg2);
625   State.regs[REG_A0 + REG0 (insn)] = value;
626
627   z = ((value & 0xffff) == 0);
628   zx = (value == 0);
629   n = (value & 0x8000);
630   nx = (value & 0x800000);
631   c = ((value & 0xffff) < (reg1 & 0xffff))
632        || ((value & 0xffff) < (reg2 & 0xffff));
633   cx = (value < reg1) || (value < reg2);
634   v = ((reg2 & 0x8000) == (reg1 & 0x8000)
635        && (reg2 & 0x8000) != (value & 0x8000));
636   vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
637         && (reg2 & 0x800000) != (value & 0x800000));
638
639   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
640            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
641   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
642           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
643           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
644           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
645 }
646
647 /* add an, dm */
648 void OP_F2C0 (insn, extension)
649      unsigned long insn, extension;
650 {
651   int z, c, n, v, zx, cx, nx, vx;
652   unsigned long reg1, reg2, value;
653
654   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
655   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
656   value = TRUNC (reg1 + reg2);
657   State.regs[REG_D0 + REG0 (insn)] = value;
658
659   z = ((value & 0xffff) == 0);
660   zx = (value == 0);
661   n = (value & 0x8000);
662   nx = (value & 0x800000);
663   c = ((value & 0xffff) < (reg1 & 0xffff))
664        || ((value & 0xffff) < (reg2 & 0xffff));
665   cx = (value < reg1) || (value < reg2);
666   v = ((reg2 & 0x8000) == (reg1 & 0x8000)
667        && (reg2 & 0x8000) != (value & 0x8000));
668   vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
669         && (reg2 & 0x800000) != (value & 0x800000));
670
671   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
672            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
673   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
674           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
675           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
676           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
677 }
678
679 /* add an,am */
680 void OP_F240 (insn, extension)
681      unsigned long insn, extension;
682 {
683   int z, c, n, v, zx, cx, nx, vx;
684   unsigned long reg1, reg2, value;
685
686   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
687   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
688   value = TRUNC (reg1 + reg2);
689   State.regs[REG_A0 + REG0 (insn)] = value;
690
691   z = ((value & 0xffff) == 0);
692   zx = (value == 0);
693   n = (value & 0x8000);
694   nx = (value & 0x800000);
695   c = ((value & 0xffff) < (reg1 & 0xffff))
696        || ((value & 0xffff) < (reg2 & 0xffff));
697   cx = (value < reg1) || (value < reg2);
698   v = ((reg2 & 0x8000) == (reg1 & 0x8000)
699        && (reg2 & 0x8000) != (value & 0x8000));
700   vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
701         && (reg2 & 0x800000) != (value & 0x800000));
702
703   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
704            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
705   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
706           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
707           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
708           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
709 }
710
711 /* add imm8, dn */
712 void OP_D400 (insn, extension)
713      unsigned long insn, extension;
714 {
715   int z, c, n, v, zx, cx, nx, vx;
716   unsigned long reg1, imm, value;
717
718   reg1 = TRUNC (State.regs[REG_D0 + REG0_8 (insn)]);
719   imm = TRUNC (SEXT8 (insn & 0xff));
720   value = TRUNC (reg1 + imm);
721   State.regs[REG_D0 + REG0_8 (insn)] = value;
722
723   z = ((value & 0xffff) == 0);
724   zx = (value == 0);
725   n = (value & 0x8000);
726   nx = (value & 0x800000);
727   c = ((value & 0xffff) < (reg1 & 0xffff))
728        || ((value & 0xffff) < (imm & 0xffff));
729   cx = (value < reg1) || (value < imm);
730   v = ((reg1 & 0x8000) == (imm & 0x8000)
731        && (reg1 & 0x8000) != (value & 0x8000));
732   vx = ((reg1 & 0x800000) == (imm & 0x800000)
733         && (reg1 & 0x800000) != (value & 0x800000));
734
735   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
736            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
737   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
738           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
739           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
740           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
741 }
742
743 /* add imm16, dn */
744 void OP_F7180000 (insn, extension)
745      unsigned long insn, extension;
746 {
747   int z, c, n, v, zx, cx, nx, vx;
748   unsigned long reg1, imm, value;
749
750   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
751   imm = TRUNC (SEXT16 (insn & 0xffff));
752   value = TRUNC (reg1 + imm);
753   State.regs[REG_D0 + REG0_16 (insn)] = value;
754
755   z = ((value & 0xffff) == 0);
756   zx = (value == 0);
757   n = (value & 0x8000);
758   nx = (value & 0x800000);
759   c = ((value & 0xffff) < (reg1 & 0xffff))
760        || ((value & 0xffff) < (imm & 0xffff));
761   cx = (value < reg1) || (value < imm);
762   v = ((reg1 & 0x8000) == (imm & 0x8000)
763        && (reg1 & 0x8000) != (value & 0x8000));
764   vx = ((reg1 & 0x800000) == (imm & 0x800000)
765         && (reg1 & 0x800000) != (value & 0x800000));
766
767   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
768            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
769   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
770           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
771           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
772           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
773 }
774
775 /* add imm24,dn */
776 void OP_F4600000 (insn, extension)
777      unsigned long insn, extension;
778 {
779   int z, c, n, v, zx, cx, nx, vx;
780   unsigned long reg1, imm, value;
781
782   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
783   imm = TRUNC (((insn & 0xffff) << 8) + extension);
784   value = TRUNC (reg1 + imm);
785   State.regs[REG_D0 + REG0_16 (insn)] = value;
786
787   z = ((value & 0xffff) == 0);
788   zx = (value == 0);
789   n = (value & 0x8000);
790   nx = (value & 0x800000);
791   c = ((value & 0xffff) < (reg1 & 0xffff))
792        || ((value & 0xffff) < (imm & 0xffff));
793   cx = (value < reg1) || (value < imm);
794   v = ((reg1 & 0x8000) == (imm & 0x8000)
795        && (reg1 & 0x8000) != (value & 0x8000));
796   vx = ((reg1 & 0x800000) == (imm & 0x800000)
797         && (reg1 & 0x800000) != (value & 0x800000));
798
799   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
800            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
801   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
802           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
803           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
804           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
805 }
806
807 /* add imm8, an */
808 void OP_D000 (insn, extension)
809      unsigned long insn, extension;
810 {
811   int z, c, n, v, zx, cx, nx, vx;
812   unsigned long reg1, imm, value;
813
814   reg1 = TRUNC (State.regs[REG_A0 + REG0_8 (insn)]);
815   imm = TRUNC (SEXT8 (insn & 0xff));
816   value = TRUNC (reg1 + imm);
817   State.regs[REG_A0 + REG0_8 (insn)] = value;
818
819   z = ((value & 0xffff) == 0);
820   zx = (value == 0);
821   n = (value & 0x8000);
822   nx = (value & 0x800000);
823   c = ((value & 0xffff) < (reg1 & 0xffff))
824        || ((value & 0xffff) < (imm & 0xffff));
825   cx = (value < reg1) || (value < imm);
826   v = ((reg1 & 0x8000) == (imm & 0x8000)
827        && (reg1 & 0x8000) != (value & 0x8000));
828   vx = ((reg1 & 0x800000) == (imm & 0x800000)
829         && (reg1 & 0x800000) != (value & 0x800000));
830
831   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
832            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
833   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
834           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
835           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
836           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
837 }
838
839 /* add imm16, an */
840 void OP_F7080000 (insn, extension)
841      unsigned long insn, extension;
842 {
843   int z, c, n, v, zx, cx, nx, vx;
844   unsigned long reg1, imm, value;
845
846   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
847   imm = TRUNC (SEXT16 (insn & 0xffff));
848   value = TRUNC (reg1 + imm);
849   State.regs[REG_A0 + REG0_16 (insn)] = value;
850
851   z = ((value & 0xffff) == 0);
852   zx = (value == 0);
853   n = (value & 0x8000);
854   nx = (value & 0x800000);
855   c = ((value & 0xffff) < (reg1 & 0xffff))
856        || ((value & 0xffff) < (imm & 0xffff));
857   cx = (value < reg1) || (value < imm);
858   v = ((reg1 & 0x8000) == (imm & 0x8000)
859        && (reg1 & 0x8000) != (value & 0x8000));
860   vx = ((reg1 & 0x800000) == (imm & 0x800000)
861         && (reg1 & 0x800000) != (value & 0x800000));
862
863   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
864            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
865   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
866           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
867           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
868           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
869 }
870
871 /* add imm24, an */
872 void OP_F4640000 (insn, extension)
873      unsigned long insn, extension;
874 {
875   int z, c, n, v, zx, cx, nx, vx;
876   unsigned long reg1, imm, value;
877
878   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
879   imm = TRUNC (((insn & 0xffff) << 8) + extension);
880   value = TRUNC (reg1 + imm);
881   State.regs[REG_A0 + REG0_16 (insn)] = value;
882
883   z = ((value & 0xffff) == 0);
884   zx = (value == 0);
885   n = (value & 0x8000);
886   nx = (value & 0x800000);
887   c = ((value & 0xffff) < (reg1 & 0xffff)) || ((value & 0xffff) < (imm & 0xffff));
888   cx = (value < reg1) || (value < imm);
889   v = ((reg1 & 0x8000) == (imm & 0x8000)
890        && (reg1 & 0x8000) != (value & 0x8000));
891   vx = ((reg1 & 0x800000) == (imm & 0x800000)
892         && (reg1 & 0x800000) != (value & 0x800000));
893
894   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
895            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
896   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
897           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
898           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
899           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
900 }
901
902 /* addc dm,dn */
903 void OP_F280 (insn, extension)
904      unsigned long insn, extension;
905 {
906   int z, c, n, v, zx, cx, nx, vx;
907   unsigned long reg1, reg2, value;
908
909   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
910   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
911   value = TRUNC (reg1 + reg2 + ((PSW & PSW_CF) != 0));
912   State.regs[REG_D0 + REG0 (insn)] = value;
913
914   z = ((value & 0xffff) == 0);
915   zx = (value == 0);
916   n = (value & 0x8000);
917   nx = (value & 0x800000);
918   c = ((value & 0xffff) < (reg1 & 0xffff))
919        || ((value & 0xffff) < (reg2 & 0xffff));
920   cx = (value < reg1) || (value < reg2);
921   v = ((reg2 & 0x8000) == (reg1 & 0x8000)
922        && (reg2 & 0x8000) != (value & 0x8000));
923   vx = ((reg2 & 0x800000) == (reg1 & 0x800000)
924         && (reg2 & 0x800000) != (value & 0x800000));
925
926   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
927            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
928   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
929           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
930           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
931           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
932 }
933
934 /* addnf imm8, an */
935 void OP_F50C00 (insn, extension)
936      unsigned long insn, extension;
937 {
938   unsigned long reg1, imm, value;
939
940   reg1 = State.regs[REG_A0 + REG0_8 (insn)];
941   imm = SEXT8 (insn & 0xff);
942   value = reg1 + imm;
943   State.regs[REG_A0 + REG0_8 (insn)] = TRUNC (value);
944 }
945
946 /* sub dn, dm */
947 void OP_A0 (insn, extension)
948      unsigned long insn, extension;
949 {
950   int z, c, n, v, zx, cx, nx, vx;
951   unsigned long reg1, reg2, value;
952
953   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
954   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
955   value = TRUNC (reg2 - reg1);
956   State.regs[REG_D0 + REG0 (insn)] = value;
957
958   z = ((value & 0xffff) == 0);
959   zx = (value == 0);
960   n = (value & 0x8000);
961   nx = (value & 0x800000);
962   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
963   cx = (reg1 > reg2);
964   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
965        && (reg2 & 0x8000) != (value & 0x8000));
966   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
967         && (reg2 & 0x800000) != (value & 0x800000));
968
969   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
970            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
971   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
972           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
973           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
974           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
975 }
976
977 /* sub dm, an */
978 void OP_F210 (insn, extension)
979      unsigned long insn, extension;
980 {
981   int z, c, n, v, zx, cx, nx, vx;
982   unsigned long reg1, reg2, value;
983
984   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
985   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
986   value = TRUNC (reg2 - reg1);
987   State.regs[REG_A0 + REG0 (insn)] = value;
988
989   z = ((value & 0xffff) == 0);
990   zx = (value == 0);
991   n = (value & 0x8000);
992   nx = (value & 0x800000);
993   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
994   cx = (reg1 > reg2);
995   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
996        && (reg2 & 0x8000) != (value & 0x8000));
997   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
998         && (reg2 & 0x800000) != (value & 0x800000));
999
1000   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1001            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1002   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1003           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1004           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1005           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1006 }
1007
1008 /* sub an, dm */
1009 void OP_F2D0 (insn, extension)
1010      unsigned long insn, extension;
1011 {
1012   int z, c, n, v, zx, cx, nx, vx;
1013   unsigned long reg1, reg2, value;
1014
1015   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1016   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1017   value = TRUNC (reg2 - reg1);
1018   State.regs[REG_D0 + REG0 (insn)] = value;
1019
1020   z = ((value & 0xffff) == 0);
1021   zx = (value == 0);
1022   n = (value & 0x8000);
1023   nx = (value & 0x800000);
1024   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1025   cx = (reg1 > reg2);
1026   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1027        && (reg2 & 0x8000) != (value & 0x8000));
1028   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1029         && (reg2 & 0x800000) != (value & 0x800000));
1030
1031   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1032            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1033   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1034           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1035           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1036           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1037 }
1038
1039 /* sub an, am */
1040 void OP_F250 (insn, extension)
1041      unsigned long insn, extension;
1042 {
1043   int z, c, n, v, zx, cx, nx, vx;
1044   unsigned long reg1, reg2, value;
1045
1046   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1047   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1048   value = TRUNC (reg2 - reg1);
1049   State.regs[REG_A0 + REG0 (insn)] = value;
1050
1051   z = ((value & 0xffff) == 0);
1052   zx = (value == 0);
1053   n = (value & 0x8000);
1054   nx = (value & 0x800000);
1055   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1056   cx = (reg1 > reg2);
1057   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1058        && (reg2 & 0x8000) != (value & 0x8000));
1059   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1060         && (reg2 & 0x800000) != (value & 0x800000));
1061
1062   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1063            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1064   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1065           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1066           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1067           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1068 }
1069
1070 /* sub imm16, dn */
1071 void OP_F71C0000 (insn, extension)
1072      unsigned long insn, extension;
1073 {
1074   int z, c, n, v, zx, cx, nx, vx;
1075   unsigned long reg1, imm, value;
1076
1077   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1078   imm = TRUNC (SEXT16 (insn & 0xffff));
1079   value = TRUNC (reg1 - imm);
1080   State.regs[REG_D0 + REG0_16 (insn)] = value;
1081
1082   z = ((value & 0xffff) == 0);
1083   zx = (value == 0);
1084   n = (value & 0x8000);
1085   nx = (value & 0x800000);
1086   c = ((reg1 & 0xffff) < (imm & 0xffff));
1087   cx = (reg1 < imm);
1088   v = ((reg1 & 0x8000) != (imm & 0x8000)
1089        && (reg1 & 0x8000) != (value & 0x8000));
1090   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1091         && (reg1 & 0x800000) != (value & 0x800000));
1092
1093   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1094            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1095   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1096           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1097           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1098           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1099 }
1100
1101 /* sub imm24, dn */
1102 void OP_F4680000 (insn, extension)
1103      unsigned long insn, extension;
1104 {
1105   int z, c, n, v, zx, cx, nx, vx;
1106   unsigned long reg1, imm, value;
1107
1108   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1109   imm = TRUNC (((insn & 0xffff) << 8) + extension);
1110   value = TRUNC (reg1 - imm);
1111   State.regs[REG_D0 + REG0_16 (insn)] = value;
1112
1113   z = ((value & 0xffff) == 0);
1114   zx = (value == 0);
1115   n = (value & 0x8000);
1116   nx = (value & 0x800000);
1117   c = ((reg1 & 0xffff) < (imm & 0xffff));
1118   cx = (reg1 < imm);
1119   v = ((reg1 & 0x8000) != (imm & 0x8000)
1120        && (reg1 & 0x8000) != (value & 0x8000));
1121   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1122         && (reg1 & 0x800000) != (value & 0x800000));
1123
1124   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1125            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1126   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1127           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1128           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1129           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1130 }
1131
1132 /* sub imm16, an */
1133 void OP_F70C0000 (insn, extension)
1134      unsigned long insn, extension;
1135 {
1136   int z, c, n, v, zx, cx, nx, vx;
1137   unsigned long reg1, imm, value;
1138
1139   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1140   imm = TRUNC (SEXT16 (insn & 0xffff));
1141   value = TRUNC (reg1 - imm);
1142   State.regs[REG_A0 + REG0_16 (insn)] = value;
1143
1144   z = ((value & 0xffff) == 0);
1145   zx = (value == 0);
1146   n = (value & 0x8000);
1147   nx = (value & 0x800000);
1148   c = ((reg1 & 0xffff) < (imm & 0xffff));
1149   cx = (reg1 < imm);
1150   v = ((reg1 & 0x8000) != (imm & 0x8000)
1151        && (reg1 & 0x8000) != (value & 0x8000));
1152   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1153         && (reg1 & 0x800000) != (value & 0x800000));
1154
1155   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1156            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1157   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1158           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1159           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1160           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1161 }
1162
1163 /* sub imm24, an */
1164 void OP_F46C0000 (insn, extension)
1165      unsigned long insn, extension;
1166 {
1167   int z, c, n, v, zx, cx, nx, vx;
1168   unsigned long reg1, imm, value;
1169
1170   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1171   imm = TRUNC (((insn & 0xffff) << 8) + extension);
1172   value = TRUNC (reg1 - imm);
1173   State.regs[REG_A0 + REG0_16 (insn)] = value;
1174
1175   z = ((value & 0xffff) == 0);
1176   zx = (value == 0);
1177   n = (value & 0x8000);
1178   nx = (value & 0x800000);
1179   c = ((reg1 & 0xffff) < (imm & 0xffff));
1180   cx = (reg1 < imm);
1181   v = ((reg1 & 0x8000) != (imm & 0x8000)
1182        && (reg1 & 0x8000) != (value & 0x8000));
1183   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1184         && (reg1 & 0x800000) != (value & 0x800000));
1185
1186   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1187            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1188   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1189           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1190           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1191           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1192 }
1193
1194 /* subc dm, dn */
1195 void OP_F290 (insn, extension)
1196      unsigned long insn, extension;
1197 {
1198   int z, c, n, v, zx, cx, nx, vx;
1199   unsigned long reg1, reg2, value;
1200
1201   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1202   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1203   value = TRUNC (reg2 - reg1 - ((PSW & PSW_CF) != 0));
1204   State.regs[REG_D0 + REG0 (insn)] = value;
1205
1206   z = ((value & 0xffff) == 0);
1207   zx = (value == 0);
1208   n = (value & 0x8000);
1209   nx = (value & 0x800000);
1210   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1211   cx = (reg1 > reg2);
1212   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1213        && (reg2 & 0x8000) != (value & 0x8000));
1214   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1215         && (reg2 & 0x800000) != (value & 0x800000));
1216
1217   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1218            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1219   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1220           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1221           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1222           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1223 }
1224
1225 /* mul dn, dm */
1226 void OP_F340 (insn, extension)
1227      unsigned long insn, extension;
1228 {
1229   unsigned long temp;
1230   int n, z;
1231
1232   temp = (SEXT16 (State.regs[REG_D0 + REG0 (insn)] & 0xffff)
1233           *  SEXT16 ((State.regs[REG_D0 + REG1 (insn)] & 0xffff)));
1234   State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffff;
1235   State.regs[REG_MDR] = temp >> 16;
1236   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1237   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1238   PSW &= ~(PSW_ZF | PSW_NF | PSW_VF);
1239   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1240 }
1241
1242 /* mulu dn, dm */
1243 void OP_F350 (insn, extension)
1244      unsigned long insn, extension;
1245 {
1246   unsigned long temp;
1247   int n, z;
1248
1249   temp = ((State.regs[REG_D0 + REG0 (insn)] & 0xffff)
1250           *  (State.regs[REG_D0 + REG1 (insn)] & 0xffff));
1251   State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffff;
1252   State.regs[REG_MDR] = temp >> 16;
1253   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1254   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1255   PSW &= ~(PSW_ZF | PSW_NF | PSW_VF);
1256   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1257 }
1258
1259
1260 /* divu dm, dn */
1261 void OP_F360 (insn, extension)
1262      unsigned long insn, extension;
1263 {
1264   unsigned long temp;
1265   int n, z;
1266
1267   temp = State.regs[REG_MDR];
1268   temp &= 0xffff;
1269   temp <<= 16;
1270   temp |= (State.regs[REG_D0 + REG0 (insn)] & 0xffff);
1271   State.regs[REG_MDR] = (temp
1272                           % (unsigned long)(State.regs[REG_D0 + REG1 (insn)] & 0xffff));
1273   temp /= (unsigned long)(State.regs[REG_D0 + REG1 (insn)] & 0xffff);
1274   State.regs[REG_D0 + REG0 (insn)] = temp & 0xffff;
1275   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1276   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1277   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1278   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1279 }
1280
1281 /* cmp imm8, dn */
1282 void OP_D800 (insn, extension)
1283      unsigned long insn, extension;
1284 {
1285   int z, c, n, v, zx, cx, nx, vx;
1286   unsigned long reg1, imm, value;
1287
1288   reg1 = TRUNC (State.regs[REG_D0 + REG0_8 (insn)]);
1289   imm = TRUNC (SEXT8 (insn & 0xff));
1290   value = TRUNC (reg1 - imm);
1291
1292   z = ((value & 0xffff) == 0);
1293   zx = (value == 0);
1294   n = (value & 0x8000);
1295   nx = (value & 0x800000);
1296   c = ((reg1 & 0xffff) < (imm & 0xffff));
1297   cx = (reg1 < imm);
1298   v = ((reg1 & 0x8000) != (imm & 0x8000)
1299        && (reg1 & 0x8000) != (value & 0x8000));
1300   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1301         && (reg1 & 0x800000) != (value & 0x800000));
1302
1303   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1304            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1305   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1306           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1307           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1308           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1309 }
1310
1311 /* cmp dn, dm */
1312 void OP_F390 (insn, extension)
1313      unsigned long insn, extension;
1314 {
1315   int z, c, n, v, zx, cx, nx, vx;
1316   unsigned long reg1, reg2, value;
1317
1318   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1319   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1320   value = TRUNC (reg2 - reg1);
1321
1322   z = ((value & 0xffff) == 0);
1323   zx = (value == 0);
1324   n = (value & 0x8000);
1325   nx = (value & 0x800000);
1326   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1327   cx = (reg1 > reg2);
1328   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1329        && (reg2 & 0x8000) != (value & 0x8000));
1330   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1331         && (reg2 & 0x800000) != (value & 0x800000));
1332
1333   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1334            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1335   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1336           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1337           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1338           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1339
1340   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1341   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1342           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1343 }
1344
1345 /* cmp dm, an */
1346 void OP_F220 (insn, extension)
1347      unsigned long insn, extension;
1348 {
1349   int z, c, n, v, zx, cx, nx, vx;
1350   unsigned long reg1, reg2, value;
1351
1352   reg1 = TRUNC (State.regs[REG_D0 + REG1 (insn)]);
1353   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1354   value = TRUNC (reg2 - reg1);
1355
1356   z = ((value & 0xffff) == 0);
1357   zx = (value == 0);
1358   n = (value & 0x8000);
1359   nx = (value & 0x800000);
1360   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1361   cx = (reg1 > reg2);
1362   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1363        && (reg2 & 0x8000) != (value & 0x8000));
1364   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1365         && (reg2 & 0x800000) != (value & 0x800000));
1366
1367   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1368            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1369   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1370           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1371           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1372           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1373
1374   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1375   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1376           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1377 }
1378
1379 /* cmp an, dm */
1380 void OP_F2E0 (insn, extension)
1381      unsigned long insn, extension;
1382 {
1383   int z, c, n, v, zx, cx, nx, vx;
1384   unsigned long reg1, reg2, value;
1385
1386   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1387   reg2 = TRUNC (State.regs[REG_D0 + REG0 (insn)]);
1388   value = TRUNC (reg2 - reg1);
1389
1390   z = ((value & 0xffff) == 0);
1391   zx = (value == 0);
1392   n = (value & 0x8000);
1393   nx = (value & 0x800000);
1394   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1395   cx = (reg1 > reg2);
1396   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1397        && (reg2 & 0x8000) != (value & 0x8000));
1398   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1399         && (reg2 & 0x800000) != (value & 0x800000));
1400
1401   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1402            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1403   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1404           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1405           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1406           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1407
1408   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1409   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1410           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1411 }
1412
1413 /* cmp an, am */
1414 void OP_F260 (insn, extension)
1415      unsigned long insn, extension;
1416 {
1417   int z, c, n, v, zx, cx, nx, vx;
1418   unsigned long reg1, reg2, value;
1419
1420   reg1 = TRUNC (State.regs[REG_A0 + REG1 (insn)]);
1421   reg2 = TRUNC (State.regs[REG_A0 + REG0 (insn)]);
1422   value = TRUNC (reg2 - reg1);
1423
1424   z = ((value & 0xffff) == 0);
1425   zx = (value == 0);
1426   n = (value & 0x8000);
1427   nx = (value & 0x800000);
1428   c = ((reg1 & 0xffff) > (reg2 & 0xffff));
1429   cx = (reg1 > reg2);
1430   v = ((reg2 & 0x8000) != (reg1 & 0x8000)
1431        && (reg2 & 0x8000) != (value & 0x8000));
1432   vx = ((reg2 & 0x800000) != (reg1 & 0x800000)
1433         && (reg2 & 0x800000) != (value & 0x800000));
1434
1435   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1436            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1437   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1438           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1439           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1440           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1441
1442   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1443   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1444           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1445 }
1446
1447 /* cmp imm16, dn */
1448 void OP_F7480000 (insn, extension)
1449      unsigned long insn, extension;
1450 {
1451   int z, c, n, v, zx, cx, nx, vx;
1452   unsigned long reg1, imm, value;
1453
1454   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1455   imm = TRUNC (SEXT16 (insn & 0xffff));
1456   value = TRUNC (reg1 - imm);
1457
1458   z = ((value & 0xffff) == 0);
1459   zx = (value == 0);
1460   n = (value & 0x8000);
1461   nx = (value & 0x800000);
1462   c = ((reg1 & 0xffff) < (imm & 0xffff));
1463   cx = (reg1 < imm);
1464   v = ((reg1 & 0x8000) != (imm & 0x8000)
1465        && (reg1 & 0x8000) != (value & 0x8000));
1466   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1467         && (reg1 & 0x800000) != (value & 0x800000));
1468
1469   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1470            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1471   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1472           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1473           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1474           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1475
1476   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1477   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1478           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1479 }
1480
1481 /* cmp imm24, dn */
1482 void OP_F4780000 (insn, extension)
1483      unsigned long insn, extension;
1484 {
1485   int z, c, n, v, zx, cx, nx, vx;
1486   unsigned long reg1, imm, value;
1487
1488   reg1 = TRUNC (State.regs[REG_D0 + REG0_16 (insn)]);
1489   imm = TRUNC (((insn & 0xffff) << 8) + extension);
1490   value = TRUNC (reg1 - imm);
1491
1492   z = ((value & 0xffff) == 0);
1493   zx = (value == 0);
1494   n = (value & 0x8000);
1495   nx = (value & 0x800000);
1496   c = ((reg1 & 0xffff) < (imm & 0xffff));
1497   cx = (reg1 < imm);
1498   v = ((reg1 & 0x8000) != (imm & 0x8000)
1499        && (reg1 & 0x8000) != (value & 0x8000));
1500   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1501         && (reg1 & 0x800000) != (value & 0x800000));
1502
1503   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1504            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1505   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1506           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1507           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1508           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1509
1510   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1511   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1512           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1513 }
1514
1515 /* cmp imm16, an */
1516 void OP_EC0000 (insn, extension)
1517      unsigned long insn, extension;
1518 {
1519   int z, c, n, v, zx, cx, nx, vx;
1520   unsigned long reg1, imm, value;
1521
1522   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1523   imm = TRUNC (insn & 0xffff);
1524   value = TRUNC (reg1 - imm);
1525
1526   z = ((value & 0xffff) == 0);
1527   zx = (value == 0);
1528   n = (value & 0x8000);
1529   nx = (value & 0x800000);
1530   c = ((reg1 & 0xffff) < (imm & 0xffff));
1531   cx = (reg1 < imm);
1532   v = ((reg1 & 0x8000) != (imm & 0x8000)
1533        && (reg1 & 0x8000) != (value & 0x8000));
1534   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1535         && (reg1 & 0x800000) != (value & 0x800000));
1536
1537   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1538            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1539   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1540           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1541           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1542           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1543
1544   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1545   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1546           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1547 }
1548
1549 /* cmp imm24, an */
1550 void OP_F47C0000 (insn, extension)
1551      unsigned long insn, extension;
1552 {
1553   int z, c, n, v, zx, cx, nx, vx;
1554   unsigned long reg1, imm, value;
1555
1556   reg1 = TRUNC (State.regs[REG_A0 + REG0_16 (insn)]);
1557   imm = TRUNC (((insn & 0xffff) << 8) + extension);
1558   value = TRUNC (reg1 - imm);
1559
1560   z = ((value & 0xffff) == 0);
1561   zx = (value == 0);
1562   n = (value & 0x8000);
1563   nx = (value & 0x800000);
1564   c = ((reg1 & 0xffff) < (imm & 0xffff));
1565   cx = (reg1 < imm);
1566   v = ((reg1 & 0x8000) != (imm & 0x8000)
1567        && (reg1 & 0x8000) != (value & 0x8000));
1568   vx = ((reg1 & 0x800000) != (imm & 0x800000)
1569         && (reg1 & 0x800000) != (value & 0x800000));
1570
1571   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF
1572            | PSW_ZX | PSW_NX | PSW_CX | PSW_VX);
1573   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0)
1574           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0)
1575           | (zx ? PSW_ZX : 0) | (nx ? PSW_NX : 0)
1576           | (cx ? PSW_CX : 0) | (vx ? PSW_VX : 0));
1577
1578   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1579   PSW |= ((z ? PSW_ZF : 0) | ( n ? PSW_NF : 0)
1580           | (c ? PSW_CF : 0) | (v ? PSW_VF : 0));
1581 }
1582
1583 /* and dn, dm */
1584 void OP_F300 (insn, extension)
1585      unsigned long insn, extension;
1586 {
1587   int n, z;
1588   unsigned long temp;
1589
1590   temp = State.regs[REG_D0 + REG0 (insn)] & State.regs[REG_D0 + REG1 (insn)];
1591   temp &= 0xffff;
1592   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1593   State.regs[REG_D0 + REG0 (insn)] |= temp;
1594   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1595   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1596   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1597   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1598 }
1599
1600 /* and imm8, dn */
1601 void OP_F50000 (insn, extension)
1602      unsigned long insn, extension;
1603 {
1604   int n, z;
1605   unsigned long temp;
1606
1607   temp = State.regs[REG_D0 + REG0_8 (insn)] & (insn & 0xff);
1608   temp &= 0xffff;
1609   State.regs[REG_D0 + REG0_8 (insn)] &= ~0xffff;
1610   State.regs[REG_D0 + REG0_8 (insn)] |= temp;
1611   z = (State.regs[REG_D0 + REG0_8 (insn)] & 0xffff) == 0;
1612   n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x8000) != 0;
1613   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1614   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1615 }
1616
1617 /* and imm16, dn */
1618 void OP_F7000000 (insn, extension)
1619      unsigned long insn, extension;
1620 {
1621   int n, z;
1622   unsigned long temp;
1623
1624   temp = State.regs[REG_D0 + REG0_16 (insn)] & (insn & 0xffff);
1625   temp &= 0xffff;
1626   State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1627   State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1628   z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1629   n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1630   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1631   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1632 }
1633
1634 /* and imm16, psw */
1635 void OP_F7100000 (insn, extension)
1636      unsigned long insn, extension;
1637 {
1638   PSW &= (insn & 0xffff);
1639 }
1640
1641 /* or dn, dm */
1642 void OP_F310 (insn, extension)
1643      unsigned long insn, extension;
1644 {
1645   int n, z;
1646   unsigned long temp;
1647
1648   temp = State.regs[REG_D0 + REG0 (insn)] | State.regs[REG_D0 + REG1 (insn)];
1649   temp &= 0xffff;
1650   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1651   State.regs[REG_D0 + REG0 (insn)] |= temp;
1652   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1653   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1654   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1655   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1656 }
1657
1658 /* or imm8, dn */
1659 void OP_F50800 (insn, extension)
1660      unsigned long insn, extension;
1661 {
1662   int n, z;
1663   unsigned long temp;
1664
1665   temp = State.regs[REG_D0 + REG0_8 (insn)] | (insn & 0xff);
1666   temp &= 0xffff;
1667   State.regs[REG_D0 + REG0_8 (insn)] &= ~0xffff;
1668   State.regs[REG_D0 + REG0_8 (insn)] |= temp;
1669   z = (State.regs[REG_D0 + REG0_8 (insn)] & 0xffff) == 0;
1670   n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x8000) != 0;
1671   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1672   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1673 }
1674
1675 /* or imm16, dn */
1676 void OP_F7400000 (insn, extension)
1677      unsigned long insn, extension;
1678 {
1679   int n, z;
1680   unsigned long temp;
1681
1682   temp = State.regs[REG_D0 + REG0_16 (insn)] | (insn & 0xffff);
1683   temp &= 0xffff;
1684   State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1685   State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1686   z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1687   n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1688   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1689   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1690 }
1691
1692 /* or imm16, psw */
1693 void OP_F7140000 (insn, extension)
1694      unsigned long insn, extension;
1695 {
1696   PSW |= (insn & 0xffff);
1697 }
1698
1699 /* xor dn, dm */
1700 void OP_F320 (insn, extension)
1701      unsigned long insn, extension;
1702 {
1703   int n, z;
1704   unsigned long temp;
1705
1706   temp = State.regs[REG_D0 + REG0 (insn)] ^ State.regs[REG_D0 + REG1 (insn)];
1707   temp &= 0xffff;
1708   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1709   State.regs[REG_D0 + REG0 (insn)] |= temp;
1710   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1711   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1712   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1713   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1714 }
1715
1716 /* xor imm16, dn */
1717 void OP_F74C0000 (insn, extension)
1718      unsigned long insn, extension;
1719 {
1720   int n, z;
1721   unsigned long temp;
1722
1723   temp = State.regs[REG_D0 + REG0_16 (insn)] ^ (insn & 0xffff);
1724   temp &= 0xffff;
1725   State.regs[REG_D0 + REG0_16 (insn)] &= ~0xffff;
1726   State.regs[REG_D0 + REG0_16 (insn)] |= temp;
1727   z = (State.regs[REG_D0 + REG0_16 (insn)] & 0xffff) == 0;
1728   n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x8000) != 0;
1729   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1730   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1731 }
1732
1733 /* not dn */
1734 void OP_F3E4 (insn, extension)
1735      unsigned long insn, extension;
1736 {
1737   int n, z;
1738   unsigned long temp;
1739
1740   temp = ~State.regs[REG_D0 + REG0 (insn)];
1741   temp &= 0xffff;
1742   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1743   State.regs[REG_D0 + REG0 (insn)] |= temp;
1744   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1745   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1746   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1747   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0));
1748 }
1749
1750 /* asr dn */
1751 void OP_F338 (insn, extension)
1752      unsigned long insn, extension;
1753 {
1754   long temp;
1755   int z, n, c, high;
1756
1757   temp = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1758   c = temp & 1;
1759   high = temp & 0x8000;
1760   temp >>= 1;
1761   temp |= high;
1762   temp &= 0xffff;
1763   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1764   State.regs[REG_D0 + REG0 (insn)] |= temp;
1765   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1766   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1767   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF);
1768   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1769 }
1770
1771 /* lsr dn */
1772 void OP_F33C (insn, extension)
1773      unsigned long insn, extension;
1774 {
1775   int z, n, c;
1776   long temp;
1777
1778   temp = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1779   c = temp & 1;
1780   temp >>= 1;
1781   temp &= 0xffff;
1782   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1783   State.regs[REG_D0 + REG0 (insn)] |= temp;
1784   z = (State.regs[REG_D0 + REG0 (insn)] & 0xffff) == 0;
1785   n = (State.regs[REG_D0 + REG0 (insn)] & 0x8000) != 0;
1786   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF);
1787   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1788 }
1789
1790 /* ror dn */
1791 void OP_F334 (insn, extension)
1792      unsigned long insn, extension;
1793 {
1794   unsigned long value;
1795   int c,n,z;
1796
1797   value = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1798   c = (value & 0x1);
1799
1800   value >>= 1;
1801   value |= (PSW & PSW_CF ? 0x8000 : 0);
1802   value &= 0xffff;
1803   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1804   State.regs[REG_D0 + REG0 (insn)] |= value;
1805   z = (value == 0);
1806   n = (value & 0x8000) != 0;
1807   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1808   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1809 }
1810
1811 /* rol dn */
1812 void OP_F330 (insn, extension)
1813      unsigned long insn, extension;
1814 {
1815   unsigned long value;
1816   int c,n,z;
1817
1818   value = State.regs[REG_D0 + REG0 (insn)] & 0xffff;
1819   c = (value & 0x8000) ? 1 : 0;
1820
1821   value <<= 1;
1822   value |= (PSW & PSW_CF ? 0x1 : 0);
1823   value &= 0xffff;
1824   State.regs[REG_D0 + REG0 (insn)] &= ~0xffff;
1825   State.regs[REG_D0 + REG0 (insn)] |= value;
1826   z = (value == 0);
1827   n = (value & 0x8000) != 0;
1828   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1829   PSW |= ((z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0));
1830 }
1831
1832 /* btst imm8, dn */
1833 void OP_F50400 (insn, extension)
1834      unsigned long insn, extension;
1835 {
1836   unsigned long temp;
1837   int z;
1838
1839   temp = State.regs[REG_D0 + REG0_8 (insn)];
1840   temp &= (insn & 0xff);
1841   z = (temp == 0);
1842   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1843   PSW |= (z ? PSW_ZF : 0);
1844 }
1845
1846 /* btst imm16, dn */
1847 void OP_F7040000 (insn, extension)
1848      unsigned long insn, extension;
1849 {
1850   unsigned long temp;
1851   int z, n, c;
1852
1853   temp = State.regs[REG_D0 + REG0_16 (insn)];
1854   c = temp & 0x1;
1855   temp &= (insn & 0xffff);
1856   n = (temp & 0x8000) != 0;
1857   z = (temp == 0);
1858   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1859   PSW |= (z ? PSW_ZF : 0) | (n ? PSW_NF : 0) | (c ? PSW_CF : 0);
1860 }
1861
1862 /* bset dm, (an) */
1863 void OP_F020 (insn, extension)
1864      unsigned long insn, extension;
1865 {
1866   unsigned long temp;
1867   int z;
1868
1869   temp = load_byte (State.regs[REG_A0 + REG1 (insn)]);
1870   z = (temp & State.regs[REG_D0 + REG0 (insn)]) == 0;
1871   temp |= State.regs[REG_D0 + REG0 (insn)];
1872   store_byte (State.regs[REG_A0 + REG1 (insn)], temp);
1873   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1874   PSW |= (z ? PSW_ZF : 0);
1875 }
1876
1877 /* bclr dm, (an) */
1878 void OP_F030 (insn, extension)
1879      unsigned long insn, extension;
1880 {
1881   unsigned long temp;
1882   int z;
1883
1884   temp = load_byte (State.regs[REG_A0 + REG1 (insn)]);
1885   z = (temp & State.regs[REG_D0 + REG0 (insn)]) == 0;
1886   temp = temp & ~State.regs[REG_D0 + REG0 (insn)];
1887   store_byte (State.regs[REG_A0 + REG1 (insn)], temp);
1888   PSW &= ~(PSW_ZF | PSW_NF | PSW_CF | PSW_VF);
1889   PSW |= (z ? PSW_ZF : 0);
1890 }
1891
1892 /* beqx label:8 */
1893 void OP_F5E800 (insn, extension)
1894      unsigned long insn, extension;
1895 {
1896   /* The dispatching code will add 3 after we return, so
1897      we subtract two here to make things right.  */
1898   if (PSW & PSW_ZX)
1899     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1900 }
1901
1902 /* bnex label:8 */
1903 void OP_F5E900 (insn, extension)
1904      unsigned long insn, extension;
1905 {
1906   /* The dispatching code will add 3 after we return, so
1907      we subtract two here to make things right.  */
1908   if (!(PSW & PSW_ZX))
1909     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1910 }
1911
1912 /* bgtx label:8 */
1913 void OP_F5E100 (insn, extension)
1914      unsigned long insn, extension;
1915 {
1916   /* The dispatching code will add 3 after we return, so
1917      we subtract two here to make things right.  */
1918   if (!((PSW & PSW_ZX)
1919         || (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0))))
1920     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1921 }
1922
1923 /* bgex label:8 */
1924 void OP_F5E200 (insn, extension)
1925      unsigned long insn, extension;
1926 {
1927   /* The dispatching code will add 3 after we return, so
1928      we subtract two here to make things right.  */
1929   if (!(((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0)))
1930     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1931 }
1932
1933 /* blex label:8 */
1934 void OP_F5E300 (insn, extension)
1935      unsigned long insn, extension;
1936 {
1937   /* The dispatching code will add 3 after we return, so
1938      we subtract two here to make things right.  */
1939   if ((PSW & PSW_ZX)
1940        || (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0)))
1941     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1942 }
1943
1944 /* bltx label:8 */
1945 void OP_F5E000 (insn, extension)
1946      unsigned long insn, extension;
1947 {
1948   /* The dispatching code will add 3 after we return, so
1949      we subtract two here to make things right.  */
1950   if (((PSW & PSW_NX) != 0) ^ ((PSW & PSW_VX) != 0))
1951     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1952 }
1953
1954 /* bhix label:8 */
1955 void OP_F5E500 (insn, extension)
1956      unsigned long insn, extension;
1957 {
1958   /* The dispatching code will add 3 after we return, so
1959      we subtract two here to make things right.  */
1960   if (!(((PSW & PSW_CX) != 0) || (PSW & PSW_ZX) != 0))
1961     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1962 }
1963
1964 /* bccx label:8 */
1965 void OP_F5E600 (insn, extension)
1966      unsigned long insn, extension;
1967 {
1968   /* The dispatching code will add 3 after we return, so
1969      we subtract two here to make things right.  */
1970   if (!(PSW & PSW_CX))
1971     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1972 }
1973
1974 /* blsx label:8 */
1975 void OP_F5E700 (insn, extension)
1976      unsigned long insn, extension;
1977 {
1978   /* The dispatching code will add 3 after we return, so
1979      we subtract two here to make things right.  */
1980   if (((PSW & PSW_CX) != 0) || (PSW & PSW_ZX) != 0)
1981     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1982 }
1983
1984 /* bcsx label:8 */
1985 void OP_F5E400 (insn, extension)
1986      unsigned long insn, extension;
1987 {
1988   /* The dispatching code will add 3 after we return, so
1989      we subtract two here to make things right.  */
1990   if (PSW & PSW_CX)
1991     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
1992 }
1993
1994 /* bvcx label:8 */
1995 void OP_F5EC00 (insn, extension)
1996      unsigned long insn, extension;
1997 {
1998   /* The dispatching code will add 3 after we return, so
1999      we subtract two here to make things right.  */
2000   if (!(PSW & PSW_VX))
2001     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2002 }
2003
2004 /* bvsx label:8 */
2005 void OP_F5ED00 (insn, extension)
2006      unsigned long insn, extension;
2007 {
2008   /* The dispatching code will add 3 after we return, so
2009      we subtract two here to make things right.  */
2010   if (PSW & PSW_VX)
2011     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2012 }
2013
2014 /* bncx label:8 */
2015 void OP_F5EE00 (insn, extension)
2016      unsigned long insn, extension;
2017 {
2018   /* The dispatching code will add 3 after we return, so
2019      we subtract two here to make things right.  */
2020   if (!(PSW & PSW_NX))
2021     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2022 }
2023
2024 /* bnsx label:8 */
2025 void OP_F5EF00 (insn, extension)
2026      unsigned long insn, extension;
2027 {
2028   /* The dispatching code will add 3 after we return, so
2029      we subtract two here to make things right.  */
2030   if (PSW & PSW_NX)
2031     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2032 }
2033
2034 /* beq label:8 */
2035 void OP_E800 (insn, extension)
2036      unsigned long insn, extension;
2037 {
2038   /* The dispatching code will add 2 after we return, so
2039      we subtract two here to make things right.  */
2040   if (PSW & PSW_ZF)
2041     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2042 }
2043
2044 /* bne label:8 */
2045 void OP_E900 (insn, extension)
2046      unsigned long insn, extension;
2047 {
2048   /* The dispatching code will add 2 after we return, so
2049      we subtract two here to make things right.  */
2050   if (!(PSW & PSW_ZF))
2051     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2052 }
2053
2054 /* bgt label:8 */
2055 void OP_E100 (insn, extension)
2056      unsigned long insn, extension;
2057 {
2058   /* The dispatching code will add 2 after we return, so
2059      we subtract two here to make things right.  */
2060   if (!((PSW & PSW_ZF)
2061         || (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0))))
2062     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2063 }
2064
2065 /* bge label:8 */
2066 void OP_E200 (insn, extension)
2067      unsigned long insn, extension;
2068 {
2069   /* The dispatching code will add 2 after we return, so
2070      we subtract two here to make things right.  */
2071   if (!(((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0)))
2072     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2073 }
2074
2075 /* ble label:8 */
2076 void OP_E300 (insn, extension)
2077      unsigned long insn, extension;
2078 {
2079   /* The dispatching code will add 2 after we return, so
2080      we subtract two here to make things right.  */
2081   if ((PSW & PSW_ZF)
2082        || (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0)))
2083     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2084 }
2085
2086 /* blt label:8 */
2087 void OP_E000 (insn, extension)
2088      unsigned long insn, extension;
2089 {
2090   /* The dispatching code will add 2 after we return, so
2091      we subtract two here to make things right.  */
2092   if (((PSW & PSW_NF) != 0) ^ ((PSW & PSW_VF) != 0))
2093     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2094 }
2095
2096 /* bhi label:8 */
2097 void OP_E500 (insn, extension)
2098      unsigned long insn, extension;
2099 {
2100   /* The dispatching code will add 2 after we return, so
2101      we subtract two here to make things right.  */
2102   if (!(((PSW & PSW_CF) != 0) || (PSW & PSW_ZF) != 0))
2103     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2104 }
2105
2106 /* bcc label:8 */
2107 void OP_E600 (insn, extension)
2108      unsigned long insn, extension;
2109 {
2110   /* The dispatching code will add 2 after we return, so
2111      we subtract two here to make things right.  */
2112   if (!(PSW & PSW_CF))
2113     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2114 }
2115
2116 /* bls label:8 */
2117 void OP_E700 (insn, extension)
2118      unsigned long insn, extension;
2119 {
2120   /* The dispatching code will add 2 after we return, so
2121      we subtract two here to make things right.  */
2122   if (((PSW & PSW_CF) != 0) || (PSW & PSW_ZF) != 0)
2123     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2124 }
2125
2126 /* bcs label:8 */
2127 void OP_E400 (insn, extension)
2128      unsigned long insn, extension;
2129 {
2130   /* The dispatching code will add 2 after we return, so
2131      we subtract two here to make things right.  */
2132   if (PSW & PSW_CF)
2133     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2134 }
2135
2136 /* bvc label:8 */
2137 void OP_F5FC00 (insn, extension)
2138      unsigned long insn, extension;
2139 {
2140   /* The dispatching code will add 3 after we return, so
2141      we subtract two here to make things right.  */
2142   if (!(PSW & PSW_VF))
2143     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2144 }
2145
2146 /* bvs label:8 */
2147 void OP_F5FD00 (insn, extension)
2148      unsigned long insn, extension;
2149 {
2150   /* The dispatching code will add 3 after we return, so
2151      we subtract two here to make things right.  */
2152   if (PSW & PSW_VF)
2153     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2154 }
2155
2156 /* bnc label:8 */
2157 void OP_F5FE00 (insn, extension)
2158      unsigned long insn, extension;
2159 {
2160   /* The dispatching code will add 3 after we return, so
2161      we subtract two here to make things right.  */
2162   if (!(PSW & PSW_NF))
2163     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2164 }
2165
2166 /* bns label:8 */
2167 void OP_F5FF00 (insn, extension)
2168      unsigned long insn, extension;
2169 {
2170   /* The dispatching code will add 3 after we return, so
2171      we subtract two here to make things right.  */
2172   if (PSW & PSW_NF)
2173     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2174 }
2175
2176 /* bra label:8 */
2177 void OP_EA00 (insn, extension)
2178      unsigned long insn, extension;
2179 {
2180   /* The dispatching code will add 2 after we return, so
2181      we subtract two here to make things right.  */
2182     State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT8 (insn & 0xff));
2183 }
2184
2185 /* jmp (an) */
2186 void OP_F000 (insn, extension)
2187      unsigned long insn, extension;
2188 {
2189   State.regs[REG_PC] = TRUNC (State.regs[REG_A0 + REG1 (insn)] - 2);
2190 }
2191
2192 /* jmp label:16 */
2193 void OP_FC0000 (insn, extension)
2194      unsigned long insn, extension;
2195 {
2196   State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT16 (insn & 0xffff));
2197 }
2198
2199 /* jmp label:24 */
2200 void OP_F4E00000 (insn, extension)
2201      unsigned long insn, extension;
2202 {
2203   State.regs[REG_PC]
2204     = TRUNC (State.regs[REG_PC] + (((insn & 0xffff) << 8) + extension));
2205 }
2206
2207 /* jsr (an) */
2208 void OP_F001 (insn, extension)
2209      unsigned long insn, extension;
2210 {
2211   unsigned int next_pc, sp;
2212
2213   sp = State.regs[REG_SP];
2214   sp -= 4;
2215   State.regs[REG_SP] = sp;
2216   next_pc = State.regs[REG_PC] + 2;
2217   State.mem[sp] = next_pc & 0xff;
2218   State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2219   State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2220   State.regs[REG_PC] = TRUNC (State.regs[REG_A0 + REG1 (insn)] - 2);
2221 }
2222
2223 /* jsr label:16 */
2224 void OP_FD0000 (insn, extension)
2225      unsigned long insn, extension;
2226 {
2227   unsigned int next_pc, sp;
2228
2229   sp = State.regs[REG_SP];
2230   sp -= 4;
2231   State.regs[REG_SP] = sp;
2232   next_pc = State.regs[REG_PC] + 3;
2233   State.mem[sp] = next_pc & 0xff;
2234   State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2235   State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2236   State.regs[REG_PC] = TRUNC (State.regs[REG_PC] + SEXT16 (insn & 0xffff));
2237 }
2238
2239 /* jsr label:24 */
2240 void OP_F4E10000 (insn, extension)
2241      unsigned long insn, extension;
2242 {
2243   unsigned int next_pc, sp;
2244
2245   sp = State.regs[REG_SP];
2246   sp -= 4;
2247   State.regs[REG_SP] = sp;
2248   next_pc = State.regs[REG_PC] + 5;
2249   State.mem[sp] = next_pc & 0xff;
2250   State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2251   State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2252   State.regs[REG_PC]
2253     = TRUNC (State.regs[REG_PC] + (((insn & 0xffff) << 8) + extension));
2254 }
2255
2256 /* rts */
2257 void OP_FE (insn, extension)
2258      unsigned long insn, extension;
2259 {
2260   unsigned int sp;
2261
2262   sp = State.regs[REG_SP];
2263   State.regs[REG_PC] = (State.mem[sp] | (State.mem[sp+1] << 8)
2264               | (State.mem[sp+2] << 16));
2265   State.regs[REG_PC] -= 1;
2266   State.regs[REG_SP] += 4;
2267 }
2268
2269 /* rti */
2270 void OP_EB (insn, extension)
2271      unsigned long insn, extension;
2272 {
2273   PSW = load_half (State.regs[REG_A0 + 3]);
2274   State.regs[REG_PC] = load_3_byte (State.regs[REG_A0 + 3] + 2) - 1;
2275   State.regs[REG_A0 + 3] += 6;
2276 }
2277
2278 /* syscall */
2279 void OP_F010 (insn, extension)
2280      unsigned long insn, extension;
2281 {
2282   /* We use this for simulated system calls; we may need to change
2283      it to a reserved instruction if we conflict with uses at
2284      Matsushita.  */
2285   int save_errno = errno;       
2286   int offset = 6;
2287   errno = 0;
2288
2289 /* Registers passed to syscall 0 */
2290
2291 /* Function number.  */
2292 #define FUNC   (State.regs[0])
2293
2294 #define PARM1  (State.regs[1])
2295
2296 /* Parameters.  */
2297 #define PARM(x, y) (load_mem (State.regs[REG_SP] + x, y))
2298
2299 /* Registers set by syscall 0 */
2300
2301 #define RETVAL State.regs[0]    /* return value */
2302 #define RETERR State.regs[1]    /* return error code */
2303
2304 /* Turn a pointer in a register into a pointer into real memory. */
2305
2306 #define MEMPTR(x) (State.mem + (x & 0xffffff))
2307
2308   switch (FUNC)
2309     {
2310 #if !defined(__GO32__) && !defined(_WIN32)
2311 #ifdef TARGET_SYS_fork
2312       case TARGET_SYS_fork:
2313       RETVAL = fork ();
2314       break;
2315 #endif
2316 #ifdef TARGET_SYS_execve
2317     case TARGET_SYS_execve:
2318       RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM (4, 4)),
2319                        (char **)MEMPTR (PARM (8, 4)));
2320       break;
2321 #endif
2322 #ifdef TARGET_SYS_execv
2323     case TARGET_SYS_execv:
2324       RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM (4, 4)), NULL);
2325       break;
2326 #endif
2327 #endif
2328
2329     case TARGET_SYS_read:
2330       RETVAL = mn10200_callback->read (mn10200_callback, PARM1, 
2331                                        MEMPTR (PARM (4, 4)), PARM (8, 4));
2332       break;
2333     case TARGET_SYS_write:
2334       RETVAL = (int)mn10200_callback->write (mn10200_callback, PARM1,
2335                                              MEMPTR (PARM (4, 4)),
2336                                              PARM (8, 4));
2337       break;
2338     case TARGET_SYS_lseek:
2339       RETVAL = mn10200_callback->lseek (mn10200_callback, PARM1,
2340                                         PARM (4, 4), PARM (8, 2));
2341       break;
2342     case TARGET_SYS_close:
2343       RETVAL = mn10200_callback->close (mn10200_callback, PARM1);
2344       break;
2345     case TARGET_SYS_open:
2346       RETVAL = mn10200_callback->open (mn10200_callback, MEMPTR (PARM1),
2347                                        PARM (4, 2));
2348       break;
2349     case TARGET_SYS_exit:
2350       /* EXIT - caller can look in PARM1 to work out the 
2351          reason */
2352       if (PARM1 == 0xdead)
2353         State.exception = SIGABRT;
2354       else
2355         State.exception = SIGQUIT;
2356       State.exited = 1;
2357       break;
2358
2359     case TARGET_SYS_stat:       /* added at hmsi */
2360       /* stat system call */
2361       {
2362         struct stat host_stat;
2363         reg_t buf;
2364
2365         RETVAL = stat (MEMPTR (PARM1), &host_stat);
2366         
2367         buf = PARM (4, 4);
2368
2369         /* Just wild-assed guesses.  */
2370         store_half (buf, host_stat.st_dev);
2371         store_half (buf + 2, host_stat.st_ino);
2372         store_word (buf + 4, host_stat.st_mode);
2373         store_half (buf + 8, host_stat.st_nlink);
2374         store_half (buf + 10, host_stat.st_uid);
2375         store_half (buf + 12, host_stat.st_gid);
2376         store_half (buf + 14, host_stat.st_rdev);
2377         store_word (buf + 16, host_stat.st_size);
2378         store_word (buf + 20, host_stat.st_atime);
2379         store_word (buf + 28, host_stat.st_mtime);
2380         store_word (buf + 36, host_stat.st_ctime);
2381       }
2382       break;
2383
2384 #ifdef TARGET_SYS_chown
2385     case TARGET_SYS_chown:
2386       RETVAL = chown (MEMPTR (PARM1), PARM (4, 2), PARM (6, 2));
2387       break;
2388 #endif
2389     case TARGET_SYS_chmod:
2390       RETVAL = chmod (MEMPTR (PARM1), PARM (4, 2));
2391       break;
2392 #ifdef TARGET_SYS_time
2393     case TARGET_SYS_time:
2394       RETVAL = time ((time_t *)MEMPTR (PARM1));
2395       break;
2396 #endif
2397 #ifdef TARGET_SYS_times
2398     case TARGET_SYS_times:
2399       {
2400         struct tms tms;
2401         RETVAL = times (&tms);
2402         store_word (PARM1, tms.tms_utime);
2403         store_word (PARM1 + 4, tms.tms_stime);
2404         store_word (PARM1 + 8, tms.tms_cutime);
2405         store_word (PARM1 + 12, tms.tms_cstime);
2406         break;
2407       }
2408 #endif
2409 #ifdef TARGET_SYS_gettimeofday
2410     case TARGET_SYS_gettimeofday:
2411       {
2412         struct timeval t;
2413         struct timezone tz;
2414         RETVAL = gettimeofday (&t, &tz);
2415         store_word (PARM1, t.tv_sec);
2416         store_word (PARM1 + 4, t.tv_usec);
2417         store_word (PARM (4, 4), tz.tz_minuteswest);
2418         store_word (PARM (4, 4) + 4, tz.tz_dsttime);
2419         break;
2420       }
2421 #endif
2422 #ifdef TARGET_SYS_utime
2423     case TARGET_SYS_utime:
2424       /* Cast the second argument to void *, to avoid type mismatch
2425          if a prototype is present.  */
2426       RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM (4, 4)));
2427       break;
2428 #endif
2429     default:
2430       abort ();
2431     }
2432   RETERR = errno;
2433   errno = save_errno;
2434 }
2435
2436 /* nop */
2437 void OP_F6 (insn, extension)
2438      unsigned long insn, extension;
2439 {
2440 }
2441
2442 /* breakpoint */
2443 void
2444 OP_FF (insn, extension)
2445      unsigned long insn, extension;
2446 {
2447   State.exception = SIGTRAP;
2448   PC -= 1;
2449 }