|
|
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;
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.