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)