libsidplayfp 2.15.0
romCheck.h
1/*
2 * This file is part of libsidplayfp, a SID player engine.
3 *
4 * Copyright 2012-2013 Leandro Nini <drfiemost@users.sourceforge.net>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 */
20
21#ifndef ROMCHECK_H
22#define ROMCHECK_H
23
24#include <stdint.h>
25#include <map>
26#include <string>
27#include <utility>
28
29#include "sidmd5.h"
30
31namespace libsidplayfp
32{
33
38{
39private:
40 using md5map = std::map<std::string, const char*>;
41
42private:
47 md5map m_checksums;
48
52 const uint8_t* m_rom;
53
57 unsigned int m_size;
58
59private:
60 romCheck() = delete;
61
65 std::string checksum() const
66 {
67 try
68 {
69 sidmd5 md5;
70 md5.append(m_rom, m_size);
71 md5.finish();
72
73 return md5.getDigest();
74 }
75 catch (md5Error const &)
76 {
77 return std::string();
78 }
79 }
80
81protected:
88 romCheck(const uint8_t* rom, int size) :
89 m_rom(rom),
90 m_size(size) {}
91
92 void add(const char* md5, const char* desc)
93 {
94 m_checksums.insert(std::make_pair(md5, desc));
95 }
96
97public:
103 const char* info() const
104 {
105 md5map::const_iterator res = m_checksums.find(checksum());
106 return (res != m_checksums.end()) ? res->second : "Unknown Rom";
107 }
108};
109
113class kernalCheck : public romCheck
114{
115public:
116 kernalCheck(const uint8_t* kernal) :
117 romCheck(kernal, 0x2000)
118 {
119 add("1ae0ea224f2b291dafa2c20b990bb7d4", "C64 KERNAL first revision");
120 add("7360b296d64e18b88f6cf52289fd99a1", "C64 KERNAL second revision");
121 add("479553fd53346ec84054f0b1c6237397", "C64 KERNAL second revision (Japanese)");
122 add("39065497630802346bce17963f13c092", "C64 KERNAL third revision");
123 add("27e26dbb267c8ebf1cd47105a6ca71e7", "C64 KERNAL third revision (Swedish)");
124 add("27e26dbb267c8ebf1cd47105a6ca71e7", "C64 KERNAL third revision (Swedish C2G007)");
125 add("e4aa56240fe13d8ad8d7d1dc8fec2395", "C64 KERNAL third revision (Danish)");
126 add("174546cf655e874546af4eac5f5bf61b", "C64 KERNAL third revision (Turkish)");
127 add("187b8c713b51931e070872bd390b472a", "Commodore SX-64 KERNAL");
128 add("b7b1a42e11ff8efab4e49afc4faedeee", "Commodore SX-64 KERNAL (Swedish)");
129 add("3abc938cac3d622e1a7041c15b928707", "Cockroach Turbo-ROM");
130 add("631ea2ca0dcda414a90aeefeaf77fe45", "Cockroach Turbo-ROM (SX-64)");
131 add("a9de1832e9be1a8c60f4f979df585681", "Datel DOS-ROM 1.2");
132 add("da43563f218b46ece925f221ef1f4bc2", "Datel Mercury 3 (NTSC)");
133 add("b7dc8ed82170c81773d4f5dc8069a000", "Datel Turbo ROM II (PAL)");
134 add("6b309c76473dcf555c52c598c6a51011", "Dolphin DOS v1.0");
135 add("c3c93b9a46f116acbfe7ee147c338c60", "Dolphin DOS v2.0-1 AU");
136 add("2a441f4abd272d50f94b43c7ff3cc629", "Dolphin DOS v2.0-1");
137 add("c7a175217e67dcb425feca5fcf2a01cc", "Dolphin DOS v2.0-2");
138 add("7a9b1040cfbe769525bb9cdc28427be6", "Dolphin DOS v2.0-3");
139 add("fc8fb5ec89b34ae41c8dc20907447e06", "Dolphin DOS v3.0");
140 add("9a6e1c4b99c6f65323aa96940c7eb7f7", "ExOS v3 fertig");
141 add("3241a4fcf2ba28ba3fc79826bc023814", "ExOS v3");
142 add("cffd2616312801da56bcc6728f0e39ca", "ExOS v4");
143 add("e6e2bb24a0fa414182b0fd149bde689d", "TurboAccess");
144 add("c5c5990f0826fcbd372901e761fab1b7", "TurboTrans v3.0-1");
145 add("042ffc11383849bdf0e600474cefaaaf", "TurboTrans v3.0-2");
146 add("9d62852013fc2c29c3111c765698664b", "Turbo-Process US");
147 add("f9c9838e8d6752dc6066a8c9e6c2e880", "Turbo-Process");
148 }
149};
150
154class basicCheck : public romCheck
155{
156public:
157 basicCheck(const uint8_t* basic) :
158 romCheck(basic, 0x2000)
159 {
160 add("57af4ae21d4b705c2991d98ed5c1f7b8", "C64 BASIC V2");
161 }
162};
163
167class chargenCheck : public romCheck
168{
169public:
170 chargenCheck(const uint8_t* chargen) :
171 romCheck(chargen, 0x1000)
172 {
173 add("12a4202f5331d45af846af6c58fba946", "C64 character generator");
174 add("cf32a93c0a693ed359a4f483ef6db53d", "C64 character generator (Japanese)");
175 add("7a1906cd3993ad17a0a0b2b68da9c114", "C64 character generator (Swedish)");
176 add("5973267e85b7b2b574e780874843180b", "C64 character generator (Swedish C2G007)");
177 add("81a1a8e6e334caeadd1b8468bb7728d3", "C64 character generator (Spanish)");
178 add("b3ad62b41b5f919fc56c3a40e636ec29", "C64 character generator (Danish)");
179 add("7d82b1f8f750665b5879c16b03c617d9", "C64 character generator (Turkish)");
180 }
181};
182
183}
184
185#endif // ROMCHECK_H
Definition romCheck.h:155
Definition romCheck.h:168
Definition romCheck.h:114
Definition iMd5.h:37
Definition romCheck.h:38
romCheck(const uint8_t *rom, int size)
Definition romCheck.h:88
const char * info() const
Definition romCheck.h:103
Definition sidmd5.h:42
void append(const void *data, int nbytes)
Definition sidmd5.h:57
std::string getDigest()
Definition sidmd5.h:72
void finish()
Definition sidmd5.h:62