--- nono/vm/vm.cpp 2026/04/29 17:05:29 1.1.1.12 +++ nono/vm/vm.cpp 2026/04/29 17:05:46 1.1.1.14 @@ -25,6 +25,8 @@ VM::VM(const char *vmname_) // SignalThread は他のスレッドより先に起動する必要があるので、先頭。 // Scheduler は以降の他のデバイスからのイベント登録を受け付ける必要が // あるためその次。 + // Debugger は HostCOM と stdio ドライバが競合した場合に優先したいため + // もあって必ず先に配置する必要がある。 NEWDV(SignalThread, new SignalThread()); NEWDV(Scheduler, new Scheduler()); NEWDV(Syncer, new Syncer()); @@ -71,22 +73,37 @@ VM::Dispose() // だめだったらまた考える。 } -// コンストラクタ後の初期化 +// 動的コンストラクション。 bool -VM::Create() +VM::Create(VM::CreationPhase phase) { // d->Create() は Object を追加する場合があるため、ここで - // ranged for は使えない。また追加されたデバイスの Create() も + // ranged for は使えない。また追加されたデバイスの Create()/Create2() も // 実行したいため、ループ終了条件で毎回 size() を取り出して比較する。 for (int i = 0; i < gMainApp.GetObjects().size(); i++) { auto dev = dynamic_cast(gMainApp.GetObjects()[i]); if (dev) { - if (!dev->Create()) { - return false; + if (phase == CreationPhase::First) { + if (!dev->Create()) { + return false; + } + } else { + if (!dev->Create2()) { + return false; + } } } } + // ログのためのメンバ変数初期化。 + // 同じオブジェクトに対して複数回呼んでも副作用はない。 + for (auto obj : gMainApp.GetObjects()) { + auto dev = dynamic_cast(obj); + if (dev) { + dev->EarlyInit(); + } + } + return true; }