Mercurial > repos > blastem
changeset 139:cce22fb4c450
Properly support references to odd addresses in label generation in disassembler. Add labels for start and interrupts.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 31 Dec 2012 11:54:27 -0800 |
parents | aa3e1bb338c9 |
children | 18796a3b0fe2 |
files | dis.c |
diffstat | 1 files changed, 24 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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 <stdlib.h> 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); }