fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
1/*****************************************************************************
2 * pce *
3 *****************************************************************************/
4
5/*****************************************************************************
6 * File name: src/cpu/e68000/disasm.c *
7 * Created: 2005-07-17 by Hampa Hug <hampa@hampa.ch> *
8 * Copyright: (C) 2005-2023 Hampa Hug <hampa@hampa.ch> *
9 *****************************************************************************/
10
11/*****************************************************************************
12 * This program is free software. You can redistribute it and / or modify it *
13 * under the terms of the GNU General Public License version 2 as published *
14 * by the Free Software Foundation. *
15 * *
16 * This program is distributed in the hope that it will be useful, but *
17 * WITHOUT ANY WARRANTY, without even the implied warranty of *
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General *
19 * Public License for more details. *
20 *****************************************************************************/
21
22
23#include <stdio.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include "e68000.h"
28#include "internal.h"
29
30
31typedef void (*e68_dasm_f) (e68_dasm_t *da, const uint8_t *src);
32
33
34static e68_dasm_f e68_dasm_op[1024];
35
36
37enum {
38 ARG_NONE,
39 ARG_IR,
40 ARG_IR1,
41 ARG_EA,
42 ARG_EA2,
43 ARG_DREG0,
44 ARG_DREG9,
45 ARG_AREG0,
46 ARG_AREG9,
47 ARG_REG_IR1_12,
48 ARG_AREG0PI,
49 ARG_AREG9PI,
50 ARG_AREG0PD,
51 ARG_AREG9PD,
52 ARG_AREG0DISP,
53 ARG_IMM8,
54 ARG_IMM16,
55 ARG_IMM32,
56 ARG_IMMQ,
57 ARG_IRUIMM4,
58 ARG_IRSIMM8,
59 ARG_DIST8,
60 ARG_DIST16,
61 ARG_DIST32,
62 ARG_REGLST,
63 ARG_REVLST,
64 ARG_CCR,
65 ARG_SR,
66 ARG_USP,
67 ARG_CREG,
68 ARG_DQDR,
69 ARG_DHDL,
70 ARG_DL,
71 ARG_BF,
72 ARG_BF_DN
73};
74
75
76static const char *op_bcc[16] = {
77 "BRA", "BSR", "BHI", "BLS",
78 "BCC", "BCS", "BNE", "BEQ",
79 "BVC", "BVS", "BPL", "BMI",
80 "BGE", "BLT", "BGT", "BLE"
81};
82
83static const char *op_dbcc[16] = {
84 "DBT", "DBF", "DBHI", "DBLS",
85 "DBCC", "DBCS", "DBNE", "DBEQ",
86 "DBVC", "DBVS", "DBPL", "DBMI",
87 "DBGE", "DBLT", "DBGT", "DBLE"
88};
89
90static const char *op_scc[16] = {
91 "ST", "SF", "SHI", "SLS",
92 "SCC", "SCS", "SNE", "SEQ",
93 "SVC", "SVS", "SPL", "SMI",
94 "SGE", "SLT", "SGT", "SLE"
95};
96
97static const char *op_trapcc[16] = {
98 "TRAPT", "TRAPF", "TRAPHI", "TRAPLS",
99 "TRAPCC", "TRAPCS", "TRAPNE", "TRAPEQ",
100 "TRAPVC", "TRAPVS", "TRAPPL", "TRAPMI",
101 "TRAPGE", "TRAPLT", "TRAPGT", "TRAPLE"
102};
103
104static const char *hex_prefix = "$";
105
106
107static
108void dasm_reginterval (char *dst, unsigned i, unsigned n, int *first)
109{
110 const char *reg;
111 char tmp[32];
112
113 if (i < 8) {
114 reg = "D";
115 }
116 else {
117 reg = "A";
118 i -= 8;
119 }
120
121 if (*first == 0) {
122 strcat (dst, "/");
123 }
124
125 if (n > 2) {
126 sprintf (tmp, "%s%u-%s%u", reg, i, reg, i + n - 1);
127 }
128 else if (n == 2) {
129 sprintf (tmp, "%s%u/%s%u", reg, i, reg, i + 1);
130 }
131 else {
132 sprintf (tmp, "%s%u", reg, i);
133 }
134
135 strcat (dst, tmp);
136
137 *first = 0;
138}
139
140static
141void dasm_reglst (char *dst, uint16_t list, int rev)
142{
143 unsigned i;
144 unsigned ri, rn;
145 int first = 1;
146
147 *dst = 0;
148
149 if (rev) {
150 uint16_t t = list;
151
152 for (i = 0; i < 16; i++) {
153 list = (list << 1) | (t & 1);
154 t = t >> 1;
155 }
156 }
157
158 ri = 0;
159 rn = 0;
160
161 for (i = 0; i < 16; i++) {
162 if ((i == 8) && (rn > 0)) {
163 dasm_reginterval (dst, ri, rn, &first);
164 rn = 0;
165 }
166
167 if (list & (1U << i)) {
168 if (rn == 0) {
169 ri = i;
170 rn = 1;
171 }
172 else {
173 rn += 1;
174 }
175 }
176 else {
177 if (rn > 0) {
178 dasm_reginterval (dst, ri, rn, &first);
179 rn = 0;
180 }
181 }
182 }
183
184 if (rn > 0) {
185 dasm_reginterval (dst, ri, rn, &first);
186 }
187}
188
189static
190void dasm_creg (e68_dasm_t *da, char *dst, uint16_t reg)
191{
192 const char *str;
193
194 switch (reg & 0x0fff) {
195 case 0x000:
196 str = "SFC";
197 da->flags |= E68_DFLAG_68010;
198 break;
199
200 case 0x001:
201 str = "DFC";
202 da->flags |= E68_DFLAG_68010;
203 break;
204
205 case 0x800:
206 str = "USP";
207 da->flags |= E68_DFLAG_68010;
208 break;
209
210 case 0x801:
211 str = "VBR";
212 da->flags |= E68_DFLAG_68010;
213 break;
214
215 default:
216 sprintf (dst, "CR(%u)", reg & 0x0fff);
217 da->flags |= E68_DFLAG_68010;
218 return;
219 }
220
221 strcpy (dst, str);
222}
223
224static inline
225unsigned dasm_next_word (e68_dasm_t *da, const uint8_t *src)
226{
227 unsigned val;
228
229 val = e68_get_uint16 (src, 2 * da->irn);
230
231 da->irn += 1;
232
233 return (val);
234}
235
236static
237void dasm_ea_full (e68_dasm_t *da, char *dst, const uint8_t *src)
238{
239 uint16_t ext;
240 uint32_t v;
241 char br[16], ix[16], bd[16], od[16], scale[16];
242 int bs, is;
243
244 ext = da->ir[1];
245
246 bs = (ext & 0x0080) != 0;
247 is = (ext & 0x0040) != 0;
248
249 if (bs) {
250 strcpy (br, "-");
251 }
252 else {
253 if ((da->ir[0] & 0x38) == 0x38) {
254 strcpy (br, "PC");
255 }
256 else {
257 sprintf (br, "A%u", da->ir[0] & 0x07);
258 }
259 }
260
261 if (is) {
262 strcpy (ix, "-");
263 }
264 else {
265 sprintf (ix, "%s%u%s",
266 (ext & 0x8000) ? "A" : "D",
267 (ext >> 12) & 7,
268 (ext & 0x0800) ? ".L" : ".W"
269 );
270 }
271
272 if (((ext >> 9) & 3) == 0) {
273 strcpy (scale, "");
274 }
275 else {
276 sprintf (scale, "*%u", 1 << ((ext >> 9) & 3));
277 }
278
279 switch ((ext >> 4) & 3) {
280 case 0:
281 case 1:
282 strcpy (bd, "-");
283 break;
284
285 case 2:
286 v = dasm_next_word (da, src);
287 sprintf (bd, "%s%s%04X",
288 (v & 0x8000) ? "-" : "",
289 hex_prefix,
290 (v & 0x8000) ? ((~v + 1) & 0xffff) : v
291 );
292 break;
293
294 case 3:
295 v = dasm_next_word (da, src);
296 v = (v << 16) | dasm_next_word (da, src);
297 sprintf (bd, "%s%s%08X",
298 (v & 0x80000000) ? "-" : "",
299 hex_prefix,
300 (v & 0x80000000) ? ((~v + 1) & 0xffffffff) : v
301 );
302 break;
303 }
304
305 switch (ext & 3) {
306 case 0:
307 case 1:
308 strcpy (od, "-");
309 break;
310 case 2:
311 v = dasm_next_word (da, src);
312 sprintf (od, "%s%s%04X",
313 (v & 0x8000) ? "-" : "",
314 hex_prefix,
315 (v & 0x8000) ? ((~v + 1) & 0xffff) : v
316 );
317 break;
318
319 case 3:
320 v = dasm_next_word (da, src);
321 v = (v << 16) | dasm_next_word (da, src);
322 sprintf (od, "%s%s%08X",
323 (v & 0x80000000) ? "-" : "",
324 hex_prefix,
325 (v & 0x80000000) ? ((~v + 1) & 0xffffffff) : v
326 );
327 break;
328 }
329
330 if (ext & 4) {
331 sprintf (dst, "([%s, %s], %s%s, %s)", br, bd, ix, scale, od);
332 }
333 else {
334 sprintf (dst, "([%s, %s, %s%s], %s)", br, bd, ix, scale, od);
335 }
336
337 da->flags |= E68_DFLAG_68020;
338}
339
340static
341void dasm_ea (e68_dasm_t *da, char *dst, const uint8_t *src, unsigned ea, unsigned size)
342{
343 unsigned v;
344 unsigned long v1, v2;
345
346 switch ((ea >> 3) & 7) {
347 case 0x00: /* %Dx */
348 sprintf (dst, "D%u", ea & 7);
349 break;
350
351 case 0x01: /* %Ax */
352 sprintf (dst, "A%u", ea & 7);
353 break;
354
355 case 0x02: /* (%Ax) */
356 sprintf (dst, "(A%u)", ea & 7);
357 break;
358
359 case 0x03: /* (%Ax)+ */
360 sprintf (dst, "(A%u)+", ea & 7);
361 break;
362
363 case 0x04: /* -(%Ax) */
364 sprintf (dst, "-(A%u)", ea & 7);
365 break;
366
367 case 0x05: /* XXXX(%Ax) */
368 v = dasm_next_word (da, src);
369 sprintf (dst, "%s%s%04X(A%u)",
370 (v & 0x8000) ? "-" : "",
371 hex_prefix,
372 ((v & 0x8000) ? (~v + 1) : v) & 0xffff,
373 ea & 7
374 );
375 break;
376
377 case 0x06: /* XX(%Ax, Rx.S) */
378 v = dasm_next_word (da, src);
379 if (v & 0x0100) {
380 dasm_ea_full (da, dst, src);
381 }
382 else {
383 sprintf (dst, "%s%s%02X(A%u, %s%u%s*%u)",
384 (v & 0x80) ? "-" : "",
385 hex_prefix,
386 ((v & 0x80) ? (~v + 1) : v) & 0xff,
387 ea & 7,
388 (v & 0x8000) ? "A" : "D",
389 (v >> 12) & 7,
390 (v & 0x0800) ? ".L" : ".W",
391 1 << ((v >> 9) & 3)
392 );
393
394 if (v & 0x0600) {
395 da->flags |= E68_DFLAG_68020;
396 }
397 }
398 break;
399
400 case 0x07:
401 switch (ea & 7) {
402 case 0x00: /* XXXX */
403 v = dasm_next_word (da, src);
404 sprintf (dst, "%s%s%04X",
405 (v & 0x8000) ? "-" : "",
406 hex_prefix,
407 ((v & 0x8000) ? (~v + 1) : v) & 0xffff
408 );
409 break;
410
411 case 0x01: /* XXXXXXXX */
412 v1 = dasm_next_word (da, src);
413 v2 = dasm_next_word (da, src);
414 sprintf (dst, "%s%08lX",
415 hex_prefix,
416 (v1 << 16) | v2
417 );
418 break;
419
420 case 0x02: /* XXXX(PC) */
421 v = dasm_next_word (da, src);
422 v1 = (da->pc + e68_exts16 (v) + 2) & 0xffffffff;
423 sprintf (dst, "%s%08lX(PC)", hex_prefix, v1);
424 break;
425
426 case 0x03: /* XX(PC, Rx.S) */
427 v = dasm_next_word (da, src);
428 if (v & 0x0100) {
429 dasm_ea_full (da, dst, src);
430 }
431 else {
432 sprintf (dst, "%s%s%02X(PC, %s%u%s*%u)",
433 (v & 0x80) ? "-" : "",
434 hex_prefix,
435 ((v & 0x80) ? (~v + 1) : v) & 0xff,
436 (v & 0x8000) ? "A" : "D",
437 (v >> 12) & 7,
438 (v & 0x0800) ? ".L" : ".W",
439 1 << ((v >> 9) & 3)
440 );
441 if (v & 0x0600) {
442 da->flags |= E68_DFLAG_68020;
443 }
444 }
445 break;
446
447 case 0x04: /* #XXXX */
448 if (size == 8) {
449 v = dasm_next_word (da, src) & 0xff;
450 sprintf (dst, "#%s%02X", hex_prefix, v);
451 }
452 else if (size == 16) {
453 v = dasm_next_word (da, src);
454 sprintf (dst, "#%s%04X", hex_prefix, v);
455 }
456 else if (size == 32) {
457 v1 = dasm_next_word (da, src);
458 v2 = dasm_next_word (da, src);
459 sprintf (dst, "#%s%08lX",
460 hex_prefix,
461 (v1 << 16) | v2
462 );
463 }
464
465 break;
466
467 default:
468 sprintf (dst, "<EA>(%02X)", ea & 0x3f);
469 break;
470 }
471 break;
472
473 default:
474 sprintf (dst, "<EA>(%02X)", ea & 0x3f);
475 break;
476 }
477}
478
479static
480void dasm_arg_bitfield (e68_dasm_t *da, char *dst, const uint8_t *src)
481{
482 unsigned width;
483
484 da->ir[da->irn] = dasm_next_word (da, src);
485
486 dasm_ea (da, dst, src, src[1] & 0x3f, 8);
487 dst += strlen (dst);
488
489 *(dst++) = ' ';
490 *(dst++) = '{';
491
492 if ((da->ir[1] >> 11) & 1) {
493 sprintf (dst, "D%u", (da->ir[1] >> 6) & 7);
494 }
495 else {
496 sprintf (dst, "%u", (da->ir[1] >> 6) & 31);
497 }
498
499 dst += strlen (dst);
500
501 *(dst++) = ':';
502
503 width = (da->ir[1] & 31);
504
505 if (width == 0) {
506 width = 32;
507 }
508
509 if ((da->ir[1] >> 5) & 1) {
510 sprintf (dst, "D%u", width & 7);
511 }
512 else {
513 sprintf (dst, "%u", width);
514 }
515
516 dst += strlen (dst);
517
518 strcpy (dst, "}");
519}
520
521static
522void dasm_arg (e68_dasm_t *da, char *dst, const uint8_t *src, unsigned arg, unsigned size)
523{
524 uint16_t val16;
525 uint32_t val32;
526
527 switch (arg) {
528 case ARG_NONE:
529 dst[0] = 0;
530 break;
531
532 case ARG_IR:
533 sprintf (dst, "#%s%04X",
534 hex_prefix,
535 (unsigned) e68_get_uint16 (src, 0)
536 );
537 break;
538
539 case ARG_IR1:
540 sprintf (dst, "#%s%04X",
541 hex_prefix,
542 (unsigned) e68_get_uint16 (src, 2)
543 );
544 break;
545
546 case ARG_EA:
547 dasm_ea (da, dst, src, src[1] & 0x3f, size);
548 break;
549
550 case ARG_EA2:
551 val16 = (src[0] << 8) | src[1];
552 dasm_ea (da, dst, src,
553 ((val16 >> 3) & 0x38) | ((val16 >> 9) & 7), size
554 );
555 break;
556
557 case ARG_DREG0:
558 sprintf (dst, "D%u", da->ir[0] & 7);
559 break;
560
561 case ARG_DREG9:
562 sprintf (dst, "D%u", (unsigned) ((src[0] >> 1) & 7));
563 break;
564
565 case ARG_AREG0:
566 sprintf (dst, "A%u", da->ir[0] & 7);
567 break;
568
569 case ARG_AREG9:
570 sprintf (dst, "A%u", (unsigned) ((src[0] >> 1) & 7));
571 break;
572
573 case ARG_REG_IR1_12:
574 sprintf (dst, "%s%u", (src[2] & 0x80) ? "A" : "D",
575 (unsigned) ((src[2] >> 4) & 7)
576 );
577 break;
578
579 case ARG_AREG0PI:
580 sprintf (dst, "(A%u)+", (unsigned) (da->ir[0] & 7));
581 break;
582
583 case ARG_AREG9PI:
584 sprintf (dst, "(A%u)+", (unsigned) ((da->ir[0] >> 9) & 7));
585 break;
586
587 case ARG_AREG0PD:
588 sprintf (dst, "-(A%u)", (unsigned) (da->ir[0] & 7));
589 break;
590
591 case ARG_AREG9PD:
592 sprintf (dst, "-(A%u)", (unsigned) ((da->ir[0] >> 9) & 7));
593 break;
594
595 case ARG_AREG0DISP:
596 val16 = e68_get_uint16 (src, 2);
597 sprintf (dst, "%s%s%04X(A%u)",
598 (val16 & 0x8000) ? "-" : "",
599 hex_prefix,
600 ((val16 & 0x8000) ? (~val16 + 1) : val16) & 0xffff,
601 (unsigned) (da->ir[0] & 7)
602 );
603 da->irn += 1;
604 break;
605
606 case ARG_IMM8:
607 sprintf (dst, "#%s%02X", hex_prefix, (unsigned) src[3]);
608 da->irn += 1;
609 break;
610
611 case ARG_IMM16:
612 val16 = e68_get_uint16 (src, 2);
613 sprintf (dst, "#%s%04X", hex_prefix, (unsigned) val16);
614 da->irn += 1;
615 break;
616
617 case ARG_IMM32:
618 val32 = e68_get_uint32 (src, 2);
619 sprintf (dst, "#%s%08lX", hex_prefix, (unsigned long) val32);
620 da->irn += 2;
621 break;
622
623 case ARG_IMMQ:
624 val16 = (src[0] >> 1) & 7;
625 val16 = (val16 == 0) ? 8 : val16;
626 sprintf (dst, "#%s%X", hex_prefix, (unsigned) val16);
627 break;
628
629 case ARG_IRUIMM4:
630 sprintf (dst, "#%s%02X",
631 hex_prefix,
632 (unsigned) (da->ir[0] & 0x0f)
633 );
634 break;
635
636 case ARG_IRSIMM8:
637 sprintf (dst, "#%s%08lX",
638 hex_prefix,
639 (unsigned long) e68_exts8 (da->ir[0])
640 );
641 break;
642
643 case ARG_DIST8:
644 sprintf (dst, "%s%08lX",
645 hex_prefix,
646 (da->pc + 2UL + e68_exts8 (src[1])) & 0xffffffff
647 );
648 break;
649
650 case ARG_DIST16:
651 val16 = e68_get_uint16 (src, 2 * da->irn);
652 da->irn += 1;
653 sprintf (dst, "%s%08lX",
654 hex_prefix,
655 (da->pc + 2UL + e68_exts16 (val16)) & 0xffffffff
656 );
657 break;
658
659 case ARG_DIST32:
660 val32 = e68_get_uint32 (src, 2 * da->irn);
661 da->irn += 2;
662 sprintf (dst, "%s%08lX",
663 hex_prefix,
664 (da->pc + 2UL + val32) & 0xffffffff
665 );
666 break;
667
668 case ARG_REGLST:
669 dasm_reglst (dst, e68_get_uint16 (src, 2), 0);
670 da->irn += 1;
671 break;
672
673 case ARG_REVLST:
674 dasm_reglst (dst, e68_get_uint16 (src, 2), 1);
675 da->irn += 1;
676 break;
677
678 case ARG_CCR:
679 strcpy (dst, "CCR");
680 break;
681
682 case ARG_SR:
683 strcpy (dst, "SR");
684 break;
685
686 case ARG_USP:
687 strcpy (dst, "USP");
688 break;
689
690 case ARG_CREG:
691 dasm_creg (da, dst, e68_get_uint16 (src, 2));
692 break;
693
694 case ARG_DQDR:
695 sprintf (dst, "D%u:D%u", da->ir[1] & 7, (da->ir[1] >> 12) & 7);
696 break;
697
698 case ARG_DHDL:
699 sprintf (dst, "D%u:D%u", da->ir[1] & 7, (da->ir[1] >> 12) & 7);
700 break;
701
702 case ARG_DL:
703 case ARG_BF_DN:
704 sprintf (dst, "D%u", (da->ir[1] >> 12) & 7);
705 break;
706
707 case ARG_BF:
708 dasm_arg_bitfield (da, dst, src);
709 break;
710
711 default:
712 dst[0] = 0;
713 break;
714 }
715}
716
717static
718int dasm_op0 (e68_dasm_t *da, const char *op)
719{
720 strcpy (da->op, op);
721
722 da->argn = 0;
723
724 return (0);
725}
726
727static
728int dasm_op1 (e68_dasm_t *da, const char *op, const uint8_t *src,
729 unsigned arg1, unsigned size)
730{
731 strcpy (da->op, op);
732
733 da->argn = 1;
734 dasm_arg (da, da->arg1, src, arg1, size);
735
736 return (0);
737}
738
739static
740int dasm_op2 (e68_dasm_t *da, const char *op, const uint8_t *src,
741 unsigned arg1, unsigned arg2, unsigned size)
742{
743 strcpy (da->op, op);
744
745 da->argn = 2;
746 dasm_arg (da, da->arg1, src, arg1, size);
747 dasm_arg (da, da->arg2, src, arg2, size);
748
749 return (0);
750}
751
752static
753int dasm_op2r (e68_dasm_t *da, const char *op, const uint8_t *src,
754 unsigned arg1, unsigned arg2, unsigned size)
755{
756 strcpy (da->op, op);
757
758 da->argn = 2;
759 dasm_arg (da, da->arg2, src, arg2, size);
760 dasm_arg (da, da->arg1, src, arg1, size);
761
762 return (0);
763}
764
765
766/* 0000: ORI.B #XX, <EA> */
767static void d_0000 (e68_dasm_t *da, const uint8_t *src)
768{
769 if ((da->ir[0] & 0x003f) == 0x003c) {
770 dasm_op2 (da, "ORI.B", src, ARG_IMM8, ARG_CCR, 8);
771 }
772 else {
773 dasm_op2 (da, "ORI.B", src, ARG_IMM8, ARG_EA, 8);
774 }
775}
776
777/* 0040: ORI.W #XXXX, <EA> */
778static void d_0040 (e68_dasm_t *da, const uint8_t *src)
779{
780 if ((da->ir[0] & 0x003f) == 0x003c) {
781 dasm_op2 (da, "ORI.W", src, ARG_IMM16, ARG_SR, 16);
782 da->flags |= E68_DFLAG_PRIV;
783 }
784 else {
785 dasm_op2 (da, "ORI.W", src, ARG_IMM16, ARG_EA, 16);
786 }
787}
788
789/* 0080: ORI.L #XXXXXXXX, <EA> */
790static void d_0080 (e68_dasm_t *da, const uint8_t *src)
791{
792 dasm_op2 (da, "ORI.L", src, ARG_IMM32, ARG_EA, 32);
793}
794
795/* 00C0: CHK2.B <EA>, Rn */
796static void d_00c0 (e68_dasm_t *da, const uint8_t *src)
797{
798 unsigned ir1;
799
800 ir1 = dasm_next_word (da, src);
801
802 if (ir1 & 0x0800) {
803 dasm_op2 (da, "CHK2.B", src, ARG_EA, ARG_REG_IR1_12, 8);
804 }
805 else {
806 dasm_op2 (da, "CMP2.B", src, ARG_EA, ARG_REG_IR1_12, 8);
807 }
808
809 da->flags |= E68_DFLAG_68020;
810}
811
812/* 0100: misc */
813static void d_0100 (e68_dasm_t *da, const uint8_t *src)
814{
815 switch ((da->ir[0] >> 3) & 7) {
816 case 0x01:
817 dasm_op2 (da, "MOVEP.W", src, ARG_AREG0DISP, ARG_DREG9, 16);
818 break;
819
820 default:
821 dasm_op2 (da, "BTST", src, ARG_DREG9, ARG_EA, 8);
822 break;
823 }
824}
825
826/* 0140: misc */
827static void d_0140 (e68_dasm_t *da, const uint8_t *src)
828{
829 switch ((da->ir[0] >> 3) & 7) {
830 case 0x01:
831 dasm_op2 (da, "MOVEP.L", src, ARG_AREG0DISP, ARG_DREG9, 32);
832 break;
833
834 default:
835 dasm_op2 (da, "BCHG", src, ARG_DREG9, ARG_EA, 8);
836 break;
837 }
838}
839
840/* 0180: misc */
841static void d_0180 (e68_dasm_t *da, const uint8_t *src)
842{
843 switch ((da->ir[0] >> 3) & 7) {
844 case 0x01:
845 dasm_op2 (da, "MOVEP.W", src, ARG_DREG9, ARG_AREG0DISP, 16);
846 break;
847
848 default:
849 dasm_op2 (da, "BCLR", src, ARG_DREG9, ARG_EA, 8);
850 break;
851 }
852}
853
854/* 01C0: misc */
855static void d_01c0 (e68_dasm_t *da, const uint8_t *src)
856{
857 switch ((da->ir[0] >> 3) & 7) {
858 case 0x01:
859 dasm_op2 (da, "MOVEP.L", src, ARG_DREG9, ARG_AREG0DISP, 32);
860 break;
861
862 default:
863 dasm_op2 (da, "BSET", src, ARG_DREG9, ARG_EA, 8);
864 break;
865 }
866}
867
868/* 0200: ANDI.B #XX, EA */
869static void d_0200 (e68_dasm_t *da, const uint8_t *src)
870{
871 if ((da->ir[0] & 0x003f) == 0x003c) {
872 dasm_op2 (da, "ANDI.B", src, ARG_IMM8, ARG_CCR, 8);
873 }
874 else {
875 dasm_op2 (da, "ANDI.B", src, ARG_IMM8, ARG_EA, 8);
876 }
877}
878
879/* 0240: ANDI.W #XXXX, EA */
880static void d_0240 (e68_dasm_t *da, const uint8_t *src)
881{
882 if ((da->ir[0] & 0x003f) == 0x003c) {
883 dasm_op2 (da, "ANDI.W", src, ARG_IMM16, ARG_SR, 16);
884 da->flags |= E68_DFLAG_PRIV;
885 }
886 else {
887 dasm_op2 (da, "ANDI.W", src, ARG_IMM16, ARG_EA, 16);
888 }
889}
890
891/* 0280: ANDI.L #XXXXXXXX, <EA> */
892static void d_0280 (e68_dasm_t *da, const uint8_t *src)
893{
894 dasm_op2 (da, "ANDI.L", src, ARG_IMM32, ARG_EA, 32);
895}
896
897/* 02C0: CHK2.W <EA>, Rn */
898static void d_02c0 (e68_dasm_t *da, const uint8_t *src)
899{
900 unsigned ir1;
901
902 ir1 = dasm_next_word (da, src);
903
904 if (ir1 & 0x0800) {
905 dasm_op2 (da, "CHK2.W", src, ARG_EA, ARG_REG_IR1_12, 16);
906 }
907 else {
908 dasm_op2 (da, "CMP2.W", src, ARG_EA, ARG_REG_IR1_12, 16);
909 }
910
911 da->flags |= E68_DFLAG_68020;
912}
913
914/* 0400: SUBI.B #XX, <EA> */
915static void d_0400 (e68_dasm_t *da, const uint8_t *src)
916{
917 dasm_op2 (da, "SUBI.B", src, ARG_IMM8, ARG_EA, 8);
918}
919
920/* 0440: SUBI.W #XXXX, <EA> */
921static void d_0440 (e68_dasm_t *da, const uint8_t *src)
922{
923 dasm_op2 (da, "SUBI.W", src, ARG_IMM16, ARG_EA, 16);
924}
925
926/* 0480: ADDI.L #XXXXXXXX, <EA> */
927static void d_0480 (e68_dasm_t *da, const uint8_t *src)
928{
929 dasm_op2 (da, "SUBI.L", src, ARG_IMM32, ARG_EA, 32);
930}
931
932/* 04C0: CHK2.L <EA>, Rn */
933static void d_04c0 (e68_dasm_t *da, const uint8_t *src)
934{
935 unsigned ir1;
936
937 ir1 = dasm_next_word (da, src);
938
939 if (ir1 & 0x0800) {
940 dasm_op2 (da, "CHK2.L", src, ARG_EA, ARG_REG_IR1_12, 32);
941 }
942 else {
943 dasm_op2 (da, "CMP2.L", src, ARG_EA, ARG_REG_IR1_12, 32);
944 }
945
946 da->flags |= E68_DFLAG_68020;
947}
948
949/* 0600: ADDI.B #XX, <EA> */
950static void d_0600 (e68_dasm_t *da, const uint8_t *src)
951{
952 dasm_op2 (da, "ADDI.B", src, ARG_IMM8, ARG_EA, 8);
953}
954
955/* 0640: ADDI.W #XXXX, <EA> */
956static void d_0640 (e68_dasm_t *da, const uint8_t *src)
957{
958 dasm_op2 (da, "ADDI.W", src, ARG_IMM16, ARG_EA, 16);
959}
960
961/* 0680: ADDI.L #XXXXXXXX, <EA> */
962static void d_0680 (e68_dasm_t *da, const uint8_t *src)
963{
964 dasm_op2 (da, "ADDI.L", src, ARG_IMM32, ARG_EA, 32);
965}
966
967/* 0800: BTST #XX, <EA> */
968static void d_0800 (e68_dasm_t *da, const uint8_t *src)
969{
970 dasm_op2 (da, "BTST", src, ARG_IMM8, ARG_EA, 8);
971}
972
973/* 0840: BCHG #XX, <EA> */
974static void d_0840 (e68_dasm_t *da, const uint8_t *src)
975{
976 dasm_op2 (da, "BCHG", src, ARG_IMM8, ARG_EA, 8);
977}
978
979/* 0880: BCLR #XX, <EA> */
980static void d_0880 (e68_dasm_t *da, const uint8_t *src)
981{
982 dasm_op2 (da, "BCLR", src, ARG_IMM8, ARG_EA, 8);
983}
984
985/* 08C0: BSET #XX, <EA> */
986static void d_08c0 (e68_dasm_t *da, const uint8_t *src)
987{
988 dasm_op2 (da, "BSET", src, ARG_IMM8, ARG_EA, 8);
989}
990
991/* 0A00: EORI.B #XX, <EA> */
992static void d_0a00 (e68_dasm_t *da, const uint8_t *src)
993{
994 if ((da->ir[0] & 0x003f) == 0x003c) {
995 dasm_op2 (da, "EORI.B", src, ARG_IMM8, ARG_CCR, 8);
996 }
997 else {
998 dasm_op2 (da, "EORI.B", src, ARG_IMM8, ARG_EA, 8);
999 }
1000}
1001
1002/* 0A40: EORI.W #XXXX, <EA> */
1003static void d_0a40 (e68_dasm_t *da, const uint8_t *src)
1004{
1005 if ((da->ir[0] & 0x003f) == 0x003c) {
1006 dasm_op2 (da, "EORI.W", src, ARG_IMM16, ARG_SR, 16);
1007 da->flags |= E68_DFLAG_PRIV;
1008 }
1009 else {
1010 dasm_op2 (da, "EORI.W", src, ARG_IMM16, ARG_EA, 16);
1011 }
1012}
1013
1014/* 0A80: EORI.L #XXXXXXXX, <EA> */
1015static void d_0a80 (e68_dasm_t *da, const uint8_t *src)
1016{
1017 dasm_op2 (da, "EORI.L", src, ARG_IMM32, ARG_EA, 32);
1018}
1019
1020/* 0C00: CMPI.B #XX, <EA> */
1021static void d_0c00 (e68_dasm_t *da, const uint8_t *src)
1022{
1023 dasm_op2 (da, "CMPI.B", src, ARG_IMM8, ARG_EA, 8);
1024}
1025
1026/* 0C40: CMPI.W #XXXX, <EA> */
1027static void d_0c40 (e68_dasm_t *da, const uint8_t *src)
1028{
1029 dasm_op2 (da, "CMPI.W", src, ARG_IMM16, ARG_EA, 16);
1030}
1031
1032/* 0C80: CMPI.L #XXXXXXXX, EA */
1033static void d_0c80 (e68_dasm_t *da, const uint8_t *src)
1034{
1035 dasm_op2 (da, "CMPI.L", src, ARG_IMM32, ARG_EA, 32);
1036}
1037
1038/* 0E00: MOVS.B Rn, <EA> / MOVES.B <EA>, Rn*/
1039static void d_0e00 (e68_dasm_t *da, const uint8_t *src)
1040{
1041 unsigned ir1;
1042
1043 ir1 = dasm_next_word (da, src);
1044
1045 if (ir1 & 0x0800) {
1046 dasm_op2 (da, "MOVS.B", src, ARG_REG_IR1_12, ARG_EA, 8);
1047 }
1048 else {
1049 dasm_op2 (da, "MOVS.B", src, ARG_EA, ARG_REG_IR1_12, 8);
1050 }
1051
1052 da->flags |= E68_DFLAG_68010;
1053}
1054
1055/* 0E40: MOVS.W Rn, <EA> / MOVES.W <EA>, Rn*/
1056static void d_0e40 (e68_dasm_t *da, const uint8_t *src)
1057{
1058 unsigned ir1;
1059
1060 ir1 = dasm_next_word (da, src);
1061
1062 if (ir1 & 0x0800) {
1063 dasm_op2 (da, "MOVS.W", src, ARG_REG_IR1_12, ARG_EA, 16);
1064 }
1065 else {
1066 dasm_op2 (da, "MOVS.W", src, ARG_EA, ARG_REG_IR1_12, 16);
1067 }
1068
1069 da->flags |= E68_DFLAG_68010;
1070}
1071
1072/* 0E80: MOVS.L Rn, <EA> / MOVES.W <EA>, Rn*/
1073static void d_0e80 (e68_dasm_t *da, const uint8_t *src)
1074{
1075 unsigned ir1;
1076
1077 ir1 = dasm_next_word (da, src);
1078
1079 if (ir1 & 0x0800) {
1080 dasm_op2 (da, "MOVS.L", src, ARG_REG_IR1_12, ARG_EA, 32);
1081 }
1082 else {
1083 dasm_op2 (da, "MOVS.L", src, ARG_EA, ARG_REG_IR1_12, 32);
1084 }
1085
1086 da->flags |= E68_DFLAG_68010;
1087}
1088
1089/* 1000: MOVE.B EA, EA */
1090static void d_1000 (e68_dasm_t *da, const uint8_t *src)
1091{
1092 dasm_op2 (da, "MOVE.B", src, ARG_EA, ARG_EA2, 8);
1093}
1094
1095/* 2000: MOVE.L EA, EA */
1096static void d_2000 (e68_dasm_t *da, const uint8_t *src)
1097{
1098 dasm_op2 (da, "MOVE.L", src, ARG_EA, ARG_EA2, 32);
1099}
1100
1101/* 2040: MOVEA.L EA, Ax */
1102static void d_2040 (e68_dasm_t *da, const uint8_t *src)
1103{
1104 dasm_op2 (da, "MOVEA.L", src, ARG_EA, ARG_AREG9, 32);
1105}
1106
1107/* 3000: MOVE.W EA, EA */
1108static void d_3000 (e68_dasm_t *da, const uint8_t *src)
1109{
1110 dasm_op2 (da, "MOVE.W", src, ARG_EA, ARG_EA2, 16);
1111}
1112
1113/* 3040: MOVEA.W EA, Ax */
1114static void d_3040 (e68_dasm_t *da, const uint8_t *src)
1115{
1116 dasm_op2 (da, "MOVEA.W", src, ARG_EA, ARG_AREG9, 16);
1117}
1118
1119/* 4000: NEGX.B <EA> */
1120static void d_4000 (e68_dasm_t *da, const uint8_t *src)
1121{
1122 dasm_op1 (da, "NEGX.B", src, ARG_EA, 8);
1123 da->flags |= E68_DFLAG_DEP_CC;
1124}
1125
1126/* 4040: NEGX.W <EA> */
1127static void d_4040 (e68_dasm_t *da, const uint8_t *src)
1128{
1129 dasm_op1 (da, "NEGX.W", src, ARG_EA, 16);
1130 da->flags |= E68_DFLAG_DEP_CC;
1131}
1132
1133/* 4080: NEGX.L <EA> */
1134static void d_4080 (e68_dasm_t *da, const uint8_t *src)
1135{
1136 dasm_op1 (da, "NEGX.L", src, ARG_EA, 32);
1137 da->flags |= E68_DFLAG_DEP_CC;
1138}
1139
1140/* 40C0: MOVE.W SR, <EA> */
1141static void d_40c0 (e68_dasm_t *da, const uint8_t *src)
1142{
1143 dasm_op2 (da, "MOVE.W", src, ARG_SR, ARG_EA, 16);
1144}
1145
1146/* 4180: CHK <EA>, Dx */
1147static void d_4180 (e68_dasm_t *da, const uint8_t *src)
1148{
1149 dasm_op2 (da, "CHK", src, ARG_EA, ARG_DREG9, 16);
1150}
1151
1152/* 41C0: LEA EA, Ax */
1153static void d_41c0 (e68_dasm_t *da, const uint8_t *src)
1154{
1155 dasm_op2 (da, "LEA", src, ARG_EA, ARG_AREG9, 32);
1156}
1157
1158/* 4200: CLR.B <EA> */
1159static void d_4200 (e68_dasm_t *da, const uint8_t *src)
1160{
1161 dasm_op1 (da, "CLR.B", src, ARG_EA, 8);
1162}
1163
1164/* 4240: CLR.W <EA> */
1165static void d_4240 (e68_dasm_t *da, const uint8_t *src)
1166{
1167 dasm_op1 (da, "CLR.W", src, ARG_EA, 16);
1168}
1169
1170/* 4280: CLR.L <EA> */
1171static void d_4280 (e68_dasm_t *da, const uint8_t *src)
1172{
1173 dasm_op1 (da, "CLR.L", src, ARG_EA, 32);
1174}
1175
1176/* 42C0: MOVE.W CCR, <EA> */
1177static void d_42c0 (e68_dasm_t *da, const uint8_t *src)
1178{
1179 dasm_op2 (da, "MOVE.W", src, ARG_CCR, ARG_EA, 16);
1180 da->flags |= E68_DFLAG_68010;
1181}
1182
1183/* 4400: NEG.B <EA> */
1184static void d_4400 (e68_dasm_t *da, const uint8_t *src)
1185{
1186 dasm_op1 (da, "NEG.B", src, ARG_EA, 8);
1187}
1188
1189/* 4440: NEG.W <EA> */
1190static void d_4440 (e68_dasm_t *da, const uint8_t *src)
1191{
1192 dasm_op1 (da, "NEG.W", src, ARG_EA, 16);
1193}
1194
1195/* 4480: NEG.L <EA> */
1196static void d_4480 (e68_dasm_t *da, const uint8_t *src)
1197{
1198 dasm_op1 (da, "NEG.L", src, ARG_EA, 32);
1199}
1200
1201/* 44C0: MOVE.W <EA>, CCR */
1202static void d_44c0 (e68_dasm_t *da, const uint8_t *src)
1203{
1204 dasm_op2 (da, "MOVE.W", src, ARG_EA, ARG_CCR, 16);
1205}
1206
1207/* 4600: NOT.B <EA> */
1208static void d_4600 (e68_dasm_t *da, const uint8_t *src)
1209{
1210 dasm_op1 (da, "NOT.B", src, ARG_EA, 8);
1211}
1212
1213/* 4640: NOT.W <EA> */
1214static void d_4640 (e68_dasm_t *da, const uint8_t *src)
1215{
1216 dasm_op1 (da, "NOT.W", src, ARG_EA, 16);
1217}
1218
1219/* 4680: NOT.L <EA> */
1220static void d_4680 (e68_dasm_t *da, const uint8_t *src)
1221{
1222 dasm_op1 (da, "NOT.L", src, ARG_EA, 32);
1223}
1224
1225/* 46C0: MOVE.W <EA>, SR */
1226static void d_46c0 (e68_dasm_t *da, const uint8_t *src)
1227{
1228 dasm_op2 (da, "MOVE.W", src, ARG_EA, ARG_SR, 16);
1229 da->flags |= E68_DFLAG_PRIV;
1230}
1231
1232/* 4800: NBCD.B <EA> */
1233static void d_4800 (e68_dasm_t *da, const uint8_t *src)
1234{
1235 dasm_op1 (da, "NBCD.B", src, ARG_EA, 8);
1236 da->flags |= E68_DFLAG_DEP_CC;
1237}
1238
1239/* 4840: misc */
1240static void d_4840 (e68_dasm_t *da, const uint8_t *src)
1241{
1242 switch ((da->ir[0] >> 3) & 7) {
1243 case 0x00:
1244 dasm_op1 (da, "SWAP", src, ARG_DREG0, 32);
1245 break;
1246
1247 default:
1248 dasm_op1 (da, "PEA", src, ARG_EA, 32);
1249 break;
1250 }
1251}
1252
1253/* 4880: misc */
1254static void d_4880 (e68_dasm_t *da, const uint8_t *src)
1255{
1256 switch ((da->ir[0] >> 3) & 7) {
1257 case 0x00:
1258 dasm_op1 (da, "EXT.W", src, ARG_DREG0, 16);
1259 break;
1260
1261 case 0x04:
1262 dasm_op2 (da, "MOVEM.W", src, ARG_REVLST, ARG_EA, 16);
1263 break;
1264
1265 default:
1266 dasm_op2 (da, "MOVEM.W", src, ARG_REGLST, ARG_EA, 16);
1267 break;
1268 }
1269}
1270
1271/* 48C0: misc */
1272static void d_48c0 (e68_dasm_t *da, const uint8_t *src)
1273{
1274 switch ((da->ir[0] >> 3) & 7) {
1275 case 0x00:
1276 dasm_op1 (da, "EXT.L", src, ARG_DREG0, 32);
1277 break;
1278
1279 case 0x04:
1280 dasm_op2 (da, "MOVEM.L", src, ARG_REVLST, ARG_EA, 32);
1281 break;
1282
1283 default:
1284 dasm_op2 (da, "MOVEM.L", src, ARG_REGLST, ARG_EA, 32);
1285 break;
1286 }
1287}
1288
1289/* 49C0: misc */
1290static void d_49c0 (e68_dasm_t *da, const uint8_t *src)
1291{
1292 switch ((da->ir[0] >> 3) & 7) {
1293 case 0x00:
1294 dasm_op1 (da, "EXTB.L", src, ARG_DREG0, 32);
1295 da->flags |= E68_DFLAG_68020;
1296 break;
1297
1298 default:
1299 d_41c0 (da, src);
1300 break;
1301 }
1302}
1303
1304/* 4A00: TST.B <EA> */
1305static void d_4a00 (e68_dasm_t *da, const uint8_t *src)
1306{
1307 dasm_op1 (da, "TST.B", src, ARG_EA, 8);
1308}
1309
1310/* 4A40: TST.W <EA> */
1311static void d_4a40 (e68_dasm_t *da, const uint8_t *src)
1312{
1313 dasm_op1 (da, "TST.W", src, ARG_EA, 16);
1314}
1315
1316/* 4A80: TST.L <EA> */
1317static void d_4a80 (e68_dasm_t *da, const uint8_t *src)
1318{
1319 dasm_op1 (da, "TST.L", src, ARG_EA, 32);
1320}
1321
1322/* 4AC0: misc */
1323static void d_4ac0 (e68_dasm_t *da, const uint8_t *src)
1324{
1325 if (da->ir[0] == 0x4afc) {
1326 dasm_op0 (da, "ILLEGAL");
1327 da->flags |= E68_DFLAG_CALL;
1328 }
1329 else {
1330 dasm_op1 (da, "TAS", src, ARG_EA, 8);
1331 }
1332}
1333
1334/* 4C00: MULU.L <EA>, [Dh:]Dl */
1335static void d_4c00 (e68_dasm_t *da, const uint8_t *src)
1336{
1337 da->ir[1] = dasm_next_word (da, src);
1338
1339 if (da->ir[1] & 0x0400) {
1340 dasm_op2 (da, "MULU.L", src, ARG_EA, ARG_DHDL, 32);
1341 }
1342 else {
1343 dasm_op2 (da, "MULU.L", src, ARG_EA, ARG_DL, 32);
1344 }
1345
1346 da->flags |= E68_DFLAG_68020;
1347}
1348
1349/* 4C40: DIVU[L].L <EA>, Dq:Dr */
1350static void d_4c40 (e68_dasm_t *da, const uint8_t *src)
1351{
1352 da->ir[1] = dasm_next_word (da, src);
1353
1354 if (da->ir[1] & 0x0400) {
1355 dasm_op2 (da, "DIVUL.L", src, ARG_EA, ARG_DQDR, 32);
1356 }
1357 else {
1358 dasm_op2 (da, "DIVU.L", src, ARG_EA, ARG_DQDR, 32);
1359 }
1360
1361 da->flags |= E68_DFLAG_68020;
1362}
1363
1364/* 4C80: misc */
1365static void d_4c80 (e68_dasm_t *da, const uint8_t *src)
1366{
1367 switch ((da->ir[0] >> 3) & 7) {
1368 case 0x00:
1369 dasm_op1 (da, "DW", src, ARG_IR, 16);
1370 break;
1371
1372 default:
1373 dasm_op2r (da, "MOVEM.W", src, ARG_EA, ARG_REGLST, 16);
1374 break;
1375 }
1376}
1377
1378/* 4CC0: misc */
1379static void d_4cc0 (e68_dasm_t *da, const uint8_t *src)
1380{
1381 switch ((da->ir[0] >> 3) & 7) {
1382 case 0x00:
1383 dasm_op1 (da, "DW", src, ARG_IR, 16);
1384 break;
1385
1386 default:
1387 dasm_op2r (da, "MOVEM.L", src, ARG_EA, ARG_REGLST, 32);
1388 break;
1389 }
1390}
1391
1392/* 4E40: misc */
1393static void d_4e40 (e68_dasm_t *da, const uint8_t *src)
1394{
1395 if (da->ir[0] == 0x4e70) {
1396 dasm_op0 (da, "RESET");
1397 da->flags |= E68_DFLAG_PRIV;
1398 }
1399 else if (da->ir[0] == 0x4e71) {
1400 dasm_op0 (da, "NOP");
1401 }
1402 else if (da->ir[0] == 0x4e72) {
1403 dasm_op1 (da, "STOP", src, ARG_IMM16, 16);
1404 da->flags |= E68_DFLAG_PRIV;
1405 }
1406 else if (da->ir[0] == 0x4e73) {
1407 dasm_op0 (da, "RTE");
1408 da->flags |= E68_DFLAG_PRIV;
1409 da->flags |= E68_DFLAG_RTE;
1410 }
1411 else if (da->ir[0] == 0x4e74) {
1412 dasm_op1 (da, "RTD", src, ARG_IMM16, 16);
1413 da->flags |= E68_DFLAG_RTS;
1414 da->flags |= E68_DFLAG_68010;
1415 }
1416 else if (da->ir[0] == 0x4e75) {
1417 dasm_op0 (da, "RTS");
1418 da->flags |= E68_DFLAG_RTS;
1419 }
1420 else if (da->ir[0] == 0x4e76) {
1421 dasm_op0 (da, "TRAPV");
1422 da->flags |= E68_DFLAG_DEP_CC;
1423 }
1424 else if (da->ir[0] == 0x4e77) {
1425 dasm_op0 (da, "RTR");
1426 }
1427 else if (da->ir[0] == 0x4e7a) {
1428 dasm_next_word (da, src);
1429 dasm_op2 (da, "MOVEC", src, ARG_CREG, ARG_REG_IR1_12, 16);
1430 da->flags |= E68_DFLAG_68010;
1431 }
1432 else if (da->ir[0] == 0x4e7b) {
1433 dasm_next_word (da, src);
1434 dasm_op2 (da, "MOVEC", src, ARG_REG_IR1_12, ARG_CREG, 16);
1435 da->flags |= E68_DFLAG_68010;
1436 }
1437 else if ((da->ir[0] & 0x0030) == 0x0000) {
1438 dasm_op1 (da, "TRAP", src, ARG_IRUIMM4, 0);
1439 }
1440 else if ((da->ir[0] & 0x0038) == 0x0010) {
1441 dasm_op2 (da, "LINK", src, ARG_AREG0, ARG_IMM16, 16);
1442 }
1443 else if ((da->ir[0] & 0x0038) == 0x0018) {
1444 dasm_op1 (da, "UNLK", src, ARG_AREG0, 0);
1445 }
1446 else if ((da->ir[0] & 0x0038) == 0x0020) {
1447 dasm_op2 (da, "MOVE", src, ARG_AREG0, ARG_USP, 0);
1448 da->flags |= E68_DFLAG_PRIV;
1449 }
1450 else if ((da->ir[0] & 0x0038) == 0x0028) {
1451 dasm_op2 (da, "MOVE", src, ARG_USP, ARG_AREG0, 0);
1452 da->flags |= E68_DFLAG_PRIV;
1453 }
1454 else {
1455 dasm_op1 (da, "DW", src, ARG_IR, 16);
1456 }
1457}
1458
1459/* 4E80: JSR <EA> */
1460static void d_4e80 (e68_dasm_t *da, const uint8_t *src)
1461{
1462 dasm_op1 (da, "JSR", src, ARG_EA, 0);
1463 da->flags |= E68_DFLAG_CALL;
1464}
1465
1466/* 4EC0: JMP <EA> */
1467static void d_4ec0 (e68_dasm_t *da, const uint8_t *src)
1468{
1469 dasm_op1 (da, "JMP", src, ARG_EA, 0);
1470 da->flags |= E68_DFLAG_JUMP;
1471}
1472
1473/* 5000: ADDQ.B #X, <EA> */
1474static void d_5000 (e68_dasm_t *da, const uint8_t *src)
1475{
1476 dasm_op2 (da, "ADDQ.B", src, ARG_IMMQ, ARG_EA, 8);
1477}
1478
1479/* 5040: ADDQ.W #X, <EA> */
1480static void d_5040 (e68_dasm_t *da, const uint8_t *src)
1481{
1482 dasm_op2 (da, "ADDQ.W", src, ARG_IMMQ, ARG_EA, 16);
1483}
1484
1485/* 5080: ADDQ.L #X, <EA> */
1486static void d_5080 (e68_dasm_t *da, const uint8_t *src)
1487{
1488 dasm_op2 (da, "ADDQ.L", src, ARG_IMMQ, ARG_EA, 32);
1489}
1490
1491/* 5100: SUBQ.B #X, <EA> */
1492static void d_5100 (e68_dasm_t *da, const uint8_t *src)
1493{
1494 dasm_op2 (da, "SUBQ.B", src, ARG_IMMQ, ARG_EA, 8);
1495}
1496
1497/* 5140: SUBQ.W #X, <EA> */
1498static void d_5140 (e68_dasm_t *da, const uint8_t *src)
1499{
1500 dasm_op2 (da, "SUBQ.W", src, ARG_IMMQ, ARG_EA, 16);
1501}
1502
1503/* 5180: SUBQ.L #X, <EA> */
1504static void d_5180 (e68_dasm_t *da, const uint8_t *src)
1505{
1506 dasm_op2 (da, "SUBQ.L", src, ARG_IMMQ, ARG_EA, 32);
1507}
1508
1509/* 50C0: misc */
1510static void d_50c0 (e68_dasm_t *da, const uint8_t *src)
1511{
1512 unsigned c, op;
1513
1514 c = (da->ir[0] >> 8) & 0x0f;
1515 op = da->ir[0] & 0x3f;
1516
1517 if (c > 1) {
1518 da->flags |= E68_DFLAG_DEP_CC;
1519 }
1520
1521 if (op == 0x3a) {
1522 /* TRAPcc.W */
1523 dasm_op1 (da, op_trapcc[c], src, ARG_IMM16, 0);
1524 da->flags |= E68_DFLAG_68020;
1525 }
1526 else if (op == 0x3b) {
1527 /* TRAPcc.L */
1528 dasm_op1 (da, op_trapcc[c], src, ARG_IMM32, 0);
1529 da->flags |= E68_DFLAG_68020;
1530 }
1531 else if (op == 0x3c) {
1532 /* TRAPcc */
1533 dasm_op0 (da, op_trapcc[c]);
1534 da->flags |= E68_DFLAG_68020;
1535 }
1536 else if ((op & 0x38) == 0x08) {
1537 /* DBcc */
1538 dasm_op2 (da, op_dbcc[c], src, ARG_DREG0, ARG_DIST16, 0);
1539 da->flags |= E68_DFLAG_JUMP;
1540 }
1541 else {
1542 /* Scc */
1543 dasm_op1 (da, op_scc[c], src, ARG_EA, 8);
1544 }
1545}
1546
1547/* 6000: Bcc dist */
1548static void d_6000 (e68_dasm_t *da, const uint8_t *src)
1549{
1550 unsigned c;
1551
1552 c = (da->ir[0] >> 8) & 15;
1553
1554 if (src[1] == 0) {
1555 dasm_op1 (da, op_bcc[c], src, ARG_DIST16, 0);
1556 strcat (da->op, ".W");
1557 }
1558 else if (src[1] == 0xff) {
1559 dasm_op1 (da, op_bcc[c], src, ARG_DIST32, 0);
1560 strcat (da->op, ".L");
1561 da->flags |= E68_DFLAG_68020;
1562 }
1563 else {
1564 dasm_op1 (da, op_bcc[c], src, ARG_DIST8, 0);
1565 strcat (da->op, ".S");
1566 }
1567
1568 if (c == 1) {
1569 da->flags |= E68_DFLAG_CALL;
1570 }
1571 else {
1572 da->flags |= E68_DFLAG_JUMP;
1573 }
1574
1575 if (c > 1) {
1576 da->flags |= E68_DFLAG_DEP_CC;
1577 }
1578}
1579
1580/* 7000: MOVEQ #XX, Dx */
1581static void d_7000 (e68_dasm_t *da, const uint8_t *src)
1582{
1583 dasm_op2 (da, "MOVEQ", src, ARG_IRSIMM8, ARG_DREG9, 0);
1584}
1585
1586/* 8000: OR.B <EA>, Dx */
1587static void d_8000 (e68_dasm_t *da, const uint8_t *src)
1588{
1589 dasm_op2 (da, "OR.B", src, ARG_EA, ARG_DREG9, 8);
1590}
1591
1592/* 8040: OR.W <EA>, Dx */
1593static void d_8040 (e68_dasm_t *da, const uint8_t *src)
1594{
1595 dasm_op2 (da, "OR.W", src, ARG_EA, ARG_DREG9, 16);
1596}
1597
1598/* 8080: OR.L <EA>, Dx */
1599static void d_8080 (e68_dasm_t *da, const uint8_t *src)
1600{
1601 dasm_op2 (da, "OR.L", src, ARG_EA, ARG_DREG9, 32);
1602}
1603
1604/* 80C0: DIVU.W <EA>, Dx */
1605static void d_80c0 (e68_dasm_t *da, const uint8_t *src)
1606{
1607 dasm_op2 (da, "DIVU.W", src, ARG_EA, ARG_DREG9, 16);
1608}
1609
1610/* 8100: misc */
1611static void d_8100 (e68_dasm_t *da, const uint8_t *src)
1612{
1613 switch ((da->ir[0] >> 3) & 7) {
1614 case 0x00:
1615 dasm_op2 (da, "SBCD.B", src, ARG_DREG0, ARG_DREG9, 8);
1616 da->flags |= E68_DFLAG_DEP_CC;
1617 break;
1618
1619 case 0x01:
1620 dasm_op2 (da, "SBCD.B", src, ARG_AREG0PD, ARG_AREG9PD, 8);
1621 da->flags |= E68_DFLAG_DEP_CC;
1622 break;
1623
1624 default:
1625 dasm_op2 (da, "OR.B", src, ARG_DREG9, ARG_EA, 8);
1626 break;
1627 }
1628}
1629
1630/* 8140: misc */
1631static void d_8140 (e68_dasm_t *da, const uint8_t *src)
1632{
1633 switch ((da->ir[0] >> 3) & 7) {
1634 case 0x00:
1635 case 0x01:
1636 dasm_op1 (da, "DW", src, ARG_IR, 16);
1637 break;
1638
1639 default:
1640 dasm_op2 (da, "OR.W", src, ARG_DREG9, ARG_EA, 16);
1641 break;
1642 }
1643}
1644
1645/* 8180: misc */
1646static void d_8180 (e68_dasm_t *da, const uint8_t *src)
1647{
1648 switch ((da->ir[0] >> 3) & 7) {
1649 case 0x00:
1650 case 0x01:
1651 dasm_op1 (da, "DW", src, ARG_IR, 16);
1652 break;
1653
1654 default:
1655 dasm_op2 (da, "OR.L", src, ARG_DREG9, ARG_EA, 32);
1656 break;
1657 }
1658}
1659
1660/* 81C0: DIVS.W <EA>, Dx */
1661static void d_81c0 (e68_dasm_t *da, const uint8_t *src)
1662{
1663 dasm_op2 (da, "DIVS.W", src, ARG_EA, ARG_DREG9, 16);
1664}
1665
1666/* 9000: SUB.B <EA>, Dx */
1667static void d_9000 (e68_dasm_t *da, const uint8_t *src)
1668{
1669 dasm_op2 (da, "SUB.B", src, ARG_EA, ARG_DREG9, 8);
1670}
1671
1672/* 9040: SUB.W <EA>, Dx */
1673static void d_9040 (e68_dasm_t *da, const uint8_t *src)
1674{
1675 dasm_op2 (da, "SUB.W", src, ARG_EA, ARG_DREG9, 16);
1676}
1677
1678/* 9080: SUB.L <EA>, Dx */
1679static void d_9080 (e68_dasm_t *da, const uint8_t *src)
1680{
1681 dasm_op2 (da, "SUB.L", src, ARG_EA, ARG_DREG9, 32);
1682}
1683
1684/* 90C0: SUBA.W <EA>, Ax */
1685static void d_90c0 (e68_dasm_t *da, const uint8_t *src)
1686{
1687 dasm_op2 (da, "SUBA.W", src, ARG_EA, ARG_AREG9, 16);
1688}
1689
1690/* 9100: misc */
1691static void d_9100 (e68_dasm_t *da, const uint8_t *src)
1692{
1693 switch ((da->ir[0] >> 3) & 7) {
1694 case 0x00:
1695 dasm_op2 (da, "SUBX.B", src, ARG_DREG0, ARG_DREG9, 8);
1696 da->flags |= E68_DFLAG_DEP_CC;
1697 break;
1698
1699 case 0x01:
1700 dasm_op2 (da, "SUBX.B", src, ARG_AREG0PD, ARG_AREG9PD, 8);
1701 da->flags |= E68_DFLAG_DEP_CC;
1702 break;
1703
1704 default:
1705 dasm_op2 (da, "SUB.B", src, ARG_DREG9, ARG_EA, 8);
1706 break;
1707 }
1708}
1709
1710/* 9140: misc */
1711static void d_9140 (e68_dasm_t *da, const uint8_t *src)
1712{
1713 switch ((da->ir[0] >> 3) & 7) {
1714 case 0x00:
1715 dasm_op2 (da, "SUBX.W", src, ARG_DREG0, ARG_DREG9, 16);
1716 da->flags |= E68_DFLAG_DEP_CC;
1717 break;
1718
1719 case 0x01:
1720 dasm_op2 (da, "SUBX.W", src, ARG_AREG0PD, ARG_AREG9PD, 16);
1721 da->flags |= E68_DFLAG_DEP_CC;
1722 break;
1723
1724 default:
1725 dasm_op2 (da, "SUB.W", src, ARG_DREG9, ARG_EA, 16);
1726 break;
1727 }
1728}
1729
1730/* 9180: SUB.L Dx, <EA> */
1731static void d_9180 (e68_dasm_t *da, const uint8_t *src)
1732{
1733 switch ((da->ir[0] >> 3) & 7) {
1734 case 0x00:
1735 dasm_op2 (da, "SUBX.L", src, ARG_DREG0, ARG_DREG9, 32);
1736 da->flags |= E68_DFLAG_DEP_CC;
1737 break;
1738
1739 case 0x01:
1740 dasm_op2 (da, "SUBX.L", src, ARG_AREG0PD, ARG_AREG9PD, 32);
1741 da->flags |= E68_DFLAG_DEP_CC;
1742 break;
1743
1744 default:
1745 dasm_op2 (da, "SUB.L", src, ARG_DREG9, ARG_EA, 32);
1746 break;
1747 }
1748}
1749
1750/* 91C0: SUBA.L <EA>, Ax */
1751static void d_91c0 (e68_dasm_t *da, const uint8_t *src)
1752{
1753 dasm_op2 (da, "SUBA.L", src, ARG_EA, ARG_AREG9, 32);
1754}
1755
1756/* A000: AXXX */
1757static void d_a000 (e68_dasm_t *da, const uint8_t *src)
1758{
1759 char buf[16];
1760
1761 sprintf (buf, "%04X", da->ir[0]);
1762
1763 dasm_op0 (da, buf);
1764
1765 da->flags |= E68_DFLAG_CALL;
1766}
1767
1768/* B000: CMP.B <EA>, Dx */
1769static void d_b000 (e68_dasm_t *da, const uint8_t *src)
1770{
1771 dasm_op2 (da, "CMP.B", src, ARG_EA, ARG_DREG9, 8);
1772}
1773
1774/* B040: CMP.W <EA>, Dx */
1775static void d_b040 (e68_dasm_t *da, const uint8_t *src)
1776{
1777 dasm_op2 (da, "CMP.W", src, ARG_EA, ARG_DREG9, 16);
1778}
1779
1780/* B080: CMP.L <EA>, Dx */
1781static void d_b080 (e68_dasm_t *da, const uint8_t *src)
1782{
1783 dasm_op2 (da, "CMP.L", src, ARG_EA, ARG_DREG9, 32);
1784}
1785
1786/* B0C0: CMPA.W <EA>, Ax */
1787static void d_b0c0 (e68_dasm_t *da, const uint8_t *src)
1788{
1789 dasm_op2 (da, "CMPA.W", src, ARG_EA, ARG_AREG9, 16);
1790}
1791
1792/* B100: misc */
1793static void d_b100 (e68_dasm_t *da, const uint8_t *src)
1794{
1795 if ((da->ir[0] & 0x0038) == 0x0008) {
1796 dasm_op2 (da, "CMPM.B", src, ARG_AREG0PI, ARG_AREG9PI, 8);
1797 }
1798 else {
1799 dasm_op2 (da, "EOR.B", src, ARG_DREG9, ARG_EA, 8);
1800 }
1801}
1802
1803/* B140: misc */
1804static void d_b140 (e68_dasm_t *da, const uint8_t *src)
1805{
1806 if ((da->ir[0] & 0x0038) == 0x0008) {
1807 dasm_op2 (da, "CMPM.W", src, ARG_AREG0PI, ARG_AREG9PI, 16);
1808 }
1809 else {
1810 dasm_op2 (da, "EOR.W", src, ARG_DREG9, ARG_EA, 16);
1811 }
1812}
1813
1814/* B180: misc */
1815static void d_b180 (e68_dasm_t *da, const uint8_t *src)
1816{
1817 if ((da->ir[0] & 0x0038) == 0x0008) {
1818 dasm_op2 (da, "CMPM.L", src, ARG_AREG0PI, ARG_AREG9PI, 32);
1819 }
1820 else {
1821 dasm_op2 (da, "EOR.L", src, ARG_DREG9, ARG_EA, 32);
1822 }
1823}
1824
1825/* B1C0: CMPA.L <EA>, Ax */
1826static void d_b1c0 (e68_dasm_t *da, const uint8_t *src)
1827{
1828 dasm_op2 (da, "CMPA.L", src, ARG_EA, ARG_AREG9, 32);
1829}
1830
1831/* C000: AND.B EA, Dx */
1832static void d_c000 (e68_dasm_t *da, const uint8_t *src)
1833{
1834 dasm_op2 (da, "AND.B", src, ARG_EA, ARG_DREG9, 8);
1835}
1836
1837/* C040: AND.W EA, Dx */
1838static void d_c040 (e68_dasm_t *da, const uint8_t *src)
1839{
1840 dasm_op2 (da, "AND.W", src, ARG_EA, ARG_DREG9, 16);
1841}
1842
1843/* C080: AND.L EA, Dx */
1844static void d_c080 (e68_dasm_t *da, const uint8_t *src)
1845{
1846 dasm_op2 (da, "AND.L", src, ARG_EA, ARG_DREG9, 32);
1847}
1848
1849/* C0C0: MULU.W <EA>, Dx */
1850static void d_c0c0 (e68_dasm_t *da, const uint8_t *src)
1851{
1852 dasm_op2 (da, "MULU.W", src, ARG_EA, ARG_DREG9, 16);
1853}
1854
1855/* C100: misc */
1856static void d_c100 (e68_dasm_t *da, const uint8_t *src)
1857{
1858 switch ((da->ir[0] >> 3) & 7) {
1859 case 0x00:
1860 dasm_op2 (da, "ABCD.B", src, ARG_DREG0, ARG_DREG9, 8);
1861 da->flags |= E68_DFLAG_DEP_CC;
1862 break;
1863
1864 case 0x01:
1865 dasm_op2 (da, "ABCD.B", src, ARG_AREG0PD, ARG_AREG9PD, 8);
1866 da->flags |= E68_DFLAG_DEP_CC;
1867 break;
1868
1869 default:
1870 dasm_op2 (da, "AND.B", src, ARG_DREG9, ARG_EA, 8);
1871 break;
1872 }
1873}
1874
1875/* C140: misc */
1876static void d_c140 (e68_dasm_t *da, const uint8_t *src)
1877{
1878 switch ((da->ir[0] >> 3) & 7) {
1879 case 0x00:
1880 dasm_op2 (da, "EXG", src, ARG_DREG9, ARG_DREG0, 32);
1881 break;
1882
1883 case 0x01:
1884 dasm_op2 (da, "EXG", src, ARG_AREG9, ARG_AREG0, 32);
1885 break;
1886
1887 default:
1888 dasm_op2 (da, "AND.W", src, ARG_DREG9, ARG_EA, 16);
1889 break;
1890 }
1891}
1892
1893/* C180: misc */
1894static void d_c180 (e68_dasm_t *da, const uint8_t *src)
1895{
1896 switch ((da->ir[0] >> 3) & 7) {
1897 case 0x00:
1898 dasm_op1 (da, "DW", src, ARG_IR, 16);
1899 break;
1900
1901 case 0x01:
1902 dasm_op2 (da, "EXG", src, ARG_DREG9, ARG_AREG0, 32);
1903 break;
1904
1905 default:
1906 dasm_op2 (da, "AND.L", src, ARG_DREG9, ARG_EA, 32);
1907 break;
1908 }
1909}
1910
1911/* C1C0: MULS.W <EA>, Dx */
1912static void d_c1c0 (e68_dasm_t *da, const uint8_t *src)
1913{
1914 dasm_op2 (da, "MULS.W", src, ARG_EA, ARG_DREG9, 16);
1915}
1916
1917/* D000: ADD.B EA, Dx */
1918static void d_d000 (e68_dasm_t *da, const uint8_t *src)
1919{
1920 dasm_op2 (da, "ADD.B", src, ARG_EA, ARG_DREG9, 8);
1921}
1922
1923/* D040: ADD.W EA, Dx */
1924static void d_d040 (e68_dasm_t *da, const uint8_t *src)
1925{
1926 dasm_op2 (da, "ADD.W", src, ARG_EA, ARG_DREG9, 16);
1927}
1928
1929/* D080: ADD.L EA, Dx */
1930static void d_d080 (e68_dasm_t *da, const uint8_t *src)
1931{
1932 dasm_op2 (da, "ADD.L", src, ARG_EA, ARG_DREG9, 32);
1933}
1934
1935/* D0C0: ADDA.W <EA>, Ax */
1936static void d_d0c0 (e68_dasm_t *da, const uint8_t *src)
1937{
1938 dasm_op2 (da, "ADDA.W", src, ARG_EA, ARG_AREG9, 16);
1939}
1940
1941/* D100: misc */
1942static void d_d100 (e68_dasm_t *da, const uint8_t *src)
1943{
1944 switch ((da->ir[0] >> 3) & 7) {
1945 case 0x00:
1946 dasm_op2 (da, "ADDX.B", src, ARG_DREG0, ARG_DREG9, 8);
1947 da->flags |= E68_DFLAG_DEP_CC;
1948 break;
1949
1950 case 0x01:
1951 dasm_op2 (da, "ADDX.B", src, ARG_AREG0PD, ARG_AREG9PD, 8);
1952 da->flags |= E68_DFLAG_DEP_CC;
1953 break;
1954
1955 default:
1956 dasm_op2 (da, "ADD.B", src, ARG_DREG9, ARG_EA, 8);
1957 break;
1958 }
1959}
1960
1961/* D140: ADD.W Dx, EA */
1962static void d_d140 (e68_dasm_t *da, const uint8_t *src)
1963{
1964 switch ((da->ir[0] >> 3) & 7) {
1965 case 0x00:
1966 dasm_op2 (da, "ADDX.W", src, ARG_DREG0, ARG_DREG9, 16);
1967 da->flags |= E68_DFLAG_DEP_CC;
1968 break;
1969
1970 case 0x01:
1971 dasm_op2 (da, "ADDX.W", src, ARG_AREG0PD, ARG_AREG9PD, 16);
1972 da->flags |= E68_DFLAG_DEP_CC;
1973 break;
1974
1975 default:
1976 dasm_op2 (da, "ADD.W", src, ARG_DREG9, ARG_EA, 16);
1977 break;
1978 }
1979}
1980
1981/* D180: ADD.L Dx, EA */
1982static void d_d180 (e68_dasm_t *da, const uint8_t *src)
1983{
1984 switch ((da->ir[0] >> 3) & 7) {
1985 case 0x00:
1986 dasm_op2 (da, "ADDX.L", src, ARG_DREG0, ARG_DREG9, 32);
1987 da->flags |= E68_DFLAG_DEP_CC;
1988 break;
1989
1990 case 0x01:
1991 dasm_op2 (da, "ADDX.L", src, ARG_AREG0PD, ARG_AREG9PD, 32);
1992 da->flags |= E68_DFLAG_DEP_CC;
1993 break;
1994
1995 default:
1996 dasm_op2 (da, "ADD.L", src, ARG_DREG9, ARG_EA, 32);
1997 break;
1998 }
1999}
2000
2001/* D1C0: ADDA.L EA, Ax */
2002static void d_d1c0 (e68_dasm_t *da, const uint8_t *src)
2003{
2004 dasm_op2 (da, "ADDA.L", src, ARG_EA, ARG_AREG9, 32);
2005}
2006
2007/* E000: misc */
2008static void d_e000 (e68_dasm_t *da, const uint8_t *src)
2009{
2010 switch ((da->ir[0] >> 3) & 7) {
2011 case 0x00:
2012 dasm_op2 (da, "ASR.B", src, ARG_IMMQ, ARG_DREG0, 8);
2013 break;
2014
2015 case 0x01:
2016 dasm_op2 (da, "LSR.B", src, ARG_IMMQ, ARG_DREG0, 8);
2017 break;
2018
2019 case 0x02:
2020 dasm_op2 (da, "ROXR.B", src, ARG_IMMQ, ARG_DREG0, 8);
2021 da->flags |= E68_DFLAG_DEP_CC;
2022 break;
2023
2024 case 0x03:
2025 dasm_op2 (da, "ROR.B", src, ARG_IMMQ, ARG_DREG0, 8);
2026 break;
2027
2028 case 0x04:
2029 dasm_op2 (da, "ASR.B", src, ARG_DREG9, ARG_DREG0, 8);
2030 break;
2031
2032 case 0x05:
2033 dasm_op2 (da, "LSR.B", src, ARG_DREG9, ARG_DREG0, 8);
2034 break;
2035
2036 case 0x06:
2037 dasm_op2 (da, "ROXR.B", src, ARG_DREG9, ARG_DREG0, 8);
2038 da->flags |= E68_DFLAG_DEP_CC;
2039 break;
2040
2041 case 0x07:
2042 dasm_op2 (da, "ROR.B", src, ARG_DREG9, ARG_DREG0, 8);
2043 break;
2044
2045 default:
2046 dasm_op1 (da, "DW", src, ARG_IR, 16);
2047 break;
2048 }
2049}
2050
2051/* E040: misc */
2052static void d_e040 (e68_dasm_t *da, const uint8_t *src)
2053{
2054 switch ((da->ir[0] >> 3) & 7) {
2055 case 0x00:
2056 dasm_op2 (da, "ASR.W", src, ARG_IMMQ, ARG_DREG0, 16);
2057 break;
2058
2059 case 0x01:
2060 dasm_op2 (da, "LSR.W", src, ARG_IMMQ, ARG_DREG0, 16);
2061 break;
2062
2063 case 0x02:
2064 dasm_op2 (da, "ROXR.W", src, ARG_IMMQ, ARG_DREG0, 16);
2065 da->flags |= E68_DFLAG_DEP_CC;
2066 break;
2067
2068 case 0x03:
2069 dasm_op2 (da, "ROR.W", src, ARG_IMMQ, ARG_DREG0, 16);
2070 break;
2071
2072 case 0x04:
2073 dasm_op2 (da, "ASR.W", src, ARG_DREG9, ARG_DREG0, 16);
2074 break;
2075
2076 case 0x05:
2077 dasm_op2 (da, "LSR.W", src, ARG_DREG9, ARG_DREG0, 16);
2078 break;
2079
2080 case 0x06:
2081 dasm_op2 (da, "ROXR.W", src, ARG_DREG9, ARG_DREG0, 16);
2082 da->flags |= E68_DFLAG_DEP_CC;
2083 break;
2084
2085 case 0x07:
2086 dasm_op2 (da, "ROR.W", src, ARG_DREG9, ARG_DREG0, 16);
2087 break;
2088
2089 default:
2090 dasm_op1 (da, "DW", src, ARG_IR, 16);
2091 break;
2092 }
2093}
2094
2095/* E080: misc */
2096static void d_e080 (e68_dasm_t *da, const uint8_t *src)
2097{
2098 switch ((da->ir[0] >> 3) & 7) {
2099 case 0x00:
2100 dasm_op2 (da, "ASR.L", src, ARG_IMMQ, ARG_DREG0, 32);
2101 break;
2102
2103 case 0x01:
2104 dasm_op2 (da, "LSR.L", src, ARG_IMMQ, ARG_DREG0, 32);
2105 break;
2106
2107 case 0x02:
2108 dasm_op2 (da, "ROXR.L", src, ARG_IMMQ, ARG_DREG0, 32);
2109 da->flags |= E68_DFLAG_DEP_CC;
2110 break;
2111
2112 case 0x03:
2113 dasm_op2 (da, "ROR.L", src, ARG_IMMQ, ARG_DREG0, 32);
2114 break;
2115
2116 case 0x04:
2117 dasm_op2 (da, "ASR.L", src, ARG_DREG9, ARG_DREG0, 32);
2118 break;
2119
2120 case 0x05:
2121 dasm_op2 (da, "LSR.L", src, ARG_DREG9, ARG_DREG0, 32);
2122 break;
2123
2124 case 0x06:
2125 dasm_op2 (da, "ROXR.L", src, ARG_DREG9, ARG_DREG0, 32);
2126 da->flags |= E68_DFLAG_DEP_CC;
2127 break;
2128
2129 case 0x07:
2130 dasm_op2 (da, "ROR.L", src, ARG_DREG9, ARG_DREG0, 32);
2131 break;
2132
2133 default:
2134 dasm_op1 (da, "DW", src, ARG_IR, 16);
2135 }
2136}
2137
2138/* E0C0: ASR.W <EA> */
2139static void d_e0c0 (e68_dasm_t *da, const uint8_t *src)
2140{
2141 dasm_op1 (da, "ASR.W", src, ARG_EA, 16);
2142}
2143
2144/* E100: misc */
2145static void d_e100 (e68_dasm_t *da, const uint8_t *src)
2146{
2147 switch ((da->ir[0] >> 3) & 7) {
2148 case 0x00:
2149 dasm_op2 (da, "ASL.B", src, ARG_IMMQ, ARG_DREG0, 8);
2150 break;
2151
2152 case 0x01:
2153 dasm_op2 (da, "LSL.B", src, ARG_IMMQ, ARG_DREG0, 8);
2154 break;
2155
2156 case 0x02:
2157 dasm_op2 (da, "ROXL.B", src, ARG_IMMQ, ARG_DREG0, 8);
2158 da->flags |= E68_DFLAG_DEP_CC;
2159 break;
2160
2161 case 0x03:
2162 dasm_op2 (da, "ROL.B", src, ARG_IMMQ, ARG_DREG0, 8);
2163 break;
2164
2165 case 0x04:
2166 dasm_op2 (da, "ASL.B", src, ARG_DREG9, ARG_DREG0, 8);
2167 break;
2168
2169 case 0x05:
2170 dasm_op2 (da, "LSL.B", src, ARG_DREG9, ARG_DREG0, 8);
2171 break;
2172
2173 case 0x06:
2174 dasm_op2 (da, "ROXL.B", src, ARG_DREG9, ARG_DREG0, 8);
2175 da->flags |= E68_DFLAG_DEP_CC;
2176 break;
2177
2178 case 0x07:
2179 dasm_op2 (da, "ROL.B", src, ARG_DREG9, ARG_DREG0, 8);
2180 break;
2181
2182 default:
2183 dasm_op1 (da, "DW", src, ARG_IR, 16);
2184 break;
2185 }
2186}
2187
2188/* E140: misc */
2189static void d_e140 (e68_dasm_t *da, const uint8_t *src)
2190{
2191 switch ((da->ir[0] >> 3) & 7) {
2192 case 0x00:
2193 dasm_op2 (da, "ASL.W", src, ARG_IMMQ, ARG_DREG0, 16);
2194 break;
2195
2196 case 0x01:
2197 dasm_op2 (da, "LSL.W", src, ARG_IMMQ, ARG_DREG0, 16);
2198 break;
2199
2200 case 0x02:
2201 dasm_op2 (da, "ROXL.W", src, ARG_IMMQ, ARG_DREG0, 16);
2202 da->flags |= E68_DFLAG_DEP_CC;
2203 break;
2204
2205 case 0x03:
2206 dasm_op2 (da, "ROL.W", src, ARG_IMMQ, ARG_DREG0, 16);
2207 break;
2208
2209 case 0x04:
2210 dasm_op2 (da, "ASL.W", src, ARG_DREG9, ARG_DREG0, 16);
2211 break;
2212
2213 case 0x05:
2214 dasm_op2 (da, "LSL.W", src, ARG_DREG9, ARG_DREG0, 16);
2215 break;
2216
2217 case 0x06:
2218 dasm_op2 (da, "ROXL.W", src, ARG_DREG9, ARG_DREG0, 16);
2219 da->flags |= E68_DFLAG_DEP_CC;
2220 break;
2221
2222 case 0x07:
2223 dasm_op2 (da, "ROL.W", src, ARG_DREG9, ARG_DREG0, 16);
2224 break;
2225
2226 default:
2227 dasm_op1 (da, "DW", src, ARG_IR, 16);
2228 break;
2229 }
2230}
2231
2232/* E180: misc */
2233static void d_e180 (e68_dasm_t *da, const uint8_t *src)
2234{
2235 switch ((da->ir[0] >> 3) & 7) {
2236 case 0x00:
2237 dasm_op2 (da, "ASL.L", src, ARG_IMMQ, ARG_DREG0, 32);
2238 break;
2239
2240 case 0x01:
2241 dasm_op2 (da, "LSL.L", src, ARG_IMMQ, ARG_DREG0, 32);
2242 break;
2243
2244 case 0x02:
2245 dasm_op2 (da, "ROXL.L", src, ARG_IMMQ, ARG_DREG0, 32);
2246 da->flags |= E68_DFLAG_DEP_CC;
2247 break;
2248
2249 case 0x03:
2250 dasm_op2 (da, "ROL.L", src, ARG_IMMQ, ARG_DREG0, 32);
2251 break;
2252
2253 case 0x04:
2254 dasm_op2 (da, "ASL.L", src, ARG_DREG9, ARG_DREG0, 32);
2255 break;
2256
2257 case 0x05:
2258 dasm_op2 (da, "LSL.L", src, ARG_DREG9, ARG_DREG0, 32);
2259 break;
2260
2261 case 0x06:
2262 dasm_op2 (da, "ROXL.L", src, ARG_DREG9, ARG_DREG0, 32);
2263 da->flags |= E68_DFLAG_DEP_CC;
2264 break;
2265
2266 case 0x07:
2267 dasm_op2 (da, "ROL.L", src, ARG_DREG9, ARG_DREG0, 32);
2268 break;
2269
2270 default:
2271 dasm_op1 (da, "DW", src, ARG_IR, 16);
2272 break;
2273 }
2274}
2275
2276/* E1C0: ASL.W <EA> */
2277static void d_e1c0 (e68_dasm_t *da, const uint8_t *src)
2278{
2279 dasm_op1 (da, "ASL.W", src, ARG_EA, 16);
2280}
2281
2282/* E2C0: LSR.W <EA> */
2283static void d_e2c0 (e68_dasm_t *da, const uint8_t *src)
2284{
2285 dasm_op1 (da, "LSR.W", src, ARG_EA, 16);
2286}
2287
2288/* E3C0: LSL.W <EA> */
2289static void d_e3c0 (e68_dasm_t *da, const uint8_t *src)
2290{
2291 dasm_op1 (da, "LSL.W", src, ARG_EA, 16);
2292}
2293
2294/* E4C0: ROXR.W <EA> */
2295static void d_e4c0 (e68_dasm_t *da, const uint8_t *src)
2296{
2297 dasm_op1 (da, "ROXR.W", src, ARG_EA, 16);
2298 da->flags |= E68_DFLAG_DEP_CC;
2299}
2300
2301/* E5C0: ROXL.W <EA> */
2302static void d_e5c0 (e68_dasm_t *da, const uint8_t *src)
2303{
2304 dasm_op1 (da, "ROXL.W", src, ARG_EA, 16);
2305 da->flags |= E68_DFLAG_DEP_CC;
2306}
2307
2308/* E6C0: ROR.W <EA> */
2309static void d_e6c0 (e68_dasm_t *da, const uint8_t *src)
2310{
2311 dasm_op1 (da, "ROR.W", src, ARG_EA, 16);
2312}
2313
2314/* E7C0: ROL.W <EA> */
2315static void d_e7c0 (e68_dasm_t *da, const uint8_t *src)
2316{
2317 dasm_op1 (da, "ROL.W", src, ARG_EA, 16);
2318}
2319
2320/* E8C0: BFTST <EA> {offset:width} */
2321static void d_e8c0 (e68_dasm_t *da, const uint8_t *src)
2322{
2323 dasm_op1 (da, "BFTST", src, ARG_BF, 8);
2324}
2325
2326/* E9C0: BFEXTU <EA> {offset:width}, Dn */
2327static void d_e9c0 (e68_dasm_t *da, const uint8_t *src)
2328{
2329 dasm_op2 (da, "BFEXTU", src, ARG_BF, ARG_BF_DN, 8);
2330}
2331
2332/* EAC0: BFCHG <EA> {offset:width} */
2333static void d_eac0 (e68_dasm_t *da, const uint8_t *src)
2334{
2335 dasm_op1 (da, "BFCHG", src, ARG_BF, 8);
2336}
2337
2338/* EBC0: BFEXTS <EA> {offset:width}, Dn */
2339static void d_ebc0 (e68_dasm_t *da, const uint8_t *src)
2340{
2341 dasm_op2 (da, "BFEXTS", src, ARG_BF, ARG_BF_DN, 8);
2342}
2343
2344/* ECC0: BFCLR <EA> {offset:width} */
2345static void d_ecc0 (e68_dasm_t *da, const uint8_t *src)
2346{
2347 dasm_op1 (da, "BFCLR", src, ARG_BF, 8);
2348}
2349
2350/* EEC0: BFSET <EA> {offset:width} */
2351static void d_eec0 (e68_dasm_t *da, const uint8_t *src)
2352{
2353 dasm_op1 (da, "BFSET", src, ARG_BF, 8);
2354}
2355
2356/* EFC0: BFINS Dn, <EA> {offset:width} */
2357static void d_efc0 (e68_dasm_t *da, const uint8_t *src)
2358{
2359 dasm_op2 (da, "BFINS", src, ARG_BF_DN, ARG_BF, 8);
2360}
2361
2362/* F000: FXXX */
2363static void d_f000 (e68_dasm_t *da, const uint8_t *src)
2364{
2365 char buf[16];
2366
2367 sprintf (buf, "%04X", da->ir[0]);
2368
2369 dasm_op0 (da, buf);
2370
2371 da->flags |= E68_DFLAG_CALL;
2372}
2373
2374static void di_und (e68_dasm_t *da, const uint8_t *src)
2375{
2376 dasm_op1 (da, "DW", src, ARG_IR, 16);
2377}
2378
2379
2380void e68_dasm (e68_dasm_t *da, uint32_t pc, const unsigned char *src)
2381{
2382 unsigned i;
2383 unsigned opc;
2384
2385 da->flags = 0;
2386
2387 da->pc = pc;
2388
2389 da->comm[0] = 0;
2390
2391 da->ir[0] = e68_get_uint16 (src, 0);
2392 da->irn = 1;
2393
2394 opc = ((src[0] & 0xff) << 2) | ((src[1] & 0xc0) >> 6);
2395
2396 e68_dasm_op[opc] (da, src);
2397
2398 for (i = 0; i < da->irn; i++) {
2399 da->ir[i] = e68_get_uint16 (src, 2 * i);
2400 }
2401}
2402
2403void e68_dasm_mem (e68000_t *c, e68_dasm_t *da, uint32_t pc)
2404{
2405 unsigned i;
2406 uint8_t src[16];
2407
2408 for (i = 0; i < 16; i++) {
2409 src[i] = e68_get_mem8 (c, pc + i);
2410 }
2411
2412 e68_dasm (da, pc, src);
2413}
2414
2415void e68_dasm_cur (e68000_t *c, e68_dasm_t *da)
2416{
2417 e68_dasm_mem (c, da, e68_get_pc (c));
2418}
2419
2420static
2421e68_dasm_f e68_dasm_op[1024] = {
2422 d_0000, d_0040, d_0080, d_00c0, d_0100, d_0140, d_0180, d_01c0, /* 0000 */
2423 d_0200, d_0240, d_0280, d_02c0, d_0100, d_0140, d_0180, d_01c0, /* 0200 */
2424 d_0400, d_0440, d_0480, d_04c0, d_0100, d_0140, d_0180, d_01c0, /* 0400 */
2425 d_0600, d_0640, d_0680, di_und, d_0100, d_0140, d_0180, d_01c0, /* 0600 */
2426 d_0800, d_0840, d_0880, d_08c0, d_0100, d_0140, d_0180, d_01c0, /* 0800 */
2427 d_0a00, d_0a40, d_0a80, di_und, d_0100, d_0140, d_0180, d_01c0, /* 0A00 */
2428 d_0c00, d_0c40, d_0c80, di_und, d_0100, d_0140, d_0180, d_01c0, /* 0C00 */
2429 d_0e00, d_0e40, d_0e80, d_4ec0, d_0100, d_0140, d_0180, d_01c0, /* 0E00 */
2430 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1000 */
2431 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1200 */
2432 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1400 */
2433 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1600 */
2434 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1800 */
2435 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1A00 */
2436 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1C00 */
2437 d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, d_1000, /* 1E00 */
2438 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2000 */
2439 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2200 */
2440 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2400 */
2441 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2600 */
2442 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2800 */
2443 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2A00 */
2444 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2C00 */
2445 d_2000, d_2040, d_2000, d_2000, d_2000, d_2000, d_2000, d_2000, /* 2E00 */
2446 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3000 */
2447 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3200 */
2448 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3400 */
2449 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3600 */
2450 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3800 */
2451 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3A00 */
2452 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3C00 */
2453 d_3000, d_3040, d_3000, d_3000, d_3000, d_3000, d_3000, d_3000, /* 3E00 */
2454 d_4000, d_4040, d_4080, d_40c0, di_und, di_und, d_4180, d_41c0, /* 4000 */
2455 d_4200, d_4240, d_4280, d_42c0, di_und, di_und, d_4180, d_41c0, /* 4200 */
2456 d_4400, d_4440, d_4480, d_44c0, di_und, di_und, d_4180, d_41c0, /* 4400 */
2457 d_4600, d_4640, d_4680, d_46c0, di_und, di_und, d_4180, d_41c0, /* 4600 */
2458 d_4800, d_4840, d_4880, d_48c0, di_und, di_und, d_4180, d_49c0, /* 4800 */
2459 d_4a00, d_4a40, d_4a80, d_4ac0, di_und, di_und, d_4180, d_41c0, /* 4A00 */
2460 d_4c00, d_4c40, d_4c80, d_4cc0, di_und, di_und, d_4180, d_41c0, /* 4C00 */
2461 di_und, d_4e40, d_4e80, d_4ec0, di_und, di_und, d_4180, d_41c0, /* 4E00 */
2462 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5000 */
2463 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5200 */
2464 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5400 */
2465 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5600 */
2466 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5800 */
2467 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5A00 */
2468 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5C00 */
2469 d_5000, d_5040, d_5080, d_50c0, d_5100, d_5140, d_5180, d_50c0, /* 5E00 */
2470 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6000 */
2471 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6200 */
2472 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6400 */
2473 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6600 */
2474 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6800 */
2475 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6A00 */
2476 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6C00 */
2477 d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, d_6000, /* 6E00 */
2478 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7000 */
2479 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7200 */
2480 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7400 */
2481 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7600 */
2482 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7800 */
2483 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7A00 */
2484 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7C00 */
2485 d_7000, d_7000, d_7000, d_7000, di_und, di_und, di_und, di_und, /* 7E00 */
2486 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8000 */
2487 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8200 */
2488 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8400 */
2489 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8600 */
2490 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8800 */
2491 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8A00 */
2492 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8C00 */
2493 d_8000, d_8040, d_8080, d_80c0, d_8100, d_8140, d_8180, d_81c0, /* 8E00 */
2494 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9000 */
2495 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9200 */
2496 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9400 */
2497 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9600 */
2498 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9800 */
2499 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9A00 */
2500 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9C00 */
2501 d_9000, d_9040, d_9080, d_90c0, d_9100, d_9140, d_9180, d_91c0, /* 9E00 */
2502 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, /* A000 */
2503 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2504 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2505 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2506 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2507 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2508 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2509 d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000, d_a000,
2510 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* B000 */
2511 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* B200 */
2512 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* B400 */
2513 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* B600 */
2514 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* B800 */
2515 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* BA00 */
2516 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* BC00 */
2517 d_b000, d_b040, d_b080, d_b0c0, d_b100, d_b140, d_b180, d_b1c0, /* BE00 */
2518 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* C000 */
2519 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* C200 */
2520 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* C400 */
2521 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* C600 */
2522 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* C800 */
2523 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* CA00 */
2524 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* CC00 */
2525 d_c000, d_c040, d_c080, d_c0c0, d_c100, d_c140, d_c180, d_c1c0, /* CE00 */
2526 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* D000 */
2527 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* D200 */
2528 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* D400 */
2529 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* D600 */
2530 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* D800 */
2531 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* DA00 */
2532 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* DC00 */
2533 d_d000, d_d040, d_d080, d_d0c0, d_d100, d_d140, d_d180, d_d1c0, /* DE00 */
2534 d_e000, d_e040, d_e080, d_e0c0, d_e100, d_e140, d_e180, d_e1c0, /* E000 */
2535 d_e000, d_e040, d_e080, d_e2c0, d_e100, d_e140, d_e180, d_e3c0, /* E200 */
2536 d_e000, d_e040, d_e080, d_e4c0, d_e100, d_e140, d_e180, d_e5c0, /* E400 */
2537 d_e000, d_e040, d_e080, d_e6c0, d_e100, d_e140, d_e180, d_e7c0, /* E600 */
2538 d_e000, d_e040, d_e080, d_e8c0, d_e100, d_e140, d_e180, d_e9c0, /* E800 */
2539 d_e000, d_e040, d_e080, d_eac0, d_e100, d_e140, d_e180, d_ebc0, /* EA00 */
2540 d_e000, d_e040, d_e080, d_ecc0, d_e100, d_e140, d_e180, di_und, /* EC00 */
2541 d_e000, d_e040, d_e080, d_eec0, d_e100, d_e140, d_e180, d_efc0, /* EE00 */
2542 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, /* F000 */
2543 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2544 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2545 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2546 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2547 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2548 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000,
2549 d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000, d_f000
2550};