[Dashboard\Ford\C-Max\C-Max MC9S12XHZ512]

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

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

OnShow 

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

		// проверка корректности дампа (вычисление CRC и сравнение ее со значением в дампе)
		Var12 = (@(Var1 + 1)) & 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;
	Var11 = 128; // Константа
	Var44 = 32;		// Количество повторов пробега в дампе
	Var5 = 0xDB0;	// начальный адрес для 32 групп пробега
	Var2 = 0;
	Var3 = 0;
	Var4 = 0;
	Var12 = 0;
	if(Var0 > 524287)	
	{
		message.Color = 0x0000FF;
		message.Bold = 1;
		message = "Пробег должен быть от 1 до 524160 км";
	}
	else
	{
		Var3 = 0;
		Var0 = Var0 / Var11;
		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;	
		}
		// ----------------- вычисление контрольной суммы

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

		Var13 = Distance % Var11;
		Var1 = 0;		// инидикатор ошибки
		if(Var13 < Var44) {Var1 = 1;}
		if(Distance < Var44) {Var1 = 1;}
		Var23 = (Distance % Var44) + 1;

		if(Var1 = 1)
		{
			Var13 = 0;
			while(Var12 < Var23)
			{
				Var0 = Var13;
				Var2 = 0;
				Var3 = 0;
				@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младший байт пробега + контролька
				// -------- вычисление контрольной суммы для малого круга
				while(Var2 < 7)
				{ 
					Var4 = Var0 & 0x01;
					Var3 = Var3 ^ Var4;
					Var0 = Var0 >> 1;
					Var2 = Var2 + 1;
				}
				// -------- вычисление контрольной суммы для малого круга
				@Var5 = ((Var3 ^ 1) << 7) | Var13; // Малый круг
				Var5 = Var5 + 1;
				Var13 = Var13 + 1;
				Var12 = Var12 + 1;
			}
			while(Var23 < Var44)
			{ 
				// Заполняем дамп, когда значение малого круга является "незначащим"
				@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младший байт пробега + контролька
				@Var5 = 0x80;					// Это "0" для панели
				Var5 = Var5 + 1;
				Var23 = Var23 + 1;
			}
		}
		else {
			Var13 = (Var13 / Var44) * Var44;
			while(Var12 < Var44)
			{ 
				// Заполнение дампа если пробег больше 32км.
				Var0 = Var13;
				Var2 = 0;
				Var3 = 0;
				// -------- вычисление контрольной суммы для малого круга
				while(Var2 < 7)
				{
					Var4 = Var0 & 0x01;
					Var3 = Var3 ^ Var4;
					Var0 = Var0 >> 1;
					Var2 = Var2 + 1;
				}
				// -------- вычисление контрольной суммы для малого круга
				@Var5 = Var14; Var5 = Var5 + 1; // Два старших байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младщий байт пробега + контролька
				@Var5 = ((Var3 ^ 1) << 7) | Var13; // Малый круг
				Var5 = Var5 + 1;
				Var13 = Var13 + 1;
				Var12 = Var12 + 1;

				if(Var12 = Var23) {Var13 = Var13 - Var44;}
			}
		}

		message.Color = 0xff0000;
        message = "Дамп OK. Новый пробег записан.";
	}
}