int buf_addr;
int buf_bytes;
FILE *file;
- char *line_buf;
+ unsigned char *line_buf;
int line_addr;
+ int ext_base_addr;
int line_bytes;
int line_offs;
int start_addr;
tform->buf_bytes = 0;
tform->read = NULL;
tform->done = NULL;
+ tform->ext_base_addr = 0;
return 0;
}
int cn, len = 0;
int addr = 0;
unsigned u, v;
- char *p, *r;
+ char *p;
+ unsigned char *r;
char *line = NULL;
size_t line_len = 0;
checksum += ihex_type = u;
- if (ihex_type == 0 || ihex_type == 1)
+ if ((ihex_type >= 0) && (ihex_type <= 5))
{
r = tform->line_buf;
if (ihex_type == 1)
{
tform->line_bytes = 0;
- tform->start_addr = tform->line_addr;
+ if(tform->start_addr == -1)
+ tform->start_addr = tform->line_addr;
+ }
+
+ tform->line_addr+=tform->ext_base_addr;
+
+ if((ihex_type >= 2) && (ihex_type <= 5))
+ {
+ cn = tform->line_bytes;
+ r = tform->line_buf;
+ addr = 0;
+
+ while(cn-- > 0)
+ {
+ addr <<= 8;
+ addr += *(r++);
+ }
+ if(ihex_type == 2)
+ tform->ext_base_addr=addr << 4;
+ else if(ihex_type == 4)
+ tform->ext_base_addr = addr << 16;
+ else if(ihex_type == 5)
+ tform->start_addr = addr;
+
+ tform->line_bytes = 0;
}
}
}
unsigned long mem_adr = mem_start;
unsigned long mem_len = mem_length;
unsigned long len;
+ unsigned long ext_addr = 0; /* for Intel HEX format */
struct timeval time1, time2;
struct timezone tz;
while (i < len)
{
+ unsigned long a = mem_adr + i;
+
+ if ((a & ~0xFFFF) != ext_addr)
+ {
+ unsigned long val;
+ unsigned char b;
+
+ ext_addr = a & ~0xFFFF;
+ val = ext_addr >> 16;
+ l = 2;
+ val >>= 16;
+ while (val != 0)
+ {
+ val >>= 8;
+ l++;
+ }
+ fprintf(file, ":%02X000004", l);
+ csum = l + 4;
+ val = ext_addr >> 16;
+ while (l--)
+ {
+ b = (val >> (8 * l)) & 0xff;
+ fprintf(file, "%02X", b);
+ csum += b;
+ }
+ fprintf(file, "%02X\n", (-csum) & 0xFF);
+ }
+
l = len - i;
if (l > 16) l = 16;
- csum = l + (mem_adr + i) + ((mem_adr + i) >> 8);
- fprintf(file, ":%02X%04lX00", l, (mem_adr + i) & 0xffff);
+ csum = l + a + (a >> 8);
+ fprintf(file, ":%02X%04lX00", l, a & 0xffff);
while (l--)
{
printf("Upload time %lu.%lu s\n", dus / 1000000, dus % 1000000);
}
+ if (fmt == fmt_ihex)
+ fprintf(file, ":00000001FF\n");
+
if (file_name)
fclose(file);