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

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

unix.superglobalmegacorp.com

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