//---------------------------------------------------------------------------
#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&0x3FE0)     // отрезаем 5 младших бит при выборе чипа (они определяют ревизию, а не модель)
  { case 0x2080:        // выбрано устройство PIC16F887
                SelectedChip.Name               = "PIC16F887";          // имя чипа
                SelectedChip.ImageName          = "PIC16F882.jpg";      // имя файла с картинкой (одинаковый с PIC16F882)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F887");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word";
                break;
    case 0x2060:        // выбрано устройство PIC16F886
                SelectedChip.Name               = "PIC16F886";          // имя чипа
                SelectedChip.ImageName          = "PIC16F882.jpg";      // имя файла с картинкой (одинаковый с PIC16F882)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F886");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word";
                break;
    case 0x2040:        // выбрано устройство PIC16F884
                SelectedChip.Name               = "PIC16F884";          // имя чипа
                SelectedChip.ImageName          = "PIC16F882.jpg";      // имя файла с картинкой (одинаковый с PIC16F882)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F884");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word";
                break;
    case 0x2020:        // выбрано устройство PIC16F883
                SelectedChip.Name               = "PIC16F883";          // имя чипа
                SelectedChip.ImageName          = "PIC16F882.jpg";      // имя файла с картинкой (одинаковый с PIC16F882)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F883");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word";
                break;
    case 0x2000:        // выбрано устройство PIC16F882
                SelectedChip.Name               = "PIC16F882";          // имя чипа
                SelectedChip.ImageName          = "PIC16F882.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах (128 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F882");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word";
                break;
    case 0x1900:        // выбрано устройство PIC16LF727
                SelectedChip.Name               = "PIC16LF727";         // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой (одинаковый с PIC16F707)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF727");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1800:        // выбрано устройство PIC16F727
                SelectedChip.Name               = "PIC16F727";          // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой (одинаковый с PIC16F707)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F727");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1940:        // выбрано устройство PIC16LF724
                SelectedChip.Name               = "PIC16LF724";         // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой (одинаковый с PIC16F707)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF724"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1840:        // выбрано устройство PIC16F724
                SelectedChip.Name               = "PIC16F724";          // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой (одинаковый с PIC16F707)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F724");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1920:        // выбрано устройство PIC16LF726
                SelectedChip.Name               = "PIC16LF726";         // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF726"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1820:        // выбрано устройство PIC16F726
                SelectedChip.Name               = "PIC16F726";          // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F726");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1B40:        // выбрано устройство PIC16LF723A
                SelectedChip.Name               = "PIC16LF723A";        // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF723A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1B00:        // выбрано устройство PIC16F723A
                SelectedChip.Name               = "PIC16F723A";         // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F723A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1960:        // выбрано устройство PIC16LF723
                SelectedChip.Name               = "PIC16LF723";         // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF723"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1860:        // выбрано устройство PIC16F723
                SelectedChip.Name               = "PIC16F723";          // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F723");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1B60:        // выбрано устройство PIC16LF722A
                SelectedChip.Name               = "PIC16LF722A";        // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF722A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1B20:        // выбрано устройство PIC16F722A
                SelectedChip.Name               = "PIC16F722A";         // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F722A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1980:        // выбрано устройство PIC16LF722
                SelectedChip.Name               = "PIC16LF722";         // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой (одинаковый с PIC16F722)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF722"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1880:        // выбрано устройство PIC16F722
                SelectedChip.Name               = "PIC16F722";          // имя чипа
                SelectedChip.ImageName          = "PIC16F722.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F722");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1C60:        // выбрано устройство PIC16LF721
                SelectedChip.Name               = "PIC16LF721";         // имя чипа
                SelectedChip.ImageName          = "PIC16F720.jpg";      // имя файла с картинкой (одинаковый с PIC16F720)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2200;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF721");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1C20:        // выбрано устройство PIC16F721
                SelectedChip.Name               = "PIC16F721";          // имя чипа
                SelectedChip.ImageName          = "PIC16F720.jpg";      // имя файла с картинкой (одинаковый с PIC16F720)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2200;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F721");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1C40:        // выбрано устройство PIC16LF720
                SelectedChip.Name               = "PIC16LF720";         // имя чипа
                SelectedChip.ImageName          = "PIC16F720.jpg";      // имя файла с картинкой (одинаковый с PIC16F720)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2200;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF720"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1C00:        // выбрано устройство PIC16F720
                SelectedChip.Name               = "PIC16F720";          // имя чипа
                SelectedChip.ImageName          = "PIC16F720.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2200;               // адрес начала области данных (без разницы, в этом чипе нет данных)
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F720");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1AE0:        // выбрано устройство PIC16LF707
                SelectedChip.Name               = "PIC16LF707";         // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой (одинаковый с PIC16F707)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF707"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1AC0:        // выбрано устройство PIC16F707
                SelectedChip.Name               = "PIC16F707";          // имя чипа
                SelectedChip.ImageName          = "PIC16F707.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F707");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1100:        // выбрано устройство PIC16F648A
                SelectedChip.Name               = "PIC16F648A";         // имя чипа
                SelectedChip.ImageName          = "PIC16F627A.jpg";     // имя файла с картинкой (одинаковый с PIC16F627A)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 16;                   // размер памяти конфигурации в байтах (2*0x8)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 4;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 0;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F648A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word";
                break;
    case 0x1060:        // выбрано устройство PIC16F628A
                SelectedChip.Name               = "PIC16F628A";         // имя чипа
                SelectedChip.ImageName          = "PIC16F627A.jpg";     // имя файла с картинкой (одинаковый с PIC16F627A)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах (128 x 8)
                SelectedChip.Area3Size          = 16;                   // размер памяти конфигурации в байтах (2*0x8)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 4;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 0;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F628A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word";
                break;
    case 0x1040:        // выбрано устройство PIC16F627A
                SelectedChip.Name               = "PIC16F627A";         // имя чипа
                SelectedChip.ImageName          = "PIC16F627A.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах (128 x 8)
                SelectedChip.Area3Size          = 16;                   // размер памяти конфигурации в байтах (2*0x8)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 4;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 0;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F627A"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word";
                break;
    case 0x1200:        // выбрано устройство PIC16F785
                SelectedChip.Name               = "PIC16F785";          // имя чипа
                SelectedChip.ImageName          = "PIC16F785.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 6;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F785");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word1, 0x2009 - Calibr.Word2";
                break;
    case 0x3020:        // возможно это PIC16F753
                if(ID == 0x3030)       // если так, то это точно PIC16F753
                {       SelectedChip.Name               = "PIC16F753";          // имя чипа
                        SelectedChip.ImageName          = "PIC16F753.jpg";      // имя файла с картинкой
                        SelectedChip.ID                 = ID;                   // слово идентификации
                        SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                        SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                        SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                        SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                        SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                        SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                        SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                        SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                        SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                        SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                        SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                        InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                        SendMsgToLog(15," PIC16F753");  // сообщение в лог
                        Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word1, 0x2009 - Calibr.Word2";
                }
                else    // если это не PIC16F753
                {       SendMsgToLog(15," unknown");    // сообщение в лог, что чип нам неизвестен и выходим
                        Form1->Label10->Caption = "Configuration Memory Map: ?";
                        return;                         // в этом случае инициализировать его не нужно (размеры его областей мы не знаем)
                }
                break;
    case 0x14A0:        // выбрано устройство PIC16LF1847
                SelectedChip.Name               = "PIC16LF1847";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой (одинаковый с PIC16F1826)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1847"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x1480:        // выбрано устройство PIC16F1847
                SelectedChip.Name               = "PIC16F1847";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой (одинаковый с PIC16F1826)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1847"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x1BC0:        // выбрано устройство PIC12LF1840
                SelectedChip.Name               = "PIC12LF1840";        // имя чипа
                SelectedChip.ImageName          = "PIC12F1501.jpg";     // имя файла с картинкой (одинаковый с PIC12F1501)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12LF1840"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x1B80:        // выбрано устройство PIC12F1840
                SelectedChip.Name               = "PIC12F1840";         // имя чипа
                SelectedChip.ImageName          = "PIC12F1501.jpg";     // имя файла с картинкой (одинаковый с PIC12F1501)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F1840"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x28E0:        // выбрано устройство PIC16LF1829
                SelectedChip.Name               = "PIC16LF1829";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1828.jpg";     // имя файла с картинкой (одинаковый с PIC16F1828)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1829"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x27E0:        // выбрано устройство PIC16F1829
                SelectedChip.Name               = "PIC16F1829";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1828.jpg";     // имя файла с картинкой (одинаковый с PIC16F1828)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1829"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x28C0:        // выбрано устройство PIC16LF1828
                SelectedChip.Name               = "PIC16LF1828";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1828.jpg";     // имя файла с картинкой (одинаковый с PIC16F1828)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1828"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x27C0:        // выбрано устройство PIC16F1828
                SelectedChip.Name               = "PIC16F1828";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1828.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1828"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x28A0:        // выбрано устройство PIC16LF1827
                SelectedChip.Name               = "PIC16LF1827";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой (одинаковый с PIC16F1826)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1827"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x27A0:        // выбрано устройство PIC16F1827
                SelectedChip.Name               = "PIC16F1827";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой (одинаковый с PIC16F1826)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1827"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2880:        // выбрано устройство PIC16LF1826
                SelectedChip.Name               = "PIC16LF1826";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой (одинаковый с PIC16F1826)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1826"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2780:        // выбрано устройство PIC16F1826
                SelectedChip.Name               = "PIC16F1826";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1826.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1826"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2860:        // выбрано устройство PIC16LF1825
                SelectedChip.Name               = "PIC16LF1825";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1825"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2760:        // выбрано устройство PIC16F1825
                SelectedChip.Name               = "PIC16F1825";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1825"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2840:        // выбрано устройство PIC16LF1824
                SelectedChip.Name               = "PIC16LF1824";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1824"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2740:        // выбрано устройство PIC16F1824
                SelectedChip.Name               = "PIC16F1824";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1824"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2820:        // выбрано устройство PIC16LF1823
                SelectedChip.Name               = "PIC16LF1823";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1823"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2720:        // выбрано устройство PIC16F1823
                SelectedChip.Name               = "PIC16F1823";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1823"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2800:        // выбрано устройство PIC12LF1822
                SelectedChip.Name               = "PIC12LF1822";         // имя чипа
                SelectedChip.ImageName          = "PIC12F1822.jpg";     // имя файла с картинкой (одинаковый с PIC12F1822)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12LF1822"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x2700:        // выбрано устройство PIC12F1822
                SelectedChip.Name               = "PIC12F1822";         // имя чипа
                SelectedChip.ImageName          = "PIC12F1822.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0xF000;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 5;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 5;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 3;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F1822"); // сообщение в лог
                Form1->Label10->Caption = "0x8000..0x8003 - User ID, 0x8006 - Device ID, 0x8007 - Config.Word1, 0x8008 - Config.Word2, 0x8009 - Calibr.Word1, 0x800A - Calibr.Word2";
                break;
    case 0x1240:        // выбрано устройство PIC16F616
                SelectedChip.Name               = "PIC16F616";          // имя чипа
                SelectedChip.ImageName          = "PIC16F610.jpg";      // имя файла с картинкой (одинаковый с PIC16F610)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F616");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x2260:        // выбрано устройство PIC16F610
                SelectedChip.Name               = "PIC16F610";          // имя чипа
                SelectedChip.ImageName          = "PIC16F610.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F610");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x2240:        // выбрано устройство PIC12F609
                SelectedChip.Name               = "PIC12F609";          // имя чипа
                SelectedChip.ImageName          = "PIC12F615.jpg";      // имя файла с картинкой (одинаковый с PIC12F615)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F609");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1360:        // выбрано устройство PIC12F617
                SelectedChip.Name               = "PIC12F617";          // имя чипа
                SelectedChip.ImageName          = "PIC12F615.jpg";      // имя файла с картинкой (одинаковый с PIC12F615)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 224;                  // размер памяти конфигурации в байтах (2*0x70)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F617");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x2180:        // выбрано устройство PIC12F615
                SelectedChip.Name               = "PIC12F615";          // имя чипа
                SelectedChip.ImageName          = "PIC12F615.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F615");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x2E00:        // выбрано устройство PIC16LF1509
                SelectedChip.Name               = "PIC16LF1509";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой (одинаковый с PIC16F1507)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1509");// сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2D40:        // выбрано устройство PIC16F1509
                SelectedChip.Name               = "PIC16F1509";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой (одинаковый с PIC16F1507)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 16384;                // размер flash-памяти в байтах (8k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1509"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2DE0:        // выбрано устройство PIC16LF1508
                SelectedChip.Name               = "PIC16LF1508";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой (одинаковый с PIC16F1507)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1508");// сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2D20:        // выбрано устройство PIC16F1508
                SelectedChip.Name               = "PIC16F1508";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой (одинаковый с PIC16F1507)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1508"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2DC0:        // выбрано устройство PIC16LF1507
                SelectedChip.Name               = "PIC16LF1507";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой (одинаковый с PIC16F1507)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1507");// сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2D00:        // выбрано устройство PIC16F1507
                SelectedChip.Name               = "PIC16F1507";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1507.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1507"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2DA0:        // выбрано устройство PIC16LF1503
                SelectedChip.Name               = "PIC16LF1503";        // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой (одинаковый с PIC16F1503)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16LF1503");// сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2CE0:        // выбрано устройство PIC16F1503
                SelectedChip.Name               = "PIC16F1503";         // имя чипа
                SelectedChip.ImageName          = "PIC16F1503.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8200;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 1024;                 // размер памяти конфигурации в байтах (2*0x200)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F1503"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2D80:        // выбрано устройство PIC12LF1501
                SelectedChip.Name               = "PIC12LF1501";        // имя чипа
                SelectedChip.ImageName          = "PIC12F1501.jpg";     // имя файла с картинкой (одинаковый с PIC12F1501)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12LF1501"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x2CC0:        // выбрано устройство PIC12F1501
                SelectedChip.Name               = "PIC12F1501";         // имя чипа
                SelectedChip.ImageName          = "PIC12F1501.jpg";     // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x8000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x8100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 512;                  // размер памяти конфигурации в байтах (2*0x100)
                SelectedChip.TerProg            = 5;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 5;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F1501"); // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word1, 0x2008 - Config.Word2, 0x2009 - Calibr.Word1, 0x200A - Calibr.Word2";
                break;
    case 0x1500:        // выбрано устройство PIC12F752
                SelectedChip.Name               = "PIC12F752";          // имя чипа
                SelectedChip.ImageName          = "PIC12F752.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 0;                    // размер Data-памяти в байтах (0 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 0;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 0;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 0;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F752");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word1, 0x2009 - Calibr.Word2";
                break;
    case 0x1400:        // выбрано устройство PIC16F690
                SelectedChip.Name               = "PIC16F690";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC16F631)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F690");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1340:        // выбрано устройство PIC16F689
                SelectedChip.Name               = "PIC16F689";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC16F631)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F689");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1180:        // выбрано устройство PIC16F688
                SelectedChip.Name               = "PIC16F688";          // имя чипа
                SelectedChip.ImageName          = "PIC16F636.jpg";      // имя файла с картинкой (одинаковый с PIC16F636)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F688");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1320:        // выбрано устройство PIC16F687
                SelectedChip.Name               = "PIC16F687";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC16F631)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F687");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x04A0:        // выбрано устройство PIC16F685
                SelectedChip.Name               = "PIC16F685";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC16F631)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 8192;                 // размер flash-памяти в байтах (4k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F685");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1080:        // выбрано устройство PIC16F684
                SelectedChip.Name               = "PIC16F684";          // имя чипа
                SelectedChip.ImageName          = "PIC16F636.jpg";      // имя файла с картинкой (одинаковый с PIC16F636)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F684");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1440:        // выбрано устройство PIC16F677
                SelectedChip.Name               = "PIC16F677";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC16F631)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F677");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x10A0:        // выбрано устройство PIC16F636 / PIC16F639
                SelectedChip.Name               = "PIC16F636 / PIC16F639"; // имя чипа
                SelectedChip.ImageName          = "PIC16F636.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F636 / PIC16F639");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x1420:        // выбрано устройство PIC16F631
                SelectedChip.Name               = "PIC16F631";          // имя чипа
                SelectedChip.ImageName          = "PIC16F631.jpg";      // имя файла с картинкой (одинаковый с PIC12F635)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах (128 x 8)
                SelectedChip.Area3Size          = 256;                  // размер памяти конфигурации в байтах (2*0x80)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F631");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x0460:        // выбрано устройство PIC12F683
                SelectedChip.Name               = "PIC12F683";          // имя чипа
                SelectedChip.ImageName          = "PIC12F635.jpg";      // имя файла с картинкой (одинаковый с PIC12F635)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 4096;                 // размер flash-памяти в байтах (2k x 14)
                SelectedChip.Area2Size          = 256;                  // размер Data-памяти в байтах (256 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F683");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x0FA0:        // выбрано устройство PIC12F635
                SelectedChip.Name               = "PIC12F635";          // имя чипа
                SelectedChip.ImageName          = "PIC12F635.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах (1k x 14)
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах (128 x 8)
                SelectedChip.Area3Size          = 128;                  // размер памяти конфигурации в байтах (2*0x40)
                SelectedChip.TerProg            = 6;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 6;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 3;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F635");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word, 0x2008 - Calibr.Word";
                break;
    case 0x10C0:        // выбрано устройство PIC16F630
                SelectedChip.Name               = "PIC16F630";          // имя чипа
                SelectedChip.ImageName          = "PIC16F630.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 64;                   // размер памяти конфигурации в байтах
                SelectedChip.TerProg            = 8;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 8;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 2;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F630");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word; The OSCCAL is located in the last word of the Program Memory";
                break;
    case 0x10E0:        // выбрано устройство PIC16F676
                SelectedChip.Name               = "PIC16F676";          // имя чипа
                SelectedChip.ImageName          = "PIC16F630.jpg";      // имя файла с картинкой (одинаковый с PIC16F630)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 64;                   // размер памяти конфигурации в байтах
                SelectedChip.TerProg            = 8;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 8;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 2;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC16F676");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word; The OSCCAL is located in the last word of the Program Memory";
                break;
    case 0x0F80:        // выбрано устройство PIC12F629
                SelectedChip.Name               = "PIC12F629";          // имя чипа
                SelectedChip.ImageName          = "PIC12F629.jpg";      // имя файла с картинкой
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 64;                   // размер памяти конфигурации в байтах
                SelectedChip.TerProg            = 8;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 8;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 2;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F629");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word; The OSCCAL is located in the last word of the Program Memory";
                break;
    case 0x0FC0:        // выбрано устройство PIC12F675
                SelectedChip.Name               = "PIC12F675";          // имя чипа
                SelectedChip.ImageName          = "PIC12F629.jpg";      // имя файла с картинкой (одинаковый с PIC12F629)
                SelectedChip.ID                 = ID;                   // слово идентификации
                SelectedChip.ConfigStart        = 0x2000;               // адрес начала области конфигурирования
                SelectedChip.DataStart          = 0x2100;               // адрес начала области данных
                SelectedChip.Area1Size          = 2048;                 // размер flash-памяти в байтах
                SelectedChip.Area2Size          = 128;                  // размер Data-памяти в байтах
                SelectedChip.Area3Size          = 64;                   // размер памяти конфигурации в байтах
                SelectedChip.TerProg            = 8;                    // задержка на стирание программы, мс
                SelectedChip.TerData            = 8;                    // задержка на стирание данных, мс
                SelectedChip.TwrProgInt         = 3;                    // задержка на запись программы int, мс
                SelectedChip.TwrProgExt         = 2;                    // задержка на запись программы ext, мс
                SelectedChip.TwrDataInt         = 6;                    // задержка на запись данных int, мс
                SelectedChip.TwrDataExt         = 0;                    // задержка на запись данных ext, мс
                InitFormInf(SelectedChip.ID);   // инициализируем данные ричэдитов под наш чип
                SendMsgToLog(15," PIC12F675");  // сообщение в лог
                Form1->Label10->Caption = "0x2000..0x2003 - User ID, 0x2006 - Device ID, 0x2007 - Config.Word; The OSCCAL is located in the last word of the Program Memory";
                break;
    case 0:     SendMsgToLog(14,"");            // сообщение в лог, что не выбран ни один чип
                Form1->Label10->Caption = "Configuration Memory Map: ?";
                return;                         // в этом случае инициализировать ничего не нужно (размеры областей мы не знаем)
    default:    SendMsgToLog(15," unknown");    // сообщение в лог, что чип нам неизвестен и выходим
                Form1->Label10->Caption = "Configuration Memory Map: ?";
                return;                         // в этом случае инициализировать его не нужно (размеры его областей мы не знаем)
  }
  // инициализируем все области памяти
  InitArea(1); InitArea(2); InitArea(3);
  // перестраиваем ричэдиты, в которых показывается область конфигурации (при инициализации она заполняется данными по-умолчанию)
  PlaceDataToForm(6,3); PlaceDataToForm(7,3);   // область конфигурации у нас отображается в RichEdit6 и RichEdit7
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ ВЫБРАННОЙ ОБЛАСТИ ДАННЫХ --------------------------------
//---------------------------------------------------------------------------
void InitArea(unsigned char Number)
{ switch(Number)
  { case 1:  // заполняем 3FFF-ками область 1 (программа)
             for(unsigned int i=0; i<262144; i+=2)      // перебираем по словам
             { SelectedChip.Area1[i]    = 0xFF;         // младший байт = 0xFF (чётный)
               SelectedChip.Area1[i+1]  = 0x3F;         // старший байт = 0x3F (нечётный)
             }
             break;
    case 2:  // заполняем FF-ками область 2 (данные)
             for(unsigned int i=0; i<65536; i++)        // перебираем по байтам
             { SelectedChip.Area2[i]=0xFF; }            // каждый байт = 0xFF
             break;
    case 3:  // заполняем 3FFF-ками область 3 (конфигурация)
             for(unsigned int i=0; i<1024; i+=2)        // перебираем по словам
             { SelectedChip.Area3[i]    = 0xFF;         // младший байт = 0xFF (чётный)
               SelectedChip.Area3[i+1]  = 0x3F;         // старший байт = 0x3F (нечётный)
             }
             // а затем заполняем значения конфигурации по-умолчанию в зависимости от чипа
             switch(SelectedChip.ID&0x3FE0)     // отрезаем 5 младших бит при выборе чипа (они определяют ревизию, а не модель)
             { case 0x1C60:     // выбрано устройство PIC16LF721
               case 0x1C20:     // выбрано устройство PIC16F721
               case 0x1C40:     // выбрано устройство PIC16LF720
               case 0x1C00:     // выбрано устройство PIC16F720
                                SelectedChip.Area3[2*6]         = SelectedChip.ID;      // младший байт идентификатора
                                SelectedChip.Area3[2*6+1]       = SelectedChip.ID>>8;   // старший байт идентификатора
                                SelectedChip.Area3[2*7+1]       = 0x3C;                 // старший байт первого слова конфигурации (по-умолчанию)
                                break;
               case 0x3020:     // возможно это PIC16F753
                                if(SelectedChip.ID == 0x3030)       // если это точно PIC16F753
                                {       SelectedChip.Area3[2*6]         = SelectedChip.ID;      // младший байт идентификатора
                                        SelectedChip.Area3[2*6+1]       = SelectedChip.ID>>8;   // старший байт идентификатора
                                        // конфигурация по-умолчанию равна 0x3FFF, так что ничего дополнительно писать не нужно
                                        break;
                                }
                                break;
               case 0x2060:     // выбрано устройство PIC16F886
               case 0x2040:     // выбрано устройство PIC16F884
               case 0x2020:     // выбрано устройство PIC16F883
               case 0x2000:     // выбрано устройство PIC16F882
               case 0x1900:     // выбрано устройство PIC16LF727
               case 0x1800:     // выбрано устройство PIC16F727
               case 0x1940:     // выбрано устройство PIC16LF724
               case 0x1840:     // выбрано устройство PIC16F724
               case 0x1920:     // выбрано устройство PIC16LF726
               case 0x1820:     // выбрано устройство PIC16F726
               case 0x1B40:     // выбрано устройство PIC16LF723A
               case 0x1B00:     // выбрано устройство PIC16F723A
               case 0x1960:     // выбрано устройство PIC16LF723
               case 0x1860:     // выбрано устройство PIC16F723
               case 0x1B60:     // выбрано устройство PIC16LF722A
               case 0x1B20:     // выбрано устройство PIC16F722A
               case 0x1980:     // выбрано устройство PIC16LF722
               case 0x1880:     // выбрано устройство PIC16F722
               case 0x1AE0:     // выбрано устройство PIC16LF707
               case 0x1AC0:     // выбрано устройство PIC16F707
               case 0x1060:     // выбрано устройство PIC16F628A
               case 0x1040:     // выбрано устройство PIC16F627A
               case 0x1200:     // выбрано устройство PIC16F785
               case 0x1480:     // выбрано устройство PIC16F1847
               case 0x1BC0:     // выбрано устройство PIC12LF1840
               case 0x1B80:     // выбрано устройство PIC12F1840
               case 0x28E0:     // выбрано устройство PIC16LF1829
               case 0x27E0:     // выбрано устройство PIC16F1829
               case 0x28C0:     // выбрано устройство PIC16LF1828
               case 0x27C0:     // выбрано устройство PIC16F1828
               case 0x28A0:     // выбрано устройство PIC16LF1827
               case 0x27A0:     // выбрано устройство PIC16F1827
               case 0x2880:     // выбрано устройство PIC16LF1826
               case 0x2780:     // выбрано устройство PIC16F1826
               case 0x2860:     // выбрано устройство PIC16LF1825
               case 0x2760:     // выбрано устройство PIC16F1825
               case 0x2840:     // выбрано устройство PIC16LF1824
               case 0x2740:     // выбрано устройство PIC16F1824
               case 0x2820:     // выбрано устройство PIC16LF1823
               case 0x2720:     // выбрано устройство PIC16F1823
               case 0x2800:     // выбрано устройство PIC12LF1822
               case 0x2700:     // выбрано устройство PIC12F1822
               case 0x1240:     // выбрано устройство PIC16F616
               case 0x2260:     // выбрано устройство PIC16F610
               case 0x2240:     // выбрано устройство PIC12F609
               case 0x1360:     // выбрано устройство PIC12F617
               case 0x2180:     // выбрано устройство PIC12F615
               case 0x2E00:     // выбрано устройство PIC16LF1509
               case 0x2D40:     // выбрано устройство PIC16F1509
               case 0x2DE0:     // выбрано устройство PIC16LF1508
               case 0x2D20:     // выбрано устройство PIC16F1508
               case 0x2DC0:     // выбрано устройство PIC16LF1507
               case 0x2D00:     // выбрано устройство PIC16F1507
               case 0x2DA0:     // выбрано устройство PIC16LF1503
               case 0x2CE0:     // выбрано устройство PIC16F1503
               case 0x2D80:     // выбрано устройство PIC12LF1501
               case 0x2CC0:     // выбрано устройство PIC12F1501
               case 0x1500:     // выбрано устройство PIC12F752
               case 0x1400:     // выбрано устройство PIC16F690
               case 0x1340:     // выбрано устройство PIC16F689
               case 0x1180:     // выбрано устройство PIC16F688
               case 0x1320:     // выбрано устройство PIC16F687
               case 0x04A0:     // выбрано устройство PIC16F685
               case 0x1080:     // выбрано устройство PIC16F684
               case 0x1440:     // выбрано устройство PIC16F677
               case 0x10A0:     // выбрано устройство PIC16F636 / PIC16F639
               case 0x1420:     // выбрано устройство PIC16F631
               case 0x0460:     // выбрано устройство PIC12F683
               case 0x0FA0:     // выбрано устройство PIC12F635
                                SelectedChip.Area3[2*6]         = SelectedChip.ID;      // младший байт идентификатора
                                SelectedChip.Area3[2*6+1]       = SelectedChip.ID>>8;   // старший байт идентификатора
                                // конфигурация по-умолчанию равна 0x3FFF, так что ничего дополнительно писать не нужно
                                break;
               case 0x10C0:     // выбрано устройство PIC16F630
               case 0x10E0:     // выбрано устройство PIC16F676
               case 0x0F80:     // выбрано устройство PIC12F629
               case 0x0FC0:     // выбрано устройство PIC12F675
                                SelectedChip.Area3[2*6]         = SelectedChip.ID;      // младший байт идентификатора
                                SelectedChip.Area3[2*6+1]       = SelectedChip.ID>>8;   // старший байт идентификатора
                                SelectedChip.Area3[2*7+1]       = 0x31;                 // старший байт конфигурации (по-умолчанию)
                                break;
               case 0:
               default:         break;
             }
             break;
    default: break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ ДАННЫЕ ИЗ BIN-ФАЙЛА В ПАМЯТЬ --------------------------------
//---------------------------------------------------------------------------
void LoadFromBinFileToMemory(AnsiString FilePath, unsigned char Area)
{ TFileStream* fs;              // указатель на поток чтения
  unsigned char rffch[1];       // сюда читаем байт из файла
  unsigned int   Position;      // сюда получаем позицию файла

  fs=new TFileStream(FilePath,fmOpenRead);      // создаём поток для чтения
  switch(Area)
  { case 0:     // загружаем программу, конфигурацию и EEPROM
                SendMsgToLog(21,FilePath);                              // загружаем программу из BIN-файла
                InitArea(1); InitArea(2); InitArea(3);                  // переинициализируем области, в которые будем грузить (чтобы стереть предыдущие данные)
                // включаем прогресс-бар
                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;
                  }
                }
                // в PIC-контроллерах конфиг хранится вместе с программой, так что читаем и его тоже
                Position = fs->Seek(2*SelectedChip.ConfigStart,soFromBeginning);        // перемещаем указатель на начало области конфига (2*0x2000)
                if(Position == 2*SelectedChip.ConfigStart)              // если установился - пробуем прочитать конфиг
                { for(unsigned int i=0; i<SelectedChip.Area3Size; i++)  // заполняем память конфига
                  { if(fs->Read(rffch,1))                               // если успешно прочитали байт
                    { SelectedChip.Area3[i]=rffch[0];                   // пихаем его куда нужно
                    }
                    // если кратно 1024 - вычисляем новую позицию прогресс-бара
                    if(i%1024==0)
                    { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area3Size;
                    }
                  }
                }
                else                    // если конфига нет - выдаём предупреждение, что в файле нет конфига
                { Application->MessageBox("There is no config in the file", "Warning", MB_OK|MB_ICONWARNING|MB_APPLMODAL);
                }
                // в PIC-контроллерах данные хранятся вместе с программой, так что читаем и их тоже
                Position = fs->Seek(2*SelectedChip.DataStart,soFromBeginning);   // перемещаем указатель на начало области данных (2*0x2100)
                if(Position == 2*SelectedChip.DataStart)                // если установился - пробуем прочитать данные
                { 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;
                    }
                  }
                }
                else                    // если данных нет - выдаём предупреждение, что в файле нет данных
                { Application->MessageBox("There is no EEPROM data in the file", "Warning", MB_OK|MB_ICONWARNING|MB_APPLMODAL);
                }
                LBar->Free();                                 // уничтожаем форму с прогресс-баром
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  // выбрана вкладка Page1
                           PlaceDataToForm(1,1);   // выводим в RichEdit1 Program
                           PlaceDataToForm(6,3);   // выводим в RichEdit6 Config
                           PlaceDataToForm(3,2);   // выводим в RichEdit3 EEPROM
                           break;
                  case 1:  // выбрана вкладка Page2
                           PlaceDataToForm(2,1);   // выводим в RichEdit2 Program
                           PlaceDataToForm(7,3);   // выводим в RichEdit7 Config
                           PlaceDataToForm(4,2);   // выводим в RichEdit4 EEPROM
                           break;
                  default: break;
                }
                break;
    case 1:     // загружаем только программу
                SendMsgToLog(10,FilePath);                              // загружаем программу из BIN-файла
                InitArea(1);                                            // переинициализируем области, в которые будем грузить (чтобы стереть предыдущие данные)
                // включаем прогресс-бар
                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-файла
                InitArea(2);                                            // переинициализируем области, в которые будем грузить (чтобы стереть предыдущие данные)
                // включаем прогресс-бар
                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;
    case 3:     // загружаем только конфиг
                SendMsgToLog(22,FilePath);                              // загружаем конфиг из BIN-файла
                InitArea(3);                                            // переинициализируем области, в которые будем грузить (чтобы стереть предыдущие данные)
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                for(unsigned int i=0; i<SelectedChip.Area3Size; i++)    // заполняем память данных
                { if(fs->Read(rffch,1))                                 // если успешно прочитали байт
                  { SelectedChip.Area3[i]=rffch[0];                     // пихаем его куда нужно
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/SelectedChip.Area3Size;
                  }
                }
                LBar->Free();                                 // уничтожаем форму с прогресс-баром
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  // выбрана вкладка Page1
                           PlaceDataToForm(6,3);   // выводим в RichEdit6 Config
                           break;
                  case 1:  // выбрана вкладка Page2
                           PlaceDataToForm(7,3);   // выводим в RichEdit7 Config
                           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 0:     // загружаем программу, конфигурацию и данные
                SendMsgToLog(21,FilePath);              // загружаем программу из HEX-файла
                InitArea(1); InitArea(2); InitArea(3);  // переинициализируем область, в которую будем грузить (чтобы стереть предыдущие данные)
                break;
    case 1:     // загружаем программу
                SendMsgToLog(10,FilePath);              // загружаем программу из HEX-файла
                InitArea(1);                            // переинициализируем область, в которую будем грузить (чтобы стереть предыдущие данные)
                break;
    case 2:     // загружаем данные
                SendMsgToLog(11,FilePath);              // загружаем данные из HEX-файла
                InitArea(2);                            // переинициализируем область, в которую будем грузить (чтобы стереть предыдущие данные)
                break;
    case 3:     // загружаем конфиг
                SendMsgToLog(22,FilePath);              // загружаем данные из HEX-файла
                InitArea(3);                            // переинициализируем область, в которую будем грузить (чтобы стереть предыдущие данные)
                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 0:     // загружаем программу, конфиг и данные
                                if(Address<SelectedChip.Area1Size)
                                { SelectedChip.Area1[Address]=OutBuf[0];
                                }
                                else if(Address<(2*SelectedChip.ConfigStart+SelectedChip.Area3Size))
                                { SelectedChip.Area3[Address-2*SelectedChip.ConfigStart]=OutBuf[0];
                                }
                                // для памяти данных размер указан в байтах, но на каждый такой байт в файле хранится слово
                                // с нулевым старшим байтом, поэтому размер в байтах тоже нужно умножать на 2, как и адрес
                                else if(Address<2*(SelectedChip.DataStart+SelectedChip.Area2Size))
                                { // загружаем только младшие байты (почему-то память данных хранится тоже в словах, но при этом старшие байты этих слов равны нулю, проверено на хексах из мплаб)
                                  if(Address%2==0) SelectedChip.Area2[(Address-2*SelectedChip.DataStart)/2]=OutBuf[0];
                                }
                                break;
                    case 1:     // загружаем программу
                                if(Address<SelectedChip.Area1Size)
                                { SelectedChip.Area1[Address]=OutBuf[0];
                                }
                                break;
                    case 2:     // загружаем данные
                                // для памяти данных размер указан в байтах, но на каждый такой байт в файле хранится слово
                                // с нулевым старшим байтом, поэтому размер в байтах нужно умножать на 2
                                if(Address<2*SelectedChip.Area2Size)
                                { // загружаем только младшие байты (почему-то память данных хранится тоже в словах, но при этом старшие байты этих слов равны нулю, проверено на хексах из мплаб)
                                  if(Address%2==0) SelectedChip.Area2[Address/2]=OutBuf[0];
                                }
                                break;
                    case 3:     // загружаем конфиг
                                if(Address<SelectedChip.Area3Size)
                                { SelectedChip.Area3[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 0:  // загружали программу, конфигурацию и данные
                        PlaceDataToForm(1,1);   // выводим в RichEdit1 Program
                        PlaceDataToForm(6,3);   // выводим в RichEdit6 Конфигурацию
                        PlaceDataToForm(3,2);   // выводим в RichEdit3 данные
                        break;
               case 1:  // загружали программу
                        PlaceDataToForm(1,1);   // выводим в RichEdit1 Program
                        break;
               case 2:  // загружали данные
                        PlaceDataToForm(3,2);   // выводим в RichEdit3 Data
                        break;
               case 3:  // загружали конфигурацию
                        PlaceDataToForm(6,3);   // выводим в RichEdit1 Program
                        break;
               default: break;
             }
             break;
    case 1:  // выбрана вкладка Page2
             switch(Area)
             { case 0:  // загружали программу, конфигурацию и данные
                        PlaceDataToForm(2,1);   // выводим в RichEdit2 Program
                        PlaceDataToForm(7,3);   // выводим в RichEdit7 Конфигурацию
                        PlaceDataToForm(4,2);   // выводим в RichEdit4 данные
                        break;
               case 1:  // загружали программу
                        PlaceDataToForm(2,1);   // выводим в RichEdit2 Program
                        break;
               case 2:  // загружали данные
                        PlaceDataToForm(4,2);   // выводим в RichEdit4 Data
                        break;
               case 3:  // загружали конфиг
                        PlaceDataToForm(7,3);   // выводим в RichEdit4 Data
                        break;
               default: break;
             }
             break;
    default: break;
  }
}
//---------------------------------------------------------------------------
//--- СОХРАНЯЕМ ДАННЫЕ ИЗ ПАМЯТИ В BIN-ФАЙЛ ---------------------------------
//--- При сохранении в бинарный файл данных EEPROM будем просто сохранять каждый байт,
//--- без преобразовывания байтов в слова добавлением к ним нулевых старших байтов
//--- оригинальные прошивки лежат в хексах, поэтому бинарники я делаю какие хочу
//---------------------------------------------------------------------------
void SaveFromMemoryToBinFile(AnsiString FilePath, unsigned char Area)
{ TFileStream* fs;              // указатель на поток записи
  char Symbol[1];               // символ для сохранения

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

  switch(Area)
  { case 0:     // сохраняем программу, конфигурацию и данные
                SendMsgToLog(23,FilePath);              // сохраняем программу, конфиг и данные в HEX-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Area1
                           GetDataToMemory(6,3);  // передаём данные из RichEdit6 в Area3
                           GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Area2
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Area1
                           GetDataToMemory(7,3);  // передаём данные из RichEdit7 в Area3
                           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.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;
                  }
                }
                // сохраняем конфигурацию
                for(unsigned int i=0; i<SelectedChip.Area3Size; i++)
                { if((2*SelectedChip.ConfigStart+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] = (2*SelectedChip.ConfigStart + i) >> 24;      // берём старший байт старшего слова
                    CheckSum[0]+= Value[0];     // добавляем его к контрольной сумме
                    BinToHex(Value,OutBuf,1);   // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);        // записать результат в файл
                    Value[0] = (2*SelectedChip.ConfigStart + 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((2*SelectedChip.ConfigStart + i)%8==0)                 // начинаем писать новую строку, если остаток от деления i на 8 равен 0
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=(2*SelectedChip.ConfigStart + i)/256;          // старший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем старший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку старшего байта адреса

                    Value[0]=(2*SelectedChip.ConfigStart + 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.Area3[i];       // берём очередной байт для записи
                  BinToHex(Value,OutBuf,1);             // преобразовать целое (байт) в строку
                  fs->Write(OutBuf,2);                  // записать в файл очередные 2 символа
                  CheckSum[0]=CheckSum[0]+Value[0];     // добавляем этот байт к контрольной сумме
                  // если это последний символ в строке - дописываем к ней CheckSum + символы конца строки и переноса
                  if((2*SelectedChip.ConfigStart+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.Area3Size;
                  }
                }
                // сохраняем данные
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++)
                { if((2*(SelectedChip.DataStart+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] = (2*(SelectedChip.DataStart+i)) >> 24;     // берём старший байт старшего слова
                    CheckSum[0]+= Value[0];     // добавляем его к контрольной сумме
                    BinToHex(Value,OutBuf,1);   // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);        // записать результат в файл
                    Value[0] = (2*(SelectedChip.DataStart+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((2*(SelectedChip.DataStart+i))%8==0) // начинаем писать новую строку, если остаток от деления i на 8 равен 0 (пишем 4 реальных байта и 4 нулевых старших байта)
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=(2*(SelectedChip.DataStart+i))/256;            // старший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем старший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку старшего байта адреса

                    Value[0]=(2*(SelectedChip.DataStart+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];     // добавляем этот байт к контрольной сумме
                  Value[0]=0;                           // вместо старших байтов будем писать нули
                  BinToHex(Value,OutBuf,1);             // преобразовать целое (байт) в строку
                  fs->Write(OutBuf,2);                  // записать в файл очередные 2 символа
                  CheckSum[0]=CheckSum[0]+Value[0];     // добавляем этот байт к контрольной сумме
                  // если это последний символ в строке - дописываем к ней CheckSum + символы конца строки и переноса
                  if((2*(SelectedChip.DataStart+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;
    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((2*i)%8==0)                        // начинаем писать новую строку, если остаток от деления i на 8 равен 0 (кроме 4 реальных байт в строке будут ещё 4 старших нулевых байта)
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=2*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];     // добавляем этот байт к контрольной сумме
                  Value[0]=0;                           // вместо старших байтов будем писать нули
                  BinToHex(Value,OutBuf,1);             // преобразовать целое (байт) в строку
                  fs->Write(OutBuf,2);                  // записать в файл очередные 2 символа
                  CheckSum[0]=CheckSum[0]+Value[0];     // добавляем этот байт к контрольной сумме
                  // если это последний символ в строке - дописываем к ней CheckSum + символы конца строки и переноса
                  if((2*(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;
    case 3:     // сохраняем конфиг
                SendMsgToLog(24,FilePath);              // сохраняем конфиг в HEX-файл
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(6,3);  // передаём данные из RichEdit6 в Area3
                           break;
                  case 1:  GetDataToMemory(7,3);  // передаём данные из RichEdit7 в Area3
                           break;
                  default: break;
                }
                // включаем прогресс-бар
                Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
                LBar->Show();                                           // показываем её в немодальном окне
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<(SelectedChip.Area3Size); 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.Area3[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.Area3Size;
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  SendMsgToLog(12,"");                                  // операция выполнена
}
//---------------------------------------------------------------------------
