|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.