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

📄 pad16.c

📁 MIPS下的boottloader yamon 的源代码
💻 C
字号:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

#include <termios.h>
#include <unistd.h>

static unsigned long addr = 0;
static int upper = 0;
static int swap = 0;

void
emit_srec (unsigned char *buf, int len)
{
	int i, cksum;
	int l = len + sizeof(addr) + 1;

	cksum = ((l >> 8) & 0x0ff) + (l & 0x00ff);
	cksum += (addr >> 24) & 0x0ff;
	cksum += (addr >> 16) & 0x0ff;
	cksum += (addr >> 8) & 0x0ff;
	cksum += addr & 0x0ff;

	printf("S3%02X%08X", len + sizeof(addr) + 1, addr);
	for (i = 0; i < len; ++i)
	{
		cksum += buf[i];
		printf("%02X", buf[i]);
	}
	printf("%02X\n", (~cksum) & 0x00FF);
	addr += len;
}


int
main (int argc, char **argv)
{
	int ifd, ofd;
	int num, i, arg = 1;
	char rbuf[1024];
	char wbuf[1024];

	if (argc < 3)
	{
		printf("%s [-lus] addr ifn\n", argv[0]);
		return -1;
	}

	/*
	 * Parse options
	 */
	if (argv[arg][0] == '-')
	{
		i = 1;
		while (argv[arg][i] != '\0')
		{
			switch (argv[arg][i])
			{
				case 'u':
				case 'U':
					upper = 1;
					break;
				case 'l':
				case 'L':
					upper = 0;
					break;
				case 's':
				case 'S':
					swap = 1;
					break;
				default:
					printf("unsupported option\n");
					break;
			}
			++i;
		}
		++arg;
	}

	addr = strtoul(argv[arg], NULL, 16);

	if ((ifd = open(argv[arg + 1], O_RDONLY | O_BINARY)) < 0)
	{
		printf("error opening input file: %s\n", argv[arg + 1]);
		return -2;
	}
	while (1)
	{
		num = read(ifd, rbuf, 16);

		if (num == -1)
		{
			printf("read() error: %d\n", num);
			perror("errno: ");
		}

		if (num > 0)
		{
			for (i = 0; i < num; i += 2)
			{
				if (upper)
				{
					wbuf[(i<<1) + 0] = 0xFF;
					wbuf[(i<<1) + 1] = 0xFF;
					if (swap)
					{
						wbuf[(i<<1) + 3] = rbuf[i + 0];
						wbuf[(i<<1) + 2] = rbuf[i + 1];
					}
					else
					{
						wbuf[(i<<1) + 2] = rbuf[i + 0];
						wbuf[(i<<1) + 3] = rbuf[i + 1];
					}
				}
				else /* lower */
				{
					if (swap)
					{
						wbuf[(i<<1) + 1] = rbuf[i + 0];
						wbuf[(i<<1) + 0] = rbuf[i + 1];
					}
					else
					{
						wbuf[(i<<1) + 0] = rbuf[i + 0];
						wbuf[(i<<1) + 1] = rbuf[i + 1];
					}
					wbuf[(i<<1) + 2] = 0xFF;
					wbuf[(i<<1) + 3] = 0xFF;
				}
			}
			emit_srec (wbuf, num * 2);
		}
		else
			break;
	}

	/* printf("S70500000000FA\n"); */
	return 0;
}

⌨️ 快捷键说明

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