[US-Euro converter\Lexus\RX400h\RX400h US-EU dash.cal]

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

Form 
{	Group("Пробег",5,5,150,50){Digit(Distance," ",5,20,90);}
	Group ("Конверсия",5,55,150,50)	{ComboBox(cbx1," ",5,20,125,"Без Конверсии","Мили в Км до 2007г.","Мили в Км 2008г","Км в Мили");}
	Group("Информация",5,110,310,45)	{Label(message," ",0,20);}
	Group("",165,75,150,30) {CheckBox(RecalcDistance,"Пересчитать пробег",5,10);
	}	
    	Group("Описание",5,155,310,80) 
    	{
	Label(lb1,"Калькулятор для конверсии Lexus RX400h Dash 93C46.",0,15);
        Label(lb2,"2005-2008 г.",0,30);
	Label(lb3,"EEPROM 93C46, панель Denso.",0,45);
        Label(lb4,"Выберите Вариант и Нажмите Кнопку <Применить>.",0,60);
    	}
    	Picture(Picture1,"Lexus.bmp",190,15,0,0);
}


OnShow

{
	cbx1=0;
    Message.Bold = 1;
    Message.Alignment = 1;
    
    // --------------- проверяем правильность дампа
    Var0=0; 		
    Var1=(@0xB<<24) |(@0xA<<16) |(@0x9<<8) |@0x8;
    Var2=(@0xF<<24) |(@0xE<<16) |(@0xD<<8) |@0xC;
    Var3=(@0x13<<24)|(@0x12<<16)|(@0x11<<8)|@0x10;
    if(Var1!=Var2) {Var0=Var0+1;}
    if(Var2!=Var3) {Var0=Var0+1;}
    if(Var0!=0) 
	{ 
      	message.Color = 0x0000FF;
      	Message = "Неверный дамп!";
    	}
    	else
    	{
	Var1=Var1^0xFFFFFFFF;
        // переводим в двоично-десятичный вид
	Var0=((Var1>>28)&15)*10000000;
	Var0=Var0+(((Var1>>24)&15)*1000000);
	Var0=Var0+(((Var1>>20)&15)*100000);
	Var0=Var0+(((Var1>>16)&15)*10000);
	Var0=Var0+(((Var1>>12)&15)*1000);
	Var0=Var0+(((Var1>>8)&15)*100);
	Var0=Var0+(((Var1>>4)&15)*10);
	Var0=Var0+(Var1&15);
	// точное вычисление пробега, добавка
		Var5=0; // точное вычисление пробега, смещение
			while(Var5<=0x06)
				{	
				Var6=(@(Var5);
				if(Var6!=0xFF){Var0=Var0+1;}
				Var5 = Var5+2;
				}
	   

	Var10=@0x7F;
	if (Var10=0xFD) {message.Color=0xFF0000;message="Дамп в Км, нажмите кнопку <Применить>";Var10=0;}	
	if (Var10=0xF9) {message.Color=0xFF0000;message="Дамп в Км, нажмите кнопку <Применить>";Var10=0;}	
	if (Var10=0xFE) {message.Color=0xFF0000;message="Дамп в Милях, нажмите кнопку <Применить>";Var10=0;}	
	if (Var10=0)    {Distance=Var0;} else {message.Color=0x0000FF;message="Неверный Дамп!";}	
	
    }
}

OnApply

{	if(RecalcDistance=1)
	{	
	if(cbx1=0) {Var4=Distance;}
	if(cbx1=1) {Var4=(Distance*16093)/10000;}
	if(cbx1=2) {Var4=(Distance*16093)/10000;}
	if(cbx1=3) {Var4=(Distance*1000000)/16093; Var14=Var4%100; if (Var14<50) {Var4=Var4/100;} else {Var4=(Var4/100)+1;}}
	}
	else {Var4=Distance;}
	Distance=Var4;
    	if(Var4>999999)
    	{
        message.Color=0x0000FF;
        Message="Пробег должен быть не более 999999 км.";
    	}
    	else
	{
	if(cbx1=1) {@0x7D=0xFD;@0x7E=0xFD;@0x7F=0xFD;}
	if(cbx1=2) {@0x7D=0xF9;@0x7E=0xF9;@0x7F=0xF9;}
	if(cbx1=3) {@0x7D=0xFE;@0x7E=0xFE;@0x7F=0xFE;}
        Var1=(Distance%5)*2; // вычисление добавки
	// запись добавки
		Var5=0; // смещение
			while(Var5<Var1)
				{  	
				@Var5=0x80;
				Var5=Var5+2;
				}
			while(Var5<0x07)
				{  	
				@Var5=0xFF;
				Var5=Var5+2;
				}		
	
        
	// запись основной части	 
	// переводим из двоично-десятичного в двоичный вид
        Var0=Distance-(Distance%5);
	Var2=Var0%10; Var0=Var0/10;
	Var2=Var2|((Var0%10)<<4); Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<8); Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<12);Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<16);Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<20);Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<24);Var0=Var0/10;  
	Var2=Var2|((Var0%10)<<28);  

	Var2=Var2^0xFFFFFFFF;
	// заполняем дамп
        Var0=0x0b;
        
	@Var0=Var2>>24;Var0=Var0-1;
	@Var0=Var2>>16;Var0=Var0-1;
	@Var0=Var2>>8 ;Var0=Var0-1;
	@Var0=Var2&255;Var0=Var0-1;

        Var0=0x0F;
        
	@Var0=Var2>>24;Var0=Var0-1;
	@Var0=Var2>>16;Var0=Var0-1;
	@Var0=Var2>>8 ;Var0=Var0-1;
	@Var0=Var2&255;Var0=Var0-1;

        Var0=0x13;
        
	@Var0=Var2>>24;Var0=Var0-1;
	@Var0=Var2>>16;Var0=Var0-1;
	@Var0=Var2>>8 ;Var0=Var0-1;
	@Var0=Var2&255;Var0=Var0-1;
    
	message.Color=0xFF0000;
        message="Дамп ОК. Новый пробег записан.";
	}
}
