--- nono/vm/x68kio.h 2026/04/29 17:05:18 1.1.1.1 +++ nono/vm/x68kio.h 2026/04/29 17:05:29 1.1.1.4 @@ -10,48 +10,58 @@ #pragma once -#include "device.h" -#include +#include "mainbus.h" -class X68kIODevice : public IOContainerDevice +class X68kIODevice : public MainbusBaseDevice { - using inherited = IOContainerDevice; + using inherited = MainbusBaseDevice; public: X68kIODevice(); - virtual ~X68kIODevice() override; + ~X68kIODevice() override; - bool Init() override; + bool InitMainbus() override; - 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; - - // ブートページを切り替える。 - void SwitchBootPage(bool isrom); - - protected: - IODevice *GetDevice(uint32 addr) const override; + busdata Read(busaddr addr) override; + busdata Write(busaddr addr, uint32 data) override; + busdata Peek1(uint32 addr) override; + bool Poke1(uint32 addr, uint32 data) override; + + // ブートページを切り替える。(X68kMainbus から呼ばれる) + void SwitchBootPage(bool isrom) override; + + // エリアセット。 + uint8 GetAreaset() const { return arealimit; } + void SetAreaset(uint8 arealimit_); + // 拡張エリアセット。 + uint8 GetExtarea(uint offset) const; + void SetExtarea(uint offset, uint8 data); private: - IODevice *SearchDevice(uint32 addr) const; - + void SetUdevice(uint32 startaddr, uint32 endaddr, bool accessible); void AddDevice(IODevice *dev, uint devaddr, uint devlen); + inline IODevice *Decoder(bool super, uint32 addr) const; + inline void CheckCI(busaddr addr); + + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + DECLARE_MONITOR_CALLBACK(MonitorUpdateAreaset); + std::unique_ptr pADPCM {}; std::unique_ptr pAreaSet {}; + std::unique_ptr pBusErr {}; std::unique_ptr pCGROM {}; std::unique_ptr pCRTC {}; std::unique_ptr pDMAC {}; + std::unique_ptr pExtArea {}; std::unique_ptr pFDC {}; std::unique_ptr pGVRAM {}; std::unique_ptr pPEDEC {}; + std::unique_ptr pIPLROM0 {}; std::unique_ptr pIPLROM1 {}; std::unique_ptr pIPLROM2 {}; + std::unique_ptr pMainRAM {}; std::unique_ptr pMFP {}; + std::unique_ptr pNereid {}; std::unique_ptr pOPM {}; std::unique_ptr pPlaneVRAM {}; std::unique_ptr pPluto {}; @@ -64,6 +74,20 @@ class X68kIODevice : public IOContainerD std::unique_ptr pSprite {}; std::unique_ptr pSysport {}; std::unique_ptr pVideoCtlr {}; + std::unique_ptr pWindrv {}; - std::array table {}; + std::array udevice {}; // ユーザ空間用 + std::array sdevice {}; // スーパーバイザ空間用 + + uint8 arealimit {}; // エリアセット (設定値) + std::array extarea {}; // 拡張エリアセット (設定値) + + bool cut_fc2 {}; // FC2 ピンカットなら true + + Monitor monitor { this }; + Monitor monitor_area { this }; }; + +static inline X68kIODevice *GetX68kIODevice() { + return Object::GetObject(OBJ_X68KIO); +}