[Dashboard\All Rovers\Freelander 2 35080]

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

Form
{
    Group("Пробег",5,5,140,50)
    {
        Digit(Distance," ",5,18,90);
        Label(lb1,"км",110,20);
    }
    Group("Информация",5,58,270,45)
    {
        Label(message," ",0,18);
    }
    Group("Описание",5,105,270,100) 
    {
        Label(lb4,"Калькулятор пробега для Freelander 2",0,20);
        Label(lb5,"EEPROM 35080",0,35);
        Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,55);
        Label(lb3,"и нажмите кнопку <Применить>.",0,70);
    }
    Picture(Picture1,"Lrover.bmp",180,5,0,0);
}

OnShow

{
		Message.Bold=1; Message.Alignment=1;
        // 	проверяем правильность дампа
		Var0=((@0x3E<<8)|(@0x3F));
		if(Var0!=0xFFFF)
        {
		Var4=0; // точное вычисление пробега, добавка
		Var5=0; // точное вычисление пробега, смещение
		while(Var5<=0x3F)
			{	
			Var7=(@(Var5)<<8)|(@(Var5+1));
			if(Var7>Var0) {Var4=Var4+2;}
			Var5=Var5+2;
			}
		Distance=(Var0*32)+Var4;
        message.Color=0xFF0000;
        message="Дамп ОК. Введите пробег.";
        }
		else
		{
        message.Color=0x0000FF; Message="Неверный дамп!"; Distance=0;   
		}
}


OnApply

{
    if(Distance>999999) {message.Color=0x0000FF; Message="Пробег должен быть не более 999999 км.";}
    else
    {
        // запись пробега
		Var3=(Distance%2);
		if (Var3=1) {Distance=Distance-1;}
        Var0=Distance/32;
        Var1=0x20+(Distance%32); // Вычисление добавки
        Var2=0x20;
		//запись старшей группы
		while(Var2<Var1) 
			{	
			@Var2=(Var0+1)>>8;
			Var2=Var2+1;
		    @Var2=Var0+1;
			Var2=Var2+1; 
			}
		//запись младшей группы
		while(Var2<=0x3E) 
			{	
			@Var2=Var0>>8;
			Var2=Var2+1;
	        @Var2=Var0;
			Var2=Var2+1; 
			}
				
		// запись сервиса	
		Var4=Distance+30;} // сервис больше пробега на 30км!
    
		Var4=Var4/2;
		//разделяем алгоритм до 15 км включительно и от 16 км 
		if(Var4<=15)
		{
			@0x40=0x0; @0x41=0x0;  // запись первых двух ячеек
			Var7=Var4*2;
			Var5=0; // смещение
			while(Var5!=Var7) 
			{
				Var9=(Var5/2)&0x0001; //вычисление знака слова
				Var6=0x42+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=0x42+Var5;
				if (Var9=1) 	{@Var6=0xFE;Var6=Var6+1;@Var6=0xFF;}
				else		{@Var6=0x01;Var6=Var6+1;@Var6=0x00;}
				Var5=Var5+2;
			}		
		}
		else
		{
		Var11=((Var4-15)%16)*2;	// Вычисление добавки
		Var10=((Var4-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=0x40+Var12;
 				if (Var9=0) 	{@Var6=Var15>>8;			Var6=Var6+1;	@Var6=Var15;		}
				else			{@Var6=(Var15>>8)^0xFF; 	Var6=Var6+1;	@Var6=Var15^0xFF;	}	
				Var12=Var12+2;
			}
			while(Var12!=32) 
			{
				Var9=(Var12/2)&0x0001; //вычисление знака слова
				Var6=0x40+Var12;
	 			if (Var9=0) 	{@Var6=Var10>>8;	   		Var6=Var6+1;	@Var6=Var10;		}
				else			{@Var6=(Var10>>8)^0xFF; 	Var6=Var6+1;	@Var6=Var10^0xFF;	}	
				Var12=Var12+2;
			}
		}
		message.Color=0xFF0000; message="Новый пробег записан, сервис сброшен.";

    }
}









