--- nono/vm/videoctlr.h 2026/04/29 17:05:10 1.1.1.7 +++ nono/vm/videoctlr.h 2026/04/29 17:05:17 1.1.1.8 @@ -12,50 +12,59 @@ #include "device.h" #include "color.h" +#include + +class Renderer; class VideoCtlrDevice : public IODevice { using inherited = IODevice; - static const int baseaddr = 0xe82000; - - struct videoctlr { - uint16 r0; - uint16 r1; - uint16 r2; - }; + static const uint32 baseaddr = 0xe82000; public: VideoCtlrDevice(); virtual ~VideoCtlrDevice() override; + bool Init() override; void ResetHard(bool poweron) override; // 加工済みテキストパレットの先頭アドレスを取得 // レンダラとかからの参照用 - const ColorXBGR *GetHostPalette() const { return cooked_palette; } + const std::vector& GetHostPalette() const { return hostcolor; } + + // 生パレットを uint32 形式にしたものを返す (GUI 用) + const std::vector GetIntPalette() const; - protected: - // BusIO インタフェース - static const uint NPORT = 4096; - uint64 Read(uint32 offset); - uint64 Write(uint32 offset, uint32 data); - uint64 Peek(uint32 offset); + uint64 Read8(uint32 addr) override; + uint64 Read16(uint32 addr) override; + uint64 Write8(uint32 addr, uint32 data) override; + uint64 Write16(uint32 addr, uint32 data) override; + uint64 Peek8(uint32 addr) override; + uint64 Poke8(uint32 addr, uint32 data) override; private: - void SetR0(uint32 data); - void SetR1(uint32 data); - void SetR2(uint32 data); + inline uint32 Decoder(uint32 addr) const; + inline uint Offset2NR(uint32 offset) const; + + uint32 GetNR(uint reg) const; + void SetNR(uint reg, uint32 data); void MakePalette(); - struct videoctlr videoctlr {}; - union { - uint8 b[1024]; - uint16 w[512]; - } palette {}; + // ワードレジスタ R0, R1, R2 は内部では nr0 .. nr5 というバイトレジスタ + // として扱う。 + std::array nreg {}; + + // メモリを確保する時のサイズ計算のため型を uint8 にしているが、 + // 運用はワードでホストバイトオーダー。 + std::array palette {}; // ホスト形式のテキストパレット (レンダラ用に加工したもの) - ColorXBGR cooked_palette[16] {}; + std::vector hostcolor {}; + + Renderer *renderer {}; }; -extern VideoCtlrDevice *gVideoCtlr; +static inline VideoCtlrDevice *GetVideoCtlrDevice() { + return Object::GetObject(OBJ_VIDEOCTLR); +}