Annotation of nono/m88xx0/m88100disasm.cpp, revision 1.1.1.6

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.