[Dashboard\Toyota\Soarer\Soarer NDM457C]

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

Form 

{   Group("Пробег",5,5,110,50)
 	{
	Digit(Distance," ",15,18,70);
	}
	Group("Информация",5,88,270,45)
    {Label(message," ",0,18);}
    Group("Описание",5,135,270,100) 
    {
	Label(lb4,"Калькулятор пробега для Toyota Soarer",0,20);
    Label(lb5,"EEPROM NDM457C, панель NipponDenso",0,35);
    Label(lb2,"Введите нужное значение в окне ПРОБЕГ",0,50);
    Label(lb3,"и нажмите кнопку <Применить>.",0,65);
    }
	Picture(Picture1,"Toyota.bmp",160,5,0,0);
}

OnShow

{
	Message.Bold=1; Message.Alignment=1;
    Var0=((@0x41<<8)|(@0x40));
    Var1=((@0x51<<8)|(@0x50));
    
	// вычисление младшей части пробега
	Var2=0; //добавка
	Var3=0; //смещение по словам
	while (Var3<=0x1F) // цикл по словам
		{
		if (Var3=0) {Var5=1;} else {Var5=0;} //смещение по битам внутри слова, если 1ая группа, младший бит не учитываем
		Var4=@(Var3);
		Var3=Var3+1;
		Var4=(Var4)|((@(Var3))<<8);
		Var3=Var3+1;
			while (Var5<=15)		// цикл по битам внутри слова
			{	
			Var6=(Var4>>Var5)&0x0001; // сдвиг и маскирование
			if (Var6=1) {Var2=Var2+1;}
			Var5=Var5+1;
			}
		}
	
	if (Var0!=Var1)	{message.Color=0x0000FF; Message="Неверный дамп!";} 			// проверяем правильность дампа
	else {Distance=(Var0*256)+Var2; message.Color=0xFF0000; message="Дамп ОК. Введите пробег.";} 
	
}

var AddressReal, Address; 

RecodeAddr   	// подпрограмма перекодировки адреса групп при записи младшей части с 15 по 255		

{

	if (Address=0x01) {AddressReal=0x10;}
	if (Address=0x02) {AddressReal=0x08;}
	if (Address=0x03) {AddressReal=0x18;}
	if (Address=0x04) {AddressReal=0x04;}
	if (Address=0x05) {AddressReal=0x14;}
	if (Address=0x06) {AddressReal=0x0C;}
	if (Address=0x07) {AddressReal=0x1C;}
	if (Address=0x08) {AddressReal=0x02;}
	if (Address=0x09) {AddressReal=0x12;}
	if (Address=0x0A) {AddressReal=0x0A;}
	if (Address=0x0B) {AddressReal=0x1A;}
	if (Address=0x0C) {AddressReal=0x06;}
	if (Address=0x0D) {AddressReal=0x16;}
	if (Address=0x0E) {AddressReal=0x0E;}
	if (Address=0x0F) {AddressReal=0x1E;}
}

OnApply

{
	Var4=Distance;
	Distance=Var4;
	if(Var4>999999)	{message.Color=0x0000FF; Message="Пробег должен быть не более 999999.";}
	else
	{
	Var3=Distance/256;
	
	// запись старшей части
	@0x40=Var3;@0x41=Var3>>8;
	@0x50=Var3;@0x51=Var3>>8;
	
	Var11=Distance%256; 									//расчет добавки
	
	if (Var11<=15)											// если пробег не более 15, отдельный алгоритм
		{
		if (Var11<=6) {Var12=0x0001;} else {Var12=0x0000;}	// задание младшего бита	
		Var13=0x0000;
		Var10=0; 											// счетчик
		while (Var10!=Var11)
			{
			Var13=Var13|0x0001;
			Var13=Var13<<1;
			Var10=Var10+1;		
			}
		Var13=Var13|Var12; @0x00=Var13; @0x01=Var13>>8; 	// запись в дамп
		
		// обнуление остальных слов
		Var14=0x02;											// счетчик смещения по словам
		while (Var14<=0x1F)									// цикл по словам		
			{
			@Var14=0x00;
			Var14=Var14+1;
			}	
		}
	
	if (Var11>15)											// если пробег более 15, отдельный алгоритм
		{
		if (Var10<=6) {Var12=0x0001;} else {Var12=0x0000;}	// задание младшего бита	
		Var13=0x0000;
		Var10=0; 											// счетчик
		while (Var10!=15)
			{
			Var13=Var13|0x0001;
			Var13=Var13<<1;
			Var10=Var10+1;		
			}
		Var13=Var13|Var12; @0x00=Var13; @0x01=Var13>>8; 	// запись в дамп
		Var11=Var11-15;										// уменьшаем добавку на то, что записано в 	1ой группе, те на 15
		
		// запись остальных слов добавки
		
		Var30=1;											// номер группы
		while (Var30<=15) 								    // цикл по группам
			{
			Var10=0; 										// счетчик внутри группы
			Var13=0x0000;
			while (Var10<=15)
				{
				if (Var11!=0) {Var13=Var13<<1;Var13=Var13|0x0001;Var11=Var11-1;}
				Var10=Var10+1;
				}
			Address=Var30; RecodeAddr; Var31=AddressReal+1;	// пересчитываем адреса групп
			@AddressReal=Var13; @Var31=Var13>>8; 			// запись в дамп	
			Var30=Var30+1;									// переход к следующей группе
			}
		}
		
	// дополнительный цикл записи области 0x20-0x3F
	Var40=0x20; 											// смещение
	while (Var40<=0x3F)
		{
		@Var40=@0x1E;										// дублируем данные, взятые с адресов 0x1E и 0x1F;					
		Var40=Var40+1;
		@Var40=@0x1F;
		Var40=Var40+1;
		}	
	message.Color=0xFF0000;	message="Дамп ОК. Новый пробег записан.";
	}
}

