[Dashboard\Nissan\Safari - 93C56 Kansey]

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

Form
{
	Group("Пробег",5,5,140,50)
	{
		Digit(Distance," ",10,18,60);
		Label(lb1,"KM",80,23);
	}
	Group("Информация",5,60,270,45)
	{
		Label(Message," ",0,18);
	}
	Group("Описание",5,110,270,100) 
	{
		Label(lb4,"Калькулятор пробега для Nissan Safari.",0,20);
		Label(lb5,"EEPROM 93C56 (Kansey)",0,35);
		Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,60);
		Label(lb3,"и нажмите кнопку <Применить>.",0,75);
	}
	Picture(Logo,"Nissan.bmp",170,0,0,0);
}

Var Address, StartAddr, EndAddr, Error;

OnShow
{
	Message.Bold = 1;
	Message.Alignment = 1;
	Distance = 0;

	// --------------- проверяем правильность дампа
	Address = 0x6A;
	StartAddr = Address;
	EndAddr = StartAddr + 0x06;
	Var10 = 0;					// суммарный пробег
	Error = 0;					// индикатор ошибки
	Var8 = 1;					// маска для суммарного пробега

	while(StartAddr < EndAddr)
	{
		Var1 = (@(StartAddr + 1) << 8) | @StartAddr;        // слово пробега

		if((Var1 & 0x8000) = 0) { Error = 1; }
		Var5 = 5;                           // счетчик троек бит 
		while(Var5 != 0)
		{
			if((Var1 & 7) != 7) { if((Var1 & 7) != 0) { Error = 1;} }
			else                { Var10 = Var10 | Var8; }
			Var1 = Var1 >> 3;
			Var8 = Var8 << 1;
			Var5 = Var5 - 1;
		}
		StartAddr = StartAddr + 2;
	}
	// ------------ подсчет десятков километров
	Var1 = 0x50;
	Var5 = 0;
	Var6 = 0;
	Var8 = 0;
	while(Var8 = 0)
	{
		Var2 = (@Var1 << 8) | @(Var1 + 1);
		if(Var2 != 0xFFFF)
		{
			if(Var2 = 0xC7FF) {Var5 = Var5 + 1; Var6 = 1;}
			if(Var2 = 0x3FFE) {Var5 = Var5 + 2; Var6 = 1;}
			if(Var2 = 0xFFF1) {Var5 = Var5 + 3; Var6 = 1;}
			if(Var2 = 0xFF8F) {Var5 = Var5 + 4; Var6 = 1;}
			if(Var6 = 0) {Var0 = 1;}
			Var8 = 1;
		}
		else
		{
			Var5 = Var5 + 5;
			Var1 = Var1 + 2;
			Var3 = Var3 + 2;
			if(Var1 > 0x69)
			{   
				Var0 = 1;
				Var8 = 1;
			}
		} 
	}
    Var10 = (Var10 << 6) + Var5;

	if(Error != 0)
	{
		// ошибка в записи пробега
		Message.Color = 0x0000FF;
		Message = "Неверный дамп !";
	}
	else
	{
		// переводим единицы отсчета в километры
		Var10 = (Var10 * 838857) / 1000000;
		if(Var10 > 1000000)
		{
			Var10 = Var10 + 1 - 1000000;
		}
		Message.Color = 0xFF0000;
		Message = "Дамп ОК. Введите новый пробег."; 
		Distance = Var10;
	}
}

OnApply
{
	Error = 0;       // индикатор ошибки

	if(Distance < 1)      { Error = 1; }
	if(Distance > 999900)   { Error = 1; }
	if(Error != 0)
	{
		// неверное значение пробега
		Message.Color = 0x0000FF;
		Message = "Пробег должен быть от 100 до 999900 км.";
	}
	else
	{
		// заполняем область пробега значениями FF
		Var0 = 0x50;
		while(Var0 != 0x70)
		{
			@Var0 = 0xFF;
			Var0 = Var0 + 1;
		}

		// преобразуем километры в единицы отсчета
		Address = 0x6A;
		Var0 = 0x00;
		Var2 = 0x00;

		Var10 = (Distance * 1000000) / 838857;
		Var10 = (Var10 >> 6); // - 1;

		Var21 = Var10;

		while(Var0 < 3)
		{
			Var1 = Var10 & 0x1F;
			Var2 = 0;
			Var11 = 0;
			Var99 = 0x8000;

			while(Var11 < 5)
			{
				Var77 = 0;
				Var6 = Var1 & 0x01;
				if(Var6 = 1) { Var77 = Var77 | 7; }
				else { Var77 = Var77 | 0; }
				Var77 = Var77 & 0x7;
				Var77 = Var77 << (Var2 * 3); 
				Var99 = Var99 | Var77;
				Var2 = Var2 + 1;
				Var1 = Var1 >> 1; 
				Var11 = Var11 + 1; 
			}
			Var10 = Var10 >> 5;
			@Address = Var99; Address = Address + 1;
			@Address = Var99 >> 8; Address = Address + 1;
			Var0 = 	Var0 + 1; 
		}
		// ------- Попытка поставить точный пробег (в реальности пробег может занижаться от 1 до 7 км)
		Var21 = Var21 << 6;		
		Var21 = (Var21 * 838857) / 1000000;
		Var10 = (Distance - Var21) + 1;

		Var1 = 0x50 + ((Var10 / 5) * 2);        // смещение от адреса 0x50
		Var2 = Var10 % 5;        // остаток от деления на 5
		if(Var2 = 5) {Var2 = 4;}
		if(Var2 = 0) {Var2 = 1;}

		Var3 = (0x0007 << (Var2 * 3));
		Var3 = Var3 ^ 0xFFFF;

		@Var1 = Var3 & 255; Var1 = Var1 + 1;
		@Var1 = Var3 >> 8;
		Message.Color = 0x000000;
		Message = "Дамп OK. Новый пробег записан.";
	}        
}