From c43678269cd4a7281babecfce7fe848eb0dd5413 Mon Sep 17 00:00:00 2001 From: phe78 Date: Thu, 31 Aug 2023 11:38:11 +0200 Subject: [PATCH 1/2] Set vendor / product id with image file name --- lib/SCSI2SD/include/scsi2sd.h | 3 ++- src/ZuluSCSI_disk.cpp | 43 ++++++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/lib/SCSI2SD/include/scsi2sd.h b/lib/SCSI2SD/include/scsi2sd.h index a3ccd164..d94f0894 100755 --- a/lib/SCSI2SD/include/scsi2sd.h +++ b/lib/SCSI2SD/include/scsi2sd.h @@ -83,7 +83,8 @@ typedef enum S2S_CFG_QUIRKS_APPLE = 1, S2S_CFG_QUIRKS_OMTI = 2, S2S_CFG_QUIRKS_XEBEC = 4, - S2S_CFG_QUIRKS_VMS = 8 + S2S_CFG_QUIRKS_VMS = 8, + S2S_CFG_QUIRKS_EMU = 9 } S2S_CFG_QUIRKS; typedef enum diff --git a/src/ZuluSCSI_disk.cpp b/src/ZuluSCSI_disk.cpp index 9ff6ad05..2fc840d8 100644 --- a/src/ZuluSCSI_disk.cpp +++ b/src/ZuluSCSI_disk.cpp @@ -229,9 +229,22 @@ static void formatDriveInfoField(char *field, int fieldsize, bool align_right) } } +// remove path and extension from filename +const char* get_image_name(const char* filename) +{ + char *j, *r; + + r = (char *)malloc(strlen(filename)); + strcpy(r, strrchr(filename,'/') + 5); + j = strrchr(r, '.'); + *j = '\0'; + + return r; +} + // Set default drive vendor / product info after the image file // is loaded and the device type is known. -static void setDefaultDriveInfo(int target_idx) +static void setDefaultDriveInfo(int target_idx, const char* filename) { image_config_t &img = g_DiskImages[target_idx]; @@ -249,6 +262,8 @@ static void setDefaultDriveInfo(int target_idx) static const char *apl_driveinfo_magopt[4] = APPLE_DRIVEINFO_MAGOPT; static const char *apl_driveinfo_tape[4] = APPLE_DRIVEINFO_TAPE; + static const char *image_name; + const char **driveinfo = NULL; if (img.quirks == S2S_CFG_QUIRKS_APPLE) @@ -280,16 +295,28 @@ static void setDefaultDriveInfo(int target_idx) } } - if (img.vendor[0] == '\0') + if (img.quirks == S2S_CFG_QUIRKS_EMU) { - memset(img.vendor, 0, sizeof(img.vendor)); - strncpy(img.vendor, driveinfo[0], sizeof(img.vendor)); + image_name = get_image_name(filename); + memset(img.vendor, 0, 8); + strncpy(img.vendor, image_name, 8); + memset(img.prodId, 0, 8); + strncpy(img.prodId, image_name+8, 8); } - if (img.prodId[0] == '\0') + else { - memset(img.prodId, 0, sizeof(img.prodId)); - strncpy(img.prodId, driveinfo[1], sizeof(img.prodId)); + if (img.vendor[0] == '\0') + { + memset(img.vendor, 0, sizeof(img.vendor)); + strncpy(img.vendor, driveinfo[0], sizeof(img.vendor)); + } + + if (img.prodId[0] == '\0') + { + memset(img.prodId, 0, sizeof(img.prodId)); + strncpy(img.prodId, driveinfo[1], sizeof(img.prodId)); + } } if (img.revision[0] == '\0') @@ -398,7 +425,7 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int PLATFORM_CONFIG_HOOK(&img); #endif - setDefaultDriveInfo(target_idx); + setDefaultDriveInfo(target_idx, filename); if (img.prefetchbytes > 0) { From 0487ac21a94b79aa9389c5f54b345b2d26179c42 Mon Sep 17 00:00:00 2001 From: phe78 Date: Thu, 31 Aug 2023 20:30:44 +0200 Subject: [PATCH 2/2] improved filename extract code and name_from_image switch --- src/ZuluSCSI_disk.cpp | 73 +++++++++++++++++++++++++------------------ src/ZuluSCSI_disk.h | 3 ++ 2 files changed, 45 insertions(+), 31 deletions(-) diff --git a/src/ZuluSCSI_disk.cpp b/src/ZuluSCSI_disk.cpp index 2fc840d8..291821ea 100644 --- a/src/ZuluSCSI_disk.cpp +++ b/src/ZuluSCSI_disk.cpp @@ -230,21 +230,39 @@ static void formatDriveInfoField(char *field, int fieldsize, bool align_right) } // remove path and extension from filename -const char* get_image_name(const char* filename) -{ - char *j, *r; +void extractFileName(const char* path, char* output) { + + const char *lastSlash, *lastDot; + int fileNameLength; + + lastSlash = strrchr(path, '/'); + if (!lastSlash) lastSlash = path; + else lastSlash++; + + lastDot = strrchr(lastSlash, '.'); + if (lastDot && (lastDot > lastSlash)) { + fileNameLength = lastDot - lastSlash; + strncpy(output, lastSlash, fileNameLength); + output[fileNameLength] = '\0'; + } else { + strcpy(output, lastSlash); + } +} - r = (char *)malloc(strlen(filename)); - strcpy(r, strrchr(filename,'/') + 5); - j = strrchr(r, '.'); - *j = '\0'; +void setNameFromImage(image_config_t &img, const char *filename) { - return r; + char image_name[MAX_FILE_PATH]; + + extractFileName(filename, image_name); + memset(img.vendor, 0, 8); + strncpy(img.vendor, image_name, 8); + memset(img.prodId, 0, 8); + strncpy(img.prodId, image_name+8, 8); } // Set default drive vendor / product info after the image file // is loaded and the device type is known. -static void setDefaultDriveInfo(int target_idx, const char* filename) +static void setDefaultDriveInfo(int target_idx) { image_config_t &img = g_DiskImages[target_idx]; @@ -262,8 +280,6 @@ static void setDefaultDriveInfo(int target_idx, const char* filename) static const char *apl_driveinfo_magopt[4] = APPLE_DRIVEINFO_MAGOPT; static const char *apl_driveinfo_tape[4] = APPLE_DRIVEINFO_TAPE; - static const char *image_name; - const char **driveinfo = NULL; if (img.quirks == S2S_CFG_QUIRKS_APPLE) @@ -295,28 +311,16 @@ static void setDefaultDriveInfo(int target_idx, const char* filename) } } - if (img.quirks == S2S_CFG_QUIRKS_EMU) + if (img.vendor[0] == '\0') { - image_name = get_image_name(filename); - memset(img.vendor, 0, 8); - strncpy(img.vendor, image_name, 8); - memset(img.prodId, 0, 8); - strncpy(img.prodId, image_name+8, 8); + memset(img.vendor, 0, sizeof(img.vendor)); + strncpy(img.vendor, driveinfo[0], sizeof(img.vendor)); } - else + if (img.prodId[0] == '\0') { - if (img.vendor[0] == '\0') - { - memset(img.vendor, 0, sizeof(img.vendor)); - strncpy(img.vendor, driveinfo[0], sizeof(img.vendor)); - } - - if (img.prodId[0] == '\0') - { - memset(img.prodId, 0, sizeof(img.prodId)); - strncpy(img.prodId, driveinfo[1], sizeof(img.prodId)); - } + memset(img.prodId, 0, sizeof(img.prodId)); + strncpy(img.prodId, driveinfo[1], sizeof(img.prodId)); } if (img.revision[0] == '\0') @@ -425,7 +429,13 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int PLATFORM_CONFIG_HOOK(&img); #endif - setDefaultDriveInfo(target_idx, filename); + if (img.name_from_image) + { + setNameFromImage(img, filename); + logmsg("Vendor / product id set from image file name"); + } + + setDefaultDriveInfo(target_idx); if (img.prefetchbytes > 0) { @@ -555,8 +565,9 @@ static void scsiDiskLoadConfig(int target_idx, const char *section) img.deviceTypeModifier = ini_getl(section, "TypeModifier", img.deviceTypeModifier, CONFIGFILE); img.sectorsPerTrack = ini_getl(section, "SectorsPerTrack", img.sectorsPerTrack, CONFIGFILE); img.headsPerCylinder = ini_getl(section, "HeadsPerCylinder", img.headsPerCylinder, CONFIGFILE); - img.quirks = ini_getl(section, "Quirks", img.quirks, CONFIGFILE); + img.quirks = ini_getl(section, "Quirks", img.quirks, CONFIGFILE); img.rightAlignStrings = ini_getbool(section, "RightAlignStrings", 0, CONFIGFILE); + img.name_from_image = ini_getbool(section, "NameFromImage", 0, CONFIGFILE); img.prefetchbytes = ini_getl(section, "PrefetchBytes", img.prefetchbytes, CONFIGFILE); img.reinsert_on_inquiry = ini_getbool(section, "ReinsertCDOnInquiry", img.reinsert_on_inquiry, CONFIGFILE); img.reinsert_after_eject = ini_getbool(section, "ReinsertAfterEject", img.reinsert_after_eject, CONFIGFILE); diff --git a/src/ZuluSCSI_disk.h b/src/ZuluSCSI_disk.h index 63970a78..ab8432fb 100644 --- a/src/ZuluSCSI_disk.h +++ b/src/ZuluSCSI_disk.h @@ -78,6 +78,9 @@ struct image_config_t: public S2S_TargetCfg // This field uses -1 for default when field is not set in .ini int rightAlignStrings; + // Set Vendor / Product Id from image file name + bool name_from_image; + // Maximum amount of bytes to prefetch int prefetchbytes;