Annotation of nono/m88xx0/testdis.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2020 nono project
        !             4: // Licensed under nono-license.txt
        !             5: //
        !             6: 
        !             7: #include "m88100disasm.h"
        !             8: #include "mystring.h"
        !             9: 
        !            10: struct {
        !            11:        uint32 inst;
        !            12:        std::string expected;
        !            13: } table[] = {
        !            14:  { 0x02328765, "xmem.bu r17,r18,#0x8765" },
        !            15:  { 0x06328765, "xmem    r17,r18,#0x8765" },
        !            16:  { 0x0a328765, "ld.hu   r17,r18,#0x8765" },
        !            17:  { 0x0e328765, "ld.bu   r17,r18,#0x8765" },
        !            18:  { 0x12328765, "ld.d    r17,r18,#0x8765" },
        !            19:  { 0x16328765, "ld      r17,r18,#0x8765" },
        !            20:  { 0x1a328765, "ld.h    r17,r18,#0x8765" },
        !            21:  { 0x1e328765, "ld.b    r17,r18,#0x8765" },
        !            22:  { 0x22328765, "st.d    r17,r18,#0x8765" },
        !            23:  { 0x26328765, "st      r17,r18,#0x8765" },
        !            24:  { 0x2a328765, "st.h    r17,r18,#0x8765" },
        !            25:  { 0x2e328765, "st.b    r17,r18,#0x8765" },
        !            26:  { 0x32328765, "lda.d   r17,r18,#0x8765" },
        !            27:  { 0x36328765, "lda     r17,r18,#0x8765" },
        !            28:  { 0x3a328765, "lda.h   r17,r18,#0x8765" },
        !            29:  { 0x3e328765, "lda.b   r17,r18,#0x8765" },
        !            30: 
        !            31:  { 0x42328765, "and     r17,r18,#0x8765" },
        !            32:  { 0x46328765, "and.u   r17,r18,#0x8765" },
        !            33:  { 0x4a328765, "mask    r17,r18,#0x8765" },
        !            34:  { 0x4e328765, "mask.u  r17,r18,#0x8765" },
        !            35:  { 0x52328765, "xor     r17,r18,#0x8765" },
        !            36:  { 0x56328765, "xor.u   r17,r18,#0x8765" },
        !            37:  { 0x5a328765, "or      r17,r18,#0x8765" },
        !            38:  { 0x5e328765, "or.u    r17,r18,#0x8765" },
        !            39: 
        !            40:  { 0x62328765, "addu    r17,r18,#0x8765" },
        !            41:  { 0x66328765, "subu    r17,r18,#0x8765" },
        !            42:  { 0x6a328765, "divu    r17,r18,#0x8765" },
        !            43:  { 0x6e328765, "mul     r17,r18,#0x8765" },
        !            44:  { 0x72328765, "add     r17,r18,#0x8765" },
        !            45:  { 0x76328765, "sub     r17,r18,#0x8765" },
        !            46:  { 0x7a328765, "div     r17,r18,#0x8765" },
        !            47:  { 0x7e328765, "cmp     r17,r18,#0x8765" },
        !            48: 
        !            49:  { 0x82204260, "ldcr    r17,sr2" },
        !            50:  { 0x82204fe0, "fldcr   r17,fpcr" },
        !            51:  { 0x80118271, "stcr    r17,sr2" },
        !            52:  { 0x80118ff1, "fstcr   r17,fpcr" },
        !            53:  { 0x8232c272, "xcr     r17,r18,sr2" },
        !            54:  { 0x8232cff2, "fxcr    r17,r18,fpcr" },
        !            55: 
        !            56:  { 0x86320001, "fmul.sss r17,r18,r1" },
        !            57:  { 0x86202001, "flt.ss  r17,r1" },
        !            58:  { 0x86322801, "fadd.sss r17,r18,r1" },
        !            59:  { 0x86323001, "fsub.sss r17,r18,r1" },
        !            60:  { 0x86323801, "fcmp.sss r17,r18,r1" },
        !            61:  { 0x86204801, "int.ss  r17,r1" },
        !            62:  { 0x86205001, "nint.ss r17,r1" },
        !            63:  { 0x86205801, "trnc.ss r17,r1" },
        !            64:  { 0x86327001, "fdiv.sss r17,r18,r1" },
        !            65:  // fmul のサイズ
        !            66:  { 0x86320021, "fmul.dss r17,r18,r1" },
        !            67:  { 0x86320081, "fmul.ssd r17,r18,r1" },
        !            68:  { 0x863200a1, "fmul.dsd r17,r18,r1" },
        !            69:  { 0x86320201, "fmul.sds r17,r18,r1" },
        !            70:  { 0x86320221, "fmul.dds r17,r18,r1" },
        !            71:  { 0x86320281, "fmul.sdd r17,r18,r1" },
        !            72:  { 0x863202a1, "fmul.ddd r17,r18,r1" },
        !            73: 
        !            74:  { 0xc3ffffff, "br      0x000000fc" },
        !            75:  { 0xc7ffffff, "br.n    0x000000fc" },
        !            76:  { 0xcbffffff, "bsr     0x000000fc" },
        !            77:  { 0xcfffffff, "bsr.n   0x000000fc" },
        !            78:  { 0xd232ffff, "bb0     #17,r18,0x000000fc" },
        !            79:  { 0xd632ffff, "bb0.n   #17,r18,0x000000fc" },
        !            80:  { 0xda32ffff, "bb1     #17,r18,0x000000fc" },
        !            81:  { 0xde32ffff, "bb1.n   #17,r18,0x000000fc" },
        !            82:  { 0xe852ffff, "bcnd    eq0,r18,0x000000fc" },
        !            83:  { 0xec52ffff, "bcnd.n  eq0,r18,0x000000fc" },
        !            84:  // bcnd の M5
        !            85:  { 0xe9b2ffff, "bcnd    ne0,r18,0x000000fc" },
        !            86:  { 0xe832ffff, "bcnd    gt0,r18,0x000000fc" },
        !            87:  { 0xe992ffff, "bcnd    lt0,r18,0x000000fc" },
        !            88:  { 0xe872ffff, "bcnd    ge0,r18,0x000000fc" },
        !            89:  { 0xe9d2ffff, "bcnd    le0,r18,0x000000fc" },
        !            90: 
        !            91:  { 0xf2328274, "clr     r17,r18,19<20>" },
        !            92:  { 0xf2328a74, "set     r17,r18,19<20>" },
        !            93:  { 0xf2329274, "ext     r17,r18,19<20>" },
        !            94:  { 0xf2329a74, "extu    r17,r18,19<20>" },
        !            95:  { 0xf232a274, "mak     r17,r18,19<20>" },
        !            96:  { 0xf232a814, "rot     r17,r18,<20>" },
        !            97: 
        !            98:  { 0xf232d101, "tb0     #17,r18,#0x101" },
        !            99:  { 0xf232d901, "tb1     #17,r18,#0x101" },
        !           100:  { 0xf052e901, "tcnd    eq0,r18,#0x101" },
        !           101: 
        !           102:  { 0xf6320001, "xmem.bu r17,r18,r1" },
        !           103:  { 0xf6320401, "xmem    r17,r18,r1" },
        !           104:  { 0xf6320801, "ld.hu   r17,r18,r1" },
        !           105:  { 0xf6320c01, "ld.bu   r17,r18,r1" },
        !           106:  { 0xf6321001, "ld.d    r17,r18,r1" },
        !           107:  { 0xf6321401, "ld      r17,r18,r1" },
        !           108:  { 0xf6321801, "ld.h    r17,r18,r1" },
        !           109:  { 0xf6321c01, "ld.b    r17,r18,r1" },
        !           110:  { 0xf6322001, "st.d    r17,r18,r1" },
        !           111:  { 0xf6322401, "st      r17,r18,r1" },
        !           112:  { 0xf6322801, "st.h    r17,r18,r1" },
        !           113:  { 0xf6322c01, "st.b    r17,r18,r1" },
        !           114:  // 全種について全引数パターンはつらいので ld だけで引数を変える
        !           115:  { 0xf6321000, "ld.d    r17,r18,r0" },
        !           116:  { 0xf6321200, "ld.d    r17,r18[r0]" },
        !           117:  { 0xf6201001, "ld.d    r17,r0, r1" },
        !           118:  { 0xf6321001, "ld.d    r17,r18,r1" },
        !           119:  { 0xf6201201, "ld.d    r17,r0[r1]" },
        !           120:  { 0xf6321201, "ld.d    r17,r18[r1]" },
        !           121:  // .usr も一部代表だけ
        !           122:  { 0xf6321101, "ld.d.usr r17,r18,r1" },
        !           123:  { 0xf6321401, "ld      r17,r18,r1" },
        !           124:  { 0xf6321501, "ld.usr  r17,r18,r1" },
        !           125:  // lda
        !           126:  { 0xf6323001, "lda.d   r17,r18,r1" },
        !           127:  { 0xf6323401, "lda     r17,r18,r1" },
        !           128:  { 0xf6323801, "lda.h   r17,r18,r1" },
        !           129:  { 0xf6323c01, "lda.b   r17,r18,r1" },
        !           130: 
        !           131:  { 0xf6324001, "and     r17,r18,r1" },
        !           132:  { 0xf6324401, "and.c   r17,r18,r1" },
        !           133:  { 0xf6325001, "xor     r17,r18,r1" },
        !           134:  { 0xf6325401, "xor.c   r17,r18,r1" },
        !           135:  { 0xf6325801, "or      r17,r18,r1" },
        !           136:  { 0xf6325c01, "or.c    r17,r18,r1" },
        !           137:  { 0xf6326001, "addu    r17,r18,r1" },
        !           138:  { 0xf6326101, "addu.co r17,r18,r1" },
        !           139:  { 0xf6326201, "addu.ci r17,r18,r1" },
        !           140:  { 0xf6326301, "addu.cio r17,r18,r1" },
        !           141:  { 0xf6326401, "subu    r17,r18,r1" },
        !           142:  { 0xf6326801, "divu    r17,r18,r1" },
        !           143:  { 0xf6326401, "subu    r17,r18,r1" },
        !           144:  { 0xf6326801, "divu    r17,r18,r1" },
        !           145:  { 0xf6326c01, "mul     r17,r18,r1" },
        !           146:  { 0xf6327001, "add     r17,r18,r1" },
        !           147:  { 0xf6327401, "sub     r17,r18,r1" },
        !           148:  { 0xf6327801, "div     r17,r18,r1" },
        !           149:  { 0xf6327c01, "cmp     r17,r18,r1" },
        !           150: 
        !           151:  { 0xf6328001, "clr     r17,r18,r1" },
        !           152:  { 0xf6328801, "set     r17,r18,r1" },
        !           153:  { 0xf6329001, "ext     r17,r18,r1" },
        !           154:  { 0xf6329801, "extu    r17,r18,r1" },
        !           155:  { 0xf632a001, "mak     r17,r18,r1" },
        !           156:  { 0xf632a801, "rot     r17,r18,r1" },
        !           157: 
        !           158:  { 0xf400c011, "jmp     r17" },
        !           159:  { 0xf400c411, "jmp.n   r17" },
        !           160:  { 0xf400c811, "jsr     r17" },
        !           161:  { 0xf400cc11, "jsr.n   r17" },
        !           162: 
        !           163:  { 0xf620e801, "ff1     r17,r1" },
        !           164:  { 0xf620ec01, "ff0     r17,r1" },
        !           165: 
        !           166:  { 0xf400fc00, "rte" },
        !           167:  { 0xf411f801, "tbnd    r17,r1" },
        !           168:  { 0xf8118765, "tbnd    r17,#0x8765" },
        !           169: };
        !           170: 
        !           171: static uint8 ram[1024];
        !           172: static int failed;
        !           173: 
        !           174: uint64
        !           175: vm_phys_peek_8(uint32 addr)
        !           176: {
        !           177:        assertmsg(addr < sizeof(ram), "addr=0x%x", addr);
        !           178: 
        !           179:        // XXX endian
        !           180:        return ram[addr ^ 1];
        !           181: }
        !           182: 
        !           183: // リンカを通すためのダミー
        !           184: Disasm::~Disasm() { }
        !           185: DebuggerMD::~DebuggerMD() { }
        !           186: 
        !           187: int
        !           188: main(int ac, char *av[])
        !           189: {
        !           190:        saddr_t saddr;
        !           191: 
        !           192:        // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
        !           193:        // 中でアクセスする変数だけ強引に用意する。
        !           194:        DebuggerMD *md = (DebuggerMD *)malloc(sizeof(DebuggerMD));
        !           195:        md->inst_bytes = 4;
        !           196: 
        !           197:        for (int i = 0; i < countof(table); i++) {
        !           198:                std::string expected = table[i].expected;
        !           199:                uint32 inst = table[i].inst;
        !           200: 
        !           201:                // エラー表示用
        !           202:                std::string inst_str = string_format("%08x", inst);
        !           203: 
        !           204:                // 全体を初期化
        !           205:                memset(ram, 0xdd, sizeof(ram));
        !           206:                // 100番地に命令列を書き込む
        !           207:                *(uint16 *)(ram + 0x100) = inst >> 16;
        !           208:                *(uint16 *)(ram + 0x102) = inst & 0xffff;
        !           209:                // 検査
        !           210:                saddr = 0x100;
        !           211:                DebuggerMemoryStream mem(md, saddr, MemoryMode::Physical);
        !           212:                m88100disasm dis(mem);
        !           213:                dis.Exec();
        !           214:                // 照合
        !           215:                if (dis.text != expected) {
        !           216:                        printf(">%s expects \"%s\" but \"%s\"\n", inst_str.c_str(),
        !           217:                                expected.c_str(), dis.text.c_str());
        !           218:                        failed++;
        !           219:                        continue;
        !           220:                }
        !           221:                uint32 expected_len = 4;
        !           222:                if (dis.bin.size() != expected_len) {
        !           223:                        printf(">%s expects len=$%x but $%x\n", inst_str.c_str(),
        !           224:                                expected_len, (uint)dis.bin.size());
        !           225:                        failed++;
        !           226:                        continue;
        !           227:                }
        !           228:        }
        !           229: 
        !           230:        int total = countof(table);
        !           231:        printf("%d tests, %d success", total, total - failed);
        !           232:        if (failed > 0) {
        !           233:                printf(", %d failed", failed);
        !           234:        }
        !           235:        printf("\n");
        !           236:        return 0;
        !           237: }

unix.superglobalmegacorp.com

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