--- nono/vm/bt45x.h 2026/04/29 17:05:25 1.1.1.2 +++ nono/vm/bt45x.h 2026/04/29 17:05:29 1.1.1.3 @@ -27,71 +27,58 @@ class BT45xDevice : public IODevice bool Init() override; void ResetHard(bool poweron) override; - busdata Read8(uint32 addr) override; - busdata Write8(uint32 addr, uint32 data) override; - busdata Peek8(uint32 addr) override; + // 設定からプレーン数を取得 + static int GetConfigPlaneCount(); // プレーン数を取得 - int GetPlaneCount() const { return nplane; } + uint GetPlaneCount() const { return nplane; } // ホストパレットのアドレスを取得 - const std::vector& GetHostPalette() const { return hostcolor; } + const std::vector& GetHostPalette() const { return hostcolor; } // 生パレットを uint32 形式にしたものを返す (GUI 用) const std::vector GetIntPalette() const; - // 内部アクセス + // BusIO インタフェース // (内蔵 ROM からのアクセス用に特別に public にしてある) - uint64 Write(uint32 offset, uint32 data); - - private: - // BusIO に似てるが、BusIO ではない。 - uint64 Read(uint32 offset); - uint64 Peek(uint32 offset); + busdata WritePort(uint32 offset, uint32 data); + protected: + static const uint32 NPORT = 4; + busdata ReadPort(uint32 offset); + busdata PeekPort(uint32 offset); + bool PokePort(uint32 offset, uint32 data); // レジスタ値からホストパレットを作成 - void MakeHostColor(int idx); + void MakeHostColor(uint idx); + + // パレット n の色を uint32 表現したものを返す (GUI 用) + virtual uint32 PaletteToInt(uint n) const = 0; // 通知 void Notify(); - uint32 ReadAddress(); - uint32 ReadPalette(); - uint32 ReadControl(); + uint32 PeekAddress() const; + uint32 PeekPalette() const; void WriteAddress(uint32 data); void WritePalette(uint32 data); - void WriteControl(uint32 data); - uint32 PeekControl() const; - - // Bt458 拡張 - void WriteRMask(uint32 data); - void WriteBMask(uint32 data); - void WriteCommand(uint32 data); - void WriteTest(uint32 data); - - uint32 Palette454ToInt(int n) const; - uint32 Palette458ToInt(int n) const; - - DECLARE_MONITOR_CALLBACK(MonitorUpdate454); - DECLARE_MONITOR_CALLBACK(MonitorUpdate458); + virtual uint32 ReadControl() = 0; + virtual void WriteControl(uint32 data) = 0; + virtual uint32 PeekControl() const = 0; // モデル種別。Bt454 なら true。 bool bt454 {}; // ビットマップのプレーン数 (1, 4, 8) - int nplane {}; + uint nplane {}; // パレット数 (16 or 256) - int palettes {}; + uint palettes {}; // データの下位ニブルマスク。Bt454 なら LOW_NIBBLE。 uint8 low_nibble {}; - // Bt458 拡張 - uint8 readmask {}; // パレットアドレスマスク - uint8 blinkmask {}; // ブリンクマスク - uint8 command {}; // コマンド - uint8 testreg {}; // テストレジスタ + // Bt458 のパレットアドレスマスク。(Bt454 なら使用しない) + uint8 readmask {}; // idx は次にアクセスされるべき color[] へのインデックス。 // idx = 0 ならパレット0 の R。 @@ -101,7 +88,7 @@ class BT45xDevice : public IODevice // modulo 3 を数えるカウンタを ab と呼ぶことにする。つまり // idx = 0 はパレット 0、ab 0。 // idx = 4 はパレット 1、ab 1。 - int idx; + uint idx {}; // パレットは R, G, B の順に格納されている。 // color[0] = パレット0 R @@ -117,7 +104,7 @@ class BT45xDevice : public IODevice // // Bt458 なら 256パレット * 3 = 768エントリ。 // 色深度は 8ビットでそのまま格納。 - std::vector color; + std::vector color {}; // ホスト用に変換したパレットデータ。 // ホスト用なので各8ビット、といいつつ元情報 (color[]) が8ビットすべて @@ -127,7 +114,7 @@ class BT45xDevice : public IODevice // 展開する。パレットのうち実際には #14 と #15 だけが使われるが、 // それについてはレンダラ側で処理している。 // see https://twitter.com/tsutsuii/status/356704682514714625 - std::vector hostcolor; + std::vector hostcolor {}; Renderer *renderer {}; @@ -137,6 +124,55 @@ class BT45xDevice : public IODevice static const char rgbstr[3]; }; +// Bt454 +class BT454Device : public BT45xDevice +{ + using inherited = BT45xDevice; + + static const uint32 LOW_NIBBLE = 0x0f; + public: + BT454Device(); + ~BT454Device() override; + + private: + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + uint32 ReadControl() override; + void WriteControl(uint32 data) override; + uint32 PeekControl() const override; + + uint32 PaletteToInt(uint) const override; +}; + +// Bt458 +class BT458Device : public BT45xDevice +{ + using inherited = BT45xDevice; + public: + BT458Device(); + ~BT458Device() override; + + bool Init() override; + + private: + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + uint32 ReadControl() override; + void WriteControl(uint32 data) override; + uint32 PeekControl() const override; + + uint32 PaletteToInt(uint) const override; + + void WriteRMask(uint32 data); + void WriteBMask(uint32 data); + void WriteCommand(uint32 data); + void WriteTest(uint32 data); + + uint8 blinkmask {}; // ブリンクマスク + uint8 command {}; // コマンド + uint8 testreg {}; // テストレジスタ +}; + static inline BT45xDevice *GetBT45xDevice() { return Object::GetObject(OBJ_BT45x); }