--- nono/debugger/memdump.cpp 2026/04/29 17:05:16 1.1.1.2 +++ nono/debugger/memdump.cpp 2026/04/29 17:05:24 1.1.1.3 @@ -11,10 +11,10 @@ #include "memdump.h" #include "debugger_memory.h" #include "debugger_private.h" -#include "device.h" #include "hd64180disasm.h" #include "m68030disasm.h" #include "m88100disasm.h" +#include "mainbus.h" // // メモリダンプ (基本クラス) @@ -28,9 +28,7 @@ Memdump::Memdump(int objid_) ClearAlias(); // 初期値 - saddr.SetSuper(true); - saddr.SetData(true); - SetAccessMode(MemoryMode::Physical); + saddr = busaddr::Read | busaddr::S | busaddr::Physical; SetFormat(Word); } @@ -78,51 +76,27 @@ Memdump::InitMD(DebuggerMD *md_) bus = md->GetBus(); } -// saddr を設定する。 +// busaddr を設定する。 void -Memdump::SetAddr(const saddr_t& saddr_) +Memdump::SetAddr(busaddr saddr_) { - SetAddr(saddr_.GetAddr()); - SetData(saddr_.IsData()); - SetSuper(saddr_.IsSuper()); + saddr = saddr_; + MaskAddr(); } // アドレスを設定する。 void Memdump::SetAddr(uint32 laddr_) { - // 今の表示形式での境界に揃える - laddr_ = laddr_ & ~(GetStride() - 1); - saddr.SetAddr(laddr_); + MaskAddr(); } -// User/Super を設定する。 -void -Memdump::SetSuper(bool super_) -{ - saddr.SetSuper(super_); -} - -// Data/Inst を設定する。 -void -Memdump::SetData(bool data_) -{ - saddr.SetData(data_); -} - -// アクセスモードを設定する。 -void -Memdump::SetAccessMode(MemoryMode access_mode_) -{ - access_mode = access_mode_; -} - -// MMU ルックアップモードを設定する。 +// 今の表示形式での境界に揃える。 void -Memdump::SetLookupMode(MMULookupMode lookup_mode_) +Memdump::MaskAddr() { - lookup_mode = lookup_mode_; + saddr &= ~(GetStride() - 1); } // アドレスをバイト単位で加算(減算)する。 @@ -172,7 +146,7 @@ Memdump::SetFormat(Memdump::Format fmt_) } // 表示形式を切り替えたことによってアドレスに端数が出るのを防ぐ - SetAddr(saddr.GetAddr()); + MaskAddr(); } // 物理メモリ paddr 以降の内容を越権的に読み出す。bytes は 1, 2, 4 を想定。 @@ -180,44 +154,39 @@ Memdump::SetFormat(Memdump::Format fmt_) uint64 Memdump::Peek(uint32 paddr, int bytes) const { - uint64 data = 0; + uint32 data = 0; while (--bytes >= 0) { - data = (data << 8) | bus->Peek8(paddr++); + busdata bd = bus->Peek8(paddr++); + if (__predict_false(bd.IsBusErr())) { + return bd; + } + data = (data << 8) | bd.Data(); } return data; } // 物理メモリ paddr 以降の内容を越権的に書き換える。 // bytes は 1, 2, 4 を想定しており、paddr はこれに整列しているはず。 -// バスエラーが起きたらその場で処理を中止して (uint64)-1 を返す。 -uint64 +// バスエラーが起きたらその場で処理を中止して false を返す。 +bool Memdump::Poke(uint32 paddr, uint32 data, int bytes) { - IODevice *dev = bus->FindDevice(paddr); - assert(dev); - while (--bytes >= 0) { uint32 d = data >> (bytes * 8); - uint64 berr = dev->Poke8(paddr++, d & 0xff); - if ((int64)berr < 0) { - return berr; + if (bus->Poke8(paddr++, d & 0xff) == false) { + return false; } } - return 0; + return true; } // この paddr が Poke() 可能なら true を返す。 bool Memdump::CanPoke(uint32 paddr) const { - IODevice *dev = bus->FindDevice(paddr); - assert(dev); - - // -1 でチェック - uint64 r = dev->Poke8(paddr, -1); - return (bool)(r == 0); + return bus->Poke8(paddr, -1); } // コンソールに出力。 @@ -225,7 +194,7 @@ Memdump::CanPoke(uint32 paddr) const void Memdump::Print(FILE *cons, int row) { - DebuggerMemoryStream mem(md, saddr, access_mode, lookup_mode); + DebuggerMemoryStream mem(md, saddr); for (int y = 0; y < row; y++) { std::string addrbuf; @@ -465,7 +434,7 @@ MemdumpMonitor::~MemdumpMonitor() void MemdumpMonitor::MonitorUpdate(Monitor *, TextScreen& screen) { - DebuggerMemoryStream mem(md, saddr, access_mode, lookup_mode); + DebuggerMemoryStream mem(md, saddr); screen.Clear(); @@ -627,10 +596,11 @@ MemdumpMonitor::MonitorUpdateDisasm(Text int row = screen.GetRow(); // 逆アセンブラ用の次行アドレスバッファを必要ならリサイズ - if (row != nextaddr.size()) { - nextaddr.resize(row); + if ((row + 1) != nextaddr.size()) { + nextaddr.resize(row + 1); } + nextaddr[0] = mem.laddr.Addr(); for (int y = 0; y < row; y++) { std::string addrbuf; bool accessible; @@ -657,7 +627,7 @@ MemdumpMonitor::MonitorUpdateDisasm(Text // 次行の開始アドレスを覚えておく。 // 逆アセンブラで n 行下へ移動する時のため。 - nextaddr[y] = mem.laddr.GetAddr(); + nextaddr[y + 1] = mem.laddr.Addr(); } } @@ -670,17 +640,8 @@ MemdumpMonitor::GetLineOffset(int n) con return n * fixed; } else { // 可変長フォーマット - - // 引数 n を nextaddr[] のインデックス i に変換。 - // 0行下は先頭行。 - // 1行下なら2行目なので nextaddr は [0]、 - // 2行下なら3行目なので nextaddr は [1]。 - if (n == 0) { - return 0; - } - int i = n - 1; - if (0 <= i && i < nextaddr.size()) { - return nextaddr[i] - (uint32)saddr; + if (0 <= n && n < nextaddr.size()) { + return nextaddr[n] - nextaddr[0]; } else { // なければ仕方ないので適当に返す return n * inst_bytes;