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

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

using namespace std;

#define INFILE "MSB11-FW.BIN"
#define CHKLEN 8
#define OFFSET 0

#define IDLEN 0xA0
#define CHKPOS 0x54

int main(int argc, char * argv[]) {
	ifstream infile;
	ofstream outfile;
	
	if (argc != 4) {
		cout << "Usage: genid [encoded input] [decoded input] [ID output]" << endl;
		exit(1);
	}
	char * encodedin = argv[1];
	char * decodedin = argv[2];
	char * outfilename = argv[3];
	
	infile.open(encodedin, ifstream::binary);
	
	if (!infile) {
		cout << "cannot open encoded input file" << endl;
		exit(1);
	}
	
	cout << "calculating checksum..." << endl;
	
	unsigned char chksum[CHKLEN];
	
	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;
	
	infile.open(decodedin, ifstream::binary);
	outfile.open(outfilename, ifstream::binary);

	if (!infile) {
		cout << "cannot open decoded input file" << endl;
		exit(1);
	}
	if (!outfile) {
		cout << "cannot open ID output file" << endl;
		exit(1);
	}
	
	cout << "creating ID file output..." << endl;

	c1 = infile.get();
	i=0;
	while (infile && i<IDLEN) {
		if (i>=CHKPOS && i<CHKPOS+CHKLEN)
			outfile.put(chksum[i-CHKPOS]);
		else
			outfile.put(c1);
		c1 = infile.get();
		i++;
	}
	infile.close();
	outfile.close();
	cout << "complete!" << endl;
}
