[Dashboard\Peugeot\207\BSI 24c128 Var1]

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

Form
{
    Group("Пробег",15,13,120,50)
	{
		Digit(Distance," ",5,18,70);
		Label(lbkm,"КМ",90,20);
	}
	CheckBox(ClearHistory, "Очистить историю",15,70);
	Group("Идентификация",5,90,270,50)
	{
		Label(pn," ",0,15);
		Label(Login," ",0,32);
	}
	Group("Информация",5,142,270,45)
	{
		Label(msg," ",0,18);
	}    
	Group("Описание",5,190,270,85)
    {
        Label(lb1,"Калькулятор пробега для Peugeot 207 BSI.",0,20);
        Label(lb2,"EEPROM 24C128.",0,35);
        Label(lb3,"Введите нужное значение в окне ПРОБЕГ.",0,50);
        Label(lb4,"Нажмите кнопку <Применить>.",0,65);
    }
    Picture(Logo,"Peugeot.bmp",160,10,0,0);
}

Var Counter, CRC, TempCRC, TempDist, MaxDist, Error;
Var AddrVIN, AddrPIN, Address, StartAddr, EndAddr, TempAddr;

OnShow 
{
    Var0 = 0;		// Пробег
    Error = 0;		// Индикатор ошибки
    Address = 0x4EE;	// Начальный адрес пробега

    Var9 = 0;
    Var4 = 0;

    while(Var9 < 8)
    {
		Var10 = (@(Address + 2) << 8) | (@(Address + 1) << 16) | (@(Address + 3)); // Пробег 
		Var10 = Var10 ^ 0xFFFFFF;
		if(Var0 < Var10) {Var0 = Var10;} // Ищем максимальный пробег
		
		Var4 = (@Address + @(Address + 1) + @(Address + 2) + @(Address + 3) + @(Address + 4)) & 0xFF;
		Var4 = Var4 + 3;
        Var14 = @(Address + 5) ^ 0xFF;
        if(Var4 != Var14) { Error = 1; Var9 = 8;}
		else
		{
			Address = Address + 6; // Начальный адрес следующей копии пробега
			Var9 = Var9 + 1;
		}
    } 

    if(Error != 0)
    {
        msg.Color = 0xFF;
        msg.Bold = 1;
        msg = "Неверный дамп!";
        Distance = Var14;
    }
    else
    {
		AddrVIN = 0x2DA;
		Var1 = @(AddrVIN) ^ 0xFF; Var2 = @(AddrVIN + 1) ^ 0xFF; Var3 = @(AddrVIN + 2) ^ 0xFF; Var4 = @(AddrVIN + 3) ^ 0xFF;
		Var5 = @(AddrVIN + 4) ^ 0xFF; Var6 = @(AddrVIN + 5) ^ 0xFF; Var7 = @(AddrVIN + 6) ^ 0xFF;
		Var8 = @(AddrVIN + 7) ^ 0xFF; Var9 = @(AddrVIN + 8) ^ 0xFF; Var10 = @(AddrVIN + 9) ^ 0xFF; Var11 = @(AddrVIN + 10) ^ 0xFF;
		Var12 = @(AddrVIN + 11) ^ 0xFF; Var13 = @(AddrVIN + 12) ^ 0xFF; Var14 = @(AddrVIN + 13) ^ 0xFF;
		Var15 = @(AddrVIN + 14) ^ 0xFF; Var16 = @(AddrVIN + 15) ^ 0xFF; Var17 = @(AddrVIN + 16) ^ 0xFF;
		pn = "VIN: " + #c.Var1 + #c.Var2 + #c.Var3 + #c.Var4 + #c.Var5 + #c.Var6 + #c.Var7 + #c.Var8 + #c.Var9 + #c.Var10 +
			#c.Var11 + #c.Var12 + #c.Var13 + #c.Var14 + #c.Var15 + #c.Var16 + #c.Var17;

		AddrPIN = 0xB82;
		Var1 = @(AddrPIN) ^ 0xFF; Var2 = @(AddrPIN + 1) ^ 0xFF; Var3 = @(AddrPIN + 2) ^ 0xFF; Var4 = @(AddrPIN + 3) ^ 0xFF;
		Login = "LOGIN: " + #c.var4 + #c.var3 + #c.var2 + #c.var1;

        msg.Color = 0xFF0000;
        msg.Bold = 1;
        msg = "Дамп OK! Введите новый пробег.";
        Distance = Var0 / 10;
    }
}

OnApply 
{
    Var10 = Distance;
    Error = 0;
    if(Var10 < 0)     {Error = 1;}
    if(Var10 > 999900)  {Error = 1;}

    if(Error = 1)
    {
        msg.Color = 0x0000FF;
        msg.Bold = 1;
        msg = "Пробег должен быть от 100 до 999900 км";        
    }
    else
    {
		if(ClearHistory = 1)
		{
			// Чистим историю
			Var0 = 0x1400;
			while(Var0 < 0x4000)
			{
				Var1 = @Var0;
				if(Var1 != 0xFF) {@Var0 = 0xFF;}
				Var0 = Var0 + 1;
			}
		}

        Var5 = Address; // Начальный адрес
        Var11 = 0;
        Var10 = Var10 * 10;    
          
        Var1 = (Var10 & 0xFF) ^ 0xFF; 
        Var2 = ((Var10 >> 8) & 0xFF) ^ 0xFF; 
        Var3 = ((Var10 >> 16) & 0xFF) ^ 0xFF; 
		Var4 = ((Var10 >> 24) & 0xFF) ^ 0xFF; 
		
        while (Var11 < 8)
		{
			Var14 = @(Var5 + 4);
			Var15 = (Var1 + Var2 + Var3 + Var4 + Var14) & 0xFF; // Контролька
			@Var5 = Var4;  Var5 = Var5 + 1;
			@Var5 = Var3;  Var5 = Var5 + 1;
			@Var5 = Var2;  Var5 = Var5 + 1;
			@Var5 = Var1;  Var5 = Var5 + 1;
			@Var5 = (Var14 + 3) ^ 0xFF; Var5 = Var5 + 1;
			@Var5 = Var15; Var5 = Var5 + 1;

			Var11 = Var11 + 1;
		} 
		// заполняем дамп

		msg.Color = 0xFF0000;
		msg.Bold = 1;
		msg = "Новый пробег записан!";
    }
}