--- nono/debugger/debugger_private.h 2026/04/29 17:04:40 1.1.1.4 +++ nono/debugger/debugger_private.h 2026/04/29 17:04:48 1.1.1.6 @@ -16,49 +16,91 @@ using ConstStringPair = std::pair; // 諸情報付きのアドレス -struct saddr_t +class saddr_t { - // アドレス(32bit) - uint32 addr {}; + public: + // コンストラクタ + saddr_t() { } + + saddr_t(uint32 addr_, bool super_) + : saddr_t(addr_, super_, false) { } + + saddr_t(uint32 addr_, bool super_, bool data_) { + Set(addr_, super_, data_); + } + // コピーコンストラクタ + saddr_t(const saddr_t& rhs) { + Set(rhs); + } + // 代入演算子 + saddr_t& operator=(const saddr_t& rhs) { + Set(rhs); + return *this; + } + + // 代入演算子 (uint32 を代入するとアドレスだけ差し替える) + saddr_t& operator=(uint32 rhs) { + SetAddr(rhs); + return *this; + } + + // 代入 + void Set(uint32 addr_, bool super_, bool data_) { + addr = addr_; + super = super_; + data = data_; + } - // addr が論理アドレスなら true。 - // MMU の有効/無効状態はここにセットするのではなく、メモリアクセスに - // 際してアドレス変換を行う側がその時点で改めてチェックするので、 - // ここはどちらかというと物理アドレスなら false くらいの意味合い。 - bool logical {}; - - // addr が論理アドレスの場合に、テーブルサーチも行うなら true。 - // false なら TT、ATC のみ検索する。 - bool search {}; - - // addr がスーパバイザアクセスなら true。 - bool super {}; - - // addr がデータアクセスなら true。 - bool data {}; - - bool IsLogical() const { return logical; } - bool IsSearch() const { return search; } - bool IsSuper() const { return super; } - bool IsData() const { return data; } - bool IsInst() const { return !data; } - - // (論理)アドレスと Super/User ビットを合わせた 33bit アドレスを返す - uint64 GetSaddr() const { - uint64 sa = addr; - if (IsSuper()) { - sa |= 0x100000000ULL; - } - return sa; + uint32 GetAddr() const { return addr; } + bool IsSuper() const { return super; } + bool IsData() const { return data; } + void SetAddr(uint32 addr_) { addr = addr_; } + void SetSuper(bool super_) { super = super_; } + void SetData(bool data_) { data = data_; } + + // (uint32)saddr でアドレスだけ取り出せると楽 + explicit operator uint32() const { return GetAddr(); } + + // saddr += n でアドレス進められると楽 + uint32 operator+=(uint32 val) { + addr += val; + return addr; + } + // saddr++ でアドレス進められると楽 + void operator++(int n) { + addr++; + } + + private: + void Set(const saddr_t& rhs) { + addr = rhs.addr; + super = rhs.super; + data = rhs.data; } + + uint32 addr {}; // アドレス (32bit) + bool super {}; // スーパーバイザアクセスなら true + bool data {}; // データ空間アクセスなら true }; -enum MemdumpMode { - Physical = 0, // 物理アドレス - Logical_atc, // 論理アドレス (ただし TT、ATC のみ検索) - Logical_search, // 論理アドレス (TT、ATC、テーブルサーチすべて行う) +enum class MemoryMode : bool +{ + Logical = false, + Physical = true, }; +enum class MMULookupMode : bool +{ + False = false, + True = true, + // MemoryMode::Physical ならこの項は意味を持たないので、 + // True でも False でもないと言いたい。 + None = false, +}; + +// saddr_t の後で Debugger の前... +#include "debugger_memory.h" + class Console; class DebuggerMD; class Disasm; @@ -67,6 +109,12 @@ class Debugger final { friend class DebuggerMD_m680x0; friend class DebuggerMD_m88xx0; + public: + enum class Arch { + M680x0, + M88xx0, + }; + private: // 型 enum CommandAction { @@ -172,10 +220,10 @@ class Debugger final int AddBreakpoint(const breakpoint_t&); void RecalcInstMask(); - bool GetAddr(saddr_t *addr); - void cmd_d_common(MemdumpMode mode); + bool GetAddr(saddr_t *addr, bool); + void cmd_d_common(MemoryMode access_mode, MMULookupMode lookup_mode); void cmd_hist_common(BranchHistory& hist, uint64 flag); - void cmd_m_common(MemdumpMode mode); + void cmd_m_common(MemoryMode access_mode, MMULookupMode lookup_mode); void cmd_n_common(bool); void cmd_s_common(bool); void cmd_so_common(bool); @@ -183,10 +231,10 @@ class Debugger final bool ParseAddr(const char *arg, uint32_t *addrp); void SetNBreakpoint(); - static const HelpMessages HelpMsgMain; - static const HelpMessages HelpMsgBreakpoints; + static const HelpMessages HelpListMain; + static const HelpMessages HelpListBreakpoints; static const HelpMessages HelpDetails; - void Help(const HelpMessages& msgs); + void ShowHelpList(const HelpMessages& msgs); // 個別ヘルプメッセージを出力用に置換 std::string HelpConvert(const std::string& msg); @@ -196,9 +244,6 @@ class Debugger final // テキストスクリーンを表示 void ShowTextScreen(TextScreen& screen); - // アドレスをダンプ表示用に整形して返す - bool FormatDumpAddr(saddr_t addr, std::string& addrstr); - DebuggerMD *md {}; // 機種依存部分 Console *cons {}; // 入出力 @@ -216,8 +261,8 @@ class Debugger final int bi_inst_bytes {}; int bi_need_bytes {}; int bv_vector = -1; - uint32 d_last_addr {}; - uint32 m_last_addr {}; + saddr_t d_last_addr {}; + saddr_t m_last_addr {}; bool n_enable {}; uint32 n_breakaddr {}; uint32 n_count {}; @@ -233,6 +278,10 @@ class Debugger final // プロンプトで表示するレジスタ群 std::vector disp_regs {}; + // ブレークポイント到達メッセージ + // (コンソールが獲得できるまで保留しておくため) + std::string bpointmsg {}; + static std::vector cmdtable; }; @@ -240,10 +289,11 @@ class Debugger final class DebuggerMD { public: - DebuggerMD(Debugger *parent_) { + DebuggerMD(Debugger *parent_, Debugger::Arch arch_) { parent = parent_; + arch = arch_; } - virtual ~DebuggerMD() { } + virtual ~DebuggerMD(); // CPU のリクエストフラグに flag を立てる virtual void ReqSet(uint32 flag) = 0; @@ -257,24 +307,20 @@ class DebuggerMD // アドレス変換をする。 // MMUEnabled() が true であることは呼び出し側が確認すること。 + // lookup が true ならテーブルサーチまで行う。 // 変換できなければ (uint64)-1 を返す。 - virtual uint64 TranslateAddr(saddr_t laddr) = 0; + virtual uint64 TranslateAddr(saddr_t laddr, bool lookup) const = 0; // 現在の命令先頭アドレスを返す virtual uint32 GetPC() const = 0; - // MMU 状態を考慮して、プログラム空間の指定のアドレスから1命令語を - // 読み出して、下(右)詰めにして返す。 - // 命令語が可変長な CPU では最短命令長 (この命令の全ワードではない)。 - uint64 PeekFetch(saddr_t laddr); - // ステップアウトを設定する virtual void SetStepOut() = 0; // ステップアウトなら true を返す virtual bool IsStepOut() const = 0; // この命令がステップイン出来るなら true を返す (cmd_n 用) - virtual bool IsOpStepIn(uint32 op) = 0; + virtual bool IsOpStepIn(DebuggerMemoryStream& mem) = 0; // name で示されるのレジスタの値を返す。 // メモリダンプで指定するケースを想定しているので、明らかにアドレスでは @@ -289,8 +335,10 @@ class DebuggerMD // レジスタ表示系のコマンドを実行。処理すれば true を返す。 virtual bool ShowRegister(Console *cons, const std::vector& args) = 0; + // レジスタ表示系コマンドのヘルプ一覧を取得 + virtual const HelpMessages& GetHelpListReg() const = 0; // レジスタ表示系コマンドのヘルプメッセージを取得 - virtual const HelpMessages& GetRegisterHelp() const = 0; + virtual const HelpMessages& GetHelpReg() const = 0; // ブランチ履歴・例外履歴(オブジェクト)を取得 virtual BranchHistory& GetBrHist() const = 0; @@ -301,13 +349,13 @@ class DebuggerMD virtual bool CheckLEA(uint32 laddr) = 0; // 逆アセンブル。 - // laddr の位置の命令を一つ逆アセンブルする。 + // mem.laddr の位置の命令を一つ逆アセンブルする。 // 成功すれば true を返し、失敗すれば(?) false を返す。 // 成功した場合 mnemonic に逆アセンブルした文字列が、 // bin にこの命令のバイナリ列が格納されている。 // mnemonic は単純に命令部分のみ、16進ダンプや付随情報は含まない。 // bin はメモリイメージのバイト順で格納すること。 - virtual bool Disassemble(saddr_t laddr, + virtual bool Disassemble(DebuggerMemoryStream& mem, std::string& mnemonic, std::vector& bin) = 0; // 逆アセンブルをフォーマット。 @@ -321,6 +369,9 @@ class DebuggerMD // 例外のベクタ番号から名前を取得。 virtual const char *GetExceptionName(int vector) const = 0; + // 機種 + Debugger::Arch arch {}; + // ベクタ番号の最大値 (+1) int vector_max {}; // 最短の1命令のバイト数