--- nono/vm/tvram.h 2026/04/29 17:04:39 1.1.1.4 +++ nono/vm/tvram.h 2026/04/29 17:05:10 1.1.1.8 @@ -4,30 +4,37 @@ // Licensed under nono-license.txt // +// +// TVRAM +// + #pragma once -#include "device.h" -#include +#include "planevram.h" -class TVRAMDevice - : public IODevice +class TVRAMDevice : public PlaneVRAMDevice { - using inherited = IODevice; - private: + using inherited = PlaneVRAMDevice; + static const int baseaddr = 0xe00000; + // プレーン数は4枚固定 + static const int NPLANE = 4; + struct tvram { bool sa; // 同時アクセス - bool ap[4]; // 同時アクセスプレーン - int xscroll; // X スクロール - int yscroll; // Y スクロール + bool ap[NPLANE]; // 同時アクセスプレーン + bool cp[NPLANE]; // ラスターコピー対象 + bool men; // アクセスマスクイネーブル + uint16 mask; // アクセスマスク }; public: TVRAMDevice(); - ~TVRAMDevice() override; + virtual ~TVRAMDevice() override; - void ResetHard() override; + bool Init() override; + void ResetHard(bool poweron) override; uint64 Read8(uint32 addr) override; uint64 Read16(uint32 addr) override; @@ -35,29 +42,19 @@ class TVRAMDevice uint64 Write16(uint32 addr, uint32 data) override; uint64 Peek8(uint32 addr) override; - void set_crtc_21(uint16 data); + void SetAccessPlane(uint16 data); + void SetAccessMask(uint16 data); void SetScrollX(int x); void SetScrollY(int y); - - bool Render(uint8 *); + void RasterCopy(int src_ras, int dst_ras); private: // アドレスデコーダ uint64 Decoder(uint32 addr) const; - void Invalidate(); + inline void SetDirty(uint32 offset); - std::unique_ptr mem {}; - // XXX 実際には縦がこれ以上になる可能性はある - std::atomic atomic_dirty[1024] {}; struct tvram tvram {}; - - // レンダリング時に使う変換テーブル - static uint32 deptable[256]; - - // RGB24 形式(3バイト)を4バイトあるいは SSE なら 16バイト単位で - // 書き込むための1ライン分の中間バッファ。 - ALIGNAS_IF_X86(16) uint32 rb[768]; }; -extern std::unique_ptr gTVRAM; +#define gTVRAM (dynamic_cast(gPlaneVRAM))