// Author: Civic TSI

num	hrpmlow00;
num	hrpmlow01;
num	hrpmlow02;
num	hrpmlow03;
num	hrpmlow04;
num	hrpmlow05;
num	hrpmlow06;
num	hrpmlow07;
num	hrpmlow08;
num	hrpmlow09;
num	hrpmlow10;
num	hrpmlow11;
num	hrpmlow12;
num	hrpmlow13;
num	hrpmlow14;
num	hrpmlow15;
num	hrpmlow16;
num	hrpmlow17;
num	hrpmlow18;
num	hrpmlow19;

num	hrpmhigh00;
num	hrpmhigh01;
num	hrpmhigh02;
num	hrpmhigh03;
num	hrpmhigh04;
num	hrpmhigh05;
num	hrpmhigh06;
num	hrpmhigh07;
num	hrpmhigh08;
num	hrpmhigh09;
num	hrpmhigh10;
num	hrpmhigh11;
num	hrpmhigh12;
num	hrpmhigh13;
num	hrpmhigh14;
num	hrpmhigh15;
num	hrpmhigh16;
num	hrpmhigh17;
num	hrpmhigh18;
num	hrpmhigh19;

void open()
{
	x = 470;
	y = 10;
	CreateBorder(x, y, 160, 460, 5, 0, "");
	CreateStatic(x+5, y-5, 144, 20, 5, 0, " RPM Low -- RPM High");
	
	hrpmlow00 = CreateEdit(x+20, y+20, 40, 20, 5, 0, "");
	hrpmlow01 = CreateEdit(x+20, y+40, 40, 20, 5, 0, "");
	hrpmlow02 = CreateEdit(x+20, y+60, 40, 20, 5, 0, "");
	hrpmlow03 = CreateEdit(x+20, y+80, 40, 20, 5, 0, "");
	hrpmlow04 = CreateEdit(x+20, y+100, 40, 20, 5, 0, "");
	hrpmlow05 = CreateEdit(x+20, y+120, 40, 20, 5, 0, "");
	hrpmlow06 = CreateEdit(x+20, y+140, 40, 20, 5, 0, "");
	hrpmlow07 = CreateEdit(x+20, y+160, 40, 20, 5, 0, "");
	hrpmlow08 = CreateEdit(x+20, y+180, 40, 20, 5, 0, "");
	hrpmlow09 = CreateEdit(x+20, y+200, 40, 20, 5, 0, "");
	hrpmlow10 = CreateEdit(x+20, y+220, 40, 20, 5, 0, "");
	hrpmlow11 = CreateEdit(x+20, y+240, 40, 20, 5, 0, "");
	hrpmlow12 = CreateEdit(x+20, y+260, 40, 20, 5, 0, "");
	hrpmlow13 = CreateEdit(x+20, y+280, 40, 20, 5, 0, "");
	hrpmlow14 = CreateEdit(x+20, y+300, 40, 20, 5, 0, "");
	hrpmlow15 = CreateEdit(x+20, y+320, 40, 20, 5, 0, "");
	hrpmlow16 = CreateEdit(x+20, y+340, 40, 20, 5, 0, "");
	hrpmlow17 = CreateEdit(x+20, y+360, 40, 20, 5, 0, "");
	hrpmlow18 = CreateEdit(x+20, y+380, 40, 20, 5, 0, "");
	hrpmlow19 = CreateEdit(x+20, y+400, 40, 20, 5, 0, "");

	x = x + 80;
	hrpmhigh00 = CreateEdit(x+20, y+20, 40, 20, 5, 0, "");
	hrpmhigh01 = CreateEdit(x+20, y+40, 40, 20, 5, 0, "");
	hrpmhigh02 = CreateEdit(x+20, y+60, 40, 20, 5, 0, "");
	hrpmhigh03 = CreateEdit(x+20, y+80, 40, 20, 5, 0, "");
	hrpmhigh04 = CreateEdit(x+20, y+100, 40, 20, 5, 0, "");
	hrpmhigh05 = CreateEdit(x+20, y+120, 40, 20, 5, 0, "");
	hrpmhigh06 = CreateEdit(x+20, y+140, 40, 20, 5, 0, "");
	hrpmhigh07 = CreateEdit(x+20, y+160, 40, 20, 5, 0, "");
	hrpmhigh08 = CreateEdit(x+20, y+180, 40, 20, 5, 0, "");
	hrpmhigh09 = CreateEdit(x+20, y+200, 40, 20, 5, 0, "");
	hrpmhigh10 = CreateEdit(x+20, y+220, 40, 20, 5, 0, "");
	hrpmhigh11 = CreateEdit(x+20, y+240, 40, 20, 5, 0, "");
	hrpmhigh12 = CreateEdit(x+20, y+260, 40, 20, 5, 0, "");
	hrpmhigh13 = CreateEdit(x+20, y+280, 40, 20, 5, 0, "");
	hrpmhigh14 = CreateEdit(x+20, y+300, 40, 20, 5, 0, "");
	hrpmhigh15 = CreateEdit(x+20, y+320, 40, 20, 5, 0, "");
	hrpmhigh16 = CreateEdit(x+20, y+340, 40, 20, 5, 0, "");
	hrpmhigh17 = CreateEdit(x+20, y+360, 40, 20, 5, 0, "");
	hrpmhigh18 = CreateEdit(x+20, y+380, 40, 20, 5, 0, "");
	hrpmhigh19 = CreateEdit(x+20, y+400, 40, 20, 5, 0, "");

	CreateBtn(x-70, y+430, 60, 20, 5, "ReadRPMTables", "Read");
	CreateBtn(x+10, y+430, 60, 20, 5, "WriteRPMTables", "Write");

	ReadRPMTables();
}

void ReadRPMTables()
{
	setitem(hrpmlow00, GetLowCamRPM(readbyte(RPM_TABLE)));
	setitem(hrpmlow01, GetLowCamRPM(readbyte(RPM_TABLE+1)));
	setitem(hrpmlow02, GetLowCamRPM(readbyte(RPM_TABLE+2)));
	setitem(hrpmlow03, GetLowCamRPM(readbyte(RPM_TABLE+3)));
	setitem(hrpmlow04, GetLowCamRPM(readbyte(RPM_TABLE+4)));
	setitem(hrpmlow05, GetLowCamRPM(readbyte(RPM_TABLE+5)));
	setitem(hrpmlow06, GetLowCamRPM(readbyte(RPM_TABLE+6)));
	setitem(hrpmlow07, GetLowCamRPM(readbyte(RPM_TABLE+7)));
	setitem(hrpmlow08, GetLowCamRPM(readbyte(RPM_TABLE+8)));
	setitem(hrpmlow09, GetLowCamRPM(readbyte(RPM_TABLE+9)));
	setitem(hrpmlow10, GetLowCamRPM(readbyte(RPM_TABLE+10)));
	setitem(hrpmlow11, GetLowCamRPM(readbyte(RPM_TABLE+11)));
	setitem(hrpmlow12, GetLowCamRPM(readbyte(RPM_TABLE+12)));
	setitem(hrpmlow13, GetLowCamRPM(readbyte(RPM_TABLE+13)));
	setitem(hrpmlow14, GetLowCamRPM(readbyte(RPM_TABLE+14)));
	setitem(hrpmlow15, GetLowCamRPM(readbyte(RPM_TABLE+15)));
	setitem(hrpmlow16, GetLowCamRPM(readbyte(RPM_TABLE+16)));
	setitem(hrpmlow17, GetLowCamRPM(readbyte(RPM_TABLE+17)));
	setitem(hrpmlow18, GetLowCamRPM(readbyte(RPM_TABLE+18)));
	if(readbyte(RPM_TABLE+19) == 0)
		setitem(hrpmlow19, GetLowCamRPM(256));
	else
		setitem(hrpmlow19, GetLowCamRPM(readbyte(RPM_TABLE+19)));

	setitem(hrpmhigh00, GetHighCamRPM(readbyte(RPMHI_TABLE)));
	setitem(hrpmhigh01, GetHighCamRPM(readbyte(RPMHI_TABLE+1)));
	setitem(hrpmhigh02, GetHighCamRPM(readbyte(RPMHI_TABLE+2)));
	setitem(hrpmhigh03, GetHighCamRPM(readbyte(RPMHI_TABLE+3)));
	setitem(hrpmhigh04, GetHighCamRPM(readbyte(RPMHI_TABLE+4)));
	setitem(hrpmhigh05, GetHighCamRPM(readbyte(RPMHI_TABLE+5)));
	setitem(hrpmhigh06, GetHighCamRPM(readbyte(RPMHI_TABLE+6)));
	setitem(hrpmhigh07, GetHighCamRPM(readbyte(RPMHI_TABLE+7)));
	setitem(hrpmhigh08, GetHighCamRPM(readbyte(RPMHI_TABLE+8)));
	setitem(hrpmhigh09, GetHighCamRPM(readbyte(RPMHI_TABLE+9)));
	setitem(hrpmhigh10, GetHighCamRPM(readbyte(RPMHI_TABLE+10)));
	setitem(hrpmhigh11, GetHighCamRPM(readbyte(RPMHI_TABLE+11)));
	setitem(hrpmhigh12, GetHighCamRPM(readbyte(RPMHI_TABLE+12)));
	setitem(hrpmhigh13, GetHighCamRPM(readbyte(RPMHI_TABLE+13)));
	if(gethifuely() == 15)
	{
		if(readbyte(RPMHI_TABLE+14) == 0)
			setitem(hrpmhigh14, GetHighCamRPM(256));
		else
			setitem(hrpmhigh14, GetHighCamRPM(readbyte(RPMHI_TABLE+14)));

		setitem(hrpmhigh15, 0);
		setitem(hrpmhigh16, 0);
		setitem(hrpmhigh17, 0);
		setitem(hrpmhigh18, 0);
		setitem(hrpmhigh19, 0);
	}
	else
	{

		setitem(hrpmhigh14, GetHighCamRPM(readbyte(RPMHI_TABLE+14)));
		setitem(hrpmhigh15, GetHighCamRPM(readbyte(RPMHI_TABLE+15)));
		setitem(hrpmhigh16, GetHighCamRPM(readbyte(RPMHI_TABLE+16)));
		setitem(hrpmhigh17, GetHighCamRPM(readbyte(RPMHI_TABLE+17)));
		setitem(hrpmhigh18, GetHighCamRPM(readbyte(RPMHI_TABLE+18)));
		if(readbyte(RPMHI_TABLE+19) == 0)
			setitem(hrpmhigh19, GetHighCamRPM(256));
		else
			setitem(hrpmhigh19, GetHighCamRPM(readbyte(RPMHI_TABLE+19)));
	}
}

void WriteRPMTables()
{
	writebyte(RPM_TABLE + 0, GetLowCamByte(getitem(hrpmlow00)));
	writebyte(RPM_TABLE + 1, GetLowCamByte(getitem(hrpmlow01)));
	writebyte(RPM_TABLE + 2, GetLowCamByte(getitem(hrpmlow02)));
	writebyte(RPM_TABLE + 3, GetLowCamByte(getitem(hrpmlow03)));
	writebyte(RPM_TABLE + 4, GetLowCamByte(getitem(hrpmlow04)));
	writebyte(RPM_TABLE + 5, GetLowCamByte(getitem(hrpmlow05)));
	writebyte(RPM_TABLE + 6, GetLowCamByte(getitem(hrpmlow06)));
	writebyte(RPM_TABLE + 7, GetLowCamByte(getitem(hrpmlow07)));
	writebyte(RPM_TABLE + 8, GetLowCamByte(getitem(hrpmlow08)));
	writebyte(RPM_TABLE + 9, GetLowCamByte(getitem(hrpmlow09)));
	writebyte(RPM_TABLE + 10, GetLowCamByte(getitem(hrpmlow10)));
	writebyte(RPM_TABLE + 11, GetLowCamByte(getitem(hrpmlow11)));
	writebyte(RPM_TABLE + 12, GetLowCamByte(getitem(hrpmlow12)));
	writebyte(RPM_TABLE + 13, GetLowCamByte(getitem(hrpmlow13)));
	writebyte(RPM_TABLE + 14, GetLowCamByte(getitem(hrpmlow14)));
	writebyte(RPM_TABLE + 15, GetLowCamByte(getitem(hrpmlow15)));
	writebyte(RPM_TABLE + 16, GetLowCamByte(getitem(hrpmlow16)));
	writebyte(RPM_TABLE + 17, GetLowCamByte(getitem(hrpmlow17)));
	writebyte(RPM_TABLE + 18, GetLowCamByte(getitem(hrpmlow18)));
	writebyte(RPM_TABLE + 19, GetLowCamByte(getitem(hrpmlow19)));

	writebyte(RPMHI_TABLE + 0, GetHighCamByte(getitem(hrpmhigh00)));
	writebyte(RPMHI_TABLE + 1, GetHighCamByte(getitem(hrpmhigh01)));
	writebyte(RPMHI_TABLE + 2, GetHighCamByte(getitem(hrpmhigh02)));
	writebyte(RPMHI_TABLE + 3, GetHighCamByte(getitem(hrpmhigh03)));
	writebyte(RPMHI_TABLE + 4, GetHighCamByte(getitem(hrpmhigh04)));
	writebyte(RPMHI_TABLE + 5, GetHighCamByte(getitem(hrpmhigh05)));
	writebyte(RPMHI_TABLE + 6, GetHighCamByte(getitem(hrpmhigh06)));
	writebyte(RPMHI_TABLE + 7, GetHighCamByte(getitem(hrpmhigh07)));
	writebyte(RPMHI_TABLE + 8, GetHighCamByte(getitem(hrpmhigh08)));
	writebyte(RPMHI_TABLE + 9, GetHighCamByte(getitem(hrpmhigh09)));
	writebyte(RPMHI_TABLE + 10, GetHighCamByte(getitem(hrpmhigh10)));
	writebyte(RPMHI_TABLE + 11, GetHighCamByte(getitem(hrpmhigh11)));
	writebyte(RPMHI_TABLE + 12, GetHighCamByte(getitem(hrpmhigh12)));
	writebyte(RPMHI_TABLE + 13, GetHighCamByte(getitem(hrpmhigh13)));
	writebyte(RPMHI_TABLE + 14, GetHighCamByte(getitem(hrpmhigh14)));
	writebyte(RPMHI_TABLE + 15, GetHighCamByte(getitem(hrpmhigh15)));
	writebyte(RPMHI_TABLE + 16, GetHighCamByte(getitem(hrpmhigh16)));
	writebyte(RPMHI_TABLE + 17, GetHighCamByte(getitem(hrpmhigh17)));
	writebyte(RPMHI_TABLE + 18, GetHighCamByte(getitem(hrpmhigh18)));
	writebyte(RPMHI_TABLE + 19, GetHighCamByte(getitem(hrpmhigh19)));

	ReadRPMTables();
}

num GetLowCamRPM(num rpmbyte)
{
//RPM = Round((2 ^ (Byte \ 64)) * (Round((Byte mod 64) * (500 / 64)) + 500)

	num	work;
	num	work1;
	num mod;
	num	rpm;
	num Q;
	num R;

	work = rpmbyte / 64;
	work1 = 0;
	while(work >= 1)
	{
		work1 = work1 + 1;
		work = work - 1;
	}
	work = 2 ^ work1;

	Q = 0;
	while(work >= 1)
	{
		Q = Q + 1;
		work = work - 1;
	}
	mod = rpmbyte;
	while(mod >= 64)
		mod = mod - 64;

	R = 500 / 64;
	R = R * mod;
	R = R + 500;
	rpm = round(Q * R);
	return rpm;
}

num GetHighCamRPM(num rpmbyte)
{
//RPM = 1875000 * byte / 53248

	num rpm;

	rpm = round(1875000 * rpmbyte / 53248); 
	return rpm;
}

num GetLowCamByte(num rpm)
{
	num byte;
	num	div;
	num offset;

	if(rpm > 0)
	{
		if(rpm < 1000)
		{
			div = 1;
			offset = 0;
		}
	}

	if(rpm >= 1000)
	{
		if(rpm < 2000)
		{
			div = 2;
			offset = 64;
		}
	}

   	if(rpm >= 2000)
	{
		if(rpm < 4000)
		{
			div = 4;
			offset = 128;
		}
	}

	if(rpm >= 4000)
	{
		if(rpm > 8000)
			rpm = 8000;

		div = 8;
		offset = 192;
	}

	rpm = rpm / div;
	rpm = rpm - 500;
	byte = round(rpm / 7.8125);
	byte = byte + offset;

	if(byte < 0 || byte > 255)
		return 0;
	else
		return byte;
}

num GetHighCamByte(num rpm)
{
	num byte;

	byte = round(rpm * 53248 / 1875000); 
	if(byte > 255)
		return 0;
	else
		return byte;
}

