--- nono/wx/wxapp.cpp 2026/04/29 17:05:16 1.1.1.13 +++ nono/wx/wxapp.cpp 2026/04/29 17:05:31 1.1.1.16 @@ -29,10 +29,10 @@ class WXApp : public wxApp int OnRun() override; private: bool ParseMonitors(const wxString& str); - bool ParseMemdumpValue(int id, const std::string&, const std::string&); + bool ParseMemdumpValue(uint id, const std::string&, const std::string&); void ShowMonitorsName(); int SearchMonitorName(const char *name); - int FindAvailable(const std::vector& candidates, + int FindAvailable(const std::vector& candidates, const std::string& name, int basenum, int count) const; wxLocale locale; @@ -157,7 +157,13 @@ WXApp::OnRun() return EXIT_FAILURE; } - return inherited::OnRun(); + // イベントループ。 + rv = inherited::OnRun(); + + // 戻ってきたので VM を解放。 + gMainApp.Dispose(); + + return rv; } // -M オプションの解析。書式は @@ -215,11 +221,11 @@ WXApp::ParseMonitors(const wxString& str // 書式は [.] // fmt は B/W/L と M(MMU)、I(dIsasm)、Z(XPdisasm) bool -WXApp::ParseMemdumpValue(int id, +WXApp::ParseMemdumpValue(uint id, const std::string& name, const std::string& value) { auto mon = gMonitorManager->Get(id); - auto memdump = dynamic_cast(mon.obj); + auto memdump = dynamic_cast(mon->obj); assert(memdump); errno = 0; @@ -254,15 +260,15 @@ WXApp::ParseMemdumpValue(int id, if (gMainApp.Has(VMCap::M88K)) { fmt = Memdump::M88200Page; } else { - // ロングは指定できないけど使われてないので放置 - fmt = Memdump::M68030PageShort; + // m68k はちょっと複雑すぎて放置。 + goto usage; } break; case 'I': if (gMainApp.Has(VMCap::M88K)) { fmt = Memdump::M88100Disasm; } else { - fmt = Memdump::M68030Disasm; + fmt = Memdump::M680x0Disasm; } break; case 'Z': @@ -270,7 +276,7 @@ WXApp::ParseMemdumpValue(int id, break; default: usage: - warnx("-M %s=%s: syntax error; syntax is \"[.]\"", + warnx("-M %s=%s: syntax error; syntax is \"[.]\"", name.c_str(), value.c_str()); return false; } @@ -286,17 +292,17 @@ WXApp::ParseMemdumpValue(int id, void WXApp::ShowMonitorsName() { - std::vector list; + std::vector list; // モニターは登録されていれば列挙 // (登録されているものを全部列挙ではないことに注意) - for (int id = ID_MONITOR_START; id <= ID_MONITOR_END; id++) { + for (uint id = ID_MONITOR_START; id <= ID_MONITOR_END; id++) { if (gMonitorManager->Find(id)) { list.push_back(id); } } // サブウィンドウは機種情報から判断 - for (int id = ID_SUBWIN_START; id <= ID_SUBWIN_END; id++) { + for (uint id = ID_SUBWIN_START; id <= ID_SUBWIN_END; id++) { VMCap vmcap = gMonitorManager->GetVMCap(id); if (gMainApp.Has(vmcap)) { list.push_back(id); @@ -318,10 +324,10 @@ WXApp::ShowMonitorsName() int WXApp::SearchMonitorName(const char *name) { - std::vector candidates; + std::vector candidates; std::vector cand_names; - for (int id = ID_MONITOR_START; id <= ID_SUBWIN_END; id++) { + for (uint id = ID_MONITOR_START; id <= ID_SUBWIN_END; id++) { if (id < ID_SUBWIN_START) { // モニターは登録されていなければ除外する if (gMonitorManager->Find(id) == NULL) { @@ -366,7 +372,7 @@ WXApp::SearchMonitorName(const char *nam return candidates[0]; } else { // 候補が複数あった - int id; + uint id; // "memdump" を空いてる "memdump*" に割り当てる id = FindAvailable(candidates, "memdump", @@ -402,7 +408,7 @@ WXApp::SearchMonitorName(const char *nam // start は ID_MONITOR_*0、count は MAX_*_MONITOR のほうで、 // 最初と最後の ID ではないので注意。 int -WXApp::FindAvailable(const std::vector& candidates, +WXApp::FindAvailable(const std::vector& candidates, const std::string& name, int start, int count) const { // candidates がすべてこの start..end に入っているか