--- nono/vm/lcd.h 2026/04/29 17:04:55 1.1.1.7 +++ nono/vm/lcd.h 2026/04/29 17:04:58 1.1.1.8 @@ -21,16 +21,16 @@ class LCDDevice : public Device // リセット信号はない - // R/~W を val にセットする。%1=R、%0=W + // R/~W を val にセットする。true=R、false=W void SetRW(bool val); // RS を val にセットする。 - // %0=コマンド(W)/ステータス(R)レジスタ - // %1=データレジスタ - void SetRS(int); + // false=コマンド(W)/ステータス(R)レジスタ + // true=データレジスタ + void SetRS(bool val); // E を val にセットする。 - void SetE(bool); + void SetE(bool val); // E, RS, R/W 線の状態を取得する。 // PIO1 のポートC 読み込み用。 @@ -51,39 +51,33 @@ class LCDDevice : public Device // フォントを取得 const uint8 *GetFont(int ch) const; - // 更新カウンタ取得 - uint32 GetCounter() const { return update; } - private: DECLARE_MONITOR_CALLBACK(MonitorUpdate); + // 現在のアドレスでデータレジスタにラッチ + void LatchData(); + // アドレスカウンタ設定 + void SetAddr(int addr, bool is_cgram); + // アドレスカウンタを次へ進める + void NextAddr(); + + // 信号線 bool en {}; // Enable - bool rw {}; // R/~W - int rs {}; // レジスタセレクト + bool rw {}; // true=R false=W + bool rs {}; // レジスタセレクト true=Data false=Command/Status - bool addr_inc {}; // アドレス・インクリメント + bool addr_inc {}; // アドレス・インクリメント true=inc false=dec 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 {}; + // データレジスタ + uint8 data_reg {}; + + // アドレスカウンタ + int addr_counter {}; + bool addr_is_cgram {}; // addr が CGRAM アドレスなら true + + uint8 ddram[0x80] {}; + uint8 cgram[0x40] {}; Monitor monitor { this };