[Dashboard\BMW\E36\E36 Z3 93S56.cal]
Size(280,370); // ширина и высота

Form
{
    Group("Пробег",5,10,110,50)
    {
	Digit(Distance," ",5,18,50);
    Label(lb1,"км",80,20);
    }
    Group("Идентификация",5,65,270,100)
    {
    Label(type," ",0,20);
    //Label(nr," ",0,35);
	//Label(fg," ",0,50);
    //Label(nr," ",0,65);
    } 
    Group("Информация",5,170,270,45)
    {
    Label(message," ",0,18);
    }
    Group("Описание",5,220,270,100) 
    {
    Label(lb4,"Калькулятор пробега для BMW E36 Z3",0,20);
    Label(lb5,"EEPROM 93S56",0,35);
    Label(lb2,"Введите нужное значение в окне <Пробег>.",0,55);
    Label(lb3,"и нажмите кнопку <Применить>.",0,70);
    }
    Picture(Picture1,"BMW.bmp",160,6,0,0);
}

var Mask1_sw09_sw10, Mask2_sw09_sw10;

DefMask

{
	// определим маски
	Mask1_sw09_sw10=0x293700;
	Mask2_sw09_sw10=0x390E43;
}

OnShow 

{
	Message.Bold=1; Message.Alignment=1;
	type.Bold=1;type.Alignment=1;
	DefMask; 							// вызов процедуры
	
    Var2=@0x40; Var1=@0x41; Var4=@0x42; Var3=@0x43; Var6=@0x44; Var5=@0x45;
	Var10=(((Var1)<<16)|((Var2)<<8)|Var3); 	// чтение из дампа первых трех ячеек с пробегом
	Distance=1000000;
	
	// определение алгоритма
	Var11=((Var1^Var4)<<8)|(Var2^Var5);		// признак алгоритма
	if (Var11=0x390E) {type="SW09 или SW10"						; Distance=(Var10^Mask1_sw09_sw10)/2;				}
	if (Distance=1000000) {message.Color=0x0000FF; Message="Неверный дамп или тип панели!"; Distance=0; } else { message.Color=0xFF0000; message="Дамп ОК. Введите пробег.";}
}

OnApply

{
    if(Distance>999999)	{message.Color=0x0000FF; Message="Пробег должен не более 999999 км.";}
    else
    {
	// наложим маску
	Var0=(Distance*2)^0x21580C;
	Var1=Var0^0x316142;
		
	@0x41=Var0>>16; @0x40=Var0>>8; @0x43=Var0; @0x42=Var1>>16; @0x45=Var1>>8; @0x44=Var1;
	@0x47=Var0>>16; @0x46=Var0>>8; @0x49=Var0; @0x48=Var1>>16; @0x4B=Var1>>8; @0x4A=Var1;	 
	
	message.Color=0xFF0000; message="Дамп ОК. Новый пробег записан.";	
 	}
}
