|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2020 [email protected] ! 4: // ! 5: ! 6: #include "m88100disasm.h" ! 7: #include "bus.h" ! 8: #include "mystring.h" ! 9: ! 10: #define OP_DEF(name) void __CONCAT(m88100disasm::op_,name)() ! 11: #define OP_FUNC(name) __CONCAT(op_,name)() ! 12: ! 13: // コンストラクタ ! 14: m88100disasm::m88100disasm(DebuggerMD *m) ! 15: : inherited(m) ! 16: { ! 17: } ! 18: ! 19: // デストラクタ ! 20: m88100disasm::~m88100disasm() ! 21: { ! 22: } ! 23: ! 24: // 逆アセンブルを実行 ! 25: bool ! 26: m88100disasm::Exec(saddr_t laddr) ! 27: { ! 28: ExecInit(); ! 29: ! 30: opX = 0; ! 31: name.clear(); ! 32: arg0.clear(); ! 33: arg1.clear(); ! 34: arg2.clear(); ! 35: ! 36: xip = laddr.addr; ! 37: phys_xip = laddr.addr; ! 38: ! 39: opX = peek(); ! 40: uint32 op12 = ((opX >> 20) & 0x0fc0) | ((opX >> 10) & 0x003f); ! 41: switch (op12) { ! 42: #include "m88100switch.inc" ! 43: default: ! 44: __unreachable(); ! 45: } ! 46: ! 47: // 出力文字列(ダンプ) ! 48: dump = string_format("%08x ", opX); ! 49: ! 50: // 出力文字列(命令) ! 51: text = name; ! 52: if (!arg0.empty() || !arg1.empty() || !arg2.empty()) { ! 53: // オペランドがどれかでもあればインデントする ! 54: int len = text.length(); ! 55: if (len < 8) { ! 56: text += std::string(8 - len, ' '); ! 57: } else { ! 58: text += ' '; ! 59: } ! 60: ! 61: // arg0,1,2 の空でないやつを追加 ! 62: std::string args; ! 63: if (!arg0.empty()) { ! 64: args += arg0; ! 65: } ! 66: if (!arg1.empty()) { ! 67: if (!args.empty()) { ! 68: args += ","; ! 69: while (args.length() < 4) ! 70: args += " "; ! 71: } ! 72: args += arg1; ! 73: } ! 74: if (!arg2.empty()) { ! 75: if (!args.empty()) { ! 76: args += ","; ! 77: while (args.length() < 8) ! 78: args += " "; ! 79: } ! 80: args += arg2; ! 81: } ! 82: ! 83: text += args; ! 84: } ! 85: ! 86: // 出力バイナリ列 ! 87: // bin は vector<uint8>。 ! 88: bin.push_back( opX >> 24); ! 89: bin.push_back((opX >> 16) & 0xff); ! 90: bin.push_back((opX >> 8) & 0xff); ! 91: bin.push_back( opX & 0xff); ! 92: ! 93: return true; ! 94: } ! 95: ! 96: // ピーク (IP を進めずワードを取得する) ! 97: uint32 ! 98: m88100disasm::peek() ! 99: { ! 100: // 物理空間から取り込む ! 101: return m88200_phys_peek_32(phys_xip); ! 102: } ! 103: ! 104: // フェッチ ! 105: uint32 ! 106: m88100disasm::fetch() ! 107: { ! 108: opX = peek(); ! 109: return opX; ! 110: } ! 111: ! 112: // フィールド部品 ! 113: #define B5 ((opX >> 21) & 0x1f) ! 114: #define M5 ((opX >> 21) & 0x1f) ! 115: #define W5 ((opX >> 5) & 0x1f) ! 116: #define O5 ((opX ) & 0x1f) ! 117: #define VEC9 (opX & 0x000001ffU) ! 118: #define D16 (((int32)(int16)opX) << 2) ! 119: #define D26 (((int32)(opX << 6)) >> 4) ! 120: ! 121: std::string ! 122: m88100disasm::rd() ! 123: { ! 124: return string_format("r%d", (opX >> 21) & 0x1f); ! 125: } ! 126: ! 127: std::string ! 128: m88100disasm::rs1() ! 129: { ! 130: return string_format("r%d", (opX >> 16) & 0x1f); ! 131: } ! 132: ! 133: std::string ! 134: m88100disasm::rs2() ! 135: { ! 136: return string_format("r%d", (opX ) & 0x1f); ! 137: } ! 138: ! 139: std::string ! 140: m88100disasm::imm16() ! 141: { ! 142: return string_format("#0x%04x", (opX & 0x0000ffff)); ! 143: } ! 144: ! 145: std::string ! 146: m88100disasm::d16() ! 147: { ! 148: return string_format("0x%08x", xip + D16); ! 149: } ! 150: ! 151: // 制御レジスタ名 ! 152: std::string ! 153: m88100disasm::crs() ! 154: { ! 155: uint32 cr = (opX >> 5) & 0x3f; ! 156: static const char *crnames[] = { ! 157: "pid", "psr", "epsr", "ssbr", // cr0..3 ! 158: "sxip", "snip", "sfip", "vbr", // cr4..7 ! 159: "dmt0", "dmd0", "dma0", // cr8..10 ! 160: "dmt1", "dmd1", "dma1", // cr11..13 ! 161: "dmt2", "dmd2", "dma2", // cr14..16 ! 162: "sr0," "sr1", "sr2", "sr3", // cr17..20 ! 163: }; ! 164: ! 165: if (cr < countof(crnames)) { ! 166: return std::string(crnames[cr]); ! 167: } else { ! 168: return string_format("cr%d", cr); // こうなのか? ! 169: } ! 170: } ! 171: ! 172: // FPU 制御レジスタ名 ! 173: std::string ! 174: m88100disasm::fcrs() ! 175: { ! 176: uint32 cr = (opX >> 5) & 0x3f; ! 177: static const char *fcrnames[] = { ! 178: "fpecr", // fcr0 ! 179: "fphs1", // fcr1 ! 180: "fpls1", // fcr2 ! 181: "fphs2", // fcr3 ! 182: "fpls2", // fcr4 ! 183: "fppt", // fcr5 ! 184: "fprh", // fcr6 ! 185: "fprl", // fcr7 ! 186: "fpit", // fcr8 ! 187: }; ! 188: if (cr < countof(fcrnames)) { ! 189: return std::string(fcrnames[cr]); ! 190: } else if (cr == 62) { ! 191: return "fpsr"; ! 192: } else if (cr == 63) { ! 193: return "fpcr"; ! 194: } else { ! 195: return string_format("fcr%d", cr); ! 196: } ! 197: } ! 198: ! 199: #define TD (5) ! 200: #define T1 (9) ! 201: #define T2 (7) ! 202: ! 203: // FPU サイズサフィックス t は TD、T1、T2 ! 204: std::string ! 205: m88100disasm::fsize(uint32 t) ! 206: { ! 207: uint32 sz = (opX >> t) & 3; ! 208: return sz == 1 ? "d" : "s"; ! 209: } ! 210: ! 211: // FPU サイズサフィックス (全部入り) ! 212: std::string ! 213: m88100disasm::fsize() ! 214: { ! 215: return fsize(TD) + fsize(T1) + fsize(T2); ! 216: } ! 217: ! 218: // "Width<Offset>" ! 219: std::string ! 220: m88100disasm::wo5() ! 221: { ! 222: uint32 w5 = W5 ?: 32; ! 223: uint32 o5 = O5; ! 224: return string_format("%d<%d>", w5, o5); ! 225: } ! 226: ! 227: // キャリーサフィックス ! 228: std::string ! 229: m88100disasm::cio() ! 230: { ! 231: uint32 c = (opX >> 8) & 3; ! 232: static const char *carrystr[] = { ! 233: "", ! 234: ".ci", ! 235: ".co", ! 236: ".cio", ! 237: }; ! 238: return std::string(carrystr[c]); ! 239: } ! 240: ! 241: std::string ! 242: m88100disasm::b5() ! 243: { ! 244: return string_format("#%d", B5); ! 245: } ! 246: ! 247: std::string ! 248: m88100disasm::m5() ! 249: { ! 250: uint32 m = M5; ! 251: switch (m) { ! 252: case 0x02: return "eq0"; ! 253: case 0x0d: return "ne0"; ! 254: case 0x01: return "gt0"; ! 255: case 0x0c: return "lt0"; ! 256: case 0x03: return "ge0"; ! 257: case 0x0e: return "le0"; ! 258: default: ! 259: break; ! 260: } ! 261: return string_format("0x%02x", m); // ? ! 262: } ! 263: ! 264: std::string ! 265: m88100disasm::vec9() ! 266: { ! 267: return string_format("#0x%03x", VEC9); ! 268: } ! 269: ! 270: // エミュレータ的未実装 (最終的にはなくなる) ! 271: void ! 272: m88100disasm::op_unimpl() ! 273: { ! 274: name = "unimplemented"; ! 275: } ! 276: ! 277: // 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 278: OP_DEF(xmem_bu_imm) ! 279: { ! 280: name = "xmem.bu"; ! 281: arg0 = rd(); ! 282: arg1 = rs1(); ! 283: arg2 = imm16(); ! 284: } ! 285: ! 286: // 000001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 287: OP_DEF(xmem_w_imm) ! 288: { ! 289: name = "xmem"; ! 290: arg0 = rd(); ! 291: arg1 = rs1(); ! 292: arg2 = imm16(); ! 293: } ! 294: ! 295: // 000010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 296: OP_DEF(ld_hu_imm) ! 297: { ! 298: name = "ld.hu"; ! 299: arg0 = rd(); ! 300: arg1 = rs1(); ! 301: arg2 = imm16(); ! 302: } ! 303: ! 304: // 000011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 305: OP_DEF(ld_bu_imm) ! 306: { ! 307: name = "ld.bu"; ! 308: arg0 = rd(); ! 309: arg1 = rs1(); ! 310: arg2 = imm16(); ! 311: } ! 312: ! 313: // 000100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 314: OP_DEF(ld_d_imm) ! 315: { ! 316: name = "ld.d"; ! 317: arg0 = rd(); ! 318: arg1 = rs1(); ! 319: arg2 = imm16(); ! 320: } ! 321: ! 322: // 000101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 323: OP_DEF(ld_w_imm) ! 324: { ! 325: name = "ld"; ! 326: arg0 = rd(); ! 327: arg1 = rs1(); ! 328: arg2 = imm16(); ! 329: } ! 330: ! 331: // 000110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 332: OP_DEF(ld_h_imm) ! 333: { ! 334: name = "ld.h"; ! 335: arg0 = rd(); ! 336: arg1 = rs1(); ! 337: arg2 = imm16(); ! 338: } ! 339: ! 340: // 000111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 341: OP_DEF(ld_b_imm) ! 342: { ! 343: name = "ld.b"; ! 344: arg0 = rd(); ! 345: arg1 = rs1(); ! 346: arg2 = imm16(); ! 347: } ! 348: ! 349: // 001000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 350: OP_DEF(st_d_imm) ! 351: { ! 352: name = "st.d"; ! 353: arg0 = rd(); ! 354: arg1 = rs1(); ! 355: arg2 = imm16(); ! 356: } ! 357: ! 358: // 001001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 359: OP_DEF(st_w_imm) ! 360: { ! 361: name = "st"; ! 362: arg0 = rd(); ! 363: arg1 = rs1(); ! 364: arg2 = imm16(); ! 365: } ! 366: ! 367: // 001010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 368: OP_DEF(st_h_imm) ! 369: { ! 370: name = "st.h"; ! 371: arg0 = rd(); ! 372: arg1 = rs1(); ! 373: arg2 = imm16(); ! 374: } ! 375: ! 376: // 001011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 377: OP_DEF(st_b_imm) ! 378: { ! 379: name = "st.b"; ! 380: arg0 = rd(); ! 381: arg1 = rs1(); ! 382: arg2 = imm16(); ! 383: } ! 384: ! 385: // 001100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 386: OP_DEF(lda_d_imm) ! 387: { ! 388: name = "lda.d"; ! 389: arg0 = rd(); ! 390: arg1 = rs1(); ! 391: arg2 = imm16(); ! 392: } ! 393: ! 394: // 001101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 395: OP_DEF(lda_w_imm) ! 396: { ! 397: name = "lda"; ! 398: arg0 = rd(); ! 399: arg1 = rs1(); ! 400: arg2 = imm16(); ! 401: } ! 402: ! 403: // 001110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 404: OP_DEF(lda_h_imm) ! 405: { ! 406: name = "lda.h"; ! 407: arg0 = rd(); ! 408: arg1 = rs1(); ! 409: arg2 = imm16(); ! 410: } ! 411: ! 412: // 001111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 413: OP_DEF(lda_b_imm) ! 414: { ! 415: name = "lda.b"; ! 416: arg0 = rd(); ! 417: arg1 = rs1(); ! 418: arg2 = imm16(); ! 419: } ! 420: ! 421: // 010000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 422: OP_DEF(and_imm) ! 423: { ! 424: name = "and"; ! 425: arg0 = rd(); ! 426: arg1 = rs1(); ! 427: arg2 = imm16(); ! 428: } ! 429: ! 430: // 010001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 431: OP_DEF(and_u_imm) ! 432: { ! 433: name = "and.u"; ! 434: arg0 = rd(); ! 435: arg1 = rs1(); ! 436: arg2 = imm16(); ! 437: } ! 438: ! 439: // 010010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 440: OP_DEF(mask_imm) ! 441: { ! 442: name = "mask"; ! 443: arg0 = rd(); ! 444: arg1 = rs1(); ! 445: arg2 = imm16(); ! 446: } ! 447: ! 448: // 010011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 449: OP_DEF(mask_u_imm) ! 450: { ! 451: name = "mask.u"; ! 452: arg0 = rd(); ! 453: arg1 = rs1(); ! 454: arg2 = imm16(); ! 455: } ! 456: ! 457: // 010100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 458: OP_DEF(xor_imm) ! 459: { ! 460: name = "xor"; ! 461: arg0 = rd(); ! 462: arg1 = rs1(); ! 463: arg2 = imm16(); ! 464: } ! 465: ! 466: // 010101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 467: OP_DEF(xor_u_imm) ! 468: { ! 469: name = "xor.u"; ! 470: arg0 = rd(); ! 471: arg1 = rs1(); ! 472: arg2 = imm16(); ! 473: } ! 474: ! 475: // 010110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 476: OP_DEF(or_imm) ! 477: { ! 478: name = "or"; ! 479: arg0 = rd(); ! 480: arg1 = rs1(); ! 481: arg2 = imm16(); ! 482: } ! 483: ! 484: // 010111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 485: OP_DEF(or_u_imm) ! 486: { ! 487: name = "or.u"; ! 488: arg0 = rd(); ! 489: arg1 = rs1(); ! 490: arg2 = imm16(); ! 491: } ! 492: ! 493: // 011000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 494: OP_DEF(addu_imm) ! 495: { ! 496: name = "addu"; ! 497: arg0 = rd(); ! 498: arg1 = rs1(); ! 499: arg2 = imm16(); ! 500: } ! 501: ! 502: // 011001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 503: OP_DEF(subu_imm) ! 504: { ! 505: name = "subu"; ! 506: arg0 = rd(); ! 507: arg1 = rs1(); ! 508: arg2 = imm16(); ! 509: } ! 510: ! 511: // 011010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 512: OP_DEF(divu_imm) ! 513: { ! 514: name = "divu"; ! 515: arg0 = rd(); ! 516: arg1 = rs1(); ! 517: arg2 = imm16(); ! 518: } ! 519: ! 520: // 011011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 521: OP_DEF(mul_imm) ! 522: { ! 523: name = "mul"; ! 524: arg0 = rd(); ! 525: arg1 = rs1(); ! 526: arg2 = imm16(); ! 527: } ! 528: ! 529: // 011100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 530: OP_DEF(add_imm) ! 531: { ! 532: name = "add"; ! 533: arg0 = rd(); ! 534: arg1 = rs1(); ! 535: arg2 = imm16(); ! 536: } ! 537: ! 538: // 011101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 539: OP_DEF(sub_imm) ! 540: { ! 541: name = "sub"; ! 542: arg0 = rd(); ! 543: arg1 = rs1(); ! 544: arg2 = imm16(); ! 545: } ! 546: ! 547: // 011110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 548: OP_DEF(div_imm) ! 549: { ! 550: name = "div"; ! 551: arg0 = rd(); ! 552: arg1 = rs1(); ! 553: arg2 = imm16(); ! 554: } ! 555: ! 556: // 011111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn ! 557: OP_DEF(cmp_imm) ! 558: { ! 559: name = "cmp"; ! 560: arg0 = rd(); ! 561: arg1 = rs1(); ! 562: arg2 = imm16(); ! 563: } ! 564: ! 565: // 100000_DDDDDzzzzz_01000n_nnnnnzzzzz ! 566: OP_DEF(ldcr) ! 567: { ! 568: name = "ldcr"; ! 569: arg0 = rd(); ! 570: arg1 = crs(); ! 571: } ! 572: ! 573: // 100000_DDDDDzzzzz_01001n_nnnnnzzzzz ! 574: OP_DEF(fldcr) ! 575: { ! 576: name = "fldcr"; ! 577: arg0 = rd(); ! 578: arg1 = fcrs(); ! 579: } ! 580: ! 581: // 100000_zzzzzSSSSS_10000n_nnnnnsssss ! 582: OP_DEF(stcr) ! 583: { ! 584: uint32 s1 = (opX >> 16) & 0x1f; ! 585: uint32 s2 = (opX ) & 0x1f; ! 586: if (s1 == s2) { ! 587: name = "stcr"; ! 588: arg1 = rs1(); ! 589: arg2 = crs(); ! 590: } else { ! 591: // どうすべ ! 592: OP_FUNC(unimpl); ! 593: } ! 594: } ! 595: ! 596: // 100000_zzzzzSSSSS_10001n_nnnnnsssss ! 597: OP_DEF(fstcr) ! 598: { ! 599: uint32 s1 = (opX >> 16) & 0x1f; ! 600: uint32 s2 = (opX ) & 0x1f; ! 601: if (s1 == s2) { ! 602: name = "fstcr"; ! 603: arg1 = rs1(); ! 604: arg2 = fcrs(); ! 605: } else { ! 606: // どうすべ ! 607: OP_FUNC(unimpl); ! 608: } ! 609: } ! 610: ! 611: // 100000_DDDDDSSSSS_11000n_nnnnnsssss ! 612: OP_DEF(xcr) ! 613: { ! 614: uint32 s1 = (opX >> 16) & 0x1f; ! 615: uint32 s2 = (opX ) & 0x1f; ! 616: if (s1 == s2) { ! 617: name = "xcr"; ! 618: arg0 = rd(); ! 619: arg1 = rs1(); ! 620: arg2 = fcrs(); ! 621: } else { ! 622: // どうすべ ! 623: OP_FUNC(unimpl); ! 624: } ! 625: } ! 626: ! 627: // 100000_DDDDDSSSSS_11001n_nnnnnsssss ! 628: OP_DEF(fxcr) ! 629: { ! 630: uint32 s1 = (opX >> 16) & 0x1f; ! 631: uint32 s2 = (opX ) & 0x1f; ! 632: if (s1 == s2) { ! 633: name = "fxcr"; ! 634: arg0 = rd(); ! 635: arg1 = rs1(); ! 636: arg2 = fcrs(); ! 637: } else { ! 638: // どうすべ ! 639: OP_FUNC(unimpl); ! 640: } ! 641: } ! 642: ! 643: // 100001_DDDDDSSSSS_00000n_nnnnnsssss ! 644: OP_DEF(fmul) ! 645: { ! 646: name = "fmul." + fsize(); ! 647: arg0 = rd(); ! 648: arg1 = rs1(); ! 649: arg2 = rs2(); ! 650: } ! 651: ! 652: // 100001_DDDDD00000_001000_000nnsssss ! 653: OP_DEF(flt) ! 654: { ! 655: name = "flt." + fsize(TD) + "s"; ! 656: arg0 = rd(); ! 657: arg2 = rs2(); ! 658: } ! 659: ! 660: // 100001_DDDDDSSSSS_00101n_nnnnnsssss ! 661: OP_DEF(fadd) ! 662: { ! 663: name = "fadd." + fsize(); ! 664: arg0 = rd(); ! 665: arg1 = rs1(); ! 666: arg2 = rs2(); ! 667: } ! 668: ! 669: // 100001_DDDDDSSSSS_00110n_nnnnnsssss ! 670: OP_DEF(fsub) ! 671: { ! 672: name = "fsub." + fsize(); ! 673: arg0 = rd(); ! 674: arg1 = rs1(); ! 675: arg2 = rs2(); ! 676: } ! 677: ! 678: // 100001_DDDDDSSSSS_00111n_nnnnnsssss ! 679: OP_DEF(fcmp) ! 680: { ! 681: name = "fcmp.s" + fsize(T1) + fsize(T2); ! 682: arg0 = rd(); ! 683: arg1 = rs1(); ! 684: arg2 = rs2(); ! 685: } ! 686: ! 687: // 100001_DDDDD00000_010010_0nn00sssss ! 688: OP_DEF(int) ! 689: { ! 690: name = "int.s" + fsize(T2); ! 691: arg0 = rd(); ! 692: arg1 = rs2(); ! 693: } ! 694: ! 695: // 100001_DDDDD00000_010100_0nn00sssss ! 696: OP_DEF(nint) ! 697: { ! 698: name = "nint.s" + fsize(T2); ! 699: arg0 = rd(); ! 700: arg1 = rs2(); ! 701: } ! 702: ! 703: // 100001_DDDDD00000_010110_0nn00sssss ! 704: OP_DEF(trnc) ! 705: { ! 706: name = "trnc.s" + fsize(T2); ! 707: arg0 = rd(); ! 708: arg2 = rs2(); ! 709: } ! 710: ! 711: // 100001_DDDDDSSSSS_01110n_nnnnnsssss ! 712: OP_DEF(fdiv) ! 713: { ! 714: name = "fdiv." + fsize(); ! 715: arg0 = rd(); ! 716: arg1 = rs1(); ! 717: arg2 = rs2(); ! 718: } ! 719: ! 720: // 110000_nnnnnnnnnn_nnnnnn_nnnnnnnnnn ! 721: OP_DEF(br) ! 722: { ! 723: name = "br"; ! 724: arg0 = string_format("%08x", xip + D26); ! 725: } ! 726: ! 727: // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn ! 728: OP_DEF(br_n) ! 729: { ! 730: name = "br.n"; ! 731: arg0 = string_format("%08x", xip + D26); ! 732: } ! 733: ! 734: // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn ! 735: OP_DEF(bsr) ! 736: { ! 737: name = "bsr"; ! 738: arg0 = string_format("%08x", xip + D26); ! 739: } ! 740: ! 741: // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn ! 742: OP_DEF(bsr_n) ! 743: { ! 744: name = "bsr.n"; ! 745: arg0 = string_format("%08x", xip + D26); ! 746: } ! 747: ! 748: // bb の共通部 ! 749: void ! 750: m88100disasm::ops_bb(std::string namebase) ! 751: { ! 752: name = namebase; ! 753: arg0 = b5(); ! 754: arg1 = rs1(); ! 755: arg2 = d16(); ! 756: } ! 757: ! 758: // 110100_nnnnnSSSSS_nnnnnn_nnnnnnnnnn ! 759: OP_DEF(bb0) ! 760: { ! 761: ops_bb("bb0"); ! 762: } ! 763: ! 764: // 110101_nnnnnSSSSS_nnnnnn_nnnnnnnnnn ! 765: OP_DEF(bb0_n) ! 766: { ! 767: ops_bb("bb0.n"); ! 768: } ! 769: ! 770: // 110110_nnnnnSSSSS_nnnnnn_nnnnnnnnnn ! 771: OP_DEF(bb1) ! 772: { ! 773: ops_bb("bb1"); ! 774: } ! 775: ! 776: // 110111_nnnnnSSSSS_nnnnnn_nnnnnnnnnn ! 777: OP_DEF(bb1_n) ! 778: { ! 779: ops_bb("bb1.n"); ! 780: } ! 781: ! 782: void ! 783: m88100disasm::ops_bcnd(std::string namebase) ! 784: { ! 785: name = namebase; ! 786: arg0 = m5(); ! 787: arg1 = rs1(); ! 788: arg2 = d16(); ! 789: } ! 790: ! 791: // 111010_MMMMMSSSSS_nnnnnn_nnnnnnnnnn ! 792: OP_DEF(bcnd) ! 793: { ! 794: ops_bcnd("bcnd"); ! 795: } ! 796: ! 797: // 111011_MMMMMSSSSS_nnnnnn_nnnnnnnnnn ! 798: OP_DEF(bcnd_n) ! 799: { ! 800: ops_bcnd("bcnd.n"); ! 801: } ! 802: ! 803: // 111100_DDDDDSSSSS_100000_wwwwwooooo ! 804: OP_DEF(clr_1) ! 805: { ! 806: name = "clr"; ! 807: arg0 = rd(); ! 808: arg1 = rs1(); ! 809: arg2 = wo5(); ! 810: } ! 811: ! 812: // 111100_DDDDDSSSSS_100010_wwwwwooooo ! 813: OP_DEF(set_1) ! 814: { ! 815: name = "set"; ! 816: arg0 = rd(); ! 817: arg1 = rs1(); ! 818: arg2 = wo5(); ! 819: } ! 820: ! 821: // 111100_DDDDDSSSSS_100100_wwwwwooooo ! 822: OP_DEF(ext_1) ! 823: { ! 824: name = "ext"; ! 825: arg0 = rd(); ! 826: arg1 = rs1(); ! 827: arg2 = wo5(); ! 828: } ! 829: ! 830: // 111100_DDDDDSSSSS_100110_wwwwwooooo ! 831: OP_DEF(extu_1) ! 832: { ! 833: name = "extu"; ! 834: arg0 = rd(); ! 835: arg1 = rs1(); ! 836: arg2 = wo5(); ! 837: } ! 838: ! 839: // 111100_DDDDDSSSSS_101000_wwwwwooooo ! 840: OP_DEF(mak_1) ! 841: { ! 842: name = "mak"; ! 843: arg0 = rd(); ! 844: arg1 = rs1(); ! 845: arg2 = wo5(); ! 846: } ! 847: ! 848: // 111100_DDDDDSSSSS_101010_zzzzzooooo ! 849: OP_DEF(rot_1) ! 850: { ! 851: name = "rot"; ! 852: arg0 = rd(); ! 853: arg1 = rs1(); ! 854: arg2 = string_format("<%d>", O5); ! 855: } ! 856: ! 857: void ! 858: m88100disasm::ops_tb(std::string namebase) ! 859: { ! 860: name = namebase; ! 861: arg0 = b5(); ! 862: arg1 = rs1(); ! 863: arg2 = vec9(); ! 864: } ! 865: ! 866: // 111100_bbbbbSSSSS_110100_0vvvvvvvvv ! 867: OP_DEF(tb0) ! 868: { ! 869: ops_tb("tb0"); ! 870: } ! 871: ! 872: // 111100_bbbbbSSSSS_110110_0vvvvvvvvv ! 873: OP_DEF(tb1) ! 874: { ! 875: ops_tb("tb1"); ! 876: } ! 877: ! 878: // 111100_MMMMMSSSSS_111010_0vvvvvvvvv ! 879: OP_DEF(tcnd) ! 880: { ! 881: name = "tcnd"; ! 882: arg0 = m5(); ! 883: arg1 = rs1(); ! 884: arg2 = vec9(); ! 885: } ! 886: ! 887: // ld_reg, st_reg, xmem_reg の共通部 ! 888: void ! 889: m88100disasm::ops_ldst_reg(std::string namebase) ! 890: { ! 891: uint32 u = (opX >> 8) & 1; ! 892: uint32 scaled = (opX >> 9) & 1; ! 893: ! 894: name = namebase; ! 895: if (u) { ! 896: name += ".usr"; ! 897: } ! 898: arg0 = rd(); ! 899: arg1 = rs1(); ! 900: if (scaled == 0) { ! 901: arg2 = rs2(); ! 902: } else { ! 903: arg1 += "[" + rs2() + "]"; ! 904: } ! 905: } ! 906: ! 907: // 111101_DDDDDSSSSS_000000_xU000sssss ! 908: OP_DEF(xmem_bu) ! 909: { ! 910: ops_ldst_reg("xmem.bu"); ! 911: } ! 912: ! 913: // 111101_DDDDDSSSSS_000001_xU000sssss ! 914: OP_DEF(xmem_w) ! 915: { ! 916: ops_ldst_reg("xmem"); ! 917: } ! 918: ! 919: // 111101_DDDDDSSSSS_000010_xU000sssss ! 920: OP_DEF(ld_hu) ! 921: { ! 922: ops_ldst_reg("ld.hu"); ! 923: } ! 924: ! 925: // 111101_DDDDDSSSSS_000011_xU000sssss ! 926: OP_DEF(ld_bu) ! 927: { ! 928: ops_ldst_reg("ld.bu"); ! 929: } ! 930: ! 931: // 111101_DDDDDSSSSS_000100_xU000sssss ! 932: OP_DEF(ld_d) ! 933: { ! 934: ops_ldst_reg("ld.d"); ! 935: } ! 936: ! 937: // 111101_DDDDDSSSSS_000101_xU000sssss ! 938: OP_DEF(ld_w) ! 939: { ! 940: ops_ldst_reg("ld"); ! 941: } ! 942: ! 943: // 111101_DDDDDSSSSS_000110_xU000sssss ! 944: OP_DEF(ld_h) ! 945: { ! 946: ops_ldst_reg("ld.h"); ! 947: } ! 948: ! 949: // 111101_DDDDDSSSSS_000111_xU000sssss ! 950: OP_DEF(ld_b) ! 951: { ! 952: ops_ldst_reg("ld.b"); ! 953: } ! 954: ! 955: // 111101_DDDDDSSSSS_001000_xU000sssss ! 956: OP_DEF(st_d) ! 957: { ! 958: ops_ldst_reg("st.d"); ! 959: } ! 960: ! 961: // 111101_DDDDDSSSSS_001001_xU000sssss ! 962: OP_DEF(st_w) ! 963: { ! 964: ops_ldst_reg("st"); ! 965: } ! 966: ! 967: // 111101_DDDDDSSSSS_001010_xU000sssss ! 968: OP_DEF(st_h) ! 969: { ! 970: ops_ldst_reg("st.h"); ! 971: } ! 972: ! 973: // 111101_DDDDDSSSSS_001011_xU000sssss ! 974: OP_DEF(st_b) ! 975: { ! 976: ops_ldst_reg("st.b"); ! 977: } ! 978: ! 979: // 111101_DDDDDSSSSS_001100_xU000sssss ! 980: OP_DEF(lda_d) ! 981: { ! 982: // XXX bit8 が 1 だとどうなるのか ! 983: ops_ldst_reg("lda.d"); ! 984: } ! 985: ! 986: // 111101_DDDDDSSSSS_001101_xU000sssss ! 987: OP_DEF(lda_w) ! 988: { ! 989: // XXX bit8 が 1 だとどうなるのか ! 990: ops_ldst_reg("lda"); ! 991: } ! 992: ! 993: // 111101_DDDDDSSSSS_001110_xU000sssss ! 994: OP_DEF(lda_h) ! 995: { ! 996: // XXX bit8 が 1 だとどうなるのか ! 997: ops_ldst_reg("lda.h"); ! 998: } ! 999: ! 1000: // 111101_DDDDDSSSSS_001111_xU000sssss ! 1001: OP_DEF(lda_b) ! 1002: { ! 1003: // XXX bit8 が 1 だとどうなるのか ! 1004: ops_ldst_reg("lda.b"); ! 1005: } ! 1006: ! 1007: // 111101_DDDDDSSSSS_010000_00000sssss ! 1008: OP_DEF(and) ! 1009: { ! 1010: name = "and"; ! 1011: arg0 = rd(); ! 1012: arg1 = rs1(); ! 1013: arg2 = rs2(); ! 1014: } ! 1015: ! 1016: // 111101_DDDDDSSSSS_010001_00000sssss ! 1017: OP_DEF(and_c) ! 1018: { ! 1019: name = "and.c"; ! 1020: arg0 = rd(); ! 1021: arg1 = rs1(); ! 1022: arg2 = rs2(); ! 1023: } ! 1024: ! 1025: // 111101_DDDDDSSSSS_010100_00000sssss ! 1026: OP_DEF(xor) ! 1027: { ! 1028: name = "xor"; ! 1029: arg0 = rd(); ! 1030: arg1 = rs1(); ! 1031: arg2 = rs2(); ! 1032: } ! 1033: ! 1034: // 111101_DDDDDSSSSS_010101_00000sssss ! 1035: OP_DEF(xor_c) ! 1036: { ! 1037: name = "xor.c"; ! 1038: arg0 = rd(); ! 1039: arg1 = rs1(); ! 1040: arg2 = rs2(); ! 1041: } ! 1042: ! 1043: // 111101_DDDDDSSSSS_010110_00000sssss ! 1044: OP_DEF(or) ! 1045: { ! 1046: name = "or"; ! 1047: arg0 = rd(); ! 1048: arg1 = rs1(); ! 1049: arg2 = rs2(); ! 1050: } ! 1051: ! 1052: // 111101_DDDDDSSSSS_010111_00000sssss ! 1053: OP_DEF(or_c) ! 1054: { ! 1055: name = "or.c"; ! 1056: arg0 = rd(); ! 1057: arg1 = rs1(); ! 1058: arg2 = rs2(); ! 1059: } ! 1060: ! 1061: // 111101_DDDDDSSSSS_011000_nn000sssss ! 1062: OP_DEF(addu) ! 1063: { ! 1064: name = "addu" + cio(); ! 1065: arg0 = rd(); ! 1066: arg1 = rs1(); ! 1067: arg2 = rs2(); ! 1068: } ! 1069: ! 1070: // 111101_DDDDDSSSSS_011001_nn000sssss ! 1071: OP_DEF(subu) ! 1072: { ! 1073: name = "subu" + cio(); ! 1074: arg0 = rd(); ! 1075: arg1 = rs1(); ! 1076: arg2 = rs2(); ! 1077: } ! 1078: ! 1079: // 111101_DDDDDSSSSS_011010_zz000sssss ! 1080: OP_DEF(divu) ! 1081: { ! 1082: name = "divu"; ! 1083: arg0 = rd(); ! 1084: arg1 = rs1(); ! 1085: arg2 = rs2(); ! 1086: } ! 1087: ! 1088: // 111101_DDDDDSSSSS_011011_zz000sssss ! 1089: OP_DEF(mul) ! 1090: { ! 1091: name = "mul"; ! 1092: arg0 = rd(); ! 1093: arg1 = rs1(); ! 1094: arg2 = rs2(); ! 1095: } ! 1096: ! 1097: // 111101_DDDDDSSSSS_011100_nn000sssss ! 1098: OP_DEF(add) ! 1099: { ! 1100: name = "add" + cio(); ! 1101: arg0 = rd(); ! 1102: arg1 = rs1(); ! 1103: arg2 = rs2(); ! 1104: } ! 1105: ! 1106: // 111101_DDDDDSSSSS_011101_nn000sssss ! 1107: OP_DEF(sub) ! 1108: { ! 1109: name = "sub" + cio(); ! 1110: arg0 = rd(); ! 1111: arg1 = rs1(); ! 1112: arg2 = rs2(); ! 1113: } ! 1114: ! 1115: // 111101_DDDDDSSSSS_011110_zz000sssss ! 1116: OP_DEF(div) ! 1117: { ! 1118: name = "div"; ! 1119: arg0 = rd(); ! 1120: arg1 = rs1(); ! 1121: arg2 = rs2(); ! 1122: } ! 1123: ! 1124: // 111101_DDDDDSSSSS_011111_zz000sssss ! 1125: OP_DEF(cmp) ! 1126: { ! 1127: name = "cmp"; ! 1128: arg0 = rd(); ! 1129: arg1 = rs1(); ! 1130: arg2 = rs2(); ! 1131: } ! 1132: ! 1133: // 111101_DDDDDSSSSS_100000_00000sssss ! 1134: OP_DEF(clr_2) ! 1135: { ! 1136: name = "clr"; ! 1137: arg0 = rd(); ! 1138: arg1 = rs1(); ! 1139: arg2 = rs2(); ! 1140: } ! 1141: ! 1142: // 111101_DDDDDSSSSS_100010_00000sssss ! 1143: OP_DEF(set_2) ! 1144: { ! 1145: name = "set"; ! 1146: arg0 = rd(); ! 1147: arg1 = rs1(); ! 1148: arg2 = rs2(); ! 1149: } ! 1150: ! 1151: // 111101_DDDDDSSSSS_100100_00000sssss ! 1152: OP_DEF(ext_2) ! 1153: { ! 1154: name = "ext"; ! 1155: arg0 = rd(); ! 1156: arg1 = rs1(); ! 1157: arg2 = rs2(); ! 1158: } ! 1159: ! 1160: // 111101_DDDDDSSSSS_100110_00000sssss ! 1161: OP_DEF(extu_2) ! 1162: { ! 1163: name = "extu"; ! 1164: arg0 = rd(); ! 1165: arg1 = rs1(); ! 1166: arg2 = rs2(); ! 1167: } ! 1168: ! 1169: // 111101_DDDDDSSSSS_101000_00000sssss ! 1170: OP_DEF(mak_2) ! 1171: { ! 1172: name = "mak"; ! 1173: arg0 = rd(); ! 1174: arg1 = rs1(); ! 1175: arg2 = rs2(); ! 1176: } ! 1177: ! 1178: // 111101_DDDDDSSSSS_101010_00000sssss ! 1179: OP_DEF(rot_2) ! 1180: { ! 1181: name = "rot"; ! 1182: arg0 = rd(); ! 1183: arg1 = rs1(); ! 1184: arg2 = rs2(); ! 1185: } ! 1186: ! 1187: // 111101_zzzzzzzzzz_110000_00000sssss ! 1188: OP_DEF(jmp) ! 1189: { ! 1190: name = "jmp"; ! 1191: arg0 = rs2(); ! 1192: } ! 1193: ! 1194: // 111101_zzzzzzzzzz_110001_00000sssss ! 1195: OP_DEF(jmp_n) ! 1196: { ! 1197: name = "jmp.n"; ! 1198: arg0 = rs2(); ! 1199: } ! 1200: ! 1201: // 111101_zzzzzzzzzz_110010_00000sssss ! 1202: OP_DEF(jsr) ! 1203: { ! 1204: name = "jsr"; ! 1205: arg0 = rs2(); ! 1206: } ! 1207: ! 1208: // 111101_zzzzzzzzzz_110011_00000sssss ! 1209: OP_DEF(jsr_n) ! 1210: { ! 1211: name = "jsr.n"; ! 1212: arg0 = rs2(); ! 1213: } ! 1214: ! 1215: // 111101_zzzzzzzzzz_111111_0000000000 ! 1216: OP_DEF(rte) ! 1217: { ! 1218: name = "rte"; ! 1219: } ! 1220: ! 1221: // 111101_zzzzzSSSSS_111110_00000SSSSS ! 1222: OP_DEF(tbnd_1) ! 1223: { ! 1224: name = "tbnd"; ! 1225: arg1 = rs1(); ! 1226: arg2 = rs2(); ! 1227: } ! 1228: ! 1229: // 111110_zzzzzSSSSS_nnnnnn_nnnnnnnnnn ! 1230: OP_DEF(tbnd_2) ! 1231: { ! 1232: name = "tbnd"; ! 1233: arg1 = rs1(); ! 1234: arg2 = imm16(); ! 1235: } ! 1236: ! 1237: // 111111_zzzzzzzzzz_000011_zzzzzzzzzz ! 1238: OP_DEF(getc) ! 1239: { ! 1240: name = "getc-emulator"; ! 1241: } ! 1242: ! 1243: // 111111_zzzzzzzzzz_000100_zzzzzzzzzz ! 1244: OP_DEF(putc) ! 1245: { ! 1246: name = "putc-emulator"; ! 1247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.