--- nono/vm/fdc.cpp 2026/04/29 17:05:43 1.1.1.16 +++ nono/vm/fdc.cpp 2026/04/29 17:06:01 1.1.1.18 @@ -84,16 +84,17 @@ #include "bitops.h" #include "config.h" #include "dmac.h" +#include "event.h" #include "fdd.h" #include "monitor.h" #include "pedec.h" #include "scheduler.h" -// time [nsec] 後に呼び出す phase_event のコールバックをセットする。 +// time [tsec] 後に呼び出す phase_event のコールバックをセットする。 // func の書式が面倒なのを省略して書きたいため。 #define CallAfter(func_, time_) do { \ - phase_event.func = ToEventCallback(&FDCDevice::func_); \ - phase_event.time = time_; \ + phase_event->SetCallback(&FDCDevice::func_); \ + phase_event->time = time_; \ scheduler->RestartEvent(phase_event); \ } while (0) @@ -103,7 +104,7 @@ FDCDevice::FDCDevice() : inherited(OBJ_FDC) { monitor = gMonitorManager->Regist(ID_MONITOR_FDC, this); - monitor->func = ToMonitorCallback(&FDCDevice::MonitorUpdate); + monitor->SetCallback(&FDCDevice::MonitorScreen); // サイズは Create() 時に確定する } @@ -159,18 +160,18 @@ FDCDevice::Init() dmac = GetDMACDevice(); pedec = GetPEDECDevice(); - phase_event.SetName("FDC Phase"); - scheduler->RegistEvent(phase_event); + auto evman = GetEventManager(); + phase_event = evman->Regist(this, NULL, "FDC Phase"); - poll_event.func = ToEventCallback(&FDCDevice::PollEventCallback); - poll_event.time = 1024_usec; - poll_event.SetName("FDC Polling"); - scheduler->RegistEvent(poll_event); - - motor_event.func = ToEventCallback(&FDCDevice::MotorEventCallback); - motor_event.time = 38.54_sec; - motor_event.SetName("FDC SED9420A TMOUT"); - scheduler->RegistEvent(motor_event); + poll_event = evman->Regist(this, + ToEventCallback(&FDCDevice::PollEventCallback), + "FDC Polling"); + poll_event->time = 1024_usec; + + motor_event = evman->Regist(this, + ToEventCallback(&FDCDevice::MotorEventCallback), + "FDC SED9420A TMOUT"); + motor_event->time = 38.54_sec; return true; } @@ -413,7 +414,7 @@ FDCDevice::PokePort(uint32 offset, uint3 // モニタ更新 void -FDCDevice::MonitorUpdate(Monitor *, TextScreen& screen) +FDCDevice::MonitorScreen(Monitor *, TextScreen& screen) { int x; int y; @@ -570,12 +571,12 @@ FDCDevice::MonitorUpdate(Monitor *, Text for (int i = 0; i < fdd_vector.size(); i++) { f = fdd_vector[i]; if (f) { - f->MonitorUpdateFDD(screen, hd); + f->MonitorScreenFDD(screen, hd); } } } -// レジスタをビットごとに表示する。MonitorUpdate の下請け。 +// レジスタをビットごとに表示する。MonitorScreen の下請け。 void FDCDevice::MonitorReg(TextScreen& screen, int x, int y, uint8 reg, const char * const *names) @@ -584,7 +585,7 @@ FDCDevice::MonitorReg(TextScreen& screen if (names[i][0] == '-') { screen.Puts(x + i * 4, y, TA::Disable, "---"); } else { - bool b = reg & (1 << (7 - i)); + bool b = reg & (1U << (7 - i)); screen.Puts(x + i * 4, y, TA::OnOff(b), names[i]); } } @@ -866,13 +867,13 @@ FDCDevice::ResultPhase() } void -FDCDevice::ResultCallback(Event& ev) +FDCDevice::ResultCallback(Event *ev) { ResultPhase(); } void -FDCDevice::CommandCallback(Event& ev) +FDCDevice::CommandCallback(Event *ev) { msr.cb = true; if (cmdbuf.len == cmd->cmdlen) { @@ -921,7 +922,7 @@ FDCDevice::StartPoll() if (initialized == false) { return; } - if (poll_event.IsRunning() == false) { + if (poll_event->IsRunning() == false) { putlog(3, "Start polling"); scheduler->StartEvent(poll_event); } @@ -929,7 +930,7 @@ FDCDevice::StartPoll() // ポーリングイベントコールバック void -FDCDevice::PollEventCallback(Event& ev) +FDCDevice::PollEventCallback(Event *ev) { bool is_poll = false; @@ -1153,7 +1154,7 @@ FDCDevice::DriveSelect(uint8 drive) // 一定時間後に MOTOR_ON 信号をネゲートするイベント。 // SED9420 の TMOUT 信号に相当。 void -FDCDevice::MotorEventCallback(Event& ev) +FDCDevice::MotorEventCallback(Event *ev) { // 全ドライブに通知 for (const auto f : fdd_vector) { @@ -1304,7 +1305,7 @@ FDCDevice::XferStart(bool is_write) } void -FDCDevice::XferStartCallback(Event& ev) +FDCDevice::XferStartCallback(Event *ev) { // マーク位置まで待つ。 // マークを読んでみてディスパッチ。 @@ -1325,10 +1326,10 @@ FDCDevice::XferStartCallback(Event& ev) } if (dist == 0) { uint8 mark = fdd->ReadByte(); - ev.time = 1 * 16_usec; + ev->time = 1 * 16_usec; if (mark == MARK_IDAM) { // CHRN と CRC の合計時間を加算 - ev.time += (4 + 2) * 16_usec; + ev->time += (4 + 2) * 16_usec; resbuf.data.c = fdd->PeekByte(1); resbuf.data.h = fdd->PeekByte(2); @@ -1344,7 +1345,7 @@ FDCDevice::XferStartCallback(Event& ev) if ((cmdbuf.code & 0xbf) == 0x0a) { putlog(2, "READ ID complete"); st0.ic = ST0_IC_NT; - CallAfter(XferEndCallback, ev.time); + CallAfter(XferEndCallback, ev->time); return; } @@ -1357,7 +1358,7 @@ FDCDevice::XferStartCallback(Event& ev) { putlog(3, "Transfer decided"); xfer_start = true; - sect_remain = 1 << (7 + resbuf.data.n); + sect_remain = 1U << (7 + resbuf.data.n); if (cmdbuf.data.n == 0) { xfer_remain = cmdbuf.data.dtl; if (xfer_remain > 128) { @@ -1376,7 +1377,7 @@ FDCDevice::XferStartCallback(Event& ev) if (xfer_write) { RequestDataByte(); } - CallAfter(XferDataCallback, ev.time); + CallAfter(XferDataCallback, ev->time); return; } else { putlog(3, "DAM detected. Sector data will be skipped"); @@ -1396,24 +1397,24 @@ FDCDevice::XferStartCallback(Event& ev) } else { st1.ma = true; } - CallAfter(XferEndCallback, ev.time); + CallAfter(XferEndCallback, ev->time); return; } } } } else { // 次のマークまで待つ - ev.time = dist * 16_usec; + ev->time = dist * 16_usec; } scheduler->StartEvent(ev); } void -FDCDevice::XferDataCallback(Event& ev) +FDCDevice::XferDataCallback(Event *ev) { assert(fdd); - ev.time = 1 * 16_usec; + ev->time = 1 * 16_usec; // 変態フォーマットをサポートするときはこのへんに追加が必要。 @@ -1507,7 +1508,7 @@ FDCDevice::XferDataCallback(Event& ev) } void -FDCDevice::XferEndCallback(Event& ev) +FDCDevice::XferEndCallback(Event *ev) { st0.hd = hd; st0.us = us;