--- nono/debugger/debugger_memory.cpp 2026/04/29 17:05:16 1.1.1.4 +++ nono/debugger/debugger_memory.cpp 2026/04/29 17:05:58 1.1.1.7 @@ -10,26 +10,23 @@ #include "debugger_memory.h" #include "debugger_private.h" -#include "device.h" +#include "mainbus.h" // コンストラクタ DebuggerMemoryStream::DebuggerMemoryStream(const DebuggerMD *md_, - const saddr_t& laddr_, MemoryMode access_mode_, MMULookupMode lookup_mode) + busaddr laddr_) { md = md_; assert(md); laddr = laddr_; - paddr = (uint32)laddr; + paddr = laddr.Addr(); 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 (laddr.IsPhysical() == false) { if (md->MMUEnabled()) { translate = true; // FormatAddr() なしで Fetch/Peek を実行した場合でも、初回に @@ -49,31 +46,36 @@ DebuggerMemoryStream::FormatAddr(std::st if (translate) { // laddr は論理アドレスなのでアドレス変換する - uint64 tmp = md->TranslateAddr(laddr, lookup); + busaddr tmp = md->TranslateAddr(laddr); pageover = false; // laddr は常に表示 - str = strhex((uint32)laddr, lcol); + str = strhex(laddr.Addr(), lcol); - if ((int64)tmp < 0) { + if (tmp.IsBusErr()) { // アドレス変換の結果バスエラーなら false で帰る str += ":BusErr"; return false; } - paddr = (uint32)tmp; - if (paddr == (uint32)laddr) { + paddr = tmp.Addr(); + if (paddr == laddr.Addr()) { // PA==VA str += "=PA"; } else { // PA!=VA - str += ':'; + if (tmp.IsTableSearched()) { + // 本当はテーブルサーチをしてから確定するはずのアドレスなので + str += '?'; + } else { + str += ':'; + } str += strhex(paddr, pcol); str += ':'; } } else { // laddr は物理アドレスなのでそのまま - paddr = (uint32)laddr; + paddr = laddr.Addr(); str = strhex(paddr, pcol); str += ':'; @@ -86,7 +88,7 @@ DebuggerMemoryStream::FormatAddr(std::st void DebuggerMemoryStream::Offset(int n) { - ResetAddr(laddr.GetAddr() + n); + ResetAddr(laddr.Addr() + n); } // アドレスをリセットする。 @@ -94,21 +96,18 @@ DebuggerMemoryStream::Offset(int n) void DebuggerMemoryStream::ResetAddr(uint32 newaddr) { - if (((newaddr ^ (uint32)laddr) & 0xffffff00) != 0) { - pageover = true; - } - laddr = newaddr; - paddr = newaddr; + laddr.ChangeAddr(newaddr); + pageover = true; } // 前回のアクセスでページ境界をまたいだかも知れない場合は再変換。 #define PRECHECK() do { \ if (__predict_false(pageover)) { \ - uint64 tmp = md->TranslateAddr(laddr, lookup); \ - if ((int64)tmp < 0) { \ + busaddr tmp = md->TranslateAddr(laddr); \ + if (__predict_false(tmp.IsBusErr())) { \ return (uint64)-2; \ } \ - paddr = (uint32)tmp; \ + paddr = tmp.Addr(); \ pageover = false; \ } \ } while (0) @@ -130,14 +129,15 @@ DebuggerMemoryStream::Peek(int bytes) { uint64 data; - assert(((uint32)laddr & (bytes - 1)) == 0); - PRECHECK(); data = 0; for (int i = 0; i < bytes; i++) { - data <<= 8; - data |= bus->Peek8(paddr + i); + busdata bd = bus->Peek1(paddr + i); + if (__predict_false(bd.IsBusErr())) { + return bd; + } + data = (data << 8) | bd.Data(); } return data; @@ -160,15 +160,15 @@ DebuggerMemoryStream::Read(int bytes) // laddr から1バイト読み込んで、アドレスを進める。 uint64 -DebuggerMemoryStream::Read8() +DebuggerMemoryStream::Read1() { uint64 data; PRECHECK(); - data = bus->Peek8(paddr); - laddr++; - paddr++; + data = bus->Peek1(paddr); + ++laddr; + ++paddr; POSTCHECK();