--- nono/vm/lcd.h 2026/04/29 17:04:36 1.1.1.3 +++ nono/vm/lcd.h 2026/04/29 17:04:45 1.1.1.6 @@ -13,10 +13,11 @@ class LCDDevice : public Device using inherited = Device; public: LCDDevice(); - ~LCDDevice() override; + virtual ~LCDDevice() override; bool PowerOff() override; - bool MonitorUpdate() override; + void ResetHard() override; + void MonitorUpdate(TextScreen&) override; // リセット信号はない @@ -44,15 +45,45 @@ class LCDDevice : public Device // PIO1 のポートA ピーク用 uint8 Peek() const; + // バッファを取得 (内容表示用) + const uint8 *GetDDRAM() const { return ddram; } + + // フォントを取得 + const uint8 *GetFont(int ch) const; + + // 更新カウンタ取得 + uint32 GetCounter() const { return update; } + private: - bool en = false; // Enable - bool rw = false; // R/~W - int rs = 0; // レジスタセレクト - - bool addr_inc = false; // アドレス・インクリメント - bool disp_char = false; // 文字表示をするか - int addr = 0; // アドレスカウンタ - uint8 ddram[0x40 * 2] {}; + bool en {}; // Enable + bool rw {}; // R/~W + int rs {}; // レジスタセレクト + + bool addr_inc {}; // アドレス・インクリメント + bool disp_char {}; // 文字表示をするか + int addr {}; // アドレスカウンタ + + // CGRAM と DDRAM はコマンドでのアドレス指定と同じ位置にマップさせておく。 + // そのため先頭の 64(0x40)バイトは使わず肥やしにする。 + union { + struct { + uint8 unused[0x40]; + uint8 cgram[0x40]; + uint8 ddram[0x80]; + }; + uint8 ram[256] {}; + }; + + // RAM 更新カウンタ。 + // CGRAM や DDRAM など表示内容が変化するごとに 1 ずつ上がるカウンタ。 + // GUI 側にて前回描画時のカウンタと比較して異なっていれば前回から + // 何かしらの更新があったものとして再描画する。どこがどう変化したかの + // 情報は持っていない。 + // XXX もうちょっといい方法 + // XXX 電源オフどうするか + uint32 update {}; + + static const uint8 CGROM[12 * 16 * 8]; }; extern std::unique_ptr gLCD;