#include <stdio.h>

FILE *fdo;
int flag;
unsigned int dd,address;
int d,sum,buff[32],cr,lf,ctr;
char src[16],obj[16];

main(){
	unsigned int i,j;
	cr=0x0d; lf=0x0a;
	flag=1;
	ctr=0; address=0;
	fdo=fopen("ROM-0L.HEX","wb");
	for(i=0;i<128;i++){
		for(j=0;j<256;j++){
			dd=i*j; d=dd%256; file_write();
		}
	}
	file_close();
	ctr=0; address=0;
	fdo=fopen("ROM-0H.HEX","wb");
	for(i=128;i<256;i++){
		for(j=0;j<256;j++){
			dd=i*j; d=dd%256; file_write();
		}
	}
	file_close();
	ctr=0; address=0;
	fdo=fopen("ROM-8L.HEX","wb");
	for(i=0;i<128;i++){
		for(j=0;j<256;j++){
			dd=i*j; d=dd/256; file_write();
		}
	}
	file_close();
	ctr=0; address=0;
	fdo=fopen("ROM-8H.HEX","wb");
	for(i=128;i<256;i++){
		for(j=0;j<256;j++){
			dd=i*j; d=dd/256; file_write();
		}
	}
	file_close();
}

file_write(){
	int i;
	if(ctr==31){
		buff[ctr]=d;
		output(':');
		outbyte(0x20); sum=0x20;
		outbyte(address/256); sum=(sum+(address/256))%256;
		outbyte(address%256); sum=(sum+(address%256))%256;
		outbyte(0x00);
		for(i=0;i<32;i++){
			outbyte(buff[i]);
			sum=(sum+buff[i])%256;
		}
		sum=(256-sum)%256;
		outbyte(sum);
		output(cr); output(lf);
		ctr=0; address=address+0x20;
	}
	else{
		buff[ctr]=d;
		ctr=ctr+1;
	}
}

file_close(){
	output(':');
	outbyte(0x00);
	outbyte(0x00); outbyte(0x00);
	outbyte(0x01); outbyte(0xff);
	output(cr); output(lf); fputc(0x1a,fdo);
	fclose(fdo);
}

output(dt)
	int dt;
{
	putchar(dt);
	if(flag!=0) fputc(dt,fdo);
}

outasc(dt)
	int dt;
{
	if(dt<10){
		putchar('0'+dt);
		if(flag!=0) fputc('0'+dt,fdo);
	}
	else{
		dt=dt-10;
		putchar('A'+dt);
		if(flag!=0) fputc('A'+dt,fdo);
	}
}

outbyte(dt)
	int dt;
{
	outasc(dt/16);
	outasc(dt%16);
}

