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

  switch(FamilyCode)
  { case 0x0:   // ручной выбор чипа (для чипов с перезаписываемым ROM)
                switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(220,"");    // выбран чип RW1990
                           SelectedChip.Name            = "RW1990";     // имя чипа
                           SelectedChip.ImageName       = "0001.jpg"; // имя файла с картинкой
                           SelectedChip.Family          = 0x0;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                           SelectedChip.Area1Start      = 0;            //                                      Area1=not used
                           SelectedChip.Area1Size       = 0;            //
                           SelectedChip.Area2Start      = 0;            //                                      Area2=not used
                           SelectedChip.Area2Size       = 0;            //
                           SelectedChip.Area3Start      = 0;            //                                      Area3=not used
                           SelectedChip.Area3Size       = 0;            //
                           SelectedChip.Area4Start      = 0;            //                                      Area4=not used
                           SelectedChip.Area4Size       = 0;            //
                           break;
                  case 2:  SendMsgToLogForm(226,"");       // выбран чип AN1990
                           SelectedChip.Name            = "AN1990";     // имя чипа
                           SelectedChip.ImageName       = "0002.jpg"; // имя файла с картинкой
                           SelectedChip.Family          = 0x0;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                           SelectedChip.Area1Start      = 0;            //                                      Area1=not used
                           SelectedChip.Area1Size       = 0;            //
                           SelectedChip.Area2Start      = 0;            //                                      Area2=not used
                           SelectedChip.Area2Size       = 0;            //
                           SelectedChip.Area3Start      = 0;            //                                      Area3=not used
                           SelectedChip.Area3Size       = 0;            //
                           SelectedChip.Area4Start      = 0;            //                                      Area4=not used
                           SelectedChip.Area4Size       = 0;            //
                           break;
                  case 3:  SendMsgToLogForm(227,"");       // выбран чип TM-2004
                           SelectedChip.Name            = "TM-2004";    // имя чипа
                           SelectedChip.ImageName       = "0003.jpg"; // имя файла с картинкой
                           SelectedChip.Family          = 0x0;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                           SelectedChip.Area1Start      = 0;            //                                      Area1=not used
                           SelectedChip.Area1Size       = 0;            //
                           SelectedChip.Area2Start      = 0;            //                                      Area2=not used
                           SelectedChip.Area2Size       = 0;            //
                           SelectedChip.Area3Start      = 0;            //                                      Area3=not used
                           SelectedChip.Area3Size       = 0;            //
                           SelectedChip.Area4Start      = 0;            //                                      Area4=not used
                           SelectedChip.Area4Size       = 0;            //
                           break;
                  default: break;
                }
                break;
    case 0x2:   SendMsgToLogForm(205,"");          // выбран чип DS1991
                SelectedChip.Name               = "DS1991";     // имя чипа
                SelectedChip.ImageName          = "0200.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x02;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=Key1 (subkey 00, start address 00 000000)
                SelectedChip.Area1Size          = 64;           // размер памяти
                SelectedChip.Area2Start         = 0x40;         //                                      Area2=Key2 (subkey 01, start sddress 01 000000)
                SelectedChip.Area2Size          = 64;           //
                SelectedChip.Area3Start         = 0x80;         //                                      Area3=Key3 (subkey 10, start address 10 000000)
                SelectedChip.Area3Size          = 64;           //
                SelectedChip.Area4Start         = 0xC0;         //                                      Area4=Scratchpad (subkey 11, start address 11 000000)
                SelectedChip.Area4Size          = 64;           //
                break;
    case 0x4:   switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(221,"");                    // выбран чип DS2404
                           SelectedChip.Name            = "DS2404";     // имя чипа
                           SelectedChip.ImageName       = "0401.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(215,"");                    // по-умолчанию для этого семейства выбран чип DS1994
                           SelectedChip.Name            = "DS1994";     // имя чипа
                           SelectedChip.ImageName       = "0400.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x04;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0x200;        // начальный адрес timekeeping registers
                SelectedChip.Area2Size          = 32;           // размер timekeeping registers
                SelectedChip.Area3Start         = 0x0;          // начальный адрес блокнота
                SelectedChip.Area3Size          = 32;           // размер блокнота
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x5:   SendMsgToLogForm(211,"");          // выбран чип DS2405
                SelectedChip.Name               = "DS2405";     // имя чипа
                SelectedChip.ImageName          = "0500.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x05;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // у этого чипа вообще нет памяти, кроме ROM
                SelectedChip.Area1Size          = 0;            //
                SelectedChip.Area2Start         = 0;            //
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x6:   SendMsgToLogForm(208,"");          // выбран чип DS1993
                SelectedChip.Name               = "DS1993";     // имя чипа
                SelectedChip.ImageName          = "0600.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x6;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блока блокнота       Area2=Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x8:   SendMsgToLogForm(207,"");          // выбран чип DS1992
                SelectedChip.Name               = "DS1992";     // имя чипа
                SelectedChip.ImageName          = "0800.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x8;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 128;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блока блокнота       Area2=Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x9:   switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(229,"");                    // выбран чип DS1982
                           SelectedChip.Name            = "DS1982";     // имя чипа
                           SelectedChip.ImageName       = "0901.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(228,"");    // по-умолчанию для этого семейства выбран чип DS2502
                           SelectedChip.Name            = "DS2502";     // имя чипа
                           SelectedChip.ImageName       = "0900.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x9;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 128;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес байтов статуса       Area2=Status Bytes
                SelectedChip.Area2Size          = 8;            // количество байтов статуса
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0xA:   SendMsgToLogForm(209,"");          // выбран чип DS1995
                SelectedChip.Name               = "DS1995";     // имя чипа
                SelectedChip.ImageName          = "0A00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0xA;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 2048;         // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блока блокнота       Area2=Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0xC:   SendMsgToLogForm(210,"");          // выбран чип DS1996
                SelectedChip.Name               = "DS1996";     // имя чипа
                SelectedChip.ImageName          = "0C00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0xC;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 8192;         // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блока блокнота       Area2=Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0xD:   SendMsgToLogForm(225,"");          // выбран чип DS28E05
                SelectedChip.Name               = "DS28E05";    // имя чипа
                SelectedChip.ImageName          = "0D00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0xD;          // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 112;          // размер памяти
                SelectedChip.Area2Start         = 0x70;         // начальный адрес админ. блока         Area2=Admin Block
                SelectedChip.Area2Size          = 16;           // размер админ. блока
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x10:  switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(222,"");                    // выбран чип DS1920
                           SelectedChip.Name            = "DS1920";     // имя чипа
                           SelectedChip.ImageName       = "1001.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(200,"");                    // по умолчанию для этого семейства выбран чип DS18S20
                           SelectedChip.Name            = "DS18S20";    // имя чипа
                           SelectedChip.ImageName       = "1000.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x10;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=Scratchpad
                SelectedChip.Area1Size          = 8;            // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=not used
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x14:  switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(223,"");                    // выбран чип DS1971
                           SelectedChip.Name            = "DS1971";     // имя чипа
                           SelectedChip.ImageName       = "1401.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(201,"");                    // по-умолчанию для этого семейства выбран чип DS2430A
                           SelectedChip.Name            = "DS2430A";    // имя чипа
                           SelectedChip.ImageName       = "1400.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x14;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 32;           // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блокнота памяти      Area2=Data Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота памяти
                SelectedChip.Area3Start         = 0;            // начальный адрес регистров            Area3=Application Register / Application Register Scratchpad
                SelectedChip.Area3Size          = 8;            // размер регистров
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x1A:  SendMsgToLogForm(216,"");          // выбран чип DS1963L
                SelectedChip.Name               = "DS1963L";    // имя чипа
                SelectedChip.ImageName          = "1A00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x1A;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блокнота памяти      Area2=Data Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота памяти
                SelectedChip.Area3Start         = 0;            // начальный адрес счётчиков            Area3=Counters
                SelectedChip.Area3Size          = 16;           // размер счётчиков
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x1D:  SendMsgToLogForm(217,"");          // выбран чип DS2423
                SelectedChip.Name               = "DS2423";     // имя чипа
                SelectedChip.ImageName          = "1D00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x1D;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блокнота памяти      Area2=Data Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота памяти
                SelectedChip.Area3Start         = 0;            // начальный адрес счётчиков            Area3=Counters
                SelectedChip.Area3Size          = 16;           // размер счётчиков
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x22:  SendMsgToLogForm(212,"");          // выбран чип DS1822
                SelectedChip.Name               = "DS1822";     // имя чипа
                SelectedChip.ImageName          = "2200.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x22;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=Scratchpad
                SelectedChip.Area1Size          = 8;            // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=not used
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x23:  SendMsgToLogForm(202,"");          // выбран чип DS24B33
                SelectedChip.Name               = "DS24B33";    // имя чипа
                SelectedChip.ImageName          = "2300.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x23;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0;            // начальный адрес блока блокнота       Area2=Scratchpad
                SelectedChip.Area2Size          = 32;           // размер блокнота
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x24:  SendMsgToLogForm(213,"");          // выбран чип DS2415
                SelectedChip.Name               = "DS2415";     // имя чипа
                SelectedChip.ImageName          = "2400.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x24;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Control Byte + 4 Bytes Counter
                SelectedChip.Area1Size          = 8;            // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=not used
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x27:  SendMsgToLogForm(213,"");          // выбран чип DS2417
                SelectedChip.Name               = "DS2417";     // имя чипа
                SelectedChip.ImageName          = "2700.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x27;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Control Byte + 4 Bytes Counter
                SelectedChip.Area1Size          = 8;            // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=not used
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x28:  SendMsgToLogForm(203,"");          // выбран чип DS18B20
                SelectedChip.Name               = "DS18B20";    // имя чипа
                SelectedChip.ImageName          = "2800.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x28;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=Scratchpad
                SelectedChip.Area1Size          = 8;            // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=not used
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=not used
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x2C:  SendMsgToLogForm(219,"");          // выбран чип DS2890
                SelectedChip.Name               = "DS2890";     // имя чипа
                SelectedChip.ImageName          = "2C00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x2C;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // у этого чипа вообще нет памяти, кроме ROM
                SelectedChip.Area1Size          = 0;            //
                SelectedChip.Area2Start         = 0;            //
                SelectedChip.Area2Size          = 0;            //
                SelectedChip.Area3Start         = 0;            //
                SelectedChip.Area3Size          = 0;            //
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x2D:  switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(224,"");                    // выбран чип DS28E07
                           SelectedChip.Name            = "DS28E07";    // имя чипа
                           SelectedChip.ImageName       = "2D01.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(204,"");                    // по-умолчанию для этого семейства выбран чип DS2431
                           SelectedChip.Name            = "DS2431";     // имя чипа
                           SelectedChip.ImageName       = "2D00.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x2D;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 128;          // размер памяти
                SelectedChip.Area2Start         = 0x80;         // начальный адрес блока регистров      Area2=Registers
                SelectedChip.Area2Size          = 8;            // размер блока регистров
                SelectedChip.Area3Start         = 0;            // начальный адрес блокнота             Area3=Scratchpad
                SelectedChip.Area3Size          = 8;            // размер блокнота
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x33:  switch(SelectedChip.Modify)             // выбираем по введённой модификации
                { case 1:  SendMsgToLogForm(231,"");                    // выбран чип DS1961S
                           SelectedChip.Name            = "DS1961S";    // имя чипа
                           SelectedChip.ImageName       = "3301.jpg"; // имя файла с картинкой
                           break;
                  default: SendMsgToLogForm(230,"");                    // выбран чип DS2432
                           SelectedChip.Name            = "DS2432";     // имя чипа
                           SelectedChip.ImageName       = "3300.jpg"; // имя файла с картинкой
                           break;
                }
                SelectedChip.Family             = 0x33;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 128;          // размер памяти
                SelectedChip.Area2Start         = 0x80;         // начальный адрес секрета              Area2=Secret
                SelectedChip.Area2Size          = 8;            // размер секрета
                SelectedChip.Area3Start         = 0x88;         // начальный адрес страницы регистров   Area3=Register Page
                SelectedChip.Area3Size          = 8;            // размер страницы регистров
                SelectedChip.Area4Start         = 0x0;          // начальный адрес блокнота             Area4=Scratchpad
                SelectedChip.Area4Size          = 8;            // размер блокнота
                break;
    case 0x3B:  SendMsgToLogForm(232,"");          // выбран чип MAX31826
                SelectedChip.Name               = "MAX31826";   // имя чипа
                SelectedChip.ImageName          = "3B00.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x3B;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=EEPROM
                SelectedChip.Area1Size          = 128;          // размер памяти
                SelectedChip.Area2Start         = 0;            //                                      Area2=Scratchpad2
                SelectedChip.Area2Size          = 8;            //
                SelectedChip.Area3Start         = 0;            //                                      Area3=Scratchpad1
                SelectedChip.Area3Size          = 8;            //
                SelectedChip.Area4Start         = 0;            //                                      Area4=not used
                SelectedChip.Area4Size          = 0;            //
                break;
    case 0x43:  SendMsgToLogForm(233,"");          // выбран чип DS28EC20
                SelectedChip.Name               = "DS28EC20";    // имя чипа
                SelectedChip.ImageName          = "4300.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x43;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти               Area1=Data
                SelectedChip.Area1Size          = 2560;         // размер памяти
                SelectedChip.Area2Start         = 0xA00;        // начальный адрес страницы регистров   Area2=Registers Page
                SelectedChip.Area2Size          = 32;           // размер страницы регистров
                SelectedChip.Area3Start         = 0xA20;        // начальный адрес страницы factory data Area3=Factory Data Page
                SelectedChip.Area3Size          = 32;           // размер страницы factory data
                SelectedChip.Area4Start         = 0;            // начальный адрес блока блокнота       Area4=Scratchpad
                SelectedChip.Area4Size          = 32;           // размер блокнота
                break;
    case 0x82:  SendMsgToLogForm(206,"");          // выбран чип DS1425
                SelectedChip.Name               = "DS1425";     // имя чипа
                SelectedChip.ImageName          = "8200.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x82;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес блокнота             Area1=Key1 (subkey 00, start address 00 000000)
                SelectedChip.Area1Size          = 64;           // размер памяти
                SelectedChip.Area2Start         = 0x40;         //                                      Area2=Key2 (subkey 01, start sddress 01 000000)
                SelectedChip.Area2Size          = 64;           //
                SelectedChip.Area3Start         = 0x80;         //                                      Area3=Key3 (subkey 10, start address 10 000000)
                SelectedChip.Area3Size          = 64;           //
                SelectedChip.Area4Start         = 0xC0;         //                                      Area4=Scratchpad (subkey 11, start address 11 000000)
                SelectedChip.Area4Size          = 64;           //
                break;
    case 0x84:  SendMsgToLogForm(218,"");          // выбран чип DS1427
                SelectedChip.Name               = "DS1427";     // имя чипа
                SelectedChip.ImageName          = "8400.jpg"; // имя файла с картинкой
                SelectedChip.Family             = 0x84;         // тип чипа (это поле нужно, если тип в ROM нестандартный)
                SelectedChip.Area1Start         = 0;            // начальный адрес памяти
                SelectedChip.Area1Size          = 512;          // размер памяти
                SelectedChip.Area2Start         = 0x200;        // начальный адрес timekeeping registers
                SelectedChip.Area2Size          = 32;           // размер timekeeping registers
                SelectedChip.Area3Start         = 0x0;          // начальный адрес блокнота
                SelectedChip.Area3Size          = 32;           // размер блокнота
                SelectedChip.Area4Start         = 0;            //
                SelectedChip.Area4Size          = 0;            //
                break;
    default:    break;
  }
  // инициализируем все области памяти
  InitArea(1); InitArea(2); InitArea(3); InitArea(4);
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ ВЫБРАННОЙ ОБЛАСТИ ДАННЫХ --------------------------------
//---------------------------------------------------------------------------
void InitArea(unsigned int Number)
{ switch(Number)
  { case 1:  // заполняем FF-ками область 1
             for(unsigned int i=0; i<SelectedChip.Area1Size; i++)
             { SelectedChip.Area1[i]=0xFF; }
             break;
    case 2:  // заполняем FF-ками область 2
             for(unsigned int i=0; i<SelectedChip.Area2Size; i++)
             { SelectedChip.Area2[i]=0xFF; }
             break;
    case 3:  // заполняем FF-ками область 3
             for(unsigned int i=0; i<SelectedChip.Area3Size; i++)
             { SelectedChip.Area3[i]=0xFF; }
             break;
    case 4:  // заполняем FF-ками область 4
             for(unsigned int i=0; i<SelectedChip.Area4Size; i++)
             { SelectedChip.Area4[i]=0xFF; }
             break;
    default: break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ ДАННЫЕ ИЗ BIN-ФАЙЛА В ПАМЯТЬ --------------------------------
//---------------------------------------------------------------------------
void LoadFromBinFileToMemory(AnsiString FilePath)
{ TFileStream* fs;              // указатель на поток чтения
  unsigned char rffch[1];       // сюда читаем байт из файла

  SendMsgToLogForm(22,"");         // загружаем данные из BIN-файла в память
  // загружаем данные из bin-файла в память в зависимости от выбранного чипа
  switch(SelectedChip.Family)
  { case 0x0:   // ручной выбор чипа (для чипов с перезаписываемым ROM)
                switch(SelectedChip.Modify)
                { case 1:  // выбран ключ RW1990
                  case 2:  // выбран ключ AN1990
                  case 3:  // выбран ключ TM-2004
                           fs=new TFileStream(FilePath,fmOpenRead);// создаём поток для чтения
                           for(unsigned int i=0; i<8; i++)         // заполняем ROM
                           { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                             { SelectedChip.ROM[i]=rffch[0];       // пихаем его куда нужно
                             }
                           }
                           delete fs;                              // удаляем поток чтения
                           Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                           // теперь нужно поместить прочитанные данные из ROM на форму
                           PlaceDataToForm(0,0);                   // выводим данные ROM в Edit3 (второе входное значение не важно)
                           break;
                  default: break;
                }
                break;
    case 0x5:   // выбран чип DS2405
    case 0x2C:  // выбран чип DS2890
                SendMsgToLogForm(26,"");   // сообщаем что у чипа нет памяти
                break;
    case 0x2:   // выбран чип DS1991
    case 0x33:  // выбран чип DS2432 / DS1961S
    case 0x43:  // выбран чип DS28EC20
    case 0x82:  // выбран чип DS1425
                fs=new TFileStream(FilePath,fmOpenRead);        // создаём поток для чтения
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)      // заполняем Subkey1
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area1[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++) // заполняем Subkey2
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area2[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                for(unsigned int i=0; i<SelectedChip.Area3Size; i++) // заполняем Subkey3
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area3[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                delete fs;                              // удаляем поток чтения
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим Subkey1 в RichEdit1
                           PlaceDataToForm(3,2);        // выводим Subkey2 в RichEdit3
                           PlaceDataToForm(5,3);        // выводим Subkey3 в RichEdit5
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим Subkey1 в RichEdit2
                           PlaceDataToForm(4,2);        // выводим Subkey2 в RichEdit4
                           PlaceDataToForm(6,3);        // выводим Subkey3 в RichEdit6
                           break;
                  default: break;
                }
                break;
    case 0x6:   // выбран чип DS1993
    case 0x8:   // выбран чип DS1992
    case 0x9:   // выбран чип DS2502 / DS1982
    case 0xA:   // выбран чип DS1995
    case 0xC:   // выбран чип DS1996
    case 0x10:  // выбран чип DS18S20
    case 0x14:  // выбран чип DS2430A
    case 0x1A:  // выбран чип DS1963L
    case 0x1D:  // выбран чип DS2423
    case 0x22:  // выбран чип DS1822
    case 0x23:  // выбран чип DS24B33
    case 0x24:  // выбран чип DS2415
    case 0x27:  // выбран чип DS2417
    case 0x28:  // выбран чип DS18B20
    case 0x3B:  // выбран чип MAX31826
                fs=new TFileStream(FilePath,fmOpenRead);        // создаём поток для чтения
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)      // заполняем память данных
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area1[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                delete fs;                              // удаляем поток чтения
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим данные в ReachEdit1
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим данные в ReachEdit2
                           break;
                  default: break;
                }
                break;
    case 0x4:   // выбран чип DS1994
    case 0xD:   // выбран чип DS28E05
    case 0x2D:  // выбран чип DS2431
    case 0x84:  // выбран чип DS1427
                fs=new TFileStream(FilePath,fmOpenRead);        // создаём поток для чтения
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)      // заполняем память данных
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area1[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++) // заполняем память регистров
                { if(fs->Read(rffch,1))                 // если успешно прочитали байт
                  { SelectedChip.Area2[i]=rffch[0];     // пихаем его куда нужно
                  }
                }
                delete fs;                              // удаляем поток чтения
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим данные
                           PlaceDataToForm(3,2);        // выводим регистры
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим данные
                           PlaceDataToForm(4,2);        // выводим регистры
                           break;
                  default: break;
                }
                break;
    default:    SendMsgToLogForm(17,"");   // выбран неизвестный чип
                break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ ДАННЫЕ ИЗ HEX-ФАЙЛА В ПАМЯТЬ --------------------------------
//---------------------------------------------------------------------------
void LoadFromHexFileToMemory(AnsiString FilePath)
{ AnsiString TempStr, SubStr;
  unsigned char *InBuf, OutBuf[2];                      // для преобразования
  unsigned int n, Reclen, Offset, Rectype, Address,
               LinearBaseAddress, SegmentBaseAddress;

  SendMsgToLogForm(23,"");         // загружаем данные из HEX-файла в память
  LinearBaseAddress=0;    SegmentBaseAddress=0;         // инициализируем переменные для адресов
  // загружаем данные из hex-файла в память в зависимости от выбранного чипа
  switch(SelectedChip.Family)
  { case 0x0:   // ручной выбор чипа (для чипов с перезаписываемым ROM)
                switch(SelectedChip.Modify)
                { case 1:  // выбран ключ RW1990
                  case 2:  // выбран ключ AN1990
                  case 3:  // выбран ключ TM-2004
                           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);                             // преобразуем байт в  нормальный вид
                                          if(Address<8)
                                          { SelectedChip.ROM[Address]=OutBuf[0];
                                          }
                                        }
                                        break;
                                case 1: // End of file record
                                        i=n;    // заканчиваем просмотр записей
                                        Form1->StaticText1->Caption=FilePath;
                                        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;    // заканчиваем просмотр записей
                                        SendMsgToLogForm(18,"");   // это 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;    // заканчиваем просмотр записей
                                        SendMsgToLogForm(19,"");   // это HEX-файл от 80386
                                        break;
                                default:// Если ни один из типов не подходит - ошибка
                                        i=n;    // заканчиваем просмотр записей
                                        SendMsgToLogForm(20,"");   // неправильный формат файла
                                        break;
                              }
                           }
                           Form1->Memo1->Clear();          // очищаем Memo
                           // теперь нужно поместить прочитанные данные из ROM на форму
                           PlaceDataToForm(0,0);           // выводим данные ROM в Edit3 (второе входное значение не важно)
                           break;
                  default: SendMsgToLogForm(17,"");   // выбран неизвестный чип
                           break;
                }
                break;
    case 0x5:   // выбран чип DS2405
    case 0x2C:  // выбран чип DS2890
                SendMsgToLogForm(26,"");   // сообщаем что у чипа нет памяти
                break;
    case 0x2:   // выбран чип DS1991
    case 0x33:  // выбран чип DS2432 / DS1961S
    case 0x43:  // выбран чип DS28EC20
    case 0x82:  // выбран чип DS1425
                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);                             // преобразуем байт в  нормальный вид
                                  if((Address>=SelectedChip.Area1Start) && (Address<(SelectedChip.Area1Start+SelectedChip.Area1Size)))
                                  { SelectedChip.Area1[Address-SelectedChip.Area1Start]=OutBuf[0];
                                  }
                                  if((Address>=SelectedChip.Area2Start) && (Address<(SelectedChip.Area2Start+SelectedChip.Area2Size)))
                                  { SelectedChip.Area2[Address-SelectedChip.Area2Start]=OutBuf[0];
                                  }
                                  if((Address>=SelectedChip.Area3Start) && (Address<(SelectedChip.Area3Start+SelectedChip.Area3Size)))
                                  { SelectedChip.Area3[Address-SelectedChip.Area3Start]=OutBuf[0];
                                  }
                                }
                                break;
                     case 1: // End of file record
                                i=n;    // заканчиваем просмотр записей
                                Form1->StaticText1->Caption=FilePath;
                                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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(18,"");   // это 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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(19,"");   // это HEX-файл от 80386
                                break;
                     default:// Если ни один из типов не подходит - ошибка
                                i=n;    // заканчиваем просмотр записей
                                SendMsgToLogForm(20,"");   // неправильный формат файла
                                break;
                    }
                }
                Form1->Memo1->Clear();          // очищаем Memo
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим Subkey1 в RichEdit1
                           PlaceDataToForm(3,2);        // выводим Subkey2 в RichEdit3
                           PlaceDataToForm(5,3);        // выводим Subkey3 в RichEdit5
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим Subkey1 в RichEdit2
                           PlaceDataToForm(4,2);        // выводим Subkey2 в RichEdit4
                           PlaceDataToForm(6,3);        // выводим Subkey3 в RichEdit6
                           break;
                  default: break;
                }
                break;
    case 0x6:   // выбран чип DS1993
    case 0x8:   // выбран чип DS1992
    case 0x9:   // выбран чип DS2502 / DS1982
    case 0xA:   // выбран чип DS1995
    case 0xC:   // выбран чип DS1996
    case 0x10:  // выбран чип DS18S20
    case 0x14:  // выбран чип DS2430A
    case 0x1A:  // выбран чип DS1963L
    case 0x1D:  // выбран чип DS2423
    case 0x22:  // выбран чип DS1822
    case 0x23:  // выбран чип DS24B33
    case 0x24:  // выбран чип DS2415
    case 0x27:  // выбран чип DS2417
    case 0x28:  // выбран чип DS18B20
    case 0x3B:  // выбран чип MAX31826
                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);                             // преобразуем байт в  нормальный вид
                                  if((Address>=SelectedChip.Area1Start) && (Address<(SelectedChip.Area1Start+SelectedChip.Area1Size)))
                                  { SelectedChip.Area1[Address-SelectedChip.Area1Start]=OutBuf[0];
                                  }
                                }
                                break;
                     case 1: // End of file record
                                i=n;    // заканчиваем просмотр записей
                                Form1->StaticText1->Caption=FilePath;
                                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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(18,"");   // это 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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(19,"");   // это HEX-файл от 80386
                                break;
                     default:// Если ни один из типов не подходит - ошибка
                                i=n;    // заканчиваем просмотр записей
                                SendMsgToLogForm(20,"");   // неправильный формат файла
                                break;
                    }
                }
                Form1->Memo1->Clear();          // очищаем Memo
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим данные
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим данные
                           break;
                  default: break;
                }
                break;
    case 0x4:   // выбран чип DS1994
    case 0xD:   // выбран чип DS28E05
    case 0x2D:  // выбран чип DS2431
    case 0x84:  // выбран чип DS1427
                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);                             // преобразуем байт в  нормальный вид
                                  if((Address>=SelectedChip.Area1Start) && (Address<(SelectedChip.Area1Start+SelectedChip.Area1Size)))
                                  { SelectedChip.Area1[Address-SelectedChip.Area1Start]=OutBuf[0];
                                  }
                                  if((Address>=SelectedChip.Area2Start) && (Address<(SelectedChip.Area2Start+SelectedChip.Area2Size)))
                                  { SelectedChip.Area2[Address-SelectedChip.Area2Start]=OutBuf[0];
                                  }
                                }
                                break;
                     case 1: // End of file record
                                i=n;    // заканчиваем просмотр записей
                                Form1->StaticText1->Caption=FilePath;
                                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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(18,"");   // это 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;    // заканчиваем просмотр записей
                                SendMsgToLogForm(19,"");   // это HEX-файл от 80386
                                break;
                     default:// Если ни один из типов не подходит - ошибка
                                i=n;    // заканчиваем просмотр записей
                                SendMsgToLogForm(20,"");   // неправильный формат файла
                                break;
                    }
                }
                Form1->Memo1->Clear();          // очищаем Memo
                // теперь нужно поместить прочитанные данные на форму в зависимости от выбранной вкладки
                switch(Form1->PageControl1->TabIndex)
                { case 0:  PlaceDataToForm(1,1);        // выводим данные
                           PlaceDataToForm(3,2);        // выводим регистры
                           break;
                  case 1:  PlaceDataToForm(2,1);        // выводим данные
                           PlaceDataToForm(4,2);        // выводим регистры
                           break;
                  default: break;
                }
                break;
    default:    SendMsgToLogForm(17,"");   // выбран неизвестный чип
                break;
  }
}
//---------------------------------------------------------------------------
//--- СОХРАНЯЕМ ДАННЫЕ ИЗ ПАМЯТИ В BIN-ФАЙЛ ---------------------------------
//---------------------------------------------------------------------------
void SaveFromMemoryToBinFile(AnsiString FilePath)
{ TFileStream* fs;              // указатель на поток записи
  char Symbol[1];               // символ для сохранения

  SendMsgToLogForm(24,"");         // сохраняем данные из памяти в BIN-файл
  // загружаем данные из памяти в bin-файл в зависимости от выбранного чипа
  switch(SelectedChip.Family)
  { case 0x0:   // ручной выбор чипа (для чипов с перезаписываемым ROM)
                switch(SelectedChip.Modify)
                { case 1:  // выбран RW1990
                  case 2:  // выбран ключ AN1990
                  case 3:  // выбран ключ TM-2004
                           //----------------------------------------
                           // Забираем нужные данные с формы в память
                           //----------------------------------------
                           GetDataToMemory(0,0);  // получаем ROM с формы
                           fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                           for(unsigned int i=0; i<8; i++)
                           { Symbol[0]=char(SelectedChip.ROM[i]);
                             fs->Write(Symbol,1);                                  //сохраняем в файл
                           }
                           delete fs;                                              // закрываем поток записи
                           Form1->StaticText1->Caption=FilePath;                   // добавляем путь в строку
                           break;
                  default: SendMsgToLogForm(17,"");   // выбран неизвестный чип
                           break;
                }
                break;
    case 0x5:   // выбран чип DS2405
    case 0x2C:  // выбран чип DS2890
                SendMsgToLogForm(26,"");   // сообщаем что у чипа нет памяти
                break;
    case 0x2:   // выбран чип DS1991
    case 0x33:  // выбран чип DS2432 / DS1961S
    case 0x43:  // выбран чип DS28EC20
    case 0x82:  // выбран чип DS1425
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Subkey1
                           GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Subkey2
                           GetDataToMemory(5,3);  // передаём данные из RichEdit5 в Subkey3
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Subkey1
                           GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Subkey2
                           GetDataToMemory(6,3);  // передаём данные из RichEdit6 в Subkey3
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)
                { Symbol[0]=char(SelectedChip.Area1[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++)
                { Symbol[0]=char(SelectedChip.Area2[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                for(unsigned int i=0; i<SelectedChip.Area3Size; i++)
                { Symbol[0]=char(SelectedChip.Area3[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                delete fs;                                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;                   // добавляем путь в строку
                break;
    case 0x6:   // выбран чип DS1993
    case 0x8:   // выбран чип DS1992
    case 0x9:   // выбран чип DS2502 / DS1982
    case 0xA:   // выбран чип DS1995
    case 0xC:   // выбран чип DS1996
    case 0x10:  // выбран чип DS18S20
    case 0x14:  // выбран чип DS2430A
    case 0x1A:  // выбран чип DS1963L
    case 0x1D:  // выбран чип DS2423
    case 0x22:  // выбран чип DS1822
    case 0x23:  // выбран чип DS24B33
    case 0x24:  // выбран чип DS2415
    case 0x27:  // выбран чип DS2417
    case 0x28:  // выбран чип DS18B20
    case 0x3B:  // выбран чип MAX31826
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Data
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Data
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)
                { Symbol[0]=char(SelectedChip.Area1[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                delete fs;                                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;                   // добавляем путь в строку
                break;
    case 0x4:   // выбран чип DS1994
    case 0xD:   // выбран чип DS28E05
    case 0x2D:  // выбран чип DS2431
    case 0x84:  // выбран чип DS1427
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Data
                           GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Registers
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Data
                           GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Registers
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size; i++)
                { Symbol[0]=char(SelectedChip.Area1[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                for(unsigned int i=0; i<SelectedChip.Area2Size; i++)
                { Symbol[0]=char(SelectedChip.Area2[i]);
                  fs->Write(Symbol,1);                                  //сохраняем в файл
                }
                delete fs;                                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;                   // добавляем путь в строку
                break;
    default:    SendMsgToLogForm(17,"");   // выбран неизвестный чип
                break;
  }
}
//---------------------------------------------------------------------------
//--- СОХРАНЯЕМ ДАННЫЕ ИЗ ПАМЯТИ В HEX-ФАЙЛ ---------------------------------
//---------------------------------------------------------------------------
void SaveFromMemoryToHexFile(AnsiString FilePath)
{ TFileStream* fs;                      // указатель на поток записи
  unsigned char Value[1], OutBuf[2];    // для преобразования
  unsigned char CheckSum[1];            // для вычисления контрольной суммы

  SendMsgToLogForm(25,"");         // сохраняем данные из памяти в hex-файл
  // загружаем данные из памяти в hex-файл в зависимости от выбранного чипа
  switch(SelectedChip.Family)
  { case 0x0:   // ручной выбор чипа (для чипов с перезаписываемым ROM)
                switch(SelectedChip.Modify)
                { case 1:  // выбран RW1990
                  case 2:  // выбран ключ AN1990
                  case 3:  // выбран ключ TM-2004
                           //----------------------------------------
                           // Забираем нужные данные с формы в память
                           //----------------------------------------
                           GetDataToMemory(0,0);  // получаем ROM с формы
                           fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                           for(unsigned int i=0; i<8; 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.ROM[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);
                             }
                           }
                           // дописываем в файл признак конца файла
                           fs->Write(":00000001FF",11);            // сохраняем в файл
                           delete fs;                              // закрываем поток записи
                           Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                           break;
                  default: SendMsgToLogForm(17,"");   // выбран неизвестный чип
                           break;
                }
                break;
    case 0x5:   // выбран чип DS2405
    case 0x2C:  // выбран чип DS2890
                SendMsgToLogForm(26,"");   // сообщаем что у чипа нет памяти
                break;
    case 0x2:   // выбран чип DS1991
    case 0x33:  // выбран чип DS2432 / DS1961S
    case 0x43:  // выбран чип DS28EC20
    case 0x82:  // выбран чип DS1425
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Subkey1
                           GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Subkey2
                           GetDataToMemory(5,3);  // передаём данные из RichEdit5 в Subkey3
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Subkey1
                           GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Subkey2
                           GetDataToMemory(6,3);  // передаём данные из RichEdit6 в Subkey3
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<(SelectedChip.Area1Size+SelectedChip.Area2Size+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);                // записать буфер в файл
                  }
                  // берём очередной байт для записи
                  if(i<SelectedChip.Area1Size)                                  Value[0]=SelectedChip.Area1[i];
                  else if(i<(SelectedChip.Area1Size+SelectedChip.Area2Size))    Value[0]=SelectedChip.Area2[i-SelectedChip.Area1Size];
                  else                                                          Value[0]=SelectedChip.Area3[i-SelectedChip.Area1Size-SelectedChip.Area2Size];
                  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);
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                break;
    case 0x6:   // выбран чип DS1993
    case 0x8:   // выбран чип DS1992
    case 0x9:   // выбран чип DS2502 / DS1982
    case 0xA:   // выбран чип DS1995
    case 0xC:   // выбран чип DS1996
    case 0x10:  // выбран чип DS18S20
    case 0x14:  // выбран чип DS2430A
    case 0x1A:  // выбран чип DS1963L
    case 0x1D:  // выбран чип DS2423
    case 0x22:  // выбран чип DS1822
    case 0x23:  // выбран чип DS24B33
    case 0x24:  // выбран чип DS2415
    case 0x27:  // выбран чип DS2417
    case 0x28:  // выбран чип DS18B20
    case 0x3B:  // выбран чип MAX31826
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Data
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Data
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size; 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.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);
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                break;
    case 0x4:   // выбран чип DS1994
    case 0xD:   // выбран чип DS28E05
    case 0x2D:  // выбран чип DS2431
    case 0x84:  // выбран чип DS1427
                //----------------------------------------
                // Забираем нужные данные с формы в память
                //----------------------------------------
                switch(Form1->PageControl1->TabIndex)
                { case 0:  GetDataToMemory(1,1);  // передаём данные из RichEdit1 в Data
                           GetDataToMemory(3,2);  // передаём данные из RichEdit3 в Registers
                           break;
                  case 1:  GetDataToMemory(2,1);  // передаём данные из RichEdit2 в Data
                           GetDataToMemory(4,2);  // передаём данные из RichEdit4 в Registers
                           break;
                           default: break;
                }
                fs = new TFileStream(FilePath,fmCreate|fmOpenWrite);    // открываем файл для записи
                for(unsigned int i=0; i<SelectedChip.Area1Size+SelectedChip.Area2Size; i++)
                { if(i%8==0)                            // начинаем писать новую строку, если остаток от деления i на 8 равен 0
                  { CheckSum[0]=0x08;                   // обнуляем CheckSum и прибавляем второй байт строки (RECLEN)
                    fs->Write(":08",3);                 // пишем начало новой строки - признак (:) и RECLEN (0x08 = 8 байт)
                    //вычисляем адрес
                    Value[0]=i/256;                     // старший байт адреса
                    CheckSum[0]=CheckSum[0]+Value[0];   // прибавляем старший байт к контрольной сумме
                    BinToHex(Value,OutBuf,1);           // преобразовать целое (байт) в строку
                    fs->Write(OutBuf,2);                // записать в файл HEX-строку старшего байта адреса

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

                    OutBuf[0]=0x30;                     // пишем в буфер RECTYPE
                    OutBuf[1]=0x30;                     // "00" - DATA RECORD  ( 0x30="0")
                    fs->Write(OutBuf,2);                // записать буфер в файл
                  }
                  // берём очередной байт для записи
                  if(i<SelectedChip.Area1Size)   Value[0]=SelectedChip.Area1[i];
                  else                           Value[0]=SelectedChip.Area2[i-SelectedChip.Area1Size];
                  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);
                  }
                }
                // дописываем в файл признак конца файла
                fs->Write(":00000001FF",11);            // сохраняем в файл
                delete fs;                              // закрываем поток записи
                Form1->StaticText1->Caption=FilePath;   // добавляем путь в строку
                break;
    default:    SendMsgToLogForm(17,"");   // выбран неизвестный чип
                break;
  }
}
//---------------------------------------------------------------------------
