📄 smunge.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 + -