--- nono/vm/fdd.cpp 2026/04/29 17:05:29 1.1.1.4 +++ nono/vm/fdd.cpp 2026/04/29 17:05:51 1.1.1.6 @@ -14,10 +14,11 @@ // セクタは 128~ バイトで構成される。 // 割り込み状態はこちらでは保持しておらず PEDEC 側で持っている。 -// PEDEC への割り込みは AssertInt() するだけで使っている。 +// PEDEC への割り込みは AssertINT() するだけで使っている。 #include "fdd.h" #include "config.h" +#include "event.h" #include "fdc.h" #include "mainapp.h" #include "pedec.h" @@ -101,10 +102,6 @@ FDDDevice::~FDDDevice() bool FDDDevice::Init() { - if (inherited::Init() == false) { - return false; - } - fdc = GetFDCDevice(); pedec = GetPEDECDevice(); @@ -112,8 +109,6 @@ FDDDevice::Init() const std::string imgkey = keybody + "image"; const std::string wikey = keybody + "writeignore"; - // デバイス種別(v[0])とパス(v[1])に分解。 - // デバイス種別はすでにチェックしてあるのでここでは不要。 const ConfigItem& itemimg = gConfig->Find(imgkey); const std::string& filename = itemimg.AsString(); @@ -123,9 +118,10 @@ FDDDevice::Init() scheduler->ConnectMessage(MessageID::FDD_UNLOAD(unit), this, ToMessageCallback(&FDDDevice::UnloadMessage)); - event.func = ToEventCallback(&FDDDevice::EventCallback); - event.SetName(GetName()); - scheduler->RegistEvent(event); + auto evman = GetEventManager(); + event = evman->Regist(this, + ToEventCallback(&FDDDevice::EventCallback), + GetName()); // オープン前に writeignore をチェック。 // この後パス名を処理するとすぐに UI に通知を出すため、それより前で @@ -139,10 +135,6 @@ FDDDevice::Init() if (LoadDisk(path) == false) { return false; } - } else { - // メディアがロードされないままでも起動時は必ず通知を投げる。 - // ステータスパネルはこの UIMessage でのみ状態を更新するため。 - MediaChanged(); } return true; @@ -252,8 +244,6 @@ XX>01234567890123456 01234567890123456| // ヘッド位置 screen.Print(ux, uy + heady, selattr, "%2u>", cylinder); screen.Puts(ux + hd * 18 + 3 + headx, uy + heady, selattr, "#"); - // 裏のヘッド位置 - screen.Puts(ux + (1 - hd) * 18 + 3 + headx, uy + heady, selattr, "+"); } // READY 信号 @@ -306,7 +296,7 @@ FDDDevice::SetMotorOn(bool motor_on_) } void -FDDDevice::EventCallback(Event& ev) +FDDDevice::EventCallback(Event *ev) { // モータが回転している間は1バイトずつ進める pos++; @@ -321,31 +311,31 @@ FDDDevice::EventCallback(Event& ev) case SPIN_UP: // 増速中 - if (event.time == 16_usec) { + if (event->time == 16_usec) { motor_state = READY; // READY になったので FDC に通知 fdc->ReadyChanged(unit, true); } else { - if (event.time < 16_usec) { + if (event->time < 16_usec) { // オーバーシュート対応 - event.time = 16_usec; + event->time = 16_usec; } else { - event.time /= 2; + event->time /= 2; } - putlog(4, "SPIN_UP next=%uusec", (uint)(event.time / 1_usec)); + putlog(4, "SPIN_UP next=%uusec", (uint)(event->time / 1_usec)); } scheduler->StartEvent(ev); break; case SPIN_DOWN: - if (event.time >= 262144_usec) { + if (event->time >= 262144_usec) { motor_state = STOPPED; // イベント停止、ここでは time も 0 クリアしておく。 - event.time = 0; + event->time = 0; } else { - event.time *= 2; + event->time *= 2; scheduler->StartEvent(ev); - putlog(4, "SPIN_DOWN next=%uusec", (uint)(event.time / 1_usec)); + putlog(4, "SPIN_DOWN next=%uusec", (uint)(event->time / 1_usec)); } break; @@ -398,8 +388,8 @@ FDDDevice::DoMotorOn() // 仕様では 500msec で READY になるとあるが、ここでは 2 のべき乗を // 使っているので、約 524msec かかる。細かいことは気にしない。 motor_state = SPIN_UP; - event.time = 262144_usec; - putlog(4, "SPIN_UP next=%uusec", (uint)(event.time / 1_usec)); + event->time = 262144_usec; + putlog(4, "SPIN_UP next=%uusec", (uint)(event->time / 1_usec)); } else if (motor_state == SPIN_DOWN) { // 細かいことは無視して、増速に転じる motor_state = SPIN_UP; @@ -795,7 +785,7 @@ FDDDevice::Clear() void FDDDevice::MediaChanged() const { - UIMessage::Post(UIMessage::FDD_MEDIA_CHANGE, unit); + gMainApp.GetUIMessage()->Post(UIMessage::FDD_MEDIA_CHANGE, unit); } // メディアを挿入する。 @@ -821,7 +811,7 @@ FDDDevice::LoadMessage(MessageID msgid, { if (LoadDisk(new_pathname) == false) { // 失敗したら UI に通知 - UIMessage::Post(UIMessage::FDD_MEDIA_FAILED); + gMainApp.GetUIMessage()->Post(UIMessage::FDD_MEDIA_FAILED); } }