fork of PCE focusing on macplus, supporting DaynaPort SCSI network emulation
at master 2550 lines 59 kB view raw
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};