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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2019 [email protected]
                      4: //
                      5: 
                      6: #include "wxheader.h"
                      7: #include "wxdumpmonitor.h"
                      8: #include "wxtextscreen.h"
                      9: #include "mystring.h"
                     10: #include "bus.h"
                     11: 
                     12: //
                     13: // メモリダンプウィンドウ
                     14: //
                     15: 
                     16: enum {
                     17:        ID_TEXT,
                     18:        ID_PREV,
                     19:        ID_NEXT,
                     20: };
                     21: 
                     22: // イベントテーブル
                     23: wxBEGIN_EVENT_TABLE(WXMemdumpWindow, inherited)
                     24:        EVT_TEXT_ENTER(ID_TEXT, WXMemdumpWindow::OnTextEnter)
                     25:        EVT_BUTTON(ID_PREV, WXMemdumpWindow::OnPrev)
                     26:        EVT_BUTTON(ID_NEXT, WXMemdumpWindow::OnNext)
                     27:        EVT_TIMER(wxID_ANY, WXMemdumpWindow::OnTimer)
                     28: wxEND_EVENT_TABLE()
                     29: 
                     30: // コンストラクタ
                     31: WXMemdumpWindow::WXMemdumpWindow(wxWindow *parent, wxWindowID id)
1.1.1.2   root       32:        : inherited(parent, id, wxT("メモリダンプ"))
1.1       root       33: {
                     34:        col = 76;
                     35:        row = 16;
                     36:        // 最初に不一致を起こさせて再描画させるため
                     37:        last_addr = 0xffffffff;
                     38: 
                     39:        wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
                     40: 
                     41:        // 上枠
                     42:        wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
                     43:        vbox->Add(hbox);
                     44: 
                     45:        // アドレスコントロール
                     46:        addrctrl = new wxTextCtrl(this, ID_TEXT,
                     47:                wxEmptyString, wxDefaultPosition, wxDefaultSize,
                     48:                wxTE_PROCESS_ENTER);
                     49:        hbox->Add(addrctrl);
                     50:        hbox->AddSpacer(20);
                     51: 
                     52:        // △ボタン
                     53:        // XXX とりあえずね
                     54:        prev_btn = new wxButton(this, ID_PREV, wxT("△"));
                     55:        next_btn = new wxButton(this, ID_NEXT, wxT("▽"));
                     56:        hbox->Add(prev_btn);
                     57:        hbox->Add(next_btn);
                     58: 
                     59:        // XXX TODO 初期フォーカスをテキストコントロールに移したい
                     60: 
                     61:        // テキストスクリーン
                     62:        monitor.Init(col, row);
                     63:        screen = new WXTextScreen(this, col, row, monitor.GetBuf());
                     64:        vbox->Add(screen, 0, wxEXPAND);
                     65: 
                     66:        SetSizer(vbox);
                     67: 
                     68:        Layout();
                     69:        Fit();
                     70: 
                     71:        // メモリが高速で変わるのを目で追う必要もないと思うので
                     72:        // 30Hz くらいでどうか。
                     73:        timer.SetOwner(this);
                     74:        timer.Start(33);
                     75: }
                     76: 
                     77: // デストラクタ
                     78: WXMemdumpWindow::~WXMemdumpWindow()
                     79: {
                     80: }
                     81: 
                     82: // テキスト入力イベント
                     83: void
                     84: WXMemdumpWindow::OnTextEnter(wxCommandEvent& event)
                     85: {
                     86:        // 入力文字列(16進文字列)を数値に変換
                     87:        wxString wstr = event.GetString();
                     88:        const char *cstr = (const char *)wstr.mb_str();
                     89:        uint32 val = strtoul(cstr, NULL, 16);
                     90: 
                     91:        // 16 に整列
                     92:        val &= ~15;
                     93: 
                     94:        input_addr = val;
                     95: }
                     96: 
                     97: // △(PREV) ボタン押下イベント
                     98: void
                     99: WXMemdumpWindow::OnPrev(wxCommandEvent& event)
                    100: {
                    101:        input_addr -= 0x100;
                    102: }
                    103: 
                    104: // ▽(NEXT) ボタン押下イベント
                    105: void
                    106: WXMemdumpWindow::OnNext(wxCommandEvent& event)
                    107: {
                    108:        input_addr += 0x100;
                    109: }
                    110: 
                    111: // タイマーイベント
                    112: void
                    113: WXMemdumpWindow::OnTimer(wxTimerEvent& event)
                    114: {
                    115:        if (input_addr != last_addr) {
                    116:                // EVT_TEXT を起こさず変更する
                    117:                addrctrl->ChangeValue(wxString(string_format("%08x", input_addr)));
                    118:                last_addr = input_addr;
                    119: 
                    120:                // カーソルを末尾に
                    121:                addrctrl->SetInsertionPointEnd();
                    122:        }
                    123: 
                    124:        // テキストスクリーンを更新
                    125:        Update();
                    126:        screen->Refresh();
                    127: }
                    128: 
                    129: // フォントサイズ変更
                    130: void
                    131: WXMemdumpWindow::SetFontSize(fontsize_t fontsize)
                    132: {
                    133:        screen->SetFontSize(fontsize);
                    134: 
                    135:        Layout();
                    136:        Fit();
                    137: }
                    138: 
                    139: // テキストスクリーンを更新
                    140: void
                    141: WXMemdumpWindow::Update()
                    142: {
                    143:        uint32 laddr;
                    144:        uint64 paddr;
                    145: 
                    146:        monitor.Clear();
                    147: 
                    148:        laddr = input_addr;
                    149:        paddr = 0;      // shut up gcc
                    150:        for (int y = 0; y < row; y++) {
                    151:                if (is_logical) {
                    152:                } else {
                    153:                        // 物理アドレス
                    154:                        paddr = laddr;
                    155:                }
                    156: 
                    157:                // アドレス作成
                    158:                std::string addrstr = string_format("%08x", laddr);
                    159:                if (is_logical == false) {
                    160:                        // 物理アドレス
                    161:                        addrstr += ":";
                    162:                } else if ((int64)paddr < 0) {
                    163:                        // MMU 時点でバスエラー
                    164:                        addrstr += ":BusErr";
                    165:                } else if (paddr == laddr) {
                    166:                        // PA==VA
                    167:                        addrstr += "=PA";
                    168:                } else {
                    169:                        // PA!=VA
                    170:                        addrstr += string_format(":%08x:", (uint32)paddr);
                    171:                }
                    172:                monitor.Print(0, y, "%s", addrstr.c_str());
                    173: 
                    174:                // ダンプ作成
                    175:                std::string hexstr;
                    176:                std::string chrstr;
                    177:                for (int x = 0; x < 8; x++) {
1.1.1.3 ! root      178:                        uint64 b1 = vm_phys_peek_8(paddr);
        !           179:                        uint64 b2 = vm_phys_peek_8(paddr + 1);
1.1       root      180: 
                    181:                        // 偶数バイト目
                    182:                        if ((int64)b1 < 0) {
                    183:                                hexstr += "--";
                    184:                                chrstr += " ";
                    185:                        } else {
                    186:                                uint32 c1 = (uint32)b1;
                    187:                                hexstr += string_format("%02x", c1);
                    188:                                chrstr += string_format("%c",
                    189:                                        (0x20 <= c1 && c1 <= 0x7e) ? c1 : '.');
                    190:                        }
                    191:                        // 奇数バイト目
                    192:                        if ((int64)b2 < 0) {
                    193:                                hexstr += "--";
                    194:                                chrstr += " ";
                    195:                        } else {
                    196:                                uint32 c2 = (uint32)b2;
                    197:                                hexstr += string_format("%02x", c2);
                    198:                                chrstr += string_format("%c",
                    199:                                        (0x20 <= c2 && c2 <= 0x7e) ? c2 : '.');
                    200:                        }
                    201:                        hexstr += " ";
                    202: 
                    203:                        laddr += 2;
                    204:                        paddr += 2;
                    205:                }
                    206: 
                    207:                monitor.Print(19, y, "%s", hexstr.c_str());
                    208:                monitor.Print(60, y, "%s", chrstr.c_str());
                    209:        }
                    210: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.