|
|
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.