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 }