📄 chksum.c
字号:
/*
** File: ChkSum.c
** --------------
** Usage: "ChkSum Ksize <inputfile.hex >outputfile.hex"
**
** It reads the input hex file (Intel MCS-86 w/ only Data & End Records),
** Fills unused data with random numbers,
** Calculates 16 bit check sum for all bytes in address range 0-(size-3),
** Stores the check sum at size-2(ChkSum-HI) and size-1(ChkSum-LO),
** Outputs new hex file.
*/
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROM_KSIZE 64
unsigned char Rom[MAX_ROM_KSIZE*1024];
unsigned int RomSize;
void Error(int err, int ln)
{
if(!ln) fprintf(stderr, "\nUsage: ChkSum Ksize <infile.hex >outfile.hex\n");
fprintf(stderr, "\nERROR %d at line %d\n", err, ln);
exit(1);
}
int main(int argc, char * argv[])
{
unsigned int ByteCnt, AddrH, AddrL, RecTyp, Byte, LnCSRd, LnCSCal;
unsigned int Addr, RomChkSum, HighestAddr=0;
unsigned int i, ln=1;
unsigned char a, b, CRCh, CRCl;
if (argc != 2) Error(1,0);
i = sscanf(argv[1],"%d",&RomSize);
if (i != 1) Error(2,0);
if (RomSize > MAX_ROM_KSIZE) Error(3,0);
RomSize *= 1024;
/* Initially fill Rom with FFs */
for (i=0; i<RomSize; i++) Rom[i] = 0xFF;
/* Read the input hex file */
do
{
i = scanf(":%2x%2x%2x%2x",&ByteCnt,&AddrH,&AddrL,&RecTyp);
if ( i != 4) Error(1,ln);
if (RecTyp > 1/*Data or End Record*/) Error(2,ln);
Addr = (AddrH << 8) + AddrL;
LnCSCal = ByteCnt + AddrH + AddrL + RecTyp;
for (i=0; i<ByteCnt; i++)
{
if (scanf("%2x",&Byte) != 1) Error(4,ln);
if (Addr < RomSize-4) /* Ignore higher addresses */
{
Rom[Addr++] = Byte;
if (Addr > HighestAddr) HighestAddr = Addr;
}
LnCSCal += Byte;
}
if (scanf("%2x\n",&LnCSRd) != 1) Error(5,ln);
LnCSCal += LnCSRd;
if ((LnCSCal & 0xFF) != 0) Error(6,ln);
ln++;
}
while (RecTyp != 1/*End Record*/);
/* Now fill tail unused Rom with random numbers */
for (i=HighestAddr; i<RomSize; i++) Rom[i] = random(0x100);
/* Calculate and Store Rom CRC */
for (CRCh=CRCl=0, Addr=0; Addr<(RomSize-4); Addr++)
{
b = a = Rom[Addr] ^ CRCl;
a <<= 4; b = a = b ^ a;
a >>= 4; CRCl = a = a ^ CRCh;
a = b << 3; CRCl ^= a;
a = b >> 5; CRCh = a ^ b;
}
Rom[Addr++] = CRCh;
Rom[Addr] = CRCl;
/* Calculate and Store Rom Check Sum */
for (RomChkSum=0, Addr=0; Addr<(RomSize-2); Addr++)
RomChkSum += Rom[Addr];
Rom[Addr++] = RomChkSum >> 8;
Rom[Addr] = RomChkSum;
/* Output new hex file for whole Rom */
Addr = 0;
while (Addr < RomSize)
{
printf(":20%4.4X00",Addr);
LnCSCal = 0x20 + (Addr >> 8) + (Addr & 0xFF);
for (i=0; i<0x20; i++)
{
printf("%2.2X",Rom[Addr]);
LnCSCal += Rom[Addr++];
}
LnCSCal = (-LnCSCal) & 0xFF;
printf("%2.2X\n",LnCSCal);
}
printf(":00000001FF\n");
return(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -