📄 hexreader.cpp
字号:
#include "stdafx.h"
#include "stdio.h"
extern CString szIniFileName;
extern CString szDownLoadFileName;
extern CStringArray szIniFileBuff;
CString szIniDownLoadFile;
UINT uiSeekPos;
UINT CheckHexFileRow(CString *string)
{
UINT temp,len,pos=0,checksum=0;
len = string->GetLength();
if(!(len&0x1)) return FALSE;
while(pos<len)
{
switch(pos)
{
case 0:
if(string->GetAt(pos++)!=':') return FALSE;
break;
default:
temp = (string->GetAt(pos)-0x30)*0x10+(string->GetAt(pos+1)-'0');
pos+=2;
}
}
if(checksum!=0) return FALSE;
return TRUE;
}
UINT GetHexFileBYTE(CString *string,UINT pos)
{
BYTE hi,lo;
hi = string->GetAt(pos);
hi = (hi > '9')?(hi-'A'+10):(hi - '0');
lo = string->GetAt(pos+1);
lo = (lo > '9')?(lo-'A'+10):(lo - '0');
return hi*0x10+lo;
}
// :llaaaatt[dd...]cc
// ll - length
// aaaa - address
// tt - type
// [dd...] - data
// cc - cs
BYTE ReadHexFile(BYTE *buff, CString filename,UINT *start_addr,UINT *end_addr)
{
CString rString;
unsigned long filesize=0;
UINT ll,tt,pos,linear_addr=0,segment_addr=0;
UINT mem_addr,start_address,end_address;
CStdioFile stdfile;
if(stdfile.Open(filename,CStdioFile::modeRead,NULL)==NULL)
{
return FALSE;
}
else
{
start_address = (UINT)-1;
end_address = 0;
while(stdfile.ReadString(rString)!=NULL)
{
if(!CheckHexFileRow(&rString)) break;
pos = 1;
ll = GetHexFileBYTE(&rString,pos);
pos+=2;
mem_addr = linear_addr * 0x10000;
mem_addr += segment_addr * 0x10;
mem_addr += GetHexFileBYTE(&rString,pos)*0x100;
pos += 2;
mem_addr += GetHexFileBYTE(&rString,pos);
pos += 2;
tt = GetHexFileBYTE(&rString,pos);
pos += 2;
switch(tt)
{
case 0x0: // data record
if(mem_addr < start_address) start_address = mem_addr;
while(ll--)
{
buff[mem_addr++]=GetHexFileBYTE(&rString,pos);
pos += 2;
}
if(mem_addr > end_address) end_address = mem_addr;
break;
case 0x1: // end of file record
*start_addr = start_address;
*end_addr = end_address;
stdfile.Close();
return TRUE;
break;
case 0x2: // extended segment address record
while(ll--)
{
segment_addr *= 0x100;
segment_addr += GetHexFileBYTE(&rString,pos);
pos += 2;
}
break;
case 0x4: // extended linear address record
linear_addr = 0;
while(ll--)
{
linear_addr *= 0x100;
linear_addr += GetHexFileBYTE(&rString,pos);
pos += 2;
}
break;
default:
break;
}
}
stdfile.Close();
}
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -