diff --git a/avrdude/fileio.c b/avrdude/fileio.c index 11905fe3..08d3340f 100644 --- a/avrdude/fileio.c +++ b/avrdude/fileio.c @@ -267,17 +267,18 @@ static int ihex2b(char * infile, FILE * inf, { char buffer [ MAX_LINE_LEN ]; unsigned char * buf; - unsigned int nextaddr, baseaddr, maxaddr; + unsigned int nextaddr, baseaddr, maxaddr, offsetaddr; int i; int lineno; int len; struct ihexrec ihex; int rc; - lineno = 0; - buf = outbuf; - baseaddr = 0; - maxaddr = 0; + lineno = 0; + buf = outbuf; + baseaddr = 0; + maxaddr = 0; + offsetaddr = 0; while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) { lineno++; @@ -301,28 +302,28 @@ static int ihex2b(char * infile, FILE * inf, } switch (ihex.rectyp) { - case 0: /* data record */ nextaddr = ihex.loadofs + baseaddr; - if (nextaddr + ihex.reclen > bufsize) { + if ((nextaddr + ihex.reclen) > (bufsize+offsetaddr)) { fprintf(stderr, "%s: ERROR: address 0x%04x out of range at line %d of %s\n", progname, nextaddr+ihex.reclen, lineno, infile); return -1; } for (i=0; i maxaddr) maxaddr = nextaddr+ihex.reclen; break; case 1: /* end of file record */ - return maxaddr; + return maxaddr-offsetaddr; break; case 2: /* extended segment address record */ - baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 4; + // note: shift values use to be 8 and 4 - the first had to be wrong + baseaddr = (ihex.data[0] << 12 | ihex.data[1]) << 4; break; case 3: /* start segment address record */ @@ -330,7 +331,8 @@ static int ihex2b(char * infile, FILE * inf, break; case 4: /* extended linear address record */ - baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 16; + baseaddr = (ihex.data[0] << 24 | ihex.data[1]) << 16; + if(offsetaddr == 0) offsetaddr = baseaddr; break; case 5: /* start linear address record */ @@ -353,7 +355,7 @@ static int ihex2b(char * infile, FILE * inf, "file \"%s\"\n", progname, infile); - return maxaddr; + return maxaddr-offsetaddr; }