comparison dis.c @ 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 ab50421b1b7a
children 4a400aec81bb
comparison
equal deleted inserted replaced
138:aa3e1bb338c9 139:cce22fb4c450
1 #include "68kinst.h" 1 #include "68kinst.h"
2 #include <stdio.h> 2 #include <stdio.h>
3 #include <stdlib.h> 3 #include <stdlib.h>
4 4
5 uint8_t visited[(16*1024*1024)/16]; 5 uint8_t visited[(16*1024*1024)/16];
6 uint8_t label[(16*1024*1024)/16]; 6 uint8_t label[(16*1024*1024)/8];
7 7
8 void visit(uint32_t address) 8 void visit(uint32_t address)
9 { 9 {
10 address &= 0xFFFFFF; 10 address &= 0xFFFFFF;
11 visited[address/16] |= 1 << ((address / 2) % 8); 11 visited[address/16] |= 1 << ((address / 2) % 8);
13 13
14 void reference(uint32_t address) 14 void reference(uint32_t address)
15 { 15 {
16 address &= 0xFFFFFF; 16 address &= 0xFFFFFF;
17 //printf("referenced: %X\n", address); 17 //printf("referenced: %X\n", address);
18 label[address/16] |= 1 << ((address / 2) % 8); 18 label[address/16] |= 1 << (address % 8);
19 } 19 }
20 20
21 uint8_t is_visited(uint32_t address) 21 uint8_t is_visited(uint32_t address)
22 { 22 {
23 address &= 0xFFFFFF; 23 address &= 0xFFFFFF;
25 } 25 }
26 26
27 uint8_t is_label(uint32_t address) 27 uint8_t is_label(uint32_t address)
28 { 28 {
29 address &= 0xFFFFFF; 29 address &= 0xFFFFFF;
30 return label[address/16] & (1 << ((address / 2) % 8)); 30 return label[address/16] & (1 << (address % 8));
31 } 31 }
32 32
33 typedef struct deferred { 33 typedef struct deferred {
34 uint32_t address; 34 uint32_t address;
35 struct deferred *next; 35 struct deferred *next;
93 } 93 }
94 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur) 94 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur)
95 { 95 {
96 *cur = (*cur >> 8) | (*cur << 8); 96 *cur = (*cur >> 8) | (*cur << 8);
97 } 97 }
98 uint32_t address = filebuf[2] << 16 | filebuf[3], tmp_addr; 98 uint32_t start = filebuf[2] << 16 | filebuf[3], tmp_addr;
99 uint32_t int_2 = filebuf[0x68/2] << 16 | filebuf[0x6A/2];
100 uint32_t int_4 = filebuf[0x70/2] << 16 | filebuf[0x72/2];
101 uint32_t int_6 = filebuf[0x78/2] << 16 | filebuf[0x7A/2];
99 uint16_t *encoded, *next; 102 uint16_t *encoded, *next;
100 uint32_t size; 103 uint32_t size;
101 deferred *def = NULL, *tmpd; 104 deferred *def = NULL, *tmpd;
102 def = defer(address, def); 105 def = defer(start, def);
103 def = defer(filebuf[0x68/2] << 16 | filebuf[0x6A/2], def); 106 def = defer(int_2, def);
104 def = defer(filebuf[0x70/2] << 16 | filebuf[0x72/2], def); 107 def = defer(int_4, def);
105 def = defer(filebuf[0x78/2] << 16 | filebuf[0x7A/2], def); 108 def = defer(int_6, def);
109 uint32_t address;
106 while(def) { 110 while(def) {
107 do { 111 do {
108 encoded = NULL; 112 encoded = NULL;
109 address = def->address; 113 address = def->address;
110 if (!is_visited(address)) { 114 if (!is_visited(address)) {
181 if (is_visited(address)) { 185 if (is_visited(address)) {
182 encoded = filebuf + address/2; 186 encoded = filebuf + address/2;
183 m68k_decode(encoded, &instbuf, address); 187 m68k_decode(encoded, &instbuf, address);
184 if (labels) { 188 if (labels) {
185 m68k_disasm_labels(&instbuf, disbuf); 189 m68k_disasm_labels(&instbuf, disbuf);
190 if (address == start) {
191 puts("start:");
192 }
193 if(address == int_2) {
194 puts("int_2:");
195 }
196 if(address == int_4) {
197 puts("int_4:");
198 }
199 if(address == int_6) {
200 puts("int_6:");
201 }
186 if (is_label(instbuf.address)) { 202 if (is_label(instbuf.address)) {
187 printf("ADR_%X:\n", instbuf.address); 203 printf("ADR_%X:\n", instbuf.address);
188 } 204 }
189 if (addr) { 205 if (addr) {
190 printf("\t%s\t;%X\n", disbuf, instbuf.address); 206 printf("\t%s\t;%X\n", disbuf, instbuf.address);