libsidplayfp  2.0.2
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 
31 namespace libsidplayfp
32 {
33 
37 class romCheck
38 {
39 private:
40  typedef std::map<std::string, const char*> md5map;
41 
42 private:
47  md5map m_checksums;
48 
52  const uint8_t* m_rom;
53 
57  unsigned int m_size;
58 
59 private:
60  romCheck();
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 
81 protected:
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 
97 public:
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 
113 class kernalCheck : public romCheck
114 {
115 public:
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("187b8c713b51931e070872bd390b472a", "Commodore SX-64 KERNAL");
125  add("b7b1a42e11ff8efab4e49afc4faedeee", "Commodore SX-64 KERNAL (Swedish)");
126  add("3abc938cac3d622e1a7041c15b928707", "Cockroach Turbo-ROM");
127  add("631ea2ca0dcda414a90aeefeaf77fe45", "Cockroach Turbo-ROM (SX-64)");
128  add("a9de1832e9be1a8c60f4f979df585681", "Datel DOS-ROM 1.2");
129  add("da43563f218b46ece925f221ef1f4bc2", "Datel Mercury 3 (NTSC)");
130  add("b7dc8ed82170c81773d4f5dc8069a000", "Datel Turbo ROM II (PAL)");
131  add("6b309c76473dcf555c52c598c6a51011", "Dolphin DOS v1.0");
132  add("c3c93b9a46f116acbfe7ee147c338c60", "Dolphin DOS v2.0-1 AU");
133  add("2a441f4abd272d50f94b43c7ff3cc629", "Dolphin DOS v2.0-1");
134  add("c7a175217e67dcb425feca5fcf2a01cc", "Dolphin DOS v2.0-2");
135  add("7a9b1040cfbe769525bb9cdc28427be6", "Dolphin DOS v2.0-3");
136  add("fc8fb5ec89b34ae41c8dc20907447e06", "Dolphin DOS v3.0");
137  add("9a6e1c4b99c6f65323aa96940c7eb7f7", "ExOS v3 fertig");
138  add("3241a4fcf2ba28ba3fc79826bc023814", "ExOS v3");
139  add("cffd2616312801da56bcc6728f0e39ca", "ExOS v4");
140  add("e6e2bb24a0fa414182b0fd149bde689d", "TurboAccess");
141  add("c5c5990f0826fcbd372901e761fab1b7", "TurboTrans v3.0-1");
142  add("042ffc11383849bdf0e600474cefaaaf", "TurboTrans v3.0-2");
143  add("9d62852013fc2c29c3111c765698664b", "Turbo-Process US");
144  add("f9c9838e8d6752dc6066a8c9e6c2e880", "Turbo-Process");
145  }
146 };
147 
151 class basicCheck : public romCheck
152 {
153 public:
154  basicCheck(const uint8_t* basic) :
155  romCheck(basic, 0x2000)
156  {
157  add("57af4ae21d4b705c2991d98ed5c1f7b8", "C64 BASIC V2");
158  }
159 };
160 
164 class chargenCheck : public romCheck
165 {
166 public:
167  chargenCheck(const uint8_t* chargen) :
168  romCheck(chargen, 0x1000)
169  {
170  add("12a4202f5331d45af846af6c58fba946", "C64 character generator");
171  add("cf32a93c0a693ed359a4f483ef6db53d", "C64 character generator (Japanese)");
172  }
173 };
174 
175 }
176 
177 #endif // ROMCHECK_H
libsidplayfp::romCheck::romCheck
romCheck(const uint8_t *rom, int size)
Definition: romCheck.h:88
libsidplayfp::md5Error
Definition: iMd5.h:37
libsidplayfp::sidmd5::finish
void finish()
Definition: sidmd5.h:62
libsidplayfp::chargenCheck
Definition: romCheck.h:165
libsidplayfp::kernalCheck
Definition: romCheck.h:114
libsidplayfp::romCheck::info
const char * info() const
Definition: romCheck.h:103
libsidplayfp::sidmd5
Definition: sidmd5.h:42
libsidplayfp::sidmd5::getDigest
std::string getDigest()
Definition: sidmd5.h:72
libsidplayfp::basicCheck
Definition: romCheck.h:152
libsidplayfp::sidmd5::append
void append(const void *data, int nbytes)
Definition: sidmd5.h:57
libsidplayfp::romCheck
Definition: romCheck.h:38