[Dashboard\Mitsubishi\Endeavor\Endeavor - 93C66 YNS]

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

Form
{
	Group("Пробег",5,15,120,50)
	{
		Digit(Distance," ",5,18,70);
		Label(lb1,"KM",80,23);
	}
	Group("Информация",5,80,270,45)
	{
		Label(message," ",0,18);
	}
	Group("Описание",5,130,270,100)
	{
		Label(lb4,"Калькулятор пробега для Mitsubishi I.",0,20);
		Label(lb5,"EEPROM: 93C66",0,35);
		Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,50);
		Label(lb3,"и нажмите кнопку <Применить>.",0,65);
	}
	Picture(Picture1,"Mitsubishi.bmp",160,5,0,0);
}

OnShow
{     //разделяем алгоритм до 31 км включительно и от 32 км
	Var15 = 0x1C0;			// Начальный адрес
	Var16 = 0x40;			// Смещение от начального адреса
	Var13 = 32; 			// Коэффициент деления
	Var16 = Var16 + Var15;
	Var0 = (@(Var15 + 1) << 8) | (@Var15);
	if(Var0 = 0)		// работа по алгоритму до 31 км включительно
	{
		Var4 = 0;		// счетчик отличий от нулевого дампа
		Var5 = Var15;
		while(Var5 != Var16)
		{
			Var2 = (@(Var5 + 1) << 8) | (@Var5);
			if(Var2 = 0x0000) {Var4 = Var4 + 1;}
			Var5 = Var5 + 2;
			Var2 = (@(Var5 + 1) << 8) | @Var5;
			if(Var2 = 0xFFFF) {Var4 = Var4  + 1;}
			Var5 = Var5 + 2;
		}
		Distance = Var4 - 1;
	}
	else
	{	// работа по алгоритму от 32 км
		Var6 = ((@(Var16 - 1) << 8) | (@(Var16 - 2))) ^ 0xFFFF; // старшая часть пробега

		// табличный пересчет из дампа продвигающихся значений
		Var1 = Var6 & 0x000F; // маскируем все нибблы, кроме младшего
		if(Var1 = 0x0) {Var2 = 0x0;}
		if(Var1 = 0x7) {Var2 = 0x1;}
		if(Var1 = 0xC) {Var2 = 0x2;}
		if(Var1 = 0xB) {Var2 = 0x3;}
		if(Var1 = 0x6) {Var2 = 0x4;}
		if(Var1 = 0x1) {Var2 = 0x5;}
		if(Var1 = 0xA) {Var2 = 0x6;}
		if(Var1 = 0xD) {Var2 = 0x7;}
		if(Var1 = 0x3) {Var2 = 0x8;}
		if(Var1 = 0x4) {Var2 = 0x9;}
		if(Var1 = 0xF) {Var2 = 0xA;}
		if(Var1 = 0x8) {Var2 = 0xB;}
		if(Var1 = 0x5) {Var2 = 0xC;}
		if(Var1 = 0x2) {Var2 = 0xD;}
		if(Var1 = 0x9) {Var2 = 0xE;}
		if(Var1 = 0xE) {Var2 = 0xF;}
		Var7 = (Var6 & 0xFFF0) + Var2; // перекодировка в линейный вид старшей части пробега

		// расчет добавки
		Var3 = Var13 - 1;
		Var5 = Var15;
		while(Var5 != Var16)
		{
			Var1 = (@(Var5 + 1) << 8) | (@Var5);
			Var9 = (Var5 / 2) & 0x0001; //вычисление знака слова
			if(Var9 = 0)	{Var1 = Var1 & 0x000F;} // маскируем все нибблы, кроме младшего
			else			{Var1 = (Var1 ^ 0xFFFF) & 0x000F;} // инвертируем, маскируем все нибблы, кроме младшего

			// табличный пересчет из дампа продвигающихся значений
			if(Var1 = 0x0) {Var2 = 0x0;}
			if(Var1 = 0x7) {Var2 = 0x1;}
			if(Var1 = 0xC) {Var2 = 0x2;}
			if(Var1 = 0xB) {Var2 = 0x3;}
			if(Var1 = 0x6) {Var2 = 0x4;}
			if(Var1 = 0x1) {Var2 = 0x5;}
			if(Var1 = 0xA) {Var2 = 0x6;}
			if(Var1 = 0xD) {Var2 = 0x7;}
			if(Var1 = 0x3) {Var2 = 0x8;}
			if(Var1 = 0x4) {Var2 = 0x9;}
			if(Var1 = 0xF) {Var2 = 0xA;}
			if(Var1 = 0x8) {Var2 = 0xB;}
			if(Var1 = 0x5) {Var2 = 0xC;}
			if(Var1 = 0x2) {Var2 = 0xD;}
			if(Var1 = 0x9) {Var2 = 0xE;}
			if(Var1 = 0xE) {Var2 = 0xF;}
			Var8 = (Var6 & 0xFFF0) + Var2; // перекодировка в линейный вид младшей части пробега
			if(Var8 > Var7) {Var3 = Var3 + 1;}
			Var5 = Var5 + 2;
		}
		Distance = (Var7 * Var13) + Var3;
	}
	Message.Bold = 1;
	message.Color = 0xFF0000;
	message = "Дамп ОК, нажмите кнопку <Применить>";
}

OnApply
{
	Var4 = Distance;
	if(Var4 > 999999)
	{
		Message.Bold = 1;
		message.Color = 0x0000FF;
		Message = "Пробег должен быть не более 999999 км.";
	}
	else
	{ 	
		Var0 = 0x1C0;	// Начальный адрес
		Var19 = 0x40;	// Смещение от начального адреса
		Var8 = 32;		// Коэффициент деления
		Var18 = Var8 - 1;
		//разделяем алгоритм до 31 км включительно и от 32 км
		if(Var4 <= Var18)
		{
			@Var0 = 0x0; Var0 = Var0 + 1;
			@Var0 = 0x0;  // запись первых двух ячеек
			Var7 = Var4 * 2;
			Var5 = 0; // смещение
			while(Var5 != Var7)
			{
				Var9 = (Var5 / 2) & 0x0001; //вычисление знака слова
				Var6 = (Var0 + 1) + Var5;
				if(Var9 = 1)	{@Var6 = 0x00; Var6 = Var6 + 1; @Var6 = 0x00;}
				else			{@Var6 = 0xFF; Var6 = Var6 + 1; @Var6 = 0xFF;}
				Var5 = Var5 + 2;
			}
			Var19 = Var19 - 2;
			while(Var5 != Var19)
			{
				Var9 = (Var5 / 2) & 0x0001; //вычисление знака слова
				Var6 = (Var0 + 1) + Var5;
				if(Var9 = 1) 	{@Var6 = 0xFE; Var6 = Var6 + 1; @Var6 = 0xFF;}
				else			{@Var6 = 0x01; Var6 = Var6 + 1; @Var6 = 0x00;}
				Var5 = Var5 + 2;
			}
		}
		else
		{
			Var11 = ((Distance - Var18) % Var8) * 2;	// Вычисление добавки
			Var10 = ((Distance - Var18) / Var8); 	// значение младшей части пробега
			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 = Var0 + Var12;
				if (Var9 = 0)	{@Var6 = Var15;	Var6 = Var6 + 1;	@Var6 = Var15 >> 8;			}
				else		{@Var6 = Var15 ^ 0xFF; Var6 = Var6 + 1;	@Var6 = (Var15 >> 8) ^ 0xFF;}
				Var12 = Var12 + 2;
			}
			while(Var12 != Var19)
			{
				Var9 = (Var12 / 2) & 0x0001; //вычисление знака слова
				Var6 = Var0 + Var12;
				if (Var9 = 0) {@Var6 = Var10;	Var6 = Var6 + 1;	@Var6 = Var10 >> 8;			}
				else		{@Var6 = Var10 ^ 0xFF; Var6 = Var6 + 1;	@Var6 = (Var10 >> 8) ^ 0xFF;}
				Var12 = Var12 + 2;
			}
		}
		Message.Bold = 1;
		message.Color = 0xFF0000;
		message = "Дамп ОК. Новый пробег записан.";
	}
}