📄 smunge.c
字号:
#include <stdio.h>
/* #include <process.h>*/
#include <string.h>
FILE *in, *out;
char recbuf[256];
int reclen;
unsigned long recaddr;
unsigned long offset = 0;
int do_swizzle32 = 0;
int do_swap = 0;
int do_swizzle16=0;
int load_srec(char *line)
{
int i, c;
if( line[0] != 's' && line[0] != 'S' )
return 0;
switch(line[1])
{
case '1':
sscanf(line+2,"%2x%4x",&reclen,&recaddr);
line += 8;
reclen -= 2;
break;
case '2':
sscanf(line+2,"%2x%6x",&reclen,&recaddr);
line += 10;
reclen -= 3;
break;
case '3':
sscanf(line+2,"%2x%8x",&reclen,&recaddr);
line += 12;
reclen -= 4;
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()
{
int cksm, i;
unsigned long 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 swizzle16()
{
int c, i;
for( i = 0; i < reclen; i += 2 )
{
c = recbuf[i];
recbuf[i] = recbuf[i + 1];
recbuf[i + 1] = c;
}
}
void swizzle32()
{
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_swizzle32 )
swizzle32();
if ( do_swizzle16 )
swizzle16();
if ( do_swap )
swap_halfwords();
dump_srec();
}
else
fputs(s,out);
}
void smunge(char *filename)
{
char buf[132];
in = fopen(filename,"r");
if( in == NULL )
{
fprintf(stderr,"Can't open input file %s\n",filename);
exit(1);
}
strncpy(buf,filename,120);
strcat(buf,".m");
out = fopen(buf,"w");
if( out == NULL )
{
fprintf(stderr,"Can't open output file %s\n",buf);
exit(1);
}
while( fgets(buf,120,in) != NULL )
{
mungeline(buf);
}
fclose(in);
fclose(out);
}
void option(char *str)
{
unsigned long sa, da;
switch(str[1])
{
case 'o': /* output */
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': /* smunge */
if (str[2] == 'w' )
{
do_swizzle16 = 0;
do_swizzle32 = 1;
do_swap = 0;
printf("swizzle 32-bits, no swap\n");
} else
if (str[2] == 'W' )
{
do_swizzle16 = 0;
do_swizzle32 = 1;
do_swap = 1;
printf("swizzle 32-bits, swap halfwords\n");
} else
if (str[2] == 'h' )
{
do_swizzle16 = 1;
do_swizzle32 = 0;
do_swap = 0;
printf("swizzle 16-bits, no swap\n");
} else
if (str[2] == 'H' )
{
do_swizzle16 = 1;
do_swizzle32 = 0;
do_swap = 1;
printf("swizzle 16-bits, swap halfwords\n");
} else
fprintf(stderr,"Unknown option - %s\n",str);
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 + -