--- nono/m88xx0/m88200.h 2026/04/29 17:04:38 1.1.1.2 +++ nono/m88xx0/m88200.h 2026/04/29 17:04:41 1.1.1.3 @@ -79,14 +79,14 @@ class m88200CacheSet // 無効(vv[]==IV)ならビット 0 を 1 にしておく。比較対象の paddr は // 下位12ビットを落としているため、これで絶対に一致しなくなる。 static const uint32 TAG_INVALID = 0x00000001; - uint32 tag[4]; + uint32 tag[4] {}; // LRU // CSSP の L ビットのロジックに従う。 int L {}; // ステータス - Status vv[4]; + Status vv[4] {}; // データ。word[] は以下の順 // Word @@ -94,10 +94,10 @@ class m88200CacheSet // line0 [ 0] [ 1] [ 2] [ 3] // line1 [ 4] [ 5] [ 6] [ 7] // : - uint32 word[16]; + uint32 word[16] {}; // 自身のセットインデックス - uint32 setidx; + uint32 setidx {}; // 引数 L の状態から line を最新にしたらどうなるか、を返す。 // 表示処理で一時変数に対して処理が必要なため static 分離してある。 @@ -120,12 +120,8 @@ class m88200CacheSet void Update(int line, Status status); - uint64 ReadLine(int line, uint32 tagaddr); - void Write(int line, uint32 paddr, uint32 data, int size); - uint64 CopyBackLine(int line); - // キャッシュを検索して、ヒットした line を返す。 int Lookup(uint32 tagaddr) const; }; @@ -145,7 +141,7 @@ class m88200 : public Object void MonitorUpdate(TextScreen&) override; private: - m88kcpu *parent; + m88kcpu *parent {}; public: // @@ -163,8 +159,8 @@ class m88200 : public Object // 0 で初期化。その後は全ビット変更可能。 // Type は $5 = 88200、$6 = 88204。ここでは 88200 固定。 // Version は不明。 - uint32 id; - uint32 version; + uint32 id {}; + uint32 version {}; // IDR レジスタの内容を返す uint32 GetIDR() const { @@ -181,7 +177,7 @@ class m88200 : public Object // +---------------------------------------------------+-----------+ // | reserved |CommandCode| // +---------------------------------------------------+-----------+ - uint32 command; + uint32 command {}; uint32 GetSCR() const; void SetSCR(uint32 val); private: @@ -212,7 +208,7 @@ class m88200 : public Object static const uint32 SSR_WP = 0x00000004; // Write Protection static const uint32 SSR_BH = 0x00000002; // BATC Hit static const uint32 SSR_V = 0x00000001; // Valid - uint32 ssr; + uint32 ssr {}; uint32 GetSSR() const { return ssr; } void SetSSR(uint32 val) { ssr = val; } @@ -222,7 +218,7 @@ class m88200 : public Object // +---------------------------------------------------------------+ // | Address | // +---------------------------------------------------------------+ - uint32 sar; + uint32 sar {}; uint32 GetSAR() const { return sar; } void SetSAR(uint32 val) { sar = val; } @@ -236,7 +232,7 @@ class m88200 : public Object static const uint32 SCTR_PE = 0x00008000; // Parity Enable static const uint32 SCTR_SE = 0x00004000; // Snoop Enable static const uint32 SCTR_PR = 0x00002000; // Priority Arbitration - uint32 sctr; + uint32 sctr {}; uint32 GetSCTR() const { return sctr; } void SetSCTR(uint32 val); @@ -279,7 +275,7 @@ class m88200 : public Object static const uint32 FAULT_CODE_PAGE = 5; // Page Fault static const uint32 FAULT_CODE_SUPERVISOR = 6; // Supervisor Violation static const uint32 FAULT_CODE_WRITE = 7; // Write Violation - uint32 fault_code; + uint32 fault_code {}; uint32 GetPFSR() const { return fault_code << 16; } @@ -293,7 +289,7 @@ class m88200 : public Object // +---------------------------------------------------------------+ // | Address | // +---------------------------------------------------------------+ - uint32 fault_addr; + uint32 fault_addr {}; uint32 GetPFAR() const { return fault_addr; } void SetPFAR(uint32 val) { fault_addr = val; } @@ -447,20 +443,20 @@ class m88200 : public Object // の2つに明確に分けて管理することにする。 uint32 acc_sdaddr {}; uint32 acc_pdaddr {}; - bool acc_read; // True if read access + bool acc_read {}; // True if read access bool acc_IsWrite() const { return !acc_read; } // True if write access // S/U 信号線 // 実際には P Bus の Address フェーズで毎回送られてくるが // そうそう変わらないので状態変化を通知してもらう方式。 // true なら super, false なら user。 - bool acc_super; + bool acc_super {}; void SetSuper(bool super) { acc_super = super; } m88200PATC *acc_patc {}; // ヒットした PATC エントリ - uint32 tmp_desc; // TEMP_DESCR + uint32 tmp_desc {}; // TEMP_DESCR // // アドレス変換 @@ -485,9 +481,14 @@ class m88200 : public Object // // キャッシュ // - + private: std::array setarray {}; + // キャッシュラインにメモリから読み込む + uint64 ReadLine(m88200CacheSet& set, int line, uint32 tagaddr); + // キャッシュラインをメモリに書き出す + uint64 CopyBackLine(m88200CacheSet& set, int line); + public: // キャッシュに対して paddr の読み込みを行う uint64 CacheRead(uint32 paddr); // キャッシュに対して paddr への書き込みを行う @@ -503,8 +504,22 @@ class m88200 : public Object MonitorCacheOverview(s, y, -1, is_gui); } + // + // MBus + // + public: + // MBus を所有している CMMU ID を返す。誰も持っていなければ -1。 + // これは static 関数 + static m88200 *GetBusMaster() { return mbus_master; } + + // この CMMU からのアクセスにウェイトを加算する (VM から使う) + void AddCycle(uint64 cycle); + private: - // まだない - void MBusAcquire() { } + void MBusAcquire(); void MBusRelease() { } + + // MBus を所有してる CMMU を指す。NULL なら解放。 + // これは static 変数で全 m88200 で共有している + static m88200 *mbus_master; };