Explorar o código

Add system presets to set default settings for host platform.

Currently knows "Mac" and "MacPlus".
New presets can be added in ZuluSCSI_presets.cpp.
Petteri Aimonen %!s(int64=2) %!d(string=hai) anos
pai
achega
dc5a4fcd19
Modificáronse 4 ficheiros con 143 adicións e 21 borrados
  1. 55 20
      src/ZuluSCSI_disk.cpp
  2. 1 1
      src/ZuluSCSI_disk.h
  3. 55 0
      src/ZuluSCSI_presets.cpp
  4. 32 0
      src/ZuluSCSI_presets.h

+ 55 - 20
src/ZuluSCSI_disk.cpp

@@ -29,6 +29,7 @@
 #include "ZuluSCSI_disk.h"
 #include "ZuluSCSI_log.h"
 #include "ZuluSCSI_config.h"
+#include "ZuluSCSI_presets.h"
 #include <minIni.h>
 #include <string.h>
 #include <strings.h>
@@ -864,13 +865,18 @@ static void checkDiskGeometryDivisible(image_config_t &img)
 // Set target configuration to default values
 static void scsiDiskConfigDefaults(int target_idx)
 {
+    // Get default values from system preset, if any
+    char presetName[32];
+    ini_gets("SCSI", "System", "", presetName, sizeof(presetName), CONFIGFILE);
+    preset_config_t defaults = getSystemPreset(presetName);
+
     image_config_t &img = g_DiskImages[target_idx];
     img.deviceType = S2S_CFG_FIXED;
-    img.deviceTypeModifier = 0;
-    img.sectorsPerTrack = 63;
-    img.headsPerCylinder = 255;
-    img.quirks = S2S_CFG_QUIRKS_NONE;
-    img.prefetchbytes = PREFETCH_BUFFER_SIZE;
+    img.deviceTypeModifier = defaults.deviceTypeModifier;
+    img.sectorsPerTrack = defaults.sectorsPerTrack;
+    img.headsPerCylinder = defaults.headsPerCylinder;
+    img.quirks = defaults.quirks;
+    img.prefetchbytes = defaults.prefetchBytes;
     memset(img.vendor, 0, sizeof(img.vendor));
     memset(img.prodId, 0, sizeof(img.prodId));
     memset(img.revision, 0, sizeof(img.revision));
@@ -978,56 +984,85 @@ void s2s_configInit(S2S_BoardCfg* config)
         logmsg("Config file " CONFIGFILE " not found, using defaults");
     }
 
-    logmsg("Active configuration:");
+    // Get default values from system preset, if any
+    char presetName[32];
+    ini_gets("SCSI", "System", "", presetName, sizeof(presetName), CONFIGFILE);
+    preset_config_t defaults = getSystemPreset(presetName);
+
+    if (defaults.presetName)
+    {
+        logmsg("Active configuration (using system preset \"", defaults.presetName, "\"):");
+    }
+    else
+    {
+        logmsg("Active configuration:");
+    }
+
     memset(config, 0, sizeof(S2S_BoardCfg));
     memcpy(config->magic, "BCFG", 4);
     config->flags = 0;
     config->startupDelay = 0;
-    config->selectionDelay = ini_getl("SCSI", "SelectionDelay", 255, CONFIGFILE);
+    config->selectionDelay = ini_getl("SCSI", "SelectionDelay", defaults.selectionDelay, CONFIGFILE);
     config->flags6 = 0;
     config->scsiSpeed = PLATFORM_MAX_SCSI_SPEED;
 
-    int maxSyncSpeed = ini_getl("SCSI", "MaxSyncSpeed", 10, CONFIGFILE);
+    int maxSyncSpeed = ini_getl("SCSI", "MaxSyncSpeed", defaults.maxSyncSpeed, CONFIGFILE);
     if (maxSyncSpeed < 5 && config->scsiSpeed > S2S_CFG_SPEED_ASYNC_50)
         config->scsiSpeed = S2S_CFG_SPEED_ASYNC_50;
     else if (maxSyncSpeed < 10 && config->scsiSpeed > S2S_CFG_SPEED_SYNC_5)
         config->scsiSpeed = S2S_CFG_SPEED_SYNC_5;
     
-    logmsg("-- SelectionDelay: ", (int)config->selectionDelay);
+    logmsg("-- SelectionDelay = ", (int)config->selectionDelay);
 
-    if (ini_getbool("SCSI", "EnableUnitAttention", false, CONFIGFILE))
+    if (ini_getbool("SCSI", "EnableUnitAttention", defaults.enableUnitAttention, CONFIGFILE))
     {
-        logmsg("-- EnableUnitAttention is on");
+        logmsg("-- EnableUnitAttention = Yes");
         config->flags |= S2S_CFG_ENABLE_UNIT_ATTENTION;
     }
+    else
+    {
+        logmsg("-- EnableUnitAttention = No");
+    }
 
-    if (ini_getbool("SCSI", "EnableSCSI2", true, CONFIGFILE))
+    if (ini_getbool("SCSI", "EnableSCSI2", defaults.enableSCSI2, CONFIGFILE))
     {
-        logmsg("-- EnableSCSI2 is on");
+        logmsg("-- EnableSCSI2 = Yes");
         config->flags |= S2S_CFG_ENABLE_SCSI2;
     }
+    else
+    {
+        logmsg("-- EnableSCSI2 = No");
+    }
 
-    if (ini_getbool("SCSI", "EnableSelLatch", false, CONFIGFILE))
+    if (ini_getbool("SCSI", "EnableSelLatch", defaults.enableSelLatch, CONFIGFILE))
     {
-        logmsg("-- EnableSelLatch is on");
+        logmsg("-- EnableSelLatch = Yes");
         config->flags |= S2S_CFG_ENABLE_SEL_LATCH;
     }
+    else
+    {
+        logmsg("-- EnableSelLatch = No");
+    }
 
-    if (ini_getbool("SCSI", "MapLunsToIDs", false, CONFIGFILE))
+    if (ini_getbool("SCSI", "MapLunsToIDs", defaults.mapLunsToIDs, CONFIGFILE))
     {
-        logmsg("-- MapLunsToIDs is on");
+        logmsg("-- MapLunsToIDs = Yes");
         config->flags |= S2S_CFG_MAP_LUNS_TO_IDS;
     }
+    else
+    {
+        logmsg("-- MapLunsToIDs = No");
+    }
 
 #ifdef PLATFORM_HAS_PARITY_CHECK
-    if (ini_getbool("SCSI", "EnableParity", true, CONFIGFILE))
+    if (ini_getbool("SCSI", "EnableParity", defaults.enableParity, CONFIGFILE))
     {
-        logmsg("-- EnableParity is on");
+        logmsg("-- EnableParity = Yes");
         config->flags |= S2S_CFG_ENABLE_PARITY;
     }
     else
     {
-        logmsg("-- EnableParity is off");
+        logmsg("-- EnableParity = No");
     }
 #endif
 }

+ 1 - 1
src/ZuluSCSI_disk.h

@@ -52,4 +52,4 @@ bool scsiDiskCheckRomDrive();
 bool scsiDiskActivateRomDrive();
 
 // Returns true if there is at least one image active
-bool scsiDiskCheckAnyImagesConfigured();
+bool scsiDiskCheckAnyImagesConfigured();

+ 55 - 0
src/ZuluSCSI_presets.cpp

@@ -0,0 +1,55 @@
+#include "ZuluSCSI_presets.h"
+#include "ZuluSCSI_disk.h"
+#include "ZuluSCSI_log.h"
+#include "ZuluSCSI_config.h"
+#include <strings.h>
+
+// Helper function for case-insensitive string compare
+static bool strequals(const char *a, const char *b)
+{
+    return strcasecmp(a, b) == 0;
+}
+
+preset_config_t getSystemPreset(const char *presetName)
+{
+    // Default configuration
+    preset_config_t cfg = {};
+    cfg.quirks = S2S_CFG_QUIRKS_NONE;
+    cfg.deviceTypeModifier = 0;
+    cfg.sectorsPerTrack = 63;
+    cfg.headsPerCylinder = 255;
+    cfg.prefetchBytes = PREFETCH_BUFFER_SIZE;
+
+    cfg.selectionDelay = 255;
+    cfg.maxSyncSpeed = 10;
+    cfg.enableUnitAttention = false;
+    cfg.enableSCSI2 = true;
+    cfg.enableSelLatch = false;
+    cfg.mapLunsToIDs = false;
+    cfg.enableParity = true;
+
+    // System-specific defaults
+    if (strequals(presetName, ""))
+    {
+        // Preset name is empty, use default configuration
+    }
+    else if (strequals(presetName, "Mac"))
+    {
+        cfg.presetName = "Mac";
+        cfg.quirks = S2S_CFG_QUIRKS_APPLE;
+    }
+    else if (strequals(presetName, "MacPlus"))
+    {
+        cfg.presetName = "MacPlus";
+        cfg.quirks = S2S_CFG_QUIRKS_APPLE;
+        cfg.enableSelLatch = true;
+        cfg.enableSCSI2 = false;
+        cfg.selectionDelay = 0;
+    }
+    else
+    {
+        logmsg("Unknown preset name ", presetName, ", using default settings");
+    }
+
+    return cfg;
+}

+ 32 - 0
src/ZuluSCSI_presets.h

@@ -0,0 +1,32 @@
+// Preset configurations for various system types.
+// Set by "System" config option in config ini.
+
+#pragma once
+
+// The settings set here will be used as defaults but
+// can be overridden by the ini file settings.
+struct preset_config_t {
+    // Informative name of the preset configuration, or NULL for defaults
+    const char *presetName;
+
+    // Default settings that apply per SCSI ID
+    int quirks;
+    int deviceTypeModifier;
+    int sectorsPerTrack;
+    int headsPerCylinder;
+    int prefetchBytes;
+    bool rightAlignStrings;
+    bool reinsertOnInquiry;
+
+    // Default settings that apply to all SCSI IDs
+    int selectionDelay;
+    int maxSyncSpeed;
+    bool enableUnitAttention;
+    bool enableSCSI2;
+    bool enableSelLatch;
+    bool mapLunsToIDs;
+    bool enableParity;
+};
+
+// Fetch a preset configuration, or return the default config if unknown system type.
+preset_config_t getSystemPreset(const char *presetName);