--- nono/vm/tvram.h 2026/04/29 17:04:28 1.1 +++ nono/vm/tvram.h 2026/04/29 17:04:56 1.1.1.7 @@ -1,6 +1,7 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // #pragma once @@ -8,41 +9,54 @@ #include "device.h" #include -class TVRAMDevice - : public IODevice +class TVRAMDevice : public IODevice { - typedef IODevice inherited; + using inherited = IODevice; private: static const int baseaddr = 0xe00000; struct tvram { bool sa; // 同時アクセス bool ap[4]; // 同時アクセスプレーン + int xscroll; // X スクロール + int yscroll; // Y スクロール }; public: TVRAMDevice(); - virtual ~TVRAMDevice(); + virtual ~TVRAMDevice() override; - virtual void ResetHard(); + void ResetHard() override; - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); + 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; void set_crtc_21(uint16 data); + void SetScrollX(int x); + void SetScrollY(int y); bool Render(uint8 *); private: + // アドレスデコーダ + uint64 Decoder(uint32 addr) const; + void Invalidate(); - uint8 *mem = NULL; + 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 TVRAMDevice *gTVRAM; +extern std::unique_ptr gTVRAM;