--- nono/vm/mainbus.h 2026/04/29 17:05:29 1.1.1.4 +++ nono/vm/mainbus.h 2026/04/29 17:06:00 1.1.1.7 @@ -12,7 +12,7 @@ #include "device.h" #include "bus.h" -#include "monitor.h" +#include "textscreen.h" #include #include @@ -51,8 +51,8 @@ class AccStat static const uint SHIFT = 21; // メイン空間とバンクメモリ(1枚分)の要素数 - static const uint MAINLEN = (1 << (32 - SHIFT)); - static const uint BANKLEN = (1 << (24 - SHIFT)); + static const uint MAINLEN = (1U << (32 - SHIFT)); + static const uint BANKLEN = (1U << (24 - SHIFT)); // アクセス状況 static const uint8 WRITE = 0x01; @@ -138,8 +138,17 @@ class MainbusDevice : public MainbusBase uint64 Peek4(uint32 addr); + // 直近のアクセスアドレスを返す。 + // アクセス中のデバイスからは、自分へのアクセスとなったバスマスタでの + // 物理アドレス。 + uint32 GetPaddr() const { return lastaddr; } + protected: - DECLARE_MONITOR_CALLBACK(MonitorUpdateAccStat); + DECLARE_MONITOR_SCREEN(MonitorScreenAccStat); + + // 直近の (バスマスタからの) アクセスアドレス。 + // HV* アクセスでは更新しない。 + uint32 lastaddr; // アクセス状況は 32bit 空間全域を 2048 * 2MB ずつ。 // (NEWS は読み出し時にマージする) @@ -158,7 +167,7 @@ class MainbusDevice : public MainbusBase // (GUI からのアクセスの便宜のため共通クラスのこっちに置く) alignas(8) uint8 accbank[AccStat::BANKLEN * 2] {}; - Monitor monitor_accstat { this }; + Monitor *accstat_monitor {}; }; // 上位8ビットがテーブルで表せる構造のメインバス (共通部分) @@ -177,18 +186,18 @@ class Mainbus24Device : public MainbusDe bool Poke1(uint32 addr, uint32 data) override; protected: - DECLARE_MONITOR_CALLBACK(MonitorUpdate); + DECLARE_MONITOR_SCREEN(MonitorScreen); void InitAccStat(); std::array devtable {}; - Monitor monitor { this }; + Monitor *monitor {}; private: inline IODevice *Decoder(uint32 addr) const; }; -static inline MainbusDevice *GetMainbusDevice() { +inline MainbusDevice *GetMainbusDevice() { return Object::GetObject(OBJ_MAINBUS); }