]> git.sesse.net Git - pistorm/commitdiff
Identify and fix byte-swapped ROMs
authorAndrew Hutchings <andrew@linuxjedi.co.uk>
Fri, 21 May 2021 07:15:02 +0000 (08:15 +0100)
committerAndrew Hutchings <andrew@linuxjedi.co.uk>
Fri, 21 May 2021 07:15:02 +0000 (08:15 +0100)
Logs and byte swaps ROMs back if byte swapped versions are found.

config_file/config_file.c
config_file/rominfo.c
config_file/rominfo.h

index 0d736c546a0b0acc95c603c16dac38bbef217176..0b5d86a215eed8ddc536d08f49109c559f35cb37 100644 (file)
@@ -251,7 +251,7 @@ void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int ad
       memset(cfg->map_data[index], 0x00, cfg->map_size[index]);
       fread(cfg->map_data[index], cfg->rom_size[index], 1, in);
       fclose(in);
-      displayRomInfo(cfg->map_data[index]);
+      displayRomInfo(cfg->map_data[index], cfg->rom_size[index]);
       if (cfg->map_size[index] == cfg->rom_size[index])
         m68k_add_rom_range(cfg->map_offset[index], cfg->map_high[index], cfg->map_data[index]);
       break;
index 46cc8a8bd0b189de59691e2ab07dbcd230eb7195..75b4c6c5e30c8921f0baa955c5321adba2d81c37 100644 (file)
@@ -46,12 +46,32 @@ static void getDiagRom(uint8_t *address, struct romInfo *info)
     info->extra = strtoul(endptr, NULL, 10);
 }
 
-static void getRomInfo(uint8_t *address, struct romInfo *info)
+static void swapRom(uint8_t *address, size_t length)
+{
+    uint8_t *ptr = address;
+    for (size_t pos = 0; pos < length; pos = pos + 2)
+    {
+        uint8_t low = ptr[pos];
+        uint8_t high = ptr[pos+1];
+        ptr[pos] = high;
+        ptr[pos+1] = low;
+    }
+}
+
+static void getRomInfo(uint8_t *address, size_t length, struct romInfo *info)
 {
     uint8_t *ptr = address;
     uint8_t data = *ptr;
     info->isDiagRom = false;
 
+    if ((ptr[2] == 0xF9) && (ptr[3] == 0x4E))
+    {
+        // ROM byte swapped!
+        printf("[CFG] Byte swapped ROM found, swapping back\n");
+        swapRom(address, length);
+        data = *ptr;
+    }
+
     if (data != 0x11)
     {
         info->id = ROM_TYPE_UNKNOWN;
@@ -94,13 +114,13 @@ static void getRomInfo(uint8_t *address, struct romInfo *info)
     return;
 }
 
-void displayRomInfo(uint8_t *address)
+void displayRomInfo(uint8_t *address, size_t length)
 {
     struct romInfo info = {0};
     const char *kversion;
     const char *size;
 
-    getRomInfo(address, &info);
+    getRomInfo(address, length, &info);
 
     if ((!info.isDiagRom) && (info.id != ROM_TYPE_UNKNOWN))
     {
@@ -199,7 +219,7 @@ void displayRomInfo(uint8_t *address)
     }
     else if (info.id == ROM_TYPE_UNKNOWN)
     {
-        printf("[CFG] ROM cannot be identified, if it is a byte swapped Kickstart this will fail\n");
+        printf("[CFG] ROM cannot be identified\n");
     }
     else
     {
index 0c43f2f5d57648ca79857b6ed7411b3651efa600..e7b304c15d97350f36a7efed45683a5e4a4a598a 100644 (file)
@@ -26,5 +26,5 @@ enum romErrCode {
     ERR_ROM_UNKNOWN
 };
 
-void displayRomInfo(uint8_t *address);
+void displayRomInfo(uint8_t *address, size_t length);
 #endif /* __ROMINFO */