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

📄 smunge.cpp

📁 RMI的处理器au1200系列所用的BOOTLOAD,包括SD卡启动USB启动硬盘启动网络启动,并初始化硬件的所有参数,支持内核调试.
💻 CPP
字号:
#include	<stdio.h>/* #include	<process.h>*/#include	<string.h>FILE			*in, *out;int				type;char			recbuf[256];int				reclen;unsigned int	recaddr;int				offset = -1;int				do_swizzle = 0;int				do_swap = 0;int				destaddr = 0;unsigned int	maxaddr = 0;int		load_srec(char *line){	int		i, c;	if( line[0] != 's' && line[0] != 'S' )		return 0;	type = 0;	switch(line[1])	{		case '1':			sscanf(line+2,"%2x%4x",&reclen,&recaddr);			line += 8;			reclen -= 2;			type = 1;			break;		case '2':			sscanf(line+2,"%2x%6x",&reclen,&recaddr);			line += 10;			reclen -= 3;			type = 2;			break;		case '3':			sscanf(line+2,"%2x%8x",&reclen,&recaddr);			line += 12;			reclen -= 4;			type = 3;			break;		default:			return 0;	}	reclen -= 1;	for( i = 0; i < reclen; ++i )	{		sscanf(line,"%2x",&c);		recbuf[i] = c;		line += 2;	}	return 1;}void	dump_srec(){	if(offset == -1 && type == 3)		offset = destaddr - recaddr;	if((recaddr + reclen + offset) > maxaddr)		maxaddr = recaddr + reclen + offset;	int cksm, i;	unsigned int addr = recaddr + offset;	int len = reclen + 5;	cksm = ((len >> 8) & 0x0ff) + (len & 0x00ff);	cksm += (addr >> 24) & 0x0ff;	cksm += (addr >> 16) & 0x0ff;	cksm += (addr >> 8) & 0x0ff;	cksm += addr & 0x0ff;	fprintf(out,"S3%02X%08X",len,addr);	for( i = 0; i < reclen; ++i )	{		cksm += recbuf[i] & 0x00ff;		fprintf(out,"%02X",recbuf[i] & 0x0ff);	}	fprintf(out,"%02X\n",(~cksm) & 0x0ff);}void	swizzle(){	int		c, i;	for( i = 0; i < reclen; i += 4 )	{		c = recbuf[i];		recbuf[i] = recbuf[i + 3];		recbuf[i + 3] = c;		c = recbuf[i + 1];		recbuf[i + 1] = recbuf[i + 2];		recbuf[i + 2] = c;	}}void	swap_halfwords(){	int		c, i;	for( i = 0; i < reclen; i += 4 )	{		c = recbuf[i];		recbuf[i] = recbuf[i + 2];		recbuf[i + 2] = c;		c = recbuf[i + 1];		recbuf[i + 1] = recbuf[i + 3];		recbuf[i + 3] = c;	}}void	mungeline(char *s){	if( load_srec(s) )	{		if( do_swizzle ) swizzle();		if( do_swap ) swap_halfwords();		dump_srec();	}	else		fputs(s,out);}int	smunge(const char *filename, int destAddress, int* smunge_offset, int* max_address){	destaddr = destAddress;	char	buf[132];	in = fopen(filename,"r");	if( in == NULL )	{		fprintf(stderr,"Can't open input file %s\n",filename);		return 0;	}	strncpy(buf,filename,120);	strcat(buf,".m");	out = fopen(buf,"w");	if( out == NULL )	{		fprintf(stderr,"Can't open output file %s\n",buf);		return 0;	}	while( fgets(buf,120,in) != NULL )	{		mungeline(buf);	}	fclose(in);	fclose(out);		*smunge_offset = offset;	*max_address   = maxaddr;	return 1;}/*void	option(char *str){	unsigned long	sa, da;	switch(str[1])	{		case 'o':			if( sscanf(str+2,"%x=%x",&sa,&da) )			{				offset = da - sa;				printf("changing block address 0x%08x to 0x%08x\n",sa,da);			}			else			{				fprintf(stderr,"bad format for -o: should be -o<srec-addr>=<mem-addr>\n");				exit(1);			}			break;		case 's':			if( str[2] == 'b' )			{				do_swizzle = 1;				printf("swizzling bytes.\n");			}			else if( str[2] == 'h' )			{				do_swap = 1;				printf("swapping halfwords.\n");			}			break;		default:			fprintf(stderr,"Unknown option - %s\n",str);	}}/*int	main(int argc, char **argv){	while( -- argc )	{		++argv;		if( **argv == '-' )			option(*argv);		else			smunge(*argv);	}	return 0;}*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -