[Dashboard\Volvo\S40 93c56 UKNSI]

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

Form 

{   Group("Пробег",5,5,110,50)
 	{
	Digit(Distance," ",15,18,50);
	}
     	Group("Информация",5,88,310,45)
    	{Label(message," ",0,18);}
    	Group("Описание",5,135,310,100) 
    	{
		Label(lb4,"Калькулятор пробега для Volvo S40.",0,20);
		Label(lb1,"2003-2007 г.",0,35);
        Label(lb5,"Панель UKNSI, EEPROM 93C56.",0,50);
        Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,65);
        Label(lb3,"и нажмите кнопку <Применить>.",0,80);
    	}
    Picture(Picture1,"Volvo.bmp",170,15,0,0);
   	
}


OnShow
{   
	Message.Bold=1; Message.Alignment=1;
    //разделяем алгоритм до 15 км включительно и от 16 км
        Var0=(@(0xE1)<<8)|(@(0xE0));
        if(Var0=0) // работа по алгоритму до 15 км включительно
        {
		Var4=0; // счетчик отличий от нулевого дампа
		Var5=0xE0; // точное вычисление пробега, смещение
			while(Var5!=0x100)
				{
				Var2=(@(Var5+1)<<8)|(@Var5);
				if(Var2=0x0000) {Var4=Var4+1;}
				Var5=Var5+2;
				Var2=(@(Var5+1)<<8)|(@Var5);
				if(Var2=0xFFFF) {Var4=Var4+1;}
				Var5=Var5+2;
				}
	Distance=Var4-1;
     	}
	else 
	{// работа по алгоритму от 16 км
		Var6=((@(0xFF)<<8)|(@0xFE))^0xFFFF; // старшая часть пробега

			// табличный пересчет из дампа продвигающихся значений
			Var1=Var6&0x000F; // маскируем все нибблы, кроме младшего
			if(Var1=0x0) {Var2=0x0;}   
			if(Var1=0x7) {Var2=0x1;}   
			if(Var1=0xC) {Var2=0x2;}   
			if(Var1=0xB) {Var2=0x3;}   
			if(Var1=0x6) {Var2=0x4;}   
			if(Var1=0x1) {Var2=0x5;}   	
			if(Var1=0xA) {Var2=0x6;}   
			if(Var1=0xD) {Var2=0x7;}   
			if(Var1=0x3) {Var2=0x8;}   
			if(Var1=0x4) {Var2=0x9;}   
			if(Var1=0xF) {Var2=0xA;}   
			if(Var1=0x8) {Var2=0xB;}   
			if(Var1=0x5) {Var2=0xC;}   
			if(Var1=0x2) {Var2=0xD;}   
			if(Var1=0x9) {Var2=0xE;}   
			if(Var1=0xE) {Var2=0xF;}   
			Var7=(Var6&0xFFF0)+Var2; // перекодировка в линейный вид старшей части пробега

			// расчет добавки

			Var3=15; 
			Var5=0xE0; // точное вычисление пробега, смещение	
			while(Var5!=0x100)
				{
				Var1=(@(Var5+1)<<8)|(@Var5);
					Var9=(Var5/2)&0x0001; //вычисление знака слова
						if (Var9=0) 	{Var6=Var1; Var1=Var6&0x000F;} // маскируем все нибблы, кроме младшего
						else        	{Var6=Var1^0xFFFF; Var1=Var6&0x000F;} // инвертируем, маскируем все нибблы, кроме младшего
		
					// табличный пересчет из дампа продвигающихся значений
					if(Var1=0x0) {Var2=0x0;}   
					if(Var1=0x7) {Var2=0x1;}   
					if(Var1=0xC) {Var2=0x2;}   
					if(Var1=0xB) {Var2=0x3;}   
					if(Var1=0x6) {Var2=0x4;}   
					if(Var1=0x1) {Var2=0x5;}   	
					if(Var1=0xA) {Var2=0x6;}   
					if(Var1=0xD) {Var2=0x7;}   
					if(Var1=0x3) {Var2=0x8;}   
					if(Var1=0x4) {Var2=0x9;}   
					if(Var1=0xF) {Var2=0xA;}   
					if(Var1=0x8) {Var2=0xB;}   
					if(Var1=0x5) {Var2=0xC;}   
					if(Var1=0x2) {Var2=0xD;}   
					if(Var1=0x9) {Var2=0xE;}   
					if(Var1=0xE) {Var2=0xF;}      
					Var8=(Var6&0xFFF0)+Var2; // перекодировка в линейный вид младшей части пробега
				if(Var8>Var7) {Var3=Var3+1;}
				Var5=Var5+2;
				}
			Distance=((Var7*16)+Var3)*2;	
	}
}

OnApply

{
	Var100=Distance/2;
	Var4=Var100;
            
	   	if(Var4>999999)
    	{
        message.Color=0x0000FF;
        Message="Пробег должен быть не более 999999 км.";
    	}
	else
	{ //разделяем алгоритм до 15 км включительно и от 16 км 
		if(Var4<=15)
		{
			@0xE0=0x0; @0xE1=0x0;  // запись первых двух ячеек
			Var7=Var4*2;
			Var5=0; // смещение
			while(Var5!=Var7) 
			{
				Var9=(Var5/2)&0x0001; //вычисление знака слова
				Var6=0xE2+Var5;
 				if (Var9=1) 	{@Var6=0x00;Var6=Var6+1;@Var6=0x00;}
				else		{@Var6=0xFF;Var6=Var6+1;@Var6=0xFF;}
				Var5=Var5+2;
			}
			while(Var5!=30) 
			{
				Var9=(Var5/2)&0x0001; //вычисление знака слова
				Var6=0xE2+Var5;
				if (Var9=1) 	{@Var6=0xFE;Var6=Var6+1;@Var6=0xFF;}
				else		{@Var6=0x01;Var6=Var6+1;@Var6=0x00;}
				Var5=Var5+2;
			}		
		}
		else
		{
		Var11=((Var100-15)%16)*2;	// Вычисление добавки
		Var10=((Var100-15)/16); 	// значение младшей части пробега
		Var15=Var10+1;			// значение старшей части пробега

			// табличный пересчет в дамп младшего ниббла младшей части пробега
			Var1=Var10&0x000F; // маскируем все нибблы, кроме младшего				
			if(Var1=0x0) {Var2=0x0;}   
			if(Var1=0x1) {Var2=0x7;}   
			if(Var1=0x2) {Var2=0xC;}   
			if(Var1=0x3) {Var2=0xB;}   
			if(Var1=0x4) {Var2=0x6;}   
			if(Var1=0x5) {Var2=0x1;}   	
			if(Var1=0x6) {Var2=0xA;}   
			if(Var1=0x7) {Var2=0xD;}   
			if(Var1=0x8) {Var2=0x3;}   
			if(Var1=0x9) {Var2=0x4;}   
			if(Var1=0xA) {Var2=0xF;}   
			if(Var1=0xB) {Var2=0x8;}   
			if(Var1=0xC) {Var2=0x5;}   
			if(Var1=0xD) {Var2=0x2;}   
			if(Var1=0xE) {Var2=0x9;}   
			if(Var1=0xF) {Var2=0xE;}      
			Var10=(Var10&0xFFF0)+Var2; // перекодировка в линейный вид младшей части пробега

			// табличный пересчет в дамп младшего ниббла старшей части пробега
			Var1=Var15&0x000F; // маскируем все нибблы, кроме младшего				
			if(Var1=0x0) {Var2=0x0;}   
			if(Var1=0x1) {Var2=0x7;}   
			if(Var1=0x2) {Var2=0xC;}   
			if(Var1=0x3) {Var2=0xB;}   
			if(Var1=0x4) {Var2=0x6;}   
			if(Var1=0x5) {Var2=0x1;}   	
			if(Var1=0x6) {Var2=0xA;}   
			if(Var1=0x7) {Var2=0xD;}   
			if(Var1=0x8) {Var2=0x3;}   
			if(Var1=0x9) {Var2=0x4;}   
			if(Var1=0xA) {Var2=0xF;}   
			if(Var1=0xB) {Var2=0x8;}   
			if(Var1=0xC) {Var2=0x5;}   
			if(Var1=0xD) {Var2=0x2;}   
			if(Var1=0xE) {Var2=0x9;}   
			if(Var1=0xF) {Var2=0xE;}      
			Var15=(Var15&0xFFF0)+Var2; // перекодировка в линейный вид младшей части пробега		
		 		
			Var12=0; // смещение
			while(Var12!=Var11) 
			{
				Var9=(Var12/2)&0x0001; //вычисление знака слова
				Var6=0xE0+Var12;
 				if (Var9=0) 	{@Var6=Var15;	   Var6=Var6+1;	@Var6=Var15>>8;		}
				else		{@Var6=Var15^0xFF; Var6=Var6+1;	@Var6=(Var15>>8)^0xFF;	}	
				Var12=Var12+2;
			}
			while(Var12!=32) 
			{
				Var9=(Var12/2)&0x0001; //вычисление знака слова
				Var6=0xE0+Var12;
	 			if (Var9=0) 	{@Var6=Var10;	   Var6=Var6+1;	@Var6=Var10>>8;		}
				else		{@Var6=Var10^0xFF; Var6=Var6+1;	@Var6=(Var10>>8)^0xFF;	}	
				Var12=Var12+2;
			}
		}
	Message.Bold=1; Message.Alignment=1;		
	message.Color=0xFF0000;
	message="Дамп ОК. Новый пробег записан.";
	}
}
