diff --git a/fileio.c b/fileio.c
index 11905fe3..08d3340f 100644
--- a/fileio.c
+++ b/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<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 */
-        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;
 }