--- nono/vm/mainbus.h 2026/04/29 17:05:17 1.1.1.1 +++ nono/vm/mainbus.h 2026/04/29 17:05:25 1.1.1.3 @@ -5,44 +5,126 @@ // // -// メインバス +// メインバス (共通部分) // #pragma once #include "device.h" +#include "bus.h" +#include "monitor.h" #include +#include -class MainbusDevice : public IOContainerDevice +// メインバスの素質を持つクラス +class MainbusBaseDevice : public IODevice { - using inherited = IOContainerDevice; + using inherited = IODevice; public: - MainbusDevice(); - virtual ~MainbusDevice() override; + MainbusBaseDevice(int objid_); + ~MainbusBaseDevice() override; - // addr はそれぞれアラインされていること。 - uint64 Read8(uint32 addr) override; - uint64 Read16(uint32 addr) override; - uint64 Read32(uint32 addr) override; - uint64 Write8(uint32 addr, uint32 data) override; - uint64 Write16(uint32 addr, uint32 data) override; - uint64 Write32(uint32 addr, uint32 data) override; - uint64 Peek8(uint32 addr) override; + // メインバスの初期化 + virtual bool InitMainbus() = 0; - uint64 Peek32(uint32 addr); + // MPU からのリセット (ここ?) + virtual void ResetByMPU(); + + // addr 版 (こっちは呼ばないこと) + busdata Read8(uint32 addr) override final; + busdata Read16(uint32 addr) override final; + busdata Read32(uint32 addr) override final; + busdata Write8(uint32 addr, uint32 data) override final; + busdata Write16(uint32 addr, uint32 data) override final; + busdata Write32(uint32 addr, uint32 data) override final; + + // busaddr 版 + virtual busdata Read8(busaddr addr) = 0; + virtual busdata Read16(busaddr addr) = 0; + virtual busdata Read32(busaddr addr) = 0; + virtual busdata Write8(busaddr addr, uint32 data) = 0; + virtual busdata Write16(busaddr addr, uint32 data) = 0; + virtual busdata Write32(busaddr addr, uint32 data) = 0; + + // ブートページを ROM に切り替える + void SwitchBootPageToROM() { SwitchBootPage(true); } + // ブートページを RAM に切り替える + void SwitchBootPageToRAM() { SwitchBootPage(false); } - // デバイスをセットする - static void SetDevice(int idx, IODevice *dev); + // モニタ表示用にデバイス名を整形。 + static std::pair FormatDevName(const Device *dev); - // デバイステーブルをコピーする - static void CopyDevtable(int dst, int src, int len); + protected: + // ブートページを切り替える (内部用) + virtual void SwitchBootPage(bool isrom) = 0; +}; - static std::array devtable; +// メインバス (システムに1つ) +class MainbusDevice : public MainbusBaseDevice +{ + using inherited = MainbusBaseDevice; + public: + // アクセス状況 (詳細は機種ごと) + static const uint8 ACC_READ = 0x01; + static const uint8 ACC_WRITE = 0x02; - static int direct_ram_size; + public: + MainbusDevice(int objid_); + ~MainbusDevice() override; + + // ハイパーバイザ的アクセスというか、 + // 今となってはミスアライン可能なアクセスというだけかも知れない。 + busdata HVRead8(uint32 addr); + busdata HVRead16(uint32 addr); + busdata HVRead32(uint32 addr); + busdata HVWrite8(uint32 addr, uint32 data); + busdata HVWrite16(uint32 addr, uint32 data); + busdata HVWrite32(uint32 addr, uint32 data); + + uint64 Peek32(uint32 addr); +}; + +// 上位8ビットがテーブルで表せる構造のメインバス (共通部分) +class Mainbus24Device : public MainbusDevice +{ + using inherited = MainbusDevice; + public: + Mainbus24Device(); + ~Mainbus24Device() override; + + void ResetHard(bool poweron) override; + + busdata Read8(busaddr addr) override; + busdata Read16(busaddr addr) override; + busdata Read32(busaddr addr) override; + busdata Write8(busaddr addr, uint32 data) override; + busdata Write16(busaddr addr, uint32 data) override; + busdata Write32(busaddr addr, uint32 data) override; + busdata Peek8(uint32 addr) override; + bool Poke8(uint32 addr, uint32 data) override; protected: - IODevice *GetDevice(uint32 addr) const override; + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + DECLARE_MONITOR_CALLBACK(MonitorUpdateAccStat); + + void InitAccStat(); + + std::array devtable {}; + + // アクセス状況は 32bit 空間全域を 2048 * 2MB ずつ。 + // (NEWS は読み出し時にマージする) + std::array accstat_read {}; + std::array accstat_write {}; + // 表示エリア + std::array accstat_area {}; + // 表示用(要素数は機種による) + std::vector acc {}; + + Monitor monitor { this }; + Monitor monitor_accstat { this }; + + private: + inline IODevice *Decoder(uint32 addr) const; }; static inline MainbusDevice *GetMainbusDevice() {