|
|
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.