[Description]

Location = "Mobila\Загрузчик прошивки";
Info = " Автор модуля: fomalex@tut.by";
Buffer1 = "FLASH",16384;
UART = 1;
Voltage = 5.0;

[Menu]

Write = "&Загрузить",WriteButton,"Загрузить прошивку";
ReadEEPROM = "&Прочитать EEPROM",ReadEEPROMButton,"Прочитать EEPROM";
WriteEEPROM = "&Записать EEPROM",WriteEEPROMButton,"Записать EEPROM";
Xor = "&Захорить";

[Interface]

ComboBox(Speed,"Скорость",10,10,90,"9300","9400","9500","9600","9700","9800",3);

[Host]

Proc Write {
    
    var Error,LastAdr,PageCounter,FDPTR,Address;

    FDPTR = 65535;
    LastAdr = 65535;
    while
    {
      Error = FBUF[FDPTR];
      if(Error != 255) {break;}
      FDPTR--;
      LastAdr--;
      if(FDPTR = 0)
      {
        print("  Пустой буфер !");
        return;
      } 
    }
    if(LastAdr.0 = 1) { LastAdr++; }
    FDPTR = 0;PBPos = 0;PBMax = LastAdr;PageCounter = 0;
    print("  Будет загружаться %i байт.",LastAdr);
    Error = BootInit();
    if(Error = 1)
    {
        print("Загрузка...");
        while
        {
            Error = WritePage(FDPTR);
            if(Error = 1) {
                    print(" Ошибка записи. Страница %d",PageCounter);
                    return;
            }
            //PBPos = PBPos + 128;
            //FDPTR = FDPTR + 128;
            PBPos = PBPos + 64;
            FDPTR = FDPTR + 64;
            PageCounter = PageCounter + 1;
            if(FDPTR > LastAdr)
            {
                Error = UART;
                if(Error.15 = 1) {
                    print("  Ошибка записи.");
                    return;
                }
                if(Error != 71){
                    print("  Ошибка записи.");
                    return;
                }
                UART = 68;
                Error = UART;
                print("  Загрузка завершена. %i байт загружено.",FDPTR);
                break;
            }
        }
    }
    else {
       print("   Найден неизвестный аппарат...");
    }
}

Proc WritePage(PageAddr) {

    var Temp,ByteCounter;
    while 
    {
        Temp = UART;
        if(Temp != 71)
        {
            print("  UART = %i...",Temp);
            return(1);
        }
        else  { break;}     
    }
    print("Страница %i",PageAddr);
    UART = 78; 
    Temp = UART;
    ByteCounter = 128;
    while(ByteCounter != 0) {
      Temp = FBUF[PageAddr];
      UART = Temp;
      Temp = UART;
      PageAddr++;
      ByteCounter--;    
    }
    print("--------- ждем ответ");
    while {
      Temp = UART;
      if(Temp != 0x8000) 
      {
        if(Temp = 79) { return(0); }
        else 
        { 
            print("  Внутреняя ошибка записи страницы %i.",Temp);
            return(1); 
        } 
      }
    }
}

Proc BootInit {

  var Error; 

    if(Speed = 0) {
        print("  Скорость 9300");
        SetupUART(9300,8,0,0);
    }
    if(Speed = 1) {
        print("  Скорость 9400");
        SetupUART(9400,8,0,0);
    }
    if(Speed = 2) {
        print("  Скорость 9500");
        SetupUART(9500,8,0,0);
    }
    if(Speed = 3) {
        print("  Скорость 9600");
        SetupUART(9600,8,0,0);
    }
    if(Speed = 4) {
        print("  Скорость 9700");
        SetupUART(9700,8,0,0);
    }
    if(Speed = 5) {
        print("  Скорость 9800");
        SetupUART(9800,8,0,0);
    }
    DTR = 1; RTS = 1;

  while
  {
    Error = UART;
    if(Error.15 = 1) { break; }
  }
  print("  Включите аппарат...");
  while
  {
    Error = UART;
    if(Error.15 = 0) 
    {   
      print("Прием: %h",Error); 
      if(Error = 'R') 
      {
        print("Получен запрос...");
        print("Отправлен ответ...");
        UART = 'r';
        Error = UART;
        Error = UART;
        print("Получено эхо: %i",Error);
        if(Error = 'r')
        {
            print("   Аппарат найден...");
            return(1);
        }
      }
      else
      {
        
      }     
    }   
  }
}

Proc Xor {

    var Error,LastAdr,FDPTR,Xorer;

    FDPTR = 65535;
    LastAdr = 65535;
    while
    {
      Error = FBUF[FDPTR];
      if(Error != 255) {break;}
      FDPTR--;
      LastAdr--;
      if(FDPTR = 0)
      {
        print("  Пустой буфер !");
        return;
      } 
    }
    if(LastAdr.0 = 1) { LastAdr++; }
    FDPTR = 0;PBPos = 0;PBMax = LastAdr;
    Xorer = 255;
    while
    {
        if(FDPTR = LastAdr) { break;}

      Error = FBUF[FDPTR];

        Error = Error ^ Xorer;
        FBUF[FDPTR] = Error;
        Xorer--;
        if(Xorer = 127) { Xorer = 255;}
        FDPTR++;
    }
}




