#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int wrblock(FILE *f, int type, int length, char *data) {
	int i, check=type+length;
	for(i=0; i<length; i++)
		check+=data[i];
	fputc(0x55, f);
	fputc(0x3c, f);
	fputc(type, f);
	fputc(length, f);
	if(length)
		fwrite(data, 1, length, f);
	fputc(check&0xff, f);
	fputc(0x55, f);

	return 0;
}

int main(int argc, char *argv[]) {
	unsigned char fname[8], header[9], data[255];
	FILE *infile, *outfile;
	unsigned i;

	if(argc<4) {
		puts("Required parameter missing");
		exit(1);
	}
	if((infile=fopen(argv[1], "rb"))==NULL) {
		puts("Can't open input file");
		exit(1);
	}
	if(fread(header, 1, 9, infile)<9) {
		puts("Can't read header");
		fclose(infile);
		exit(1);
	}
	if(header[0]!=0x55 || header[8]!=0xaa) {
		puts("Invalid BAS or BIN file");
		fclose(infile);
		exit(1);
	}
	if((outfile=fopen(argv[2], "wb"))==NULL) {
		puts("Can't open output file");
		fclose(infile);
		exit(1);
	}
	for(i=128; i; i--)
		fputc(0x55, outfile);

	memset(data, 0x20, 8);
	memcpy(data, strupr(argv[3]), strlen(argv[3]));
	if(header[1]==1) {
		data[8]=0;
	} else {
		data[8]=2;
	}
	data[9]=0;
	data[10]=0;
	data[11]=header[6];
	data[12]=header[7];
	data[13]=header[2];
	data[14]=header[3];
	wrblock(outfile, 0, 15, data);
	for(i=128; i; i--)
		fputc(0x55, outfile);
	do {
		if(!(i=fread(data, 1, 255, infile)))
			break;
		wrblock(outfile, 1, i, data);
	} while(i==255);
	wrblock(outfile, 0xff, 0, NULL);
	fclose(infile);
	fclose(outfile);

	return 0;
}
