Annotation of nono/wx/wxdumpmonitor.cpp, revision 1.1.1.10

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: 
                      7: #include "wxdumpmonitor.h"
                      8: #include "wxtextscreen.h"
                      9: #include "bus.h"
1.1.1.9   root       10: #include "debugger.h"
                     11: #include <array>
1.1       root       12: 
                     13: //
                     14: // メモリダンプウィンドウ
                     15: //
                     16: 
                     17: enum {
                     18:        ID_TEXT,
                     19:        ID_PREV,
                     20:        ID_NEXT,
                     21: };
                     22: 
                     23: // イベントテーブル
                     24: wxBEGIN_EVENT_TABLE(WXMemdumpWindow, inherited)
                     25:        EVT_TEXT_ENTER(ID_TEXT, WXMemdumpWindow::OnTextEnter)
                     26:        EVT_BUTTON(ID_PREV, WXMemdumpWindow::OnPrev)
                     27:        EVT_BUTTON(ID_NEXT, WXMemdumpWindow::OnNext)
                     28: wxEND_EVENT_TABLE()
                     29: 
                     30: // コンストラクタ
1.1.1.9   root       31: // (タイトルは UpdateAddr() でセットする)
                     32: WXMemdumpWindow::WXMemdumpWindow(wxWindow *parent, int idx_)
                     33:        : inherited(parent, wxID_ANY, wxEmptyString)
1.1       root       34: {
1.1.1.9   root       35:        idx = idx_;
1.1       root       36: 
1.1.1.5   root       37:        // →
                     38:        // +--+----------------------------+--+
                     39:        // |  |↓+-----------------------+ |  |
                     40:        // |  |  | 上枠 (アドレス入力欄) | |  |
                     41:        // |  |  +-----------------------+ |  |
                     42:        // |左|  | 上余白 (padding1)     | |右|
                     43:        // |余|  +-----------------------+ |余|
                     44:        // |白|  | TextScreen            | |白|
                     45:        // |  |  +-----------------------+ |  |
                     46:        // |  |  | 下余白 (padding2)     | |  |
                     47:        // |  |  +-----------------------+ |  |
                     48:        // +--+----------------------------+--+
                     49: 
1.1.1.10! root       50:        wxBoxSizer *topsizer = new wxBoxSizer(wxHORIZONTAL);
1.1.1.5   root       51:        // 左余白
1.1.1.8   root       52:        topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND);
1.1.1.5   root       53: 
                     54:        // 中列用の縦 sizer
                     55:        auto *vbox = new wxBoxSizer(wxVERTICAL);
                     56:        topsizer->Add(vbox, 0, wxEXPAND);
                     57: 
1.1.1.9   root       58:        // 上枠用の下敷きパネル
                     59:        WXPaddingPanel *ctrlpanel = new WXPaddingPanel(this);
                     60:        vbox->Add(ctrlpanel, 0, wxEXPAND);
                     61: 
1.1.1.5   root       62:        // 上枠用の横 sizer
                     63:        ctrlbox = new wxBoxSizer(wxHORIZONTAL);
1.1       root       64: 
                     65:        // アドレスコントロール
                     66:        addrctrl = new wxTextCtrl(this, ID_TEXT,
                     67:                wxEmptyString, wxDefaultPosition, wxDefaultSize,
                     68:                wxTE_PROCESS_ENTER);
1.1.1.5   root       69:        ctrlbox->Add(addrctrl);
                     70:        ctrlbox->AddSpacer(10);
1.1       root       71: 
                     72:        // △ボタン
                     73:        // XXX とりあえずね
                     74:        prev_btn = new wxButton(this, ID_PREV, wxT("△"));
                     75:        next_btn = new wxButton(this, ID_NEXT, wxT("▽"));
1.1.1.5   root       76:        ctrlbox->Add(prev_btn);
                     77:        ctrlbox->Add(next_btn);
1.1       root       78: 
1.1.1.9   root       79:        // 上枠の sizer と下敷きを紐付ける
                     80:        ctrlpanel->SetSizer(ctrlbox);
                     81:        ctrlbox->SetSizeHints(ctrlpanel);
                     82: 
1.1.1.5   root       83:        // パディングパネル(上下)
                     84:        // ウィンドウを1行ずつ伸縮させるためには、クライアント領域がフォント高さの
                     85:        // 整数倍になるようにしないといけない。このウィンドウには大きさ不詳の
                     86:        // コントロール枠があるので、フォントサイズが確定しないとパディングの
                     87:        // 高さも確定しない。先にサイズ不定のパネルだけ置いといて、フォントサイズ
                     88:        // 確定後に大きさを確定させる。DoSize() 参照。
1.1.1.8   root       89:        padding1 = new WXPaddingPanel(this);
                     90:        padding2 = new WXPaddingPanel(this);
1.1.1.9   root       91:        screen = new WXTextScreen(this, debugger_memdump_monitor(idx));
1.1.1.8   root       92:        vbox->Add(padding1, 0, wxEXPAND);
1.1.1.5   root       93:        vbox->Add(screen, 1, wxEXPAND);
1.1.1.8   root       94:        vbox->Add(padding2, 0, wxEXPAND);
1.1       root       95: 
1.1.1.5   root       96:        // 右余白
1.1.1.8   root       97:        topsizer->Add(new WXPaddingPanel(this), 0, wxEXPAND);
1.1       root       98: 
1.1.1.4   root       99:        SetSizer(topsizer);
1.1       root      100: 
1.1.1.9   root      101:        // 表示を初期化する
                    102:        screen->SetUserData(sticky_addr[idx]);
                    103:        UpdateAddr();
                    104: 
1.1.1.5   root      105:        // ウィンドウサイズを確定させる
                    106:        DoSize();
1.1       root      107: }
                    108: 
                    109: // デストラクタ
                    110: WXMemdumpWindow::~WXMemdumpWindow()
                    111: {
                    112: }
                    113: 
1.1.1.5   root      114: // フォントサイズが確定したら、それによってウィンドウサイズを再計算する。
                    115: void
                    116: WXMemdumpWindow::DoSize()
                    117: {
                    118:        // コントロールパネルの大きさ
                    119:        wxSize csize = ctrlbox->ComputeFittingWindowSize(this);
                    120:        CalcVSize(csize.y);
                    121: }
                    122: 
1.1       root      123: // テキスト入力イベント
                    124: void
                    125: WXMemdumpWindow::OnTextEnter(wxCommandEvent& event)
                    126: {
                    127:        // 入力文字列(16進文字列)を数値に変換
1.1.1.5   root      128:        const wxString& wstr = event.GetString();
1.1.1.6   root      129:        uint32 val = strtoul((const char *)wstr.mb_str(), NULL, 16);
1.1       root      130: 
                    131:        // 16 に整列
                    132:        val &= ~15;
                    133: 
1.1.1.9   root      134:        // アドレスを更新
                    135:        union64 udata;
                    136:        udata.q = screen->GetUserData();
                    137:        udata.l = val;
                    138:        screen->SetUserData(udata.q);
                    139:        UpdateAddr();
1.1       root      140: }
                    141: 
                    142: // △(PREV) ボタン押下イベント
                    143: void
                    144: WXMemdumpWindow::OnPrev(wxCommandEvent& event)
                    145: {
1.1.1.9   root      146:        union64 udata;
                    147: 
1.1.1.5   root      148:        // 1ページ戻る (横16バイト固定 × 表示行数分)
1.1.1.9   root      149:        udata.q = screen->GetUserData();
                    150:        udata.l -= screen->GetRow() * 16;
                    151: 
                    152:        screen->SetUserData(udata.q);
                    153:        UpdateAddr();
1.1       root      154: }
                    155: 
                    156: // ▽(NEXT) ボタン押下イベント
                    157: void
                    158: WXMemdumpWindow::OnNext(wxCommandEvent& event)
                    159: {
1.1.1.9   root      160:        union64 udata;
                    161: 
1.1.1.5   root      162:        // 1ページ進む (横16バイト固定 × 表示行数分)
1.1.1.9   root      163:        udata.q = screen->GetUserData();
                    164:        udata.l += screen->GetRow() * 16;
                    165: 
                    166:        screen->SetUserData(udata.q);
                    167:        UpdateAddr();
1.1       root      168: }
                    169: 
1.1.1.9   root      170: // アドレス欄の表示を更新する
                    171: void
                    172: WXMemdumpWindow::UpdateAddr()
                    173: {
                    174:        uint32 addr = screen->GetUserData();
                    175: 
                    176:        // 二次情報にコピー。
                    177:        sticky_addr[idx] = addr;
                    178: 
                    179:        // EVT_TEXT を起こさず変更する
                    180:        addrctrl->ChangeValue(wxString(string_format("%08x", addr)));
                    181: 
                    182:        // カーソルを末尾に
                    183:        addrctrl->SetInsertionPointEnd();
                    184: 
                    185:        // タイトルを変更
                    186:        SetTitle(_("Memory Dump") + string_format(" %d: $%08x", idx, addr));
                    187: }
                    188: 
                    189: // ウィンドウ ID に対応する sticky address を返す
                    190: uint32
                    191: WXMemdumpWindow::GetStickyAddr(int id)
                    192: {
                    193:        int n = id - ID_MONITOR_MEMDUMP0;
                    194:        assert(n < sticky_addr.size());
                    195:        return sticky_addr[n];
1.1       root      196: }
1.1.1.9   root      197: 
                    198: // ウィンドウ ID に対応する sticky address を設定する
                    199: void
                    200: WXMemdumpWindow::SetStickyAddr(int id, uint32 addr)
                    201: {
                    202:        int n = id - ID_MONITOR_MEMDUMP0;
                    203:        assert(n < sticky_addr.size());
                    204:        sticky_addr[n] = addr;
                    205: }
                    206: 
                    207: // アドレス
                    208: /*static*/ std::array<uint32, MAX_MEMDUMP_MONITOR>
                    209: WXMemdumpWindow::sticky_addr;

unix.superglobalmegacorp.com

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