//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "UMain.h"
#include "BldrSource.h"
#include "DiskMan.h"
#include "UConfig.h"
#include "Config.h"
#define RECORD_DATA_LENGTH 0x0002
#define RECORD_LOAD_ADDRESS 0x0004
#define RECORD_TYPE 0x0002
#define RECORD_CHECKSUM 0x0002
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFMain *FMain;
//---------------------------------------------------------------------------
__fastcall TFMain::TFMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TFMain::CmExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
int Hex(char Hex)
{
if ( Hex >= '0' && Hex <= '9' )
return Hex - '0';
switch ( Hex )
{
case 'A':
case 'a':
return 10;
case 'B':
case 'b':
return 11;
case 'C':
case 'c':
return 12;
case 'D':
case 'd':
return 13;
case 'E':
case 'e':
return 14;
case 'F':
case 'f':
return 15;
}
return -1;
}
//---------------------------------------------------------------------------
BYTE HexToBYTE(AnsiString H) //Onley 2 simbols (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)
{
BYTE ret = 0;
if ( H.Length() < 2 )
return ret; //throw "Invalid Hex String!";
int First = Hex(H[1]);
int Second = Hex(H[2]);
if ( First < 0 || Second < 0 )
return ret; //throw "Invalid Hex String!";
ret |= (BYTE)((First<<4) + Second);
return ret;
}
//---------------------------------------------------------------------------
void __fastcall TFMain::CmOpenFileClick(TObject *Sender)
{
if ( !OpenDialog->Execute() )
return;
if ( !OpenDialog->FileName.Length() )
return;
int FileSize;
HANDLE Fh = OpenFileToRead(OpenDialog->FileName.c_str(), &FileSize);
if ( Fh == INVALID_HANDLE_VALUE )
return;
if ( !FileSize )
{
CloseHandle(Fh);
return;
}
char *Buffer = new char[FileSize];
if ( !Buffer )
{
CloseHandle(Fh);
return;
}
if ( !ReadFromFile(Fh, 0, Buffer, FileSize) )
{
delete Buffer;
return;
}
int Offset = 0;
char *TempBuffer = new char[FileSize];
int Col = 1;
int Row = 1;
int DataSize = 0;
//////////////////////////////////////////////////////
// CHECKSUM 頑 駑撼�� 頑震� - 表氛� !!!!
int Index = 0;
BYTE Sum = 0;
BYTE Data = 0;
ReadFromFile(Fh, 1, TempBuffer, RECORD_DATA_LENGTH + RECORD_LOAD_ADDRESS + RECORD_TYPE + (2 * 3));
TempBuffer[RECORD_DATA_LENGTH + RECORD_LOAD_ADDRESS + RECORD_TYPE + (2 * 3)] = 0;
ShowMessage(TempBuffer);
while ( 1 )
{
if ( Index >= RECORD_DATA_LENGTH + RECORD_LOAD_ADDRESS + RECORD_TYPE + 6 )
break;
Data = HexToBYTE(AnsiString(TempBuffer[Index]) + AnsiString(TempBuffer[Index + 1]));
Sum += Data;
Index += 2;
}
ShowMessage(Sum);
//////////////////////////////////////////////////////
while ( Offset < FileSize )
{
if ( Buffer[Offset] == ':' )
{
Grid->Cells[0][Row] = Row;
// 姥髡綑
Offset++;
ReadFromFile(Fh, Offset, TempBuffer, RECORD_DATA_LENGTH);
TempBuffer[RECORD_DATA_LENGTH] = 0;
Grid->Cells[Col++][Row] = TempBuffer;
DataSize = HexToBYTE(TempBuffer);
// �擇�
Offset += RECORD_DATA_LENGTH;
ReadFromFile(Fh, Offset, TempBuffer, RECORD_LOAD_ADDRESS);
TempBuffer[RECORD_LOAD_ADDRESS] = 0;
Grid->Cells[Col++][Row] = TempBuffer;
// 砍�
Offset += RECORD_LOAD_ADDRESS;
ReadFromFile(Fh, Offset, TempBuffer, RECORD_TYPE);
TempBuffer[RECORD_TYPE] = 0;
Grid->Cells[Col++][Row] = TempBuffer;
// 丑瘩�
Offset += RECORD_TYPE;
ReadFromFile(Fh, Offset, TempBuffer, 2 * DataSize);
TempBuffer[2 * DataSize] = 0;
Grid->Cells[Col++][Row] = TempBuffer;
// Checksum
Offset += 2 * DataSize;
ReadFromFile(Fh, Offset, TempBuffer, RECORD_CHECKSUM);
TempBuffer[RECORD_CHECKSUM] = 0;
Grid->Cells[Col++][Row] = TempBuffer;
// ShowMessage(ChkS);
// ShowMessage(HexToBYTE(AnsiString(TempBuffer)));
// if ( ChkS == HexToBYTE(AnsiString(TempBuffer)) )
// ShowMessage("&&&&");
Row++;
Col = 1;
}
Offset++;
}
Grid->RowCount = Row;
delete Buffer;
delete TempBuffer;
CloseHandle(Fh);
StatusBar->Panels->Items[0]->Text = OpenDialog->FileName;
SetNativeWidths(Grid);
}
//---------------------------------------------------------------------------
void SetStringGridDimensions(TStringGrid *Grid, int ColCount, int RowCount)
{
Grid->ColCount = ColCount;
// Grid->ColWidths[ColCount - 1] = -1;
if ( RowCount > 1 )
Grid->RowCount = RowCount;
else
{
Grid->RowCount = 2;
Grid->Rows[1]->Clear();
}
}
//--------------------------------------------------------------------------
void TFMain::InitGrid()
{
int ColCount = 0;
Grid->Cells[ColCount++][0] = "No";
Grid->Cells[ColCount++][0] = "姥髡綑";
Grid->Cells[ColCount++][0] = "�擇�";
Grid->Cells[ColCount++][0] = "砍�";
Grid->Cells[ColCount++][0] = "丑瘩�";
Grid->Cells[ColCount++][0] = "Checksum";
int Row = 1;
SetStringGridDimensions(Grid, ColCount, Row);
SetNativeWidths(Grid);
}
//---------------------------------------------------------------------------
void __fastcall TFMain::FormCreate(TObject *Sender)
{
// 1. 脊鋼� 蜻皺彆曖皖慘瘩摘� 鋒擋慮隧�
ReadConfiguration();
InitGrid();
}
//---------------------------------------------------------------------------
void __fastcall TFMain::CmConfigClick(TObject *Sender)
{
TFConfig *Dialog = new TFConfig(this, &ProgramConfiguration);
if ( !Dialog )
return;
int Result = Dialog->ShowModal();
delete Dialog;
if ( Result != mrOk )
return;
}
//---------------------------------------------------------------------------
void __fastcall TFMain::FormClose(TObject *Sender, TCloseAction &Action)
{
SaveConfiguration();
}
//---------------------------------------------------------------------------