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

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