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

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: }

unix.superglobalmegacorp.com

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