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