--- nono/vm/scsidev.h 2026/04/29 17:04:42 1.1.1.5 +++ nono/vm/scsidev.h 2026/04/29 17:04:56 1.1.1.9 @@ -31,9 +31,10 @@ class SCSICmd; // class SCSIDevice : public IODevice { + using inherited = IODevice; public: - SCSIDevice(); - ~SCSIDevice() override; + SCSIDevice(const std::string& objname_); + virtual ~SCSIDevice() override; // バスに接続 (SCSIBus::Attach から呼ばれる) void Attach(SCSIBus *bus_, int id) { @@ -123,9 +124,10 @@ class SCSIDevice : public IODevice // class SCSIHostDevice : public SCSIDevice { + using inherited = SCSIDevice; public: - SCSIHostDevice(); - ~SCSIHostDevice() override; + SCSIHostDevice(const std::string& objname_); + virtual ~SCSIHostDevice() override; bool Create() override; bool Init() override; @@ -139,6 +141,9 @@ class SCSIHostDevice : public SCSIDevice // ターゲットデバイス取得 (ROM エミュレーション用) SCSITarget *GetTarget(int id) const { return target[id].get(); } + // SCSIBus を取得 (UI からインジケータ表示用) + std::shared_ptr GetSCSIBus() const { return scsibus; } + protected: // 設定ファイルに使われるこのホストデバイスを示す接頭語を設定する // (ここで設定項目を Add するので、継承クラスのコンストラクタから呼ぶこと) @@ -173,7 +178,7 @@ class SCSIHostDevice : public SCSIDevice // ID0 ||<----> bus |<----------+ // || +----------+ own // - std::unique_ptr scsibus {}; + std::shared_ptr scsibus {}; std::unique_ptr target[8] {}; }; @@ -185,8 +190,11 @@ class SCSITarget : public SCSIDevice using inherited = SCSIDevice; friend class SCSICmdModeSelect6; public: - SCSITarget(SCSIHostDevice *h, int id, std::vector& inq); - ~SCSITarget() override; + SCSITarget(const std::string& objname_, + SCSIHostDevice *h, int id, std::vector& inq); + virtual ~SCSITarget() override; + + bool PowerOn() override; // Inquiry 応答データ std::vector inquiry_data {}; @@ -266,9 +274,10 @@ class SCSIHD : public SCSITarget friend class SCSICmdWrite6; friend class SCSICmdReadCapacity; friend class SCSICmdRead10; + friend class SCSICmdWrite10; public: SCSIHD(SCSIHostDevice *h, int id); - ~SCSIHD() override; + virtual ~SCSIHD() override; bool Init() override; void DispatchCmd() override; @@ -282,6 +291,9 @@ class SCSIHD : public SCSITarget // ディスクイメージ長を取得 off_t GetSize() const { return file.GetMemSize(); } + // デバイスがライトプロテクトかどうかを返す + bool GetWriteProtect() const { return writeprotect; } + private: MappedFile file {}; uint8 *mem {};