--- nono/vm/lcd.h 2026/04/29 17:04:28 1.1 +++ nono/vm/lcd.h 2026/04/29 17:05:25 1.1.1.11 @@ -1,55 +1,93 @@ // // nono -// Copyright (C) 2018 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt +// + +// +// LCD (HD44780) // #pragma once #include "device.h" +#include "monitor.h" class LCDDevice : public Device { - typedef Device inherited; + using inherited = Device; public: LCDDevice(); - virtual ~LCDDevice(); + ~LCDDevice() override; - virtual bool PowerOff(); + void ResetHard(bool poweron) override; + void PowerOff() override; // リセット信号はない - // 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); + // RS を val にセットする。 + // false=コマンド(W)/ステータス(R)レジスタ + // true=データレジスタ + void SetRS(bool val); - // E を val にセットします。 - void SetE(bool); + // E を val にセットする。 + void SetE(bool val); // E, RS, R/W 線の状態を取得する。 // PIO1 のポートC 読み込み用。 uint8 Get() const; - // 読み込みます。 + // 読み込む。 uint8 Read(); - // 書き込みます。 + // 書き込む。 void Write(uint8 data); - virtual bool MonitorUpdate(); + // PIO1 のポートA ピーク用 + uint8 Peek() const; + + // バッファを取得 (内容表示用) + const uint8 *GetDDRAM() const { return ddram; } + + // フォントを取得 + const uint8 *GetFont(int ch) const; 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] {}; + DECLARE_MONITOR_CALLBACK(MonitorUpdate); + + // 現在のアドレスでデータレジスタにラッチ + void LatchData(); + // アドレスカウンタ設定 + void SetAddr(int addr, bool is_cgram); + // アドレスカウンタを次へ進める + void NextAddr(); + + // 信号線 + bool en {}; // Enable + bool rw {}; // true=R false=W + bool rs {}; // レジスタセレクト true=Data false=Command/Status + + bool addr_inc {}; // アドレス・インクリメント true=inc false=dec + bool disp_char {}; // 文字表示をするか + + // データレジスタ + uint8 data_reg {}; + + // アドレスカウンタ + int addr_counter {}; + bool addr_is_cgram {}; // addr が CGRAM アドレスなら true + + uint8 ddram[0x80] {}; + uint8 cgram[0x40] {}; + + Monitor monitor { this }; + + static const uint8 CGROM[12 * 16 * 8]; }; -extern LCDDevice *gLCD; +static inline LCDDevice *GetLCDDevice() { + return Object::GetObject(OBJ_LCD); +}