///////////////////////////////////////////////////////////
// BDP-S390 Firmware Modification Code:
//    Binary File Checksum
//--------------------------------------------------------
// Copyright (C) 2013 Malcolm Stagg
///////////////////////////////////////////////////////////

#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main(int argc, char * argv[]) {
	ifstream infile;
	
	if (argc != 4) {
		cout << "Usage: chksum [INPUT FILE] [CHKLEN] [OFFSET]" << endl;
		cout << "Usage: e.g. chksum MSB11-FW.BIN 8 0" << endl;
		exit(1);
	}
	char * infilename = argv[1];
	int chklen = atoi(argv[2]);
	int offset = atoi(argv[3]);
	
	infile.open(infilename, ifstream::binary);
	
	if (!infile) {
		cout << "cannot open input file" << endl;
		exit(1);
	}
	
	unsigned char chksum[256];
	
	for (int i=0;i<chklen;i++)
		chksum[i]=0;
	
	unsigned char c1;
	infile.seekg(offset, ios::beg);
	c1 = infile.get();
	int i=0;
	while (infile) {
		i%=chklen;
		chksum[i] ^= c1;
		c1 = infile.get();
		i++;
	}
	infile.close();
	
	cout << "CHECKSUM: " << endl;
	for (i=0;i<chklen;i++)
		cout << hex << (int)chksum[i] << " ";
	cout << endl;
}
