--- nono/vm/lunafb.h 2026/04/29 17:05:10 1.1.1.2 +++ nono/vm/lunafb.h 2026/04/29 17:05:29 1.1.1.6 @@ -43,34 +43,38 @@ class LunafbDevice : public PlaneVRAMDev static const uint32 fcset7end = 0xb1500000; // プレーン数の上限 - static const int MAX_PLANES = 8; + static const uint MAX_PLANES = 8; public: LunafbDevice(); - virtual ~LunafbDevice() override; + ~LunafbDevice() override; bool Init() override; void ResetHard(bool poweron) override; - uint64 Read8(uint32 addr) override; - uint64 Read16(uint32 addr) override; - uint64 Read32(uint32 addr) override; - uint64 Write8(uint32 addr, uint32 data) override; - uint64 Write16(uint32 addr, uint32 data) override; - uint64 Write32(uint32 addr, uint32 data) override; - uint64 Peek8(uint32 addr) 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; + + void UpdateInfo(TextScreen&, int x, int y) const override; // エミュレータによる出力 void EmuInitScreen(); void EmuFill(uint x, uint y, uint w, uint h, uint32 data); void EmuPutc(uint x, uint y, uint c); - void EmuPutc(uint x, uint y, uint c, int rop); + void EmuPutc(uint x, uint y, uint c, uint rop); void EmuScrollY(uint dy, uint sy, uint h); + void SetBMSEL(uint8 bmsel_) { bmsel = bmsel_; } private: // offset の VRAM が変更されたことを記録する inline void SetDirty(uint32 offset); + // X 方向にはみ出したときに対応する仮想画面の Y 座標を返す。 + int GetWrapY(int y) const override; + + busdata WriteReg(busaddr addr, uint32 data); void WriteRFCNT(uint32); void WriteCommonBitmap8(uint32, uint32); void WriteCommonBitmap16(uint32, uint32); @@ -90,6 +94,8 @@ class LunafbDevice : public PlaneVRAMDev // 現在のプレーン数でのプレーンの終了アドレス uint32 plane_end {}; + // 現在のプレーン数での FCSet の(ブロック単位での)最終アドレス + uint32 fcset_end {}; // RFCNT // @@ -119,7 +125,12 @@ class LunafbDevice : public PlaneVRAMDev uint fcset[MAX_PLANES] {}; uint32 fcmask[MAX_PLANES] {}; + // ウェイト [nsec] + busdata wait {}; + Monitor monitor { this }; }; -#define gLunafb (dynamic_cast(gPlaneVRAM)) +static inline LunafbDevice *GetLunafbDevice() { + return Object::GetObject(OBJ_PLANEVRAM); +}