#include
#include
using namespace std;
int main (int argc, char * const argv[]) {
if (argc != 2) {
cout << "\nUsage: MacROMVerify [path to ROM file]\n";
return(0);
}
ifstream inFile;
inFile.open(argv[1]);
unsigned int sum = 0;
long int length = -1; // -1 is used so that the EOF character is not counted.
while (!inFile.eof()) {
inFile.get();
length++;
}
cout << "\nROM Length: " << length/1024.0 << " kiB\n";
if (length % 65536 != 0) cout << "The ROM appears to be the wrong length.\n"; // Checks if the file size is divisible by 64kiB
inFile.close();
inFile.open(argv[1]);
unsigned int recorded = inFile.get()*16777216+inFile.get()*65536+inFile.get()*256+inFile.get();
//cout << hex << "\nRecorded Checksum: 0x" << recorded;
for (int i=4; i sum += inFile.get() * 256;
sum += inFile.get();
}
//cout << hex << "\nComputed Checksum: 0x" << sum << endl;
if (recorded == sum) cout << "\nROM Checksum PASSED.\n";
else cout << "\nROM Checksum FAILED.\n";
cout << "\nThis is a";
switch (recorded) {
case 0x28BA61CE: cout << " Macintosh 128k or 512k"; break;
case 0x28BA4E50: cout << " Macintosh 128k or 512k"; break;
case 0x4D1EEEE1: cout << " Macintosh 512ke or Plus"; break;
case 0x4D1EEAE1: cout << " Macintosh 512ke or Plus"; break;
case 0x4D1F8172: cout << " Macintosh 512ke or Plus"; break;
case 0xB2E362A8: cout << " Macintosh SE"; break;
case 0x9779D2C4: cout << " Macintosh II"; break;
case 0x97851DB6: cout << " Macintosh II"; break;
case 0x97221136: cout << " Macintosh II FDHD, IIx, IIcx, or SE/30"; break;
case 0xB306E171: cout << " Macintosh SE FDHD"; break;
case 0x96645F9C: cout << " Macintosh Portable, Backlit Portable, or PowerBook 100"; break;
case 0x368CADFE: cout << " Macintosh IIci"; break;
case 0x4147DD77: cout << " Macintosh IIfx"; break;
case 0x35C28C8F: cout << " Macintosh IIfx"; break;
case 0x36B7FB6C: cout << " Macintosh IIsi"; break;
case 0xA49F9914: cout << " Macintosh Classic"; break;
case 0x350EACF0: cout << " Macintosh LC"; break;
case 0x3193670E: cout << " Macintosh Classic II or Performa 200"; break;
case 0x420DBFF3: cout << " Macintosh Quadra 700 or 900"; break;
case 0x35C28F5F: cout << " Macintosh LC III, Performa 400, 405, 410 or 430"; break;
case 0x3DC27823: cout << " Macintosh Quadra 950"; break;
case 0x49579803: cout << " Macintosh IIvx or Performa 600"; break;
case 0xE33B2724: cout << " Macintosh PowerBook 160, 165, 165c, 180 or 180c"; break;
case 0xECFA989B: cout << " Macintosh PowerBook Duo 230 or 250"; break;
case 0xECFA89A8: cout << " Macintosh PowerBook Duo 230 or 250"; break;
case 0xECD99DC0: cout << " Macintosh Color Classic or Performa 250"; break;
case 0xECBBC41C: cout << " Macintosh LC III, III+, 520, Performa 460 or 520"; break;
case 0xF1A6F343: cout << " Macintosh Centris 610 or Quadra 610"; break;
case 0xF1ACAD13: cout << " Macintosh Centris 650, Quadra 650 or 800"; break;
case 0x5BF10FD1: cout << " Macintosh Centris 660AV, Quadra 660AV, 840AV"; break;
case 0xFF7439EE: cout << " Macintosh LC 475, 575, Performa 475, 476, 575, 577, 578 or Quadra 605"; break;
case 0x0024D346: cout << " Macintosh PowerBook Duo 270c"; break;
case 0xEDE66CBD: cout << " Macintosh Colour Classic II, LC 550, Performa 275, 550, 560 or TV"; break;
case 0xEAF1678D: cout << " Macintosh Colour Classic II, LC 550, Performa 275, 550, 560 or TV"; break;
case 0x015621D7: cout << " Macintosh PowerBook Duo 280 or 280c"; break;
case 0xB6909089: cout << " Macintosh PoweBook 520, 520c, 540 or 540c"; break;
case 0x06684214: cout << " Macintosh LC 630, Performa 630 or Quadra 630"; break;
case 0xFDA22562: cout << " Macintosh PowerBook 150"; break;
case 0x064DC91D: cout << " Macintosh LC 580, Performa 580 or 588"; break;
case 0x4D27039C: cout << " Macintosh PowerBook 190 or 190cs"; break;
default: cout << "n unknown";
}
cout << " ROM.\n";
return 0;
}