--- nono/debugger/memdump.cpp 2026/04/29 17:05:24 1.1.1.3 +++ nono/debugger/memdump.cpp 2026/04/29 17:05:32 1.1.1.5 @@ -12,23 +12,24 @@ #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" // // メモリダンプ (基本クラス) // // コンストラクタ -Memdump::Memdump(int objid_) +Memdump::Memdump(uint objid_) : inherited(objid_) { // ログは不要 ClearAlias(); // 初期値 - saddr = busaddr::Read | busaddr::S | busaddr::Physical; + saddr = BusAddr::SRead | BusAddr::Physical; SetFormat(Word); } @@ -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; @@ -88,7 +89,7 @@ Memdump::SetAddr(busaddr saddr_) void Memdump::SetAddr(uint32 laddr_) { - saddr.SetAddr(laddr_); + saddr.ChangeAddr(laddr_); MaskAddr(); } @@ -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; @@ -157,7 +160,7 @@ Memdump::Peek(uint32 paddr, int bytes) c uint32 data = 0; while (--bytes >= 0) { - busdata bd = bus->Peek8(paddr++); + busdata bd = bus->Peek1(paddr++); if (__predict_false(bd.IsBusErr())) { return bd; } @@ -174,7 +177,7 @@ Memdump::Poke(uint32 paddr, uint32 data, { while (--bytes >= 0) { uint32 d = data >> (bytes * 8); - if (bus->Poke8(paddr++, d & 0xff) == false) { + if (bus->Poke1(paddr++, d & 0xff) == false) { return false; } } @@ -186,7 +189,7 @@ Memdump::Poke(uint32 paddr, uint32 data, bool Memdump::CanPoke(uint32 paddr) const { - return bus->Poke8(paddr, -1); + return bus->Poke1(paddr, -1); } // コンソールに出力。 @@ -248,7 +251,7 @@ Memdump::Print(FILE *cons, int row) break; } - case M68030Disasm: + case M680x0Disasm: case M88100Disasm: case HD64180Disasm: line->Exec(&mem); @@ -274,7 +277,7 @@ Memdump::Read(DebuggerMemoryStream& mem, std::vector vec(bytes); for (int i = 0; i < bytes; i++) { - vec[i] = mem.Read8(); + vec[i] = mem.Read1(); } return vec; @@ -411,18 +414,34 @@ 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)", +}; + // // メモリダンプモニタ // // コンストラクタ -MemdumpMonitor::MemdumpMonitor(int objid_, int monid_) +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, @@ -607,7 +705,7 @@ MemdumpMonitor::MonitorUpdateDisasm(Text TA attr; // PC のいる行をボールドに - if (__predict_false((uint32)mem.laddr == md->GetPC())) { + if (__predict_false(mem.laddr.Addr() == md->GetPC())) { attr = TA::Em; } else { attr = TA::Normal; @@ -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) {