//---------------------------------------------------------------------------
#pragma hdrstop

#include "ChipFunctions.h"      // переменные для работы с чипом
#include "LogFunctions.h"       // переменные для отправки сообщений в лог
#include "Main.h"               // переменные для работы с главной формой
#include "FormFunctions.h"      // переменные для работы с формой
#include "ProgressBar.h"        // для использования прогресс-бара
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//--- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ -------------------------------------------------
//---------------------------------------------------------------------------
chip  SelectedChip;     // экземпляр чипа
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ СТРУКТУРЫ И ОБЛАСТЕЙ ПАМЯТИ ЧИПА ------------------------
//---------------------------------------------------------------------------
void InitChip(unsigned int ID)
{ // инициализируем структуру чипа

  switch(ID)
  { case 0x2971E:      // выбрано устройство ATmega128
                SelectedChip.Name               = "ATmega128";         // имя чипа
                SelectedChip.ImageName          = "ATmega128.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x2971E;              // байты идентификации
                SelectedChip.Area1Size          = 131072;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega128");  // сообщение в лог
                break;
    case 0x2981E:      // выбрано устройство ATmega2561
                SelectedChip.Name               = "ATmega2561";         // имя чипа
                SelectedChip.ImageName          = "ATmega2561.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x2981E;              // байты идентификации
                SelectedChip.Area1Size          = 262144;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega2561");  // сообщение в лог
                break;
    case 0x1981E:      // выбрано устройство ATmega2560
                SelectedChip.Name               = "ATmega2560";         // имя чипа
                SelectedChip.ImageName          = "ATmega2560.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x1981E;              // байты идентификации
                SelectedChip.Area1Size          = 262144;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega2560");  // сообщение в лог
                break;
    case 0x4971E:      // выбрано устройство ATmega1281
                SelectedChip.Name               = "ATmega1281";         // имя чипа
                SelectedChip.ImageName          = "ATmega1281.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x4971E;              // байты идентификации
                SelectedChip.Area1Size          = 131072;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega1281");  // сообщение в лог
                break;
    case 0x3971E:      // выбрано устройство ATmega1280
                SelectedChip.Name               = "ATmega1280";         // имя чипа
                SelectedChip.ImageName          = "ATmega1280.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x3971E;              // байты идентификации
                SelectedChip.Area1Size          = 131072;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega1280");  // сообщение в лог
                break;
    case 0x8961E:      // выбрано устройство ATmega640
                SelectedChip.Name               = "ATmega640";          // имя чипа
                SelectedChip.ImageName          = "ATmega640.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x8961E;              // байты идентификации
                SelectedChip.Area1Size          = 65536;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega640");  // сообщение в лог
                break;
    case 0x2961E:      // выбрано устройство ATmega64
                SelectedChip.Name               = "ATmega64";           // имя чипа
                SelectedChip.ImageName          = "ATmega64.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x2961E;              // байты идентификации
                SelectedChip.Area1Size          = 65536;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 2048;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega64");   // сообщение в лог
                break;
    case 0x1951E:      // выбрано устройство ATmega323
                SelectedChip.Name               = "ATmega323";           // имя чипа
                SelectedChip.ImageName          = "ATmega323.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x1951E;              // байты идентификации
                SelectedChip.Area1Size          = 32768;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 1024;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega323");  // сообщение в лог
                break;
    case 0x2951E:      // выбрано устройство ATmega32
                SelectedChip.Name               = "ATmega32";           // имя чипа
                SelectedChip.ImageName          = "ATmega32.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x2951E;              // байты идентификации
                SelectedChip.Area1Size          = 32768;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 1024;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega32");   // сообщение в лог
                break;
    case 0x5941E:      // выбрано устройство ATmega169
                SelectedChip.Name               = "ATmega169";          // имя чипа
                SelectedChip.ImageName          = "ATmega169.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x5941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega169");  // сообщение в лог
                break;
    case 0xA961E:      // выбрано устройство ATmega644
                SelectedChip.Name               = "ATmega644";          // имя чипа
                SelectedChip.ImageName          = "ATmega644.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0xA961E;              // байты идентификации
                SelectedChip.Area1Size          = 65536;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 2048;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega644");  // сообщение в лог
                break;
    case 0x8951E:      // выбрано устройство ATmega324
                SelectedChip.Name               = "ATmega324";           // имя чипа
                SelectedChip.ImageName          = "ATmega324.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x8951E;              // байты идентификации
                SelectedChip.Area1Size          = 32768;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 1024;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega324");  // сообщение в лог
                break;
    case 0xA941E:      // выбрано устройство ATmega164
                SelectedChip.Name               = "ATmega164";           // имя чипа
                SelectedChip.ImageName          = "ATmega164.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0xA941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega164");  // сообщение в лог
                break;
    case 0x2941E:      // выбрано устройство ATmega163
                SelectedChip.Name               = "ATmega163";           // имя чипа
                SelectedChip.ImageName          = "ATmega163.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x2941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega163");  // сообщение в лог
                break;
    case 0x4941E:      // выбрано устройство ATmega162
                SelectedChip.Name               = "ATmega162";           // имя чипа
                SelectedChip.ImageName          = "ATmega162.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x4941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega162");  // сообщение в лог
                break;
    case 0x1941E:      // выбрано устройство ATmega161
                SelectedChip.Name               = "ATmega161";           // имя чипа
                SelectedChip.ImageName          = "ATmega161.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x1941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega161");  // сообщение в лог
                break;
    case 0x3941E:      // выбрано устройство ATmega16
                SelectedChip.Name               = "ATmega16";           // имя чипа
                SelectedChip.ImageName          = "ATmega16.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x3941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega16");   // сообщение в лог
                break;
    case 0x8931E:      // выбрано устройство ATmega8535
                SelectedChip.Name               = "ATmega8535";         // имя чипа
                SelectedChip.ImageName          = "ATmega8535.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x8931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega8535"); // сообщение в лог
                break;
    case 0x6931E:      // выбрано устройство ATmega8515
                SelectedChip.Name               = "ATmega8515";         // имя чипа
                SelectedChip.ImageName          = "ATmega8515.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x6931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega8515"); // сообщение в лог
                break;
    case 0x7931E:      // выбрано устройство ATmega8
                SelectedChip.Name               = "ATmega8";            // имя чипа
                SelectedChip.ImageName          = "ATmega8.jpg";        // имя файла с картинкой
                SelectedChip.ID                 = 0x7931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega8");    // сообщение в лог
                break;
    case 0x6941E:      // выбрано устройство ATmega168
                SelectedChip.Name               = "ATmega168";          // имя чипа
                SelectedChip.ImageName          = "ATmega168.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x6941E;              // байты идентификации
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega168");   // сообщение в лог
                break;
    case 0xA931E:      // выбрано устройство ATmega88
                SelectedChip.Name               = "ATmega88";           // имя чипа
                SelectedChip.ImageName          = "ATmega88.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0xA931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega88");   // сообщение в лог
                break;
    case 0x5921E:      // выбрано устройство ATmega48
                SelectedChip.Name               = "ATmega48";           // имя чипа
                SelectedChip.ImageName          = "ATmega48.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x5921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega48");   // сообщение в лог
                break;
    case 0x1971E:      // выбрано устройство ATmega103
                SelectedChip.Name               = "ATmega103";          // имя чипа
                SelectedChip.ImageName          = "ATmega103.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1971E;              // байты идентификации
                SelectedChip.Area1Size          = 131072;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega103");  // сообщение в лог
                break;
    case 0x1961E:      // выбрано устройство ATmega603
                SelectedChip.Name               = "ATmega603";          // имя чипа
                SelectedChip.ImageName          = "ATmega603.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1961E;              // байты идентификации
                SelectedChip.Area1Size          = 65536;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 2048;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATmega603");  // сообщение в лог
                break;
    case 0xD931E:      // выбрано устройство ATtiny861
                SelectedChip.Name               = "ATtiny861";          // имя чипа
                SelectedChip.ImageName          = "ATtiny861.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0xD931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny861");  // сообщение в лог
                break;
    case 0x8921E:      // выбрано устройство ATtiny461
                SelectedChip.Name               = "ATtiny461";          // имя чипа
                SelectedChip.ImageName          = "ATtiny461.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x8921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny461");  // сообщение в лог
                break;
    case 0xC911E:      // выбрано устройство ATtiny261
                SelectedChip.Name               = "ATtiny261";          // имя чипа
                SelectedChip.ImageName          = "ATtiny261.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0xC911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny261");  // сообщение в лог
                break;
    case 0x9911E:      // выбрано устройство ATtiny26
                SelectedChip.Name               = "ATtiny26";           // имя чипа
                SelectedChip.ImageName          = "ATtiny26.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x9911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 4;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny26");   // сообщение в лог
                break;
    case 0xB931E:      // выбрано устройство ATtiny85
                SelectedChip.Name               = "ATtiny85";           // имя чипа
                SelectedChip.ImageName          = "ATtiny85.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0xB931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 2;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny85");   // сообщение в лог
                break;
    case 0x6921E:      // выбрано устройство ATtiny45
                SelectedChip.Name               = "ATtiny45";           // имя чипа
                SelectedChip.ImageName          = "ATtiny45.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x6921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 2;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny45");   // сообщение в лог
                break;
    case 0x8911E:      // выбрано устройство ATtiny25
                SelectedChip.Name               = "ATtiny25";           // имя чипа
                SelectedChip.ImageName          = "ATtiny25.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x8911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 2;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny25");   // сообщение в лог
                break;
    case 0x6911E:      // выбрано устройство ATtiny22
                SelectedChip.Name               = "ATtiny22";           // имя чипа
                SelectedChip.ImageName          = "ATtiny22.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x6911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny22");   // сообщение в лог
                break;
    case 0x6901E:      // выбрано устройство ATtiny15
                SelectedChip.Name               = "ATtiny15";           // имя чипа
                SelectedChip.ImageName          = "ATtiny15.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x6901E;              // байты идентификации
                SelectedChip.Area1Size          = 1024;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 64;                   // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny15");   // сообщение в лог
                break;
    case 0x7901E:      // выбрано устройство ATtiny13
                SelectedChip.Name               = "ATtiny13";           // имя чипа
                SelectedChip.ImageName          = "ATtiny13.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x7901E;              // байты идентификации
                SelectedChip.Area1Size          = 1024;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 64;                   // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 3;                    // количество фьюзов (2 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny13");   // сообщение в лог
                break;
    case 0x5901E:      // выбрано устройство ATtiny12
                SelectedChip.Name               = "ATtiny12";           // имя чипа
                SelectedChip.ImageName          = "ATtiny12.jpg";       // имя файла с картинкой
                SelectedChip.ID                 = 0x5901E;              // байты идентификации
                SelectedChip.Area1Size          = 1024;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 64;                   // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuse + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny12");   // сообщение в лог
                break;
    case 0x81971E:      // выбрано устройство AT90CAN128
                SelectedChip.Name               = "AT90CAN128";         // имя чипа
                SelectedChip.ImageName          = "AT90CAN128.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0x81971E;             // байты идентификации
                SelectedChip.Area1Size          = 131072;               // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 4096;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90CAN128"); // сообщение в лог
                break;
    case 0x81961E:      // выбрано устройство AT90CAN64
                SelectedChip.Name               = "AT90CAN64";          // имя чипа
                SelectedChip.ImageName          = "AT90CAN64.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x81961E;             // байты идентификации
                SelectedChip.Area1Size          = 65536;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 2048;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90CAN64");  // сообщение в лог
                break;
    case 0x81951E:      // выбрано устройство AT90CAN32
                SelectedChip.Name               = "AT90CAN32";          // имя чипа
                SelectedChip.ImageName          = "AT90CAN32.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x81951E;             // байты идентификации
                SelectedChip.Area1Size          = 32768;                // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 1024;                 // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 1;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90CAN32");  // сообщение в лог
                break;
    case 0x3931E:       // выбрано устройство AT90S8535
                SelectedChip.Name               = "AT90S8535";          // имя чипа
                SelectedChip.ImageName          = "AT90S8535.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x3931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S4434");  // сообщение в лог
                break;
    case 0x2921E:       // выбрано устройство AT90S4434
                SelectedChip.Name               = "AT90S4434";          // имя чипа
                SelectedChip.ImageName          = "AT90S4434.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x2921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S4434");  // сообщение в лог
                break;
    case 0x1931E:       // выбрано устройство AT90S8515
                SelectedChip.Name               = "AT90S8515";          // имя чипа
                SelectedChip.ImageName          = "AT90S8515.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1931E;              // байты идентификации
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 512;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S8515");  // сообщение в лог
                break;
    case 0x1921E:       // выбрано устройство AT90S4414
                SelectedChip.Name               = "AT90S4414";          // имя чипа
                SelectedChip.ImageName          = "AT90S4414.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S4414");  // сообщение в лог
                break;
    case 0x3921E:       // выбрано устройство AT90S4433
                SelectedChip.Name               = "AT90S4433";          // имя чипа
                SelectedChip.ImageName          = "AT90S4433.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x3921E;              // байты идентификации
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S4433");  // сообщение в лог
                break;
    case 0x5911E:       // выбрано устройство AT90S2333
                SelectedChip.Name               = "AT90S2333";          // имя чипа
                SelectedChip.ImageName          = "AT90S2333.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x5911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S2333");  // сообщение в лог
                break;
    case 0x3911E:       // выбрано устройство AT90S2343
                SelectedChip.Name               = "AT90S2343";          // имя чипа
                SelectedChip.ImageName          = "AT90S2343.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x3911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S2343");  // сообщение в лог
                break;
    case 0x2911E:       // выбрано устройство AT90S2323
                SelectedChip.Name               = "AT90S2323";          // имя чипа
                SelectedChip.ImageName          = "AT90S2323.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x2911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S2323");  // сообщение в лог
                break;
    case 0x1911E:       // выбрано устройство AT90S2313
                SelectedChip.Name               = "AT90S2313";          // имя чипа
                SelectedChip.ImageName          = "AT90S2313.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S2313");  // сообщение в лог
                break;
    case 0x1901E:       // выбрано устройство AT90S1200
                SelectedChip.Name               = "AT90S1200";          // имя чипа
                SelectedChip.ImageName          = "AT90S1200.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = 0x1901E;              // байты идентификации
                SelectedChip.Area1Size          = 1024;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 64;                   // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 2;                    // количество фьюзов (1 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 0;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," AT90S1200");  // сообщение в лог
                break;
    case 0xA911E:       // выбрано устройство ATtiny2313
                SelectedChip.Name               = "ATtiny2313";         // имя чипа
                SelectedChip.ImageName          = "ATtiny2313.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = 0xA911E;              // байты идентификации
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 4;                    // количество фьюзов (3 Fuses + 1 Lock)
                SelectedChip.Area4Size          = 2;                    // количество байтов калибровки
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," ATtiny2313"); // сообщение в лог
                break;
    case 0:     SendMsgToLog(14,"");            // сообщение в лог, что не выбран ни один чип
                return;                         // в этом случае инициализировать ничего не нужно (размеры областей мы не знаем)
    default:    SendMsgToLog(15," unknown");    // сообщение в лог, что чип нам неизвестен и выходим
                return;                         // в этом случае инициализировать его не нужно (размеры его областей мы не знаем)
  }
  // инициализируем все области памяти
  InitArea(1); InitArea(2); InitArea(3); InitArea(4);
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ ВЫБРАННОЙ ОБЛАСТИ ДАННЫХ --------------------------------
//---------------------------------------------------------------------------
void InitArea(unsigned char Number)
{ switch(Number)
  { case 1:  // заполняем FF-ками область 1
             for(unsigned int i=0; i<262144; i++)
             { SelectedChip.Area1[i]=0xFF; }
             break;
    case 2:  // заполняем FF-ками область 2
             for(unsigned int i=0; i<65536; i++)
             { SelectedChip.Area2[i]=0xFF; }
             break;
    case 3:  // заполняем область 3 FF-ками
             for(unsigned int i=0; i<8; i++)
             { SelectedChip.Area3[i]=0xFF; }
             // а затем значениями фьюзов по-умолчанию в зависимости от чипа
             switch(SelectedChip.ID)
             { case 0x2971E:    // ATmega128
               case 0x2961E:    // ATmega64
                                SelectedChip.Area3[0]=0xE1;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0x99;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFD;     // Extended Fuse Byte
                                SelectedChip.Area3[3]=0xFF;     // Lock Bits
                                break;
               case 0x1951E:    // выбран чип ATmega323
                                SelectedChip.Area3[0]=0xF2;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0x9F;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x2941E:    // выбран чип ATmega163
                                SelectedChip.Area3[0]=0xD2;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xFF;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x2951E:    // выбран чип ATmega32
               case 0x3941E:    // выбран чип ATmega16
                                SelectedChip.Area3[0]=0xE1;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0x99;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x8931E:    // выбран чип ATmega8535
               case 0x6931E:    // выбран чип ATmega8515
               case 0x7931E:    // выбран чип ATmega8
                                SelectedChip.Area3[0]=0xE1;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xD9;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x6941E:    // ATmega168
               case 0xA931E:    // ATmega88
                                SelectedChip.Area3[0]=0x62;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xDF;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xF9;     // Extended Fuse Byte
                                SelectedChip.Area3[3]=0xFF;     // Lock Bits
                                break;
               case 0x9911E:    // выбран чип ATtiny26
                                SelectedChip.Area3[0]=0xE1;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xF7;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x5921E:    // выбрано устройство ATmega48
               case 0xD931E:    // выбрано устройство ATtiny861
               case 0x8921E:    // выбрано устройство ATtiny461
               case 0xC911E:    // выбрано устройство ATtiny261
               case 0xB931E:    // выбрано устройство ATtiny85
               case 0x6921E:    // выбрано устройство ATtiny45
               case 0x8911E:    // ATtiny25
                                SelectedChip.Area3[0]=0x62;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xDF;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Extended Fuse Byte
                                SelectedChip.Area3[3]=0xFF;     // Lock Bits
                                break;
               case 0x6901E:    // выбран чип ATtiny15
                                SelectedChip.Area3[0]=0x5C;     // Fuse Byte
                                SelectedChip.Area3[1]=0xFF;     // Lock Bits
                                break;
               case 0x7901E:    // выбран чип ATtiny13
                                SelectedChip.Area3[0]=0x6A;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xFF;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Lock Bits
                                break;
               case 0x5901E:    // выбран чип ATtiny12
                                SelectedChip.Area3[0]=0x52;     // Fuse Byte
                                SelectedChip.Area3[1]=0xFF;     // Lock Bits
                                break;
               case 0x2981E:    // выбран чип ATmega2561
               case 0x1981E:    // выбран чип ATmega2560
               case 0x4971E:    // выбран чип ATmega1281
               case 0x3971E:    // выбран чип ATmega1280
               case 0x8961E:    // выбран чип ATmega640
               case 0x5941E:    // выбран чип ATmega169
               case 0xA961E:    // выбран чип ATmega644
               case 0x8951E:    // выбран чип ATmega324
               case 0xA941E:    // выбран чип ATmega164
               case 0x4941E:    // выбран чип ATmega162
               case 0x81971E:   // выбран чип AT90CAN128
               case 0x81961E:   // выбран чип AT90CAN64
               case 0x81951E:   // выбран чип AT90CAN32
                                SelectedChip.Area3[0]=0x62;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0x99;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Extended Fuse Byte
                                SelectedChip.Area3[3]=0xFF;     // Lock Bits
                                break;
               case 0x1941E:    // выбран чип ATmega161
               case 0x3921E:    // выбран чип AT90S4433
               case 0x5911E:    // выбран чип AT90S2333
                                SelectedChip.Area3[0]=0xDA;     // Fuse Byte (11 011010)
                                SelectedChip.Area3[1]=0xFF;     // Lock Bits
                                break;
               case 0x6911E:    // выбран чип ATtiny22
               case 0x3911E:    // выбран чип AT90S2343
               case 0x2911E:    // выбран чип AT90S2323
                                SelectedChip.Area3[0]=0xDE;     // Fuse Byte (оба бита по дефолту 0)
                                SelectedChip.Area3[1]=0xFF;     // Lock Bits
                                break;
               case 0x1971E:    // выбран чип ATmega103
               case 0x1961E:    // выбран чип ATmega603
               case 0x3931E:    // выбран чип AT90S8535
               case 0x2921E:    // выбран чип AT90S4434
               case 0x1931E:    // выбран чип AT90S8515
               case 0x1921E:    // выбран чип AT90S4414
               case 0x1911E:    // выбран чип AT90S2313
               case 0x1901E:    // выбран чип AT90S1200
                                SelectedChip.Area3[0]=0xDF;     // Fuse Byte (0-й единица, 5-й ноль)
                                SelectedChip.Area3[1]=0xFF;     // Lock Bits
                                break;
               case 0xA911E:    // ATtiny2313
                                SelectedChip.Area3[0]=0x64;     // Low Fuse Byte
                                SelectedChip.Area3[1]=0xDF;     // High Fuse Byte
                                SelectedChip.Area3[2]=0xFF;     // Extended Fuse Byte
                                SelectedChip.Area3[3]=0xFF;     // Lock Bits
                                break;
               case 0:
               default:         break;
             }
             break;
    case 4:  // заполняем FF-ками область 4
             for(unsigned int i=0; i<8; i++)
             { SelectedChip.Area4[i]=0xFF; }
             break;
    default: break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ ДАННЫЕ ИЗ BIN-ФАЙЛА В ПАМЯТЬ --------------------------------
//---------------------------------------------------------------------------
void LoadFromBinFileToMemory(AnsiString FilePath, unsigned char Area)
{ TFileStream* fs;              // указатель на поток чтения
  unsigned char rffch[1];       // сюда читаем байт из файла

  fs=new TFileStream(FilePath,fmOpenRead);      // создаём поток для чтения
  switch(Area)
  { case 1:     // загружаем программу
                SendMsgToLog(10,FilePath);                              // загружаем программу из BIN-файла
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)    // заполняем память программ
                { if(fs->Read(rffch,1))                                 // если успешно прочитали байт
                  { SelectedChip.Area1[i]=rffch[0];                     // пихаем его куда нужно
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area1Size;
                  }
                }
                LBar->Free();                                 // уничтожаем форму с прогресс-баром
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  // выбрана вкладка Page1
                           PlaceDataToForm(1,1);   // выводим в RichEdit1 Program
                           break;
                  case 1:  // выбрана вкладка Page2
                           PlaceDataToForm(2,1);   // выводим в RichEdit2 Program
                           break;
                  default: break;
                }
                break;
    case 2:     // загружаем данные
                SendMsgToLog(11,FilePath);                              // загружаем данные из BIN-файла
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++)    // заполняем память данных
                { if(fs->Read(rffch,1))                                 // если успешно прочитали байт
                  { SelectedChip.Area2[i]=rffch[0];                     // пихаем его куда нужно
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area2Size;
                  }
                }
                LBar->Free();                                 // уничтожаем форму с прогресс-баром
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  // выбрана вкладка Page1
                           PlaceDataToForm(3,2);   // выводим в RichEdit3 Data
                           break;
                  case 1:  // выбрана вкладка Page2
                           PlaceDataToForm(4,2);   // выводим в RichEdit4 Data
                           break;
                  default: break;
                }
                break;
    default:    break;
  }
  delete fs;                                    // удаляем поток чтения
  SendMsgToLog(12,"");                          // операция выполнена
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ ДАННЫЕ ИЗ HEX-ФАЙЛА В ПАМЯТЬ --------------------------------
//---------------------------------------------------------------------------
void LoadFromHexFileToMemory(AnsiString FilePath, unsigned char Area)
{ AnsiString TempStr, SubStr;
  unsigned char *InBuf, OutBuf[2];                      // для преобразования
  unsigned int n, Reclen, Offset, Rectype, Address,
               LinearBaseAddress, SegmentBaseAddress;

  // включаем прогресс-бар
  Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
  LBar->Show();                                           // показываем её в немодальном окне

  switch(Area)
  { case 1:     // загружаем программу
                SendMsgToLog(10,FilePath);              // загружаем программу из HEX-файла
                break;
    case 2:     // загружаем данные
                SendMsgToLog(11,FilePath);              // загружаем данные из HEX-файла
                break;
    default:    break;
  }
  LinearBaseAddress=0;    SegmentBaseAddress=0;         // инициализируем переменные для адресов

  Form1->Memo1->Clear();                                // очищаем Memo
  Form1->Memo1->Lines->LoadFromFile(FilePath);          // загружаем данные в Memo
  n=Form1->Memo1->Lines->Count;                         // вычисляем количество строк в файле
  for(unsigned int i=0;i<n;i++)                         // нужно обработать каждую строку
  {  TempStr=Form1->Memo1->Lines->Strings[i];           // берём очередную строку
     // вычисляем количество информационных байт в этой строке
     SubStr=TempStr.SubString(2,2);                     // кол-во информац-х байт в виде анси строки
     InBuf=SubStr.c_str();
     HexToBin(InBuf,OutBuf,1);                          // преобразовать строку в целое (байт)
     Reclen=OutBuf[0];                                  // количество информационных байт в виде числа
     // вычисляем смещение от начала памяти
     SubStr=TempStr.SubString(4,4);                     // смещение в виде анси строки
     InBuf=SubStr.c_str();
     HexToBin(InBuf,OutBuf,2);
     Offset=OutBuf[0]*256+OutBuf[1];
     //определяем тип записи
     SubStr=TempStr.SubString(8,2);                     // тип записи в виде анси строки
     InBuf=SubStr.c_str();
     HexToBin(InBuf,OutBuf,1);
     Rectype=OutBuf[0];
     switch(Rectype)
     { case 0:  // Data record
                for(unsigned int j=0;j<Reclen;j++)
                { SubStr=LowerCase(TempStr.SubString(10+2*j,2));
                  Address=LinearBaseAddress+SegmentBaseAddress+Offset+j;// адрес байта
                  InBuf=SubStr.c_str();                                 // SubStr - байт в виде строки hex
                  HexToBin(InBuf,OutBuf,1);                             // преобразуем байт в  нормальный вид
                  switch(Area)
                  { case 1:     // загружаем программу
                                if(Address<SelectedChip.Area1Size)
                                { SelectedChip.Area1[Address]=OutBuf[0];
                                }
                                break;
                    case 2:     // загружаем данные
                                if(Address<SelectedChip.Area2Size)
                                { SelectedChip.Area2[Address]=OutBuf[0];
                                }
                                break;
                    default:    break;
                  }
                }
                break;
       case 1:  // End of file record
                i=n;    // заканчиваем просмотр записей
                SendMsgToLog(12,"");                    // сообщаем об окончании загрузки
                break;
       case 2:  // Extended segment address record
                SubStr=TempStr.SubString(10,4);         // Extended segment address в виде анси строки
                InBuf=SubStr.c_str();
                HexToBin(InBuf,OutBuf,2);
                SegmentBaseAddress=(OutBuf[0]*256+OutBuf[1])*16;
                break;
       case 3:  // Start segment address record (определяет биты 4-19 адреса для всех
                // последующих данных, пока не будет переопределён такой же записью)
                i=n;    // заканчиваем просмотр записей
                SendMsgToLog(13," (from 8086/80186)");   // это HEX-файл от 8086/80186
                break;
       case 4:  // Extended linear address record (определяет старшие 2 байта адреса для всех
                // последующих даных, пока не будет переопределён такой же записью)
                SubStr=TempStr.SubString(10,4);         // Extended linear address в виде анси строки
                InBuf=SubStr.c_str();
                HexToBin(InBuf,OutBuf,2);
                LinearBaseAddress=(OutBuf[0]*256+OutBuf[1])*65536;
                break;
       case 5:  // Start linear address record
                i=n;    // заканчиваем просмотр записей
                SendMsgToLog(13," (from 80386)");       // это HEX-файл от 80386
                break;
       default: // Если ни один из типов не подходит - ошибка
                i=n;    // заканчиваем просмотр записей
                SendMsgToLog(13," (unknown format)");   // неправильный формат файла
                break;
     }
     // если кратно 1024 - вычисляем новую позицию прогресс-бара
     if(i%1024==0)
     { LBar->ProgressBar1->Position=100*(i+1)/n;
     }
  }
  Form1->Memo1->Clear();          // очищаем Memo
  LBar->Free();                   // уничтожаем форму с прогресс-баром
  // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
  switch(Form1->PageControl1->TabIndex)
  { case 0:  // выбрана вкладка Page1
             switch(Area)
             { case 1:  // загружали программу
                        PlaceDataToForm(1,1);   // выводим в RichEdit1 Program
                        break;
               case 2:  // загружали данные
                        PlaceDataToForm(3,2);   // выводим в RichEdit3 Data
                        break;
               default: break;
             }
             break;
    case 1:  // выбрана вкладка Page2
             switch(Area)
             { case 1:  // загружали программу
                        PlaceDataToForm(2,1);   // выводим в RichEdit2 Program
                        break;
               case 2:  // загружали данные
                        PlaceDataToForm(4,2);   // выводим в RichEdit4 Data
                        break;
               default: break;
             }
             break;
    default: break;
  }
}
//---------------------------------------------------------------------------
//--- СОХРАНЯЕМ ДАННЫЕ ИЗ ПАМЯТИ В BIN-ФАЙЛ ---------------------------------
//---------------------------------------------------------------------------
void SaveFromMemoryToBinFile(AnsiString FilePath, unsigned char Area)
{ TFileStream* fs;              // указатель на поток записи
  char Symbol[1];               // символ для сохранения

  switch(Area)
  { case 1:     // сохраняем программу
                SendMsgToLog(16,FilePath);      // сохраняем программу из памяти в BIN-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Area1
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Area1
                           break;
                  default: break;
                }
                //----------------------------------------
                // И записываем их в файл
                //----------------------------------------
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)
                {     Symbol[0]=char(SelectedChip.Area1[i]);
                      fs->Write(Symbol,1);                            // сохраняем в файл
                      // если кратно 1024 - вычисляем новую позицию прогресс-бара
                      if(i%1024==0)
                      { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area1Size;
                      }
                }
                delete fs;                                            // закрываем поток записи
                break;
    case 2:     // сохраняем данные
                SendMsgToLog(17,FilePath);      // сохраняем данные из памяти в BIN-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Area2
                           break;
                  case 1:  GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Area2
                           break;
                  default: break;
                }
                //----------------------------------------
                // И записываем их в файл
                //----------------------------------------
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);  // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++)
                {     Symbol[0]=char(SelectedChip.Area2[i]);
                      fs->Write(Symbol,1);                            // сохраняем в файл
                      // если кратно 1024 - вычисляем новую позицию прогресс-бара
                      if(i%1024==0)
                      { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area2Size;
                      }
                }
                delete fs;                                            // закрываем поток записи
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  SendMsgToLog(12,"");          // операция выполнена
}
//---------------------------------------------------------------------------
//--- СОХРАНЯЕМ ДАННЫЕ ИЗ ПАМЯТИ В HEX-ФАЙЛ ---------------------------------
//---------------------------------------------------------------------------
void SaveFromMemoryToHexFile(AnsiString FilePath, unsigned char Area)
{ TFileStream* fs;                      // указатель на поток записи
  unsigned char Value[1], OutBuf[2];    // для преобразования
  unsigned char CheckSum[1];            // для вычисления контрольной суммы

  switch(Area)
  { case 1:     // сохраняем программу
                SendMsgToLog(16,FilePath);              // сохраняем программу в HEX-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Area1
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Area1
                           break;
                  default: break;
                }
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<(SelectedChip.Area1Size); i++)
                { if(i%65536==0)        // если кратно 65536 - нужно переопределить ULBA (старшие 2 байта 32-битного адреса через Extended Linear Address Record)
                  { fs->Write(":02000004",9);           // пишем начало новой строки - признак (:), RECLEN (0x02 = 2 байта), OFFSET (0000), RECTYPE (04)
                    CheckSum[0] = 0x02;         // начинаем высчислять контрольную сумму с RECLEN
                    CheckSum[0]+= 0x0;          // далее 2 байта OFFSET
                    CheckSum[0]+= 0x0;
                    CheckSum[0]+= 0x4;
                    Value[0] = i >> 24;         // берём старший байт старшего слова
                    CheckSum[0]+= Value[0];     // добавляем его к контрольной сумме
                    BinToHex(Value,OutBuf,1);   // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);        // записать результат в файл
                    Value[0] = i >> 16;         // берём младший байт старшего слова
                    CheckSum[0]+= Value[0];     // добавляем его к контрольной сумме
                    BinToHex(Value,OutBuf,1);   // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);        // записать результат в файл
                    // теперь будем дописывать контрольную сумму
                    CheckSum[0]=255-CheckSum[0];
                    CheckSum[0]=CheckSum[0]+1;
                    Value[0]=CheckSum[0];
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать результат (CheckSum) в файл
                    Value[0]=0xD;                       // дописываем символ конца строки
                    fs->Write(Value,1);
                    Value[0]=0xA;                       // дописываем перенос на новую строку
                    fs->Write(Value,1);
                  }
                  if(i%8==0)                            // начинаем писать новую строку, если остаток от деления i на 8 равен 0
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=i/256;                     // старший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем старший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку старшего байта адреса

                    Value[0]=i;                         // младший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем младший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку младшего байта адреса

                    OutBuf[0]=0x30;                     // пишем в буфер RECTYPE
                    OutBuf[1]=0x30;                     // "00" - DATA RECORD  ( 0x30="0")
                    fs->Write(OutBuf,2);                // записать буфер в файл
                  }
                  Value[0]=SelectedChip.Area1[i];       // берём очередной байт для записи
                  BinToHex(Value,OutBuf,1);             // преобразовать целое (байт) в строку
                  fs->Write(OutBuf,2);                  // записать в файл очередные 2 символа
                  CheckSum[0]=CheckSum[0]+Value[0];     // добавляем этот байт к контрольной сумме
                  // если это последний символ в строке - дописываем к ней CheckSum + символы конца строки и переноса
                  if((i+1)%8==0)                        // если остаток от деления i+1 на 8 равен 0
                  { CheckSum[0]=255-CheckSum[0];
                    CheckSum[0]=CheckSum[0]+1;
                    Value[0]=CheckSum[0];
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать результат (CheckSum) в файл
                    Value[0]=0xD;                       // дописываем символ конца строки
                    fs->Write(Value,1);
                    Value[0]=0xA;                       // дописываем перенос на новую строку
                    fs->Write(Value,1);
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area1Size;
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                break;
    case 2:     // сохраняем данные
                SendMsgToLog(17,FilePath);              // сохраняем данные в HEX-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Area2
                           break;
                  case 1:  GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Area2
                           break;
                  default: break;
                }
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<(SelectedChip.Area2Size); i++)
                { if(i%8==0)                            // начинаем писать новую строку, если остаток от деления i на 8 равен 0
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=i/256;                     // старший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем старший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку старшего байта адреса

                    Value[0]=i;                         // младший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем младший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку младшего байта адреса

                    OutBuf[0]=0x30;                     // пишем в буфер RECTYPE
                    OutBuf[1]=0x30;                     // "00" - DATA RECORD  ( 0x30="0")
                    fs->Write(OutBuf,2);                // записать буфер в файл
                  }
                  Value[0]=SelectedChip.Area2[i];       // берём очередной байт для записи
                  BinToHex(Value,OutBuf,1);             // преобразовать целое (байт) в строку
                  fs->Write(OutBuf,2);                  // записать в файл очередные 2 символа
                  CheckSum[0]=CheckSum[0]+Value[0];     // добавляем этот байт к контрольной сумме
                  // если это последний символ в строке - дописываем к ней CheckSum + символы конца строки и переноса
                  if((i+1)%8==0)                        // если остаток от деления i+1 на 8 равен 0
                  { CheckSum[0]=255-CheckSum[0];
                    CheckSum[0]=CheckSum[0]+1;
                    Value[0]=CheckSum[0];
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать результат (CheckSum) в файл
                    Value[0]=0xD;                       // дописываем символ конца строки
                    fs->Write(Value,1);
                    Value[0]=0xA;                       // дописываем перенос на новую строку
                    fs->Write(Value,1);
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area2Size;
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  SendMsgToLog(12,"");                                  // операция выполнена
}
//---------------------------------------------------------------------------
