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