--- nono/vm/vm.cpp 2026/04/29 17:04:50 1.1.1.6 +++ nono/vm/vm.cpp 2026/04/29 17:04:53 1.1.1.7 @@ -24,12 +24,12 @@ VM::VM() PTHREAD_SETNAME("Main"); // バスエラーデバイスだけここで作成。 - buserr.reset(new BusErrDevice()); + gBusErr.reset(new BusErrDevice()); // まず全域をバスエラーで初期化。 // この後継承先で必要に応じて上書きする。 for (int i = 0; i < countof(::devtable); i++) { - ::devtable[i] = buserr.get(); + ::devtable[i] = gBusErr.get(); } } @@ -57,7 +57,11 @@ VM::Dispose() bool VM::Create() { - for (const auto& d : gDevices) { + // d->Create() は gDevices に要素を追加する場合があるため、ここで + // ranged for は使えない。また追加されたデバイスの Create() も(念のため) + // 実行したいため、ループ終了条件で毎回 size() を取り出して比較する。 + for (int i = 0; i < gDevices.size(); i++) { + Device *d = gDevices[i]; if (!d->Create()) { return false; } @@ -92,60 +96,18 @@ VM::Apply() return true; } -// VM の全デバイスの電源をオン -bool -VM::DevicePowerOn() -{ - // 時刻開始 - // RTC::PowerOn() でもいいかも知れないけど念のため全 PowerOn より先に。 - if (!gRTC->InitRTC()) { - return false; - } - - for (const auto& d : gDevices) { - if (!d->PowerOn()) { - return false; - } - } - - // ハードウェアリセット - ResetHard(); - - // スケジューラを開始 - gScheduler->Run(); - - return true; -} - -// VM の全デバイスの電源をオフ -// (Scheduler から呼ばれる) -bool -VM::DevicePowerOff() -{ - for (const auto& d : gDevices) { - if (!d->PowerOff()) { - return false; - } - } - // GUI に通知 - if (poweroff_callback) { - poweroff_callback(); - } - return true; -} - -// VM 電源オフ時のコールバックを設定する +// ブートページを切り替える (共通処理) +// 派生クラスから呼ぶこと。 void -VM::SetPowerOffCallback(void (*callback)()) +VM::SwitchBootPage(Device *parent, bool isrom) { - poweroff_callback = callback; -} - -// ハードウェアリセット -void -VM::ResetHard() -{ - for (const auto& d : gDevices) { - d->ResetHard(); + // ログ表示 + if (isrom) { + parent->putlogf(1, lstr("SwitchBootPage ROM (Boot)")); + } else { + parent->putlogf(1, lstr("SwitchBootPage RAM (Normal)")); } + + // スケジューラに指示 + gScheduler->RequestBootPageMode(isrom); }