Mercurial > repos > blastem
comparison dis.c @ 2132:7451f970ee66
Add some weak labels for a few exception vectors in disassembler
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 17 Mar 2022 22:40:49 -0700 |
parents | f1238ffb30a3 |
children | 0c0d4233d826 |
comparison
equal
deleted
inserted
replaced
2131:d90d92ce5cab | 2132:7451f970ee66 |
---|---|
142 { | 142 { |
143 *text = 0; | 143 *text = 0; |
144 text--; | 144 text--; |
145 } | 145 } |
146 return ret; | 146 return ret; |
147 } | |
148 | |
149 typedef struct { | |
150 uint32_t address_off; | |
151 uint32_t address_end; | |
152 uint16_t *buffer; | |
153 } rom_def; | |
154 | |
155 uint16_t fetch(uint32_t address, void *data) | |
156 { | |
157 rom_def *rom = data; | |
158 if (address >= rom->address_off && address < rom->address_end) { | |
159 return rom->buffer[((address & 0xFFFFFF) - rom->address_off) >> 1]; | |
160 } | |
161 return 0; | |
147 } | 162 } |
148 | 163 |
149 int main(int argc, char ** argv) | 164 int main(int argc, char ** argv) |
150 { | 165 { |
151 long filesize; | 166 long filesize; |
405 def = defer(start, def); | 420 def = defer(start, def); |
406 def = defer(int_2, def); | 421 def = defer(int_2, def); |
407 def = defer(int_4, def); | 422 def = defer(int_4, def); |
408 def = defer(int_6, def); | 423 def = defer(int_6, def); |
409 } | 424 } |
425 named_labels = weak_label(named_labels, "illegal_inst", filebuf[0x10/2] << 16 | filebuf[0x12/2]); | |
426 named_labels = weak_label(named_labels, "div_zero", filebuf[0x14/2] << 16 | filebuf[0x16/2]); | |
427 named_labels = weak_label(named_labels, "chk_exception", filebuf[0x18/2] << 16 | filebuf[0x1A/2]); | |
428 named_labels = weak_label(named_labels, "trapv", filebuf[0x1C/2] << 16 | filebuf[0x1E/2]); | |
429 named_labels = weak_label(named_labels, "line_a_trap", filebuf[0x28/2] << 16 | filebuf[0x2A/2]); | |
430 named_labels = weak_label(named_labels, "line_f_trap", filebuf[0x2C/2] << 16 | filebuf[0x2E/2]); | |
410 } | 431 } |
411 } | 432 } |
412 if (do_cd_labels) { | 433 if (do_cd_labels) { |
413 if (main_cpu) { | 434 if (main_cpu) { |
414 named_labels = weak_label(named_labels, "_bios_reset", 0x280); | 435 named_labels = weak_label(named_labels, "_bios_reset", 0x280); |
563 named_labels = weak_label(named_labels, "CDD_FADER", 0xFFFF8034); | 584 named_labels = weak_label(named_labels, "CDD_FADER", 0xFFFF8034); |
564 named_labels = weak_label(named_labels, "CDD_CTRL_WORD", 0xFFFF8036); | 585 named_labels = weak_label(named_labels, "CDD_CTRL_WORD", 0xFFFF8036); |
565 named_labels = weak_label(named_labels, "CDD_CTRL_BYTE", 0xFFFF8037); | 586 named_labels = weak_label(named_labels, "CDD_CTRL_BYTE", 0xFFFF8037); |
566 } | 587 } |
567 } | 588 } |
568 uint16_t *encoded, *next; | |
569 uint32_t size, tmp_addr; | 589 uint32_t size, tmp_addr; |
570 uint32_t address; | 590 uint32_t address; |
591 rom_def rom = { | |
592 .address_off = address_off, | |
593 .address_end = address_end, | |
594 .buffer = filebuf | |
595 }; | |
596 uint8_t valid_address; | |
571 while(def) { | 597 while(def) { |
572 do { | 598 do { |
573 encoded = NULL; | 599 valid_address = 0; |
574 address = def->address; | 600 address = def->address; |
575 if (!is_visited(address)) { | 601 if (!is_visited(address)) { |
576 address &= 0xFFFFFF; | 602 address &= 0xFFFFFF; |
577 if (address < address_end) { | 603 if (address < address_end && address >= address_off) { |
578 encoded = filebuf + ((address & 0xFFFFFF) - address_off)/2; | 604 valid_address = 1; |
579 } | 605 } |
580 } | 606 } |
581 tmpd = def; | 607 tmpd = def; |
582 def = def->next; | 608 def = def->next; |
583 free(tmpd); | 609 free(tmpd); |
584 } while(def && encoded == NULL); | 610 } while(def && !valid_address); |
585 if (!encoded) { | 611 if (!valid_address) { |
586 break; | 612 break; |
587 } | 613 } |
588 for(;;) { | 614 for(;;) { |
589 if ((address & 0xFFFFFF) > address_end || address < address_off) { | 615 if ((address & 0xFFFFFF) > address_end || address < address_off) { |
590 break; | 616 break; |
591 } | 617 } |
592 visit(address); | 618 visit(address); |
593 next = m68k_decode(encoded, &instbuf, address); | 619 address = m68k_decode(fetch, &rom, &instbuf, address); |
594 address += (next-encoded)*2; | |
595 encoded = next; | |
596 //m68k_disasm(&instbuf, disbuf); | 620 //m68k_disasm(&instbuf, disbuf); |
597 //printf("%X: %s\n", instbuf.address, disbuf); | 621 //printf("%X: %s\n", instbuf.address, disbuf); |
598 check_reference(&instbuf, &(instbuf.src)); | 622 check_reference(&instbuf, &(instbuf.src)); |
599 check_reference(&instbuf, &(instbuf.dst)); | 623 check_reference(&instbuf, &(instbuf.dst)); |
600 if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE || instbuf.op == M68K_INVALID) { | 624 if (instbuf.op == M68K_ILLEGAL || instbuf.op == M68K_RTS || instbuf.op == M68K_RTE || instbuf.op == M68K_INVALID) { |
601 break; | 625 break; |
602 } | 626 } |
603 if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) { | 627 if (instbuf.op == M68K_BCC || instbuf.op == M68K_DBCC || instbuf.op == M68K_BSR) { |
604 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) { | 628 if (instbuf.op == M68K_BCC && instbuf.extra.cond == COND_TRUE) { |
605 address = instbuf.address + 2 + instbuf.src.params.immed; | 629 address = instbuf.address + 2 + instbuf.src.params.immed; |
606 encoded = filebuf + (address - address_off)/2; | |
607 reference(address); | 630 reference(address); |
608 if (is_visited(address)) { | 631 if (is_visited(address)) { |
609 break; | 632 break; |
610 } | 633 } |
611 } else { | 634 } else { |
614 def = defer(tmp_addr, def); | 637 def = defer(tmp_addr, def); |
615 } | 638 } |
616 } else if(instbuf.op == M68K_JMP) { | 639 } else if(instbuf.op == M68K_JMP) { |
617 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) { | 640 if (instbuf.src.addr_mode == MODE_ABSOLUTE || instbuf.src.addr_mode == MODE_ABSOLUTE_SHORT) { |
618 address = instbuf.src.params.immed; | 641 address = instbuf.src.params.immed; |
619 encoded = filebuf + (address - address_off)/2; | |
620 if (is_visited(address)) { | 642 if (is_visited(address)) { |
621 break; | 643 break; |
622 } | 644 } |
623 } else if (instbuf.src.addr_mode == MODE_PC_DISPLACE) { | 645 } else if (instbuf.src.addr_mode == MODE_PC_DISPLACE) { |
624 address = instbuf.src.params.regs.displacement + instbuf.address + 2; | 646 address = instbuf.src.params.regs.displacement + instbuf.address + 2; |
625 encoded = filebuf + (address - address_off)/2; | |
626 if (is_visited(address)) { | 647 if (is_visited(address)) { |
627 break; | 648 break; |
628 } | 649 } |
629 } else { | 650 } else { |
630 break; | 651 break; |
671 } | 692 } |
672 puts(""); | 693 puts(""); |
673 } | 694 } |
674 for (address = address_off; address < address_end; address+=2) { | 695 for (address = address_off; address < address_end; address+=2) { |
675 if (is_visited(address)) { | 696 if (is_visited(address)) { |
676 encoded = filebuf + (address-address_off)/2; | 697 m68k_decode(fetch, &rom, &instbuf, address); |
677 m68k_decode(encoded, &instbuf, address); | |
678 if (labels) { | 698 if (labels) { |
679 m68k_disasm_labels(&instbuf, disbuf, label_fun, named_labels); | 699 m68k_disasm_labels(&instbuf, disbuf, label_fun, named_labels); |
680 char keybuf[MAX_INT_KEY_SIZE]; | 700 char keybuf[MAX_INT_KEY_SIZE]; |
681 label_names * names = tern_find_ptr(named_labels, tern_int_key(address, keybuf)); | 701 label_names * names = tern_find_ptr(named_labels, tern_int_key(address, keybuf)); |
682 if (names) | 702 if (names) |