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

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