1//============================================================================
2//
3// SSSS tt lll lll
4// SS SS tt ll ll
5// SS tttttt eeee ll ll aaaa
6// SSSS tt ee ee ll ll aa
7// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
8// SS SS tt ee ll ll aa aa
9// SSSS ttt eeeee llll llll aaaaa
10//
11// Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony
12// and the Stella Team
13//
14// See the file "License.txt" for information on usage and redistribution of
15// this file, and for a DISCLAIMER OF ALL WARRANTIES.
16//============================================================================
17
18#ifndef CARTRIDGE_DETECTOR_HXX
19#define CARTRIDGE_DETECTOR_HXX
20
21class Cartridge;
22class Properties;
23
24#include "Bankswitch.hxx"
25#include "bspf.hxx"
26#include "Settings.hxx"
27
28/**
29 Auto-detect cart type based on various attributes (file size, signatures,
30 filenames, etc)
31
32 @author Stephen Anthony
33*/
34class CartDetector
35{
36 public:
37 /**
38 Create a new cartridge object allocated on the heap. The
39 type of cartridge created depends on the properties object.
40
41 @param image A pointer to the ROM image
42 @param size The size of the ROM image
43 @param md5 The md5sum for the given ROM image (can be updated)
44 @param dtype The detected bankswitch type of the ROM image
45 @param settings The settings container
46 @return Pointer to the new cartridge object allocated on the heap
47 */
48 static unique_ptr<Cartridge> create(const FilesystemNode& file,
49 const ByteBuffer& image, size_t size, string& md5,
50 const string& dtype, Settings& settings);
51
52 /**
53 Try to auto-detect the bankswitching type of the cartridge
54
55 @param image A pointer to the ROM image
56 @param size The size of the ROM image
57
58 @return The "best guess" for the cartridge type
59 */
60 static Bankswitch::Type autodetectType(const ByteBuffer& image, size_t size);
61
62 private:
63 /**
64 Create a cartridge from a multi-cart image pointer; internally this
65 takes a slice of the ROM image ues that for the cartridge.
66
67 @param image A pointer to the complete ROM image
68 @param size The size of the ROM image slice
69 @param numroms The number of ROMs in the multicart
70 @param md5 The md5sum for the slice of the ROM image
71 @param type The detected type of the slice of the ROM image
72 @param id The ID for the slice of the ROM image
73 @param settings The settings container
74
75 @return Pointer to the new cartridge object allocated on the heap
76 */
77 static unique_ptr<Cartridge>
78 createFromMultiCart(const ByteBuffer& image, size_t& size,
79 uInt32 numroms, string& md5, Bankswitch::Type type, string& id,
80 Settings& settings);
81
82 /**
83 Create a cartridge from the entire image pointer.
84
85 @param image A pointer to the complete ROM image
86 @param size The size of the ROM image
87 @param type The bankswitch type of the ROM image
88 @param md5 The md5sum for the ROM image
89 @param settings The settings container
90
91 @return Pointer to the new cartridge object allocated on the heap
92 */
93 static unique_ptr<Cartridge>
94 createFromImage(const ByteBuffer& image, size_t size, Bankswitch::Type type,
95 const string& md5, Settings& settings);
96
97 /**
98 Search the image for the specified byte signature
99
100 @param image A pointer to the ROM image
101 @param imagesize The size of the ROM image
102 @param signature The byte sequence to search for
103 @param sigsize The number of bytes in the signature
104 @param minhits The minimum number of times a signature is to be found
105
106 @return True if the signature was found at least 'minhits' time, else false
107 */
108 static bool searchForBytes(const uInt8* image, size_t imagesize,
109 const uInt8* signature, uInt32 sigsize,
110 uInt32 minhits);
111
112 /**
113 Returns true if the image is probably a SuperChip (128 bytes RAM)
114 Note: should be called only on ROMs with size multiple of 4K
115 */
116 static bool isProbablySC(const ByteBuffer& image, size_t size);
117
118 /**
119 Returns true if the image probably contains ARM code in the first 1K
120 */
121 static bool isProbablyARM(const ByteBuffer& image, size_t size);
122
123 /**
124 Returns true if the image is probably a 0840 bankswitching cartridge
125 */
126 static bool isProbably0840(const ByteBuffer& image, size_t size);
127
128 /**
129 Returns true if the image is probably a 3E bankswitching cartridge
130 */
131 static bool isProbably3E(const ByteBuffer& image, size_t size);
132
133 /**
134 Returns true if the image is probably a 3E+ bankswitching cartridge
135 */
136 static bool isProbably3EPlus(const ByteBuffer& image, size_t size);
137
138 /**
139 Returns true if the image is probably a 3F bankswitching cartridge
140 */
141 static bool isProbably3F(const ByteBuffer& image, size_t size);
142
143 /**
144 Returns true if the image is probably a 4A50 bankswitching cartridge
145 */
146 static bool isProbably4A50(const ByteBuffer& image, size_t size);
147
148 /**
149 Returns true if the image is probably a 4K SuperChip (128 bytes RAM)
150 */
151 static bool isProbably4KSC(const ByteBuffer& image, size_t size);
152
153 /**
154 Returns true if the image is probably a BF/BFSC bankswitching cartridge
155 */
156 static bool isProbablyBF(const ByteBuffer& image, size_t size, Bankswitch::Type& type);
157
158 /**
159 Returns true if the image is probably a BUS bankswitching cartridge
160 */
161 static bool isProbablyBUS(const ByteBuffer& image, size_t size);
162
163 /**
164 Returns true if the image is probably a CDF bankswitching cartridge
165 */
166 static bool isProbablyCDF(const ByteBuffer& image, size_t size);
167
168 /**
169 Returns true if the image is probably a CTY bankswitching cartridge
170 */
171 static bool isProbablyCTY(const ByteBuffer& image, size_t size);
172
173 /**
174 Returns true if the image is probably a CV bankswitching cartridge
175 */
176 static bool isProbablyCV(const ByteBuffer& image, size_t size);
177
178 /**
179 Returns true if the image is probably a CV+ bankswitching cartridge
180 */
181 static bool isProbablyCVPlus(const ByteBuffer& image, size_t size);
182
183 /**
184 Returns true if the image is probably a DASH bankswitching cartridge
185 */
186 static bool isProbablyDASH(const ByteBuffer& image, size_t size);
187
188 /**
189 Returns true if the image is probably a DF/DFSC bankswitching cartridge
190 */
191 static bool isProbablyDF(const ByteBuffer& image, size_t size, Bankswitch::Type& type);
192
193 /**
194 Returns true if the image is probably a DPC+ bankswitching cartridge
195 */
196 static bool isProbablyDPCplus(const ByteBuffer& image, size_t size);
197
198 /**
199 Returns true if the image is probably a E0 bankswitching cartridge
200 */
201 static bool isProbablyE0(const ByteBuffer& image, size_t size);
202
203 /**
204 Returns true if the image is probably a E7 bankswitching cartridge
205 */
206 static bool isProbablyE7(const ByteBuffer& image, size_t size);
207
208 /**
209 Returns true if the image is probably a E78K bankswitching cartridge
210 */
211 static bool isProbablyE78K(const ByteBuffer& image, size_t size);
212
213 /**
214 Returns true if the image is probably an EF/EFSC bankswitching cartridge
215 */
216 static bool isProbablyEF(const ByteBuffer& image, size_t size, Bankswitch::Type& type);
217
218 /**
219 Returns true if the image is probably an F6 bankswitching cartridge
220 */
221 //static bool isProbablyF6(const ByteBuffer& image, size_t size);
222
223 /**
224 Returns true if the image is probably an FA2 bankswitching cartridge
225 */
226 static bool isProbablyFA2(const ByteBuffer& image, size_t size);
227
228 /**
229 Returns true if the image is probably an FC bankswitching cartridge
230 */
231 static bool isProbablyFC(const ByteBuffer& image, size_t size);
232
233 /**
234 Returns true if the image is probably an FE bankswitching cartridge
235 */
236 static bool isProbablyFE(const ByteBuffer& image, size_t size);
237
238 /**
239 Returns true if the image is probably a MDM bankswitching cartridge
240 */
241 static bool isProbablyMDM(const ByteBuffer& image, size_t size);
242
243 /**
244 Returns true if the image is probably a SB bankswitching cartridge
245 */
246 static bool isProbablySB(const ByteBuffer& image, size_t size);
247
248 /**
249 Returns true if the image is probably a UA bankswitching cartridge
250 */
251 static bool isProbablyUA(const ByteBuffer& image, size_t size);
252
253 /**
254 Returns true if the image is probably a Wickstead Design bankswitching cartridge
255 */
256 static bool isProbablyWD(const ByteBuffer& image, size_t size);
257
258 /**
259 Returns true if the image is probably an X07 bankswitching cartridge
260 */
261 static bool isProbablyX07(const ByteBuffer& image, size_t size);
262
263
264 private:
265 // Following constructors and assignment operators not supported
266 CartDetector() = delete;
267 CartDetector(const CartDetector&) = delete;
268 CartDetector(CartDetector&&) = delete;
269 CartDetector& operator=(const CartDetector&) = delete;
270 CartDetector& operator=(CartDetector&&) = delete;
271};
272
273#endif
274