]> git.sesse.net Git - pistorm/blob - config_file/rominfo.c
Merge remote-tracking branch 'niklasekstrom/autoconfig_a314' into wip-crap
[pistorm] / config_file / rominfo.c
1 // SPDX-License-Identifier: MIT
2
3 #include <string.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdbool.h>
7 #include <inttypes.h>
8
9 #include "rominfo.h"
10
11 static void getDiagRom(uint8_t *address, struct romInfo *info)
12 {
13     uint8_t *ptr = address + 0xC8;
14     uint8_t data = *ptr;
15     char *endptr = NULL;
16     if (data != 0x56) // V
17     {
18         return;
19     }
20     ptr++;
21     info->major = strtoul((const char*)ptr, &endptr, 10);
22     if (!endptr)
23     {
24         return;
25     }
26     data = *endptr;
27     if (data != '.')
28     {
29         info->minor = 0;
30         return;
31     }
32     endptr++;
33     info->minor = strtoul(endptr, &endptr, 10);
34     if (!endptr)
35     {
36         return;
37     }
38     info->isDiagRom = true;
39     data = *endptr;
40     if (data != '.')
41     {
42         info->extra = 0;
43         return;
44     }
45     endptr++;
46     info->extra = strtoul(endptr, NULL, 10);
47 }
48
49 static void getRomInfo(uint8_t *address, struct romInfo *info)
50 {
51     uint8_t *ptr = address;
52     uint8_t data = *ptr;
53     info->isDiagRom = false;
54
55     if (data != 0x11)
56     {
57         info->id = ROM_TYPE_UNKNOWN;
58
59         return;
60     }
61     ptr++;
62     data = *ptr;
63     switch (data)
64     {
65         case 0x11:
66             info->id = ROM_TYPE_256;
67             break;
68         case 0x14:
69         case 0x16: // kick40063.A600
70             info->id = ROM_TYPE_512;
71             break;
72         default:
73             info->id = ROM_TYPE_UNKNOWN;
74             return;
75             break;
76     }
77     ptr++;
78     data = *ptr;
79     if (data != 0x4E) // 256K byte swapped
80     {
81         return;
82     }
83     // This is wrong endian for us
84     uint16_t ver_read;
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)
91     {
92         getDiagRom(address, info);
93     }
94     return;
95 }
96
97 void displayRomInfo(uint8_t *address)
98 {
99     struct romInfo info = {0};
100     const char *kversion;
101     const char *size;
102
103     getRomInfo(address, &info);
104
105     if ((!info.isDiagRom) && (info.id != ROM_TYPE_UNKNOWN))
106     {
107         switch(info.major)
108         {
109             case 27:
110                 kversion = "Kickstart 0.7";
111                 break;
112             case 30:
113                 kversion = "Kickstart 1.0";
114                 break;
115             case 31:
116                 kversion = "Kickstart 1.1";
117                 break;
118             case 33:
119                 kversion = "Kickstart 1.2";
120                 break;
121             case 34:
122                 kversion = "Kickstart 1.3";
123                 break;
124             case 36:
125                 {
126                     // 36.002 and 36.015 were 1.4
127                     // 36.028, 36.067, 36.141 and 36.143 were 2.0
128                     // 36.207 was 2.02
129                     if (info.minor < 20)
130                     {
131                         kversion = "Kickstart 1.4";
132                     }
133                     else if (info.minor < 200)
134                     {
135                         kversion = "Kickstart 2.0";
136                     }
137                     else
138                     {
139                         kversion = "Kickstart 2.02";
140                     }
141                     break;
142                 }
143             case 37:
144                 {
145                     // 37.074 and 37.092 were 2.03
146                     // 37.175 was 2.04
147                     // 37.210, 37.299, 37.300 and 37.350 were 2.05
148                     if (info.minor < 100)
149                     {
150                         kversion = "Kickstart 2.03";
151                     }
152                     else if (info.minor < 200)
153                     {
154                         kversion = "Kickstart 2.04";
155                     }
156                     else
157                     {
158                         kversion = "Kickstart 2.05";
159                     }
160                     break;
161                 }
162                 break;
163             case 39:
164                 kversion = "Kickstart 3.0";
165                 break;
166             case 40:
167                 kversion = "Kickstart 3.1";
168                 break;
169             case 45:
170                 kversion = "Kickstart 3.x";
171                 break;
172             case 46:
173                 kversion = "Kickstart 3.1.4";
174                 break;
175             case 47:
176                 kversion = "Kickstart 3.2";
177                 break;
178             default:
179                 kversion = "Unknown";
180                 break;
181         }
182     }
183     switch (info.id)
184     {
185         case ROM_TYPE_256:
186             size = "256KB";
187             break;
188         case ROM_TYPE_512:
189             size = "512KB";
190             break;
191         default:
192             size = "";
193             break;
194     }
195
196     if (info.isDiagRom)
197     {
198         printf("[CFG] ROM identified: DiagRom V%hu.%hu.%hu %s\n", info.major, info.minor, info.extra, size);
199     }
200     else if (info.id == ROM_TYPE_UNKNOWN)
201     {
202         printf("[CFG] ROM cannot be identified, if it is a byte swapped Kickstart this will fail\n");
203     }
204     else
205     {
206         printf("[CFG] ROM identified: %s (%hu.%hu) %s\n", kversion, info.major, info.minor, size);
207     }
208 }