--- nono/vm/scsicmd.cpp 2026/04/29 17:05:03 1.1.1.2 +++ nono/vm/scsicmd.cpp 2026/04/29 17:05:42 1.1.1.6 @@ -4,14 +4,16 @@ // Licensed under nono-license.txt // +// // SCSI コマンド +// #include "scsicmd.h" #include "scsidev.h" #define LUN (cmdseq[1] >> 5) -// LUN != 0 のリクエストをエラーにする (Command() 内で使う)。 +// LUN != 0 のリクエストをエラーにする (ExecCommand() 内で使う)。 #define CheckLUN do { \ if (LUN != 0) { \ parent->sensekey = SCSI::SenseKey::NotReady; \ @@ -20,7 +22,7 @@ return SCSI::XferPhase::Status; \ } \ } while (0) -// メディアがなければエラーにする (Command() 内で使う)。 +// メディアがなければエラーにする (ExecCommand() 内で使う)。 #define CheckMedium do { \ if (disk->IsMediumLoaded() == false) { \ parent->sensekey = SCSI::SenseKey::NotReady; \ @@ -48,7 +50,7 @@ SCSICmd::~SCSICmd() // コマンドフェーズ SCSI::XferPhase -SCSICmd::Command(std::vector& cmdseq) +SCSICmd::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -69,14 +71,9 @@ SCSICmdNotSupportedCommand::SCSICmdNotSu { } -// デストラクタ -SCSICmdNotSupportedCommand::~SCSICmdNotSupportedCommand() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdNotSupportedCommand::Command(std::vector& cmdseq) +SCSICmdNotSupportedCommand::ExecCommand(std::vector& cmdseq) { // XXX センスキーよく分からんけどとりあえず parent->sensekey = SCSI::SenseKey::IllegalRequest; @@ -109,14 +106,9 @@ SCSICmdRequestSense::SCSICmdRequestSense { } -// デストラクタ -SCSICmdRequestSense::~SCSICmdRequestSense() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdRequestSense::Command(std::vector& cmdseq) +SCSICmdRequestSense::ExecCommand(std::vector& cmdseq) { CheckLUN; @@ -214,14 +206,9 @@ SCSICmdRead::SCSICmdRead(SCSIDisk *paren disk = parent_; } -// デストラクタ -SCSICmdRead::~SCSICmdRead() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdRead::Command(std::vector& cmdseq) +SCSICmdRead::ExecCommand(std::vector& cmdseq) { uint32 lba; uint32 blks; @@ -232,7 +219,7 @@ SCSICmdRead::Command(std::vector& CheckLUN; CheckMedium; - const uint8& cmd = cmdseq[0]; + const uint8 cmd = cmdseq[0]; if (cmd == SCSI::Command::Read10) { if ((cmdseq[1] & 0x01)) { parent->putlogf(0, lstr("%s RelAdr not supported", @@ -323,14 +310,9 @@ SCSICmdWrite::SCSICmdWrite(SCSIDisk *par disk = parent_; } -// デストラクタ -SCSICmdWrite::~SCSICmdWrite() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdWrite::Command(std::vector& cmdseq) +SCSICmdWrite::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -443,20 +425,15 @@ SCSICmdInquiry::SCSICmdInquiry(SCSITarge { } -// デストラクタ -SCSICmdInquiry::~SCSICmdInquiry() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdInquiry::Command(std::vector& cmdseq) +SCSICmdInquiry::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); uint reqlen = (uint)cmdseq[4]; - parent->putlogf(1, lstr("%s LUN=%d reqlen=$%02x", + parent->putlogf(1, lstr("%s LUN=%u reqlen=$%02x", SCSI::GetCommandName(cmdseq[0]), LUN, reqlen)); // 基本の 36バイト分を用意した上でデバイスに問い合わせ。 @@ -469,7 +446,7 @@ SCSICmdInquiry::Command(std::vector& cmdseq) +SCSICmdModeSelect::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -692,14 +664,9 @@ SCSICmdModeSense::SCSICmdModeSense(SCSIT { } -// デストラクタ -SCSICmdModeSense::~SCSICmdModeSense() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdModeSense::Command(std::vector& cmdseq) +SCSICmdModeSense::ExecCommand(std::vector& cmdseq) { uint reqlen; @@ -724,7 +691,7 @@ SCSICmdModeSense::Command(std::vectorloglevel >= 1) { - if (r == ModePageResult::NotImplemented) { - parent->putlogn("%s 未実装", log.c_str()); + if (r == ModePageResult::NotSupported) { + parent->putlogn("%s not supported", log.c_str()); } else { parent->putlogn("%s", log.c_str()); } @@ -883,8 +850,8 @@ SCSICmdModeSense::AddEmptyPage() SCSICmdModeSense::ModePageResult SCSICmdModeSense::AddCachingPage() { - const SCSIDisk *disk = dynamic_cast(parent); - assert(disk); + // XXX この assert いる? + assert(dynamic_cast(parent) != NULL); // とりあえずパラメータはなんもなし。 // PC::Changeable でも全部 0 なのでこのままでいい。 @@ -927,14 +894,9 @@ SCSICmdStartStopUnit::SCSICmdStartStopUn disk = parent_; } -// デストラクタ -SCSICmdStartStopUnit::~SCSICmdStartStopUnit() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdStartStopUnit::Command(std::vector& cmdseq) +SCSICmdStartStopUnit::ExecCommand(std::vector& cmdseq) { bool immed = (cmdseq[1] & 0x01); if (immed) { @@ -944,7 +906,7 @@ SCSICmdStartStopUnit::Command(std::vecto bool loej = (cmdseq[4] & 0x02); bool start = (cmdseq[4] & 0x01); - parent->putlogf(1, lstr("%s LoEj=%d Start=%d", + parent->putlogf(1, lstr("%s LoEj=%u Start=%u", SCSI::GetCommandName(cmdseq[0]), (loej ? 1 : 0), (start ? 1 : 0))); if (disk->IsRemovableDevice()) { @@ -971,7 +933,7 @@ SCSICmdStartStopUnit::Command(std::vecto } else { // 固定デバイスなら黙って成功しておく? } - return inherited::Command(cmdseq); + return inherited::ExecCommand(cmdseq); } @@ -1002,14 +964,9 @@ SCSICmdPreventAllowMediumRemoval::SCSICm disk = parent_; } -// デストラクタ -SCSICmdPreventAllowMediumRemoval::~SCSICmdPreventAllowMediumRemoval() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdPreventAllowMediumRemoval::Command(std::vector& cmdseq) +SCSICmdPreventAllowMediumRemoval::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -1020,7 +977,7 @@ SCSICmdPreventAllowMediumRemoval::Comman // PreventMediumRemoval() は状態変化でログレベル 1 で表示してるので、 // ここではログレベル 2 で常に表示にしておく。 uint prevent = cmdseq[4] & 1; - parent->putlogf(2, lstr("%s prevent=%d", + parent->putlogf(2, lstr("%s prevent=%u", SCSI::GetCommandName(cmdseq[0]), prevent)); disk->PreventMediumRemoval(prevent); @@ -1062,14 +1019,9 @@ SCSICmdReadCapacity::SCSICmdReadCapacity disk = parent_; } -// デストラクタ -SCSICmdReadCapacity::~SCSICmdReadCapacity() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdReadCapacity::Command(std::vector& cmdseq) +SCSICmdReadCapacity::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -1132,14 +1084,9 @@ SCSICmdReadTOC::SCSICmdReadTOC(SCSIDisk disk = parent_; } -// デストラクタ -SCSICmdReadTOC::~SCSICmdReadTOC() -{ -} - // コマンドフェーズ SCSI::XferPhase -SCSICmdReadTOC::Command(std::vector& cmdseq) +SCSICmdReadTOC::ExecCommand(std::vector& cmdseq) { // コマンド開始前に直前のセンスデータをクリア parent->ClearSense(); @@ -1149,21 +1096,21 @@ SCSICmdReadTOC::Command(std::vectorputlogf(0, lstr("ReadTOC MSF=1 未実装")); + parent->putlogf(0, lstr("ReadTOC MSF=1 (NOT IMPLEMENTED)")); } // 開始トラックが 0 なら、媒体上の先頭トラックからを意味する。 // ここでは1トラック目から始まることにしてみる。 - const int TrackStart = 1; - const int TrackMax = 1; + const uint TrackStart = 1; + const uint TrackMax = 1; - int start = cmdseq[6]; + uint start = cmdseq[6]; if (start == 0) { start = TrackStart; } // イニシエータが用意しているバッファ長 - int reqlen = (cmdseq[7] << 8) | cmdseq[8]; + uint reqlen = (cmdseq[7] << 8) | cmdseq[8]; // start は送られてきた情報が知りたいだろう parent->putlogf(1, lstr("%s start=$%x len=$%x", @@ -1176,7 +1123,7 @@ SCSICmdReadTOC::Command(std::vector