int getbyte (FILE *fin, int *sum) { int b = (getnibble (fin) << 4) | getnibble (fin); *sum += b; return b; }
static uint8_t getbyte(void) { uint8_t b; b = getnibble() << 4; b |= getnibble(); return b; }
int getbyte(char **p) { int n0, n1; if ((n0 = getnibble(p)) == -1) return(-1); if ((n1 = getnibble(p)) == -1) return(-1); return(((n0 << 4) + n1) & 0xff); }
int convert_S_records( FILE *ifp, char *inm, FILE *ofp, char *onm) { char buff[512]; char *p; u8 cksum; int incksum; int c; int len; /* data length of current line */ int rectype; /* record type */ u32 addr; bool endrecord = FALSE; buffer_rec tb; while ( ! endrecord && (fgets(buff, sizeof(buff), ifp))) { p = &buff[0]; if (p[strlen(p)-1] == '\n') /* get rid of newline */ p[strlen(p)-1] = '\0'; if (p[strlen(p)-1] == '\r') /* get rid of any CR */ p[strlen(p)-1] = '\0'; tb.dl_count = 0; if (*p != 'S') badformat(p, inm, BADFMT); p++; if ((rectype = getnibble(&p)) == -1) /* record type */ badformat(buff, inm, BADTYPE); if ((len = getbyte(&p)) == -1) /* record len */ badformat(buff, inm, BADLEN); cksum = len; switch (rectype) { case 0x00: /* comment field, ignored */ goto write_it; case 0x01: /* data record, 16 bit addr */ if ((addr = get2bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 3; goto doit; case 0x02: /* ... 24 bit addr */ if ((addr = get3bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 4; goto doit; case 0x03: /* ... 32 bit addr */ if ((addr = get4bytes(&p)) == -1L) badformat(buff, inm, BADADDR); len -= 5; doit: cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr); tb.dl_destaddr = addr; while (len--) { if ((c = getbyte(&p)) == -1) badformat(buff, inm, BADDATA); cksum += c; filesum += c; tb.dl_buf[tb.dl_count++] = c; } break; case 0x07: /* 32 bit end record */ if ((addr = get4bytes(&p)) == -1L) badformat(buff, inm, BADADDR); goto end_rec; case 0x08: /* 24 bit end record */ if ((addr = get3bytes(&p)) == -1L) badformat(buff, inm, BADADDR); goto end_rec; case 0x09: /* 16 bit end record */ if ((addr = get2bytes(&p)) == -1L) badformat(buff, inm, BADADDR); end_rec: cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr); tb.dl_jumpaddr = addr; break; default: error(0, "unknown Motorola-S record type: 0x%02x", rectype); badformat(buff, inm, BADTYPE); break; } /* * Verify checksums are correct in file. */ cksum = (~cksum) & 0xff; if ((incksum = getbyte(&p)) == -1) badformat(buff, inm, BADCSUM); if (((u8) incksum) != cksum) badformat(buff, inm, MISCSUM); write_it: if (tb.dl_count) write_record(&tb, ofp); } return 0; }