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

FILE *fdo;
int flag;
unsigned int address,m,n;
int d,sum,buff[32],cr,lf,ctr;
unsigned char data1[256],data2[256];
unsigned char bank[]={
/* 1 */
	0x00,0x11,0x21,0x31,0x3F,0x4D,0x59,0x64,
	0x6D,0x74,0x79,0x7D,0x7F,0x7F,0x7E,0x7C,
	0x78,0x75,0x70,0x6C,0x67,0x63,0x5F,0x5C,
	0x59,0x58,0x57,0x57,0x58,0x5A,0x5C,0x5F,
	0x62,0x66,0x69,0x6C,0x6E,0x70,0x71,0x71,
	0x70,0x6E,0x6B,0x67,0x62,0x5D,0x56,0x50,
	0x49,0x42,0x3B,0x35,0x2F,0x2A,0x26,0x22,
	0x20,0x1F,0x1E,0x1F,0x21,0x23,0x26,0x29,
	0x2D,0x31,0x34,0x38,0x3A,0x3C,0x3D,0x3E,
	0x3D,0x3B,0x39,0x35,0x31,0x2C,0x27,0x21,
	0x1B,0x15,0x0F,0x0A,0x05,0x01,0x82,0x84,
	0x86,0x86,0x86,0x84,0x83,0x80,0x03,0x05,
	0x08,0x0B,0x0D,0x0E,0x0F,0x0F,0x0D,0x0B,
	0x07,0x03,0x83,0x89,0x90,0x98,0x9F,0xA7,
	0xAE,0xB5,0xBB,0xC0,0xC4,0xC7,0xC8,0xC7,
	0xC4,0xC0,0xBB,0xB3,0xAB,0xA1,0x97,0x8B,
/* 2 */
	0x00,0x1A,0x33,0x49,0x5C,0x6A,0x74,0x7B,
	0x7E,0x7F,0x7E,0x7D,0x7A,0x78,0x75,0x72,
	0x6E,0x6B,0x67,0x63,0x60,0x5D,0x59,0x57,
	0x54,0x51,0x4F,0x4C,0x4A,0x48,0x45,0x43,
	0x41,0x3F,0x3E,0x3C,0x3A,0x39,0x37,0x36,
	0x34,0x33,0x31,0x30,0x2F,0x2E,0x2D,0x2C,
	0x2A,0x29,0x28,0x27,0x26,0x25,0x24,0x24,
	0x23,0x22,0x21,0x20,0x20,0x1F,0x1E,0x1D,
	0x1D,0x1C,0x1B,0x1B,0x1A,0x1A,0x19,0x18,
	0x18,0x17,0x16,0x16,0x15,0x15,0x14,0x14,
	0x13,0x13,0x12,0x12,0x11,0x11,0x10,0x10,
	0x10,0x0F,0x0F,0x0E,0x0E,0x0D,0x0D,0x0C,
	0x0C,0x0C,0x0B,0x0B,0x0A,0x0A,0x0A,0x09,
	0x09,0x08,0x08,0x08,0x07,0x07,0x07,0x06,
	0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,
	0x03,0x03,0x02,0x02,0x01,0x01,0x01,0x00,
/* 3 */
	0x00,0x1C,0x31,0x3B,0x3C,0x36,0x30,0x29,
	0x23,0x1D,0x18,0x16,0x17,0x1A,0x1C,0x1C,
	0x1B,0x1C,0x20,0x26,0x2A,0x2A,0x26,0x20,
	0x1E,0x24,0x30,0x3E,0x4B,0x53,0x57,0x58,
	0x55,0x4E,0x43,0x35,0x28,0x1E,0x18,0x15,
	0x13,0x12,0x14,0x1E,0x30,0x46,0x5A,0x67,
	0x6A,0x65,0x5E,0x57,0x52,0x51,0x53,0x59,
	0x61,0x6A,0x70,0x6F,0x66,0x59,0x4C,0x44,
	0x41,0x41,0x41,0x40,0x40,0x45,0x50,0x5E,
	0x6D,0x78,0x7E,0x7F,0x7B,0x73,0x65,0x53,
	0x40,0x32,0x2A,0x2A,0x2B,0x2C,0x2A,0x27,
	0x27,0x2B,0x31,0x37,0x39,0x36,0x32,0x2E,
	0x2E,0x31,0x37,0x3E,0x48,0x53,0x5B,0x5C,
	0x53,0x3F,0x27,0x11,0x03,0x81,0x02,0x07,
	0x0D,0x14,0x1D,0x26,0x30,0x36,0x39,0x38,
	0x35,0x32,0x2B,0x21,0x14,0x08,0x81,0x83,
/* 4 */
	0x00,0x0F,0x1E,0x2C,0x3A,0x46,0x52,0x5D,
	0x66,0x6E,0x74,0x79,0x7D,0x7E,0x7F,0x7E,
	0x7C,0x79,0x74,0x6F,0x68,0x61,0x5A,0x51,
	0x49,0x40,0x37,0x2E,0x25,0x1C,0x13,0x0B,
	0x03,0x85,0x8B,0x91,0x97,0x9B,0x9F,0xA2,
	0xA4,0xA6,0xA6,0xA6,0xA5,0xA3,0xA0,0x9D,
	0x9A,0x95,0x91,0x8C,0x87,0x81,0x04,0x09,
	0x0E,0x13,0x17,0x1B,0x1E,0x20,0x22,0x23,
	0x23,0x22,0x21,0x1E,0x1A,0x16,0x10,0x0A,
	0x03,0x84,0x8C,0x95,0x9D,0xA6,0xAE,0xB7,
	0xBF,0xC6,0xCD,0xD2,0xD7,0xDB,0xDE,0xDF,
	0xDF,0xDE,0xDC,0xD8,0xD3,0xCD,0xC6,0xBE,
	0xB5,0xAB,0xA0,0x95,0x8A,0x02,0x0D,0x18,
	0x23,0x2D,0x36,0x3F,0x47,0x4D,0x52,0x56,
	0x59,0x5A,0x5A,0x59,0x57,0x53,0x4F,0x4A,
	0x43,0x3D,0x35,0x2D,0x24,0x1C,0x13,0x09,
/* 5 */
	0x00,0x1A,0x32,0x48,0x5B,0x6A,0x74,0x7B,
	0x7E,0x7F,0x7E,0x7B,0x79,0x76,0x73,0x70,
	0x6E,0x6C,0x6B,0x69,0x67,0x65,0x64,0x62,
	0x61,0x60,0x5F,0x5F,0x5F,0x5E,0x5E,0x5E,
	0x5D,0x5C,0x5C,0x5B,0x5A,0x59,0x58,0x58,
	0x57,0x56,0x55,0x54,0x52,0x51,0x50,0x4F,
	0x4E,0x4D,0x4C,0x4B,0x4A,0x49,0x48,0x47,
	0x46,0x45,0x44,0x43,0x42,0x42,0x41,0x41,
	0x40,0x3F,0x3E,0x3D,0x3C,0x3B,0x3A,0x39,
	0x38,0x38,0x37,0x36,0x35,0x34,0x32,0x31,
	0x30,0x2E,0x2D,0x2C,0x2A,0x29,0x28,0x27,
	0x26,0x25,0x24,0x23,0x22,0x20,0x1F,0x1E,
	0x1D,0x1C,0x1B,0x1B,0x1A,0x19,0x18,0x17,
	0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0F,
	0x0F,0x0E,0x0D,0x0C,0x0B,0x0A,0x09,0x08,
	0x07,0x06,0x05,0x04,0x04,0x03,0x02,0x01,
/* 6 */
	0x00,0x55,0x7F,0x7E,0x6E,0x64,0x5D,0x53,
	0x4A,0x45,0x41,0x3B,0x35,0x32,0x2F,0x2A,
	0x26,0x23,0x21,0x1D,0x19,0x17,0x15,0x12,
	0x0F,0x0E,0x0D,0x0B,0x0A,0x0A,0x0A,0x0A,
	0x0A,0x0B,0x0C,0x0D,0x0D,0x0F,0x10,0x11,
	0x12,0x13,0x14,0x14,0x14,0x14,0x14,0x13,
	0x12,0x11,0x10,0x0E,0x0C,0x0B,0x09,0x07,
	0x05,0x03,0x02,0x80,0x82,0x82,0x83,0x84,
	0x85,0x84,0x84,0x84,0x83,0x82,0x81,0x00,
	0x02,0x03,0x05,0x06,0x07,0x09,0x0A,0x0A,
	0x0B,0x0C,0x0C,0x0B,0x0B,0x0B,0x0A,0x08,
	0x07,0x06,0x04,0x02,0x01,0x81,0x82,0x84,
	0x85,0x86,0x87,0x88,0x88,0x88,0x88,0x87,
	0x87,0x85,0x84,0x83,0x82,0x00,0x02,0x03,
	0x05,0x06,0x07,0x08,0x09,0x0A,0x0A,0x0A,
	0x0A,0x09,0x08,0x07,0x06,0x05,0x03,0x01,
/* 7 */
	0x00,0x21,0x3F,0x58,0x6B,0x77,0x7D,0x7F,
	0x7D,0x79,0x73,0x6C,0x64,0x5B,0x53,0x4C,
	0x45,0x3F,0x3A,0x36,0x31,0x2D,0x2A,0x27,
	0x25,0x22,0x20,0x1E,0x1C,0x1B,0x1A,0x1A,
	0x1A,0x1A,0x1A,0x1A,0x19,0x18,0x17,0x17,
	0x16,0x15,0x14,0x13,0x13,0x12,0x11,0x11,
	0x10,0x0F,0x0E,0x0C,0x0B,0x0A,0x09,0x08,
	0x07,0x06,0x06,0x06,0x06,0x07,0x09,0x0B,
	0x0D,0x10,0x12,0x14,0x15,0x15,0x15,0x14,
	0x13,0x12,0x11,0x0F,0x0E,0x0D,0x0B,0x0A,
	0x09,0x08,0x07,0x07,0x06,0x06,0x05,0x04,
	0x04,0x03,0x03,0x02,0x02,0x02,0x03,0x03,
	0x04,0x05,0x06,0x06,0x06,0x06,0x05,0x05,
	0x04,0x04,0x03,0x03,0x02,0x00,0x81,0x83,
	0x86,0x89,0x8D,0x92,0x97,0x9C,0xA2,0xA7,
	0xAD,0xB1,0xB5,0xB6,0xB4,0xAD,0xA1,0x92,
/* 8 */
	0x00,0x11,0x21,0x30,0x3D,0x48,0x52,0x59,
	0x5E,0x63,0x66,0x69,0x6C,0x6F,0x71,0x74,
	0x76,0x77,0x79,0x7A,0x7A,0x7B,0x7B,0x7C,
	0x7C,0x7D,0x7D,0x7E,0x7F,0x7F,0x7F,0x7F,
	0x7F,0x7E,0x7E,0x7E,0x7D,0x7D,0x7C,0x7C,
	0x7B,0x7B,0x7A,0x79,0x79,0x78,0x77,0x77,
	0x77,0x77,0x77,0x77,0x77,0x77,0x76,0x76,
	0x76,0x76,0x76,0x76,0x76,0x76,0x76,0x76,
	0x76,0x76,0x76,0x76,0x75,0x75,0x75,0x75,
	0x75,0x75,0x75,0x75,0x75,0x75,0x75,0x75,
	0x75,0x75,0x76,0x76,0x77,0x77,0x78,0x78,
	0x79,0x7A,0x7A,0x7A,0x7B,0x7B,0x7C,0x7C,
	0x7C,0x7D,0x7D,0x7C,0x7C,0x7C,0x7B,0x7B,
	0x7A,0x7A,0x79,0x79,0x78,0x78,0x77,0x76,
	0x74,0x72,0x70,0x6D,0x6B,0x68,0x65,0x62,
	0x5D,0x58,0x51,0x48,0x3D,0x30,0x21,0x11,
/* 9 */
	0x00,0x0E,0x1C,0x28,0x33,0x3C,0x44,0x4A,
	0x4E,0x51,0x54,0x56,0x58,0x59,0x5B,0x5D,
	0x5F,0x60,0x61,0x61,0x60,0x5E,0x5B,0x58,
	0x54,0x4F,0x49,0x43,0x3D,0x37,0x31,0x2B,
	0x24,0x1E,0x17,0x10,0x08,0x01,0x87,0x90,
	0x98,0xA0,0xA8,0xAE,0xB4,0xB8,0xBB,0xBC,
	0xBA,0xB7,0xB2,0xAB,0xA3,0x9B,0x93,0x8B,
	0x84,0x03,0x08,0x0D,0x11,0x15,0x1A,0x1F,
	0x24,0x2B,0x33,0x3B,0x44,0x4D,0x56,0x5E,
	0x65,0x6B,0x70,0x75,0x78,0x7A,0x7C,0x7E,
	0x7F,0x7F,0x7F,0x7E,0x7C,0x7A,0x75,0x70,
	0x69,0x60,0x56,0x4C,0x40,0x34,0x28,0x1D,
	0x12,0x08,0x81,0x88,0x8F,0x94,0x98,0x9C,
	0x9F,0xA2,0xA5,0xA9,0xAD,0xB2,0xB6,0xBC,
	0xC0,0xC5,0xC8,0xCA,0xCB,0xC9,0xC7,0xC2,
	0xBC,0xB5,0xAE,0xA6,0x9E,0x96,0x8E,0x87,
/* 10 */
	0x00,0x09,0x12,0x1B,0x24,0x2C,0x34,0x3B,
	0x41,0x47,0x4C,0x51,0x55,0x59,0x5C,0x5F,
	0x61,0x63,0x65,0x67,0x69,0x6B,0x6D,0x6F,
	0x71,0x73,0x75,0x77,0x79,0x7B,0x7C,0x7D,
	0x7E,0x7F,0x7F,0x7F,0x7E,0x7D,0x7C,0x7A,
	0x78,0x75,0x72,0x6F,0x6C,0x69,0x66,0x62,
	0x5F,0x5C,0x58,0x55,0x52,0x4F,0x4C,0x48,
	0x45,0x42,0x3F,0x3C,0x39,0x36,0x33,0x30,
	0x2D,0x2A,0x27,0x24,0x22,0x1F,0x1D,0x1A,
	0x18,0x16,0x15,0x13,0x12,0x11,0x10,0x0F,
	0x0E,0x0E,0x0D,0x0D,0x0C,0x0C,0x0C,0x0B,
	0x0B,0x0A,0x0A,0x0A,0x09,0x09,0x09,0x09,
	0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,
	0x09,0x09,0x0A,0x0A,0x0A,0x09,0x09,0x09,
	0x09,0x08,0x08,0x07,0x06,0x06,0x05,0x04,
	0x04,0x03,0x03,0x02,0x02,0x01,0x01,0x00,
/* 11 */
	0x00,0x0B,0x15,0x20,0x2A,0x34,0x3D,0x46,
	0x4F,0x57,0x5E,0x64,0x6A,0x6F,0x73,0x77,
	0x7A,0x7C,0x7E,0x7F,0x7F,0x7F,0x7E,0x7E,
	0x7C,0x7B,0x79,0x77,0x75,0x72,0x70,0x6D,
	0x6B,0x68,0x66,0x64,0x61,0x5F,0x5D,0x5B,
	0x59,0x57,0x55,0x54,0x52,0x51,0x50,0x4F,
	0x4F,0x4E,0x4E,0x4E,0x4E,0x4E,0x4F,0x4F,
	0x50,0x51,0x51,0x52,0x53,0x54,0x55,0x56,
	0x57,0x57,0x58,0x58,0x58,0x57,0x56,0x55,
	0x54,0x52,0x50,0x4E,0x4B,0x48,0x45,0x41,
	0x3D,0x39,0x34,0x30,0x2B,0x27,0x22,0x1E,
	0x19,0x14,0x10,0x0C,0x08,0x04,0x00,0x83,
	0x86,0x89,0x8C,0x8E,0x90,0x92,0x94,0x95,
	0x97,0x98,0x98,0x99,0x99,0x9A,0x9A,0x99,
	0x99,0x98,0x98,0x97,0x96,0x95,0x93,0x92,
	0x90,0x8E,0x8D,0x8B,0x89,0x87,0x84,0x82,
/* 12 */
	0x00,0x1F,0x3B,0x50,0x5F,0x68,0x6E,0x72,
	0x76,0x7A,0x7D,0x7F,0x7F,0x7D,0x7A,0x77,
	0x75,0x73,0x72,0x70,0x6F,0x6E,0x6E,0x6F,
	0x71,0x74,0x77,0x78,0x78,0x77,0x75,0x74,
	0x74,0x73,0x71,0x6E,0x68,0x60,0x56,0x4E,
	0x47,0x43,0x42,0x42,0x42,0x42,0x41,0x3F,
	0x3C,0x3B,0x3A,0x3A,0x3A,0x3A,0x39,0x39,
	0x38,0x37,0x35,0x33,0x30,0x2D,0x2A,0x26,
	0x24,0x22,0x23,0x24,0x27,0x2A,0x2E,0x32,
	0x36,0x39,0x3B,0x3B,0x3A,0x38,0x36,0x34,
	0x34,0x35,0x36,0x37,0x37,0x34,0x2F,0x29,
	0x22,0x1C,0x17,0x13,0x0E,0x0A,0x05,0x01,
	0x81,0x82,0x82,0x81,0x01,0x01,0x01,0x80,
	0x81,0x81,0x81,0x80,0x80,0x81,0x83,0x86,
	0x87,0x86,0x84,0x00,0x05,0x07,0x08,0x06,
	0x04,0x01,0x00,0x01,0x03,0x04,0x04,0x03 };

main(){
	double a,b,pi=3.1415926535;
	unsigned int i,j;
	cr=0x0d; lf=0x0a;
	flag=1;
	ctr=0; address=0;
	fdo=fopen("WAVEROM.HEX","wb");
	m=0; n=1; data_set();
	m=2; n=3; data_set();
	m=5; n=4; data_set();
	m=6; n=7; data_set();
	m=8; n=9; data_set();
	m=11; n=10; data_set();
	m=8; n=0; data_set();
	m=2; n=0; data_set();
	file_close();
}

conv(data)
	unsigned char data;
{
	if(data<0x80) return(data+128);
	else return(256-data);
}

data_set(){
	int i,j;
	double a,b;
	for(j=0;j<128;j++) data1[j]=conv(bank[m*128+j]);
	for(j=128;j<256;j++) data1[j]=256-conv(bank[m*128+255-j]);
	for(j=0;j<128;j++) data2[j]=conv(bank[n*128+j]);
	for(j=128;j<256;j++) data2[j]=256-conv(bank[n*128+255-j]);
	for(i=0;i<16;i++){
		a=(double)(16-i)/16.0;
		b=(double)i/16.0;
		for(j=0;j<256;j++){
			d=(int)(a*(double)data1[j]+b*(double)data2[j]);
			file_write();
		}
	}
}

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);
}

