git-svn-id: http://moon:8086/svn/software/trunk/libsrc/ihexparse@1 b431acfa-c32f-4a4a-93f1-934dc6c82436
109 lines
2.2 KiB
C
Executable File
109 lines
2.2 KiB
C
Executable File
/*************************************************************************/
|
|
/* ihexparse.h
|
|
/*************************************************************************/
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <types.h>
|
|
#include <ihexparse.h>
|
|
|
|
UINT32 HexCreate(HEXREC *pObj, char *name)
|
|
{
|
|
pObj->pFile = fopen(name,"wa");
|
|
if (pObj->pFile <= 0)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
UINT32 HexOpen(HEXREC *pObj, char *name)
|
|
{
|
|
pObj->pFile = fopen(name,"ra");
|
|
if (pObj->pFile <= 0)
|
|
return -1;
|
|
return 0;
|
|
}
|
|
|
|
UINT32 HexReadRecord(HEXREC *pObj)
|
|
{
|
|
UINT8 val8;
|
|
UINT16 i;
|
|
UINT32 val32;
|
|
INT32 status;
|
|
|
|
val8 = 0;
|
|
/* Read Record Start character */
|
|
while (val8 != ':')
|
|
{
|
|
status = fscanf(pObj->pFile,"%c",&val8);
|
|
if (status <= 0)
|
|
return HEXREC_ERROR;
|
|
}
|
|
|
|
/* Read Record Length */
|
|
fscanf(pObj->pFile,"%2x",&pObj->length);
|
|
|
|
/* check if hex file is finished */
|
|
if (pObj->length == 0)
|
|
{
|
|
status = fscanf(pObj->pFile,"%8x",&val32);
|
|
if (status <= 0)
|
|
return HEXREC_ERROR;
|
|
if (val32 == 0x000001FF)
|
|
return HEXREC_END;
|
|
}
|
|
|
|
/* Read Start Address */
|
|
fscanf(pObj->pFile,"%4x",&pObj->dataStart);
|
|
|
|
/* Read Record Type */
|
|
fscanf(pObj->pFile,"%2x",&pObj->type);
|
|
|
|
/* Read Record Data */
|
|
for (i=0; i <pObj->length; i++)
|
|
fscanf(pObj->pFile,"%2x",&pObj->recData[i]);
|
|
|
|
/* Read Checksum */
|
|
fscanf(pObj->pFile,"%2x",&pObj->checksum);
|
|
if (pObj->checksum != HexCalcChecksum(pObj))
|
|
return HEXREC_ERROR;
|
|
|
|
return i;
|
|
}
|
|
|
|
UINT32 HexWriteRecord(HEXREC *pObj)
|
|
{
|
|
UINT16 i;
|
|
|
|
fprintf(pObj->pFile,":%2.2X%4.4X%2.2X",pObj->length,pObj->dataStart,pObj->type);
|
|
|
|
for (i=0; i < pObj->length; i++)
|
|
fprintf(pObj->pFile, "%2.2X",pObj->recData[i]);
|
|
|
|
pObj->checksum = HexCalcChecksum(pObj);
|
|
fprintf(pObj->pFile, "%2.2X\n",pObj->checksum);
|
|
|
|
return i;
|
|
}
|
|
|
|
UINT32 HexClose(HEXREC *pObj)
|
|
{
|
|
pObj->length=0;
|
|
pObj->type=0x01;
|
|
pObj->dataStart=0x0000;
|
|
return HexWriteRecord(pObj);
|
|
}
|
|
|
|
UINT8 HexCalcChecksum(HEXREC *pObj)
|
|
{
|
|
UINT16 i;
|
|
UINT8 sum;
|
|
|
|
sum = pObj->dataStart & 0xFF;
|
|
sum += (pObj->dataStart >> 8) & 0xFF;
|
|
sum += pObj->length + pObj->type;
|
|
|
|
for (i=0; i < pObj->length; i++)
|
|
sum += pObj->recData[i];
|
|
|
|
return (0xFF - sum + 1);
|
|
}
|