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