--- nono/vm/crtc.cpp 2026/04/29 17:04:35 1.1.1.4 +++ nono/vm/crtc.cpp 2026/04/29 17:04:41 1.1.1.5 @@ -52,6 +52,8 @@ CRTCDevice::Read(uint32 addr) { uint64 data; + gMPU->AddCycle(9); // InsideOut p.135 + if (addr < 0x400 / 2) { // CRTC レジスタ // 0x40 バイトでミラー addr &= (0x40 / 2) - 1; @@ -91,6 +93,8 @@ CRTCDevice::Read(uint32 addr) uint64 CRTCDevice::Write(uint32 addr, uint32 data) { + gMPU->AddCycle(9); // InsideOut p.135 + if (addr < 0x400 / 2) { // CRTC レジスタ // 0x40 バイトでミラー addr &= (0x40 / 2) - 1; @@ -167,28 +171,31 @@ CRTCDevice::SetReg(uint32 reg, uint32 da } // 垂直表示・帰線イベント -// arg == 1 なら表示期間開始、arg == 0 なら帰線期間開始。 +// ev.code が 1 なら表示期間開始(V-disp)、0 なら帰線期間開始(V-blank)。 void -CRTCDevice::VDispCallback(int arg) +CRTCDevice::VDispCallback(Event& ev) { + int& vdisp = ev.code; + // GPIP の状態を更新 - gMFP->SetVDisp(arg); + gMFP->SetVDisp(vdisp); // 今はここで1画面まるごと作成 - if (arg) { + if (vdisp) { // Render に作画指示 gRenderer->Render(); } // 次のタイミングを計算 // XXX まだ CRTC から計算していない - if (arg) { + if (vdisp) { // 垂直表示期間 - vdisp_event.time = 16250_usec; + ev.time = 16250_usec; + ev.code = 0; } else { // 垂直帰線期間 - vdisp_event.time = 1778_usec; + ev.time = 1778_usec; + ev.code = 1; } - vdisp_event.code = 1 - arg; - vdisp_event.Start(); + ev.Start(); }