--- nono/vm/spc.h 2026/04/29 17:04:29 1.1.1.2 +++ nono/vm/spc.h 2026/04/29 17:04:32 1.1.1.3 @@ -9,6 +9,7 @@ #include "scsidev.h" #include "scheduler.h" #include "fixedqueue.h" +#include "vm.h" struct SPC { @@ -128,7 +129,7 @@ class SPCDevice : public SCSIHostDevice { typedef SCSIHostDevice inherited; public: - SPCDevice(uint32); + SPCDevice(); virtual ~SPCDevice(); virtual bool Init(); @@ -136,11 +137,6 @@ class SPCDevice : public SCSIHostDevice virtual void ResetSoft(); void Reset(); - virtual uint64 Read8(uint32 addr); - virtual uint64 Read16(uint32 addr); - virtual uint64 Write8(uint32 addr, uint32 data); - virtual uint64 Write16(uint32 addr, uint32 data); - virtual uint64 Peek8(uint32 addr); virtual bool MonitorUpdate(); // SCSIBus コールバック @@ -154,6 +150,13 @@ class SPCDevice : public SCSIHostDevice // 情報転送フェーズで REQ を立てた (イニシエータのみ通知される) virtual void TransferReqCB(); + protected: + // BusIO インタフェース + static const uint32 NPORT = 16; + uint64 Read(uint32 addr); + uint64 Write(uint32 addr, uint32 data); + uint64 Peek(uint32 addr); + private: void MonitorReg(int x, int y, uint32 reg, const char * const *names); @@ -168,6 +171,8 @@ class SPCDevice : public SCSIHostDevice // INTS レジスタへの書き込み void WriteINTS(uint32); + // 表示のための前回値 + uint32 prev_ints {}; // INTS 設定 void SetINTS(uint32); @@ -177,10 +182,16 @@ class SPCDevice : public SCSIHostDevice // SSTS レジスタ値の取得 uint32 GetSSTS() const; + // 表示のための前回値 + uint32 prev_ssts {}; // PCTL レジスタ値の取得 uint32 GetPCTL() const; + // DREG レジスタアクセス + uint64 ReadDREG(); + uint64 WriteDREG(uint32 data); + // バスフリーフェーズに移行する void BusFree(); // 直近のバスフリーフェーズになった時刻 @@ -204,7 +215,8 @@ class SPCDevice : public SCSIHostDevice // Transfer コマンド実行 void TransferCommand(); void TransferCommandStart(int code); - void ProgramTransfer(int code); + void HardwareTransfer(int code); + void TransferComplete(); // Transfer コマンド実行中なら true bool transfer_command_running = false; @@ -214,8 +226,8 @@ class SPCDevice : public SCSIHostDevice // レジスタ struct SPC spc {}; - uint32 regbase = 0; // レジスタの先頭アドレス - int regstride = 0; // レジスタ間の距離 + // VM 種別 + vmtype_t vmtype {}; // SPC に入力されるクロック周期 [nsec] int t_CLF = 0; @@ -225,4 +237,4 @@ class SPCDevice : public SCSIHostDevice Event event_tc {}; }; -extern SPCDevice *gSPC; +extern std::unique_ptr gSPC;