[Dashboard\Nissan\Nissan Maxima 1997/99 (93C46) ver. 2 (мили)]

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

Form
{
    Group("Пробег",5,5,270,50)
    {
        Digit(Distance," ",80,18,100);
        Label(lb1,"KM",190,20);
    }
    Group("Информация",5,58,270,45)
    {
        Label(message,"",10,17);
    }
    Group("Описание",5,105,270,100) 
    {
        Label(lb4,"Калькулятор пробега для Nissan Maxima 1997/99.",10,15);
        Label(lb5,"EEPROM 93C46",90,30);
        Label(lb2,"Введите нужное значение в окне ПРОБЕГ",30,55);
        Label(lb3,"и нажмите кнопку <Применить>.",50,70);
    }
}

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

    // --------------- проверяем правильность дампа

    Var10 = 0;                          // суммарный пробег
    Var0 = 0;                           // индикатор ошибки

    Var1 = (@0x6A << 8) | @0x6B;        // младшее слово пробега

    if((Var1 & 0x8000) = 0) { Var0 = 1; }
    Var5 = 5;                           // счетчик троек бит 
    Var8 = 1;                           // маска для суммарного пробега
    while(Var5 != 0)
    {
        if((Var1 & 7) != 7) { if((Var1 & 7) != 0) { Var0 = 1;} }
        else                { Var10 = Var10 | Var8; }
        Var1 = Var1 >> 3;
        Var8 = Var8 << 1;
        Var5 = Var5 - 1;
    }

    Var1 = (@0x6C << 8) | @0x6D;           
    if((Var1 & 0x8000) = 0) { Var0 = 1; }
    Var5 = 5;                               // счетчик троек бит 

    while(Var5 != 0)
    {
        if((Var1 & 7) != 7) { if((Var1 & 7) != 0) { Var0 = 1;} }
        else                { Var10 = Var10 | Var8; }
        Var1 = Var1 >> 3;
        Var8 = Var8 << 1;
        Var5 = Var5 - 1;
    }

    Var1 = (@0x6E << 8) | @0x6F;            // старшее слово пробега
    if((Var1 & 0x8000) = 0) { Var0 = 1; }
    Var5 = 5;                               // счетчик троек бит 

    while(Var5 != 0)
    {
        if((Var1 & 7) != 7) { if((Var1 & 7) != 0) { Var0 = 1;} }
        else                { Var10 = Var10 | Var8; }
        Var1 = Var1 >> 3;
        Var8 = Var8 << 1;
        Var5 = Var5 - 1;
    }
    // ------------ подсчет десятков километров

    Var1 = 0x50;
    Var3 = 0x51;
    Var5 = 0;
    Var8 = 0;
    while(Var8 = 0)
    {
        Var2 = (@Var1 << 8) | @Var3;
        if(Var2 != 0xFFFF)
        {
            if(Var2 = 0xFFC7) {Var5 = Var5 + 1;}
            if(Var2 = 0xFE3F) {Var5 = Var5 + 2;}
            if(Var2 = 0xF1FF) {Var5 = Var5 + 3;}
            if(Var2 = 0x8FFF) {Var5 = Var5 + 4;}
            Var8 = 1;
        }
        else
        {
            Var5 = Var5 + 5;
            Var1 = Var1 + 2;
            Var3 = Var3 + 2;
            if(Var1 > 0x69)
            {   
                Var0 = 1;
                Var8 = 1;
            }
        } 
    }

    Var10 = (Var10 << 6) + Var5;

    if(Var0 != 0)
    {
        // ошибка в записи пробега
        message.Color = 0x0000FF;
        message = "                   Неверный дамп !";
    }
    else
    {
        // переводим единицы отсчета в километры
        // 1 миля равна 1609,344 метров
        // пробег считается по половине мили - 804,672 метров
        
        //Var10 = (Var10 * 838857) / 1000000;

        Var10 = (Var10 * 804672) / 1000000;
        Var10 = Var10 + 1;

        if(Var10 < 999901)
        {
            message.Color = 0x000000;
            message = "                         Дамп OK.";
            Distance = Var10;
        }
        else
        {
            // ошибка в записи пробега
            message.Color = 0x0000FF;
            message = "                    Неверный дамп !";
            Distance = 0;
        }
    }
}

OnApply
{

    Message = "";
    
    Var0 = 0;       // индикатор ошибки

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

        Var10 = Distance * 1000000 / 804672;

        Var1 = Var10 >> 16;
        Var2 = Var10 >> 11 & 31;
        Var3 = Var10 >> 6 & 31;
        
        Var4 = 0x8000;Var5 = 5;Var7 = 1;Var8 = 7;
        while(Var5 != 0)
        {
            if((Var3 & Var7) != 0)  { Var4 = Var4 | Var8;}
            Var7 = Var7 << 1;
            Var8 = Var8 << 3;
            Var5 = Var5 - 1;
        }
        @0x6A = Var4 >> 8;
        @0x6B = Var4 & 255;

        Var4 = 0x8000;Var5 = 5;Var7 = 1;Var8 = 7;
        while(Var5 != 0)
        {
            if((Var2 & Var7) != 0)  { Var4 = Var4 | Var8;}
            Var7 = Var7 << 1;
            Var8 = Var8 << 3;
            Var5 = Var5 - 1;
        }
        @0x6C = Var4 >> 8;
        @0x6D = Var4 & 255;

        Var4 = 0x8000;Var5 = 5;Var7 = 1;Var8 = 7;
        while(Var5 != 0)
        {
            if((Var1 & Var7) != 0)  { Var4 = Var4 | Var8;}
            Var7 = Var7 << 1;
            Var8 = Var8 << 3;
            Var5 = Var5 - 1;
        }
        @0x6E = Var4 >> 8;
        @0x6F = Var4 & 255;

        // ------- младшие 6 бит пробега

        Var10 = Var10 & 63;
        
        Var1 = 0x50 + (((Var10 / 5) * 2);        // смещение от адреса 0x50
        Var2 = Var10 - ((Var10 / 5) * 5);        // остаток от деления на 5
        
        Var3 = 0x0007 << (Var2 * 3);
        Var3 = Var3 ^ 0xFFFF;
        
        @Var1 = Var3 >> 8;
        Var1 = Var1 + 1;
        @Var1 = Var3 & 255;
        message.Color = 0x000000;
        message = "                         Дамп OK.";
    }        
}









