diff options
-rw-r--r-- | xexamine.c | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -309,7 +309,7 @@ int main(int argc, char **argv) { xex_segment seg; unsigned char buffer[65536]; char *filename; - int opt, offset, segcount = 0, only_segment = 0, header_printed = 0, decimal = 0, print_filenames = 0; + int opt, offset, segcount = 0, only_segment = 0, header_printed = 0, decimal = 0, print_filenames = 0, r, i; uint32_t crc; while((opt = getopt(argc, argv, "vhs:d")) != -1) { @@ -363,22 +363,26 @@ int main(int argc, char **argv) { if(!only_segment || (only_segment == segcount)) { if(!header_printed) { - printf("Seg | Offset | Start | End | Bytes | CRC32 | Type\n"); + printf("Seg | Offset | Start | End | Bytes | CRC32 | Code%% | Run/Init?\n"); header_printed++; } printf((decimal ? "%3d | %6d | %5d | %5d | %5d | %08x | " : - "%3d | %6d | $%04x | $%04x | %5d | %08x | "), - segcount, offset, seg.start_addr, seg.end_addr, seg.len, crc); - - /* TODO: what if there's a >=4 byte segment that loads at RUNAD? - the next 2 bytes are INITAD, we would silently ignore that fact. */ - if(seg.start_addr == XEX_RUNAD && seg.len > 1) - printf((decimal ? "Run %5d" : "Run $%04x"), (seg.object[0] | (seg.object[1] << 8))); - else if(seg.start_addr == XEX_INITAD && seg.len > 1) + "%3d | %6d | $%04x | $%04x | %5d | %08x | %4d%% | "), + segcount, offset, seg.start_addr, seg.end_addr, seg.len, crc, + classify_seg(seg)); + + r = xex_get_run_addr(&seg); + i = xex_get_init_addr(&seg); + if(r != -1) { + if(i == -1) putchar(' '); + printf((decimal ? "Run %5d" : "Run $%04x"), (seg.object[0] | (seg.object[1] << 8))); + } + if(i != -1) { + if(r != -1) printf(", "); printf((decimal ? "Init %5d" : "Init $%04x"), (seg.object[0] | (seg.object[1] << 8))); - else printf("%d%% code", classify_seg(seg)); + } putchar('\n'); } |