#include #include #include #include #include #if !defined(__linux__) typedef char int8_t; typedef short int16_t; typedef long int32_t; #endif typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; #define ERR_FORMAT(n) (-(n)) static int hex1i(char c) { if (('0' <= c ) && (c <= '9')) return c - '0'; if (('a' <= c ) && (c <= 'f')) return c - 'a' + 10; if (('A' <= c ) && (c <= 'F')) return c - 'A' + 10; return 0; } static int hex2i(char *cp, int *sump) { int r; r = (hex1i(*cp++) << 4) + hex1i(*cp++); *sump += r; //printf("# r = %02x, sum = %02x\n",r, *sump); return r; } int ln; int mcs_load(FILE *fp, uint8_t *buf, int bufsiz) { char line[256], *lp; int i, len, addr, r_type , l_len, sum; int base_addr = 0; int last_addr = -1; int f_eof = 0; int total = 0; memset(buf, 0, bufsiz); ln = 0; while ( fgets(line, 256, fp) ) { sum = 0; ln++; lp = line; l_len = strlen(line); if (line[l_len -1] == '\n') l_len --; if (line[l_len -1] == '\r') l_len --; line[l_len] = 0; if (*lp++ != ':') { return ERR_FORMAT(1); } len = hex2i(lp, &sum); if (l_len != len * 2 + 1 + 2 + 4 + 2 + 2) { printf("l_len %d (%d), len %d\n", l_len, len * 2 + 1 + 2 + 4 + 2 + 2, len); return ERR_FORMAT(2); } lp += 2; addr = (hex2i(lp, &sum) << 8) + hex2i(lp+2, &sum) + base_addr; lp += 4; r_type = hex2i(lp, &sum); lp += 2; if (r_type == 0) { if ((last_addr >= 0) && (addr != last_addr)) { printf("last_addr %08x addr %08x\n", last_addr, addr); return ERR_FORMAT(3); } if (f_eof) { return ERR_FORMAT(4); } if (addr + len > bufsiz) { return ERR_FORMAT(5); } for (i=0; i < len; i++) { buf[addr + i] = hex2i(lp, &sum); lp += 2; } total += len; last_addr = addr + len; len = 0; } else if (r_type == 1) { if (len != 0) { return ERR_FORMAT(6); } f_eof = 1; } else if (r_type == 2) { base_addr = 0; for (i=0; i < len; i++) { base_addr <<= 8; base_addr += hex2i(lp, &sum); lp += 2; } base_addr <<= 4; len = 0; } else if (r_type == 4) { base_addr = 0; for (i=0; i < len; i++) { base_addr <<= 8; base_addr += hex2i(lp, &sum); lp += 2; } base_addr <<= 16; len = 0; printf("base_addr %08x\n", base_addr); } else { return ERR_FORMAT(7); } for (i=0; i < len; i++) { hex2i(lp, &sum); lp += 2; } hex2i(lp, &sum); if ((sum & 0xff) != 0) { printf("sum = %02x\n",sum); return ERR_FORMAT(8); } } return total; } void dump(uint8_t *buf, int addr, int len) { int i,n; int match = 0; printf("*** dump ***\n"); addr &= ~0xf; len = (len + 15) >> 4; for (n=0; n