|
|
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:
50: topsizer = new wxBoxSizer(wxHORIZONTAL);
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.