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