1 // SPDX-License-Identifier: MIT
11 static void getDiagRom(uint8_t *address, struct romInfo *info)
13 uint8_t *ptr = address + 0xC8;
16 if (data != 0x56) // V
21 info->major = strtoul((const char*)ptr, &endptr, 10);
33 info->minor = strtoul(endptr, &endptr, 10);
38 info->isDiagRom = true;
46 info->extra = strtoul(endptr, NULL, 10);
49 static void swapRom(uint8_t *address, size_t length)
51 uint8_t *ptr = address;
52 for (size_t pos = 0; pos < length; pos = pos + 2)
54 uint8_t low = ptr[pos];
55 uint8_t high = ptr[pos+1];
61 static void getRomInfo(uint8_t *address, size_t length, struct romInfo *info)
63 uint8_t *ptr = address;
65 info->isDiagRom = false;
67 if ((ptr[2] == 0xF9) && (ptr[3] == 0x4E))
70 printf("[CFG] Byte swapped ROM found, swapping back\n");
71 swapRom(address, length);
77 info->id = ROM_TYPE_UNKNOWN;
86 info->id = ROM_TYPE_256;
89 case 0x16: // kick40063.A600
90 info->id = ROM_TYPE_512;
93 info->id = ROM_TYPE_UNKNOWN;
99 if (data != 0x4E) // 256K byte swapped
103 // This is wrong endian for us
105 memcpy(&ver_read, address+12, 2);
106 info->major = (ver_read >> 8) | (ver_read << 8);
107 memcpy(&ver_read, address+14, 2);
108 info->minor = (ver_read >> 8) | (ver_read << 8);
109 // We hit part of a memory ptr for DiagROM, it will be > 200
110 if (info->major > 100)
112 getDiagRom(address, info);
117 void displayRomInfo(uint8_t *address, size_t length)
119 struct romInfo info = {0};
120 const char *kversion;
123 getRomInfo(address, length, &info);
125 if ((!info.isDiagRom) && (info.id != ROM_TYPE_UNKNOWN))
130 kversion = "Kickstart 0.7";
133 kversion = "Kickstart 1.0";
136 kversion = "Kickstart 1.1";
139 kversion = "Kickstart 1.2";
142 kversion = "Kickstart 1.3";
146 // 36.002 and 36.015 were 1.4
147 // 36.028, 36.067, 36.141 and 36.143 were 2.0
151 kversion = "Kickstart 1.4";
153 else if (info.minor < 200)
155 kversion = "Kickstart 2.0";
159 kversion = "Kickstart 2.02";
165 // 37.074 and 37.092 were 2.03
167 // 37.210, 37.299, 37.300 and 37.350 were 2.05
168 if (info.minor < 100)
170 kversion = "Kickstart 2.03";
172 else if (info.minor < 200)
174 kversion = "Kickstart 2.04";
178 kversion = "Kickstart 2.05";
184 kversion = "Kickstart 3.0";
187 kversion = "Kickstart 3.1";
190 kversion = "Kickstart 3.x";
193 kversion = "Kickstart 3.1.4";
196 kversion = "Kickstart 3.2";
199 kversion = "Unknown";
218 printf("[CFG] ROM identified: DiagRom V%hu.%hu.%hu %s\n", info.major, info.minor, info.extra, size);
220 else if (info.id == ROM_TYPE_UNKNOWN)
222 printf("[CFG] ROM cannot be identified\n");
226 printf("[CFG] ROM identified: %s (%hu.%hu) %s\n", kversion, info.major, info.minor, size);