Mercurial > repos > blastem
comparison dis.c @ 80:7b1e16e981ef
Fix bug in disassembler that caused it to disassemble addresses it shouldn't
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 21 Dec 2012 22:33:24 -0800 |
parents | 0bdda50c7364 |
children | a71544cd01ea |
comparison
equal
deleted
inserted
replaced
79:d212e0cd0b7e | 80:7b1e16e981ef |
---|---|
24 deferred * defer(uint32_t address, deferred * next) | 24 deferred * defer(uint32_t address, deferred * next) |
25 { | 25 { |
26 if (is_visited(address)) { | 26 if (is_visited(address)) { |
27 return next; | 27 return next; |
28 } | 28 } |
29 //printf("deferring %X\n", address); | |
29 deferred * d = malloc(sizeof(deferred)); | 30 deferred * d = malloc(sizeof(deferred)); |
30 d->address = address; | 31 d->address = address; |
31 d->next = next; | 32 d->next = next; |
32 return d; | 33 return d; |
33 } | 34 } |
81 } | 82 } |
82 visit(address); | 83 visit(address); |
83 next = m68k_decode(encoded, &instbuf, address); | 84 next = m68k_decode(encoded, &instbuf, address); |
84 address += (next-encoded)*2; | 85 address += (next-encoded)*2; |
85 encoded = next; | 86 encoded = next; |
86 m68k_disasm(&instbuf, disbuf); | 87 //m68k_disasm(&instbuf, disbuf); |
88 //printf("%X: %s\n", instbuf.address, disbuf); | |
87 if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE) { | 89 if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE) { |
88 break; | 90 break; |
89 } else if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) { | 91 } else if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) { |
90 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) { | 92 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) { |
91 address = instbuf.address + 2 + instbuf.src.params.immed; | 93 address = instbuf.address + 2 + instbuf.src.params.immed; |
96 } else { | 98 } else { |
97 tmp_addr = instbuf.address + 2 + instbuf.src.params.immed; | 99 tmp_addr = instbuf.address + 2 + instbuf.src.params.immed; |
98 def = defer(tmp_addr, def); | 100 def = defer(tmp_addr, def); |
99 } | 101 } |
100 } else if(instbuf.op == M68K_JMP) { | 102 } else if(instbuf.op == M68K_JMP) { |
101 if (instbuf.src.addr_mode == MODE_ABSOLUTE || MODE_ABSOLUTE_SHORT) { | 103 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) { |
102 address = instbuf.src.params.immed; | 104 address = instbuf.src.params.immed; |
103 encoded = filebuf + address/2; | 105 encoded = filebuf + address/2; |
104 if (is_visited(address)) { | 106 if (is_visited(address)) { |
105 break; | 107 break; |
106 } | 108 } |
107 } else { | 109 } else { |
108 break; | 110 break; |
109 } | 111 } |
110 } else if(instbuf.op == M68K_JSR) { | 112 } else if(instbuf.op == M68K_JSR) { |
111 if (instbuf.src.addr_mode == MODE_ABSOLUTE || MODE_ABSOLUTE_SHORT) { | 113 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) { |
112 def = defer(instbuf.src.params.immed, def); | 114 def = defer(instbuf.src.params.immed, def); |
113 } | 115 } |
114 } | 116 } |
115 } | 117 } |
116 } | 118 } |
123 } | 125 } |
124 } | 126 } |
125 #else | 127 #else |
126 for(cur = filebuf + 0x100; (cur - filebuf) < (filesize/2); ) | 128 for(cur = filebuf + 0x100; (cur - filebuf) < (filesize/2); ) |
127 { | 129 { |
128 //printf("cur: %p: %x\n", cur, *cur); | |
129 unsigned short * start = cur; | 130 unsigned short * start = cur; |
130 cur = m68k_decode(cur, &instbuf, (start - filebuf)*2); | 131 cur = m68k_decode(cur, &instbuf, (start - filebuf)*2); |
131 m68k_disasm(&instbuf, disbuf); | 132 m68k_disasm(&instbuf, disbuf); |
132 printf("%X: %s\n", instbuf.address, disbuf); | 133 printf("%X: %s\n", instbuf.address, disbuf); |
133 } | 134 } |