--- nono/vm/pedec.h 2026/04/29 17:04:45 1.1 +++ nono/vm/pedec.h 2026/04/29 17:04:55 1.1.1.4 @@ -9,14 +9,27 @@ #include "device.h" #include "interrupt.h" -class PEDECDevice - : public InterruptDevice +class PEDECDevice : public InterruptDevice { using inherited = InterruptDevice; private: 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,12 +40,16 @@ 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; - uint64 Read(uint32 addr); - uint64 Write(uint32 addr, uint32 data); - uint64 Peek(uint32 addr); + uint64 Read(uint32 offset); + uint64 Write(uint32 offset, uint32 data); + uint64 Peek(uint32 offset); private: // 割り込みステータスレジスタの値を取得 @@ -41,19 +58,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 {};