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