--- nono/vm/videoctlr.h 2026/04/29 17:05:24 1.1.1.9 +++ nono/vm/videoctlr.h 2026/04/29 17:05:32 1.1.1.11 @@ -14,9 +14,10 @@ #include "bitmap.h" #include "color.h" #include "event.h" -#include "planevram.h" #include +#include +class PlaneVRAMDevice; class Renderer; class VideoCtlrDevice : public IODevice @@ -32,34 +33,37 @@ class VideoCtlrDevice : public IODevice bool Init() override; void ResetHard(bool poweron) override; - busdata Read8(uint32 addr) override; - busdata Read16(uint32 addr) override; - busdata Write8(uint32 addr, uint32 data) override; - busdata Write16(uint32 addr, uint32 data) override; - busdata Peek8(uint32 addr) override; - bool Poke8(uint32 addr, uint32 data) 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; // コントラストを取得 (Peek() からも呼ぶので副作用を起こしてはいけない) - int GetContrast() const { return (int)(target_contrast / 0x11); } + uint GetContrast() const { return target_contrast / 0x11; } // コントラストを設定 - void SetContrast(int); + void SetContrast(uint); + + // 画面作成。 + void VDisp(); // 画面合成 - bool Render(BitmapRGBX& dst, ModifyInfo&); + bool Render(BitmapRGBX& dst); // 加工済みテキストパレットの先頭アドレスを取得 // レンダラとかからの参照用 - const std::vector& GetHostPalette() const { return hostcolor; } + const std::vector& GetHostPalette() const { return hostcolor; } // 生パレットを uint32 形式にしたものを返す (GUI 用) const std::vector GetIntPalette() const; private: - inline uint32 Decoder(uint32 addr) const; - inline uint Offset2NR(uint32 offset) const; + static inline uint32 Decoder(uint32 addr); + static inline uint Offset2Rn(uint32 offset); + + uint32 Get16(uint32 offset) const; + void Set8(uint32 offset, uint32 data); + void Set16(uint32 offset, uint32 data); - uint32 GetNR(uint reg) const; - void SetNR(uint reg, uint32 data); void MakePalette(); void RenderContrast(BitmapRGBX& dst, const BitmapRGBX& src); static void RenderContrast_gen(BitmapRGBX&, const BitmapRGBX&, uint32); @@ -67,22 +71,24 @@ class VideoCtlrDevice : public IODevice static void RenderContrast_avx2(BitmapRGBX&, const BitmapRGBX&, uint32); bool enable_avx2 {}; #endif +#if defined(HAVE_NEON) + static void RenderContrast_neon(BitmapRGBX&, const BitmapRGBX&, uint32); + bool enable_neon {}; +#endif void ContrastCallback(Event& ev); - // ワードレジスタ R0, R1, R2 は内部では nr0 .. nr5 というバイトレジスタ - // として扱う。 - std::array nreg {}; + // ワードレジスタ R0, R1, R2 + std::array reg {}; // テキスト画面 BitmapRGBX textbmp {}; - // メモリを確保する時のサイズ計算のため型を uint8 にしているが、 - // 運用はワードでホストバイトオーダー。 - std::array palette {}; + // パレット (ホストバイトオーダー) + std::array palette {}; // ホスト形式のテキストパレット (レンダラ用に加工したもの) - std::vector hostcolor {}; + std::vector hostcolor {}; // 設定したコントラスト値 (0-255) uint32 target_contrast {}; @@ -93,6 +99,9 @@ class VideoCtlrDevice : public IODevice // 設定を変える時の起点 uint64 contrast_time0 {}; + // VM スレッドからレンダラスレッドへの連絡用。(0-255) + std::atomic pending_contrast {}; + // レンダリングに使っているコントラスト値 (0-255) uint32 rendering_contrast {};