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

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

unix.superglobalmegacorp.com

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