Annotation of nono/debugger/memdump.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2019 [email protected]
        !             4: //
        !             5: // メモリダンプと逆アセンブル
        !             6: //
        !             7: 
        !             8: #include "header.h"
        !             9: #include "mystring.h"
        !            10: #include "memdump.h"
        !            11: #include "m68030core.h"
        !            12: #include "bus.h"
        !            13: 
        !            14: //
        !            15: // 逆アセンブル
        !            16: //
        !            17: DisasmLine::DisasmLine(m68kcpu *arg, uint32 addr, MemdumpMode mode_)
        !            18: {
        !            19:        cpu = arg;
        !            20:        // 開始アドレス。必ず偶数アドレスから
        !            21:        laddr = addr & 0xfffffffe;
        !            22:        mode = mode_;
        !            23:        // XXX TODO: FC どうするか
        !            24:        fc2 = cpu->reg.s ? FC_SUPER : FC_USER;
        !            25: 
        !            26:        // 論理アドレス指定でも MMU オフなら物理アドレス扱いでいいだろう
        !            27:        is_logical = (mode != Physical && cpu->mmu_enable);
        !            28: 
        !            29:        // 奇数にしておくことで初回に必ずアドレス変換を起こさせる。
        !            30:        last_lpage = 0xffffffff;
        !            31:        last_fc2 = 0xffffffff;
        !            32: }
        !            33: 
        !            34: // 1行出力
        !            35: std::string
        !            36: DisasmLine::Output()
        !            37: {
        !            38:        std::string addrstr;
        !            39:        std::string dumpstr;
        !            40: 
        !            41:        // アドレス
        !            42:        if (is_logical) {
        !            43:                // 論理アドレスなら、ページ境界(と初回)でアドレス変換
        !            44:                uint32 lpage = laddr & cpu->mmu_tc.lmask;
        !            45:                if (lpage != last_lpage || fc2 != last_fc2) {
        !            46:                        last_lpage = lpage;
        !            47:                        last_fc2 = fc2;
        !            48:                        bool do_search = (mode == Logical_search);
        !            49:                        paddr = m68030_mmu_translate_peek(cpu, laddr, fc2 | FC_PROG,
        !            50:                                do_search);
        !            51:                }
        !            52:        } else {
        !            53:                // 物理アドレス
        !            54:                paddr = laddr;
        !            55:        }
        !            56: 
        !            57:        // アドレス表示
        !            58:        addrstr = string_format("%08x", laddr);
        !            59:        if (is_logical == false) {
        !            60:                // 物理アクセス
        !            61:                addrstr += ":";
        !            62:        } else if ((int64)paddr < 0) {
        !            63:                // MMU 時点でバスエラー
        !            64:                addrstr += ":BusErr";
        !            65:        } else if (paddr == laddr) {
        !            66:                // PA==VA
        !            67:                addrstr += "=PA";
        !            68:        } else {
        !            69:                // PA!=VA
        !            70:                addrstr += string_format(":%08x:", (uint32)paddr);
        !            71:        }
        !            72: 
        !            73:        // 逆アセンブル
        !            74:        if ((int64)paddr >= 0) {
        !            75:                dumpstr = disasm.DisassembleWithDump(laddr, paddr);
        !            76:                uint32 len = disasm.GetLength();
        !            77:                paddr += len;
        !            78:                laddr += len;
        !            79:        } else {
        !            80:                // 出来なかったらここでアドレスを増やさず打ち切り
        !            81:        }
        !            82: 
        !            83:        std::string rv = string_format("%-18s %s",
        !            84:                addrstr.c_str(), dumpstr.c_str());
        !            85:        return rv;
        !            86: }
        !            87: 
        !            88: 
        !            89: //
        !            90: // メモリダンプ
        !            91: //
        !            92: 
        !            93: // コンストラクタ
        !            94: MemdumpLine::MemdumpLine(m68kcpu *arg, uint32 addr, MemdumpMode mode_)
        !            95: {
        !            96:        cpu = arg;
        !            97:        // 開始アドレス。必ず偶数アドレスから
        !            98:        laddr = addr & 0xfffffffe;
        !            99:        mode = mode_;
        !           100:        // XXX TODO: FC どうするか
        !           101:        fc2 = cpu->reg.s ? FC_SUPER : FC_USER;
        !           102: 
        !           103:        // 論理アドレス指定でも MMU オフなら物理アドレス扱いでいいだろう
        !           104:        is_logical = (mode != Physical && cpu->mmu_enable);
        !           105: 
        !           106:        // 奇数にしておくことで初回に必ずアドレス変換を起こさせる。
        !           107:        last_lpage = 0xffffffff;
        !           108:        last_fc2 = 0xffffffff;
        !           109: }
        !           110: 
        !           111: // 1行出力
        !           112: std::string
        !           113: MemdumpLine::Output()
        !           114: {
        !           115:        std::string addrstr;
        !           116:        std::string hexstr;
        !           117:        std::string chrstr;
        !           118: 
        !           119:        for (int i = 0; i < 8; i++) {
        !           120:                if (is_logical) {
        !           121:                        // 論理アドレスなら、ページ境界(と初回)でアドレス変換
        !           122:                        uint32 lpage = laddr & cpu->mmu_tc.lmask;
        !           123:                        if (lpage != last_lpage || fc2 != last_fc2) {
        !           124:                                last_lpage = lpage;
        !           125:                                last_fc2 = fc2;
        !           126:                                bool do_search = (mode == Logical_search);
        !           127:                                // XXX FC どうする?
        !           128:                                // XXX データATCを引くかプログラムATC を引くかもある
        !           129:                                paddr = m68030_mmu_translate_peek(cpu, laddr, fc2 | FC_DATA,
        !           130:                                        do_search);
        !           131:                        }
        !           132:                } else {
        !           133:                        // 物理アドレス
        !           134:                        paddr = laddr;
        !           135:                }
        !           136: 
        !           137:                // 行頭でアドレス表示
        !           138:                // XXX 開始アドレスが16バイトに整列していない場合で、対応する
        !           139:                // 物理ページがないアドレスから対応する物理ページがあるアドレスに
        !           140:                // 切り替わるところは、次の行になるまで対応する物理アドレスが
        !           141:                // 表示できないけどどうするか。
        !           142:                if (i == 0) {
        !           143:                        addrstr = string_format("%08x", laddr);
        !           144:                        if (is_logical == false) {
        !           145:                                // 物理アクセス
        !           146:                                addrstr += ":";
        !           147:                        } else if ((int64)paddr < 0) {
        !           148:                                // MMU 時点でバスエラー
        !           149:                                addrstr += ":BusErr";
        !           150:                        } else if (paddr == laddr) {
        !           151:                                // PA==VA
        !           152:                                addrstr += "=PA";
        !           153:                        } else {
        !           154:                                // PA!=VA
        !           155:                                addrstr += string_format(":%08x:", (uint32)paddr);
        !           156:                        }
        !           157:                }
        !           158: 
        !           159:                // ダンプ
        !           160:                if ((int64)paddr < 0) {
        !           161:                        // 何も表示しない
        !           162:                        // ここで paddr は無効なので進めてはいけない
        !           163:                        laddr += 2;
        !           164:                } else {
        !           165:                        uint64 b1 = m68030_phys_peek_8(paddr);
        !           166:                        uint64 b2 = m68030_phys_peek_8(paddr + 1);
        !           167: 
        !           168:                        // 偶数バイト目
        !           169:                        if ((int64)b1 < 0) {
        !           170:                                hexstr += "--";
        !           171:                                chrstr += " ";
        !           172:                        } else {
        !           173:                                uint32 c1 = (uint32)b1;
        !           174:                                hexstr += string_format("%02x", c1);
        !           175:                                chrstr += string_format("%c",
        !           176:                                        (0x20 <= c1 && c1 <= 0x7e) ? c1 : '.');
        !           177:                        }
        !           178:                        // 奇数バイト目
        !           179:                        if ((int64)b2 < 0) {
        !           180:                                hexstr += "--";
        !           181:                                chrstr += " ";
        !           182:                        } else {
        !           183:                                uint32 c2 = (uint32)b2;
        !           184:                                hexstr += string_format("%02x", c2);
        !           185:                                chrstr += string_format("%c",
        !           186:                                        (0x20 <= c2 && c2 <= 0x7e) ? c2 : '.');
        !           187:                        }
        !           188:                        hexstr += " ";
        !           189: 
        !           190:                        laddr += 2;
        !           191:                        paddr += 2;
        !           192:                }
        !           193:        }
        !           194: 
        !           195:        std::string rv = string_format("%-18s %-40s %s",
        !           196:                addrstr.c_str(), hexstr.c_str(), chrstr.c_str());
        !           197:        return rv;
        !           198: }

unix.superglobalmegacorp.com

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