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

📄 srecord.c

📁 MIPS处理器的bootloader,龙芯就是用的修改过的PMON2
💻 C
字号:
/* * convert binary file to Srecord format */#include <stdio.h>#include <ctype.h>static int get32();static void put32();static void sput();static void put();static int checksum();int    mask;int    size;main(argc, argv)int	argc;char	*argv[];{char	buf[32];int	cc;int	base;int	addr;char	*name;	if( argc != 4 ) {		fprintf(stderr, "usage: %s {size} {hex_addr} {name}\n", argv[0]);		fprintf(stderr, "Size = 2, 3, or 4 byte address\n");		exit(1);	}	sscanf(argv[1], "%x", &size);	mask = (1 << (size *8))-1;	if (!mask) mask = (-1);	sscanf(argv[2], "%x", &base);	name = argv[3];	if (size==2) printf("S0%02X%04X", 2 + strlen(name) + 1, 0);	if (size==3) printf("S0%02X%06X", 3 + strlen(name) + 1, 0);	if (size==4) printf("S0%02X%08X", 4 + strlen(name) + 1, 0);	sput(name);	printf("%02X\n", checksum(0, name, strlen(name),size));	addr = base;	for( ;; ) {		cc = get32(buf);		if( cc > 0 ) {			put32(cc, addr, buf,size,mask);			addr += cc;		} else			break;	}	buf[0] = base >> 8;	buf[1] = base;	printf("S%d%02X",11-size,2 + 1);	switch (size) {	    case 2: printf("%04X", base & mask); break;	    case 3: printf("%06X", base & mask); break;	    case 4: printf("%08X", base & mask); break;	}/* kludge -> don't know why you have to add the +1 = works for size =3 at least */	printf("%02X\n",checksum(base, (char *)0, 0, size)+1);}static intget32(buf)char	buf[];{char	*cp = buf;int	i;int	c;	for( i = 0; i < 32 ; ++i ) {		if( (c = getchar()) != EOF )			*cp++ = c;		else			break;	}	return cp - buf;}static voidput32(len, addr, buf,size,mask)int	len;int	addr;char	buf[];int	size,mask;{char	*cp = buf;int	i;	if (size ==2) printf("S1%02X%04X", 2 + len + 1, addr & mask);	if (size ==3) printf("S2%02X%06X", 3 + len + 1, addr & mask);	if (size ==4) printf("S3%02X%08X", 4 + len + 1, addr & mask);	for( i = 0; i < len ; ++i )		put(*cp++);	printf("%02X\n", checksum(addr, buf, len,size));}static voidsput(s)char	*s;{	while( *s != '\0' )		put(*s++);}static voidput(c)int c;{	printf("%02X", c & 0xff);}static intchecksum(addr, buf, len,size)int	addr;char	buf[];int	len;int	size;{char	*cp = buf;int	sum = 0xff - 1 - size - (len & 0xff);int	i;	if (size ==4) sum -= (addr >>24) & 0xff;	if (size >=3) sum -= (addr >>16) & 0xff;	sum -= (addr >> 8) & 0xff;	sum -= addr & 0xff;	for( i = 0; i < len ; ++i ) {		sum -= *cp++ & 0xff;	}	return sum & 0xff;}

⌨️ 快捷键说明

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