Mercurial > repos > blastem
comparison dis.c @ 2091:36a9cf4db65f
Fix some disassembler bugs introduced with Sega CD changes
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Feb 2022 22:24:42 -0800 |
parents | 1ff67ce37085 |
children | f3fb7e2c727a |
comparison
equal
deleted
inserted
replaced
2090:00b6592cad42 | 2091:36a9cf4db65f |
---|---|
147 } | 147 } |
148 | 148 |
149 int main(int argc, char ** argv) | 149 int main(int argc, char ** argv) |
150 { | 150 { |
151 long filesize; | 151 long filesize; |
152 unsigned short *filebuf; | 152 unsigned short *filebuf = NULL; |
153 char disbuf[1024]; | 153 char disbuf[1024]; |
154 m68kinst instbuf; | 154 m68kinst instbuf; |
155 unsigned short * cur; | 155 unsigned short * cur; |
156 deferred *def = NULL, *tmpd; | 156 deferred *def = NULL, *tmpd; |
157 | 157 |
231 fseek(f, 0, SEEK_END); | 231 fseek(f, 0, SEEK_END); |
232 filesize = ftell(f); | 232 filesize = ftell(f); |
233 fseek(f, 0, SEEK_SET); | 233 fseek(f, 0, SEEK_SET); |
234 | 234 |
235 char int_key[MAX_INT_KEY_SIZE]; | 235 char int_key[MAX_INT_KEY_SIZE]; |
236 uint8_t is_scd_iso = 0; | |
236 if (vos) | 237 if (vos) |
237 { | 238 { |
238 vos_program_module header; | 239 vos_program_module header; |
239 vos_read_header(f, &header); | 240 vos_read_header(f, &header); |
240 vos_read_alloc_module_map(f, &header); | 241 vos_read_alloc_module_map(f, &header); |
271 filebuf = malloc(boot_size); | 272 filebuf = malloc(boot_size); |
272 if (fread(filebuf, 1, boot_size, f) != boot_size) { | 273 if (fread(filebuf, 1, boot_size, f) != boot_size) { |
273 fprintf(stderr, "Failure while reading file %s\n", argv[1]); | 274 fprintf(stderr, "Failure while reading file %s\n", argv[1]); |
274 return 1; | 275 return 1; |
275 } | 276 } |
276 uint8_t is_scd_iso = !memcmp("SEGADISCSYSTEM ", filebuf, 0x10); | 277 is_scd_iso = !memcmp("SEGADISCSYSTEM ", filebuf, 0x10); |
277 if (!is_scd_iso && !memcmp("SEGADISCSYSTEM ", filebuf + 0x8, 0x10)) { | 278 if (!is_scd_iso && !memcmp("SEGADISCSYSTEM ", filebuf + 0x8, 0x10)) { |
278 is_scd_iso = 1; | 279 is_scd_iso = 1; |
279 uint32_t end = 16 * 2352; | 280 uint32_t end = 16 * 2352; |
280 if (end > filesize) { | 281 if (end > filesize) { |
281 end = (filesize / 2352) * 2352; | 282 end = (filesize / 2352) * 2352; |
325 named_labels = add_label(named_labels, name, address); | 326 named_labels = add_label(named_labels, name, address); |
326 if (!has_manual_defs || !only) { | 327 if (!has_manual_defs || !only) { |
327 def = defer(address, def); | 328 def = defer(address, def); |
328 } | 329 } |
329 } | 330 } |
331 fclose(f); | |
330 do_cd_labels = 1; | 332 do_cd_labels = 1; |
331 filebuf += sub_start / 2; | 333 filebuf += sub_start / 2; |
332 address_off = 0x6000; | 334 address_off = 0x6000; |
333 address_end = sub_end-sub_start + address_off; | 335 address_end = sub_end-sub_start + address_off; |
334 } else { | 336 } |
337 } | |
338 if (!vos && !is_scd_iso) { | |
339 if (filebuf) { | |
335 if (filesize > (32*1024)) { | 340 if (filesize > (32*1024)) { |
336 filebuf = realloc(f, filesize); | 341 filebuf = realloc(filebuf, filesize); |
337 fseek(f, 32*1024, SEEK_SET); | 342 fseek(f, 32*1024, SEEK_SET); |
338 uint32_t to_read = filesize/2 - 16*1024; | 343 uint32_t to_read = filesize/2 - 16*1024; |
339 if (fread(filebuf, 2, to_read, f) != to_read) | 344 if (fread(filebuf + 16*1024, 2, to_read, f) != to_read) |
340 { | 345 { |
341 fprintf(stderr, "Failure while reading file %s\n", argv[1]); | 346 fprintf(stderr, "Failure while reading file %s\n", argv[1]); |
342 } | 347 } |
343 } | 348 } |
344 address_end = address_off + filesize; | 349 } else { |
345 fclose(f); | 350 filebuf = malloc(filesize); |
346 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur) | 351 if (fread(filebuf, 2, filesize/2, f) != filesize/2) |
347 { | 352 { |
348 *cur = (*cur >> 8) | (*cur << 8); | 353 fprintf(stderr, "Failure while reading file %s\n", argv[1]); |
349 } | 354 } |
350 if (!address_off) { | 355 } |
351 uint32_t start = filebuf[2] << 16 | filebuf[3]; | 356 address_end = address_off + filesize; |
352 uint32_t int_2 = filebuf[0x68/2] << 16 | filebuf[0x6A/2]; | 357 fclose(f); |
353 uint32_t int_4 = filebuf[0x70/2] << 16 | filebuf[0x72/2]; | 358 for(cur = filebuf; cur - filebuf < (filesize/2); ++cur) |
354 uint32_t int_6 = filebuf[0x78/2] << 16 | filebuf[0x7A/2]; | 359 { |
355 named_labels = add_label(named_labels, "start", start); | 360 *cur = (*cur >> 8) | (*cur << 8); |
356 named_labels = add_label(named_labels, "int_2", int_2); | 361 } |
357 named_labels = add_label(named_labels, "int_4", int_4); | 362 if (!address_off) { |
358 named_labels = add_label(named_labels, "int_6", int_6); | 363 uint32_t start = filebuf[2] << 16 | filebuf[3]; |
359 if (!def || !only) { | 364 uint32_t int_2 = filebuf[0x68/2] << 16 | filebuf[0x6A/2]; |
360 def = defer(start, def); | 365 uint32_t int_4 = filebuf[0x70/2] << 16 | filebuf[0x72/2]; |
361 def = defer(int_2, def); | 366 uint32_t int_6 = filebuf[0x78/2] << 16 | filebuf[0x7A/2]; |
362 def = defer(int_4, def); | 367 named_labels = add_label(named_labels, "start", start); |
363 def = defer(int_6, def); | 368 named_labels = add_label(named_labels, "int_2", int_2); |
364 } | 369 named_labels = add_label(named_labels, "int_4", int_4); |
370 named_labels = add_label(named_labels, "int_6", int_6); | |
371 if (!def || !only) { | |
372 def = defer(start, def); | |
373 def = defer(int_2, def); | |
374 def = defer(int_4, def); | |
375 def = defer(int_6, def); | |
365 } | 376 } |
366 } | 377 } |
367 } | 378 } |
368 if (do_cd_labels) { | 379 if (do_cd_labels) { |
369 named_labels = weak_label(named_labels, "bios_common_work", 0x5E80); | 380 named_labels = weak_label(named_labels, "bios_common_work", 0x5E80); |
420 while(def) { | 431 while(def) { |
421 do { | 432 do { |
422 encoded = NULL; | 433 encoded = NULL; |
423 address = def->address; | 434 address = def->address; |
424 if (!is_visited(address)) { | 435 if (!is_visited(address)) { |
425 encoded = filebuf + ((address & 0xFFFFFF) - address_off)/2; | 436 address &= 0xFFFFFF; |
437 if (address < address_end) { | |
438 encoded = filebuf + ((address & 0xFFFFFF) - address_off)/2; | |
439 } | |
426 } | 440 } |
427 tmpd = def; | 441 tmpd = def; |
428 def = def->next; | 442 def = def->next; |
429 free(tmpd); | 443 free(tmpd); |
430 } while(def && encoded == NULL); | 444 } while(def && encoded == NULL); |