mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2025-01-30 23:00:11 -05:00
Add segment support
This commit is contained in:
parent
9baffae091
commit
b5a1895550
29
tool/ihex.c
29
tool/ihex.c
@ -24,6 +24,7 @@ int load_ihex(const char *file, unsigned char *dstbuf, int bufsize)
|
|||||||
int line = 0;
|
int line = 0;
|
||||||
int eof_seen = 0;
|
int eof_seen = 0;
|
||||||
unsigned int max_address = 0;
|
unsigned int max_address = 0;
|
||||||
|
unsigned int offset = 0;
|
||||||
|
|
||||||
fptr = fopen(file, "r");
|
fptr = fopen(file, "r");
|
||||||
if (!fptr) {
|
if (!fptr) {
|
||||||
@ -93,27 +94,39 @@ int load_ihex(const char *file, unsigned char *dstbuf, int bufsize)
|
|||||||
switch(databuf[3])
|
switch(databuf[3])
|
||||||
{
|
{
|
||||||
case 0x00: // Data
|
case 0x00: // Data
|
||||||
if (address + data_count > bufsize) {
|
if (address + offset + data_count > bufsize) {
|
||||||
fprintf(stderr, "hex file too large\n");
|
fprintf(stderr, "hex file too large\n");
|
||||||
ret = -6;
|
ret = -6;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (address + data_count > max_address) {
|
if (address + offset + data_count > max_address) {
|
||||||
max_address = address + data_count;
|
max_address = address + offset + data_count;
|
||||||
}
|
}
|
||||||
memcpy(dstbuf + address, databuf + 4, data_count);
|
memcpy(dstbuf + address + offset, databuf + 4, data_count);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x01: // EOF
|
case 0x01: // EOF
|
||||||
eof_seen = 1;
|
eof_seen = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 0x04: // Extended linear address
|
||||||
|
if (data_count != 2) {
|
||||||
|
fprintf(stderr, "ihex parser: Malformatted 0x04 record at line %d\n", line);
|
||||||
|
ret = -8;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
offset = (databuf[4] << 24) | (databuf[5] << 16);
|
||||||
|
//printf("OFfset: 0x%08x\n", offset);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x03: // Start segment address
|
||||||
|
case 0x05: // Start linear address
|
||||||
|
// Ignored
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
case 0x02: // Extended segment address
|
case 0x02: // Extended segment address
|
||||||
case 0x03: // Start segment address
|
fprintf(stderr, "ihex parser: Unimplemented record type 0x%02x at line %d\n", databuf[3], line);
|
||||||
case 0x04: // Extended linear address
|
|
||||||
case 0x05: // Start linear address
|
|
||||||
fprintf(stderr, "ihex parser: Unimplemented record type 0x%02x\n", databuf[3]);
|
|
||||||
ret = -2;
|
ret = -2;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user