Skip to main content
Home Forums 68kMLA Mac ROM Checksum Computation? — #11
Post #11 by Dennis Nedry
Source Forum68kMLA
Category68k
Post DateThu, 25 Feb 2010 - 03:03
Original URLhttps://68kmla.org/bb/threads/mac-rom-checksum-computation.19981/
Post
p.s. If there's any info you need again from GttMFH: Second Edition again, just ask! }:)
Will do! ;)

I have some alpha quality code going here. This command line app takes one argument, the path to the ROM file. So drag the app onto a terminal window, then drag a ROM onto the same window, then hit return.

It displays this stuff right now:

-Usage (if arguments were invalid)

-ROM length in kiB

-Warning if this is a strange length, i.e. length % 64kiB != 0

-Statement whether checksum passed or failed

-Tells what Mac the ROM came from, based on: http://minivmac.sourceforge.net/mac68k.html

-Still needs:

-- check if file exists

-- add more models to the checksum/name of Mac table.

-- a couple known-good PPC 4MiB ROMs fail. Need to figure out why.

Otherwise it worked for all of my ROMs. 6100, 6400 failed, 6500 ok, etc. And I identified which of my two different Quadra 650 ROMs was bad.

Here's what I have so far. You can paste it over the main.cpp file if you create a new C++ Tool project in Xcode. Then build. The binary will be in /Build/Debug of your project's folder by default.

Code:
#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;
}
Please feel free to suggest changes and/or optimizations. Maybe I'll learn something!

mp.ls