--- nono/vm/lcd.cpp 2026/04/29 17:05:10 1.1.1.9 +++ nono/vm/lcd.cpp 2026/04/29 17:05:50 1.1.1.14 @@ -9,24 +9,30 @@ // #include "lcd.h" +#include "monitor.h" #include "uimessage.h" -// グローバル参照用 -LCDDevice *gLCD; - // コンストラクタ LCDDevice::LCDDevice() - : inherited("LCD") + : inherited(OBJ_LCD) { - monitor.func = ToMonitorCallback(&LCDDevice::MonitorUpdate); - monitor.SetSize(67, 3); - monitor.Regist(ID_MONITOR_LCD); + monitor = gMonitorManager->Regist(ID_MONITOR_LCD, this); + monitor->func = ToMonitorCallback(&LCDDevice::MonitorUpdate); + monitor->SetSize(67, 3); } // デストラクタ LCDDevice::~LCDDevice() { - gLCD = NULL; +} + +// 初期化 +bool +LCDDevice::Init() +{ + uimessage = gMainApp.GetUIMessage(); + + return true; } // リセット @@ -40,7 +46,7 @@ LCDDevice::ResetHard(bool poweron) SetAddr(0, false); - UIMessage::Post(UIMessage::LCD); + uimessage->Post(UIMessage::LCD); } // 電源オフ @@ -49,7 +55,7 @@ LCDDevice::PowerOff() { // XXX 電源オフは色を落としたほうがいい memset(ddram, 0x20, sizeof(ddram)); - UIMessage::Post(UIMessage::LCD); + uimessage->Post(UIMessage::LCD); } void @@ -63,14 +69,14 @@ void LCDDevice::SetRS(bool val) { rs = val; - putlog(2, "RS = %d", rs); + putlog(2, "RS = %u", rs); } void LCDDevice::SetE(bool val) { en = val; - putlog(2, "E = %d", en); + putlog(2, "E = %u", en); } // E, RS, R/W 線の状態を取得する (PIO1 のポートC 読み込み用) @@ -96,7 +102,7 @@ LCDDevice::LatchData() // アドレスカウンタを設定 void -LCDDevice::SetAddr(int addr, bool is_cgram) +LCDDevice::SetAddr(uint addr, bool is_cgram) { // アドレスカウンタをセットするとデータレジスタにラッチされる addr_counter = addr; @@ -184,20 +190,20 @@ LCDDevice::Write(uint8 data) if ((data & 0x80)) { SetAddr(data & 0x7f, false); - putlog(1, "DDRAM アドレスセット $%02x", addr_counter); + putlog(1, "DDRAM Address <- $%02x", addr_counter); } else if ((data & 0x40)) { SetAddr(data & 0x3f, true); - putlog(1, "CGRAM アドレスセット $%02x", addr_counter); + putlog(1, "CGRAM Address <- $%02x", addr_counter); } else if ((data & 0x20)) { // ファンクション・セット // 0x38 (8ビットバス、2行表示、8ライン/行)モードのみサポート if (data != 0x38) { - putlog(0, "コマンド書き込み $%02x ファンクションセット(未実装)", - data); + putlog(0, "Write Command $%02x Function Set (NOT IMPLEMENTED)", data); } } else if ((data & 0x10)) { // カーソル移動 - putlog(0, "コマンド書き込み $%02x カーソル移動(未実装)", data); + putlog(0, "Write Command $%02x Move Cursor (NOT IMPLEMENTED)", + data); } else if ((data & 0x08)) { // 表示ON/OFF // 文字表示 ON/OFF のみサポート @@ -216,26 +222,26 @@ LCDDevice::Write(uint8 data) memset(ddram, 0x20, sizeof(ddram)); // DDRAM アドレス 0 をセット SetAddr(0, false); - UIMessage::Post(UIMessage::LCD); + uimessage->Post(UIMessage::LCD); } else { // $00 が書き込まれるんだけど、データシートにはないんだよね。 // 無視していいかな。 - putlog(2, "未定義書き込み $%02x", data); + putlog(2, "Write undefined $%02x", data); } } else { // データ書き込み if (addr_is_cgram) { // cgram は 5 bit 有効で左詰めで格納 cgram[addr_counter] = data << 3; - putlog(1, "CGRAM データ書き込み $%02x <- $%02x", + putlog(1, "CGRAM Data $%02x <- $%02x", addr_counter, data); } else { ddram[addr_counter] = data; - putlog(1, "DDRAM データ書き込み X=%d Y=%d <- $%02x", + putlog(1, "DDRAM Data X=%2u Y=%u <- $%02x", addr_counter % 0x40, addr_counter / 0x40, data); } NextAddr(); - UIMessage::Post(UIMessage::LCD); + uimessage->Post(UIMessage::LCD); } } @@ -270,7 +276,7 @@ LCDDevice::MonitorUpdate(Monitor *, Text // 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f |0123456789abcdef| screen.Clear(); - screen.Print(0, 0, "RW=%c RS=%d E=%d", rw ? 'R' : 'W', rs, en); + screen.Print(0, 0, "RW=%c RS=%u E=%u", rw ? 'R' : 'W', rs, en); for (int y = 0; y < 2; y++) { memcpy(buf, &ddram[y * 0x40], 16); @@ -330,7 +336,7 @@ LCDDevice::MonitorUpdate(Monitor *, Text // に呼び出すこと。また CGRAM 領域のように動的に変化する場合もあるため // 呼び出し側でこの読み出し値をキャッシュしないこと。 const uint8 * -LCDDevice::GetFont(int ch) const +LCDDevice::GetFont(uint ch) const { // CGRAM 部分 if (ch < 0x10) {