--- nono/vm/scsicmd.cpp 2026/04/29 17:04:59 1.1 +++ nono/vm/scsicmd.cpp 2026/04/29 17:05:28 1.1.1.5 @@ -4,7 +4,9 @@ // Licensed under nono-license.txt // +// // SCSI コマンド +// #include "scsicmd.h" #include "scsidev.h" @@ -232,7 +234,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", @@ -456,7 +458,7 @@ SCSICmdInquiry::Command(std::vectorClearSense(); 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 +471,7 @@ SCSICmdInquiry::Command(std::vector> pagelist; - -#define ADD(code, func) do { \ - pagelist.emplace_back(SCSI::ModePage::code, \ - std::bind(&SCSICmdModeSense::func, this)); \ -} while (0) - - ADD(/*04*/RigidDiskGeometry, AddNotSupportedPage); - ADD(/*05*/FlexibleDisk, AddNotSupportedPage); - ADD(/*08*/CachingPage, AddCachingPage); - ADD(/*00*/VendorSpecific, AddEmptyPage); - + // モードページ if (pagecode == SCSI::ModePage::AllPages) { // サポートしているのを全部送る。 if (parent->loglevel >= 1) { log += " " + SCSI::GetModePageDisp(pagecode); log += "->"; } - for (auto& pair : pagelist) { + for (auto& pair : Pagelist) { auto code = pair.first; - auto& func = pair.second; + auto func = pair.second; - if (func() != ModePageResult::Failed) { + if ((this->*(func))() != ModePageResult::Failed) { if (parent->loglevel >= 1) { log += " " + SCSI::GetModePageDisp(code); } @@ -808,23 +797,23 @@ SCSICmdModeSense::Command(std::vector*(func))(); break; } } // Failed は対応しない/できないと分かっているページ、 - // NotImplemented は未実装や知らないページ。 + // NotSupported は未実装や知らないページ。 if (r <= ModePageResult::Failed) { if (parent->loglevel >= 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()); } @@ -855,20 +844,32 @@ SCSICmdModeSense::Command(std::vector> +SCSICmdModeSense::Pagelist { + PAGE(/*04*/RigidDiskGeometry, AddNotSupportedPage), + PAGE(/*05*/FlexibleDisk, AddNotSupportedPage), + PAGE(/*08*/CachingPage, AddCachingPage), + PAGE(/*00*/VendorSpecific, AddEmptyPage), +}; + // サポートしないページ // // ページコード 04 RigidDiskGeometry (DA) // -> 生イメージからジオメトリを求めるのは意味ないので実装しない。 // ページコード 05 FlexibleDisk (DA) // -> ジオメトリなどのパラメータがメインっぽいので実装しない。 -int +SCSICmdModeSense::ModePageResult SCSICmdModeSense::AddNotSupportedPage() { return ModePageResult::Failed; } // 空のページ -int +SCSICmdModeSense::ModePageResult SCSICmdModeSense::AddEmptyPage() { std::vector page(2); @@ -881,11 +882,11 @@ SCSICmdModeSense::AddEmptyPage() } // ページコード 08 CachingPage (DA, MO, CD-ROM) -int +SCSICmdModeSense::ModePageResult SCSICmdModeSense::AddCachingPage() { - const SCSIDisk *disk = dynamic_cast(parent); - assert(disk); + // XXX この assert いる? + assert(dynamic_cast(parent) != NULL); // とりあえずパラメータはなんもなし。 // PC::Changeable でも全部 0 なのでこのままでいい。 @@ -945,7 +946,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()) { @@ -1021,7 +1022,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); @@ -1150,21 +1151,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", @@ -1177,7 +1178,7 @@ SCSICmdReadTOC::Command(std::vector