|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2017 [email protected] ! 4: // ! 5: ! 6: #include "header.h" ! 7: #include "m68030.h" ! 8: #include "disasm.h" ! 9: #include "bus.h" ! 10: #include "mystring.h" ! 11: ! 12: // コンストラクタ ! 13: Disasm::Disasm() ! 14: { ! 15: init(); ! 16: } ! 17: ! 18: // デストラクタ ! 19: Disasm::~Disasm() ! 20: { ! 21: } ! 22: ! 23: // 逆アセンブル ! 24: std::string ! 25: Disasm::Disassemble(uint32 laddr, uint32 paddr) ! 26: { ! 27: init(); ! 28: ! 29: pc = laddr; ! 30: pc0 = pc; ! 31: phys_pc = paddr; ! 32: ! 33: switch (fetch16() >> 6) { ! 34: #include "m68030switch.h" ! 35: default: ! 36: __unreachable(); ! 37: } ! 38: ! 39: std::string s = name + size_str[size]; ! 40: ! 41: if (!src.empty() || !dst.empty()) { ! 42: // オペランドが片方でもあればインデントする ! 43: int sl = s.length(); ! 44: if (sl < 8) { ! 45: s += std::string(8 - sl, ' '); ! 46: } else { ! 47: s += ' '; ! 48: } ! 49: ! 50: // src があれば src を追加 ! 51: if (!src.empty()) { ! 52: s += src; ! 53: } ! 54: // 両方あればカンマで区切る ! 55: if (!src.empty() && !dst.empty()) { ! 56: s += ","; ! 57: } ! 58: // dst があれば dst を追加 ! 59: if (!dst.empty()) { ! 60: s += dst; ! 61: } ! 62: } ! 63: ! 64: return s; ! 65: } ! 66: ! 67: // 逆アセンブル + ダンプ ! 68: std::string ! 69: Disasm::DisassembleWithDump(uint32 laddr, uint32 paddr) ! 70: { ! 71: // 逆アセンブル ! 72: std::string s = Disassemble(laddr, paddr); ! 73: ! 74: // ダンプ ! 75: std::string dump; ! 76: for (const auto & i : ir) { ! 77: dump += string_format("%04x ", i); ! 78: } ! 79: if (ir.size() < 5) { ! 80: dump += std::string(25 - ir.size() * 5, ' '); ! 81: } ! 82: ! 83: return dump + s; ! 84: } ! 85: ! 86: // 1行逆アセンブル前の初期化 ! 87: void ! 88: Disasm::init() ! 89: { ! 90: ir.clear(); ! 91: name.clear(); ! 92: size = Size::None; ! 93: src.clear(); ! 94: dst.clear(); ! 95: } ! 96: ! 97: // ワードピーク (PCを進めずワードを取得する) ! 98: uint32 ! 99: Disasm::peek16() ! 100: { ! 101: // 物理空間から読み込む ! 102: uint16 data; ! 103: data = m68030_phys_peek_8(phys_pc) << 8; ! 104: data |= m68030_phys_peek_8(phys_pc + 1); ! 105: return data; ! 106: } ! 107: ! 108: // ワードフェッチ ! 109: uint32 ! 110: Disasm::fetch16() ! 111: { ! 112: uint16 data = peek16(); ! 113: // IR に入れて PC を進める ! 114: ir.push_back(data); ! 115: pc += 2; ! 116: phys_pc += 2; ! 117: return data; ! 118: } ! 119: ! 120: // ロングワードフェッチ ! 121: uint32 ! 122: Disasm::fetch32() ! 123: { ! 124: uint32 data; ! 125: data = fetch16() << 16; ! 126: data |= fetch16(); ! 127: return data; ! 128: } ! 129: ! 130: // 符号なし8ビット16進数を文字列にして返す ! 131: std::string ! 132: Disasm::hex8(uint32 val) ! 133: { ! 134: return string_format("$%02x", val); ! 135: } ! 136: ! 137: // 符号なし16ビット16進数を文字列にして返す ! 138: std::string ! 139: Disasm::hex16(uint32 val) ! 140: { ! 141: return string_format("$%04x", val); ! 142: } ! 143: ! 144: // 符号なし32ビット16進数を文字列にして返す ! 145: std::string ! 146: Disasm::hex32(uint32 val) ! 147: { ! 148: return string_format("$%08x", val); ! 149: } ! 150: ! 151: // 符号つき8ビット16進数を文字列にして返す ! 152: // 負数はマイナスを前置して表す。 ! 153: std::string ! 154: Disasm::shex8(uint32 val) ! 155: { ! 156: if ((int8)val < 0) { ! 157: return string_format("-$%02x", -(int8)val); ! 158: } else { ! 159: return string_format("$%02x", val); ! 160: } ! 161: } ! 162: ! 163: // 符号つき16ビット16進数を文字列にして返す ! 164: // 負数はマイナスを前置して表す。 ! 165: std::string ! 166: Disasm::shex16(uint32 val) ! 167: { ! 168: if ((int16)val < 0) { ! 169: return string_format("-$%04x", -(int16)val); ! 170: } else { ! 171: return string_format("$%04x", val); ! 172: } ! 173: } ! 174: ! 175: // 符号つき32ビット16進数を文字列にして返す ! 176: // 負数はマイナスを前置して表す。 ! 177: std::string ! 178: Disasm::shex32(uint32 val) ! 179: { ! 180: if ((int32)val < 0) { ! 181: return string_format("-$%08x", (uint32)(-(int64)(int32)val)); ! 182: } else { ! 183: return string_format("$%08x", val); ! 184: } ! 185: } ! 186: ! 187: // EA を示す文字列を返す。ir[0] の mmmrrr の部分固定。 ! 188: std::string ! 189: Disasm::make_ea() ! 190: { ! 191: return make_ea(ir[0]); ! 192: } ! 193: ! 194: // mmrr に対して EA を示す文字列を返す。 ! 195: std::string ! 196: Disasm::make_ea(uint mmrr) ! 197: { ! 198: std::string s; ! 199: uint rr; ! 200: ! 201: mmrr &= 0x3f; ! 202: rr = mmrr & 7; ! 203: ! 204: switch (mmrr) { ! 205: case 0x00 ... 0x07: // 0 ! 206: s = make_dn(rr); ! 207: break; ! 208: case 0x08 ... 0x0f: // 1 ! 209: s = make_an(rr); ! 210: break; ! 211: case 0x10 ... 0x17: // 2 ! 212: s = make_anin(rr); ! 213: break; ! 214: case 0x18 ... 0x1f: // 3 ! 215: s = make_anpi(rr); ! 216: break; ! 217: case 0x20 ... 0x27: // 4 ! 218: s = make_anpd(rr); ! 219: break; ! 220: case 0x28 ... 0x2f: // 5 ! 221: s = disp16() + make_anin(rr); ! 222: break; ! 223: case 0x30 ... 0x37: // 6 ! 224: s = make_eaix(make_an(rr)); ! 225: break; ! 226: case 0x38: // Abs.W ! 227: s = addr16(); ! 228: break; ! 229: case 0x39: // Abs.L ! 230: s = addr32(); ! 231: break; ! 232: case 0x3a: // d16(pc) ! 233: s = addr32(pc + (int32)(int16)fetch16()) + ! 234: "(" + make_reg(Reg::PC) + ")"; ! 235: break; ! 236: case 0x3b: // d8(pc,IX) ! 237: s = make_eaix(make_reg(Reg::PC)); ! 238: break; ! 239: case 0x3c: // imm ! 240: switch (size) { ! 241: case Size::B: ! 242: s = imm8(); ! 243: break; ! 244: case Size::W: ! 245: s = imm16(); ! 246: break; ! 247: case Size::L: ! 248: case Size::S: ! 249: s = imm32(); ! 250: break; ! 251: case Size::D: ! 252: s = imm32(); ! 253: s += string_format("_%08x", fetch32()); ! 254: break; ! 255: case Size::X: ! 256: case Size::P: ! 257: s = imm32(); ! 258: s += string_format("_%08x", fetch32()); ! 259: s += string_format("_%08x", fetch32()); ! 260: break; ! 261: default: ! 262: s = "(invalid ea size?)"; ! 263: break; ! 264: } ! 265: break; ! 266: default: ! 267: s = "(invalid ea?)"; ! 268: break; ! 269: } ! 270: return s; ! 271: } ! 272: ! 273: std::string ! 274: Disasm::make_eaix(std::string basereg) ! 275: { ! 276: static const char * const scalestr[] = { ! 277: "", "*2", "*4", "*8", ! 278: }; ! 279: uint16 ext = fetch16(); ! 280: bool full = (ext & 0x0100); ! 281: uint rn = (ext >> 12); ! 282: bool wl = (ext & 0x0800); ! 283: uint scale = (ext >> 9) & 3; ! 284: std::string idx; ! 285: std::string s; ! 286: ! 287: // インデックスレジスタ ! 288: Size sz = wl ? Size::L : Size::W; ! 289: idx = ","; ! 290: idx += make_rn(rn); // Rn ! 291: idx += size_str[sz]; // .[WL] ! 292: idx += scalestr[scale]; // *{2/4/8} ! 293: ! 294: if (full == false) { ! 295: // 短縮フォーマット ! 296: uint8 disp = ext & 0xff; ! 297: if (disp == 0) { ! 298: // $00 は省略する ! 299: } else { ! 300: s = shex8(disp); ! 301: } ! 302: s += '('; ! 303: s += basereg; ! 304: s += idx; ! 305: s += ')'; ! 306: } else { ! 307: // フルフォーマット ! 308: bool bs = (ext & 0x0080); ! 309: bool is = (ext & 0x0040); ! 310: uint bdsize = (ext >> 4) & 3; ! 311: uint iis = (ext & 7); ! 312: std::string bd; ! 313: std::string od; ! 314: ! 315: // ベースレジスタ・サプレス ! 316: if (bs) { ! 317: basereg = "z" + basereg; ! 318: } ! 319: ! 320: // ベース・ディスプレースメント ! 321: switch (bdsize) { ! 322: case 0: // 予約 ! 323: return "<invalid EA(bdsize 0)>"; ! 324: case 1: // ベースはヌル ! 325: break; ! 326: case 2: // ベース.W ! 327: bd = disp16(); ! 328: bd += ","; ! 329: break; ! 330: case 3: // ベース.L ! 331: bd = disp32(); ! 332: bd += ","; ! 333: break; ! 334: } ! 335: ! 336: // アウター・ディスプレースメント ! 337: switch (iis & 3) { ! 338: case 0: // 不要? ! 339: case 1: // アウターはヌル ! 340: break; ! 341: case 2: // アウター.W ! 342: od = ","; ! 343: od += disp16(); ! 344: break; ! 345: case 3: // アウター.L ! 346: od = ","; ! 347: od += disp32(); ! 348: break; ! 349: } ! 350: ! 351: if (is == 0) { ! 352: switch (iis) { ! 353: case 0: // no memory indirection ! 354: // (bd,base,idx) ! 355: s = "("; ! 356: s += bd; ! 357: s += basereg; ! 358: s += idx; ! 359: s += ")"; ! 360: break; ! 361: case 1: // indirect pre-index with null outer ! 362: // ([bd,base,idx]) ! 363: case 2: // indirect pre-index with word outer ! 364: case 3: // indirect pre-index with long outer ! 365: // ([bd,base,idx],od) ! 366: s = "(["; ! 367: s += bd; ! 368: s += basereg; ! 369: s += idx; ! 370: s += "]"; ! 371: s += od; ! 372: s += ")"; ! 373: break; ! 374: ! 375: case 4: ! 376: return "<invalid EA(iis=4)>"; ! 377: ! 378: case 5: // indirect post-index with null outer ! 379: // ([bd,base],idx) ! 380: case 6: // indirect post-index with word outer ! 381: case 7: // indirect post-index with long outer ! 382: // ([bd,base],idx,od) ! 383: s = "(["; ! 384: s += bd; ! 385: s += basereg; ! 386: s += "]"; ! 387: s += idx; ! 388: s += od; ! 389: s += ")"; ! 390: break; ! 391: default: ! 392: __unreachable(); ! 393: } ! 394: } else { ! 395: switch (iis) { ! 396: case 0: // no memory indirection ! 397: // (bd,base) ! 398: s = "("; ! 399: s += bd; ! 400: s += basereg; ! 401: s += ")"; ! 402: break; ! 403: case 1: // memory indirect with null outer ! 404: // ([bd,base]) ! 405: case 2: // memory indirect with word outer ! 406: case 3: // memory indirect with long outer ! 407: // ([bd,base],od) ! 408: s += "(["; ! 409: s += bd; ! 410: s += basereg; ! 411: s += "]"; ! 412: s += od; ! 413: s += ")"; ! 414: break; ! 415: default: ! 416: return string_format("<invalid EA(is=1,iis=%d)>", iis); ! 417: } ! 418: } ! 419: } ! 420: ! 421: return s; ! 422: } ! 423: ! 424: // addr をワードアドレスとした時の文字列を返す ! 425: std::string ! 426: Disasm::addr16(uint32 addr) ! 427: { ! 428: return hex16(addr & 0xffff); ! 429: } ! 430: ! 431: // addr をロングワードアドレスとした時の文字列を返す ! 432: std::string ! 433: Disasm::addr32(uint32 addr) ! 434: { ! 435: return hex32(addr); ! 436: } ! 437: ! 438: // フェッチした値をワードアドレスとして文字列を返す ! 439: std::string ! 440: Disasm::addr16() ! 441: { ! 442: return addr16(fetch16()); ! 443: } ! 444: ! 445: // フェッチした値をロングワードアドレスとして文字列を返す ! 446: std::string ! 447: Disasm::addr32() ! 448: { ! 449: return addr32(fetch32()); ! 450: } ! 451: ! 452: // フェッチした値をワードディスプレースメントとして文字列を返す ! 453: std::string ! 454: Disasm::disp16() ! 455: { ! 456: return shex16(fetch16()); ! 457: } ! 458: ! 459: // フェッチした値をロングワードディスプレースメントとして文字列を返す ! 460: std::string ! 461: Disasm::disp32() ! 462: { ! 463: return shex32(fetch32()); ! 464: } ! 465: ! 466: // バイト即値 imm を文字列にして返す ! 467: std::string ! 468: Disasm::imm8() ! 469: { ! 470: return "#" + hex8(fetch16() & 0xff); ! 471: } ! 472: ! 473: // ワード即値 imm を文字列にして返す ! 474: std::string ! 475: Disasm::imm16() ! 476: { ! 477: return "#" + hex16(fetch16()); ! 478: } ! 479: ! 480: // ロングワード即値 imm を文字列にして返す ! 481: std::string ! 482: Disasm::imm32() ! 483: { ! 484: return "#" + hex32(fetch32()); ! 485: } ! 486: ! 487: // Dn を文字列にして返す。n の上位ビットは無視する。 ! 488: std::string ! 489: Disasm::make_dn(uint n) ! 490: { ! 491: n = (n & 7) + '0'; ! 492: std::string s; ! 493: s = 'd'; ! 494: s += n; ! 495: return s; ! 496: } ! 497: ! 498: // An を文字列にして返す。n の上位ビットは無視する。 ! 499: std::string ! 500: Disasm::make_an(uint n) ! 501: { ! 502: n = (n & 7) + '0'; ! 503: std::string s; ! 504: s = 'a'; ! 505: s += n; ! 506: return s; ! 507: } ! 508: ! 509: // Rn (Dn/An) を文字列にして返す。n の上位ビットは無視する。 ! 510: std::string ! 511: Disasm::make_rn(uint n) ! 512: { ! 513: n &= 0x0f; ! 514: if (n < 8) { ! 515: return make_dn(n); ! 516: } else { ! 517: return make_an(n - 8); ! 518: } ! 519: } ! 520: ! 521: // (An) を文字列にして返す。n の上位ビットは無視する。 ! 522: std::string ! 523: Disasm::make_anin(uint n) ! 524: { ! 525: std::string s; ! 526: s = '('; ! 527: s += make_an(n); ! 528: s += ')'; ! 529: return s; ! 530: } ! 531: ! 532: // (An)+ を文字列にして返す。n の上位ビットは無視する。 ! 533: std::string ! 534: Disasm::make_anpi(uint n) ! 535: { ! 536: std::string s; ! 537: s = make_anin(n); ! 538: s += '+'; ! 539: return s; ! 540: } ! 541: ! 542: // -(An) を文字列にして返す。n の上位ビットは無視する。 ! 543: std::string ! 544: Disasm::make_anpd(uint n) ! 545: { ! 546: std::string s; ! 547: s = '-'; ! 548: s += make_anin(n); ! 549: return s; ! 550: } ! 551: ! 552: // #qqq を文字列にして返す。ir[0] のいつものところにあると仮定する。 ! 553: std::string ! 554: Disasm::make_q8() ! 555: { ! 556: uint q = (ir[0] >> 9) & 7; ! 557: if (q == 0) { ! 558: q = 8; ! 559: } ! 560: return string_format("#%d", q); ! 561: } ! 562: ! 563: // regno で示されるレジスタ名を返す ! 564: std::string ! 565: Disasm::make_reg(Reg reg) ! 566: { ! 567: return reg_names[reg]; ! 568: } ! 569: ! 570: // MOVEM のレジスタリスト文字列を返す。 ! 571: // 第2ワードのフェッチは呼び出し側で行っておくこと。 ! 572: // プリデクリメントかどうかの判断はこちらで行う。 ! 573: std::string ! 574: Disasm::make_reglist() ! 575: { ! 576: uint16 mask = ir[1]; ! 577: uint mm = (ir[0] >> 3) & 7; ! 578: std::string s; ! 579: ! 580: // 制御モード・ポストインクリメントモードなら、ビット順を入れ替える。 ! 581: if (mm != 4) { ! 582: //mask = bitrev16(mask); ! 583: mask = ((mask & 0x5555) << 1) | ((mask >> 1) & 0x5555); ! 584: mask = ((mask & 0x3333) << 2) | ((mask >> 2) & 0x3333); ! 585: mask = ((mask & 0x0f0f) << 4) | ((mask >> 4) & 0x0f0f); ! 586: mask = (mask >> 8) | (mask << 8); ! 587: } ! 588: ! 589: // これでどちらのモードでも 16ビット内に上から順に並んでいる。 ! 590: // Bit: 15 14 ... 1 0 ! 591: // Reg: D0 D1 ... A6 A7 ! 592: ! 593: make_reglist_half(s, "d", mask & 0xff00); ! 594: make_reglist_half(s, "a", mask << 8); ! 595: if (s.empty()) { ! 596: s = "noregs"; ! 597: } ! 598: return s; ! 599: } ! 600: ! 601: // データレジスタもしくはアドレスレジスタの8ビット分だけを処理する。 ! 602: // FPn からも使うようになったので名前がいまいちか。 ! 603: // mask は以下のように上位8ビットに上から下に向かって並ぶように渡すこと。 ! 604: // ビット7 は番兵のため %0 にすること。 ! 605: // ! 606: // 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ! 607: // R0 R1 R2 R3 R4 R5 R6 R7 <-------- %0 ---------> ! 608: // ! 609: void ! 610: Disasm::make_reglist_half(std::string& s, const char *reg, uint16 mask) ! 611: { ! 612: int top = -1; ! 613: ! 614: // 番兵を含めてループするため1つ多く回る ! 615: for (int i = 0; i < 9; i++, mask <<= 1) { ! 616: if ((int16)mask < 0) { ! 617: // このビットは表示するレジスタ ! 618: if (top < 0) { ! 619: // 非表示中ならこのレジスタを出力する。 ! 620: // 初回以外は区切りを先に出力する。 ! 621: if (s.length() != 0) { ! 622: s += '/'; ! 623: } ! 624: s += reg; ! 625: s += '0' + i; ! 626: top = i; ! 627: } ! 628: } else { ! 629: // このビットは表示しない ! 630: if (top >= 0) { ! 631: // 表示中ならこの一つ前のレジスタで終端 ! 632: int last = i - 1; ! 633: if (top != last) { ! 634: // 表示が複数にまたがっていた ! 635: s += '-'; ! 636: s += reg; ! 637: s += '0' + last; ! 638: } ! 639: top = -1; ! 640: } ! 641: } ! 642: } ! 643: } ! 644: ! 645: // ビットフィールド欄を文字列にして返す。 ! 646: // 第2ワードのフェッチは呼び出し側で行っておくこと。 ! 647: std::string ! 648: Disasm::make_bf() ! 649: { ! 650: uint16 ext = ir[1]; ! 651: uint od = (ext & 0x0800); ! 652: uint offset = (ext >> 6) & 0x1f; ! 653: uint wd = (ext & 0x0020); ! 654: uint width = ext & 0x1f; ! 655: std::string s = "{"; ! 656: ! 657: // offset ! 658: if (od) { ! 659: if (offset < 8) { ! 660: s += make_dn(offset); ! 661: } else { ! 662: s += string_format("<invalid regno %d>", offset); ! 663: } ! 664: } else { ! 665: // オフセットは 0..31 ! 666: s += string_format("#%d", offset); ! 667: } ! 668: ! 669: s += ":"; ! 670: ! 671: // width ! 672: if (wd) { ! 673: if (width < 8) { ! 674: s += make_dn(width); ! 675: } else { ! 676: s += string_format("<invalid regno %d>", width); ! 677: } ! 678: } else { ! 679: // 幅は 0 なら 32 を意味する ! 680: if (width == 0) { ! 681: width = 32; ! 682: } ! 683: s += string_format("#%d", width); ! 684: } ! 685: ! 686: s += "}"; ! 687: return s; ! 688: } ! 689: ! 690: // ファンクションコードフィールドを文字列にして返す。 ! 691: // MMU の拡張ワードは呼び出し側で取得済みのはず。 ! 692: std::string ! 693: Disasm::make_fc() ! 694: { ! 695: uint fc = ir[1] & 0x1f; ! 696: ! 697: switch (fc) { ! 698: case 0: ! 699: return make_reg(Reg::SFC); ! 700: case 1: ! 701: return make_reg(Reg::DFC); ! 702: case 0x08 ... 0x0f: ! 703: return make_dn(fc); ! 704: case 0x10 ... 0x17: ! 705: return string_format("#%d", fc & 7); ! 706: default: ! 707: return string_format("<invalid fc %d>", fc); ! 708: } ! 709: } ! 710: ! 711: // MOVEC の制御レジスタを返す。 ! 712: std::string ! 713: Disasm::make_movec() ! 714: { ! 715: uint n = ir[1] & 0x0fff; ! 716: Reg reg; ! 717: ! 718: switch (n) { ! 719: case 0x000: reg = Reg::SFC; break; ! 720: case 0x001: reg = Reg::DFC; break; ! 721: case 0x002: reg = Reg::CACR; break; ! 722: case 0x800: reg = Reg::USP; break; ! 723: case 0x801: reg = Reg::VBR; break; ! 724: case 0x802: reg = Reg::CAAR; break; ! 725: case 0x803: reg = Reg::MSP; break; ! 726: case 0x804: reg = Reg::ISP; break; ! 727: ! 728: // 040 ! 729: // TC, MMUSR, SRP は名前が同じだが 030 MMU のではない ! 730: case 0x003: reg = Reg::TC; break; ! 731: case 0x004: reg = Reg::ITT0; break; // EC040 なら IACR0 ! 732: case 0x005: reg = Reg::ITT1; break; // EC040 なら IACR1 ! 733: case 0x006: reg = Reg::DTT0; break; // EC040 なら DACR0 ! 734: case 0x007: reg = Reg::DTT1; break; // EC040 なら DACR1 ! 735: case 0x805: reg = Reg::MMUSR; break; ! 736: case 0x806: reg = Reg::URP; break; ! 737: case 0x807: reg = Reg::SRP; break; ! 738: ! 739: default: ! 740: return string_format("<invalid ctrl reg %03x>", n); ! 741: } ! 742: return make_reg(reg); ! 743: } ! 744: ! 745: // FPgen 関数名を返す ! 746: // mode が適切でなければ "" を返す。 ! 747: std::string ! 748: Disasm::make_fpgen() ! 749: { ! 750: uint mode = ir[1] & 0x7f; ! 751: ! 752: if (mode < countof(fpgen_names)) { ! 753: return fpgen_names[mode]; ! 754: } ! 755: return ""; ! 756: } ! 757: ! 758: // FPn を文字列にして返す。n の上位ビットは無視する。 ! 759: std::string ! 760: Disasm::make_fpn(uint n) ! 761: { ! 762: n = (n & 7) + '0'; ! 763: std::string s; ! 764: s = "fp"; ! 765: s += n; ! 766: return s; ! 767: } ! 768: ! 769: // FPU の condition 文字列を返す。 ! 770: // word には condition が入ったワードを指定すること。 ! 771: // 不要な上位ビットはこちらでマスクする。 ! 772: std::string ! 773: Disasm::make_fpcc(uint16 word) ! 774: { ! 775: uint cc = word & 0x3f; ! 776: if (cc > 0x1f) { ! 777: return string_format("<invalid fpcc $%x>", cc); ! 778: } ! 779: return fpconditions[cc]; ! 780: } ! 781: ! 782: // FMOVEM 用の FPctls を文字列にして s に返す。 ! 783: // 戻り値は指定された制御レジスタの個数。 ! 784: uint ! 785: Disasm::make_fpctls(std::string& s) ! 786: { ! 787: uint n = 0; ! 788: uint list = ir[1] >> 10; ! 789: ! 790: s.clear(); ! 791: if ((list & 4)) { ! 792: s += make_reg(Reg::FPCR); ! 793: n++; ! 794: } ! 795: if ((list & 2)) { ! 796: if (!s.empty()) { ! 797: s += "/"; ! 798: } ! 799: s += make_reg(Reg::FPSR); ! 800: n++; ! 801: } ! 802: if ((list & 1)) { ! 803: if (!s.empty()) { ! 804: s += "/"; ! 805: } ! 806: s += make_reg(Reg::FPIAR); ! 807: n++; ! 808: } ! 809: ! 810: if (n == 0) ! 811: s = "nofpc"; ! 812: ! 813: return n; ! 814: } ! 815: ! 816: // FMOVEM のレジスタリスト文字列を返す。 ! 817: // 第2ワードのフェッチはすでに行ってあるはず。 ! 818: // プリデクリメントかどうかの判断はこちらで行う。 ! 819: std::string ! 820: Disasm::make_fpnlist() ! 821: { ! 822: uint16 mask = ir[1] & 0x00ff; ! 823: std::string s; ! 824: ! 825: // プリデクリメントモードなら、ビット順を入れ替える。 ! 826: // An/Dn の時とは逆なので注意。てかなんでだよ。 ! 827: // <ea> のモードと食い違ってたらその時は知らん…。 ! 828: if ((ir[1] & 0x0800)) { ! 829: //mask = bitrev8(mask); ! 830: mask = ((mask & 0x55) << 1) | ((mask >> 1) & 0x55); ! 831: mask = ((mask & 0x33) << 2) | ((mask >> 2) & 0x33); ! 832: mask = ((mask & 0x0f) << 4) | ((mask >> 4) & 0x0f); ! 833: } ! 834: ! 835: // これで、レジスタは常に上から順に並んでいる。 ! 836: // 7 6 5 .. 1 0 ! 837: // FP0 FP1 FP2 .. FP6 FP7 ! 838: ! 839: make_reglist_half(s, "fp", mask << 8); ! 840: if (s.empty()) { ! 841: s = "nofpn"; ! 842: } ! 843: return s; ! 844: } ! 845: ! 846: /*static*/ const char * const Disasm::reg_names[] = { ! 847: "ccr", ! 848: "sr", ! 849: "pc", ! 850: "usp", ! 851: ! 852: "msp", ! 853: "isp", ! 854: "vbr", ! 855: "sfc", ! 856: "dfc", ! 857: "cacr", ! 858: "caar", ! 859: ! 860: "tc", ! 861: "mmusr", ! 862: "srp", ! 863: "crp", ! 864: "tt0", ! 865: "tt1", ! 866: ! 867: "fpcr", ! 868: "fpsr", ! 869: "fpiar", ! 870: }; ! 871: ! 872: /*static*/ const char * const Disasm::size_str[] = { ! 873: ".l", ! 874: ".s", ! 875: ".x", ! 876: ".p", ! 877: ".w", ! 878: ".d", ! 879: ".b", ! 880: ".p", // dynamic k-factor ! 881: ".q", ! 882: "", // None ! 883: }; ! 884: ! 885: /*static*/ const char * const Disasm::conditions[] = { ! 886: "t", "f", "hi", "ls", "cc", "cs", "ne", "eq", ! 887: "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le", ! 888: }; ! 889: ! 890: /*static*/ const char * const Disasm::fpconditions[] = { ! 891: "f", // 000000 ! 892: "eq", // 000001 ! 893: "ogt", // 000010 ! 894: "oge", // 000011 ! 895: "olt", // 000100 ! 896: "ole", // 000101 ! 897: "ogl", // 000110 ! 898: "or", // 000111 ! 899: "un", // 001000 ! 900: "ueq", // 001001 ! 901: "ugt", // 001010 ! 902: "uge", // 001011 ! 903: "ult", // 001100 ! 904: "ule", // 001101 ! 905: "ne", // 001110 ! 906: "?", // 001111 ! 907: ! 908: "sf", // 010000 ! 909: "seq", // 010001 ! 910: "ge", // 010010 ! 911: "ge", // 010011 ! 912: "lt", // 010100 ! 913: "le", // 010101 ! 914: "gl", // 010110 ! 915: "gle", // 010111 ! 916: "ngle", // 011000 ! 917: "ngl", // 011001 ! 918: "nle", // 011010 ! 919: "nlt", // 011011 ! 920: "nge", // 011100 ! 921: "ngt", // 011101 ! 922: "sne", // 011110 ! 923: "st", // 011111 ! 924: }; ! 925: ! 926: /*static*/ const char * const Disasm::btst_names[] = { ! 927: "btst", ! 928: "bchg", ! 929: "bclr", ! 930: "bset", ! 931: }; ! 932: ! 933: /*static*/ const char * const Disasm::fpgen_names[] = { ! 934: "fmove", // $00 ! 935: "fint", // $01 ! 936: "fsinh", // $02 ! 937: "fintrz", // $03 ! 938: "fsqrt", // $04 ! 939: "", // $05 ! 940: "flognp1", // $06 ! 941: "", // $07 ! 942: "fetoxm1", // $08 ! 943: "ftanh", // $09 ! 944: "fatan", // $0a ! 945: "", // $0b ! 946: "fasin", // $0c ! 947: "fatanh", // $0d ! 948: "fsin", // $0e ! 949: "ftan", // $0f ! 950: "fetox", // $10 ! 951: "ftwotox", // $11 ! 952: "ftentox", // $12 ! 953: "", // $13 ! 954: "flogn", // $14 ! 955: "flog10", // $15 ! 956: "flog2", // $16 ! 957: "", // $17 ! 958: "fabs", // $18 ! 959: "fcosh", // $19 ! 960: "fneg", // $1a ! 961: "", // $1b ! 962: "facos", // $1c ! 963: "fcos", // $1d ! 964: "fgetexp", // $1e ! 965: "fgetman", // $1f ! 966: "fdiv", // $20 ! 967: "fmod", // $21 ! 968: "fadd", // $22 ! 969: "fmul", // $23 ! 970: "fsgldiv", // $24 ! 971: "frem", // $25 ! 972: "fscale", // $26 ! 973: "fsglmul", // $27 ! 974: "fsub", // $28 ! 975: "", // $29 ! 976: "", // $2a ! 977: "", // $2b ! 978: "", // $2c ! 979: "", // $2d ! 980: "", // $2e ! 981: "", // $2f ! 982: "", // $30 (fsincos) ! 983: "", // $31 (fsincos) ! 984: "", // $32 (fsincos) ! 985: "", // $33 (fsincos) ! 986: "", // $34 (fsincos) ! 987: "", // $35 (fsincos) ! 988: "", // $36 (fsincos) ! 989: "", // $37 (fsincos) ! 990: "fcmp", // $38 ! 991: "", // $39 ! 992: "ftst", // $3a ! 993: }; ! 994: ! 995: /*static*/ const char * const Disasm::fmovecr_text[] = { ! 996: "<log10(2)>", // [0] $0b ! 997: "<e>", // [1] $0c ! 998: "<log2(e)>", // [2] $0d ! 999: "<log10(e)>", // [3] $0e ! 1000: "<0>", // [4] $0f ! 1001: "<ln(2)>", // $30 ! 1002: "<ln(10)>", // $31 ! 1003: "<1>", // $32 ! 1004: "<10>", // $33 ! 1005: "<1e2>", // $34 ! 1006: "<1e4>", // $35 ! 1007: "<1e8>", // $36 ! 1008: "<1e16>", // $37 ! 1009: "<1e32>", // $38 ! 1010: "<1e64>", // $39 ! 1011: "<1e128>", // $3a ! 1012: "<1e256>", // $3b ! 1013: "<1e512>", // $3c ! 1014: "<1e1024>", // $3d ! 1015: "<1e2048>", // $3e ! 1016: "<1e4096>", // $3f ! 1017: }; ! 1018: ! 1019: /*static*/ const char *const Disasm::x68k_doscall[256] = { ! 1020: "_EXIT", // ff00 ! 1021: "_GETCHAR", // ff01 ! 1022: "_PUTCHAR", // ff02 ! 1023: "_COMINP", // ff03 ! 1024: "_COMOUT", // ff04 ! 1025: "_PRNOUT", // ff05 ! 1026: "_INPOUT", // ff06 ! 1027: "_INKEY", // ff07 ! 1028: "_GETC", // ff08 ! 1029: "_PRINT", // ff09 ! 1030: "_GETS", // ff0a ! 1031: "_KEYSNS", // ff0b ! 1032: "_KFLUSH", // ff0c ! 1033: "_FFLUSH", // ff0d ! 1034: "_CHGDRV", // ff0e ! 1035: "_DRVCTRL", // ff0f ! 1036: ! 1037: "_CONSNS", // ff10 ! 1038: "_PRNSNS", // ff11 ! 1039: "_CINSNS", // ff12 ! 1040: "_COUTSNS", // ff13 ! 1041: NULL, // ff14 ! 1042: NULL, // ff15 ! 1043: NULL, // ff16 ! 1044: "_FATCHK", // ff17 ! 1045: "_HENDSP", // ff18 ! 1046: "_CURDRV", // ff19 ! 1047: "_GETSS", // ff1a ! 1048: "_FGETC", // ff1b ! 1049: "_FGETS", // ff1c ! 1050: "_FPUTC", // ff1d ! 1051: "_FPUTS", // ff1e ! 1052: "_ALLCLOSE", // ff1f ! 1053: ! 1054: "_SUPER", // ff20 ! 1055: "_FNCKEY", // ff21 ! 1056: "_KNJCTRL", // ff22 ! 1057: "_CONCTRL", // ff23 ! 1058: "_KEYCTRL", // ff24 ! 1059: "_INTVCS", // ff25 ! 1060: "_PSPSET", // ff26 ! 1061: "_GETTIM2", // ff27 ! 1062: "_SETTIM2", // ff28 ! 1063: "_NAMESTS", // ff29 ! 1064: "_GETDATE", // ff2a ! 1065: "_SETDATE", // ff2b ! 1066: "_GETTIME", // ff2c ! 1067: "_SETTIME", // ff2d ! 1068: "_VERIFY", // ff2e ! 1069: "_DUP0", // ff2f ! 1070: ! 1071: "_VERNUM", // ff30 ! 1072: "_KEEPPR", // ff31 ! 1073: "_GETDPB", // ff32 ! 1074: "_BREAKCK", // ff33 ! 1075: "_DRVXCHG", // ff34 ! 1076: "_INTVCG", // ff35 ! 1077: "_DSKFRE", // ff36 ! 1078: "_NAMECK", // ff37 ! 1079: NULL, // ff38 ! 1080: "_MKDIR", // ff39 ! 1081: "_RMDIR", // ff3a ! 1082: "_CHDIR", // ff3b ! 1083: "_CREATE", // ff3c ! 1084: "_OPEN", // ff3d ! 1085: "_CLOSE", // ff3e ! 1086: "_READ", // ff3f ! 1087: ! 1088: "_WRITE", // ff40 ! 1089: "_DELETE", // ff41 ! 1090: "_SEEK", // ff42 ! 1091: "_CHMOD", // ff43 ! 1092: "_IOCTRL", // ff44 ! 1093: "_DUP", // ff45 ! 1094: "_DUP2", // ff46 ! 1095: "_CURDIR", // ff47 ! 1096: "_MALLOC", // ff48 ! 1097: "_MFREE", // ff49 ! 1098: "_SETBLOCK", // ff4a ! 1099: "_EXEC", // ff4b ! 1100: "_EXIT2", // ff4c ! 1101: "_WAIT", // ff4d ! 1102: "_FILES", // ff4e ! 1103: "_NFILES", // ff4f ! 1104: ! 1105: "_SETPDB", // ff50 (Human68k ver.2) ! 1106: "_GETPDB", // ff51 (Human68k ver.2) ! 1107: "_SETENV", // ff52 (Human68k ver.2) ! 1108: "_GETENV", // ff53 (Human68k ver.2) ! 1109: "_VERIFYG", // ff54 (Human68k ver.2) ! 1110: "_COMMON", // ff55 (Human68k ver.2) ! 1111: "_RENAME", // ff56 (Human68k ver.2) ! 1112: "_FILEDATE", // ff57 (Human68k ver.2) ! 1113: "_MALLOC2", // ff58 (Human68k ver.2) ! 1114: NULL, // ff59 ! 1115: "_MAKETMP", // ff5a (Human68k ver.2) ! 1116: "_NEWFILE", // ff5b (Human68k ver.2) ! 1117: "_LOCK", // ff5c (Human68k ver.2) ! 1118: NULL, // ff5d ! 1119: NULL, // ff5e ! 1120: "_ASSIGN", // ff5f (Human68k ver.2) ! 1121: ! 1122: NULL, // ff60 ! 1123: NULL, // ff61 ! 1124: NULL, // ff62 ! 1125: NULL, // ff63 ! 1126: NULL, // ff64 ! 1127: NULL, // ff65 ! 1128: NULL, // ff66 ! 1129: NULL, // ff67 ! 1130: NULL, // ff68 ! 1131: NULL, // ff69 ! 1132: NULL, // ff6a ! 1133: NULL, // ff6b ! 1134: NULL, // ff6c ! 1135: NULL, // ff6d ! 1136: NULL, // ff6e ! 1137: NULL, // ff6f ! 1138: ! 1139: NULL, // ff70 ! 1140: NULL, // ff71 ! 1141: NULL, // ff72 ! 1142: NULL, // ff73 ! 1143: NULL, // ff74 ! 1144: NULL, // ff75 ! 1145: NULL, // ff76 ! 1146: NULL, // ff77 ! 1147: NULL, // ff78 ! 1148: NULL, // ff79 ! 1149: "_FFLUSH_SET", // ff7a (Human68k ver.2) ! 1150: "_OS_PATCH", // ff7b (Human68k ver.2) ! 1151: "_GETFCB", // ff7c (Human68k ver.2) ! 1152: "_S_MALLOC", // ff7d (Human68k ver.2) ! 1153: "_S_MFREE", // ff7e (Human68k ver.2) ! 1154: "_S_PROCESS", // ff7f (Human68k ver.2) ! 1155: ! 1156: "_SETPDB", // ff80 ! 1157: "_GETPDB", // ff81 ! 1158: "_SETENV", // ff82 ! 1159: "_GETENV", // ff83 ! 1160: "_VERIFYG", // ff84 ! 1161: "_COMMON", // ff85 ! 1162: "_RENAME", // ff86 ! 1163: "_FILEDATE", // ff87 ! 1164: "_MALLOC2", // ff88 ! 1165: NULL, // ff89 ! 1166: "_MAKETMP", // ff8a ! 1167: "_NEWFILE", // ff8b ! 1168: "_LOCK", // ff8c ! 1169: NULL, // ff8d ! 1170: NULL, // ff8e ! 1171: "_ASSIGN", // ff8f ! 1172: ! 1173: NULL, // ff90 ! 1174: NULL, // ff91 ! 1175: NULL, // ff92 ! 1176: NULL, // ff93 ! 1177: NULL, // ff94 ! 1178: NULL, // ff95 ! 1179: NULL, // ff96 ! 1180: NULL, // ff97 ! 1181: NULL, // ff98 ! 1182: NULL, // ff99 ! 1183: NULL, // ff9a ! 1184: NULL, // ff9b ! 1185: NULL, // ff9c ! 1186: NULL, // ff9d ! 1187: NULL, // ff9e ! 1188: NULL, // ff9f ! 1189: ! 1190: NULL, // ffa0 ! 1191: NULL, // ffa1 ! 1192: NULL, // ffa2 ! 1193: NULL, // ffa3 ! 1194: NULL, // ffa4 ! 1195: NULL, // ffa5 ! 1196: NULL, // ffa6 ! 1197: NULL, // ffa7 ! 1198: NULL, // ffa8 ! 1199: NULL, // ffa9 ! 1200: "_FFLUSH_SET", // ffaa ! 1201: "_OS_PATCH", // ffab ! 1202: "_GETFCB", // ffac ! 1203: "_S_MALLOC", // ffad ! 1204: "_S_MFREE", // ffae ! 1205: "_S_PROCESS", // ffaf ! 1206: ! 1207: NULL, // ffb0 ! 1208: NULL, // ffb1 ! 1209: NULL, // ffb2 ! 1210: NULL, // ffb3 ! 1211: NULL, // ffb4 ! 1212: NULL, // ffb5 ! 1213: NULL, // ffb6 ! 1214: NULL, // ffb7 ! 1215: NULL, // ffb8 ! 1216: NULL, // ffb9 ! 1217: NULL, // ffba ! 1218: NULL, // ffbb ! 1219: NULL, // ffbc ! 1220: NULL, // ffbd ! 1221: NULL, // ffbe ! 1222: NULL, // ffbf ! 1223: ! 1224: NULL, // ffc0 ! 1225: NULL, // ffc1 ! 1226: NULL, // ffc2 ! 1227: NULL, // ffc3 ! 1228: NULL, // ffc4 ! 1229: NULL, // ffc5 ! 1230: NULL, // ffc6 ! 1231: NULL, // ffc7 ! 1232: NULL, // ffc8 ! 1233: NULL, // ffc9 ! 1234: NULL, // ffca ! 1235: NULL, // ffcb ! 1236: NULL, // ffcc ! 1237: NULL, // ffcd ! 1238: NULL, // ffce ! 1239: NULL, // ffcf ! 1240: ! 1241: NULL, // ffd0 ! 1242: NULL, // ffd1 ! 1243: NULL, // ffd2 ! 1244: NULL, // ffd3 ! 1245: NULL, // ffd4 ! 1246: NULL, // ffd5 ! 1247: NULL, // ffd6 ! 1248: NULL, // ffd7 ! 1249: NULL, // ffd8 ! 1250: NULL, // ffd9 ! 1251: NULL, // ffda ! 1252: NULL, // ffdb ! 1253: NULL, // ffdc ! 1254: NULL, // ffdd ! 1255: NULL, // ffde ! 1256: NULL, // ffdf ! 1257: ! 1258: NULL, // ffe0 ! 1259: NULL, // ffe1 ! 1260: NULL, // ffe2 ! 1261: NULL, // ffe3 ! 1262: NULL, // ffe4 ! 1263: NULL, // ffe5 ! 1264: NULL, // ffe6 ! 1265: NULL, // ffe7 ! 1266: NULL, // ffe8 ! 1267: NULL, // ffe9 ! 1268: NULL, // ffea ! 1269: NULL, // ffeb ! 1270: NULL, // ffec ! 1271: NULL, // ffed ! 1272: NULL, // ffee ! 1273: NULL, // ffef ! 1274: ! 1275: "_EXITVC", // fff0 ! 1276: "_CTRLVC", // fff1 ! 1277: "_ERRJVC", // fff2 ! 1278: "_DISKRED", // fff3 ! 1279: "_DISKWRT", // fff4 ! 1280: "_INDOSFLG", // fff5 ! 1281: "_SUPER_JSR", // fff6 ! 1282: "_BUS_ERR", // fff7 ! 1283: "_OPEN_PR", // fff8 ! 1284: "_KILL_PR", // fff9 ! 1285: "_GET_PR", // fffa ! 1286: "_SUSPEND_PR", // fffb ! 1287: "_SLEEP_PR", // fffc ! 1288: "_SEND_PR", // fffd ! 1289: "_TIME_PR", // fffe ! 1290: "_CHANGE_PR", // ffff ! 1291: }; ! 1292: ! 1293: /*static*/ const char * const Disasm::x68k_fpcall[256] = { ! 1294: "__LMUL", // fe00 ! 1295: "__LDIV", // fe01 ! 1296: "__LMOD", // fe02 ! 1297: NULL, // fe03 ! 1298: "__UMUL", // fe04 ! 1299: "__UDIV", // fe05 ! 1300: "__UMOD", // fe06 ! 1301: NULL, // fe07 ! 1302: "__IMUL", // fe08 ! 1303: "__IDIV", // fe09 ! 1304: NULL, // fe0a ! 1305: NULL, // fe0b ! 1306: "__RANDOMIZE", // fe0c ! 1307: "__SRAND", // fe0d ! 1308: "__RAND", // fe0e ! 1309: NULL, // fe0f ! 1310: ! 1311: "__STOL", // fe10 ! 1312: "__LTOS", // fe11 ! 1313: "__STOH", // fe12 ! 1314: "__HTOS", // fe13 ! 1315: "__STOO", // fe14 ! 1316: "__OTOS", // fe15 ! 1317: "__STOB", // fe16 ! 1318: "__BTOS", // fe17 ! 1319: "__IUSING", // fe18 ! 1320: NULL, // fe19 ! 1321: "__LTOD", // fe1a ! 1322: "__DTOL", // fe1b ! 1323: "__LTOF", // fe1c ! 1324: "__FTOL", // fe1d ! 1325: "__FTOD", // fe1e ! 1326: "__DTOF", // fe1f ! 1327: ! 1328: "__VAL", // fe20 ! 1329: "__USING", // fe21 ! 1330: "__STOD", // fe22 ! 1331: "__DTOS", // fe23 ! 1332: "__ECVT", // fe24 ! 1333: "__FCVT", // fe25 ! 1334: "__GCVT", // fe26 ! 1335: NULL, // fe27 ! 1336: "__DTST", // fe28 ! 1337: "__DCMP", // fe29 ! 1338: "__DNEG", // fe2a ! 1339: "__DADD", // fe2b ! 1340: "__DSUB", // fe2c ! 1341: "__DMUL", // fe2d ! 1342: "__DDIV", // fe2e ! 1343: "__DMOD", // fe2f ! 1344: ! 1345: "__DABS", // fe30 ! 1346: "__DCEIL", // fe31 ! 1347: "__DFIX", // fe32 ! 1348: "__DFLOOR", // fe33 ! 1349: "__DFRAC", // fe34 ! 1350: "__DSGN", // fe35 ! 1351: "__SIN", // fe36 ! 1352: "__COS", // fe37 ! 1353: "__TAN", // fe38 ! 1354: "__ATAN", // fe39 ! 1355: "__LOG", // fe3a ! 1356: "__EXP", // fe3b ! 1357: "__SQR", // fe3c ! 1358: "__PI", // fe3d ! 1359: "__NPI", // fe3e ! 1360: "__POWER", // fe3f ! 1361: ! 1362: "__RND", // fe40 ! 1363: "__SINH", // fe41 ! 1364: "__COSH", // fe42 ! 1365: "__TANH", // fe43 ! 1366: "__ATANH", // fe44 ! 1367: "__ASIN", // fe45 ! 1368: "__ACOS", // fe46 ! 1369: "__LOG10", // fe47 ! 1370: "__LOG2", // fe48 ! 1371: "__DFREXP", // fe49 ! 1372: "__DLDEXP", // fe4a ! 1373: "__DADDONE", // fe4b ! 1374: "__DSUBONE", // fe4c ! 1375: "__DDIVTWO", // fe4d ! 1376: "__DIEECNV", // fe4e ! 1377: "__IEEDCNV", // fe4f ! 1378: ! 1379: "__FVAL", // fe50 ! 1380: "__FUSING", // fe51 ! 1381: "__STOF", // fe52 ! 1382: "__FTOS", // fe53 ! 1383: "__FECVT", // fe54 ! 1384: "__FFCVT", // fe55 ! 1385: "__FGCVT", // fe56 ! 1386: NULL, // fe57 ! 1387: "__FTST", // fe58 ! 1388: "__FCMP", // fe59 ! 1389: "__FNEG", // fe5a ! 1390: "__FADD", // fe5b ! 1391: "__FSUB", // fe5c ! 1392: "__FMUL", // fe5d ! 1393: "__FDIV", // fe5e ! 1394: "__FMOD", // fe5f ! 1395: ! 1396: "__FABS", // fe60 ! 1397: "__FCEIL", // fe61 ! 1398: "__FFIX", // fe62 ! 1399: "__FFLOOR", // fe63 ! 1400: "__FFRAC", // fe64 ! 1401: "__FSGN", // fe65 ! 1402: "__FSIN", // fe66 ! 1403: "__FCOS", // fe67 ! 1404: "__FTAN", // fe68 ! 1405: "__FATAN", // fe69 ! 1406: "__FLOG", // fe6a ! 1407: "__FEXP", // fe6b ! 1408: "__FSQR", // fe6c ! 1409: "__FPI", // fe6d ! 1410: "__FNPI", // fe6e ! 1411: "__FPOWER", // fe6f ! 1412: ! 1413: "__FRND", // fe70 ! 1414: "__FSINH", // fe71 ! 1415: "__FCOSH", // fe72 ! 1416: "__FTANH", // fe73 ! 1417: "__FATANH", // fe74 ! 1418: "__FASIN", // fe75 ! 1419: "__FACOS", // fe76 ! 1420: "__FLOG10", // fe77 ! 1421: "__FLOG2", // fe78 ! 1422: "__FFREXP", // fe79 ! 1423: "__FLDEXP", // fe7a ! 1424: "__FADDONE", // fe7b ! 1425: "__FSUBONE", // fe7c ! 1426: "__FDIVTWO", // fe7d ! 1427: "__FIEECNV", // fe7e ! 1428: "__IEEFCNV", // fe7f ! 1429: ! 1430: NULL, // fe80 ! 1431: NULL, // fe81 ! 1432: NULL, // fe82 ! 1433: NULL, // fe83 ! 1434: NULL, // fe84 ! 1435: NULL, // fe85 ! 1436: NULL, // fe86 ! 1437: NULL, // fe87 ! 1438: NULL, // fe88 ! 1439: NULL, // fe89 ! 1440: NULL, // fe8a ! 1441: NULL, // fe8b ! 1442: NULL, // fe8c ! 1443: NULL, // fe8d ! 1444: NULL, // fe8e ! 1445: NULL, // fe8f ! 1446: ! 1447: NULL, // fe90 ! 1448: NULL, // fe91 ! 1449: NULL, // fe92 ! 1450: NULL, // fe93 ! 1451: NULL, // fe94 ! 1452: NULL, // fe95 ! 1453: NULL, // fe96 ! 1454: NULL, // fe97 ! 1455: NULL, // fe98 ! 1456: NULL, // fe99 ! 1457: NULL, // fe9a ! 1458: NULL, // fe9b ! 1459: NULL, // fe9c ! 1460: NULL, // fe9d ! 1461: NULL, // fe9e ! 1462: NULL, // fe9f ! 1463: ! 1464: NULL, // fea0 ! 1465: NULL, // fea1 ! 1466: NULL, // fea2 ! 1467: NULL, // fea3 ! 1468: NULL, // fea4 ! 1469: NULL, // fea5 ! 1470: NULL, // fea6 ! 1471: NULL, // fea7 ! 1472: NULL, // fea8 ! 1473: NULL, // fea9 ! 1474: NULL, // feaa ! 1475: NULL, // feab ! 1476: NULL, // feac ! 1477: NULL, // fead ! 1478: NULL, // feae ! 1479: NULL, // feaf ! 1480: ! 1481: NULL, // feb0 ! 1482: NULL, // feb1 ! 1483: NULL, // feb2 ! 1484: NULL, // feb3 ! 1485: NULL, // feb4 ! 1486: NULL, // feb5 ! 1487: NULL, // feb6 ! 1488: NULL, // feb7 ! 1489: NULL, // feb8 ! 1490: NULL, // feb9 ! 1491: NULL, // feba ! 1492: NULL, // febb ! 1493: NULL, // febc ! 1494: NULL, // febd ! 1495: NULL, // febe ! 1496: NULL, // febf ! 1497: ! 1498: NULL, // fec0 ! 1499: NULL, // fec1 ! 1500: NULL, // fec2 ! 1501: NULL, // fec3 ! 1502: NULL, // fec4 ! 1503: NULL, // fec5 ! 1504: NULL, // fec6 ! 1505: NULL, // fec7 ! 1506: NULL, // fec8 ! 1507: NULL, // fec9 ! 1508: NULL, // feca ! 1509: NULL, // fecb ! 1510: NULL, // fecc ! 1511: NULL, // fecd ! 1512: NULL, // fece ! 1513: NULL, // fecf ! 1514: ! 1515: NULL, // fed0 ! 1516: NULL, // fed1 ! 1517: NULL, // fed2 ! 1518: NULL, // fed3 ! 1519: NULL, // fed4 ! 1520: NULL, // fed5 ! 1521: NULL, // fed6 ! 1522: NULL, // fed7 ! 1523: NULL, // fed8 ! 1524: NULL, // fed9 ! 1525: NULL, // feda ! 1526: NULL, // fedb ! 1527: NULL, // fedc ! 1528: NULL, // fedd ! 1529: NULL, // fede ! 1530: NULL, // fedf ! 1531: ! 1532: "__CLMUL", // fee0 ! 1533: "__CLDIV", // fee1 ! 1534: "__CLMOD", // fee2 ! 1535: "__CUMUL", // fee3 ! 1536: "__CUDIV", // fee4 ! 1537: "__CUMOD", // fee5 ! 1538: "__CLTOD", // fee6 ! 1539: "__CDTOL", // fee7 ! 1540: "__CLTOF", // fee8 ! 1541: "__CFTOL", // fee9 ! 1542: "__CFTOD", // feea ! 1543: "__CDTOF", // feeb ! 1544: "__CDCMP", // feec ! 1545: "__CDADD", // feed ! 1546: "__CDSUB", // feee ! 1547: "__CDMUL", // feef ! 1548: ! 1549: "__CDDIV", // fef0 ! 1550: "__CDMOD", // fef1 ! 1551: "__CFCMP", // fef2 ! 1552: "__CFADD", // fef3 ! 1553: "__CFSUB", // fef4 ! 1554: "__CFMUL", // fef5 ! 1555: "__CFDIV", // fef6 ! 1556: "__CFMOD", // fef7 ! 1557: "__CDTST", // fef8 ! 1558: "__CFTST", // fef9 ! 1559: "__CDINC", // fefa ! 1560: "__CFINC", // fefb ! 1561: "__CDDEC", // fefc ! 1562: "__CFDEC", // fefd ! 1563: "__FEVARG", // fefe ! 1564: "__FEVECS", // feff ! 1565: ! 1566: }; ! 1567: ! 1568: /*static*/ const char * const Disasm::x68k_iocscall[256] = { ! 1569: "_B_KEYINP", // 7000 ! 1570: "_B_KEYSNS", // 7001 ! 1571: "_B_SFTSNS", // 7002 ! 1572: "_KEY_INIT", // 7003 ! 1573: "_BITSNS", // 7004 ! 1574: "_SKEYSET", // 7005 ! 1575: "_LEDCTRL", // 7006 ! 1576: "_LEDSET", // 7007 ! 1577: "_KEYDLY", // 7008 ! 1578: "_KEYREP", // 7009 ! 1579: NULL, // 700a ! 1580: NULL, // 700b ! 1581: "_TVCTRL", // 700c ! 1582: "_LEDMOD", // 700d ! 1583: "_TGUSEMD", // 700e ! 1584: "_DEFCHR", // 700f ! 1585: ! 1586: "_CRTMOD", // 7010 ! 1587: "_CONTRAST", // 7011 ! 1588: "_HSVTORGB", // 7012 ! 1589: "_TPALET", // 7013 ! 1590: "_TPALET2", // 7014 ! 1591: "_TCOLOR", // 7015 ! 1592: "_FNTADR", // 7016 ! 1593: "_VRAMGET", // 7017 ! 1594: "_VRAMPUT", // 7018 ! 1595: "_FNTGET", // 7019 ! 1596: "_TEXTGET", // 701a ! 1597: "_TEXTPUT", // 701b ! 1598: "_CLIPPUT", // 701c ! 1599: "_SCROLL", // 701d ! 1600: "_B_CURON", // 701e ! 1601: "_B_CUROFF", // 701f ! 1602: ! 1603: "_B_PUTC", // 7020 ! 1604: "_B_PRINT", // 7021 ! 1605: "_B_COLOR", // 7022 ! 1606: "_B_LOCATE", // 7023 ! 1607: "_B_DOWN_S", // 7024 ! 1608: "_B_UP_S", // 7025 ! 1609: "_B_UP", // 7026 ! 1610: "_B_DOWN", // 7027 ! 1611: "_B_RIGHT", // 7028 ! 1612: "_B_LEFT", // 7029 ! 1613: "_B_CLR_ST", // 702a ! 1614: "_B_ERA_ST", // 702b ! 1615: "_B_INS", // 702c ! 1616: "_B_DEL", // 702d ! 1617: "_B_CONSOL", // 702e ! 1618: "_B_PUTMES", // 702f ! 1619: ! 1620: "_SET232C", // 7030 ! 1621: "_LOF232C", // 7031 ! 1622: "_INP232C", // 7032 ! 1623: "_ISNS232C", // 7033 ! 1624: "_OSNS232C", // 7034 ! 1625: "_OUT232C", // 7035 ! 1626: NULL, // 7036 ! 1627: NULL, // 7037 ! 1628: "_SETFNTADR", // 7038 ! 1629: NULL, // 7039 ! 1630: NULL, // 703a ! 1631: "_JOYGET", // 703b ! 1632: "_INIT_PRN", // 703c ! 1633: "_SNSPRN", // 703d ! 1634: "_OUTLPT", // 703e ! 1635: "_OUTPRN", // 703f ! 1636: ! 1637: "_B_SEEK", // 7040 ! 1638: "_B_VERIFY", // 7041 ! 1639: "_B_READDI", // 7042 ! 1640: "_B_DSKINI", // 7043 ! 1641: "_B_DRVSNS", // 7044 ! 1642: "_B_WRITE", // 7045 ! 1643: "_B_READ", // 7046 ! 1644: "_B_RECALI", // 7047 ! 1645: "_B_ASSIGN", // 7048 ! 1646: "_B_WRITED", // 7049 ! 1647: "_B_READID", // 704a ! 1648: "_B_BADFMT", // 704b ! 1649: "_B_READDL", // 704c ! 1650: "_B_FORMAT", // 704d ! 1651: "_B_DRVCHK", // 704e ! 1652: "_B_EJECT", // 704f ! 1653: ! 1654: "_DATEBCD", // 7050 ! 1655: "_DATESET", // 7051 ! 1656: "_TIMEBCD", // 7052 ! 1657: "_TIMESET", // 7053 ! 1658: "_DATEGET", // 7054 ! 1659: "_DATEBIN", // 7055 ! 1660: "_TIMEGET", // 7056 ! 1661: "_TIMEBIN", // 7057 ! 1662: "_DATECNV", // 7058 ! 1663: "_TIMECNV", // 7059 ! 1664: "_DATEASC", // 705a ! 1665: "_TIMEASC", // 705b ! 1666: "_DAYASC", // 705c ! 1667: "_ALARMMOD", // 705d ! 1668: "_ALARMSET", // 705e ! 1669: "_ALARMGET", // 705f ! 1670: ! 1671: "_ADPCMOUT", // 7060 ! 1672: "_ADPCMINP", // 7061 ! 1673: "_ADPCMAOT", // 7062 ! 1674: "_ADPCMAIN", // 7063 ! 1675: "_ADPCMLOT", // 7064 ! 1676: "_ADPCMLIN", // 7065 ! 1677: "_ADPCMSNS", // 7066 ! 1678: "_ADPCMMOD", // 7067 ! 1679: "_OPMSET", // 7068 ! 1680: "_OPMSNS", // 7069 ! 1681: "_OPMINTST", // 706a ! 1682: "_TIMERDST", // 706b ! 1683: "_VDISPST", // 706c ! 1684: "_CRTCRAS", // 706d ! 1685: "_HSYNCST", // 706e ! 1686: "_PRNINTST", // 706f ! 1687: ! 1688: "_MS_INIT", // 7070 ! 1689: "_MS_CURON", // 7071 ! 1690: "_MS_CUROF", // 7072 ! 1691: "_MS_STAT", // 7073 ! 1692: "_MS_GETDT", // 7074 ! 1693: "_MS_CURGT", // 7075 ! 1694: "_MS_CURST", // 7076 ! 1695: "_MS_LIMIT", // 7077 ! 1696: "_MS_OFFTM", // 7078 ! 1697: "_MS_ONTM", // 7079 ! 1698: "_MS_PATST", // 707a ! 1699: "_MS_SEL", // 707b ! 1700: "_MS_SEL2", // 707c ! 1701: "_SKEY_MOD", // 707d ! 1702: "_DENSNS", // 707e ! 1703: "_ONTIME", // 707f ! 1704: ! 1705: "_B_INTVCS", // 7080 ! 1706: "_B_SUPER", // 7081 ! 1707: "_B_BPEEK", // 7082 ! 1708: "_B_WPEEK", // 7083 ! 1709: "_B_LPEEK", // 7084 ! 1710: "_B_MEMSTR", // 7085 ! 1711: "_B_BPOKE", // 7086 ! 1712: "_B_WPOKE", // 7087 ! 1713: "_B_LPOKE", // 7088 ! 1714: "_B_MEMSET", // 7089 ! 1715: "_DMAMOVE", // 708a ! 1716: "_DMAMOV_A", // 708b ! 1717: "_DMAMOV_L", // 708c ! 1718: "_DMAMODE", // 708d ! 1719: "_BOOTINF", // 708e ! 1720: "_ROMVER", // 708f ! 1721: ! 1722: "_G_CLR_ON", // 7090 ! 1723: NULL, // 7091 ! 1724: NULL, // 7092 ! 1725: NULL, // 7093 ! 1726: "_GPALET", // 7094 ! 1727: NULL, // 7095 ! 1728: NULL, // 7096 ! 1729: NULL, // 7097 ! 1730: NULL, // 7098 ! 1731: NULL, // 7099 ! 1732: NULL, // 709a ! 1733: NULL, // 709b ! 1734: NULL, // 709c ! 1735: NULL, // 709d ! 1736: NULL, // 709e ! 1737: NULL, // 709f ! 1738: ! 1739: "_SFTJIS", // 70a0 ! 1740: "_JISSFT", // 70a1 ! 1741: "_AKCONV", // 70a2 ! 1742: "_RMACNV", // 70a3 ! 1743: "_DAKJOB", // 70a4 ! 1744: "_HANJOB", // 70a5 ! 1745: NULL, // 70a6 ! 1746: NULL, // 70a7 ! 1747: NULL, // 70a8 ! 1748: NULL, // 70a9 ! 1749: NULL, // 70aa ! 1750: NULL, // 70ab ! 1751: "_SYS_STAT", // 70ac ! 1752: "_B_CONMOD", // 70ad ! 1753: "_OS_CURON", // 70ae ! 1754: "_OS_CUROF", // 70af ! 1755: ! 1756: "_DRAWMODE", // 70b0 ! 1757: "_APAGE", // 70b1 ! 1758: "_VPAGE", // 70b2 ! 1759: "_HOME", // 70b3 ! 1760: "_WINDOW", // 70b4 ! 1761: "_WIPE", // 70b5 ! 1762: "_PSET", // 70b6 ! 1763: "_POINT", // 70b7 ! 1764: "_LINE", // 70b8 ! 1765: "_BOX", // 70b9 ! 1766: "_FILL", // 70ba ! 1767: "_CIRCLE", // 70bb ! 1768: "_PAINT", // 70bc ! 1769: "_SYMBOL", // 70bd ! 1770: "_GETGRM", // 70be ! 1771: "_PUTGRM", // 70bf ! 1772: ! 1773: "_SP_INIT", // 70c0 ! 1774: "_SP_ON", // 70c1 ! 1775: "_SP_OFF", // 70c2 ! 1776: "_SP_CGCLR", // 70c3 ! 1777: "_SP_DEFCG", // 70c4 ! 1778: "_SP_GTPCG", // 70c5 ! 1779: "_SP_REGST", // 70c6 ! 1780: "_SP_REGGT", // 70c7 ! 1781: "_BGSCRLST", // 70c8 ! 1782: "_BGSCRLGT", // 70c9 ! 1783: "_BGCTRLST", // 70ca ! 1784: "_BGCTRLGT", // 70cb ! 1785: "_BGTEXTCL", // 70cc ! 1786: "_BGTEXTST", // 70cd ! 1787: "_BGTEXTGT", // 70ce ! 1788: "_SPALET", // 70cf ! 1789: ! 1790: NULL, // 70d0 ! 1791: NULL, // 70d1 ! 1792: NULL, // 70d2 ! 1793: "_TXXLINE", // 70d3 ! 1794: "_TXYLINE", // 70d4 ! 1795: "_TXLINE", // 70d5 ! 1796: "_TXBOX", // 70d6 ! 1797: "_TXFILL", // 70d7 ! 1798: "_TXREV", // 70d8 ! 1799: NULL, // 70d9 ! 1800: NULL, // 70da ! 1801: NULL, // 70db ! 1802: NULL, // 70dc ! 1803: NULL, // 70dd ! 1804: NULL, // 70de ! 1805: "_TXRASCPY", // 70df ! 1806: ! 1807: NULL, // 70e0 ! 1808: NULL, // 70e1 ! 1809: NULL, // 70e2 ! 1810: NULL, // 70e3 ! 1811: NULL, // 70e4 ! 1812: NULL, // 70e5 ! 1813: NULL, // 70e6 ! 1814: NULL, // 70e7 ! 1815: NULL, // 70e8 ! 1816: NULL, // 70e9 ! 1817: NULL, // 70ea ! 1818: NULL, // 70eb ! 1819: NULL, // 70ec ! 1820: NULL, // 70ed ! 1821: NULL, // 70ee ! 1822: NULL, // 70ef ! 1823: ! 1824: "_OPMDRV", // 70f0 ! 1825: "_RSDRV", // 70f1 ! 1826: "_A_JOYGET", // 70f2 ! 1827: "_MUSICDRV", // 70f3 ! 1828: NULL, // 70f4 ! 1829: "_SCSIDRV", // 70f5 ! 1830: NULL, // 70f6 ! 1831: NULL, // 70f7 ! 1832: NULL, // 70f8 ! 1833: NULL, // 70f9 ! 1834: NULL, // 70fa ! 1835: NULL, // 70fb ! 1836: NULL, // 70fc ! 1837: "_ABORTRST", // 70fd ! 1838: "_IPLERR", // 70fe ! 1839: "_ABORTJOB", // 70ff ! 1840: }; ! 1841: ! 1842: // ここから命令 ! 1843: ! 1844: // %0000_000000_mmmrrr ORI.B #<imm>,<ea> ! 1845: // %0000_000000_111100 ORI.B #<imm>,CCR ! 1846: OP_DEF(ori_b) ! 1847: { ! 1848: name = "ori"; ! 1849: size = Size::B; ! 1850: src = imm8(); ! 1851: if ((ir[0] & 0x3f) == 0x3c) { ! 1852: dst = make_reg(Reg::CCR); ! 1853: } else { ! 1854: dst = make_ea(); ! 1855: } ! 1856: } ! 1857: ! 1858: // %0000_000001_mmmrrr ORI.W #<imm>,<ea> ! 1859: // %0000_000001_111100 ORI.W #<imm>,SR ! 1860: OP_DEF(ori_w) ! 1861: { ! 1862: name = "ori"; ! 1863: size = Size::W; ! 1864: src = imm16(); ! 1865: if ((ir[0] & 0x3f) == 0x3c) { ! 1866: dst = make_reg(Reg::SR); ! 1867: } else { ! 1868: dst = make_ea(); ! 1869: } ! 1870: } ! 1871: ! 1872: // %0000_000010_mmmrrr ORI.L #<imm>,<ea> ! 1873: OP_DEF(ori_l) ! 1874: { ! 1875: name = "ori"; ! 1876: size = Size::L; ! 1877: src = imm32(); ! 1878: dst = make_ea(); ! 1879: } ! 1880: ! 1881: void ! 1882: Disasm::ops_cmp2chk2(Disasm::Size sz) ! 1883: { ! 1884: fetch16(); ! 1885: if ((ir[1] & 0x0800) == 0) { ! 1886: // CMP2.[BWL] <ea>,Rn ! 1887: name = "cmp2"; ! 1888: } else { ! 1889: // CHK2.[BWL] <ea>,Rn ! 1890: name = "chk2"; ! 1891: } ! 1892: size = sz; ! 1893: src = make_ea(); ! 1894: dst = make_rn(ir[1] >> 12); ! 1895: } ! 1896: ! 1897: // %0000_000011_mmmrrr CMP2/CHK2.B <ea>,Rn ! 1898: OP_DEF(cmp2chk2_b) ! 1899: { ! 1900: ops_cmp2chk2(Size::B); ! 1901: } ! 1902: ! 1903: // B{TST,CHG,CLR,SET} と MOVEP のメイン部分 ! 1904: void ! 1905: Disasm::ops_btst_movep() ! 1906: { ! 1907: uint mr = (ir[0] >> 3) & 7; ! 1908: uint op = (ir[0] >> 6) & 3; ! 1909: ! 1910: if (mr == 0) { ! 1911: // B***.L Dx,Dy ! 1912: name = btst_names[op]; ! 1913: size = Size::L; ! 1914: src = make_dn(ir[0] >> 9); ! 1915: dst = make_dn(ir[0]); ! 1916: } else if (mr == 1) { ! 1917: // MOVEP ! 1918: ops_movep(); ! 1919: } else { ! 1920: // B***.B Dx,<ea> ! 1921: name = btst_names[op]; ! 1922: size = Size::B; ! 1923: src = make_dn(ir[0] >> 9); ! 1924: dst = make_ea(); ! 1925: } ! 1926: } ! 1927: ! 1928: // MOVEP ! 1929: void ! 1930: Disasm::ops_movep() ! 1931: { ! 1932: name = "movep"; ! 1933: uint mode = (ir[0] >> 6) & 3; ! 1934: __assume(mode <= 3); ! 1935: switch (mode) { ! 1936: case 0: // MOVEP.W (d,Ay),Dx ! 1937: size = Size::W; ! 1938: src = "(" + addr16() + "," + make_an(ir[0]) + ")"; ! 1939: dst = make_dn(ir[0] >> 9); ! 1940: break; ! 1941: case 1: // MOVEP.L (d,Ay),Dx ! 1942: size = Size::L; ! 1943: src = "(" + addr16() + "," + make_an(ir[0]) + ")"; ! 1944: dst = make_dn(ir[0] >> 9); ! 1945: break; ! 1946: case 2: // MOVEP.W Dx,(d,Ay) ! 1947: size = Size::W; ! 1948: src = make_dn(ir[0] >> 9); ! 1949: dst = "(" + addr16() + "," + make_an(ir[0]) + ")"; ! 1950: break; ! 1951: case 3: // MOVEP.L Dx,(d,Ay) ! 1952: size = Size::L; ! 1953: src = make_dn(ir[0] >> 9); ! 1954: dst = "(" + addr16() + "," + make_an(ir[0]) + ")"; ! 1955: break; ! 1956: } ! 1957: } ! 1958: ! 1959: // %0000_xxx100_000yyy BTST.L Dx,Dy ! 1960: // %0000_xxx100_001yyy MOVEP.W (d,Ay),Dx ! 1961: // %0000_xxx100_mmmrrr BTST.B Dx,<ea> ! 1962: OP_DEF(btst_dn_ea) ! 1963: { ! 1964: ops_btst_movep(); ! 1965: } ! 1966: ! 1967: // %0000_xxx101_000yyy BCHG.L Dx,Dy ! 1968: // %0000_xxx101_001yyy MOVEP.L (d,Ay),Dx ! 1969: // %0000_xxx101_mmmrrr BCHG.B Dx,<ea> ! 1970: OP_DEF(bchg_dn_ea) ! 1971: { ! 1972: ops_btst_movep(); ! 1973: } ! 1974: ! 1975: // %0000_xxx110_000yyy BCLR.L Dx,Dy ! 1976: // %0000_xxx110_001yyy MOVEP.W Dx,(d,Ay) ! 1977: // %0000_xxx110_mmmrrr BCLR.B Dx,<ea> ! 1978: OP_DEF(bclr_dn_ea) ! 1979: { ! 1980: ops_btst_movep(); ! 1981: } ! 1982: ! 1983: // %0000_xxx111_000yyy BSET.L Dx,Dy ! 1984: // %0000_xxx111_001yyy MOVEP.L Dx,(d,Ay) ! 1985: // %0000_xxx111_mmmrrr BSET.B Dx,<ea> ! 1986: OP_DEF(bset_dn_ea) ! 1987: { ! 1988: ops_btst_movep(); ! 1989: } ! 1990: ! 1991: // %0000_001000_mmmrrr ANDI.B #<imm>,<ea> ! 1992: // %0000_001000_111100 ANDI.B #<imm>,CCR ! 1993: OP_DEF(andi_b) ! 1994: { ! 1995: name = "andi"; ! 1996: size = Size::B; ! 1997: src = imm8(); ! 1998: if ((ir[0] & 0x3f) == 0x3c) { ! 1999: dst = make_reg(Reg::CCR); ! 2000: } else { ! 2001: dst = make_ea(); ! 2002: } ! 2003: } ! 2004: ! 2005: // %0000_001001_mmmrrr ANDI.W #<imm>,<ea> ! 2006: // %0000_001001_111100 ANDI.W #<imm>,SR ! 2007: OP_DEF(andi_w) ! 2008: { ! 2009: name = "andi"; ! 2010: size = Size::W; ! 2011: src = imm16(); ! 2012: if ((ir[0] & 0x3f) == 0x3c) { ! 2013: dst = make_reg(Reg::SR); ! 2014: } else { ! 2015: dst = make_ea(); ! 2016: } ! 2017: } ! 2018: ! 2019: // %0000_001010_mmmrrr ANDI.L #<imm>,<ea> ! 2020: OP_DEF(andi_l) ! 2021: { ! 2022: name = "andi"; ! 2023: size = Size::L; ! 2024: src = imm32(); ! 2025: dst = make_ea(); ! 2026: } ! 2027: ! 2028: // %0000_001011_mmmrrr CMP2/CHK2.W <ea>,Rn ! 2029: OP_DEF(cmp2chk2_w) ! 2030: { ! 2031: ops_cmp2chk2(Size::W); ! 2032: } ! 2033: ! 2034: // %0000_010000_mmmrrr SUBI.B #<imm>,<ea> ! 2035: OP_DEF(subi_b) ! 2036: { ! 2037: name = "subi"; ! 2038: size = Size::B; ! 2039: src = imm8(); ! 2040: dst = make_ea(); ! 2041: } ! 2042: ! 2043: // %0000_010001_mmmrrr SUBI.W #<imm>,<ea> ! 2044: OP_DEF(subi_w) ! 2045: { ! 2046: name = "subi"; ! 2047: size = Size::W; ! 2048: src = imm16(); ! 2049: dst = make_ea(); ! 2050: } ! 2051: ! 2052: // %0000_010010_mmmrrr SUBI.L #<imm>,<ea> ! 2053: OP_DEF(subi_l) ! 2054: { ! 2055: name = "subi"; ! 2056: size = Size::L; ! 2057: src = imm32(); ! 2058: dst = make_ea(); ! 2059: } ! 2060: ! 2061: // %0000_010011_mmmrrr CMP2/CHK2.L <ea>,Rn ! 2062: OP_DEF(cmp2chk2_l) ! 2063: { ! 2064: ops_cmp2chk2(Size::L); ! 2065: } ! 2066: ! 2067: // %0000_011000_mmmrrr ADDI.B #<imm>,<ea> ! 2068: OP_DEF(addi_b) ! 2069: { ! 2070: name = "addi"; ! 2071: size = Size::B; ! 2072: src = imm8(); ! 2073: dst = make_ea(); ! 2074: } ! 2075: ! 2076: // %0000_011001_mmmrrr ADDI.W #<imm>,<ea> ! 2077: OP_DEF(addi_w) ! 2078: { ! 2079: name = "addi"; ! 2080: size = Size::W; ! 2081: src = imm16(); ! 2082: dst = make_ea(); ! 2083: } ! 2084: ! 2085: // %0000_011010_mmmrrr ADDI.L #<imm>,<ea> ! 2086: OP_DEF(addi_l) ! 2087: { ! 2088: name = "addi"; ! 2089: size = Size::L; ! 2090: src = imm32(); ! 2091: dst = make_ea(); ! 2092: } ! 2093: ! 2094: // BTST,BCHG,BCLR,BSET #<imm>,<ea> の共通部分。 ! 2095: void ! 2096: Disasm::ops_btst_imm_ea() ! 2097: { ! 2098: uint n = ir[0] & 0x3f; ! 2099: uint op = (ir[0] >> 6) & 3; ! 2100: ! 2101: fetch16(); ! 2102: name = btst_names[op]; ! 2103: if (n < 8) { ! 2104: size = Size::L; ! 2105: src = string_format("#%d", ir[1] & 31); ! 2106: dst = make_dn(n); ! 2107: } else { ! 2108: size = Size::B; ! 2109: src = string_format("#%d", ir[1] & 7); ! 2110: dst = make_ea(); ! 2111: } ! 2112: } ! 2113: ! 2114: // %0000_100000_000yyy BTST.L #<imm>,Dy ! 2115: // %0000_100000_mmmrrr BTST.B #<imm>,<ea> ! 2116: OP_DEF(btst_imm_ea) ! 2117: { ! 2118: ops_btst_imm_ea(); ! 2119: } ! 2120: ! 2121: // %0000_100001_000yyy BCHG.L #<imm>,Dy ! 2122: // %0000_100001_mmmrrr BCHG.B #<imm>,<ea> ! 2123: OP_DEF(bchg_imm_ea) ! 2124: { ! 2125: ops_btst_imm_ea(); ! 2126: } ! 2127: ! 2128: // %0000_100010_000yyy BCLR.L #<imm>,Dy ! 2129: // %0000_100010_mmmrrr BCLR.B #<imm>,<ea> ! 2130: OP_DEF(bclr_imm_ea) ! 2131: { ! 2132: ops_btst_imm_ea(); ! 2133: } ! 2134: ! 2135: // %0000_100011_000yyy BSET.L #<imm>,Dy ! 2136: // %0000_100011_mmmrrr BSET.B #<imm>,<ea> ! 2137: OP_DEF(bset_imm_ea) ! 2138: { ! 2139: ops_btst_imm_ea(); ! 2140: } ! 2141: ! 2142: // %0000_101000_mmmrrr EORI.B #<imm>,<ea> ! 2143: // %0000_101000_111100 EORI.B #<imm>,CCR ! 2144: OP_DEF(eori_b) ! 2145: { ! 2146: name = "eori"; ! 2147: size = Size::B; ! 2148: src = imm8(); ! 2149: if ((ir[0] & 0x3f) == 0x3c) { ! 2150: dst = make_reg(Reg::CCR); ! 2151: } else { ! 2152: dst = make_ea(); ! 2153: } ! 2154: } ! 2155: ! 2156: // %0000_101001_mmmrrr EORI.W #<imm>,<ea> ! 2157: // %0000_101001_111100 EORI.W #<imm>,SR ! 2158: OP_DEF(eori_w) ! 2159: { ! 2160: name = "eori"; ! 2161: size = Size::W; ! 2162: src = imm16(); ! 2163: if ((ir[0] & 0x3f) == 0x3c) { ! 2164: dst = make_reg(Reg::SR); ! 2165: } else { ! 2166: dst = make_ea(); ! 2167: } ! 2168: } ! 2169: ! 2170: // %0000_101010_mmmrrr EORI.L #<imm>,<ea> ! 2171: OP_DEF(eori_l) ! 2172: { ! 2173: name = "eori"; ! 2174: size = Size::L; ! 2175: src = imm32(); ! 2176: dst = make_ea(); ! 2177: } ! 2178: ! 2179: // CAS の共通部分 ! 2180: void ! 2181: Disasm::ops_cas(Disasm::Size sz) ! 2182: { ! 2183: fetch16(); ! 2184: ! 2185: name = "cas"; ! 2186: size = sz; ! 2187: uint dc = ir[1]; ! 2188: uint du = ir[1] >> 6; ! 2189: src = make_dn(dc) + "," + make_dn(du); ! 2190: dst = make_ea(); ! 2191: } ! 2192: ! 2193: // CAS2 の共通部分 ! 2194: void ! 2195: Disasm::ops_cas2(Disasm::Size sz) ! 2196: { ! 2197: name = "cas2"; ! 2198: size = sz; ! 2199: fetch16(); ! 2200: uint dc1 = ir[1] & 7; ! 2201: uint du1 = ir[1] >> 6; ! 2202: uint rn1 = ir[1] >> 12; ! 2203: fetch16(); ! 2204: uint dc2 = ir[2] & 7; ! 2205: uint du2 = ir[2] >> 6; ! 2206: uint rn2 = ir[2] >> 12; ! 2207: src = make_dn(dc1) + ":" + make_dn(dc2) + "," ! 2208: + make_dn(du1) + ":" + make_dn(du2); ! 2209: dst = "(" + make_rn(rn1) + "):(" + make_rn(rn2) + ")"; ! 2210: } ! 2211: ! 2212: // %0000_101011_mmmrrr CAS.B Dc,Du,<ea> ! 2213: OP_DEF(cas_b) ! 2214: { ! 2215: ops_cas(Size::B); ! 2216: } ! 2217: ! 2218: // %0000_110000_mmmrrr CMPI.B #<imm>,<ea> ! 2219: OP_DEF(cmpi_b) ! 2220: { ! 2221: name = "cmpi"; ! 2222: size = Size::B; ! 2223: src = imm8(); ! 2224: dst = make_ea(); ! 2225: } ! 2226: ! 2227: // %0000_110001_mmmrrr CMPI.W #<imm>,<ea> ! 2228: OP_DEF(cmpi_w) ! 2229: { ! 2230: name = "cmpi"; ! 2231: size = Size::W; ! 2232: src = imm16(); ! 2233: dst = make_ea(); ! 2234: } ! 2235: ! 2236: // %0000_110010_mmmrrr CMPI.L #<imm>,<ea> ! 2237: OP_DEF(cmpi_l) ! 2238: { ! 2239: name = "cmpi"; ! 2240: size = Size::L; ! 2241: src = imm32(); ! 2242: dst = make_ea(); ! 2243: } ! 2244: ! 2245: // %0000_110011_mmmrrr CAS.W Dc,Du,<ea> ! 2246: // %0000_110011_111100 CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) ! 2247: OP_DEF(cas_w) ! 2248: { ! 2249: uint n = ir[0] & 0x3f; ! 2250: ! 2251: if (n == 0x3c) { ! 2252: // CAS2.W Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) ! 2253: ops_cas2(Size::W); ! 2254: } else { ! 2255: // CAS.W Dc,Du,<ea> ! 2256: ops_cas(Size::W); ! 2257: } ! 2258: } ! 2259: ! 2260: // MOVES の共通部分 ! 2261: void ! 2262: Disasm::ops_moves(Disasm::Size sz) ! 2263: { ! 2264: fetch16(); ! 2265: ! 2266: name = "moves"; ! 2267: size = sz; ! 2268: if ((ir[1] & 0x0800) == 0) { ! 2269: // MOVES <ea>,Rn ! 2270: src = make_ea(); ! 2271: dst = make_rn(ir[1] >> 12); ! 2272: } else { ! 2273: // MOVES Rn,<ea> ! 2274: src = make_rn(ir[1] >> 12); ! 2275: dst = make_ea(); ! 2276: } ! 2277: } ! 2278: ! 2279: // %0000_111000_mmmrrr MOVES.B <ea>,Rn ! 2280: OP_DEF(moves_b) ! 2281: { ! 2282: ops_moves(Size::B); ! 2283: } ! 2284: ! 2285: // %0000_111001_mmmrrr MOVES.W <ea>,Rn ! 2286: OP_DEF(moves_w) ! 2287: { ! 2288: ops_moves(Size::W); ! 2289: } ! 2290: ! 2291: // %0000_111010_mmmrrr MOVES.L <ea>,Rn ! 2292: OP_DEF(moves_l) ! 2293: { ! 2294: ops_moves(Size::L); ! 2295: } ! 2296: ! 2297: // %0000_111011_mmmrrr CAS.L Dc,Du,<ea> ! 2298: // %0000_111011_111100 CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) ! 2299: OP_DEF(cas_l) ! 2300: { ! 2301: uint n = ir[0] & 0x3f; ! 2302: ! 2303: if (n == 0x3c) { ! 2304: // CAS2.L Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) ! 2305: ops_cas2(Size::L); ! 2306: } else { ! 2307: // CAS.L Dc,Du,<ea> ! 2308: ops_cas(Size::L); ! 2309: } ! 2310: } ! 2311: ! 2312: // MOVE.{BWL} <src>,<dst> の共通部分 ! 2313: void ! 2314: Disasm::ops_move(Disasm::Size sz) ! 2315: { ! 2316: name = "move"; ! 2317: size = sz; ! 2318: src = make_ea(); ! 2319: uint dstea = ((ir[0] >> 9) & 7) | ((ir[0] >> 3) & 0x38); ! 2320: dst = make_ea(dstea); ! 2321: } ! 2322: ! 2323: // %0001_xxx000_mmmrrr MOVE.B <ea>,Dx ! 2324: OP_DEF(move_b_ea_dn) ! 2325: { ! 2326: ops_move(Size::B); ! 2327: } ! 2328: ! 2329: // %0001_xxx010_mmmrrr MOVE.B <ea>,(Ax) ! 2330: OP_DEF(move_b_ea_anin) ! 2331: { ! 2332: ops_move(Size::B); ! 2333: } ! 2334: ! 2335: // %0001_xxx011_mmmrrr MOVE.B <ea>,(Ax)+ ! 2336: OP_DEF(move_b_ea_anpi) ! 2337: { ! 2338: ops_move(Size::B); ! 2339: } ! 2340: ! 2341: // %0001_xxx100_mmmrrr MOVE.B <ea>,-(Ax) ! 2342: OP_DEF(move_b_ea_anpd) ! 2343: { ! 2344: ops_move(Size::B); ! 2345: } ! 2346: ! 2347: // %0001_xxx101_mmmrrr MOVE.B <ea>,d16(Ax) ! 2348: OP_DEF(move_b_ea_andi) ! 2349: { ! 2350: ops_move(Size::B); ! 2351: } ! 2352: ! 2353: // %0001_xxx110_mmmrrr MOVE.B <ea>,(Ax,IX) ! 2354: OP_DEF(move_b_ea_anix) ! 2355: { ! 2356: ops_move(Size::B); ! 2357: } ! 2358: ! 2359: // %0001_000111_mmmrrr MOVE.B <ea>,Abs.W ! 2360: OP_DEF(move_b_ea_absw) ! 2361: { ! 2362: ops_move(Size::B); ! 2363: } ! 2364: ! 2365: // %0001_001111_mmmrrr MOVE.B <ea>,Abs.L ! 2366: OP_DEF(move_b_ea_absl) ! 2367: { ! 2368: ops_move(Size::B); ! 2369: } ! 2370: ! 2371: // %0010_xxx000_mmmrrr MOVE.L <ea>,Dx ! 2372: OP_DEF(move_l_ea_dn) ! 2373: { ! 2374: ops_move(Size::L); ! 2375: } ! 2376: ! 2377: // %0010_xxx001_mmmrrr MOVEA.L <ea>,Ax ! 2378: OP_DEF(movea_l) ! 2379: { ! 2380: name = "movea"; ! 2381: size = Size::L; ! 2382: src = make_ea(); ! 2383: dst = make_an(ir[0] >> 9); ! 2384: } ! 2385: ! 2386: // %0010_xxx010_mmmrrr MOVE.L <ea>,(Ax) ! 2387: OP_DEF(move_l_ea_anin) ! 2388: { ! 2389: ops_move(Size::L); ! 2390: } ! 2391: ! 2392: // %0010_xxx011_mmmrrr MOVE.L <ea>,(Ax)+ ! 2393: OP_DEF(move_l_ea_anpi) ! 2394: { ! 2395: ops_move(Size::L); ! 2396: } ! 2397: ! 2398: // %0010_xxx100_mmmrrr MOVE.L <ea>,-(Ax) ! 2399: OP_DEF(move_l_ea_anpd) ! 2400: { ! 2401: ops_move(Size::L); ! 2402: } ! 2403: ! 2404: // %0010_xxx101_mmmrrr MOVE.L <ea>,d16(Ax) ! 2405: OP_DEF(move_l_ea_andi) ! 2406: { ! 2407: ops_move(Size::L); ! 2408: } ! 2409: ! 2410: // %0010_xxx110_mmmrrr MOVE.L <ea>,(Ax,IX) ! 2411: OP_DEF(move_l_ea_anix) ! 2412: { ! 2413: ops_move(Size::L); ! 2414: } ! 2415: ! 2416: // %0010_000111_mmmrrr MOVE.L <ea>,Abs.W ! 2417: OP_DEF(move_l_ea_absw) ! 2418: { ! 2419: ops_move(Size::L); ! 2420: } ! 2421: ! 2422: // %0010_001111_mmmrrr MOVE.L <ea>,Abs.L ! 2423: OP_DEF(move_l_ea_absl) ! 2424: { ! 2425: ops_move(Size::L); ! 2426: } ! 2427: ! 2428: // %0011_xxx000_mmmrrr MOVE.W <ea>,Dx ! 2429: OP_DEF(move_w_ea_dn) ! 2430: { ! 2431: ops_move(Size::W); ! 2432: } ! 2433: ! 2434: // %0011_xxx001_mmmrrr MOVEA.W <ea>,Ax ! 2435: OP_DEF(movea_w) ! 2436: { ! 2437: name = "movea"; ! 2438: size = Size::W; ! 2439: src = make_ea(); ! 2440: dst = make_an(ir[0] >> 9); ! 2441: } ! 2442: ! 2443: // %0011_xxx010_mmmrrr MOVE.W <ea>,(Ax) ! 2444: OP_DEF(move_w_ea_anin) ! 2445: { ! 2446: ops_move(Size::W); ! 2447: } ! 2448: ! 2449: // %0011_xxx011_mmmrrr MOVE.W <ea>,(Ax)+ ! 2450: OP_DEF(move_w_ea_anpi) ! 2451: { ! 2452: ops_move(Size::W); ! 2453: } ! 2454: ! 2455: // %0011_xxx100_mmmrrr MOVE.W <ea>,-(Ax) ! 2456: OP_DEF(move_w_ea_anpd) ! 2457: { ! 2458: ops_move(Size::W); ! 2459: } ! 2460: ! 2461: // %0011_xxx101_mmmrrr MOVE.W <ea>,d16(Ax) ! 2462: OP_DEF(move_w_ea_andi) ! 2463: { ! 2464: ops_move(Size::W); ! 2465: } ! 2466: ! 2467: // %0011_xxx110_mmmrrr MOVE.W <ea>,(Ax,IX) ! 2468: OP_DEF(move_w_ea_anix) ! 2469: { ! 2470: ops_move(Size::W); ! 2471: } ! 2472: ! 2473: // %0011_000111_mmmrrr MOVE.W <ea>,Abs.W ! 2474: OP_DEF(move_w_ea_absw) ! 2475: { ! 2476: ops_move(Size::W); ! 2477: } ! 2478: ! 2479: // %0011_001111_mmmrrr MOVE.W <ea>,Abs.L ! 2480: OP_DEF(move_w_ea_absl) ! 2481: { ! 2482: ops_move(Size::W); ! 2483: } ! 2484: ! 2485: // %0100_000000_mmmrrr NEGX.B <ea> ! 2486: OP_DEF(negx_b) ! 2487: { ! 2488: name = "negx"; ! 2489: size = Size::B; ! 2490: src = make_ea(); ! 2491: } ! 2492: ! 2493: // %0100_000001_mmmrrr NEGX.W <ea> ! 2494: OP_DEF(negx_w) ! 2495: { ! 2496: name = "negx"; ! 2497: size = Size::W; ! 2498: src = make_ea(); ! 2499: } ! 2500: ! 2501: // %0100_000010_mmmrrr NEGX.L <ea> ! 2502: OP_DEF(negx_l) ! 2503: { ! 2504: name = "negx"; ! 2505: size = Size::L; ! 2506: src = make_ea(); ! 2507: } ! 2508: ! 2509: // %0100_000011_mmmrrr MOVE.W SR,<ea> ! 2510: OP_DEF(move_sr_ea) ! 2511: { ! 2512: name = "move"; ! 2513: size = Size::W; ! 2514: src = make_reg(Reg::SR); ! 2515: dst = make_ea(); ! 2516: } ! 2517: ! 2518: // %0100_xxx100_mmmrrr CHK.L <ea>,Dx ! 2519: OP_DEF(chk_l) ! 2520: { ! 2521: name = "chk"; ! 2522: size = Size::L; ! 2523: src = make_ea(); ! 2524: dst = make_dn(ir[0] >> 9); ! 2525: } ! 2526: ! 2527: // %0100_xxx110_mmmrrr CHK.W <ea>,Dx ! 2528: OP_DEF(chk_w) ! 2529: { ! 2530: name = "chk"; ! 2531: size = Size::W; ! 2532: src = make_ea(); ! 2533: dst = make_dn(ir[0] >> 9); ! 2534: } ! 2535: ! 2536: // %0100_xxx111_mmmrrr LEA.L <ea>,Ax ! 2537: // %0100_100111_000yyy EXTB.L Dy ! 2538: OP_DEF(lea) ! 2539: { ! 2540: uint n = ir[0] & 0x3f; ! 2541: uint x = (ir[0] >> 9) & 7; ! 2542: if (n < 8) { ! 2543: if (x == 4) { ! 2544: // EXTB.L Dy ! 2545: name = "extb"; ! 2546: size = Size::L; ! 2547: src = make_dn(ir[0]); ! 2548: } else { ! 2549: OP_FUNC(illegal); ! 2550: } ! 2551: } else { ! 2552: // LEA.L <ea>,Ax ! 2553: name = "lea"; ! 2554: size = Size::L; ! 2555: src = make_ea(); ! 2556: dst = make_an(x); ! 2557: } ! 2558: } ! 2559: ! 2560: // %0100_001000_mmmrrr CLR.B <ea> ! 2561: OP_DEF(clr_b) ! 2562: { ! 2563: name = "clr"; ! 2564: size = Size::B; ! 2565: src = make_ea(); ! 2566: } ! 2567: ! 2568: // %0100_001001_mmmrrr CLR.W <ea> ! 2569: OP_DEF(clr_w) ! 2570: { ! 2571: name = "clr"; ! 2572: size = Size::W; ! 2573: src = make_ea(); ! 2574: } ! 2575: ! 2576: // %0100_001010_mmmrrr CLR.L <ea> ! 2577: OP_DEF(clr_l) ! 2578: { ! 2579: name = "clr"; ! 2580: size = Size::L; ! 2581: src = make_ea(); ! 2582: } ! 2583: ! 2584: // %0100_001011_mmmrrr MOVE.W CCR,<ea> ! 2585: OP_DEF(move_ccr_ea) ! 2586: { ! 2587: // MOVE to/from CCR のサイズは .W ! 2588: name = "move"; ! 2589: size = Size::W; ! 2590: src = make_reg(Reg::CCR); ! 2591: dst = make_ea(); ! 2592: } ! 2593: ! 2594: // %0100_010000_mmmrrr NEG.B <ea> ! 2595: OP_DEF(neg_b) ! 2596: { ! 2597: name = "neg"; ! 2598: size = Size::B; ! 2599: src = make_ea(); ! 2600: } ! 2601: ! 2602: // %0100_010001_mmmrrr NEG.W <ea> ! 2603: OP_DEF(neg_w) ! 2604: { ! 2605: name = "neg"; ! 2606: size = Size::W; ! 2607: src = make_ea(); ! 2608: } ! 2609: ! 2610: // %0100_010010_mmmrrr NEG.L <ea> ! 2611: OP_DEF(neg_l) ! 2612: { ! 2613: name = "neg"; ! 2614: size = Size::L; ! 2615: src = make_ea(); ! 2616: } ! 2617: ! 2618: // %0100_010011_mmmrrr MOVE.W <ea>,CCR ! 2619: OP_DEF(move_ea_ccr) ! 2620: { ! 2621: // MOVE to/from CCR のサイズは .W ! 2622: name = "move"; ! 2623: size = Size::W; ! 2624: src = make_ea(); ! 2625: dst = make_reg(Reg::CCR); ! 2626: } ! 2627: ! 2628: // %0100_011000_mmmrrr NOT.B <ea> ! 2629: OP_DEF(not_b) ! 2630: { ! 2631: name = "not"; ! 2632: size = Size::B; ! 2633: src = make_ea(); ! 2634: } ! 2635: ! 2636: // %0100_011001_mmmrrr NOT.W <ea> ! 2637: OP_DEF(not_w) ! 2638: { ! 2639: name = "not"; ! 2640: size = Size::W; ! 2641: src = make_ea(); ! 2642: } ! 2643: ! 2644: // %0100_011010_mmmrrr NOT.L <ea> ! 2645: OP_DEF(not_l) ! 2646: { ! 2647: name = "not"; ! 2648: size = Size::L; ! 2649: src = make_ea(); ! 2650: } ! 2651: ! 2652: // %0100_011011_mmmrrr MOVE.W <ea>,SR ! 2653: OP_DEF(move_ea_sr) ! 2654: { ! 2655: name = "move"; ! 2656: size = Size::W; ! 2657: src = make_ea(); ! 2658: dst = make_reg(Reg::SR); ! 2659: } ! 2660: ! 2661: // %0100_100000_mmmrrr NBCD.B <ea> ! 2662: // %0100_100000_001yyy LINK.L Ay,#<imm> ! 2663: OP_DEF(nbcd) ! 2664: { ! 2665: uint mm = (ir[0] >> 3) & 7; ! 2666: ! 2667: if (mm == 1) { ! 2668: // LINK.L Ay,#<imm> ! 2669: name = "link"; ! 2670: size = Size::L; ! 2671: src = make_an(ir[0]); ! 2672: dst = "#" + disp32(); ! 2673: } else { ! 2674: // NBCD.B <ea> ! 2675: name = "nbcd"; ! 2676: size = Size::B; ! 2677: src = make_ea(); ! 2678: } ! 2679: } ! 2680: ! 2681: // %0100_100001_000yyy SWAP.W Dy ! 2682: // %0100_100001_001nnn BKPT #<imm> ! 2683: // %0100_100001_mmmrrr PEA.L <ea> ! 2684: OP_DEF(pea) ! 2685: { ! 2686: uint n = ir[0] & 0x3f; ! 2687: ! 2688: if (n < 8) { ! 2689: // SWAP.W Dy ! 2690: name = "swap"; ! 2691: size = Size::W; ! 2692: src = make_dn(n); ! 2693: } else if (n < 16) { ! 2694: // BKPT #<imm> ! 2695: name = "bkpt"; ! 2696: src = string_format("#%d", ir[0] & 7); ! 2697: } else { ! 2698: // PEA.L <ea> ! 2699: name = "pea"; ! 2700: size = Size::L; ! 2701: src = make_ea(); ! 2702: } ! 2703: } ! 2704: ! 2705: // MOVEM/EXT の共通部分 ! 2706: void ! 2707: Disasm::ops_movem_ext(Disasm::Size sz) ! 2708: { ! 2709: uint n = ir[0] & 0x3f; ! 2710: ! 2711: size = sz; ! 2712: if (n < 8) { ! 2713: // EXT.W Dy ! 2714: name = "ext"; ! 2715: src = make_dn(ir[0]); ! 2716: } else { ! 2717: // MOVEM.W <list>,<ea> ! 2718: fetch16(); ! 2719: name = "movem"; ! 2720: src = make_reglist(); ! 2721: dst = make_ea(); ! 2722: } ! 2723: } ! 2724: ! 2725: // %0100_100010_000yyy EXT.W Dy ! 2726: // %0100_100010_mmmrrr MOVEM.W <list>,<ea> ! 2727: OP_DEF(movem_w_mem) ! 2728: { ! 2729: ops_movem_ext(Size::W); ! 2730: } ! 2731: ! 2732: // %0100_100011_000yyy EXT.L Dy ! 2733: // %0100_100011_mmmrrr MOVEM.L <list>,<ea> ! 2734: OP_DEF(movem_l_mem) ! 2735: { ! 2736: ops_movem_ext(Size::L); ! 2737: } ! 2738: ! 2739: // %0100_101000_mmmrrr TST.B <ea> ! 2740: OP_DEF(tst_b) ! 2741: { ! 2742: name = "tst"; ! 2743: size = Size::B; ! 2744: src = make_ea(); ! 2745: } ! 2746: ! 2747: // %0100_101001_mmmrrr TST.W <ea> ! 2748: OP_DEF(tst_w) ! 2749: { ! 2750: name = "tst"; ! 2751: size = Size::W; ! 2752: src = make_ea(); ! 2753: } ! 2754: ! 2755: // %0100_101010_mmmrrr TST.L <ea> ! 2756: OP_DEF(tst_l) ! 2757: { ! 2758: name = "tst"; ! 2759: size = Size::L; ! 2760: src = make_ea(); ! 2761: } ! 2762: ! 2763: // %0100_101011_mmmrrr TAS.B <ea> ! 2764: // %0100_101011_111100 ILLEGAL ! 2765: OP_DEF(tas) ! 2766: { ! 2767: uint n = ir[0] & 0x3f; ! 2768: if (n == 0x3c) { ! 2769: // ILLEGAL ! 2770: name = "illegal"; ! 2771: } else { ! 2772: // TAS.B <ea> ! 2773: name = "tas"; ! 2774: size = Size::B; ! 2775: src = make_ea(); ! 2776: } ! 2777: } ! 2778: ! 2779: // %0100_110000_mmmrrr MUL{U,S}.L <ea>,Dl ! 2780: OP_DEF(mul) ! 2781: { ! 2782: fetch16(); ! 2783: ! 2784: if ((ir[1] & 0x0800) == 0) { ! 2785: name = "mulu"; ! 2786: } else { ! 2787: name = "muls"; ! 2788: } ! 2789: size = Size::L; ! 2790: src = make_ea(); ! 2791: if ((ir[1] & 0x0400) == 0) { ! 2792: dst = make_dn(ir[1] >> 12); ! 2793: } else { ! 2794: dst = make_dn(ir[1]) + ":" + make_dn(ir[1] >> 12); ! 2795: } ! 2796: } ! 2797: ! 2798: // %0100_110001_mmmrrr DIV{U,UL,S,SL}.L <ea>,Dq ! 2799: OP_DEF(div) ! 2800: { ! 2801: fetch16(); ! 2802: ! 2803: if ((ir[1] & 0x0800) == 0) { ! 2804: name = "divu"; ! 2805: } else { ! 2806: name = "divs"; ! 2807: } ! 2808: size = Size::L; ! 2809: src = make_ea(); ! 2810: uint dr = ir[1] & 7; ! 2811: uint dq = (ir[1] >> 12) & 7; ! 2812: if ((ir[1] & 0x0400) == 0) { ! 2813: if (dr == dq) { ! 2814: dst = make_dn(dr); ! 2815: } else { ! 2816: dst = make_dn(dr) + ":" + make_dn(dq); ! 2817: } ! 2818: } else { ! 2819: name += "l"; ! 2820: dst = make_dn(dr) + ":" + make_dn(dq); ! 2821: } ! 2822: } ! 2823: ! 2824: // %0100_110010_mmmrrr MOVEM.W <ea>,<list> ! 2825: OP_DEF(movem_w) ! 2826: { ! 2827: fetch16(); ! 2828: name = "movem"; ! 2829: size = Size::W; ! 2830: src = make_ea(); ! 2831: dst = make_reglist(); ! 2832: } ! 2833: ! 2834: // %0100_110011_mmmrrr MOVEM.L <ea>,<list> ! 2835: OP_DEF(movem_l) ! 2836: { ! 2837: fetch16(); ! 2838: name = "movem"; ! 2839: size = Size::L; ! 2840: src = make_ea(); ! 2841: dst = make_reglist(); ! 2842: } ! 2843: ! 2844: // %0100_111001_00nnnn TRAP #<vector> ! 2845: // %0100_111001_010yyy LINK.W Ay,#<imm> ! 2846: // %0100_111001_011yyy UNLK Ay ! 2847: // %0100_111001_100yyy MOVE.L Ay,USP ! 2848: // %0100_111001_101yyy MOVE.L USP,Ay ! 2849: // %0100_111001_110000 RESET ! 2850: // %0100_111001_110001 NOP ! 2851: // %0100_111001_110010 STOP #<imm> ! 2852: // %0100_111001_110011 RTE ! 2853: // %0100_111001_110100 RTD #<imm> ! 2854: // %0100_111001_110101 RTS ! 2855: // %0100_111001_110110 TRAPV ! 2856: // %0100_111001_110111 RTR ! 2857: // %0100_111001_111010 MOVEC.L Rc,Rn ! 2858: // %0100_111001_111011 MOVEC.L Rn,Rc ! 2859: OP_DEF(trap) ! 2860: { ! 2861: uint n = ir[0] & 0x3f; ! 2862: switch (n) { ! 2863: case 0x00 ... 0x0f: // TRAP #<vector> ! 2864: name = "trap"; ! 2865: src = string_format("#%d", n); ! 2866: break; ! 2867: case 0x10 ... 0x17: // LINK.W Ay,#<imm> ! 2868: name = "link"; ! 2869: size = Size::W; ! 2870: src = make_an(ir[0]); ! 2871: dst = "#" + disp16(); ! 2872: break; ! 2873: case 0x18 ... 0x1f: // UNLK Ay ! 2874: name = "unlk"; ! 2875: src = make_an(ir[0]); ! 2876: break; ! 2877: case 0x20 ... 0x27: // MOVE.L Ay,USP ! 2878: name = "move"; ! 2879: size = Size::L; ! 2880: src = make_an(ir[0]); ! 2881: dst = make_reg(Reg::USP); ! 2882: break; ! 2883: case 0x28 ... 0x2f: // MOVE.L USP,Ay ! 2884: name = "move"; ! 2885: size = Size::L; ! 2886: src = make_reg(Reg::USP); ! 2887: dst = make_an(ir[0]); ! 2888: break; ! 2889: case 0x30: // RESET ! 2890: name = "reset"; ! 2891: break; ! 2892: case 0x31: // NOP ! 2893: name = "nop"; ! 2894: break; ! 2895: case 0x32: // STOP #<imm> ! 2896: name = "stop"; ! 2897: src = imm16(); ! 2898: break; ! 2899: case 0x33: // RTE ! 2900: name = "rte"; ! 2901: break; ! 2902: case 0x34: // RTD #<imm> ! 2903: name = "rtd"; ! 2904: src = imm16(); ! 2905: break; ! 2906: case 0x35: // RTS ! 2907: name = "rts"; ! 2908: break; ! 2909: case 0x36: // TRAPV ! 2910: name = "trapv"; ! 2911: break; ! 2912: case 0x37: // RTR ! 2913: name = "rtr"; ! 2914: break; ! 2915: case 0x3a: // MOVEC.L Rc,Rn ! 2916: fetch16(); ! 2917: name = "movec"; ! 2918: size = Size::L; ! 2919: src = make_movec(); ! 2920: dst = make_rn(ir[1] >> 12); ! 2921: break; ! 2922: case 0x3b: // MOVEC.L Rn,Rc ! 2923: fetch16(); ! 2924: name = "movec"; ! 2925: size = Size::L; ! 2926: src = make_rn(ir[1] >> 12); ! 2927: dst = make_movec(); ! 2928: break; ! 2929: default: ! 2930: OP_FUNC(illegal); ! 2931: break; ! 2932: } ! 2933: } ! 2934: ! 2935: // %0100_111010_mmmrrr JSR <ea> ! 2936: OP_DEF(jsr) ! 2937: { ! 2938: name = "jsr"; ! 2939: src = make_ea(); ! 2940: } ! 2941: ! 2942: // %0100_111011_mmmrrr JMP <ea> ! 2943: OP_DEF(jmp) ! 2944: { ! 2945: name = "jmp"; ! 2946: src = make_ea(); ! 2947: } ! 2948: ! 2949: // %0101_qqq000_mmmrrr ADDQ.B #qqq,<ea> ! 2950: OP_DEF(addq_b) ! 2951: { ! 2952: name = "addq"; ! 2953: size = Size::B; ! 2954: src = make_q8(); ! 2955: dst = make_ea(); ! 2956: } ! 2957: ! 2958: // %0101_qqq001_mmmrrr ADDQ.W #qqq,<ea> ! 2959: // %0101_qqq001_001yyy ADDQ.W #qqq,Ay (.Lと等価) ! 2960: OP_DEF(addq_w) ! 2961: { ! 2962: // ニーモニック上は ADDQ.W #q,Ay を分ける必要はない ! 2963: name = "addq"; ! 2964: size = Size::W; ! 2965: src = make_q8(); ! 2966: dst = make_ea(); ! 2967: } ! 2968: ! 2969: // %0101_qqq010_mmmrrr ADDQ.L #qqq,<ea> ! 2970: // %0101_qqq010_001yyy ADDQ.L #qqq,Ay ! 2971: OP_DEF(addq_l) ! 2972: { ! 2973: // ニーモニック上は ADDQ.L #q,Ay を分ける必要はない ! 2974: name = "addq"; ! 2975: size = Size::L; ! 2976: src = make_q8(); ! 2977: dst = make_ea(); ! 2978: } ! 2979: ! 2980: // Scc/SF のメイン部分。 ! 2981: void ! 2982: Disasm::ops_scc() ! 2983: { ! 2984: uint n = ir[0] & 0x3f; ! 2985: uint cc = (ir[0] >> 8) & 15; ! 2986: switch (n) { ! 2987: case 0x00 ... 0x07: // Scc.B Dn ! 2988: case 0x10 ... 0x39: // Scc.B <ea> ! 2989: name = "s"; ! 2990: name += conditions[cc]; ! 2991: size = Size::B; ! 2992: src = make_ea(); ! 2993: break; ! 2994: case 0x08 ... 0x0f: // DBcc.W Dy,<label> ! 2995: if (cc == 1) { ! 2996: name = "dbra"; ! 2997: } else { ! 2998: name = "db"; ! 2999: name += conditions[cc]; ! 3000: } ! 3001: size = Size::W; ! 3002: src = make_dn(ir[0]); ! 3003: dst = addr32(pc0 + 2 + (int32)(int16)fetch16()); ! 3004: break; ! 3005: case 0x3a: // TRAPcc.W #<imm> ! 3006: name = "trap"; ! 3007: name += conditions[cc]; ! 3008: size = Size::W; ! 3009: src = imm16(); ! 3010: break; ! 3011: case 0x3b: // TRAPcc.L #<imm> ! 3012: name = "trap"; ! 3013: name += conditions[cc]; ! 3014: size = Size::L; ! 3015: src = imm32(); ! 3016: break; ! 3017: case 0x3c: // TRAPcc ! 3018: name = "trap"; ! 3019: name += conditions[cc]; ! 3020: break; ! 3021: ! 3022: default: ! 3023: OP_FUNC(illegal); ! 3024: break; ! 3025: } ! 3026: } ! 3027: ! 3028: // %0101_000011_mmmrrr ST.B <ea> ! 3029: // %0101_000011_001yyy DBT.W Dy,<label> ! 3030: // %0101_000011_111010 TRAPT.W #<imm> ! 3031: // %0101_000011_111011 TRAPT.L #<imm> ! 3032: // %0101_000011_111100 TRAPT ! 3033: OP_DEF(st) ! 3034: { ! 3035: ops_scc(); ! 3036: } ! 3037: ! 3038: // %0101_qqq100_mmmrrr SUBQ.B #qqq,<ea> ! 3039: OP_DEF(subq_b) ! 3040: { ! 3041: name = "subq"; ! 3042: size = Size::B; ! 3043: src = make_q8(); ! 3044: dst = make_ea(); ! 3045: } ! 3046: ! 3047: // %0101_qqq101_mmmrrr SUBQ.W #qqq,<ea> ! 3048: // %0101_qqq101_001yyy SUBQ.W #qqq,Ay (.Lと等価) ! 3049: OP_DEF(subq_w) ! 3050: { ! 3051: // ニーモニック上は SUBQ.W #q,Ay を分ける必要はない ! 3052: name = "subq"; ! 3053: size = Size::W; ! 3054: src = make_q8(); ! 3055: dst = make_ea(); ! 3056: } ! 3057: ! 3058: // %0101_qqq110_mmmrrr SUBQ.L #qqq,<ea> ! 3059: // %0101_qqq110_001yyy SUBQ.L #qqq,Ay ! 3060: OP_DEF(subq_l) ! 3061: { ! 3062: // ニーモニック上は SUBQ.L #q,Ay を分ける必要はない ! 3063: name = "subq"; ! 3064: size = Size::L; ! 3065: src = make_q8(); ! 3066: dst = make_ea(); ! 3067: } ! 3068: ! 3069: // %0101_000111_mmmrrr SF.B <ea> ! 3070: // %0101_000111_001yyy DBRA.W Dy,<label> ! 3071: // %0101_000111_111010 TRAPF.W #<imm> ! 3072: // %0101_000111_111011 TRAPF.L #<imm> ! 3073: // %0101_000111_111100 TRAPF ! 3074: OP_DEF(sf) ! 3075: { ! 3076: ops_scc(); ! 3077: } ! 3078: ! 3079: // %0101_001011_mmmrrr SHI.B <ea> ! 3080: // %0101_001011_001yyy DBHI.W Dy,<label> ! 3081: // %0101_001011_111010 TRAPHI.W #<imm> ! 3082: // %0101_001011_111011 TRAPHI.L #<imm> ! 3083: // %0101_001011_111100 TRAPHI ! 3084: OP_DEF(shi) ! 3085: { ! 3086: ops_scc(); ! 3087: } ! 3088: ! 3089: // %0101_001111_mmmrrr SLS.B <ea> ! 3090: // %0101_001111_001yyy DBLS.W Dy,<label> ! 3091: // %0101_001111_111010 TRAPLS.W #<imm> ! 3092: // %0101_001111_111011 TRAPLS.L #<imm> ! 3093: // %0101_001111_111100 TRAPLS ! 3094: OP_DEF(sls) ! 3095: { ! 3096: ops_scc(); ! 3097: } ! 3098: ! 3099: // %0101_010011_mmmrrr SCC.B <ea> ! 3100: // %0101_010011_001yyy DBCC.W Dy,<label> ! 3101: // %0101_010011_111010 TRAPCC.W #<imm> ! 3102: // %0101_010011_111011 TRAPCC.L #<imm> ! 3103: // %0101_010011_111100 TRAPCC ! 3104: OP_DEF(scc) ! 3105: { ! 3106: ops_scc(); ! 3107: } ! 3108: ! 3109: // %0101_010111_mmmrrr SCS.B <ea> ! 3110: // %0101_010111_001yyy DBCS.W Dy,<label> ! 3111: // %0101_010111_111010 TRAPCS.W #<imm> ! 3112: // %0101_010111_111011 TRAPCS.L #<imm> ! 3113: // %0101_010111_111100 TRAPCS ! 3114: OP_DEF(scs) ! 3115: { ! 3116: ops_scc(); ! 3117: } ! 3118: ! 3119: // %0101_011011_mmmrrr SNE.B <ea> ! 3120: // %0101_011011_001yyy DBNE.W Dy,<label> ! 3121: // %0101_011011_111010 TRAPNE.W #<imm> ! 3122: // %0101_011011_111011 TRAPNE.L #<imm> ! 3123: // %0101_011011_111100 TRAPNE ! 3124: OP_DEF(sne) ! 3125: { ! 3126: ops_scc(); ! 3127: } ! 3128: ! 3129: // %0101_011111_mmmrrr SEQ.B <ea> ! 3130: // %0101_011111_001yyy DBEQ.W Dy,<label> ! 3131: // %0101_011111_111010 TRAPEQ.W #<imm> ! 3132: // %0101_011111_111011 TRAPEQ.L #<imm> ! 3133: // %0101_011111_111100 TRAPEQ ! 3134: OP_DEF(seq) ! 3135: { ! 3136: ops_scc(); ! 3137: } ! 3138: ! 3139: // %0101_100011_mmmrrr SVC.B <ea> ! 3140: // %0101_100011_001yyy DBVC.W Dy,<label> ! 3141: // %0101_100011_111010 TRAPVC.W #<imm> ! 3142: // %0101_100011_111011 TRAPVC.L #<imm> ! 3143: // %0101_100011_111100 TRAPVC ! 3144: OP_DEF(svc) ! 3145: { ! 3146: ops_scc(); ! 3147: } ! 3148: ! 3149: // %0101_100111_mmmrrr SVS.B <ea> ! 3150: // %0101_100111_001yyy DBVS.W Dy,<label> ! 3151: // %0101_100111_111010 TRAPVS.W #<imm> ! 3152: // %0101_100111_111011 TRAPVS.L #<imm> ! 3153: // %0101_100111_111100 TRAPVS ! 3154: OP_DEF(svs) ! 3155: { ! 3156: ops_scc(); ! 3157: } ! 3158: ! 3159: // %0101_101011_mmmrrr SPL.B <ea> ! 3160: // %0101_101011_001yyy DBPL.W Dy,<label> ! 3161: // %0101_101011_111010 TRAPPL.W #<imm> ! 3162: // %0101_101011_111011 TRAPPL.L #<imm> ! 3163: // %0101_101011_111100 TRAPPL ! 3164: OP_DEF(spl) ! 3165: { ! 3166: ops_scc(); ! 3167: } ! 3168: ! 3169: // %0101_101111_mmmrrr SMI.B <ea> ! 3170: // %0101_101111_001yyy DBMI.W Dy,<label> ! 3171: // %0101_101111_111010 TRAPMI.W #<imm> ! 3172: // %0101_101111_111011 TRAPMI.L #<imm> ! 3173: // %0101_101111_111100 TRAPMI ! 3174: OP_DEF(smi) ! 3175: { ! 3176: ops_scc(); ! 3177: } ! 3178: ! 3179: // %0101_110011_mmmrrr SGE.B <ea> ! 3180: // %0101_110011_001yyy DBGE.W Dy,<label> ! 3181: // %0101_110011_111010 TRAPGE.W #<imm> ! 3182: // %0101_110011_111011 TRAPGE.L #<imm> ! 3183: // %0101_110011_111100 TRAPGE ! 3184: OP_DEF(sge) ! 3185: { ! 3186: ops_scc(); ! 3187: } ! 3188: ! 3189: // %0101_110111_mmmrrr SLT.B <ea> ! 3190: // %0101_110111_001yyy DBLT.W Dy,<label> ! 3191: // %0101_110111_111010 TRAPLT.W #<imm> ! 3192: // %0101_110111_111011 TRAPLT.L #<imm> ! 3193: // %0101_110111_111100 TRAPLT ! 3194: OP_DEF(slt) ! 3195: { ! 3196: ops_scc(); ! 3197: } ! 3198: ! 3199: // %0101_111011_mmmrrr SGT.B <ea> ! 3200: // %0101_111011_001yyy DBGT.W Dy,<label> ! 3201: // %0101_111011_111010 TRAPGT.W #<imm> ! 3202: // %0101_111011_111011 TRAPGT.L #<imm> ! 3203: // %0101_111011_111100 TRAPGT ! 3204: OP_DEF(sgt) ! 3205: { ! 3206: ops_scc(); ! 3207: } ! 3208: ! 3209: // %0101_111111_mmmrrr SLE.B <ea> ! 3210: // %0101_111111_001yyy DBLE.W Dy,<label> ! 3211: // %0101_111111_111010 TRAPLE.W #<imm> ! 3212: // %0101_111111_111011 TRAPLE.L #<imm> ! 3213: // %0101_111111_111100 TRAPLE ! 3214: OP_DEF(sle) ! 3215: { ! 3216: ops_scc(); ! 3217: } ! 3218: ! 3219: ! 3220: // BRA/BSR/Bcc の共通部分。 ! 3221: void ! 3222: Disasm::ops_bcc() ! 3223: { ! 3224: uint cond = (ir[0] >> 8) & 0x0f; ! 3225: uint32 disp = ir[0] & 0xff; ! 3226: ! 3227: switch (cond) { ! 3228: case 0: name = "bra"; break; ! 3229: case 1: name = "bsr"; break; ! 3230: default: ! 3231: name = "b"; ! 3232: name += conditions[cond]; ! 3233: break; ! 3234: } ! 3235: ! 3236: if (disp == 0) { ! 3237: // Bxx.W <label> ! 3238: size = Size::W; ! 3239: disp = (int32)(int16)fetch16(); ! 3240: } else if (disp == 0xff) { ! 3241: // Bxx.L <label> ! 3242: size = Size::L; ! 3243: disp = (int32)fetch32(); ! 3244: } else { ! 3245: // Bxx.B <label> ! 3246: size = Size::B; ! 3247: disp = (int32)(int8)disp; ! 3248: } ! 3249: src = addr32(pc0 + 2 + disp); ! 3250: } ! 3251: ! 3252: // %0110_000000_000000 BRA.W <label> ! 3253: // %0110_0000nn_nnnnnn BRA.B <label> ! 3254: // %0110_000011_111111 BRA.L <label> ! 3255: OP_DEF(bra) ! 3256: { ! 3257: ops_bcc(); ! 3258: } ! 3259: ! 3260: // %0110_000100_000000 BSR.W <label> ! 3261: // %0110_0001nn_nnnnnn BSR.B <label> ! 3262: // %0110_000111_111111 BSR.L <label> ! 3263: OP_DEF(bsr) ! 3264: { ! 3265: ops_bcc(); ! 3266: } ! 3267: ! 3268: // %0110_001000_000000 BHI.W <label> ! 3269: // %0110_0010nn_nnnnnn BHI.B <label> ! 3270: // %0110_001011_111111 BHI.L <label> ! 3271: OP_DEF(bhi) ! 3272: { ! 3273: ops_bcc(); ! 3274: } ! 3275: ! 3276: // %0110_001100_000000 BLS.W <label> ! 3277: // %0110_0011nn_nnnnnn BLS.B <label> ! 3278: // %0110_001111_111111 BLS.L <label> ! 3279: OP_DEF(bls) ! 3280: { ! 3281: ops_bcc(); ! 3282: } ! 3283: ! 3284: // %0110_010000_000000 BCC.W <label> ! 3285: // %0110_0100nn_nnnnnn BCC.B <label> ! 3286: // %0110_010011_111111 BCC.L <label> ! 3287: OP_DEF(bcc) ! 3288: { ! 3289: ops_bcc(); ! 3290: } ! 3291: ! 3292: // %0110_010100_000000 BCS.W <label> ! 3293: // %0110_0101nn_nnnnnn BCS.B <label> ! 3294: // %0110_010111_111111 BCS.L <label> ! 3295: OP_DEF(bcs) ! 3296: { ! 3297: ops_bcc(); ! 3298: } ! 3299: ! 3300: // %0110_011000_000000 BNE.W <label> ! 3301: // %0110_0110nn_nnnnnn BNE.B <label> ! 3302: // %0110_011011_111111 BNE.L <label> ! 3303: OP_DEF(bne) ! 3304: { ! 3305: ops_bcc(); ! 3306: } ! 3307: ! 3308: // %0110_011100_000000 BEQ.W <label> ! 3309: // %0110_0111nn_nnnnnn BEQ.B <label> ! 3310: // %0110_011111_111111 BEQ.L <label> ! 3311: OP_DEF(beq) ! 3312: { ! 3313: ops_bcc(); ! 3314: } ! 3315: ! 3316: // %0110_100000_000000 BVC.W <label> ! 3317: // %0110_1000nn_nnnnnn BVC.B <label> ! 3318: // %0110_100011_111111 BVC.L <label> ! 3319: OP_DEF(bvc) ! 3320: { ! 3321: ops_bcc(); ! 3322: } ! 3323: ! 3324: // %0110_100100_000000 BVS.W <label> ! 3325: // %0110_1001nn_nnnnnn BVS.B <label> ! 3326: // %0110_100111_111111 BVS.L <label> ! 3327: OP_DEF(bvs) ! 3328: { ! 3329: ops_bcc(); ! 3330: } ! 3331: ! 3332: // %0110_101000_000000 BPL.W <label> ! 3333: // %0110_1010nn_nnnnnn BPL.B <label> ! 3334: // %0110_101011_111111 BPL.L <label> ! 3335: OP_DEF(bpl) ! 3336: { ! 3337: ops_bcc(); ! 3338: } ! 3339: ! 3340: // %0110_101100_000000 BMI.W <label> ! 3341: // %0110_1011nn_nnnnnn BMI.B <label> ! 3342: // %0110_101111_111111 BMI.L <label> ! 3343: OP_DEF(bmi) ! 3344: { ! 3345: ops_bcc(); ! 3346: } ! 3347: ! 3348: // %0110_110000_000000 BGE.W <label> ! 3349: // %0110_1100nn_nnnnnn BGE.B <label> ! 3350: // %0110_110011_111111 BGE.L <label> ! 3351: OP_DEF(bge) ! 3352: { ! 3353: ops_bcc(); ! 3354: } ! 3355: ! 3356: // %0110_110100_000000 BLT.W <label> ! 3357: // %0110_1101nn_nnnnnn BLT.B <label> ! 3358: // %0110_110111_111111 BLT.L <label> ! 3359: OP_DEF(blt) ! 3360: { ! 3361: ops_bcc(); ! 3362: } ! 3363: ! 3364: // %0110_111000_000000 BGT.W <label> ! 3365: // %0110_1110nn_nnnnnn BGT.B <label> ! 3366: // %0110_111011_111111 BGT.L <label> ! 3367: OP_DEF(bgt) ! 3368: { ! 3369: ops_bcc(); ! 3370: } ! 3371: ! 3372: // %0110_111100_000000 BLE.W <label> ! 3373: // %0110_1111nn_nnnnnn BLE.B <label> ! 3374: // %0110_111111_111111 BLE.L <label> ! 3375: OP_DEF(ble) ! 3376: { ! 3377: ops_bcc(); ! 3378: } ! 3379: ! 3380: // %0111_xxx0nn_nnnnnn MOVEQ.L #<imm>,Dx ! 3381: OP_DEF(moveq) ! 3382: { ! 3383: uint8 val = ir[0] & 0xff; ! 3384: ! 3385: // IOCS コールを表示する。XXX 機種判定はまだしてない ! 3386: // IOCS コールは大抵 ! 3387: // 70NN moveq.l #nn,d0 ! 3388: // 4e4f trap #15 ! 3389: // という命令列になっているので、これを検出する。 ! 3390: uint16 next = peek16(); ! 3391: if (next == 0x4e4f) { ! 3392: // IOCS コールと確定したら TRAP のワードも取り出しておく ! 3393: fetch16(); ! 3394: name = "IOCS"; ! 3395: src = x68k_iocscall[(uint)val] ?: "<undefined>"; ! 3396: return; ! 3397: } ! 3398: ! 3399: name = "moveq"; ! 3400: size = Size::L; ! 3401: // 負数なら 32bit で書いてみるか ! 3402: if ((val & 0x80)) { ! 3403: src = "#" + hex32((int32)(int8)val); ! 3404: } else { ! 3405: src = "#" + hex8(val); ! 3406: } ! 3407: dst = make_dn(ir[0] >> 9); ! 3408: } ! 3409: ! 3410: // %1000_xxx000_mmmrrr OR.B <ea>,Dx ! 3411: OP_DEF(or_b_ea_dn) ! 3412: { ! 3413: name = "or"; ! 3414: size = Size::B; ! 3415: src = make_ea(); ! 3416: dst = make_dn(ir[0] >> 9); ! 3417: } ! 3418: ! 3419: // %1000_xxx001_mmmrrr OR.W <ea>,Dx ! 3420: OP_DEF(or_w_ea_dn) ! 3421: { ! 3422: name = "or"; ! 3423: size = Size::W; ! 3424: src = make_ea(); ! 3425: dst = make_dn(ir[0] >> 9); ! 3426: } ! 3427: ! 3428: // %1000_xxx010_mmmrrr OR.L <ea>,Dx ! 3429: OP_DEF(or_l_ea_dn) ! 3430: { ! 3431: name = "or"; ! 3432: size = Size::L; ! 3433: src = make_ea(); ! 3434: dst = make_dn(ir[0] >> 9); ! 3435: } ! 3436: ! 3437: // %1000_xxx011_mmmrrr DIVU.W <ea>,Dx ! 3438: OP_DEF(divu_w) ! 3439: { ! 3440: name = "divu"; ! 3441: size = Size::W; ! 3442: src = make_ea(); ! 3443: dst = make_dn(ir[0] >> 9); ! 3444: } ! 3445: ! 3446: // %1000_xxx100_000yyy SBCD.B Dy,Dx ! 3447: // %1000_xxx100_001yyy SBCD.B -(Ay),-(Ax) ! 3448: // %1000_xxx100_mmmrrr OR.B Dx,<ea> ! 3449: OP_DEF(or_b_dn_ea) ! 3450: { ! 3451: uint n = ir[0] & 0x3f; ! 3452: uint x = ir[0] >> 9; ! 3453: ! 3454: if (n < 8) { ! 3455: // SBCD.B Dy,Dx ! 3456: name = "sbcd"; ! 3457: size = Size::B; ! 3458: src = make_dn(n); ! 3459: dst = make_dn(x); ! 3460: } else if (n < 16) { ! 3461: // SBCD.B -(Ay),-(An) ! 3462: name = "sbcd"; ! 3463: size = Size::B; ! 3464: src = make_anpd(n); ! 3465: dst = make_anpd(x); ! 3466: } else { ! 3467: // OR.B Dx,<ea> ! 3468: name = "or"; ! 3469: size = Size::B; ! 3470: src = make_dn(x); ! 3471: dst = make_ea(); ! 3472: } ! 3473: } ! 3474: ! 3475: // %1000_xxx101_000yyy PACK Dy,Dx,#<imm> ! 3476: // %1000_xxx101_001yyy PACK -(Ay),-(Ax),#<imm> ! 3477: // %1000_xxx101_mmmrrr OR.W Dx,<ea> ! 3478: OP_DEF(or_w_dn_ea) ! 3479: { ! 3480: uint n = ir[0] & 0x3f; ! 3481: uint x = ir[0] >> 9; ! 3482: ! 3483: if (n < 8) { ! 3484: name = "pack"; ! 3485: src = make_dn(n) + "," + make_dn(x); ! 3486: dst = imm16(); ! 3487: } else if (n < 16) { ! 3488: name = "pack"; ! 3489: src = make_anpd(n) + "," + make_anpd(x); ! 3490: dst = imm16(); ! 3491: } else { ! 3492: // OR.W Dx,<ea> ! 3493: name = "or"; ! 3494: size = Size::W; ! 3495: src = make_dn(x); ! 3496: dst = make_ea(); ! 3497: } ! 3498: } ! 3499: ! 3500: // %1000_xxx110_000yyy UNPK Dy,Dx,#<imm> ! 3501: // %1000_xxx110_001yyy UNPK -(Ay),-(Ax),#<imm> ! 3502: // %1000_xxx110_mmmrrr OR.L Dx,<ea> ! 3503: OP_DEF(or_l_dn_ea) ! 3504: { ! 3505: uint n = ir[0] & 0x3f; ! 3506: uint x = ir[0] >> 9; ! 3507: ! 3508: if (n < 8) { ! 3509: name = "unpk"; ! 3510: src = make_dn(n) + "," + make_dn(x); ! 3511: dst = imm16(); ! 3512: } else if (n < 16) { ! 3513: name = "unpk"; ! 3514: src = make_anpd(n) + "," + make_anpd(x); ! 3515: dst = imm16(); ! 3516: } else { ! 3517: // OR.L Dx,<ea> ! 3518: name = "or"; ! 3519: size = Size::L; ! 3520: src = make_dn(x); ! 3521: dst = make_ea(); ! 3522: } ! 3523: } ! 3524: ! 3525: // %1000_xxx111_mmmrrr DIVS.W <ea>,Dx ! 3526: OP_DEF(divs_w) ! 3527: { ! 3528: name = "divs"; ! 3529: size = Size::W; ! 3530: src = make_ea(); ! 3531: dst = make_dn(ir[0] >> 9); ! 3532: } ! 3533: ! 3534: // %1001_xxx000_mmmrrr SUB.B <ea>,Dx ! 3535: OP_DEF(sub_b_ea_dn) ! 3536: { ! 3537: name = "sub"; ! 3538: size = Size::B; ! 3539: src = make_ea(); ! 3540: dst = make_dn(ir[0] >> 9); ! 3541: } ! 3542: ! 3543: // %1001_xxx001_mmmrrr SUB.W <ea>,Dx ! 3544: OP_DEF(sub_w_ea_dn) ! 3545: { ! 3546: name = "sub"; ! 3547: size = Size::W; ! 3548: src = make_ea(); ! 3549: dst = make_dn(ir[0] >> 9); ! 3550: } ! 3551: ! 3552: // %1001_xxx010_mmmrrr SUB.L <ea>,Dx ! 3553: OP_DEF(sub_l_ea_dn) ! 3554: { ! 3555: name = "sub"; ! 3556: size = Size::L; ! 3557: src = make_ea(); ! 3558: dst = make_dn(ir[0] >> 9); ! 3559: } ! 3560: ! 3561: // %1001_xxx011_mmmrrr SUBA.W <ea>,Ax ! 3562: OP_DEF(suba_w) ! 3563: { ! 3564: name = "suba"; ! 3565: size = Size::W; ! 3566: src = make_ea(); ! 3567: dst = make_an(ir[0] >> 9); ! 3568: } ! 3569: ! 3570: // SUB の共通部分 ! 3571: void ! 3572: Disasm::ops_sub(Disasm::Size sz) ! 3573: { ! 3574: uint n = ir[0] & 0x3f; ! 3575: uint x = ir[0] >> 9; ! 3576: ! 3577: size = sz; ! 3578: if (n < 8) { ! 3579: // SUBX.B Dy,Dx ! 3580: name = "subx"; ! 3581: src = make_dn(n); ! 3582: dst = make_dn(x); ! 3583: } else if (n < 16) { ! 3584: // SUBX.B -(Ay),-(Ax) ! 3585: name = "subx"; ! 3586: src = make_anpd(n); ! 3587: dst = make_anpd(x); ! 3588: } else { ! 3589: // SUB.B Dx,<ea> ! 3590: name = "sub"; ! 3591: src = make_dn(x); ! 3592: dst = make_ea(); ! 3593: } ! 3594: } ! 3595: ! 3596: // %1001_xxx100_000yyy SUBX.B Dy,Dx ! 3597: // %1001_xxx100_001yyy SUBX.B -(Ay),-(Ax) ! 3598: // %1001_xxx100_mmmrrr SUB.B Dx,<ea> ! 3599: OP_DEF(sub_b_dn_ea) ! 3600: { ! 3601: ops_sub(Size::B); ! 3602: } ! 3603: ! 3604: // %1001_xxx101_000yyy SUBX.W Dy,Dx ! 3605: // %1001_xxx101_001yyy SUBX.W -(Ay),-(Ax) ! 3606: // %1001_xxx101_mmmrrr SUB.W Dx,<ea> ! 3607: OP_DEF(sub_w_dn_ea) ! 3608: { ! 3609: ops_sub(Size::W); ! 3610: } ! 3611: ! 3612: // %1001_xxx110_000yyy SUBX.L Dy,Dx ! 3613: // %1001_xxx110_001yyy SUBX.L -(Ay),-(Ax) ! 3614: // %1001_xxx110_mmmrrr SUB.L Dx,<ea> ! 3615: OP_DEF(sub_l_dn_ea) ! 3616: { ! 3617: ops_sub(Size::L); ! 3618: } ! 3619: ! 3620: // %1001_xxx111_mmmrrr SUBA.L <ea>,Ax ! 3621: OP_DEF(suba_l) ! 3622: { ! 3623: name = "suba"; ! 3624: size = Size::L; ! 3625: src = make_ea(); ! 3626: dst = make_an(ir[0] >> 9); ! 3627: } ! 3628: ! 3629: // %1010_nnnnnn_nnnnnn A-Line ! 3630: OP_DEF(aline) ! 3631: { ! 3632: name = "<unknown A-Line trap>"; ! 3633: } ! 3634: ! 3635: // %1011_xxx000_mmmrrr CMP.B <ea>,Dx ! 3636: OP_DEF(cmp_b) ! 3637: { ! 3638: name = "cmp"; ! 3639: size = Size::B; ! 3640: src = make_ea(); ! 3641: dst = make_dn(ir[0] >> 9); ! 3642: } ! 3643: ! 3644: // %1011_xxx001_mmmrrr CMP.W <ea>,Dx ! 3645: OP_DEF(cmp_w) ! 3646: { ! 3647: name = "cmp"; ! 3648: size = Size::W; ! 3649: src = make_ea(); ! 3650: dst = make_dn(ir[0] >> 9); ! 3651: } ! 3652: ! 3653: // %1011_xxx010_mmmrrr CMP.L <ea>,Dx ! 3654: OP_DEF(cmp_l) ! 3655: { ! 3656: name = "cmp"; ! 3657: size = Size::L; ! 3658: src = make_ea(); ! 3659: dst = make_dn(ir[0] >> 9); ! 3660: } ! 3661: ! 3662: // %1011_xxx011_mmmrrr CMPA.W <ea>,Ax ! 3663: OP_DEF(cmpa_w) ! 3664: { ! 3665: name = "cmpa"; ! 3666: size = Size::W; ! 3667: src = make_ea(); ! 3668: dst = make_an(ir[0] >> 9); ! 3669: } ! 3670: ! 3671: void ! 3672: Disasm::ops_eor_cmpm(Disasm::Size sz) ! 3673: { ! 3674: size = sz; ! 3675: ! 3676: uint mm = (ir[0] >> 3) & 7; ! 3677: if (mm == 1) { ! 3678: // CMPM.x (Ay)+,(Ax)+ ! 3679: name = "cmpm"; ! 3680: src = make_anpi(ir[0]); ! 3681: dst = make_anpi(ir[0] >> 9); ! 3682: } else { ! 3683: // EOR.x Dx,<ea> ! 3684: name = "eor"; ! 3685: src = make_dn(ir[0] >> 9); ! 3686: dst = make_ea(); ! 3687: } ! 3688: } ! 3689: ! 3690: // %1011_xxx100_mmmrrr EOR.B Dx,<ea> ! 3691: // %1011_xxx100_001yyy CMPM.B (Ay)+,(Ax)+ ! 3692: OP_DEF(eor_b) ! 3693: { ! 3694: ops_eor_cmpm(Size::B); ! 3695: } ! 3696: ! 3697: // %1011_xxx101_mmmrrr EOR.W Dx,<ea> ! 3698: // %1011_xxx101_001yyy CMPM.W (Ay)+,(Ax)+ ! 3699: OP_DEF(eor_w) ! 3700: { ! 3701: ops_eor_cmpm(Size::W); ! 3702: } ! 3703: ! 3704: // %1011_xxx110_mmmrrr EOR.L Dx,<ea> ! 3705: // %1011_xxx110_001yyy CMPM.L (Ay)+,(Ax)+ ! 3706: OP_DEF(eor_l) ! 3707: { ! 3708: ops_eor_cmpm(Size::L); ! 3709: } ! 3710: ! 3711: // %1011_xxx111_mmmrrr CMPA.L <ea>,Ax ! 3712: OP_DEF(cmpa_l) ! 3713: { ! 3714: name = "cmpa"; ! 3715: size = Size::L; ! 3716: src = make_ea(); ! 3717: dst = make_an(ir[0] >> 9); ! 3718: } ! 3719: ! 3720: // %1100_xxx000_mmmrrr AND.B <ea>,Dx ! 3721: OP_DEF(and_b_ea_dn) ! 3722: { ! 3723: name = "and"; ! 3724: size = Size::B; ! 3725: src = make_ea(); ! 3726: dst = make_dn(ir[0] >> 9); ! 3727: } ! 3728: ! 3729: // %1100_xxx001_mmmrrr AND.W <ea>,Dx ! 3730: OP_DEF(and_w_ea_dn) ! 3731: { ! 3732: name = "and"; ! 3733: size = Size::W; ! 3734: src = make_ea(); ! 3735: dst = make_dn(ir[0] >> 9); ! 3736: } ! 3737: ! 3738: // %1100_xxx010_mmmrrr AND.L <ea>,Dx ! 3739: OP_DEF(and_l_ea_dn) ! 3740: { ! 3741: name = "and"; ! 3742: size = Size::L; ! 3743: src = make_ea(); ! 3744: dst = make_dn(ir[0] >> 9); ! 3745: } ! 3746: ! 3747: // %1100_xxx011_mmmrrr MULU.W <ea>,Dx ! 3748: OP_DEF(mulu_w) ! 3749: { ! 3750: name = "mulu"; ! 3751: size = Size::W; ! 3752: src = make_ea(); ! 3753: dst = make_dn(ir[0] >> 9); ! 3754: } ! 3755: ! 3756: // %1100_xxx100_000yyy ABCD.B Dy,Dx ! 3757: // %1100_xxx100_001yyy ABCD.B -(Ay),-(Ax) ! 3758: // %1100_xxx100_mmmrrr AND.B Dx,<ea> ! 3759: OP_DEF(and_b_dn_ea) ! 3760: { ! 3761: uint n = ir[0] & 0x3f; ! 3762: uint x = ir[0] >> 9; ! 3763: ! 3764: if (n < 8) { ! 3765: // ABCD.B Dy,Dx ! 3766: name = "abcd"; ! 3767: size = Size::B; ! 3768: src = make_dn(n); ! 3769: dst = make_dn(x); ! 3770: } else if (n < 16) { ! 3771: // ABCD.B -(Ay),-(Ax) ! 3772: name = "abcd"; ! 3773: size = Size::B; ! 3774: src = make_anpd(n); ! 3775: dst = make_anpd(x); ! 3776: } else { ! 3777: // AND.B Dx,<ea> ! 3778: name = "and"; ! 3779: size = Size::B; ! 3780: src = make_dn(x); ! 3781: dst = make_ea(); ! 3782: } ! 3783: } ! 3784: ! 3785: // %1100_xxx101_000yyy EXG.L Dx,Dy ! 3786: // %1100_xxx101_001yyy EXG.L Ax,Ay ! 3787: // %1100_xxx101_mmmrrr AND.W Dx,<ea> ! 3788: OP_DEF(and_w_dn_ea) ! 3789: { ! 3790: uint n = ir[0] & 0x3f; ! 3791: uint x = ir[0] >> 9; ! 3792: ! 3793: if (n < 8) { ! 3794: // EXG.L Dx,Dy ! 3795: name = "exg"; ! 3796: size = Size::L; ! 3797: src = make_dn(x); ! 3798: dst = make_dn(n); ! 3799: } else if (n < 16) { ! 3800: // EXG.L Ax,Ay ! 3801: name = "exg"; ! 3802: size = Size::L; ! 3803: src = make_an(x); ! 3804: dst = make_an(n); ! 3805: } else { ! 3806: // AND.W Dx,<ea> ! 3807: name = "and"; ! 3808: size = Size::W; ! 3809: src = make_dn(x); ! 3810: dst = make_ea(); ! 3811: } ! 3812: } ! 3813: ! 3814: // %1100_xxx110_001yyy EXG.L Dx,Ay ! 3815: // %1100_xxx110_mmmrrr AND.L Dx,<ea> ! 3816: OP_DEF(and_l_dn_ea) ! 3817: { ! 3818: uint mm = (ir[0] >> 3) & 7; ! 3819: ! 3820: if (mm == 1) { ! 3821: // EXG.L Dx,Ay ! 3822: name = "exg"; ! 3823: size = Size::L; ! 3824: src = make_dn(ir[0] >> 9); ! 3825: dst = make_an(ir[0]); ! 3826: } else { ! 3827: // AND.L Dx,<ea> ! 3828: name = "and"; ! 3829: size = Size::L; ! 3830: src = make_dn(ir[0] >> 9); ! 3831: dst = make_ea(); ! 3832: } ! 3833: } ! 3834: ! 3835: // %1100_xxx111_mmmrrr MULS.W <ea>,Dx ! 3836: OP_DEF(muls_w) ! 3837: { ! 3838: name = "muls"; ! 3839: size = Size::W; ! 3840: src = make_ea(); ! 3841: dst = make_dn(ir[0] >> 9); ! 3842: } ! 3843: ! 3844: // %1101_xxx000_mmmrrr ADD.B <ea>,Dx ! 3845: OP_DEF(add_b_ea_dn) ! 3846: { ! 3847: name = "add"; ! 3848: size = Size::B; ! 3849: src = make_ea(); ! 3850: dst = make_dn(ir[0] >> 9); ! 3851: } ! 3852: ! 3853: // %1101_xxx001_mmmrrr ADD.W <ea>,Dx ! 3854: OP_DEF(add_w_ea_dn) ! 3855: { ! 3856: name = "add"; ! 3857: size = Size::W; ! 3858: src = make_ea(); ! 3859: dst = make_dn(ir[0] >> 9); ! 3860: } ! 3861: ! 3862: // %1101_xxx010_mmmrrr ADD.L <ea>,Dx ! 3863: OP_DEF(add_l_ea_dn) ! 3864: { ! 3865: name = "add"; ! 3866: size = Size::L; ! 3867: src = make_ea(); ! 3868: dst = make_dn(ir[0] >> 9); ! 3869: } ! 3870: ! 3871: // %1101_xxx011_mmmrrr ADDA.W <ea>,Ax ! 3872: OP_DEF(adda_w) ! 3873: { ! 3874: name = "adda"; ! 3875: size = Size::W; ! 3876: src = make_ea(); ! 3877: dst = make_an(ir[0] >> 9); ! 3878: } ! 3879: ! 3880: // ADD の共通部分 ! 3881: void ! 3882: Disasm::ops_add(Disasm::Size sz) ! 3883: { ! 3884: uint n = ir[0] & 0x3f; ! 3885: uint x = ir[0] >> 9; ! 3886: ! 3887: size = sz; ! 3888: if (n < 8) { ! 3889: // ADDX.B Dy,Dx ! 3890: name = "addx"; ! 3891: src = make_dn(n); ! 3892: dst = make_dn(x); ! 3893: } else if (n < 16) { ! 3894: // ADDX.B -(Ay),-(Ax) ! 3895: name = "addx"; ! 3896: src = make_anpd(n); ! 3897: dst = make_anpd(x); ! 3898: } else { ! 3899: // ADD.B Dx,<ea> ! 3900: name = "add"; ! 3901: src = make_dn(x); ! 3902: dst = make_ea(); ! 3903: } ! 3904: } ! 3905: ! 3906: // %1101_xxx100_000yyy ADDX.B Dy,Dx ! 3907: // %1101_xxx100_001yyy ADDX.B -(Ay),-(Ax) ! 3908: // %1101_xxx100_mmmrrr ADD.B Dx,<ea> ! 3909: OP_DEF(add_b_dn_ea) ! 3910: { ! 3911: ops_add(Size::B); ! 3912: } ! 3913: ! 3914: // %1101_xxx101_000yyy ADDX.W Dy,Dx ! 3915: // %1101_xxx101_001yyy ADDX.W -(Ay),-(Ax) ! 3916: // %1101_xxx101_mmmrrr ADD.W Dx,<ea> ! 3917: OP_DEF(add_w_dn_ea) ! 3918: { ! 3919: ops_add(Size::W); ! 3920: } ! 3921: ! 3922: // %1101_xxx110_000yyy ADDX.L Dy,Dx ! 3923: // %1101_xxx110_001yyy ADDX.L -(Ay),-(Ax) ! 3924: // %1101_xxx110_mmmrrr ADD.L Dx,<ea> ! 3925: OP_DEF(add_l_dn_ea) ! 3926: { ! 3927: ops_add(Size::L); ! 3928: } ! 3929: ! 3930: // %1101_xxx111_mmmrrr ADDA.L <ea>,Ax ! 3931: OP_DEF(adda_l) ! 3932: { ! 3933: name = "adda"; ! 3934: size = Size::L; ! 3935: src = make_ea(); ! 3936: dst = make_an(ir[0] >> 9); ! 3937: } ! 3938: ! 3939: // シフト・ローテート系の共通部分 ! 3940: void ! 3941: Disasm::ops_rotate(std::string dir, Disasm::Size sz) ! 3942: { ! 3943: uint xx = ir[0] >> 9; ! 3944: uint mm = (ir[0] >> 3) & 7; ! 3945: ! 3946: size = sz; ! 3947: dst = make_dn(ir[0]); ! 3948: switch (mm) { ! 3949: case 0: // AS* #qqq,Dy ! 3950: name = "as" + dir; ! 3951: src = make_q8(); ! 3952: break; ! 3953: case 1: // LS* #qqq,Dy ! 3954: name = "ls" + dir; ! 3955: src = make_q8(); ! 3956: break; ! 3957: case 2: // ROX* #qqq,Dy ! 3958: name = "rox" + dir; ! 3959: src = make_q8(); ! 3960: break; ! 3961: case 3: // RO* #qqq,Dy ! 3962: name = "ro" + dir; ! 3963: src = make_q8(); ! 3964: break; ! 3965: case 4: // AS* Dx,Dy ! 3966: name = "as" + dir; ! 3967: src = make_dn(xx); ! 3968: break; ! 3969: case 5: // LS* Dx,Dy ! 3970: name = "ls" + dir; ! 3971: src = make_dn(xx); ! 3972: break; ! 3973: case 6: // ROX* Dx,Dy ! 3974: name = "rox" + dir; ! 3975: src = make_dn(xx); ! 3976: break; ! 3977: case 7: // RO* Dx,Dy ! 3978: name = "ro" + dir; ! 3979: src = make_dn(xx); ! 3980: break; ! 3981: default: ! 3982: __unreachable(); ! 3983: } ! 3984: } ! 3985: ! 3986: // %1110_qqq000_000yyy ASR.B #qqq,Dy ! 3987: // %1110_qqq000_001yyy LSR.B #qqq,Dy ! 3988: // %1110_qqq000_010yyy ROXR.B #qqq,Dy ! 3989: // %1110_qqq000_011yyy ROR.B #qqq,Dy ! 3990: // %1110_xxx000_100yyy ASR.B Dx,Dy ! 3991: // %1110_xxx000_101yyy LSR.B Dx,Dy ! 3992: // %1110_xxx000_110yyy ROXR.B Dx,Dy ! 3993: // %1110_xxx000_111yyy ROR.B Dx,Dy ! 3994: OP_DEF(asr_b_imm) ! 3995: { ! 3996: ops_rotate("r", Size::B); ! 3997: } ! 3998: ! 3999: // %1110_qqq001_000yyy ASR.W #qqq,Dy ! 4000: // %1110_qqq001_001yyy LSR.W #qqq,Dy ! 4001: // %1110_qqq001_010yyy ROXR.W #qqq,Dy ! 4002: // %1110_qqq001_011yyy ROR.W #qqq,Dy ! 4003: // %1110_xxx001_100yyy ASR.W Dx,Dy ! 4004: // %1110_xxx001_101yyy LSR.W Dx,Dy ! 4005: // %1110_xxx001_110yyy ROXR.W Dx,Dy ! 4006: // %1110_xxx001_111yyy ROR.W Dx,Dy ! 4007: OP_DEF(asr_w_imm) ! 4008: { ! 4009: ops_rotate("r", Size::W); ! 4010: } ! 4011: ! 4012: // %1110_qqq010_000yyy ASR.L #qqq,Dy ! 4013: // %1110_qqq010_001yyy LSR.L #qqq,Dy ! 4014: // %1110_qqq010_010yyy ROXR.L #qqq,Dy ! 4015: // %1110_qqq010_011yyy ROR.L #qqq,Dy ! 4016: // %1110_xxx010_100yyy ASR.L Dx,Dy ! 4017: // %1110_xxx010_101yyy LSR.L Dx,Dy ! 4018: // %1110_xxx010_110yyy ROXR.L Dx,Dy ! 4019: // %1110_xxx010_111yyy ROR.L Dx,Dy ! 4020: OP_DEF(asr_l_imm) ! 4021: { ! 4022: ops_rotate("r", Size::L); ! 4023: } ! 4024: ! 4025: // %1110_000011_mmmrrr ASR.W <ea> ! 4026: OP_DEF(asr_w) ! 4027: { ! 4028: name = "asr"; ! 4029: size = Size::W; ! 4030: src = make_ea(); ! 4031: } ! 4032: ! 4033: // %1110_qqq100_000yyy ASL.B #qqq,Dy ! 4034: // %1110_qqq100_001yyy LSL.B #qqq,Dy ! 4035: // %1110_qqq100_010yyy ROXL.B #qqq,Dy ! 4036: // %1110_qqq100_011yyy ROL.B #qqq,Dy ! 4037: // %1110_xxx100_100yyy ASL.B Dx,Dy ! 4038: // %1110_xxx100_101yyy LSL.B Dx,Dy ! 4039: // %1110_xxx100_110yyy ROXL.B Dx,Dy ! 4040: // %1110_xxx100_111yyy ROL.B Dx,Dy ! 4041: OP_DEF(asl_b_imm) ! 4042: { ! 4043: ops_rotate("l", Size::B); ! 4044: } ! 4045: ! 4046: // %1110_qqq101_000yyy ASL.W #qqq,Dy ! 4047: // %1110_qqq101_001yyy LSL.W #qqq,Dy ! 4048: // %1110_qqq101_010yyy ROXL.W #qqq,Dy ! 4049: // %1110_qqq101_011yyy ROL.W #qqq,Dy ! 4050: // %1110_xxx101_100yyy ASL.W Dx,Dy ! 4051: // %1110_xxx101_101yyy LSL.W Dx,Dy ! 4052: // %1110_xxx101_110yyy ROXL.W Dx,Dy ! 4053: // %1110_xxx101_111yyy ROL.W Dx,Dy ! 4054: OP_DEF(asl_w_imm) ! 4055: { ! 4056: ops_rotate("l", Size::W); ! 4057: } ! 4058: ! 4059: // %1110_qqq110_000yyy ASL.L #qqq,Dy ! 4060: // %1110_qqq110_001yyy LSL.L #qqq,Dy ! 4061: // %1110_qqq110_010yyy ROXL.L #qqq,Dy ! 4062: // %1110_qqq110_011yyy ROL.L #qqq,Dy ! 4063: // %1110_xxx110_100yyy ASL.L Dx,Dy ! 4064: // %1110_xxx110_101yyy LSL.L Dx,Dy ! 4065: // %1110_xxx110_110yyy ROXL.L Dx,Dy ! 4066: // %1110_xxx110_111yyy ROL.L Dx,Dy ! 4067: OP_DEF(asl_l_imm) ! 4068: { ! 4069: ops_rotate("l", Size::L); ! 4070: } ! 4071: ! 4072: // %1110_000111_mmmrrr ASL.W <ea> ! 4073: OP_DEF(asl_w) ! 4074: { ! 4075: name = "asl"; ! 4076: size = Size::W; ! 4077: src = make_ea(); ! 4078: } ! 4079: ! 4080: // %1110_001011_mmmrrr LSR.W <ea> ! 4081: OP_DEF(lsr_w) ! 4082: { ! 4083: name = "lsr"; ! 4084: size = Size::W; ! 4085: src = make_ea(); ! 4086: } ! 4087: ! 4088: // %1110_001111_mmmrrr LSL.W <ea> ! 4089: OP_DEF(lsl_w) ! 4090: { ! 4091: name = "lsl"; ! 4092: size = Size::W; ! 4093: src = make_ea(); ! 4094: } ! 4095: ! 4096: // %1110_010011_mmmrrr ROXR.W <ea> ! 4097: OP_DEF(roxr_w) ! 4098: { ! 4099: name = "roxr"; ! 4100: size = Size::W; ! 4101: src = make_ea(); ! 4102: } ! 4103: ! 4104: // %1110_010111_mmmrrr ROXL.W <ea> ! 4105: OP_DEF(roxl_w) ! 4106: { ! 4107: name = "roxl"; ! 4108: size = Size::W; ! 4109: src = make_ea(); ! 4110: } ! 4111: ! 4112: // %1110_011011_mmmrrr ROR.W <ea> ! 4113: OP_DEF(ror_w) ! 4114: { ! 4115: name = "ror"; ! 4116: size = Size::W; ! 4117: src = make_ea(); ! 4118: } ! 4119: ! 4120: // %1110_011111_mmmrrr ROL.W <ea> ! 4121: OP_DEF(rol_w) ! 4122: { ! 4123: name = "rol"; ! 4124: size = Size::W; ! 4125: src = make_ea(); ! 4126: } ! 4127: ! 4128: // %1110_100011_mmmrrr BFTST <ea>{#o:#w} ! 4129: OP_DEF(bftst) ! 4130: { ! 4131: fetch16(); ! 4132: name = "bftst"; ! 4133: src = make_ea() + make_bf(); ! 4134: } ! 4135: ! 4136: // %1110_100111_mmmrrr BFEXTU <ea>{#o:#w},Dn ! 4137: OP_DEF(bfextu) ! 4138: { ! 4139: fetch16(); ! 4140: name = "bfextu"; ! 4141: src = make_ea() + make_bf(); ! 4142: dst = make_dn(ir[1] >> 12); ! 4143: } ! 4144: ! 4145: // %1110_101011_mmmrrr BFCHG <ea>{#o:#w} ! 4146: OP_DEF(bfchg) ! 4147: { ! 4148: fetch16(); ! 4149: name = "bfchg"; ! 4150: src = make_ea() + make_bf(); ! 4151: } ! 4152: ! 4153: // %1110_101111_mmmrrr BFEXTS <ea>{#o:#w},Dn ! 4154: OP_DEF(bfexts) ! 4155: { ! 4156: fetch16(); ! 4157: name = "bfexts"; ! 4158: src = make_ea() + make_bf(); ! 4159: dst = make_dn(ir[1] >> 12); ! 4160: } ! 4161: ! 4162: // %1110_110011_mmmrrr BFCLR <ea>{#o:#w} ! 4163: OP_DEF(bfclr) ! 4164: { ! 4165: fetch16(); ! 4166: name = "bfclr"; ! 4167: src = make_ea() + make_bf(); ! 4168: } ! 4169: ! 4170: // %1110_110111_mmmrrr BFFFO <ea>{#o:#w},Dn ! 4171: OP_DEF(bfffo) ! 4172: { ! 4173: fetch16(); ! 4174: name = "bfffo"; ! 4175: src = make_ea() + make_bf(); ! 4176: dst = make_dn(ir[1] >> 12); ! 4177: } ! 4178: ! 4179: // %1110_111011_mmmrrr BFSET <ea>{#o:#w} ! 4180: OP_DEF(bfset) ! 4181: { ! 4182: fetch16(); ! 4183: name = "bfset"; ! 4184: src = make_ea() + make_bf(); ! 4185: } ! 4186: ! 4187: // %1110_111111_mmmrrr BFINS Dn,<ea>{#o:#w} ! 4188: OP_DEF(bfins) ! 4189: { ! 4190: fetch16(); ! 4191: name = "bfins"; ! 4192: dst = make_ea() + make_bf(); ! 4193: src = make_dn(ir[1] >> 12); ! 4194: } ! 4195: ! 4196: // PMOVE* の共通部分 ! 4197: void ! 4198: Disasm::ops_pmove(Reg reg, Disasm::Size sz) ! 4199: { ! 4200: if ((ir[1] & 0x0100) == 0) { ! 4201: name = "pmove"; ! 4202: } else { ! 4203: name = "pmovefd"; ! 4204: } ! 4205: size = sz; ! 4206: if ((ir[1] & 0x0200) == 0) { ! 4207: src = make_ea(); ! 4208: dst = make_reg(reg); ! 4209: } else { ! 4210: src = make_reg(reg); ! 4211: dst = make_ea(); ! 4212: } ! 4213: } ! 4214: ! 4215: // %1111_000nnn_nnnnnn MMU_OP ! 4216: OP_DEF(mmuop) ! 4217: { ! 4218: uint16 ext = fetch16(); ! 4219: switch (ext >> 8) { ! 4220: case 0x08: // PMOVE.L <ea>,TT0 ! 4221: case 0x09: // PMOVEFD.L <ea>,TT0 ! 4222: case 0x0a: // PMOVE.L TT0,<ea> ! 4223: ops_pmove(Reg::TT0, Size::L); ! 4224: break; ! 4225: case 0x0c: // PMOVE.L <ea>,TT1 ! 4226: case 0x0d: // PMOVEFD.L <ea>,TT1 ! 4227: case 0x0e: // PMOVE.L TT1,<ea> ! 4228: ops_pmove(Reg::TT1, Size::L); ! 4229: break; ! 4230: case 0x40: // PMOVE.L <ea>,TC ! 4231: case 0x41: // PMOVEFD.L <ea>,TC ! 4232: case 0x42: // PMOVE.L TC,<ea> ! 4233: ops_pmove(Reg::TC, Size::L); ! 4234: break; ! 4235: case 0x48: // PMOVE.Q <ea>,SRP ! 4236: case 0x49: // PMOVEFD.Q <ea>,SRP ! 4237: case 0x4a: // PMOVE.Q SRP,<ea> ! 4238: ops_pmove(Reg::SRP, Size::Q); ! 4239: break; ! 4240: case 0x4c: // PMOVE.Q <ea>,CRP ! 4241: case 0x4d: // PMOVEFD.Q <ea>,CRP ! 4242: case 0x4e: // PMOVE.Q CRP,<ea> ! 4243: ops_pmove(Reg::CRP, Size::Q); ! 4244: break; ! 4245: case 0x60: // PMOVE.W <ea>,MMUSR ! 4246: case 0x61: // PMOVEFD.W <ea>,MMUSR ! 4247: case 0x62: // PMOVE.W MMUSR,<ea> ! 4248: ops_pmove(Reg::MMUSR, Size::W); ! 4249: break; ! 4250: ! 4251: case 0x20: // PLOADW <fc>,<ea> ! 4252: case 0x22: // PLOADR <fc>,<ea> ! 4253: if ((ext & 0x0200) == 0) { ! 4254: name = "ploadw"; ! 4255: } else { ! 4256: name = "ploadr"; ! 4257: } ! 4258: src = make_fc(); ! 4259: dst = make_ea(); ! 4260: break; ! 4261: ! 4262: case 0x24: // PFLUSHA ! 4263: name = "pflusha"; ! 4264: break; ! 4265: ! 4266: case 0x38: // PFLUSH <fc>,#<mask>,<ea> ! 4267: dst = make_ea(); ! 4268: FALLTHROUGH; ! 4269: case 0x30: // PFLUSH <fc>,#<mask> ! 4270: name = "pflush"; ! 4271: src = make_fc() + string_format(",#%d", (ir[1] >> 5) & 7); ! 4272: break; ! 4273: ! 4274: case 0x81: // PTESTW <fc>,<ea>,#0,An ! 4275: case 0x85: // PTESTW <fc>,<ea>,#1,An ! 4276: case 0x89: // PTESTW <fc>,<ea>,#2,An ! 4277: case 0x8d: // PTESTW <fc>,<ea>,#3,An ! 4278: case 0x91: // PTESTW <fc>,<ea>,#4,An ! 4279: case 0x95: // PTESTW <fc>,<ea>,#5,An ! 4280: case 0x99: // PTESTW <fc>,<ea>,#6,An ! 4281: case 0x9d: // PTESTW <fc>,<ea>,#7,An ! 4282: case 0x83: // PTESTR <fc>,<ea>,#0,An ! 4283: case 0x87: // PTESTR <fc>,<ea>,#1,An ! 4284: case 0x8b: // PTESTR <fc>,<ea>,#2,An ! 4285: case 0x8f: // PTESTR <fc>,<ea>,#3,An ! 4286: case 0x93: // PTESTR <fc>,<ea>,#4,An ! 4287: case 0x97: // PTESTR <fc>,<ea>,#5,An ! 4288: case 0x9b: // PTESTR <fc>,<ea>,#6,An ! 4289: case 0x9f: // PTESTR <fc>,<ea>,#7,An ! 4290: dst = make_an(ir[1] >> 5); ! 4291: FALLTHROUGH; ! 4292: case 0x80: // PTESTW <fc>,<ea>,#0 ! 4293: case 0x84: // PTESTW <fc>,<ea>,#1 ! 4294: case 0x88: // PTESTW <fc>,<ea>,#2 ! 4295: case 0x8c: // PTESTW <fc>,<ea>,#3 ! 4296: case 0x90: // PTESTW <fc>,<ea>,#4 ! 4297: case 0x94: // PTESTW <fc>,<ea>,#5 ! 4298: case 0x98: // PTESTW <fc>,<ea>,#6 ! 4299: case 0x9c: // PTESTW <fc>,<ea>,#7 ! 4300: case 0x82: // PTESTR <fc>,<ea>,#0 ! 4301: case 0x86: // PTESTR <fc>,<ea>,#1 ! 4302: case 0x8a: // PTESTR <fc>,<ea>,#2 ! 4303: case 0x8e: // PTESTR <fc>,<ea>,#3 ! 4304: case 0x92: // PTESTR <fc>,<ea>,#4 ! 4305: case 0x96: // PTESTR <fc>,<ea>,#5 ! 4306: case 0x9a: // PTESTR <fc>,<ea>,#6 ! 4307: case 0x9e: // PTESTR <fc>,<ea>,#7 ! 4308: if ((ext & 0x0200) == 0) { ! 4309: name = "ptestw"; ! 4310: } else { ! 4311: name = "ptestr"; ! 4312: } ! 4313: src = make_fc() + "," + make_ea() ! 4314: + string_format(",#%d", (ext >> 10) & 7); ! 4315: break; ! 4316: ! 4317: default: ! 4318: OP_FUNC(illegal); ! 4319: break; ! 4320: } ! 4321: } ! 4322: ! 4323: // %1111_001000_nnnnnn FPGEN ! 4324: OP_DEF(fpgen) ! 4325: { ! 4326: uint16 ext = fetch16(); ! 4327: ! 4328: switch (ext >> 13) { ! 4329: case 0: ! 4330: ops_fpgen_fpn_fpn(); ! 4331: break; ! 4332: case 2: ! 4333: ops_fpgen_ea_fpn(); ! 4334: break; ! 4335: case 3: ! 4336: ops_fmove_fpn_ea(); ! 4337: break; ! 4338: case 4: ! 4339: ops_fmovem_ea_ctl(); ! 4340: break; ! 4341: case 5: ! 4342: ops_fmovem_ctl_ea(); ! 4343: break; ! 4344: case 6: ! 4345: ops_fmovem_ea_fpn(); ! 4346: break; ! 4347: case 7: ! 4348: ops_fmovem_fpn_ea(); ! 4349: break; ! 4350: } ! 4351: } ! 4352: ! 4353: // FPgen <fpn>,<fpn> ! 4354: void ! 4355: Disasm::ops_fpgen_fpn_fpn() ! 4356: { ! 4357: uint sn = (ir[1] >> 10) & 7; ! 4358: uint dn = (ir[1] >> 7) & 7; ! 4359: uint mode = ir[1] & 0x7f; ! 4360: ! 4361: // FSINCOS だけ形式が違うので先に処理 ! 4362: if (0x30 <= mode && mode < 0x38) { ! 4363: name = "fsincos"; ! 4364: size = Size::X; ! 4365: src = make_fpn(sn); ! 4366: dst = make_fpn(ir[1]) + ":" + make_fpn(dn); ! 4367: return; ! 4368: } ! 4369: ! 4370: // FSINCOS 以外は全部同じ書式 ! 4371: name = fpgen_names[mode]; ! 4372: if (name.empty()) { ! 4373: OP_FUNC(illegal); ! 4374: return; ! 4375: } ! 4376: size = Size::X; ! 4377: src = make_fpn(sn); ! 4378: // FSIN FPm,FPm のように src, dst が同じ場合は FSIN FPm と書くが、 ! 4379: // FMOVE FPm,FPm は src, dst が同じであっても FMOVE FPm,FPm と表記する。 ! 4380: if (mode == 0x00/*FMOVE*/ || sn != dn) { ! 4381: dst = make_fpn(dn); ! 4382: } ! 4383: } ! 4384: ! 4385: // FPgen <ea>,<reg> ! 4386: void ! 4387: Disasm::ops_fpgen_ea_fpn() ! 4388: { ! 4389: uint sz = (ir[1] >> 10) & 7; ! 4390: uint dn = (ir[1] >> 7) & 7; ! 4391: uint mode = ir[1] & 0x7f; ! 4392: ! 4393: if (sz == 7) { ! 4394: // ここに FMOVECR ! 4395: ops_fmovecr(); ! 4396: return; ! 4397: } ! 4398: ! 4399: name = fpgen_names[mode]; ! 4400: if (name.empty()) { ! 4401: OP_FUNC(illegal); ! 4402: return; ! 4403: } ! 4404: size = (Size)sz; ! 4405: src = make_ea(); ! 4406: dst = make_fpn(dn); ! 4407: } ! 4408: ! 4409: // FMOVECR ! 4410: void ! 4411: Disasm::ops_fmovecr() ! 4412: { ! 4413: uint dn = (ir[1] >> 7) & 7; ! 4414: uint offset = ir[1] & 0x7f; ! 4415: std::string text; ! 4416: ! 4417: name = "fmovecr"; ! 4418: size = Size::X; ! 4419: src = "#" + hex8(offset); ! 4420: // 定数だけじゃ分かりづらいので内容も表示も表示してみるのはどうか。 ! 4421: switch (offset) { ! 4422: case 0: ! 4423: src += "<pi>"; ! 4424: break; ! 4425: case 0x0b ... 0x0f: ! 4426: src += fmovecr_text[offset - 0x0b]; ! 4427: break; ! 4428: case 0x30 ... 0x3f: ! 4429: src += fmovecr_text[offset - 0x30 + 5]; ! 4430: break; ! 4431: default: ! 4432: break; ! 4433: } ! 4434: dst = make_fpn(dn); ! 4435: } ! 4436: ! 4437: // FMOVE <fpn>,<ea> ! 4438: void ! 4439: Disasm::ops_fmove_fpn_ea() ! 4440: { ! 4441: uint sz = (ir[1] >> 10) & 7; ! 4442: uint sn = (ir[1] >> 7) & 7; ! 4443: uint mode = ir[1] & 0x7f; ! 4444: ! 4445: name = "fmove"; ! 4446: size = (Size)sz; ! 4447: src = make_fpn(sn); ! 4448: dst = make_ea(); ! 4449: if (sz == Size::P) { ! 4450: // static k-factor ! 4451: int k; ! 4452: // 7bit (符号なし)数を符号付き数に変える ! 4453: if ((mode & 0x40)) { ! 4454: k = (int8)(mode | 0x80); ! 4455: } else { ! 4456: k = mode; ! 4457: } ! 4458: dst += string_format("{#%d}", k); ! 4459: } else if (sz == Size::Pk) { ! 4460: // dynamic k-factor ! 4461: dst += "{" + make_dn(mode >> 4) + "}"; ! 4462: } ! 4463: } ! 4464: ! 4465: void ! 4466: Disasm::ops_fmovem_ea_ctl() ! 4467: { ! 4468: uint n; ! 4469: ! 4470: n = make_fpctls(dst); ! 4471: if (n == 1) { ! 4472: name = "fmove"; ! 4473: } else { ! 4474: name = "fmovem"; ! 4475: } ! 4476: size = Size::L; ! 4477: ! 4478: src = make_ea(); ! 4479: // #imm が複数ある場合 ! 4480: if ((ir[0] & 0x3f) == 0x3c && n > 1) { ! 4481: for (int i = 1; i < n; i++) { ! 4482: src += "/"; ! 4483: src += imm32(); ! 4484: } ! 4485: } ! 4486: } ! 4487: ! 4488: void ! 4489: Disasm::ops_fmovem_ctl_ea() ! 4490: { ! 4491: uint n; ! 4492: ! 4493: n = make_fpctls(src); ! 4494: if (n == 1) { ! 4495: name = "fmove"; ! 4496: } else { ! 4497: name = "fmovem"; ! 4498: } ! 4499: size = Size::L; ! 4500: dst = make_ea(); ! 4501: } ! 4502: ! 4503: void ! 4504: Disasm::ops_fmovem_ea_fpn() ! 4505: { ! 4506: name = "fmovem"; ! 4507: size = Size::X; ! 4508: src = make_ea(); ! 4509: if ((ir[1] & 0x1800) == 0x1800) { ! 4510: // dynamic list ! 4511: dst = make_dn(ir[1] >> 4); ! 4512: } else { ! 4513: dst = make_fpnlist(); ! 4514: } ! 4515: } ! 4516: ! 4517: void ! 4518: Disasm::ops_fmovem_fpn_ea() ! 4519: { ! 4520: name = "fmovem"; ! 4521: size = Size::X; ! 4522: if ((ir[1] & 0x1800) == 0x1800) { ! 4523: // dynamic list ! 4524: src = make_dn(ir[1] >> 4); ! 4525: } else { ! 4526: src = make_fpnlist(); ! 4527: } ! 4528: dst = make_ea(); ! 4529: } ! 4530: ! 4531: // %1111_001001_nnnnnn FScc.B <ea> ! 4532: // %1111_001001_001yyy FDBcc Dy,<label> ! 4533: // %1111_001001_111010 FTRAPcc.W #<imm> ! 4534: // %1111_001001_111011 FTRAPcc.L #<imm> ! 4535: // %1111_001001_111100 FTRAPcc ! 4536: OP_DEF(fxcc) ! 4537: { ! 4538: uint n = ir[0] & 0x3f; ! 4539: ! 4540: fetch16(); ! 4541: switch (n) { ! 4542: case 0x00 ... 0x07: // FScc ! 4543: case 0x10 ... 0x39: ! 4544: name = "fs" + make_fpcc(ir[1]); ! 4545: size = Size::B; ! 4546: src = make_ea(); ! 4547: break; ! 4548: case 0x08 ... 0x0f: // FDBcc ! 4549: name = "fdb" + make_fpcc(ir[1]); ! 4550: src = make_dn(ir[0]); ! 4551: dst = addr32(pc0 + 2 + (int32)(int16)fetch16()); ! 4552: break; ! 4553: case 0x3a: // FTRAPcc.W #<imm> ! 4554: name = "ftrap" + make_fpcc(ir[1]); ! 4555: size = Size::W; ! 4556: src = imm16(); ! 4557: break; ! 4558: case 0x3b: // FTRAPcc.L #<imm> ! 4559: name = "ftrap" + make_fpcc(ir[1]); ! 4560: size = Size::L; ! 4561: src = imm32(); ! 4562: break; ! 4563: case 0x3c: // FTRAPcc ! 4564: name = "ftrap" + make_fpcc(ir[1]); ! 4565: break; ! 4566: default: ! 4567: OP_FUNC(illegal); ! 4568: break; ! 4569: } ! 4570: } ! 4571: ! 4572: // %1111_001010_nnnnnn FBcc.W <label> ! 4573: OP_DEF(fbcc_w) ! 4574: { ! 4575: int32 disp = (int32)(int16)fetch16(); ! 4576: ! 4577: if ((ir[0] & 0x3f) == 0 && disp == 0) { ! 4578: // FBF.W +$0000 のみ FNOP ! 4579: name = "fnop"; ! 4580: return; ! 4581: } ! 4582: name = "fb" + make_fpcc(ir[0]); ! 4583: size = Size::W; ! 4584: src = addr32(pc0 + 2 + disp); ! 4585: } ! 4586: ! 4587: // %1111_001011_nnnnnn FBcc.L <label> ! 4588: OP_DEF(fbcc_l) ! 4589: { ! 4590: name = "fb" + make_fpcc(ir[0]); ! 4591: size = Size::L; ! 4592: src = addr32(pc0 + 2 + (int32)fetch32()); ! 4593: } ! 4594: ! 4595: // %1111_001100_nnnnnn FSAVE <ea> ! 4596: OP_DEF(fsave) ! 4597: { ! 4598: name = "fsave"; ! 4599: src = make_ea(); ! 4600: } ! 4601: ! 4602: // %1111_001101_nnnnnn FRESTORE <ea> ! 4603: OP_DEF(frestore) ! 4604: { ! 4605: name = "frestore"; ! 4606: src = make_ea(); ! 4607: } ! 4608: ! 4609: // %1111_nnnnnn_nnnnnn F-Line ! 4610: OP_DEF(fline) ! 4611: { ! 4612: // XXX x68k/Human68k 判定するか ! 4613: if ((ir[0] & 0xff00) == 0xff00) { ! 4614: uint dosno = ir[0] & 0xff; ! 4615: name = "DOS"; ! 4616: src = x68k_doscall[dosno] ?: "<undefined>"; ! 4617: } else if ((ir[0] & 0xff00) == 0xfe00) { ! 4618: uint n = ir[0] & 0xff; ! 4619: name = "FPACK"; ! 4620: src = x68k_fpcall[n] ?: "<undefined>"; ! 4621: } else { ! 4622: name = "<unknown F-Line trap>"; ! 4623: } ! 4624: } ! 4625: ! 4626: // illegal instructions ! 4627: OP_DEF(illegal) ! 4628: { ! 4629: name = "<illegal instruction>"; ! 4630: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.