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

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

unix.superglobalmegacorp.com

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