From bf97201580349ffb22fbb25048c744af1d2a7ea0 Mon Sep 17 00:00:00 2001 From: nsafran1217 <54966414+nsafran1217@users.noreply.github.com> Date: Sun, 26 Feb 2023 21:52:19 -0500 Subject: [PATCH] Add support for SCSI-1 CD Drives, .is1 extension (#1109) * Add SCSI-1 option for scsicd with file extension is1 Update tests Update documentation with is1 file extension * Fix tests --- cpp/devices/device_factory.cpp | 4 +++- cpp/devices/scsicd.cpp | 5 +++-- cpp/devices/scsicd.h | 3 ++- cpp/piscsi/piscsi_core.cpp | 3 ++- cpp/test/device_factory_test.cpp | 4 +++- cpp/test/piscsi_response_test.cpp | 2 +- cpp/test/scsicd_test.cpp | 2 ++ doc/piscsi.1 | 1 + doc/piscsi_man_page.txt | 1 + 9 files changed, 18 insertions(+), 7 deletions(-) diff --git a/cpp/devices/device_factory.cpp b/cpp/devices/device_factory.cpp index 92449ac5..321162f7 100644 --- a/cpp/devices/device_factory.cpp +++ b/cpp/devices/device_factory.cpp @@ -59,6 +59,7 @@ DeviceFactory::DeviceFactory() extension_mapping["hdr"] = SCRM; extension_mapping["mos"] = SCMO; extension_mapping["iso"] = SCCD; + extension_mapping["is1"] = SCCD; device_mapping["bridge"] = SCBR; device_mapping["daynaport"] = SCDP; @@ -118,7 +119,8 @@ shared_ptr DeviceFactory::CreateDevice(PbDeviceType type, int lun break; case SCCD: - device = make_shared(lun, sector_sizes.find(SCCD)->second); + device = make_shared(lun, sector_sizes.find(SCCD)->second, + GetExtensionLowerCase(filename) == "is1" ? scsi_level::SCSI_1_CCS : scsi_level::SCSI_2); device->SetProduct("SCSI CD-ROM"); break; diff --git a/cpp/devices/scsicd.cpp b/cpp/devices/scsicd.cpp index a8db610e..bcea0386 100644 --- a/cpp/devices/scsicd.cpp +++ b/cpp/devices/scsicd.cpp @@ -21,7 +21,8 @@ using namespace scsi_defs; using namespace scsi_command_util; -SCSICD::SCSICD(int lun, const unordered_set& sector_sizes) : Disk(SCCD, lun) +SCSICD::SCSICD(int lun, const unordered_set& sector_sizes, scsi_defs::scsi_level level) + : Disk(SCCD, lun), scsi_level(level) { SetSectorSizes(sector_sizes); @@ -164,7 +165,7 @@ void SCSICD::ReadToc() vector SCSICD::InquiryInternal() const { - return HandleInquiry(device_type::CD_ROM, scsi_level::SCSI_2, true); + return HandleInquiry(device_type::CD_ROM, scsi_level, true); } void SCSICD::SetUpModePages(map>& pages, int page, bool changeable) const diff --git a/cpp/devices/scsicd.h b/cpp/devices/scsicd.h index 1263a14e..e30ab743 100644 --- a/cpp/devices/scsicd.h +++ b/cpp/devices/scsicd.h @@ -22,7 +22,7 @@ class SCSICD : public Disk, private ScsiMmcCommands { public: - SCSICD(int, const unordered_set&); + SCSICD(int, const unordered_set&, scsi_defs::scsi_level = scsi_level::SCSI_2); ~SCSICD() override = default; bool Init(const unordered_map&) override; @@ -43,6 +43,7 @@ private: void AddCDROMPage(map>&, bool) const; void AddCDDAPage(map>&, bool) const; + scsi_defs::scsi_level scsi_level; void OpenIso(); void OpenPhysical(); diff --git a/cpp/piscsi/piscsi_core.cpp b/cpp/piscsi/piscsi_core.cpp index 401199e7..ff6ecc18 100644 --- a/cpp/piscsi/piscsi_core.cpp +++ b/cpp/piscsi/piscsi_core.cpp @@ -62,7 +62,8 @@ void Piscsi::Banner(const vector& args) const cout << " hdi : SCSI HD image (Anex86 HD image)\n"; cout << " nhd : SCSI HD image (T98Next HD image)\n"; cout << " mos : SCSI MO image (MO image)\n"; - cout << " iso : SCSI CD image (ISO 9660 image)\n" << flush; + cout << " iso : SCSI CD image (ISO 9660 image)\n"; + cout << " is1 : SCSI CD image (ISO 9660 image, SCSI-1)\n" << flush; exit(EXIT_SUCCESS); } diff --git a/cpp/test/device_factory_test.cpp b/cpp/test/device_factory_test.cpp index 7f41c415..def637b6 100644 --- a/cpp/test/device_factory_test.cpp +++ b/cpp/test/device_factory_test.cpp @@ -29,6 +29,7 @@ TEST(DeviceFactoryTest, GetTypeForFile) EXPECT_EQ(device_factory.GetTypeForFile("test.hdr"), SCRM); EXPECT_EQ(device_factory.GetTypeForFile("test.mos"), SCMO); EXPECT_EQ(device_factory.GetTypeForFile("test.iso"), SCCD); + EXPECT_EQ(device_factory.GetTypeForFile("test.is1"), SCCD); EXPECT_EQ(device_factory.GetTypeForFile("test.suffix.iso"), SCCD); EXPECT_EQ(device_factory.GetTypeForFile("bridge"), SCBR); EXPECT_EQ(device_factory.GetTypeForFile("daynaport"), SCDP); @@ -79,7 +80,7 @@ TEST(DeviceFactoryTest, GetExtensionMapping) DeviceFactory device_factory; unordered_map mapping = device_factory.GetExtensionMapping(); - EXPECT_EQ(9, mapping.size()); + EXPECT_EQ(10, mapping.size()); EXPECT_EQ(SCHD, mapping["hd1"]); EXPECT_EQ(SCHD, mapping["hds"]); EXPECT_EQ(SCHD, mapping["hda"]); @@ -89,6 +90,7 @@ TEST(DeviceFactoryTest, GetExtensionMapping) EXPECT_EQ(SCRM, mapping["hdr"]); EXPECT_EQ(SCMO, mapping["mos"]); EXPECT_EQ(SCCD, mapping["iso"]); + EXPECT_EQ(SCCD, mapping["is1"]); } TEST(DeviceFactoryTest, GetDefaultParams) diff --git a/cpp/test/piscsi_response_test.cpp b/cpp/test/piscsi_response_test.cpp index a735040e..168eb5bc 100644 --- a/cpp/test/piscsi_response_test.cpp +++ b/cpp/test/piscsi_response_test.cpp @@ -221,5 +221,5 @@ TEST(PiscsiResponseTest, GetMappingInfo) const auto& info = response.GetMappingInfo(result); EXPECT_TRUE(result.status()); - EXPECT_EQ(9, info->mapping().size()); + EXPECT_EQ(10, info->mapping().size()); } diff --git a/cpp/test/scsicd_test.cpp b/cpp/test/scsicd_test.cpp index 7b7f9315..925ad06d 100644 --- a/cpp/test/scsicd_test.cpp +++ b/cpp/test/scsicd_test.cpp @@ -30,6 +30,8 @@ void ScsiCdTest_SetUpModePages(map>& pages) TEST(ScsiCdTest, Inquiry) { TestInquiry(SCCD, device_type::CD_ROM, scsi_level::SCSI_2, "PiSCSI SCSI CD-ROM ", 0x1f, true); + + TestInquiry(SCCD, device_type::CD_ROM, scsi_level::SCSI_1_CCS, "PiSCSI SCSI CD-ROM ", 0x1f, true, ".is1"); } TEST(ScsiCdTest, SetUpModePages) diff --git a/doc/piscsi.1 b/doc/piscsi.1 index 53fadf68..a40418e2 100644 --- a/doc/piscsi.1 +++ b/doc/piscsi.1 @@ -34,6 +34,7 @@ PiSCSI will determine the type of device based upon the file extension of the FI hda: SCSI Hard Disk image (Apple compatible - typically used with Macintosh computers) mos: SCSI Magneto-Optical image (generic - typically used with NeXT, X68000, etc.) iso: SCSI CD-ROM or DVD-ROM image (ISO 9660 image) + is1: SCSI CD-ROM or DVD-ROM image (ISO 9660 image, SCSI-1) For example, if you want to specify an Apple-compatible HD image on ID 0, you can use the following command: sudo piscsi -ID0 /path/to/drive/hdimage.hda diff --git a/doc/piscsi_man_page.txt b/doc/piscsi_man_page.txt index 22b64a80..727a4982 100644 --- a/doc/piscsi_man_page.txt +++ b/doc/piscsi_man_page.txt @@ -29,6 +29,7 @@ DESCRIPTION hda: SCSI Hard Disk image (Apple compatible - typically used with Macintosh computers) mos: SCSI Magneto-Optical image (generic - typically used with NeXT, X68000, etc.) iso: SCSI CD-ROM or DVD-ROM image (ISO 9660 image) + is1: SCSI CD-ROM or DVD-ROM image (ISO 9660 image, SCSI-1) For example, if you want to specify an Apple-compatible HD image on ID 0, you can use the following command: sudo piscsi -ID0 /path/to/drive/hdimage.hda