#include <stdio.h>
#include <math.h>

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

main(){
	double w,pi=3.1415926535;
	unsigned int i,j,k;
	cr=0x0d; lf=0x0a;
	flag=1;
	ctr=0; address=0;
	fdo=fopen("ENVROM.HEX","wb");
	for(k=0;k<4;k++){
		for(i=0;i<16;i++){
			w=(double)(i+1)/16.0;
			for(j=0;j<32;j++){
				d=(int)(w*8.25*(double)j);
				file_write();
			}
			for(j=32;j<64;j++){
				d=(int)(w*(255.9-(3.999*(double)(j-32))));
				file_write();
			}
			for(j=64;j<128;j++){
				d=(int)(w*(127.9-(double)(j-64)));
				file_write();
			}
			for(j=128;j<256;j++){
				d=(int)(w*(63.9-(0.499*(double)(j-128))));
				file_write();
			}
		}
	}
	for(k=0;k<4;k++){
		for(i=0;i<16;i++){
			w=(double)(i+1)/16.0;
			for(j=0;j<64;j++){
				d=(int)(w*4.06*(double)j);
				file_write();
			}
			for(j=64;j<128;j++){
				d=(int)(w*(255.9-(1.999*(double)(j-64))));
				file_write();
			}
			for(j=128;j<256;j++){
				d=(int)(w*(double)(255-j));
				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);
}

