--- nono/vm/dmac.h 2026/04/29 17:04:41 1.1.1.5 +++ nono/vm/dmac.h 2026/04/29 17:04:44 1.1.1.6 @@ -116,6 +116,10 @@ struct DMAC bool active; // ACT bool pcl; // PCL の状態 (High が true) bool prev_pcl; // 前回の PCL の状態 (High が true) + bool IsINTR() const { // CSR の割り込み要因が立っていれば true + // XXX PCT は未対応 + return (csr & (CSR_COC | CSR_BTC | CSR_NDT | CSR_ERR)); + } uint8 cer; uint8 dcr; @@ -138,7 +142,6 @@ struct DMAC uint32 GetDAC() const { return (scr & 3); } uint8 ccr; - bool int_enable; // INT: 割り込み許可なら true uint16 mtc; uint32 mar; @@ -154,13 +157,10 @@ struct DMAC uint8 PeekCSR() const; void WriteCSR(uint32 data); - uint8 PeekCCR() const; void WriteCCR(uint32 data); // 転送開始 void StartTransfer(); - // 割り込み - void SetINT(uint32 val); } chan[4]; // 全体 @@ -176,7 +176,7 @@ class DMACDevice public: DMACDevice(); - ~DMACDevice() override; + virtual ~DMACDevice() override; void ResetHard() override; void MonitorUpdate(TextScreen&) override; @@ -188,6 +188,9 @@ class DMACDevice int64 TransferM8toD8(DMAC::Channel *chan); int64 TransferD8toM8(DMAC::Channel *chan); + // 割り込みアクノリッジ + int InterruptAcknowledge(); + protected: // BusIO インタフェース static const uint NPORT = 256; @@ -199,6 +202,9 @@ class DMACDevice void MonitorReg4(TextScreen&, int x, int y, uint32 reg, const char * const *names); + // 割り込み信号線の状態を変更 + void ChangeInterrupt(); + struct DMAC dmac {}; Event event[4] {};