--- nono/wx/wxmainframe.cpp 2026/04/29 17:05:16 1.1.1.15 +++ nono/wx/wxmainframe.cpp 2026/04/29 17:05:19 1.1.1.16 @@ -233,10 +233,15 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuFile->Append(ID_RESTART_VM, _("&Restart VM"), ""); menuFile->Append(ID_EXIT, _("E&xit")); menubar->Append(menuFile, _("&File")); + // NEWS は手抜きで Init() がリセットベクタを RAM に書いてるだけなので + // リスタート出来ない。 + if (gMainApp.IsNEWS()) { + menuFile->Enable(ID_RESTART_VM, false); + } // メニュー > 設定 wxMenu *menuSet = new wxMenu(); - menuSet->Append(ID_FULL_SPEED, _("Full &Speed Mode"), "", wxITEM_CHECK); + menuSet->AppendCheckItem(ID_FULL_SPEED, _("Full &Speed Mode")); if (keyboard) { wxMenu *menuSetInput = new wxMenu(); menuSetInput->AppendRadioItem(ID_INPUT_CHAR, _("By &Character")); @@ -284,25 +289,21 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuMonRate->AppendRadioItem(ID_MONRATE_START + i, text); } menuDisplay->AppendSubMenu(menuMonRate, _("&Monitor Speed")); - menuDisplay->Append(ID_SHOW_STATPANEL, _("Show Status &Panel"), "", - wxITEM_CHECK); + menuDisplay->AppendCheckItem(ID_SHOW_STATPANEL, _("Show Status &Panel")); menubar->Append(menuDisplay, _("&View")); // メニュー > デバイス wxMenu *menuDevice = new wxMenu(); CreateRemovableMenu(menuDevice); if (keyboard) { - menuDevice->Append(ID_SUBWIN_SOFTKEY, _("Software &Keyboard"), - "", wxITEM_CHECK); - menuDevice->Append(ID_MOUSEMODE, _("&Mouse Mode\tCTRL+F12"), - "", wxITEM_CHECK); + menuDevice->AppendCheckItem(ID_SUBWIN_SOFTKEY, _("Software &Keyboard")); + menuDevice->AppendCheckItem(ID_MOUSEMODE, _("&Mouse Mode\tCTRL+F12")); } - if (gMainApp.Has(VMCap::LUNA)) { - menuDevice->Append(ID_SUBWIN_LCDPANEL, _("Front &LCD"), - "", wxITEM_CHECK); + if (gMainApp.FindObject(OBJ_LCD)) { + menuDevice->AppendCheckItem(ID_SUBWIN_LCDPANEL, _("Front &LCD")); } - if (gMainApp.Has(VMCap::LUNA | VMCap::NEWS)) { - menuDevice->Append(ID_SUBWIN_DIPSW, "&DIPSW", "", wxITEM_CHECK); + if (gMainApp.FindObject(OBJ_DIPSW)) { + menuDevice->AppendCheckItem(ID_SUBWIN_DIPSW, "&DIPSW"); } menuDevice->AppendSeparator(); wxMenu *menuOper = new wxMenu(); @@ -327,17 +328,15 @@ WXMainFrame::WXMainFrame(wxWindow *paren menuOper->AppendSeparator(); sep = true; } - menuOper->Append(ID_KEYBOARD_CONNECT, _("Connect &Keyboard"), - "", wxITEM_CHECK); + menuOper->AppendCheckItem(ID_KEYBOARD_CONNECT, _("Connect &Keyboard")); } menuDevice->AppendSubMenu(menuOper, _("&Operation")); menubar->Append(menuDevice, _("&Device")); - // 機種によってモニタウィンドウを追加する + // モニタがあればメニューに追加する #define AppendIf(menu, id, label) do { \ - VMCap vmcap_ = gMonitorManager->GetVMCap(id); \ - if (gMainApp.Has(vmcap_)) { \ - (menu)->Append((id), (label), "", wxITEM_CHECK); \ + if (gMonitorManager->Find(id)) { \ + (menu)->AppendCheckItem((id), (label)); \ } \ } while (0) #define AppendIfSeparator(menu, vmcap_) do { \ @@ -393,6 +392,14 @@ WXMainFrame::WXMainFrame(wxWindow *paren // MONITOR_RTC は X68k の RTC、LUNA では MONITOR_MK48T02 だが今の所 // NVRAM 側のことは表示してないのでラベルも RTC にしてある。 wxMenu *menuDev = new wxMenu(); + // X68030 は基本が 24bit のほうなので区別しておく。 + if (gMainApp.IsX68030()) { + AppendIf(menuDev, ID_MONITOR_MAINBUS, _("Device Map (32bit space)")); + AppendIf(menuDev, ID_SUBWIN_X68KIO, _("Device Map (24bit space)")); + } else { + AppendIf(menuDev, ID_MONITOR_MAINBUS, _("Device Map")); + } + menuDev->AppendSeparator(); AppendIf(menuDev, ID_MONITOR_SPC, "SPC"); AppendIf(menuDev, ID_MONITOR_SCSIDEVS, _("SCSI Devices")); AppendIf(menuDev, ID_MONITOR_RTC, "RTC"); @@ -405,6 +412,18 @@ WXMainFrame::WXMainFrame(wxWindow *paren AppendIf(menuDev, ID_MONITOR_PIO, "PIO0/PIO1"); AppendIf(menuDev, ID_MONITOR_KEYBOARD, _("Keyboard/Mouse")); AppendIf(menuDev, ID_MONITOR_LANCE, "Lance"); + AppendIf(menuDev, ID_MONITOR_NEREID, "Nereid"); + // RTL8019AS は X68030 なら常に表示して Nereid がなければ Disable。 + if (gMainApp.Has(VMCap::X68030)) { + for (int i = 0; i < 2; i++) { + int id = ID_MONITOR_RTL8019AS(i); + wxString name = string_format("Nereid(RTL8019AS) #%d", i); + menuDev->AppendCheckItem(id, name); + if (gMonitorManager->Find(id) == NULL) { + menuDev->Enable(id, false); + } + } + } AppendIf(menuDev, ID_MONITOR_LCD, "LCD"); AppendIf(menuDev, ID_MONITOR_SYSCLK, _("System Clock")); AppendIf(menuDev, ID_MONITOR_CRTC, "CRTC"); @@ -417,11 +436,31 @@ WXMainFrame::WXMainFrame(wxWindow *paren AppendIf(menuDev, ID_SUBWIN_TVRAM, _("Text VRAM")); AppendIf(menuDev, ID_MONITOR_ROMCONS, _("ROM Console (provisional)")); AppendIf(menuDev, ID_SUBWIN_ROM, "ROM"); - menuMonitor->AppendSubMenu(menuDev, _("De&vice")); + // LUNA はバスが複数あるので Mainbus Device とする。 + // 他の機種ではメインて言われても困るので Device とする。 + if (gMainApp.Has(VMCap::LUNA)) { + menuMonitor->AppendSubMenu(menuDev, _("Mainbus De&vice")); + } else { + menuMonitor->AppendSubMenu(menuDev, _("De&vice")); + } wxMenu *menuHost = new wxMenu(); AppendIf(menuHost, ID_MONITOR_WXHOSTINFO, _("Host &Information")); - AppendIf(menuHost, ID_MONITOR_HOSTNET, _("Host &Network")); + if (gMainApp.IsX68030()) { + // X68030 ではネットワークは最大2つあるのでナンバリングが必要。 + // あれば表示ではなく、なければ Disable。 + for (int i = 0; i < 2; i++) { + int id = ID_MONITOR_HOSTNET(i); + wxString name = string_format(_("Host Network #%d"), i); + menuHost->AppendCheckItem(id, name); + if (gMonitorManager->Find(id) == NULL) { + menuHost->Enable(id, false); + } + } + } else { + // それ以外ではネットワークは1つ固定なのでナンバリング不要 + AppendIf(menuHost, ID_MONITOR_HOSTNET(0), _("Host Network")); + } AppendIf(menuHost, ID_MONITOR_HOSTCOM, _("Host &Serial Port")); menuMonitor->AppendSubMenu(menuHost, _("&Host")); @@ -1333,8 +1372,15 @@ WXMainFrame::DoWindow(int id, bool enabl SetMonitor(id, _("Host Serial Port")); break; - case ID_MONITOR_HOSTNET: - SetMonitor(id, _("Host Network")); + case ID_MONITOR_HOSTNET0: + case ID_MONITOR_HOSTNET1: + if (gMainApp.IsX68030()) { + int n = id - ID_MONITOR_HOSTNET0; + wxString name = string_format(_("Host Network #%d"), n); + SetMonitor(id, name); + } else { + SetMonitor(id, _("Host Network")); + } break; case ID_MONITOR_INTERRUPT: @@ -1366,6 +1412,18 @@ WXMainFrame::DoWindow(int id, bool enabl SetMonitor(id, _("Video Control")); break; + case ID_MONITOR_MAINBUS: + { + wxString name; + if (gMainApp.IsX68030()) { + name = _("Device Map (32bit space)"); + } else { + name = _("Device Map"); + } + SetMonitor(id, name); + break; + } + case ID_MONITOR_MEMDUMP0 ... ID_MONITOR_MEMDUMP(MAX_MEMDUMP_MONITOR - 1): case ID_MONITOR_XPMEMDUMP0 ... @@ -1394,6 +1452,10 @@ WXMainFrame::DoWindow(int id, bool enabl break; } + case ID_MONITOR_NEREID: + SetMonitor(id, "Nereid"); + break; + case ID_MONITOR_ROMCONS: SetMonitor(id, _("ROM Console (provisional)")); break; @@ -1410,6 +1472,15 @@ WXMainFrame::DoWindow(int id, bool enabl SetMonitor(id, "RTC (RP5C15)"); break; + case ID_MONITOR_RTL8019AS0: + case ID_MONITOR_RTL8019AS1: + { + int n = id - ID_MONITOR_RTL8019AS0; + wxString name = string_format("Nereid (RTL8019AS) #%d", n); + SetMonitor(id, name); + break; + } + case ID_MONITOR_SCC: SetMonitor(id, "SCC (Z8530)"); break; @@ -1545,6 +1616,14 @@ WXMainFrame::DoWindow(int id, bool enabl gMonitorManager->Get(id))); break; } + + case ID_SUBWIN_X68KIO: + { + windows[id].reset(new WXScrollMonitorWindow(this, + _("Device Map (24bit space)"), + gMonitorManager->Get(id))); + break; + } case ID_SUBWIN_XPBRHIST: {