--- nono/vm/videoctlr.h 2026/04/29 17:05:17 1.1.1.8 +++ nono/vm/videoctlr.h 2026/04/29 17:05:24 1.1.1.9 @@ -11,7 +11,10 @@ #pragma once #include "device.h" +#include "bitmap.h" #include "color.h" +#include "event.h" +#include "planevram.h" #include class Renderer; @@ -24,11 +27,26 @@ class VideoCtlrDevice : public IODevice public: VideoCtlrDevice(); - virtual ~VideoCtlrDevice() override; + ~VideoCtlrDevice() override; 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; + + // コントラストを取得 (Peek() からも呼ぶので副作用を起こしてはいけない) + int GetContrast() const { return (int)(target_contrast / 0x11); } + // コントラストを設定 + void SetContrast(int); + + // 画面合成 + bool Render(BitmapRGBX& dst, ModifyInfo&); + // 加工済みテキストパレットの先頭アドレスを取得 // レンダラとかからの参照用 const std::vector& GetHostPalette() const { return hostcolor; } @@ -36,13 +54,6 @@ class VideoCtlrDevice : public IODevice // 生パレットを uint32 形式にしたものを返す (GUI 用) const std::vector GetIntPalette() const; - 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: inline uint32 Decoder(uint32 addr) const; inline uint Offset2NR(uint32 offset) const; @@ -50,11 +61,22 @@ class VideoCtlrDevice : public IODevice 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); +#if defined(HAVE_AVX2) + static void RenderContrast_avx2(BitmapRGBX&, const BitmapRGBX&, uint32); + bool enable_avx2 {}; +#endif + + void ContrastCallback(Event& ev); // ワードレジスタ R0, R1, R2 は内部では nr0 .. nr5 というバイトレジスタ // として扱う。 std::array nreg {}; + // テキスト画面 + BitmapRGBX textbmp {}; + // メモリを確保する時のサイズ計算のため型を uint8 にしているが、 // 運用はワードでホストバイトオーダー。 std::array palette {}; @@ -62,6 +84,21 @@ class VideoCtlrDevice : public IODevice // ホスト形式のテキストパレット (レンダラ用に加工したもの) std::vector hostcolor {}; + // 設定したコントラスト値 (0-255) + uint32 target_contrast {}; + // 現在の (遷移中かもしれない) コントラスト値 (0-255) + uint32 running_contrast {}; + // 設定を変える時の初期値 (0-255) + uint32 initial_contrast {}; + // 設定を変える時の起点 + uint64 contrast_time0 {}; + + // レンダリングに使っているコントラスト値 (0-255) + uint32 rendering_contrast {}; + + Event contrast_event { this }; + + PlaneVRAMDevice *planevram {}; Renderer *renderer {}; };