--- nono/vm/pedec.h 2026/04/29 17:04:45 1.1.1.1 +++ nono/vm/pedec.h 2026/04/29 17:04:47 1.1.1.2 @@ -17,6 +17,20 @@ class PEDECDevice static const int baseaddr = 0xe9c000; public: + // int_asserted が下位デバイスからの割り込み信号線 (%1 でアサート)。 + // int_enabled がマスク (%1 なら割り込み許可)。 + // よって二者を AND とれば上位に割り込みを上げるかどうかが求まる。 + // SPC からの割り込みはここでマスク制御しないので int_enabled には + // IntmapSPC を常に立てておくこと。 + // $e9c001 (割り込みステータスレジスタ) のビット順は + // これとは全然違うので注意のこと。 + static const uint32 IntmapSPC = 0x10; + static const uint32 IntmapFDC = 0x08; + static const uint32 IntmapFDD = 0x04; + static const uint32 IntmapHDD = 0x02; + static const uint32 IntmapPRT = 0x01; + + public: PEDECDevice(); virtual ~PEDECDevice() override; @@ -27,6 +41,10 @@ class PEDECDevice void NegateINT(Device *source) override; int InterruptAcknowledge(int lv) override; + // 割り込み許可/禁止状態と、割り込みが発生しているかどうかの内部状態を + // まとめて返す。割り込みコントローラからのモニタ表示に使う。 + uint32 GetInt() const { return (int_enabled << 16) | int_asserted; } + protected: // BusIO インタフェース static const uint32 NPORT = 8; @@ -41,19 +59,6 @@ class PEDECDevice // 割り込み信号線の状態を変える void ChangeInterrupt(); - // int_asserted が下位デバイスからの割り込み信号線 (%1 でアサート)。 - // int_enabled がマスク (%1 なら割り込み許可)。 - // よって二者を AND とれば上位に割り込みを上げるかどうかが求まる。 - // SPC からの割り込みはここでマスク制御しないので int_enabled には - // IntmapSPC を常に立てておくこと。 - // $e9c001 (割り込みステータスレジスタ) のビット順は - // これとは全然違うので注意のこと。 - static const uint32 IntmapSPC = 0x10; - static const uint32 IntmapFDC = 0x08; - static const uint32 IntmapFDD = 0x04; - static const uint32 IntmapHDD = 0x02; - static const uint32 IntmapPRT = 0x01; - uint32 int_asserted {}; uint32 int_enabled {}; uint8 vector {};