--- mon/src/mon_disass.cpp 2000/09/25 12:44:34 1.1 +++ mon/src/mon_disass.cpp 2000/09/25 17:52:33 1.2 @@ -24,9 +24,15 @@ #include "mon.h" #include "mon_disass.h" + +#include "mon_atraps.h" #include "mon_lowmem.h" +// Flag: enable MacOS A-Trap and LM globals lookup in 68k disassembler +bool mon_macos_mode = false; + + /* * GNU disassembler callbacks */ @@ -50,18 +56,32 @@ bool lookup_lowmem; void generic_print_address(bfd_vma addr, struct disassemble_info *info) { - if (lookup_lowmem && ((addr >= 0x100 && addr < 0x400) || (addr >= 0x800 && addr < 0xe00) || (addr >= 0x1e00 && addr < 0x3000))) { - // Look for address in low memory globals table - const lowmem_info *p = lowmem; - while (p->name) { - if (addr >= p[0].addr && addr < p[1].addr) { - if (addr == p[0].addr) - info->fprintf_func(info->stream, "%s", p->name); - else - info->fprintf_func(info->stream, "%s+%d", p->name, addr - p->addr); - return; + if (lookup_lowmem && addr >= 0x100 && addr < 0x3000) { + if (((addr >= 0x400 && addr < 0x800) || (addr >= 0xe00 && addr < 0x1e00)) && ((addr & 3) == 0)) { + // Look for address in A-Trap table + uint16 opcode = (addr < 0xe00 ? 0xa000 + (addr - 0x400) / 4 : 0xa800 + (addr - 0xe00) / 4); + uint16 mask = (addr < 0xe00 ? 0xf8ff : 0xffff); + const atrap_info *p = atraps; + while (p->word) { + if ((p->word & mask) == opcode) { + info->fprintf_func(info->stream, p->name); + return; + } + p++; + } + } else { + // Look for address in low memory globals table + const lowmem_info *p = lowmem; + while (p->name) { + if (addr >= p[0].addr && addr < p[1].addr) { + if (addr == p[0].addr) + info->fprintf_func(info->stream, "%s", p->name); + else + info->fprintf_func(info->stream, "%s+%d", p->name, addr - p->addr); + return; + } + p++; } - p++; } } info->fprintf_func(info->stream, "$%08x", addr); @@ -72,6 +92,22 @@ int generic_symbol_at_address(bfd_vma ad return 0; } +void print_68k_invalid_opcode(unsigned long opcode, struct disassemble_info *info) +{ + if (mon_macos_mode) { + // Look for MacOS A-Trap + const atrap_info *p = atraps; + while (p->word) { + if (p->word == opcode) { + info->fprintf_func(info->stream, p->name); + return; + } + p++; + } + } + info->fprintf_func(info->stream, "?"); +} + }; @@ -111,26 +147,22 @@ int disass_68k(FILE *f, uint32 adr) INIT_DISASSEMBLE_INFO(info, (FILE *)&sfile, (fprintf_ftype)mon_sprintf); // Disassemble instruction - lookup_lowmem = true; + lookup_lowmem = mon_macos_mode; int num = print_insn_m68k(adr, &info); - if (num >= 2) - fprintf(f, "%04x ", mon_read_half(adr)); - else - fprintf(f, " "); - if (num >= 4) - fprintf(f, "%04x ", mon_read_half(adr + 2)); - else - fprintf(f, " "); - if (num >= 6) - fprintf(f, "%04x ", mon_read_half(adr + 4)); - else - fprintf(f, " "); + + for (int i=0; i<6; i+=2) { + if (num > i) + fprintf(f, "%04x ", mon_read_half(adr + i)); + else + fprintf(f, " "); + } if (num == 8) fprintf(f, "%04x\t%s\n", mon_read_half(adr + 6), buf); - else if (num >= 8) + else if (num > 8) fprintf(f, "...\t%s\n", buf); else fprintf(f, " \t%s\n", buf); + return num; } @@ -147,6 +179,19 @@ int disass_x86(FILE *f, uint32 adr) // Disassemble instruction lookup_lowmem = false; int num = print_insn_i386(adr, &info); - fprintf(f, "%s\n", buf); + + for (int i=0; i<6; i++) { + if (num > i) + fprintf(f, "%02x ", mon_read_byte(adr + i)); + else + fprintf(f, " "); + } + if (num == 7) + fprintf(f, "%02x\t%s\n", mon_read_byte(adr + 7), buf); + else if (num > 7) + fprintf(f, "..\t%s\n", buf); + else + fprintf(f, " \t%s\n", buf); + return num; }