Index: avrdude-5.11.1/avrpart.h =================================================================== --- avrdude-5.11.1.orig/avrpart.h 2012-07-22 10:29:39.275651769 -0300 +++ avrdude-5.11.1/avrpart.h 2012-07-22 10:29:41.387721159 -0300 @@ -186,6 +186,8 @@ unsigned char * buf; /* pointer to memory buffer */ OPCODE * op[AVR_OP_MAX]; /* opcodes */ + + int low_addr; /* lowest address used, in bytes */ } AVRMEM; #ifdef __cplusplus Index: avrdude-5.11.1/config_gram.y =================================================================== --- avrdude-5.11.1.orig/config_gram.y 2012-07-22 10:29:39.287652163 -0300 +++ avrdude-5.11.1/config_gram.y 2012-07-22 10:29:41.391721290 -0300 @@ -1297,6 +1297,7 @@ } mem_specs { + current_mem->low_addr = current_mem->size; ladd(current_part->mem, current_mem); current_mem = NULL; } | Index: avrdude-5.11.1/fileio.c =================================================================== --- avrdude-5.11.1.orig/fileio.c 2012-07-22 10:29:39.263651374 -0300 +++ avrdude-5.11.1/fileio.c 2012-07-22 10:29:41.391721290 -0300 @@ -52,7 +52,7 @@ char * outfile, FILE * outf); static int ihex2b(char * infile, FILE * inf, - unsigned char * outbuf, int bufsize); + unsigned char * outbuf, int bufsize, int *low_addr); static int b2srec(unsigned char * inbuf, int bufsize, int recsize, int startaddr, @@ -69,7 +69,8 @@ char * filename, FILE * f, unsigned char * buf, int size); static int fileio_ihex(struct fioparms * fio, - char * filename, FILE * f, unsigned char * buf, int size); + char * filename, FILE * f, unsigned char * buf, int size, + int *low_addr); static int fileio_srec(struct fioparms * fio, char * filename, FILE * f, unsigned char * buf, int size); @@ -262,7 +263,7 @@ * * */ static int ihex2b(char * infile, FILE * inf, - unsigned char * outbuf, int bufsize) + unsigned char * outbuf, int bufsize, int *low_addr) { char buffer [ MAX_LINE_LEN ]; unsigned char * buf; @@ -271,7 +272,7 @@ int lineno; int len; struct ihexrec ihex; - int rc; + int rc, lowest; lineno = 0; buf = outbuf; @@ -279,6 +280,7 @@ maxaddr = 0; offsetaddr = 0; nextaddr = 0; + lowest = bufsize; while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) { lineno++; @@ -313,11 +315,14 @@ for (i=0; i maxaddr) maxaddr = nextaddr+ihex.reclen; break; case 1: /* end of file record */ + *low_addr = lowest; return maxaddr-offsetaddr; break; @@ -354,6 +359,7 @@ "file \"%s\"\n", progname, infile); + *low_addr = lowest; return maxaddr-offsetaddr; } @@ -777,7 +783,8 @@ static int fileio_ihex(struct fioparms * fio, - char * filename, FILE * f, unsigned char * buf, int size) + char * filename, FILE * f, unsigned char * buf, int size, + int *low_addr) { int rc; @@ -790,7 +797,7 @@ break; case FIO_READ: - rc = ihex2b(filename, f, buf, size); + rc = ihex2b(filename, f, buf, size, low_addr); if (rc < 0) return -1; break; @@ -1021,6 +1028,7 @@ struct fioparms fio; AVRMEM * mem; int using_stdio; + int low_addr = 0; mem = avr_locate_mem(p, memtype); if (mem == NULL) { @@ -1113,7 +1121,7 @@ switch (format) { case FMT_IHEX: - rc = fileio_ihex(&fio, fname, f, buf, size); + rc = fileio_ihex(&fio, fname, f, buf, size, &low_addr); break; case FMT_SREC: @@ -1149,6 +1157,8 @@ */ rc = avr_mem_hiaddr(mem); } + if (op == FIO_READ && low_addr < mem->low_addr) + mem->low_addr = low_addr; } if (format != FMT_IMM && !using_stdio) { fclose(f);