--- nono/wx/wxmainframe.cpp 2026/04/29 17:04:30 1.1.1.2 +++ nono/wx/wxmainframe.cpp 2026/04/29 17:04:33 1.1.1.3 @@ -6,13 +6,16 @@ #include "vm.h" #include "bitmap.h" #include "bt454.h" +#include "dmac.h" #include "keyboard.h" #include "lance.h" #include "lcd.h" +#include "mainapp.h" #include "mfp.h" #include "mpu.h" #include "netdriver.h" #include "rtc.h" +#include "scc.h" #include "scheduler.h" #include "sio.h" #include "spc.h" @@ -32,6 +35,7 @@ WXMainFrame *gMainFrame; wxBEGIN_EVENT_TABLE(WXMainFrame, inherited) EVT_CREATE(WXMainFrame::OnCreate) + EVT_CLOSE(WXMainFrame::OnClose) EVT_MENU(wxID_EXIT, WXMainFrame::OnExit) EVT_MENU(ID_FULL_SPEED, WXMainFrame::OnFullSpeed) @@ -53,9 +57,9 @@ wxEND_EVENT_TABLE() WXMainFrame::WXMainFrame(wxWindow *parent) : wxFrame(parent, wxID_ANY, wxT("nono")) { - int vmtype; + vmtype_t vmtype; - vmtype = gVM->GetType(); + vmtype = gMainApp.GetVMType(); // とりあえずメニュー // XXX すぐにメニューファクトリーになる @@ -92,42 +96,58 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuMonitor->Append(WinID_MONITOR_LOG, wxT("ログ(&L)"), "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_MPUREG, wxT("MPU レジスタ(&R)"), "", wxITEM_CHECK); - menuMonitor->Append(WinID_MONITOR_MPUATC, wxT("MPU(&ATC)"), - "", wxITEM_CHECK); - menuMonitor->Append(WinID_MONITOR_MPUBRHIST, wxT("MPU(ブランチ履歴)(&H)"), - "", wxITEM_CHECK); - menuMonitor->Append(WinID_MONITOR_MEMDUMP, wxT("メモリダンプ(&D)"), - "", wxITEM_CHECK); - if (vmtype == VM::TYPE_X68030) { - menuMonitor->Append(WinID_MONITOR_MFP, wxT("&MFP"), "", wxITEM_CHECK); + if (gMPU680x0) { + menuMonitor->Append(WinID_MONITOR_MPUATC, wxT("MPU(&ATC)"), + "", wxITEM_CHECK); + menuMonitor->Append(WinID_MONITOR_MPUBRHIST, + wxT("MPU(ブランチ履歴)(&H)"), "", wxITEM_CHECK); } + menuMonitor->Append(WinID_MONITOR_MEMDUMP, wxT("メモリダンプ(&M)"), + "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_SPC, wxT("S&PC"), "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_RTC, wxT("&RTC"), "", wxITEM_CHECK); - if (vmtype == VM::TYPE_LUNA) { + // 機種別のデバイス + if (vmtype == VMTYPE_X68030) { + menuMonitor->Append(WinID_MONITOR_DMAC, wxT("&DMAC"), "", wxITEM_CHECK); + menuMonitor->Append(WinID_MONITOR_MFP, wxT("M&FP"), "", wxITEM_CHECK); + menuMonitor->Append(WinID_MONITOR_SCC, wxT("S&CC"), "", wxITEM_CHECK); + } + if (vmtype == VMTYPE_LUNA || vmtype == VMTYPE_LUNA88K) { menuMonitor->Append(WinID_MONITOR_SIO, wxT("S&IO"), "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_LUNAKEYBOARD, wxT("キーボード/マウス(&K)"), "", wxITEM_CHECK); + } + if (vmtype == VMTYPE_LUNA) { menuMonitor->Append(WinID_MONITOR_LCD, wxT("LCD(&J)"), "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_LANCE, wxT("Lance(&E)"), "", wxITEM_CHECK); + } + if (vmtype == VMTYPE_LUNA || vmtype == VMTYPE_LUNA88K) { menuMonitor->Append(WinID_MONITOR_BITMAP, wxT("ビットマップ制御(&B)"), "", wxITEM_CHECK); menuMonitor->Append(WinID_MONITOR_BITMAP0, wxT("ビットマップ#&0"), "", wxITEM_CHECK); } - menuMonitor->Append(WinID_MONITOR_NETDRIVER, wxT("ホストネットワーク(&N)"), - "", wxITEM_CHECK); + if (vmtype == VMTYPE_LUNA) { + menuMonitor->Append(WinID_MONITOR_NETDRIVER, + wxT("ホストネットワーク(&N)"), "", wxITEM_CHECK); + } menubar->Append(menuMonitor, wxT("モニター(&M)")); SetMenuBar(menubar); wxString title("nono"); switch (vmtype) { - case VM::TYPE_LUNA: + case VMTYPE_X68030: + title += "(X68030)"; + break; + case VMTYPE_LUNA: title += "(LUNA-I)"; break; - case VM::TYPE_X68030: - title += "(X68030)"; + case VMTYPE_LUNA88K: + title += "(LUNA88K)"; + break; + default: break; } SetTitle(title); @@ -179,6 +199,24 @@ WXMainFrame::OnCreate(wxCommandEvent& ev gVM->PowerButton(); } +// ウィンドウクローズイベント +void +WXMainFrame::OnClose(wxCloseEvent& event) +{ + // サブウィンドウを全部閉じる + for (int i = 0; i < WinID_MAX; i++) { + if (windows[i] != NULL) { + windows[i]->Close(); + } + } + + // VM を解放 + gVM.reset(); + + // 後はデフォルト処理 + event.Skip(); +} + // メニューの「高速モード」イベント void WXMainFrame::OnFullSpeed(wxCommandEvent& event) @@ -254,7 +292,9 @@ WXMainFrame::OnMenuFontSize(wxCommandEve { fontsize_t fontsize; - assert(ID_FONTSIZE_12 <= event.GetId() && event.GetId() <= ID_FONTSIZE_24); + assertmsg( + ID_FONTSIZE_12 <= event.GetId() && event.GetId() <= ID_FONTSIZE_24, + "event.GetId()=%d", event.GetId()); switch (event.GetId()) { case ID_FONTSIZE_12: fontsize = FONT_6x12; @@ -339,53 +379,60 @@ WXMainFrame::DoWindow(int id, bool enabl break; case WinID_MONITOR_SCHEDULER: windows[id] = new WXMonitorWindow(this, id, wxT("スケジューラ"), - gScheduler); + gScheduler.get()); break; case WinID_MONITOR_MPUREG: windows[id] = new WXMonitorWindow(this, id, wxT("MPU レジスタ"), - gMPU); + gMPU.get()); break; case WinID_MONITOR_MPUATC: windows[id] = new WXMonitorWindow(this, id, wxT("MPU (ATC)"), - gMPUATC); + gMPUATC.get()); break; case WinID_MONITOR_MPUBRHIST: windows[id] = new WXMonitorWindow(this, id, - wxT("MPU (ブランチ履歴)"), gMPUBrHist); + wxT("MPU (ブランチ履歴)"), gMPUBrHist.get()); break; case WinID_MONITOR_MEMDUMP: windows[id] = new WXMemdumpWindow(this, id); break; - case WinID_MONITOR_MFP: - windows[id] = new WXMonitorWindow(this, id, wxT("MFP"), gMFP); - break; case WinID_MONITOR_SPC: - windows[id] = new WXMonitorWindow(this, id, wxT("SPC"), gSPC); + windows[id] = new WXMonitorWindow(this, id, wxT("SPC"), gSPC.get()); break; case WinID_MONITOR_RTC: - windows[id] = new WXMonitorWindow(this, id, wxT("RTC"), gRTC); + windows[id] = new WXMonitorWindow(this, id, wxT("RTC"), gRTC.get()); + break; + case WinID_MONITOR_DMAC: + windows[id] = new WXMonitorWindow(this, id, wxT("DMAC"), + gDMAC.get()); + break; + case WinID_MONITOR_MFP: + windows[id] = new WXMonitorWindow(this, id, wxT("MFP"), gMFP.get()); + break; + case WinID_MONITOR_SCC: + windows[id] = new WXMonitorWindow(this, id, wxT("SCC"), gSCC.get()); break; case WinID_MONITOR_SIO: - windows[id] = new WXMonitorWindow(this, id, wxT("SIO"), gSIO); + windows[id] = new WXMonitorWindow(this, id, wxT("SIO"), gSIO.get()); break; case WinID_MONITOR_LUNAKEYBOARD: windows[id] = new WXMonitorWindow(this, id, - wxT("キーボード/マウス"), gKeyboard); + wxT("キーボード/マウス"), gKeyboard.get()); break; case WinID_MONITOR_LCD: - windows[id] = new WXMonitorWindow(this, id, wxT("LCD"), gLCD); + windows[id] = new WXMonitorWindow(this, id, wxT("LCD"), gLCD.get()); break; case WinID_MONITOR_LANCE: windows[id] = new WXMonitorWindow(this, id, wxT("Lance"), - dynamic_cast(gEthernet)); + dynamic_cast(gEthernet.get())); break; case WinID_MONITOR_NETDRIVER: windows[id] = new WXMonitorWindow(this, id, - wxT("ホストネットワーク"), gNetDriver); + wxT("ホストネットワーク"), gNetDriver.get()); break; case WinID_MONITOR_BITMAP: windows[id] = new WXMonitorWindow(this, id, wxT("ビットマップ制御"), - gBitmap); + gBitmap.get()); break; case WinID_MONITOR_BITMAP0: windows[id] = new WXLunaBitmapWindow(this, id, @@ -447,9 +494,11 @@ WXMainFrame::monitor_names[WinID_MAX] = "mpuatc", // MPUATC "mpuhist", // MPUBRHIST "memdump", // MEMDUMP - "mfp", // MFP "spc", // SPC "rtc", // RTC + "dmac", // DMAC + "mfp", // MFP + "scc", // SCC "sio", // SIO "keyboard", // LunaKeyboard "lcd", // LCD