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);