--- nono/vm/scsicmd.cpp 2026/04/29 17:04:59 1.1 +++ nono/vm/scsicmd.cpp 2026/04/29 17:05:14 1.1.1.4 @@ -4,7 +4,9 @@ // Licensed under nono-license.txt // +// // SCSI コマンド +// #include "scsicmd.h" #include "scsidev.h" @@ -776,31 +778,18 @@ SCSICmdModeSense::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 なのでこのままでいい。 @@ -1150,7 +1151,7 @@ SCSICmdReadTOC::Command(std::vectorputlogf(0, lstr("ReadTOC MSF=1 未実装")); + parent->putlogf(0, lstr("ReadTOC MSF=1 (NOT IMPLEMENTED)")); } // 開始トラックが 0 なら、媒体上の先頭トラックからを意味する。