--- nono/vm/fdc.cpp 2026/04/29 17:05:38 1.1.1.15 +++ nono/vm/fdc.cpp 2026/04/29 17:05:43 1.1.1.16 @@ -133,7 +133,13 @@ FDCDevice::Create() // vector は面倒なので一旦 unique_ptr[] に確保して // 生ポインタの vector を作る。うーん。 for (int i = 0; i < ndrive; i++) { - fdd_list[i].reset(new FDDDevice(i)); + try { + fdd_list[i].reset(new FDDDevice(i)); + } catch (...) { } + if ((bool)fdd_list[i] == false) { + warnx("Failed to initialize FDDDevice(%u) at %s", i, __method__); + return false; + } } for (int i = 0; i < ndrive; i++) { if ((bool)fdd_list[i]) { @@ -899,11 +905,8 @@ FDCDevice::ReadyChanged(int unit, bool i // ことの通知を受けてポーリングループを起動し、どのユニットも変化が // なくなったらポーリングを止めるようにしておく。 // uPD765 マニュアル POLLING FEATURE OF THE uPD765 (p.433) + StartPoll(); - // SPECIFY コマンドで有効になる - if (initialized) { - StartPoll(); - } // 転送の同期を取るために、READY になった時刻を覚えておく if (is_ready) { unitinfo[unit].ready_time = scheduler->GetVirtTime(); @@ -914,6 +917,10 @@ FDCDevice::ReadyChanged(int unit, bool i void FDCDevice::StartPoll() { + // SPECIFY コマンドで有効になる + if (initialized == false) { + return; + } if (poll_event.IsRunning() == false) { putlog(3, "Start polling"); scheduler->StartEvent(poll_event); @@ -1045,9 +1052,7 @@ FDCDevice::SetForceReady(bool force_read { force_ready = force_ready_; putlog(2, "Force Ready %s", force_ready ? "On" : "Off"); - if (initialized) { - StartPoll(); - } + StartPoll(); } // DACK 信号をアサートする (DMAC から呼ばれる) @@ -1140,9 +1145,7 @@ FDCDevice::DriveSelect(uint8 drive) // ドライブセレクト信号線が変わったら READY が変わるかもしれないので // ポーリングを再開する必要がある。 - if (initialized) { - StartPoll(); - } + StartPoll(); // いまのところ LUNA のことは忘れる }