[Dashboard\Toyota\Ractis 93C56 Denso]

Size(280,280); // ширина и высота

Form
{
	Group("Пробег",5,15,120,50)
	{
		Digit(Distance," ",5,18,70);
		Label(lb1,"KM",80,23);
	}
	Group("Информация",5,80,270,45)
	{
		Label(message," ",0,18);
	}
	Group("Описание",5,130,270,100)
	{
		Label(lb4,"Калькулятор пробега для Toyota Ractis.",0,20);
		Label(lb5,"EEPROM 93C56, панель Denso.",0,35);
		Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,50);
		Label(lb3,"и нажмите кнопку <Применить>.",0,65);
	}
	Picture(Picture1,"Toyota.bmp",160,5,0,0);
}

OnShow
{
	// --------------- проверяем правильность дампа
	Var0 = 0;
	Var9 = 0x62; // Начальный адрес
	Var1 =  (@(Var9 + 3) << 24) | (@(Var9 + 2) << 16) | (@(Var9 + 1) << 8) | @(Var9 + 0);
	Var2 =  (@(Var9 + 7) << 24) | (@(Var9 + 6) << 16) | (@(Var9 + 5) << 8) | @(Var9 + 4);
	Var3 =  (@(Var9 + 11) << 24) | (@(Var9 + 10) << 16) | (@(Var9 + 9) << 8) | @(Var9 + 8);

	if(Var1 != Var2) {Var0 = 1;}
	if(Var2 != Var3) {Var0 = 1;}

	if(Var0 != 0)
	{
		message.Color = 0x0000FF;
		Message.Bold = 1;
		Message = "Неверный дамп!";
		Distance = 0;
	}
	else
	{
		Var1 = Var1 ^ 0xFFFFFFFF;
		// переводим в двоично-десятичный вид
		Var0 = ((Var1 >> 28) & 0xFF) * 10000000;
		Var0 = Var0 + (((Var1 >> 24) & 0xF) * 1000000);
		Var0 = Var0 + (((Var1 >> 20) & 0xF) * 100000);
		Var0 = Var0 + (((Var1 >> 16) & 0xF) * 10000);
		Var0 = Var0 + (((Var1 >> 12) & 0xF) * 1000);
		Var0 = Var0 + (((Var1 >> 8) & 0xF) * 100);
		Var0 = Var0 + (((Var1 >> 4) & 0xF) * 10);
		Var0 = Var0 + (Var1&0xF);
		// точное вычисление пробега, добавка
		Var5 = 0; // точное вычисление пробега, смещение
		while(Var5 <= 0x61)
		{
			Var6 = @(Var5);
			if(Var6 != 0xFF){Var0 = Var0+1;}
			Var5 = Var5 + 2;
		}
		Message.Bold = 1;
		Message.Alignment = 1;
		message.Color = 0xFF0000;
		message = "Дамп ОК, нажмите кнопку <Применить>";
		Distance = Var0;
	}
}

OnApply
{
	if(Distance > 999999)
	{
		Message.Bold = 1;
		message.Color = 0x0000FF;
		Message = "Пробег должен быть не более 999999 км.";
	}
	else
	{
		Var1 = (Distance % 50) * 2; // вычисление добавки
		// запись добавки
		Var5 = 0; // смещение
		while(Var5 < Var1)
		{
			@Var5 = 0x80;
			Var5 = Var5 + 2;
		}
		while(Var5 < 0x62)
		{
			@Var5 = 0xFF;
			Var5 = Var5 + 2;
		}

		// запись основной части
		// переводим из двоично-десятичного в двоичный вид
		Var0 = Distance - (Distance % 50);
		Var2 = Var0 % 10; Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 4);  Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 8);  Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 12); Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 16); Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 20); Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 24); Var0 = Var0 / 10;
		Var2 = Var2 | ((Var0 % 10) << 28);

		Var2 = Var2 ^ 0xFFFFFFFF;
		// заполняем дамп
		Var0 = 0x62;
		while(Var0 < 0x6E)
		{
			@Var0 = Var2 & 0xFF; Var0 = Var0 + 1;
			@Var0 = Var2 >> 8 ;  Var0 = Var0 + 1;
			@Var0 = Var2 >> 16;  Var0 = Var0 + 1;
			@Var0 = Var2 >> 24;  Var0 = Var0 + 1;
		}
		Message.Bold = 1;
		message.Color=0xFF0000;
        message="Дамп ОК. Новый пробег записан.";
	}
}