Annotation of nono/wx/wxmainframe.cpp, revision 1.1.1.4

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;

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.