Mercurial > repos > blastem
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); |