[Dashboard\Ford\Focus\Focus 24c16 new miles v2]

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

Form 
{
	Group("Пробег",12,10,120,60)
	{
		Digit(Distance," ",5,18,70);
		Label(lbkm,"MILES",90,20);
		Label(lbcon,"156",65,42);
		Label(lbc,"Constant -",15,42);
	}
	Group("Информация",5,80,270,45) 
	{
		Label(message," ",0,18);
	}    
	Group("Описание",5,130,270,90) 
	{
        Label(lb1,"Калькулятор пробега для Ford Focus.",0,20);
		Label(lb2,"Eeprom 24c16.",0,35);
		Label(lb3,"Введите нужное значение в окне <Пробег>.",0,50);
		Label(lb4,"Нажмите кнопку <Применить>.",0,65);
	}
	Picture(Logo,"Ford.bmp",160,25,0,0);
}

OnShow 

{
	Var0 = 156;	// константа счета по умолчанию 
	Var1 = 0x7A1; 	// начальный адрес для 32 групп пробега
	Var5 = 0;		// индикатор ошибки
	Var13 = 0;		// счетчик в цикле
	Var43 = 0;		// Наибольший пробег в дампе
			
	// Проверяем область пробега на "вшивость", одновременно ищем наибольший пробег
	while(Var13 < 5) 
	{
		Var23 = 0; 
		Var2 = @(Var1 + 1) << 4;			// первые два байта пробега
		Var3 = (@Var1 >> 4) & 0x0F;			// третий байт пробега
		Var3 = Var3 | Var2;					// пробег деленный на коэфиициент - нужен для проверки CRC
		Var33 = Var3 * Var0; 
		if(Var43 < Var33) {Var43 = Var33;} 	// Наибольший пробег

		// проверка корректности дампа (вычисление CRC и сравнение ее со значением в дампе)
		Var12 = @Var1 & 0x0F;				// CRC лежаций в дампе
		Var14 = Var3;
		Var10 = 0;							// CRC который должен соответствовать пробегу
		Var10 = (Var14 & 0x0F) ^ 5;
		while(Var23 < 3)
		{
			// это вместо таблицы;
			if(Var10 =  1) {Var10 = 0x1D;}
			if(Var10 =  2) {Var10 = 0x17;}
			if(Var10 =  3) {Var10 = 0x1A;}
			if(Var10 =  4) {Var10 = 0x1E;}
			if(Var10 =  5) {Var10 = 0x13;}
			if(Var10 =  6) {Var10 = 0x19;}
			if(Var10 =  7) {Var10 = 0x14;}
			if(Var10 =  8) {Var10 = 0x11;}
			if(Var10 =  9) {Var10 = 0x1C;}
			if(Var10 = 10) {Var10 = 0x16;}
			if(Var10 = 11) {Var10 = 0x1B;}
			if(Var10 = 12) {Var10 = 0x1F;}
			if(Var10 = 13) {Var10 = 0x12;}
			if(Var10 = 14) {Var10 = 0x18;}
			if(Var10 = 15) {Var10 = 0x15;}	
			Var10 = Var10 & 0x0F;
			Var10 =((Var14 >> 4) & 0x0F) ^ Var10;
			Var14 = Var14 >> 4;	
			Var23 = Var23 + 1;	
		}
		Var1 = Var1 + 4;	
		Var13 = Var13 + 1;	
		Var10 = Var10 & 0x0F;
		if (Var10 != Var12) {Var5 = 1;}
	}

	if(Var5 != 0) 
	{
		message.Color = 0x0000FF; 
		message.Bold = 1;
		message = "Неверный дамп!"; 
		Distance=0;
	}
	else
	{
		lbcon.Bold = 1;
		message.Color = 0xFF0000;
		message.Bold = 1;
		message = "Введите пробег";
		Distance = Var43;
	}
}

OnApply 
{
	Var0 = Distance;
	Var1 = 156;
	Var2 = 0;
	Var3 = 0;
	Var4 = 0;
	Var5 = 0x7A1;	// начальный адрес для 5 групп пробега
	Var6 = Var5 + 0x11;
	Var12 = 0;
	if(Var0 > 524287)	
	{
		message.Color = 0x0000FF; 
		message.Bold = 1;
		message = "Пробег должен быть от 1 до 524160 км";
	}
	else
    {
		Var3 = 0;
		Var0 = Var0 / Var1;
		Var4 = Var0;

		// ----------------- вычисление контрольной суммы
		Var10 = 0;	// это будет контрольная сумма
		Var10 = (Var4 & 0x0f) ^ 5;

		while(Var3 < 3)
		{
			// это вместо таблицы;
			if(Var10 =  1) {Var10 = 0x1D;}
			if(Var10 =  2) {Var10 = 0x17;}
			if(Var10 =  3) {Var10 = 0x1A;}
			if(Var10 =  4) {Var10 = 0x1E;}
			if(Var10 =  5) {Var10 = 0x13;}
			if(Var10 =  6) {Var10 = 0x19;}
			if(Var10 =  7) {Var10 = 0x14;}
			if(Var10 =  8) {Var10 = 0x11;}
			if(Var10 =  9) {Var10 = 0x1C;}
			if(Var10 = 10) {Var10 = 0x16;}
			if(Var10 = 11) {Var10 = 0x1B;}
			if(Var10 = 12) {Var10 = 0x1F;}
			if(Var10 = 13) {Var10 = 0x12;}
			if(Var10 = 14) {Var10 = 0x18;}
			if(Var10 = 15) {Var10 = 0x15;}	
			Var10 = Var10 & 0x0f;

			Var10 = ((Var4 >> 4) & 0x0f) ^ Var10;
			Var4 = Var4 >> 4;	
			Var3 = Var3 + 1;	
		}
		// ----------------- вычисление контрольной суммы

		Var15 = (Var0 >> 4) & 0xFF; 					// Старшие 2 байта пробега
		Var14 = ((Var0 << 4) & 0xF0) | (Var10 & 0x0F);	// Младший байт пробега + контролька

		while(Var5 < Var6)
		{
			@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
			@Var5 = Var15; Var5 = Var5 + 3; // Младший байт пробега + контролька
		}
		message.Color = 0xff0000;
        message = "Дамп OK. Новый пробег записан.";
	}
}
