diff --git a/ChangeLog b/ChangeLog
index fdc0d3a2..7cd9a327 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,8 @@
-2010-01-18  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
+2010-01-18  David Hoerl <dhoerl@mac.com>
 
 	bug #28660: Problem with loading intel hex rom files that exceed
 	0x10000 bytes
-	* fileio.c: Revert the changes from r851 and r880, respectively.
+	* fileio.c: Fix two byte shifts.
 
 2010-01-15  Joerg Wunsch <j.gnu@uriah.heep.sax.de>
 
diff --git a/fileio.c b/fileio.c
index 11905fe3..f4ff016b 100644
--- a/fileio.c
+++ b/fileio.c
@@ -261,23 +261,24 @@ static int ihex_readrec(struct ihexrec * ihex, char * rec)
  * If an error occurs, return -1.
  *
  * */
-
 static int ihex2b(char * infile, FILE * inf,
              unsigned char * outbuf, int bufsize)
 {
   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;
+  nextaddr    = 0;
 
   while (fgets((char *)buffer,MAX_LINE_LEN,inf)!=NULL) {
     lineno++;
@@ -301,24 +302,23 @@ 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<ihex.reclen; i++) {
-          buf[nextaddr+i] = ihex.data[i];
+          buf[nextaddr+i-offsetaddr] = ihex.data[i];
         }
         if (nextaddr+ihex.reclen > maxaddr)
           maxaddr = nextaddr+ihex.reclen;
         break;
 
       case 1: /* end of file record */
-        return maxaddr;
+        return maxaddr-offsetaddr;
         break;
 
       case 2: /* extended segment address record */
@@ -331,6 +331,7 @@ static int ihex2b(char * infile, FILE * inf,
 
       case 4: /* extended linear address record */
         baseaddr = (ihex.data[0] << 8 | ihex.data[1]) << 16;
+        if(nextaddr == 0) offsetaddr = baseaddr;	// if provided before any data, then remember it
         break;
 
       case 5: /* start linear address record */
@@ -353,10 +354,9 @@ static int ihex2b(char * infile, FILE * inf,
           "file \"%s\"\n",
           progname, infile);
 
-  return maxaddr;
+  return maxaddr-offsetaddr;
 }
 
-
 static int b2srec(unsigned char * inbuf, int bufsize, 
            int recsize, int startaddr,
            char * outfile, FILE * outf)
@@ -1153,6 +1153,7 @@ int fileio(int op, char * filename, FILEFMT format,
   if (format != FMT_IMM && !using_stdio) {
     fclose(f);
   }
+
   return rc;
 }