# HG changeset patch # User Mike Pavone # Date 1356983667 28800 # Node ID cce22fb4c450331de6690fdc9ca0e0d99190886f # Parent aa3e1bb338c98765ce7a865156d392627bb1e052 Properly support references to odd addresses in label generation in disassembler. Add labels for start and interrupts. diff -r aa3e1bb338c9 -r cce22fb4c450 dis.c --- a/dis.c Mon Dec 31 11:26:57 2012 -0800 +++ b/dis.c Mon Dec 31 11:54:27 2012 -0800 @@ -3,7 +3,7 @@ #include uint8_t visited[(16*1024*1024)/16]; -uint8_t label[(16*1024*1024)/16]; +uint8_t label[(16*1024*1024)/8]; void visit(uint32_t address) { @@ -15,7 +15,7 @@ { address &= 0xFFFFFF; //printf("referenced: %X\n", address); - label[address/16] |= 1 << ((address / 2) % 8); + label[address/16] |= 1 << (address % 8); } uint8_t is_visited(uint32_t address) @@ -27,7 +27,7 @@ uint8_t is_label(uint32_t address) { address &= 0xFFFFFF; - return label[address/16] & (1 << ((address / 2) % 8)); + return label[address/16] & (1 << (address % 8)); } typedef struct deferred { @@ -95,14 +95,18 @@ { *cur = (*cur >> 8) | (*cur << 8); } - uint32_t address = filebuf[2] << 16 | filebuf[3], tmp_addr; + uint32_t start = filebuf[2] << 16 | filebuf[3], tmp_addr; + uint32_t int_2 = filebuf[0x68/2] << 16 | filebuf[0x6A/2]; + uint32_t int_4 = filebuf[0x70/2] << 16 | filebuf[0x72/2]; + uint32_t int_6 = filebuf[0x78/2] << 16 | filebuf[0x7A/2]; uint16_t *encoded, *next; uint32_t size; deferred *def = NULL, *tmpd; - def = defer(address, def); - def = defer(filebuf[0x68/2] << 16 | filebuf[0x6A/2], def); - def = defer(filebuf[0x70/2] << 16 | filebuf[0x72/2], def); - def = defer(filebuf[0x78/2] << 16 | filebuf[0x7A/2], def); + def = defer(start, def); + def = defer(int_2, def); + def = defer(int_4, def); + def = defer(int_6, def); + uint32_t address; while(def) { do { encoded = NULL; @@ -183,6 +187,18 @@ m68k_decode(encoded, &instbuf, address); if (labels) { m68k_disasm_labels(&instbuf, disbuf); + if (address == start) { + puts("start:"); + } + if(address == int_2) { + puts("int_2:"); + } + if(address == int_4) { + puts("int_4:"); + } + if(address == int_6) { + puts("int_6:"); + } if (is_label(instbuf.address)) { printf("ADR_%X:\n", instbuf.address); }