--- nono/vm/spc.h 2026/04/29 17:04:42 1.1.1.6 +++ nono/vm/spc.h 2026/04/29 17:04:45 1.1.1.7 @@ -55,8 +55,17 @@ struct SPC static const int SCMD_TERM_MODE = 0x01; // Termination Mode // INTS レジスタ - // 全ビットを保持。 - uint8 ints; + // + // 内部変数 ints は割り込み状態を一度に判別するため SERR レジスタの + // xfer ビット(SERR_XFER_OUT) もここの bit8 に含めている。 + // 残りの下位8ビットは INTS と同じ。 + // + // | b7 | b6 | b5 | b4 | b3 | b2 | b1 | b0 | + // INTS |SEL |RESL|DIS |CMPL|SERV|TOUT|HERR|REST| + // b8 + // ints変数 |xfer|SEL |RESL|DIS |CMPL|SERV|TOUT|HERR|REST| + // + uint16 ints; static const int INTS_SELECTED = 0x80; // Selected static const int INTS_RESELECTED = 0x40; // Reselected static const int INTS_DISCONNECTED = 0x20; // Disconnected @@ -66,6 +75,13 @@ struct SPC static const int INTS_HARD_ERR = 0x02; // SPC Hard Error static const int INTS_RESET_COND = 0x01; // Reset Condition + static const int INTS_XFER_OUT = 0x100; // SERR_XFER_OUT + + // 割り込みマスク (INTS_RESET_COND はノンマスカブル割り込み) + uint16 ints_mask; + static const int INTS_ENABLE_MASK = 0x01ff; + static const int INTS_DISABLE_MASK = 0x0001; + // PSNS レジスタ uint8 psns; static const int PSNS_REQ = 0x80; @@ -94,6 +110,8 @@ struct SPC static const int SSTS_DREG_EMPTY = 0x01; // DREG Status (Empty) // SERR レジスタ + // XFER_OUT 以外の4つの有効ビットを保持。 + // XFER_OUT は ints が担当している。 uint8 serr; static const int SERR_DATAERR_SCSI = 0x80; // Data Error: SCSI static const int SERR_DATAERR_SPC = 0x40; // Data Error: SPC @@ -131,7 +149,7 @@ class SPCDevice : public SCSIHostDevice using inherited = SCSIHostDevice; public: SPCDevice(); - ~SPCDevice() override; + virtual ~SPCDevice() override; bool Init() override; void ResetHard() override; @@ -165,6 +183,8 @@ class SPCDevice : public SCSIHostDevice // SCTL レジスタへの書き込み void WriteSCTL(uint32); + // 割り込みマスクの再構成 + void MakeIntsMask(); // SCMD レジスタへの書き込み void WriteSCMD(uint32); @@ -176,6 +196,10 @@ class SPCDevice : public SCSIHostDevice // INTS 設定 void SetINTS(uint32); + // INTS レジスタ値の取得 + uint32 GetINTS() const; + // 割り込み信号線の状態を変える + void ChangeInterrupt(); // PSNS レジスタ値の取得 uint32 GetPSNS() const; @@ -185,6 +209,9 @@ class SPCDevice : public SCSIHostDevice // 表示のための前回値 uint32 prev_ssts {}; + // SERR レジスタ値の取得 + uint32 GetSERR() const; + // PCTL レジスタ値の取得 uint32 GetPCTL() const; @@ -236,6 +263,9 @@ class SPCDevice : public SCSIHostDevice uint32 read_wait {}; uint32 write_wait {}; + // 割り込み信号線の接続先デバイス + InterruptDevice *interrupt {}; + // 接続中のデバイス(イニシエータ含む)を ID 順に並べたリスト (モニタ用) std::vector connected_devices {};