--- nono/debugger/debugger_memory.h 2026/04/29 17:04:43 1.1.1.1 +++ nono/debugger/debugger_memory.h 2026/04/29 17:05:24 1.1.1.4 @@ -4,33 +4,22 @@ // Licensed under nono-license.txt // -// デバッガからのメモリアクセス - -// 今の所定義の依存関係の都合でこのファイルを直接読むことはできない? +// +// デバッガのメモリアクセスヘルパー(?) +// #pragma once -#include "debugger_private.h" +#include "debugger_defs.h" +#include "bus.h" -class DebuggerMD; +class IODevice; class DebuggerMemoryStream { public: - // コンストラクタ - DebuggerMemoryStream(const DebuggerMD *md_, const saddr_t& laddr_, - MemoryMode access_mode, MMULookupMode lookup_mode); - // コンストラクタ (lookup 省略) - DebuggerMemoryStream(const DebuggerMD *md_, const saddr_t& laddr_, - MemoryMode access_mode) - : DebuggerMemoryStream(md_, laddr_, access_mode, MMULookupMode::None) - { - } - // コンストラクタ (mode, lookup 省略) - DebuggerMemoryStream(const DebuggerMD *md_, const saddr_t& laddr_) - : DebuggerMemoryStream(md_, laddr_, MemoryMode::Logical) - { - } + // コンストラクタ (全部入り) + DebuggerMemoryStream(const DebuggerMD *md_, busaddr laddr_); // 現在のアドレスを表示用に整形して str に代入する。 // アドレス変換でバスエラーが起きたら false を返す。 @@ -39,28 +28,36 @@ class DebuggerMemoryStream // アドレスをリセットする。 void ResetAddr(uint32 newaddr); - // 以下 Peek*()/Fetch*() はいずれも読み込んだデータを返す。 + // アドレスを n 進める(戻す)。 + void Offset(int n); + + // 以下 Peek*()/Read*() はいずれも読み込んだデータを返す。 // (uint64)-1 ならアクセスの結果バスエラー。 // (uint64)-2 ならアドレス変換でバスエラー。 - // laddr から単位命令語を読み込むが、アドレスは進めない。 - uint64 PeekInst(); - - // laddr から単位命令語を読み込んで、アドレスを進める。 - uint64 FetchInst(); + // laddr から指定バイト数を右詰めで読み込むが、アドレスは進めない。 + // 命令ワード読み込み用なので bytes は 1, 2, 4 を想定。 + uint64 Peek(int bytes); + + // laddr から指定バイト数を右詰めで読み込んで、アドレスを進める。 + // 命令ワード読み込み用なので bytes は 1, 2, 4 を想定。 + uint64 Read(int bytes); // laddr から1バイト読み込んで、アドレスを進める。 - uint64 Fetch8(); + uint64 Read8(); public: - saddr_t laddr {}; // (論理)アドレス + busaddr laddr {}; // (論理)アドレス uint32 paddr {}; // 物理アドレス private: - const DebuggerMD *md {}; - bool lookup {}; // MMU テーブルサーチを行うなら true + // アクセスするバス + IODevice *bus {}; - bool translate {}; // アドレス変換が必要なら true - bool pageover {}; // 256バイト境界をまたいだら true + int lcol; // 論理アドレス幅の16進桁数 + int pcol; // 物理アドレス幅の16進桁数 + bool translate {}; // アドレス変換が必要なら true + bool pageover {}; // 256バイト境界をまたいだら true + const DebuggerMD *md {}; // アドレス変換に必要 };