--- nono/debugger/memdump.cpp 2026/04/29 17:05:28 1.1.1.4 +++ nono/debugger/memdump.cpp 2026/04/29 17:05:32 1.1.1.5 @@ -12,9 +12,10 @@ #include "debugger_memory.h" #include "debugger_private.h" #include "hd64180disasm.h" -#include "m68030disasm.h" +#include "m680x0disasm.h" #include "m88100disasm.h" #include "mainbus.h" +#include "monitor.h" // // メモリダンプ (基本クラス) @@ -49,7 +50,7 @@ Memdump::Memdump(DebuggerMD *md_, CPUArc Format fmt_; switch (asm_arch) { case CPUArch::M680x0: - fmt_ = M68030Disasm; + fmt_ = M680x0Disasm; break; case CPUArch::M88xx0: fmt_ = M88100Disasm; @@ -123,6 +124,8 @@ Memdump::SetFormat(Memdump::Format fmt_) fixed = 16; break; case M68030PageShort: + case M68040TableDesc: + case M68040PageDesc: case M88200Page: fixed = 4; break; @@ -130,7 +133,7 @@ Memdump::SetFormat(Memdump::Format fmt_) fixed = 8; break; - case M68030Disasm: + case M680x0Disasm: line.reset(new m680x0disasm()); inst_bytes = 2; break; @@ -248,7 +251,7 @@ Memdump::Print(FILE *cons, int row) break; } - case M68030Disasm: + case M680x0Disasm: case M88100Disasm: case HD64180Disasm: line->Exec(&mem); @@ -411,6 +414,22 @@ Memdump::dtname[4] = { "(Next Long) ", }; +/*static*/ const char * const +Memdump::udtname[4] = { + "(Invalid) ", + "(Invalid) ", + "(Resident)", + "(Resident)", +}; + +/*static*/ const char * const +Memdump::pdtname[4] = { + "(Invalid) ", + "(Resident)", + "(Indirect)", + "(Resident)", +}; + // // メモリダンプモニタ @@ -420,9 +439,9 @@ Memdump::dtname[4] = { MemdumpMonitor::MemdumpMonitor(uint objid_, int monid_) : inherited(objid_) { - monitor.func = ToMonitorCallback(&MemdumpMonitor::MonitorUpdate); - monitor.SetSize(84, 16); - monitor.Regist(monid_); + monitor = gMonitorManager->Regist(monid_, this); + monitor->func = ToMonitorCallback(&MemdumpMonitor::MonitorUpdate); + monitor->SetSize(84, 16); } // デストラクタ @@ -443,6 +462,8 @@ MemdumpMonitor::MonitorUpdate(Monitor *, case Word: case Long: case M68030PageShort: + case M68040TableDesc: + case M68040PageDesc: case M88200Page: MonitorUpdateMemdump(screen, mem); break; @@ -451,7 +472,7 @@ MemdumpMonitor::MonitorUpdate(Monitor *, screen.Puts(0, 0, "68030PageLong not supported"); break; - case M68030Disasm: + case M680x0Disasm: case M88100Disasm: case HD64180Disasm: MonitorUpdateDisasm(screen, mem); @@ -503,6 +524,12 @@ MemdumpMonitor::MonitorUpdateMemdump(Tex case M68030PageShort: Update68030PageShort(screen, dx, y, vec); break; + case M68040TableDesc: + Update68040TableDesc(screen, dx, y, vec); + break; + case M68040PageDesc: + Update68040PageDesc(screen, dx, y, vec); + break; case M88200Page: Update88200Page(screen, dx, y, vec); break; @@ -550,6 +577,77 @@ MemdumpMonitor::Update68030PageShort(Tex screen.Print(x + 30, y, attr, "DT=%d%s", dt, dtname[dt]); } +// (x, y) に 68040 テーブルディスクリプタのダンプを出力する。 +void +MemdumpMonitor::Update68040TableDesc(TextScreen& screen, int x, int y, + const std::vector& vec) +{ + // 2 3 4 5 6 7 + // 9012345678901234567890123456789012345678901234567890123 + // 00000000 $00000000 U W UDT=0(Invalid) + + uint32 data = 0; + for (auto b : vec) { + if (b < 0) { + screen.Puts(x, y, "BusErr"); + return; + } + data = (data << 8) | (uint8)b; + } + + screen.Puts(x, y, strhex(data).c_str()); + + bool resident = (data & 2); + TA attr = resident ? TA::Normal : TA::Disable; + + // 1段(23bit)、2段4K(24bit)、2段8K(25bit) はとりあえず区別しない。 + screen.Putc(x + 10, y, attr, '$'); + screen.Puts(x + 11, y, attr, strhex(data & 0xffff'ff80).c_str()); + screen.Putc(x + 20, y, attr, (data & 0x0008) ? 'U' : '-'); + screen.Putc(x + 22, y, attr, (data & 0x0004) ? 'W' : '-'); + uint32 udt = data & 3; + screen.Print(x + 24, y, attr, "UDT=%u%s", udt, udtname[udt]); +} + +// (x, y) に 68040 ページディスクリプタのダンプを出力する。 +void +MemdumpMonitor::Update68040PageDesc(TextScreen& screen, int x, int y, + const std::vector& vec) +{ + // 2 3 4 5 6 7 + // 9012345678901234567890123456789012345678901234567890123456 + // 00000000 $00000000 UR G U1 U0 S CMx M U W PDT=0(Resident) + + uint32 data = 0; + for (auto b : vec) { + if (b < 0) { + screen.Puts(x, y, "BusErr"); + return; + } + data = (data << 8) | (uint8)b; + } + + screen.Puts(x, y, strhex(data).c_str()); + + uint32 pdt = data & 3; + bool resident = (pdt != 0); + TA attr = resident ? TA::Normal : TA::Disable; + + // 4K/8K ページサイズはとりあえず区別しない。 + screen.Putc(x + 10, y, attr, '$'); + screen.Puts(x + 11, y, attr, strhex(data & 0xffff'f000).c_str()); + screen.Puts(x + 20, y, attr, (data & 0x0800) ? "UR" : "--"); + screen.Putc(x + 23, y, attr, (data & 0x0400) ? 'G' : '-'); + screen.Puts(x + 25, y, attr, (data & 0x0200) ? "U1" : "--"); + screen.Puts(x + 28, y, attr, (data & 0x0100) ? "U0" : "--"); + screen.Putc(x + 31, y, attr, (data & 0x0080) ? 'S' : '-'); + screen.Print(x + 33, y, attr, "CM%u", (data & 0x0060) >> 5); + screen.Putc(x + 37, y, attr, (data & 0x0010) ? 'M' : '-'); + screen.Putc(x + 39, y, attr, (data & 0x0008) ? 'U' : '-'); + screen.Putc(x + 41, y, attr, (data & 0x0004) ? 'W' : '-'); + screen.Print(x + 43, y, attr, "PDT=%u%s", pdt, pdtname[pdt]); +} + // (x, y) に 88200 ページディスクリプタのダンプを出力する。 void MemdumpMonitor::Update88200Page(TextScreen& screen, int x, int y, @@ -660,7 +758,7 @@ MemdumpMonitor::GetPageOffset(int n) con // 逆アセンブルでは実際にこの動作をすると連続性が失われて読みにくいので // 1行だぶらせることにする。 - int row = monitor.GetSize().height; + int row = monitor->GetSize().height; if (inst_bytes) { // 逆アセンブルの場合 if (n < 0) {