--- nono/vm/crtc2.cpp 2026/04/29 17:05:24 1.1.1.11 +++ nono/vm/crtc2.cpp 2026/04/29 17:05:42 1.1.1.15 @@ -9,6 +9,7 @@ // #include "crtc2.h" +#include "lunafb.h" #include "renderer.h" #include "scheduler.h" @@ -16,8 +17,6 @@ CRTC2Device::CRTC2Device() : inherited(OBJ_CRTC2) { - vdisp_event.func = ToEventCallback(&CRTC2Device::VDispCallback); - vdisp_event.Regist("CRTC2 V-DISP"); } // デストラクタ @@ -29,12 +28,13 @@ CRTC2Device::~CRTC2Device() bool CRTC2Device::Init() { - if (inherited::Init() == false) { - return false; - } - + lunafb = GetLunafbDevice(); renderer = GetRenderer(); + vdisp_event.func = ToEventCallback(&CRTC2Device::VDispCallback); + vdisp_event.SetName("CRTC2 V-DISP"); + scheduler->RegistEvent(vdisp_event); + return true; } @@ -58,9 +58,9 @@ CRTC2Device::ResetHard(bool poweron) } busdata -CRTC2Device::Read(uint32 offset) +CRTC2Device::ReadPort(uint32 offset) { - uint32 data; + busdata data; switch (offset) { case 0: // アドレスレジスタ @@ -77,34 +77,34 @@ CRTC2Device::Read(uint32 offset) case 33: case 36 ... 39: data = reg[ar]; - putlog(2, "R%02d -> $%02x", ar, data); + putlog(2, "R%02u -> $%02x", ar, data.Data()); break; case 40 ... 63: // 範囲外 // 未使用レジスタの読み出しは $00 (p.17) data = 0; - putlog(1, "Read unused register R%02d", ar); + putlog(1, "Read unused register R%02u", ar); break; default: // 書き込み専用レジスタ // 読み出しは 0 になる (p.112) data = 0; - putlog(1, "Read write-only register R%02d", ar); + putlog(1, "Read write-only register R%02u", ar); break; } break; default: - VMPANIC("corrupted offset=%d", offset); + VMPANIC("corrupted offset=%u", offset); } - busdata bd = data; // XXX wait? - return bd; + data |= BusData::Size1; + return data; } busdata -CRTC2Device::Write(uint32 offset, uint32 data) +CRTC2Device::WritePort(uint32 offset, uint32 data) { switch (offset) { case 0: // アドレスレジスタ @@ -116,31 +116,32 @@ CRTC2Device::Write(uint32 offset, uint32 switch (ar) { case 16 ... 17: // 読み出し専用レジスタ case 28: - putlog(1, "Write read-only register R%02d <- $%02x", ar, data); + putlog(1, "Write read-only register R%02u <- $%02x", ar, data); break; case 40 ... 63: // 範囲外 - putlog(1, "Write unused register R%02d <- $%02x", ar, data); + putlog(1, "Write unused register R%02u <- $%02x", ar, data); break; default: // 書き込み可能レジスタ reg[ar] = data; - putlog(2, "R%02d <- $%02x", ar, data); + putlog(2, "R%02u <- $%02x", ar, data); break; } break; default: - VMPANIC("corrupted offset=%d", offset); + VMPANIC("corrupted offset=%u", offset); break; } // XXX wait? - return 0; + busdata r = BusData::Size1; + return r; } busdata -CRTC2Device::Peek(uint32 offset) +CRTC2Device::PeekPort(uint32 offset) { switch (offset) { case 0: // アドレスレジスタ @@ -154,17 +155,25 @@ CRTC2Device::Peek(uint32 offset) } } +bool +CRTC2Device::PokePort(uint32 offset, uint32 data) +{ + return false; +} + // 垂直表示・帰線イベント // ev.code が 1 なら表示期間開始(V-disp)、0 なら帰線期間開始(V-blank)。 void CRTC2Device::VDispCallback(Event& ev) { - int& vdisp = ev.code; + int vdisp = ev.code; // 今はここで1画面まるごと作成 if (vdisp) { - // Render に作画指示 - renderer->Render(); + // 更新の必要があれば Render に作画指示。 + if (lunafb->Snap()) { + renderer->NotifyRender(); + } } // 次のタイミングを計算