?? srecview.c
字號:
/*
Motorola 公司之 S-Record 文件查看程序。
File: srec.c
Date: March 30, 2005.
Copyright (c) 2005, ChipLink Software Labs. All Rights Reserved.
*/
#include <stdio.h>
#include <stdlib.h>
/* ASCII to digit */
#define a2d(x) ((((x)>='0') && ((x)<='9'))?((x)-'0'):((x)-'A'+10))
int main( int argc, char ** argv )
{
FILE * fp;
char buf[80+1], * p;
unsigned char val, len, sum, cnt=0, i;
unsigned long addr;
if( argc !=2 )
{
printf("Usage: srec s-recorder_file_name\n");
return -1;
}
fp = fopen( argv[1], "rt" );
if( !fp )
{
printf("Cannot open file: %s\n", argv[1] );
return -2;
}
/*
組成一個S-記錄的5個字段如下:
+------------+------------+---------+--------------+----------+
| 記錄類型 | 記錄長度 | 地址 | 代碼/數據 | 校驗和 |
+------------+------------+---------+--------------+----------+
*/
do {
if( fgets( buf, 80, fp )==NULL ) break;
/* S-記錄文件每行必以字母 'S' 開頭 */
if( buf[0]!='S' ) continue;
/* S-記錄文件只有 S0, S1, S2, S3, S5, S7, S8, S9 共八種記錄類型 */
if( buf[1]!='0' && buf[1]!='1' && buf[1]!='2' && buf[1]!='3' &&
buf[1]!='5' && buf[1]!='7' && buf[1]!='8' && buf[1]!='9' ) continue;
sum = 0;
len = (a2d(buf[2])<< 4) | a2d(buf[3]);
/* CheckSum 長度為 2 字節,為記錄長度、地址、代碼/數據字段數值之和的反碼 */
sum += len;
sum += ((a2d(buf[4])<<4) | a2d(buf[5]));
sum += ((a2d(buf[6])<<4) | a2d(buf[7]));
switch( buf[1] )
{
case '0': /* S0 是記錄頭, 應還原成字符顯示 */
len -= 2;
addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
p = buf+8;
break;
case '1':
case '9':
len -= 2;
addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
p = buf+8;
cnt++;
break;
case '2':
case '8':
sum += ((a2d(buf[8])<<4) | a2d(buf[9]));
len -= 3;
addr = (a2d(buf[4])<<20) | (a2d(buf[5])<<16) | (a2d(buf[6])<<12) | (a2d(buf[7])<<8) | (a2d(buf[8])<<4) | a2d(buf[9]) ;
p = buf+10;
cnt++;
break;
case '3':
case '7':
sum += ((a2d(buf[8])<<4) | a2d(buf[9]));
sum += ((a2d(buf[10])<<4) | a2d(buf[11]));
len -= 4;
addr = (a2d(buf[4])<<28) | (a2d(buf[5])<<24) | (a2d(buf[6])<<20) | (a2d(buf[7])<<16) | (a2d(buf[8])<<12) | (a2d(buf[9])<<8) | (a2d(buf[10])<<4) | a2d(buf[11]) ;
p = buf+12;
cnt++;
break;
case '5':
len -= 2;
addr = (a2d(buf[4])<<12) | (a2d(buf[5])<<8) | (a2d(buf[6])<<4) | a2d(buf[7]) ;
p = buf+8;
break;
}
if( buf[1] == '0' )
{
printf("S-Record Information: " );
for( i=0; i<(len-1); i++ )
{
val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
sum += val;
printf("%c", val );
p+=2;
}
}
else if( buf[1] =='5' )
{
if( cnt != addr )
{
printf("S-record type 5: record count not match!\t");
}
}
else
{
printf("%08lx\t", addr );
for( i=0; i<(len-1); i++)
{
val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
sum += val;
printf("%02X ", val );
p+=2;
}
}
printf("\n");
/* 驗證校驗和 */
val = ((a2d( *p )<<4) | a2d( *(p+1) ) );
if( val != (unsigned char)(~sum) )
{
printf("CheckSum error!\n");
}
} while( !feof(fp) );
fclose(fp);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -