Annotation of nono/debugger/memdump.cpp, revision 1.1.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.