[Dashboard\Ford\Focus3 MC9S12XHZ512.cal]

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

Form 
{   
	Group("Пробег",5,5,150,50)
 	{Digit(Distance," ",5,18,90); Label(km,"км",110,20);}
	Group("Константа",5,55,150,50)
	{Digit(Constant," ",5,18,40);}
	Group("Информация",5,105,310,45)
  	{Label(message," ",0,18);}
    	Group("Описание",5,150,310,85) 
    	{
	Label(lb4,"Калькулятор пробега для Ford Focus 3.",0,20);
        Label(lb5,"CPU MC9S12XHZ512, панель Visteon.",0,35);
        Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,50);
        Label(lb3,"и нажмите кнопку <Применить>.",0,65);
    	}
    	Picture(Picture1,"Ford.bmp",200,3,0,0);
}

OnShow 

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

		// проверка корректности дампа (вычисление CRC и сравнение ее со значением в дампе)
		Var12=(@(Var1+1))&0x0F;		// CRC лежаций в дампе
		Var14= Var3;
		Var10=0;			// CRC
		Var10=(Var14&0x0F)^5;
		while(Var23<3)
		{
			// это вместо таблицы; (С) Vasilich & iek
			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
		{message.Color=0xFF0000; message.Bold=1; message="Введите пробег"; Distance=Var43;}
}

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

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

		while(Var3 < 3)
		{
			// это вместо таблицы; (С) Vasilich & iek
			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);	// Младший байт пробега + контролька

		Var1 = 0;		// инидикатор ошибки
		Var13 = Distance % Constant;
		if(Var13 < 32) {Var1 = 1;}
		if(Distance < 32) {Var1 = 1;}
		Var23 = (Distance % 32) + 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 < 32) { // Заполняем дамп, когда значение малого круга является "незначащим"
				@Var5 = Var14; Var5 = Var5 + 1; // Старшие 2 байта пробега
				@Var5 = Var15; Var5 = Var5 + 2; // Младший байт пробега + контролька
				@Var5 = 0x80;					// Это "0" для панели
				Var5 = Var5 + 1;
				Var23 = Var23 + 1;
			}
		}
		else {
			Var13 = (Var13 / 32) * 32;
			while(Var12 < 32) { // Заполнение дампа если пробег больше 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 - 32;}
			}
		}
	
		message.Color = 0xff0000;
		message = Str0;	
	}
}
