--- nono/debugger/debugger_memory.cpp 2026/04/29 17:04:43 1.1 +++ nono/debugger/debugger_memory.cpp 2026/04/29 17:05:16 1.1.1.4 @@ -4,27 +4,38 @@ // Licensed under nono-license.txt // -// なんだろう。メモリアクセスヘルパー? +// +// デバッガのメモリアクセスヘルパー(?) +// +#include "debugger_memory.h" #include "debugger_private.h" -#include "mystring.h" +#include "device.h" // コンストラクタ DebuggerMemoryStream::DebuggerMemoryStream(const DebuggerMD *md_, - const saddr_t& laddr_, MemoryMode access_mode, MMULookupMode lookup_mode) + const saddr_t& laddr_, MemoryMode access_mode_, MMULookupMode lookup_mode) { md = md_; + assert(md); laddr = laddr_; - // lookup はここで enum から bool にしておく - lookup = static_cast(lookup_mode); - // 物理アドレスの時はこれだけでいいので最初に代入しておく paddr = (uint32)laddr; - if (access_mode == MemoryMode::Logical && md->MMUEnabled()) { - translate = true; - // FormatAddr() なしで Fetch/Peek を実行した場合でも、初回に - // アドレス変換を起こさせるため。SetNBreakpoint() で使う。 - pageover = true; + bus = md->GetBus(); + lcol = md->GetLASize() / 4; + pcol = md->GetPASize() / 4; + + translate = false; + if (access_mode_ == MemoryMode::Logical) { + // lookup はここで enum から bool にしておく + lookup = static_cast(lookup_mode); + + if (md->MMUEnabled()) { + translate = true; + // FormatAddr() なしで Fetch/Peek を実行した場合でも、初回に + // アドレス変換を起こさせるため。SetNBreakpoint() で使う。 + pageover = true; + } } } @@ -42,7 +53,7 @@ DebuggerMemoryStream::FormatAddr(std::st pageover = false; // laddr は常に表示 - str = string_format("%08x", (uint32)laddr); + str = strhex((uint32)laddr, lcol); if ((int64)tmp < 0) { // アドレス変換の結果バスエラーなら false で帰る @@ -56,18 +67,28 @@ DebuggerMemoryStream::FormatAddr(std::st str += "=PA"; } else { // PA!=VA - str += string_format(":%08x:", paddr); + str += ':'; + str += strhex(paddr, pcol); + str += ':'; } } else { // laddr は物理アドレスなのでそのまま paddr = (uint32)laddr; - str = string_format("%08x:", paddr); + str = strhex(paddr, pcol); + str += ':'; } return true; } +// アドレスを進める(戻す)。 +void +DebuggerMemoryStream::Offset(int n) +{ + ResetAddr(laddr.GetAddr() + n); +} + // アドレスをリセットする。 // (他のパラメータは維持するので、1ワード戻るとかそういう時用) void @@ -103,34 +124,34 @@ DebuggerMemoryStream::ResetAddr(uint32 n } while (0) -// laddr から単位命令語を読み込むが、アドレスは進めない。 +// laddr から指定バイト数を右詰めで読み込むが、アドレスは進めない。 uint64 -DebuggerMemoryStream::PeekInst() +DebuggerMemoryStream::Peek(int bytes) { uint64 data; - assert(((uint32)laddr & (md->inst_bytes - 1)) == 0); + assert(((uint32)laddr & (bytes - 1)) == 0); PRECHECK(); data = 0; - for (int i = 0; i < md->inst_bytes; i++) { + for (int i = 0; i < bytes; i++) { data <<= 8; - data |= vm_phys_peek_8(paddr + i); + data |= bus->Peek8(paddr + i); } return data; } -// laddr から単位命令語を読み込んで、アドレスを進める。 +// laddr から指定バイト数を右詰めで読み込んで、アドレスを進める。 uint64 -DebuggerMemoryStream::FetchInst() +DebuggerMemoryStream::Read(int bytes) { uint64 data; - data = PeekInst(); - laddr += md->inst_bytes; - paddr += md->inst_bytes; + data = Peek(bytes); + laddr += bytes; + paddr += bytes; POSTCHECK(); @@ -139,13 +160,13 @@ DebuggerMemoryStream::FetchInst() // laddr から1バイト読み込んで、アドレスを進める。 uint64 -DebuggerMemoryStream::Fetch8() +DebuggerMemoryStream::Read8() { uint64 data; PRECHECK(); - data = vm_phys_peek_8(paddr); + data = bus->Peek8(paddr); laddr++; paddr++;