⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chksum.c

📁 TDK 6521 SOC 芯片 DEMO程序
💻 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 + -