--- nono/vm/tvram.h 2026/04/29 17:04:28 1.1 +++ nono/vm/tvram.h 2026/04/29 17:05:50 1.1.1.13 @@ -1,48 +1,73 @@ // // nono -// Copyright (C) 2017 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// TVRAM // #pragma once -#include "device.h" -#include +#include "planevram.h" -class TVRAMDevice - : public IODevice +class VideoCtlrDevice; + +class TVRAMDevice : public PlaneVRAMDevice { - typedef IODevice inherited; - private: - static const int baseaddr = 0xe00000; + using inherited = PlaneVRAMDevice; + + static const uint32 baseaddr = 0xe00000; + + // プレーン数は4枚固定 + static const uint NPLANE = 4; struct tvram { bool sa; // 同時アクセス - bool ap[4]; // 同時アクセスプレーン + bool ap[NPLANE]; // 同時アクセスプレーン + bool cp[NPLANE]; // ラスターコピー対象 + bool men; // アクセスマスクイネーブル + uint16 mask; // アクセスマスク }; public: TVRAMDevice(); - virtual ~TVRAMDevice(); + ~TVRAMDevice() override; - virtual void ResetHard(); + bool Init() 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); + busdata Read(busaddr addr) override; + busdata Write(busaddr addr, uint32 data) override; + busdata Peek1(uint32 addr) override; + bool Poke1(uint32 addr, uint32 data) override; + + void UpdateInfo(TextScreen&, int x, int y) const override; + + void SetAccessPlane(uint16 data); + void SetAccessMask(uint16 data); + void SetScrollX(int x); + void SetScrollY(int y); + void RasterCopy(uint src_ras, uint dst_ras); - void set_crtc_21(uint16 data); + private: + // アドレスデコーダ + uint32 Decoder(uint32 addr) const; - bool Render(uint8 *); + void Set8(uint32 offset, uint32 poffset, uint32 data, uint32 mask); + void Set16(uint32 offset, uint32 poffset, uint32 data, uint32 mask); + inline void SetDirty(uint32 offset); - private: - void Invalidate(); + // X 方向にはみ出したときに対応する仮想画面の Y 座標を返す。 + int GetWrapY(int y) const override; - uint8 *mem = NULL; - // XXX 実際には縦がこれ以上になる可能性はある - std::atomic atomic_dirty[1024] {}; struct tvram tvram {}; + + VideoCtlrDevice *videoctlr {}; + + static const busdata wait; }; -extern TVRAMDevice *gTVRAM; +static inline TVRAMDevice *GetTVRAMDevice() { + return Object::GetObject(OBJ_PLANEVRAM); +}