comparison dis.c @ 633:a759f4e38488

Fix translation of 68K address to buffer location when address_off != 0
author Michael Pavone <pavone@retrodev.com>
date Sat, 11 Oct 2014 21:42:33 -0700
parents 80e111b48d4b
children 4a6ec64acd79
comparison
equal deleted inserted replaced
632:80e111b48d4b 633:a759f4e38488
233 while(def) { 233 while(def) {
234 do { 234 do {
235 encoded = NULL; 235 encoded = NULL;
236 address = def->address; 236 address = def->address;
237 if (!is_visited(address)) { 237 if (!is_visited(address)) {
238 encoded = filebuf + address/2; 238 encoded = filebuf + (address - address_off)/2;
239 } 239 }
240 tmpd = def; 240 tmpd = def;
241 def = def->next; 241 def = def->next;
242 free(tmpd); 242 free(tmpd);
243 } while(def && encoded == NULL); 243 } while(def && encoded == NULL);
244 if (!encoded) { 244 if (!encoded) {
245 break; 245 break;
246 } 246 }
247 for(;;) { 247 for(;;) {
248 if (address > filesize) { 248 if (address > address_end || address < address_off) {
249 break; 249 break;
250 } 250 }
251 visit(address); 251 visit(address);
252 next = m68k_decode(encoded, &instbuf, address); 252 next = m68k_decode(encoded, &instbuf, address);
253 address += (next-encoded)*2; 253 address += (next-encoded)*2;
260 break; 260 break;
261 } 261 }
262 if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) { 262 if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) {
263 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) { 263 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) {
264 address = instbuf.address + 2 + instbuf.src.params.immed; 264 address = instbuf.address + 2 + instbuf.src.params.immed;
265 encoded = filebuf + address/2; 265 encoded = filebuf + (address - address_off)/2;
266 reference(address); 266 reference(address);
267 if (is_visited(address)) { 267 if (is_visited(address)) {
268 break; 268 break;
269 } 269 }
270 } else { 270 } else {
273 def = defer(tmp_addr, def); 273 def = defer(tmp_addr, def);
274 } 274 }
275 } else if(instbuf.op == M68K_JMP) { 275 } else if(instbuf.op == M68K_JMP) {
276 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) { 276 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) {
277 address = instbuf.src.params.immed; 277 address = instbuf.src.params.immed;
278 encoded = filebuf + address/2; 278 encoded = filebuf + (address - address_off)/2;
279 if (is_visited(address)) { 279 if (is_visited(address)) {
280 break; 280 break;
281 } 281 }
282 } else if (instbuf.src.addr_mode = MODE_PC_DISPLACE) { 282 } else if (instbuf.src.addr_mode = MODE_PC_DISPLACE) {
283 address = instbuf.src.params.regs.displacement + instbuf.address + 2; 283 address = instbuf.src.params.regs.displacement + instbuf.address + 2;
284 encoded = filebuf + address/2; 284 encoded = filebuf + (address - address_off)/2;
285 if (is_visited(address)) { 285 if (is_visited(address)) {
286 break; 286 break;
287 } 287 }
288 } else { 288 } else {
289 break; 289 break;
303 printf("ADR_%X equ $%X\n", address, address); 303 printf("ADR_%X equ $%X\n", address, address);
304 } 304 }
305 } 305 }
306 puts(""); 306 puts("");
307 } 307 }
308 for (address = address_off; address < filesize; address+=2) { 308 for (address = address_off; address < address_end; address+=2) {
309 if (is_visited(address)) { 309 if (is_visited(address)) {
310 encoded = filebuf + (address-address_off)/2; 310 encoded = filebuf + (address-address_off)/2;
311 m68k_decode(encoded, &instbuf, address); 311 m68k_decode(encoded, &instbuf, address);
312 if (labels) { 312 if (labels) {
313 m68k_disasm_labels(&instbuf, disbuf); 313 m68k_disasm_labels(&instbuf, disbuf);