|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2025 nono project
4: // Licensed under nono-license.txt
5: //
6:
7: //
8: // ページテーブルモニター
9: //
10:
11: #pragma once
12:
13: #include "wxsubwindow.h"
14: #include <array>
15:
16: class MainbusDevice;
17: class MPU68030Device;
18: class MPU68040Device;
19: class WXScrollBar;
20: class WXTextPanel;
21:
22: // ページテーブル1段分の構造
23: class PageTable
24: {
25: public:
26: PageTable(wxWindow *parent, int lv_, int width);
27:
28: // パラメータをクリアする。
29: void Clear();
30:
31: // 指定位置のアドレスを返す。
32: uint32 GetAddr(int) const;
33: // カーソル位置のアドレスを返す。
34: uint32 GetAddr() const { return GetAddr(cursor); }
35:
36: // 表示開始位置を返す。
37: int ViewTop() const;
38:
39: // コントロールの表示状態を制御する。
40: void Show(bool enable = true);
41: void Hide() {
42: Show(false);
43: }
44:
45: WXTextScreen *screen {};
46: WXScrollBar *vscroll {};
47: int lv {}; // このテーブルの段数 (TIA なら 0)
48:
49: // このテーブルの見出し (1行目)
50: wxString title {};
51:
52: // このテーブルのヘッダ (表の <TH>)
53: wxString head {};
54:
55: // このテーブルのベースアドレス。0xffffffff なら無効。
56: uint32 base {};
57: // この段のアドレスマスク。
58: uint32 mask {};
59:
60: // この段のビット位置と長さ。ビット位置は下から数える。
61: // TIA が 10 ビットなら bitlen=10, bitpos=22 (= 32 - 10)。
62: int bitpos {};
63: int bitlen {};
64:
65: // この段のエントリ数。
66: int count {};
67: // カーソル位置。
68: int cursor {};
69: };
70:
71: class WXPageTableWindow : public WXSubWindow
72: {
73: using inherited = WXSubWindow;
74:
75: public:
76: WXPageTableWindow(wxWindow *parent, const wxString& name);
77: ~WXPageTableWindow() override;
78:
79: bool GetMySizeHints(wxSize *, wxSize *, wxSize *, wxSize *) override;
80: bool Layout() override;
81:
82: protected:
83: void ConnectTableEvents();
84:
85: void OnTimer(wxTimerEvent&);
86: void OnRPChanged(wxCommandEvent&);
87: void OnLeftDClick(wxMouseEvent&);
88: void OnMouseWheel(wxMouseEvent&);
89:
90: void SetRate(int hz);
91:
92: virtual void Reconfig(uint32) = 0;
93: virtual void DoRefresh() = 0;
94:
95: // 全段の最大の行数
96: int max_rows {};
97:
98: bool show_urp {};
99:
100: wxPanel *ctrlpanel {};
101: wxRadioButton *radio_srp {};
102: wxRadioButton *radio_urp {};
103: WXTextScreen *stat {};
104: WXTextPanel *bgpanel {}; // テーブル領域全部の下敷き。
105: std::vector<PageTable> table {};
106:
107: // 現在有効なテーブル数。Reconfig() で決まる。
108: // table の要素を増減させるのは大変なので。
109: int table_count {};
110:
111: // 現在の TC の値。
112: // 68030 は 32bit、68040 は 16bit というところだけ違う。
113: uint32 tc_value {};
114:
115: enum {
116: TC_ENABLE = 0, // TC.E が有効
117: TC_DISABLE, // 構成可能で TC.E が無効
118: TC_NOT_CONFIG, // 構成不能 (68030)
119: } tc_status {};
120:
121: wxTimer timer {};
122:
123: MainbusDevice *mainbus {};
124:
125: wxDECLARE_EVENT_TABLE();
126: };
127:
128: class WXPageTable68030Window : public WXPageTableWindow
129: {
130: using inherited = WXPageTableWindow;
131: public:
132: WXPageTable68030Window(wxWindow *, const wxString& name);
133: ~WXPageTable68030Window() override;
134:
135: void Reconfig(uint32) override;
136: void DoRefresh() override;
137:
138: private:
139: MPU68030Device *mpu {};
140: };
141:
142: class WXPageTable68040Window : public WXPageTableWindow
143: {
144: using inherited = WXPageTableWindow;
145: public:
146: WXPageTable68040Window(wxWindow *, const wxString& name);
147: ~WXPageTable68040Window() override;
148:
149: void Reconfig(uint32) override;
150: void DoRefresh() override;
151:
152: private:
153: bool ps4k;
154:
155: MPU68040Device *mpu {};
156: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.