|
|
1.1 root 1: //
2: // nono
1.1.1.4 ! root 3: // Copyright (C) 2020 nono project
! 4: // Licensed under nono-license.txt
1.1 root 5: //
6:
1.1.1.4 ! root 7: #include "wxmainframe.h"
! 8: #include "wxdumpmonitor.h"
! 9: #include "wxlogmonitor.h"
! 10: #include "wxmainview.h"
! 11: #include "wxmonitor.h"
! 12: #include "wxmpumonitor.h"
! 13: #include "wxsoftkey.h"
! 14: #include "wxtextpanel.h"
! 15: #include "wxversion.h"
! 16: #include "wxvideomonitor.h"
1.1 root 17: #include "bitmap.h"
18: #include "bt454.h"
1.1.1.3 root 19: #include "dmac.h"
1.1.1.2 root 20: #include "keyboard.h"
1.1 root 21: #include "lance.h"
22: #include "lcd.h"
1.1.1.3 root 23: #include "mainapp.h"
1.1 root 24: #include "mfp.h"
1.1.1.4 ! root 25: #include "mpu680x0.h"
! 26: #include "mpu88xx0.h"
1.1 root 27: #include "netdriver.h"
1.1.1.4 ! root 28: #include "pio.h"
1.1 root 29: #include "rtc.h"
1.1.1.3 root 30: #include "scc.h"
1.1 root 31: #include "scheduler.h"
32: #include "sio.h"
33: #include "spc.h"
1.1.1.4 ! root 34: #include "sysctlr.h"
! 35: #include "vm.h"
1.1 root 36:
37: static void wxmainframe_poweroff_callback();
1.1.1.4 ! root 38: static void wxmainframe_halt_callback(void *);
1.1 root 39:
40: WXMainFrame *gMainFrame;
41:
42: wxBEGIN_EVENT_TABLE(WXMainFrame, inherited)
43: EVT_CREATE(WXMainFrame::OnCreate)
1.1.1.3 root 44: EVT_CLOSE(WXMainFrame::OnClose)
1.1 root 45: EVT_MENU(wxID_EXIT, WXMainFrame::OnExit)
46:
47: EVT_MENU(ID_FULL_SPEED, WXMainFrame::OnFullSpeed)
48: EVT_UPDATE_UI(ID_FULL_SPEED, WXMainFrame::OnFullSpeedUI)
49: EVT_MENU_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1,
50: WXMainFrame::OnMenuScale)
51: EVT_UPDATE_UI_RANGE(ID_SCALE_START + 1, ID_SCALE_END - 1,
52: WXMainFrame::OnMenuScaleUI)
53: EVT_MENU_RANGE(ID_FONTSIZE_START + 1, ID_FONTSIZE_END - 1,
54: WXMainFrame::OnMenuFontSize)
55: EVT_UPDATE_UI_RANGE(ID_FONTSIZE_START + 1, ID_FONTSIZE_END - 1,
56: WXMainFrame::OnMenuFontSizeUI)
1.1.1.2 root 57: EVT_MENU(ID_MOUSEMODE, WXMainFrame::OnMouseMode)
58: EVT_UPDATE_UI(ID_MOUSEMODE, WXMainFrame::OnMouseModeUI)
1.1 root 59: EVT_MENU_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindow)
60: EVT_UPDATE_UI_RANGE(WinID_Start, WinID_MAX - 1, WXMainFrame::OnWindowUI)
1.1.1.4 ! root 61: EVT_MENU(wxID_ABOUT, WXMainFrame::OnAbout)
! 62:
! 63: EVT_COMMAND(wxID_ANY, WXW_EVT_HALT_NOTIFY, WXMainFrame::OnHaltNotify)
1.1 root 64: wxEND_EVENT_TABLE()
65:
66: WXMainFrame::WXMainFrame(wxWindow *parent)
1.1.1.4 ! root 67: : wxFrame(parent, wxID_ANY, "nono")
1.1 root 68: {
1.1.1.3 root 69: vmtype_t vmtype;
1.1 root 70:
1.1.1.3 root 71: vmtype = gMainApp.GetVMType();
1.1 root 72:
1.1.1.4 ! root 73: // どこらでやるのがいいか分からんけどサブウィンドウ用の変数を初期化。
! 74: WXSubWindow::BorderFlags.Expand().Border(wxALL, 1);
! 75:
1.1 root 76: // とりあえずメニュー
77: // XXX すぐにメニューファクトリーになる
78: wxMenuBar *menubar = new wxMenuBar();
79: wxMenu *menuFile = new wxMenu();
80: // XXX とりあえず適当なところにおいとく
1.1.1.4 ! root 81: menuFile->Append(ID_FULL_SPEED, _("Full &Speed Mode"), "", wxITEM_CHECK);
! 82: menuFile->Append(wxID_EXIT, _("E&xit"));
! 83: menubar->Append(menuFile, _("&File"));
1.1 root 84:
85: wxMenu *menuDisplay = new wxMenu();
86: wxMenu *menuViewScale = new wxMenu();
1.1.1.4 ! root 87: menuViewScale->Append(ID_SCALE_1_00, _("x1.&0"), "", wxITEM_CHECK);
! 88: menuViewScale->Append(ID_SCALE_0_75, _("x0.&75"), "", wxITEM_CHECK);
! 89: menuViewScale->Append(ID_SCALE_0_50, _("x0.&5"), "", wxITEM_CHECK);
! 90: menuDisplay->AppendSubMenu(menuViewScale, _("&Scale"));
1.1 root 91: wxMenu *menuFontSize = new wxMenu();
1.1.1.4 ! root 92: menuFontSize->AppendRadioItem(ID_FONTSIZE_12, "1&2");
! 93: menuFontSize->AppendRadioItem(ID_FONTSIZE_16, "1&6");
! 94: menuDisplay->AppendSubMenu(menuFontSize, _("&Font Size"));
! 95: menubar->Append(menuDisplay, _("&View"));
1.1 root 96:
97: wxMenu *menuDevice = new wxMenu();
1.1.1.4 ! root 98: menuDevice->Append(WinID_SOFTKEY, _("Software &Keyboard"),
1.1.1.2 root 99: "", wxITEM_CHECK);
1.1.1.4 ! root 100: menuDevice->Append(ID_MOUSEMODE, _("&Mouse Mode\tCTRL+F12"),
1.1.1.2 root 101: "", wxITEM_CHECK);
1.1.1.4 ! root 102: menubar->Append(menuDevice, _("&Device"));
! 103:
! 104: // 機種によってモニタウィンドウを追加する
! 105: #define AppendIf(menu, id, label) do { \
! 106: int id_ = __CONCAT(WinID_MONITOR_,id); \
! 107: const auto& info_ = monitor_info[(id_)]; \
! 108: if (gMainApp.HasVMFeature(info_.feature)) { \
! 109: (menu)->Append((id_), (label), "", wxITEM_CHECK); \
! 110: } \
! 111: } while (0)
1.1 root 112:
113: wxMenu *menuMonitor = new wxMenu();
1.1.1.4 ! root 114: AppendIf(menuMonitor, SCHEDULER, _("&Scheduler"));
! 115: AppendIf(menuMonitor, LOG, _("&Log"));
! 116:
! 117: wxMenu *menuMPU = new wxMenu();
! 118: AppendIf(menuMPU, MPUREG, _("&Register"));
! 119: AppendIf(menuMPU, MPUATC, "&ATC");
! 120: AppendIf(menuMPU, BRHIST68K, _("Branch &History"));
! 121: AppendIf(menuMPU, BRHIST88K, _("Branch &History"));
! 122: AppendIf(menuMPU, CMMU7, "CMMU#7" + _("(Inst)"));
! 123: AppendIf(menuMPU, ATC7, "ATC#7");
! 124: AppendIf(menuMPU, CACHE7, _("Cache#7"));
! 125: AppendIf(menuMPU, CMMU6, "CMMU#6" + _("(Data)"));
! 126: AppendIf(menuMPU, ATC6, "ATC#6");
! 127: AppendIf(menuMPU, CACHE6, _("Cache#6"));
! 128: menuMonitor->AppendSubMenu(menuMPU, "MP&U");
! 129:
! 130: AppendIf(menuMonitor, MEMDUMP, _("&Memory Dump"));
! 131: AppendIf(menuMonitor, SPC, "S&PC");
! 132: AppendIf(menuMonitor, RTC, "&RTC");
! 133: AppendIf(menuMonitor, DMAC, "&DMAC");
! 134: AppendIf(menuMonitor, MFP, "M&FP");
! 135: AppendIf(menuMonitor, SCC, "S&CC");
! 136: AppendIf(menuMonitor, SIO, "S&IO");
! 137: AppendIf(menuMonitor, PIO0, "PIO0");
! 138: AppendIf(menuMonitor, LUNAKEYBOARD, _("&Keyboard/Mouse"));
! 139: AppendIf(menuMonitor, LANCE, "Lance(&E)");
! 140: AppendIf(menuMonitor, LCD, "LCD(&J)");
! 141: AppendIf(menuMonitor, SYSCTLR, _("System Controller?(&Q)"));
! 142: AppendIf(menuMonitor, BITMAP, _("&Bitmap Control"));
! 143: AppendIf(menuMonitor, BITMAP0, _("Bitmap #&0"));
! 144: AppendIf(menuMonitor, NETDRIVER, _("Host &Network"));
! 145: menubar->Append(menuMonitor, _("&Monitor"));
! 146:
! 147: #if defined(__WXOSX__)
! 148: // OSX では wxID_ABOUT はリンゴメニューに入れるしきたりになっている。
! 149: // Append() すると Quit より下に来てしまうので、Prepend() で上に追加。
! 150: // 今のところヘルプメニューから About ダイアログを抜くとメニューが空に
! 151: // なってしまうので、ヘルプメニューの追加ごと抑制する。
! 152: menubar->OSXGetAppleMenu()->Prepend(wxID_ABOUT, _("About nono"));
! 153: #else
! 154: wxMenu *menuHelp = new wxMenu();
! 155: menuHelp->Append(wxID_ABOUT, _("About nono"));
! 156: menubar->Append(menuHelp, _("&Help"));
! 157: #endif
! 158:
1.1 root 159: SetMenuBar(menubar);
160:
161: wxString title("nono");
162: switch (vmtype) {
1.1.1.3 root 163: case VMTYPE_X68030:
164: title += "(X68030)";
165: break;
1.1.1.4 ! root 166: case VMTYPE_LUNA1:
1.1 root 167: title += "(LUNA-I)";
168: break;
1.1.1.3 root 169: case VMTYPE_LUNA88K:
170: title += "(LUNA88K)";
171: break;
172: default:
1.1 root 173: break;
174: }
175: SetTitle(title);
176:
177: // UpdateUI イベントは Idle 時に時折チェックされるらしいが、
178: // (メインビューとサブウィンドウを合わせた) タイマーイベントの粒度が
179: // 小さいためか、秒間120回とかいうレベルで UpdateUIEvent が飛んでくる
180: // っぽい (全タイマーをとめたら治る模様)。
181: // さすがにそんなに来られても気持ち悪いのと、どうせメニュー開いた瞬間
182: // 表示しようとする前には一度飛んでくるのだから、アイドル時のチェックは
183: // いらない気がする。間隔広げておいても、ぱっと見副作用はなさそうだけど
184: // 念のため事象が分かりやすいように 10秒くらいにしておく。
185: wxUpdateUIEvent::SetUpdateInterval(10000);
186:
187: wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
188:
189: gMainView = new WXMainView(this);
190: vbox->Add(gMainView, 1, wxEXPAND | wxFIXED_MINSIZE);
191:
192: SetSizer(vbox);
193:
194: Layout();
195: Fit();
196:
1.1.1.4 ! root 197: // Activate イベントは、このトップレベルウィンドウにウィンドウフォーカスが
! 198: // 来た or 外れたことを示すので、wxFrame (というかたぶん wxTopLevelWindow)
! 199: // を継承している WXMainFrameに飛んでくるのだが、処理の都合上 WXMainView で
! 200: // 扱いたいので、そちらに回す。
! 201: Connect(wxEVT_ACTIVATE, wxActivateEventHandler(WXMainView::OnActivate),
! 202: NULL, gMainView);
! 203:
1.1 root 204: POST_CREATE();
205: }
206:
207: WXMainFrame::~WXMainFrame()
208: {
209: }
210:
211: // ウィンドウ作成イベント
212: void
213: WXMainFrame::OnCreate(wxCommandEvent& event)
214: {
215: // ウィンドウを表示
216: for (int i = 0; i < monitor_start.size(); i++) {
217: if (monitor_start[i]) {
218: DoWindow(i, true);
219: }
220: }
221:
1.1.1.4 ! root 222: // VM にコールバックを登録
! 223: gVM->SetPowerOffCallback(wxmainframe_poweroff_callback);
! 224: if (gMPU680x0) {
! 225: gMPU680x0->SetHaltCallback(wxmainframe_halt_callback, this);
! 226: }
! 227:
1.1 root 228: // 時刻開始?
229: // なるべく VM が開始する直前にしたい。
230: gRTC->InitRTC();
231:
232: // VM 実行開始
233: gVM->PowerButton();
234: }
235:
1.1.1.3 root 236: // ウィンドウクローズイベント
237: void
238: WXMainFrame::OnClose(wxCloseEvent& event)
239: {
240: // サブウィンドウを全部閉じる
241: for (int i = 0; i < WinID_MAX; i++) {
1.1.1.4 ! root 242: if ((bool)windows[i]) {
1.1.1.3 root 243: windows[i]->Close();
244: }
245: }
246:
247: // VM を解放
1.1.1.4 ! root 248: gVM->Dispose();
1.1.1.3 root 249: gVM.reset();
250:
251: // 後はデフォルト処理
252: event.Skip();
253: }
254:
1.1 root 255: // メニューの「高速モード」イベント
256: void
257: WXMainFrame::OnFullSpeed(wxCommandEvent& event)
258: {
259: if (event.IsChecked()) {
260: // チェックが入ったので、高速モードにする
261: gScheduler->SetFullSpeed(true);
262: } else {
263: // チェックが消えたので、通常モードにする
264: gScheduler->SetFullSpeed(false);
265: }
266: }
267:
268: // メニューの「高速モード」UI
269: void
270: WXMainFrame::OnFullSpeedUI(wxUpdateUIEvent& event)
271: {
272: bool is_fullspeed = gScheduler->GetFullSpeed();
273: event.Check(is_fullspeed);
274: }
275:
276: // メニューの「終了」イベント
277: void
278: WXMainFrame::OnExit(wxCommandEvent& event)
279: {
280: // ウィンドウを閉じる
281: Close();
282: }
283:
284: // メニューの「表示 > スケール > *」の共通イベント
285: void
286: WXMainFrame::OnMenuScale(wxCommandEvent& event)
287: {
288: double scale;
289:
290: switch (event.GetId()) {
291: default:
292: case ID_SCALE_1_00:
293: scale = 1.0;
294: break;
295: case ID_SCALE_0_75:
296: scale = 0.75;
297: break;
298: case ID_SCALE_0_50:
299: scale = 0.5;
300: break;
301: }
302: gMainView->DoResize(scale);
303:
304: // 再レイアウト
305: Layout();
306: Fit();
307: }
308:
309: // メニューの「表示 > スケール > *」の共通 UI
310: void
311: WXMainFrame::OnMenuScaleUI(wxUpdateUIEvent& event)
312: {
313: double current_scale = gMainView->GetScale();
314:
1.1.1.2 root 315: if (current_scale == 1.0) {
316: event.Check(event.GetId() == ID_SCALE_1_00);
317: } else if (current_scale == 0.75) {
318: event.Check(event.GetId() == ID_SCALE_0_75);
319: } else if (current_scale == 0.5) {
320: event.Check(event.GetId() == ID_SCALE_0_50);
1.1 root 321: }
322: }
323:
324: // メニューの「表示 > フォントサイズ > *」の共通イベント
325: void
326: WXMainFrame::OnMenuFontSize(wxCommandEvent& event)
327: {
328: fontsize_t fontsize;
329:
1.1.1.3 root 330: assertmsg(
1.1.1.4 ! root 331: ID_FONTSIZE_12 <= event.GetId() && event.GetId() <= ID_FONTSIZE_16,
1.1.1.3 root 332: "event.GetId()=%d", event.GetId());
1.1 root 333: switch (event.GetId()) {
334: case ID_FONTSIZE_12:
335: fontsize = FONT_6x12;
336: break;
337: case ID_FONTSIZE_16:
338: fontsize = FONT_8x16;
339: break;
340: default:
341: __unreachable();
342: break;
343: }
344:
345: if (fontsize != WXTextPanel::global_fontsize) {
346: WXTextPanel::global_fontsize = fontsize;
347:
348: // アクティブなサブウィンドウ全員に通知
349: for (int i = 0; i < WinID_MAX; i++) {
1.1.1.4 ! root 350: if ((bool)windows[i]) {
! 351: WXSubWindow *subwin =
! 352: dynamic_cast<WXSubWindow *>(windows[i].get());
1.1 root 353: subwin->SetFontSize(fontsize);
354: }
355: }
356: }
357: }
358:
359: // メニューの「表示 > フォントサイズ > *」共通 UI
360: void
361: WXMainFrame::OnMenuFontSizeUI(wxUpdateUIEvent& event)
362: {
363: fontsize_t current_size = WXTextPanel::global_fontsize;
364: fontsize_t event_size = (fontsize_t)(event.GetId() - (ID_FONTSIZE_START+1));
365:
366: event.Check(current_size == event_size);
367: }
368:
1.1.1.2 root 369: // メニューの「デバイス > マウスモード」
370: void
371: WXMainFrame::OnMouseMode(wxCommandEvent& event)
372: {
373: // enable ならチェックを付けようとして呼ばれた
374: bool enable = event.IsChecked();
375:
376: if (enable) {
377: // メッセージを表示したい
378: } else {
379: // メッセージを表示したい
380: }
381:
382: // マウスモードを設定
383: gMainView->SetMouseMode(enable);
384: }
385:
386: // メニューの「デバイス > マウスモード」UI
387: void
388: WXMainFrame::OnMouseModeUI(wxUpdateUIEvent& event)
389: {
390: event.Check(gMainView->GetMouseMode());
391: }
392:
1.1 root 393: // メニューのウィンドウ ID 共通イベント
394: // チェックが入る方なら、ウィンドウを作成して表示。
395: // チェックが消える方なら、ウィンドウを削除。
396: void
397: WXMainFrame::OnWindow(wxCommandEvent& event)
398: {
399: int id = event.GetId();
400:
401: DoWindow(id, event.IsChecked());
402: }
403:
404: void
405: WXMainFrame::DoWindow(int id, bool enable)
406: {
1.1.1.4 ! root 407: // モニタウィンドウを作成する共通部分
! 408: #define SetMonitor(name, obj) \
! 409: windows[id].reset(new WXMonitorWindow(this, id, (name), (obj)))
! 410:
1.1 root 411: if (enable) {
412: // チェックが入ったのでウィンドウを作成
413: switch (id) {
414: case WinID_MONITOR_LOG:
1.1.1.4 ! root 415: windows[id].reset(new WXLogMonitor(this, id));
1.1 root 416: break;
417: case WinID_MONITOR_SCHEDULER:
1.1.1.4 ! root 418: SetMonitor(_("Scheduler"), gScheduler.get());
1.1 root 419: break;
420: case WinID_MONITOR_MPUREG:
1.1.1.4 ! root 421: SetMonitor(_("MPU (Register)"), gMPU.get());
1.1 root 422: break;
423: case WinID_MONITOR_MPUATC:
1.1.1.4 ! root 424: SetMonitor(_("MPU (ATC)"), gMPUATC.get());
! 425: break;
! 426: case WinID_MONITOR_BRHIST68K:
! 427: SetMonitor(_("MPU (Branch History)"), &gMPU680x0->GetCPU()->brhist);
! 428: break;
! 429: case WinID_MONITOR_BRHIST88K:
! 430: SetMonitor(_("MPU (Branch History)"), &gMPU88xx0->GetCPU()->brhist);
! 431: break;
! 432: case WinID_MONITOR_CMMU7:
! 433: SetMonitor("CMMU#7" + _("(Inst)"),
! 434: &gMPU88xx0->GetCPU()->cmmu[0]);
1.1 root 435: break;
1.1.1.4 ! root 436: case WinID_MONITOR_CMMU6:
! 437: SetMonitor("CMMU#6" + _("(Data)"),
! 438: &gMPU88xx0->GetCPU()->cmmu[1]);
! 439: break;
! 440: case WinID_MONITOR_ATC7:
! 441: SetMonitor("ATC#7" + _("(Inst)"), gMPU88200ATC[0].get());
! 442: break;
! 443: case WinID_MONITOR_ATC6:
! 444: SetMonitor("ATC#6" + _("(Data)"), gMPU88200ATC[1].get());
! 445: break;
! 446: case WinID_MONITOR_CACHE7:
! 447: windows[id].reset(new WXCacheWindow(this, id,
! 448: _("Cache#7") + _("(Inst)"), &gMPU88xx0->GetCPU()->cmmu[0]));
! 449: break;
! 450: case WinID_MONITOR_CACHE6:
! 451: windows[id].reset(new WXCacheWindow(this, id,
! 452: _("Cache#6") + _("(Inst)"), &gMPU88xx0->GetCPU()->cmmu[1]));
1.1 root 453: break;
454: case WinID_MONITOR_MEMDUMP:
1.1.1.4 ! root 455: windows[id].reset(new WXMemdumpWindow(this, id));
1.1 root 456: break;
457: case WinID_MONITOR_SPC:
1.1.1.4 ! root 458: SetMonitor("SPC", gSPC.get());
1.1 root 459: break;
460: case WinID_MONITOR_RTC:
1.1.1.4 ! root 461: SetMonitor("RTC", gRTC.get());
1.1.1.3 root 462: break;
463: case WinID_MONITOR_DMAC:
1.1.1.4 ! root 464: SetMonitor("DMAC", gDMAC.get());
1.1.1.3 root 465: break;
466: case WinID_MONITOR_MFP:
1.1.1.4 ! root 467: SetMonitor("MFP", gMFP.get());
1.1.1.3 root 468: break;
469: case WinID_MONITOR_SCC:
1.1.1.4 ! root 470: SetMonitor("SCC", gSCC.get());
1.1 root 471: break;
472: case WinID_MONITOR_SIO:
1.1.1.4 ! root 473: SetMonitor("SIO", gSIO.get());
! 474: break;
! 475: case WinID_MONITOR_PIO0:
! 476: SetMonitor("PIO0", gPIO0.get());
1.1.1.2 root 477: break;
478: case WinID_MONITOR_LUNAKEYBOARD:
1.1.1.4 ! root 479: SetMonitor(_("Keyboard/Mouse"), gKeyboard.get());
1.1 root 480: break;
481: case WinID_MONITOR_LCD:
1.1.1.4 ! root 482: SetMonitor("LCD", gLCD.get());
1.1 root 483: break;
484: case WinID_MONITOR_LANCE:
1.1.1.4 ! root 485: SetMonitor("Lance", dynamic_cast<LanceDevice*>(gEthernet.get()));
! 486: break;
! 487: case WinID_MONITOR_SYSCTLR:
! 488: SetMonitor(_("System Controller?"), gSysCtlr.get());
1.1 root 489: break;
490: case WinID_MONITOR_NETDRIVER:
1.1.1.4 ! root 491: SetMonitor(_("Host Network"), gNetDriver.get());
1.1 root 492: break;
493: case WinID_MONITOR_BITMAP:
1.1.1.4 ! root 494: SetMonitor(_("Bitmap Control"), gBitmap.get());
1.1 root 495: break;
496: case WinID_MONITOR_BITMAP0:
1.1.1.4 ! root 497: windows[id].reset(new WXLunaBitmapWindow(this, id, _("Bitmap #0")));
1.1 root 498: break;
499: case WinID_SOFTKEY:
1.1.1.4 ! root 500: if (gMainApp.GetVMType() == VMTYPE_X68030) {
! 501: windows[id].reset(new WXX68kSoftKeyWindow(this, id));
! 502: } else {
! 503: windows[id].reset(new WXLunaSoftKeyWindow(this, id));
! 504: }
1.1 root 505: break;
506: }
507: windows[id]->Show();
508: } else {
509: // チェックが消えたのでウィンドウを終了
510: windows[id]->Close();
511: // (削除自体はこの少し下の DeleteWindow() で行なっている)
512: }
513: }
514:
515: // Update UI イベント
516: void
517: WXMainFrame::OnWindowUI(wxUpdateUIEvent& event)
518: {
519: int id = event.GetId();
520:
521: // ウィンドウが存在していればチェックを表示
1.1.1.4 ! root 522: event.Check((bool)windows[id]);
! 523: }
! 524:
! 525: // バージョンダイアログ
! 526: void
! 527: WXMainFrame::OnAbout(wxCommandEvent& event)
! 528: {
! 529: WXVersionDlg dlg(this);
! 530: dlg.ShowModal();
1.1 root 531: }
532:
533: // ウィンドウをリストから削除する
534: // (ウィンドウの Close() から呼ばれる)
535: void
536: WXMainFrame::DeleteWindow(wxWindowID id)
537: {
1.1.1.4 ! root 538: windows[id].reset();
1.1 root 539: }
540:
541: // VM 電源オフ時に呼ばれるコールバック。
542: // (VM スレッドからアプリケーションを終了するため)
543: void
544: wxmainframe_poweroff_callback()
545: {
546: gMainFrame->PowerOffCallback();
547: }
548:
549: // VM からの電源オフ処理
550: void
551: WXMainFrame::PowerOffCallback()
552: {
553: wxCommandEvent *ev = new wxCommandEvent(wxEVT_MENU, wxID_EXIT);
554: QueueEvent(ev);
555: }
556:
1.1.1.4 ! root 557: // m680x0 ダブルバスフォールト時に呼ばれるコールバック。
! 558: // step1. グローバル関数で受けて、クラスメンバ関数を呼ぶだけ。
! 559: void
! 560: wxmainframe_halt_callback(void *arg)
! 561: {
! 562: ((WXMainFrame *)arg)->HaltCallback();
! 563: }
! 564:
! 565: // m680x0 ダブルバスフォールト処理。
! 566: // step2. クラス内だが VM スレッドなので、ここではイベントをポストするだけ。
! 567: void
! 568: WXMainFrame::HaltCallback()
! 569: {
! 570: wxCommandEvent *ev = new wxCommandEvent(WXW_EVT_HALT_NOTIFY);
! 571: QueueEvent(ev);
! 572: }
! 573:
! 574: // m680x0 ダブルバスフォールト処理
! 575: // step3. ここが本題。でもダイアログを出すだけ。
! 576: void
! 577: WXMainFrame::OnHaltNotify(wxCommandEvent& event)
! 578: {
! 579: ::wxMessageBox(_("Double bus fault has occurred in VM"),
! 580: wxEmptyString,
! 581: wxICON_EXCLAMATION);
! 582: }
! 583:
1.1 root 584: // モニタウィンドウ識別名一覧
1.1.1.4 ! root 585: // wxmainframe.h の識別子定義と順序を一致させること。
! 586: // brhist は同じ名前だがフラグが異なるので共存できる。
! 587: /*static*/ struct WXMainFrame::monitor_info
! 588: WXMainFrame::monitor_info[WinID_MAX] = {
! 589: { "log", VMF_ALL }, // LOG
! 590: { "scheduler", VMF_ALL }, // SCHEDULER
! 591: { "mpureg", VMF_ALL }, // MPUREG
! 592: { "mpuatc", VMF_M68K }, // MPUATC
! 593: { "brhist", VMF_M68K }, // BRHIST68K
! 594: { "brhist", VMF_M88K }, // BRHIST88K
! 595: { "cmmu7", VMF_M88K }, // CMMU#7
! 596: { "cmmu6", VMF_M88K }, // CMMU#6
! 597: { "atc7", VMF_M88K }, // ATC#7
! 598: { "atc6", VMF_M88K }, // ATC#6
! 599: { "cache7", VMF_M88K }, // Cache#7
! 600: { "cache6", VMF_M88K }, // Cache#6
! 601: { "memdump", VMF_ALL }, // MEMDUMP
! 602: { "spc", VMF_ALL }, // SPC
! 603: { "rtc", VMF_ALL }, // RTC
! 604: { "dmac", VMF_X68K }, // DMAC
! 605: { "mfp", VMF_X68K }, // MFP
! 606: { "scc", VMF_X68K }, // SCC
! 607: { "sio", VMF_LUNA }, // SIO
! 608: { "pio0", VMF_LUNA }, // PIO0
! 609: { "keyboard", VMF_LUNA }, // LunaKeyboard
! 610: { "lcd", VMF_LUNA }, // LCD
! 611: { "lance", VMF_LUNA }, // LANCE
! 612: { "sysctlr", VMF_LUNA88K }, // SYSCTLR
! 613: { "bitmap", VMF_LUNA }, // BITMAP
! 614: { "bitmap0", VMF_LUNA }, // BITMAP0
! 615: { "netdriver", VMF_LUNA }, // NETDRIVER
! 616: { "softkey", VMF_ALL }, // SOFTKEY
1.1 root 617: };
618:
619: // 起動時にオープンするモニタウィンドウ (-M オプション)
620: /*static*/ std::array<bool, WinID_MAX> WXMainFrame::monitor_start;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.