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 getRomInfo(uint8_t *address, struct romInfo *info)
51 uint8_t *ptr = address;
53 info->isDiagRom = false;
57 info->id = ROM_TYPE_UNKNOWN;
66 info->id = ROM_TYPE_256;
69 case 0x16: // kick40063.A600
70 info->id = ROM_TYPE_512;
73 info->id = ROM_TYPE_UNKNOWN;
79 if (data != 0x4E) // 256K byte swapped
83 // This is wrong endian for us
85 memcpy(&ver_read, address+12, 2);
86 info->major = (ver_read >> 8) | (ver_read << 8);
87 memcpy(&ver_read, address+14, 2);
88 info->minor = (ver_read >> 8) | (ver_read << 8);
89 // We hit part of a memory ptr for DiagROM, it will be > 200
90 if (info->major > 100)
92 getDiagRom(address, info);
97 void displayRomInfo(uint8_t *address)
99 struct romInfo info = {0};
100 const char *kversion;
103 getRomInfo(address, &info);
105 if ((!info.isDiagRom) && (info.id != ROM_TYPE_UNKNOWN))
110 kversion = "Kickstart 0.7";
113 kversion = "Kickstart 1.0";
116 kversion = "Kickstart 1.1";
119 kversion = "Kickstart 1.2";
122 kversion = "Kickstart 1.3";
126 // 36.002 and 36.015 were 1.4
127 // 36.028, 36.067, 36.141 and 36.143 were 2.0
131 kversion = "Kickstart 1.4";
133 else if (info.minor < 200)
135 kversion = "Kickstart 2.0";
139 kversion = "Kickstart 2.02";
145 // 37.074 and 37.092 were 2.03
147 // 37.210, 37.299, 37.300 and 37.350 were 2.05
148 if (info.minor < 100)
150 kversion = "Kickstart 2.03";
152 else if (info.minor < 200)
154 kversion = "Kickstart 2.04";
158 kversion = "Kickstart 2.05";
164 kversion = "Kickstart 3.0";
167 kversion = "Kickstart 3.1";
170 kversion = "Kickstart 3.x";
173 kversion = "Kickstart 3.1.4";
176 kversion = "Unknown";
195 printf("[CFG] ROM identified: DiagRom V%hu.%hu.%hu %s\n", info.major, info.minor, info.extra, size);
197 else if (info.id == ROM_TYPE_UNKNOWN)
199 printf("[CFG] ROM cannot be identified, if it is a byte swapped Kickstart this will fail\n");
203 printf("[CFG] ROM identified: %s (%hu.%hu) %s\n", kversion, info.major, info.minor, size);