ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/mon/src/mon_disass.cpp
(Generate patch)

Comparing mon/src/mon_disass.cpp (file contents):
Revision 1.1 by cebix, 2000-09-25T12:44:34Z vs.
Revision 1.2 by cebix, 2000-09-25T17:52:33Z

# Line 24 | Line 24
24  
25   #include "mon.h"
26   #include "mon_disass.h"
27 +
28 + #include "mon_atraps.h"
29   #include "mon_lowmem.h"
30  
31  
32 + // Flag: enable MacOS A-Trap and LM globals lookup in 68k disassembler
33 + bool mon_macos_mode = false;
34 +
35 +
36   /*
37   *  GNU disassembler callbacks
38   */
# Line 50 | Line 56 | bool lookup_lowmem;
56  
57   void generic_print_address(bfd_vma addr, struct disassemble_info *info)
58   {
59 <        if (lookup_lowmem && ((addr >= 0x100 && addr < 0x400) || (addr >= 0x800 && addr < 0xe00) || (addr >= 0x1e00 && addr < 0x3000))) {
60 <                // Look for address in low memory globals table
61 <                const lowmem_info *p = lowmem;
62 <                while (p->name) {
63 <                        if (addr >= p[0].addr && addr < p[1].addr) {
64 <                                if (addr == p[0].addr)
65 <                                        info->fprintf_func(info->stream, "%s", p->name);
66 <                                else
67 <                                        info->fprintf_func(info->stream, "%s+%d", p->name, addr - p->addr);
68 <                                return;
59 >        if (lookup_lowmem && addr >= 0x100 && addr < 0x3000) {
60 >                if (((addr >= 0x400 && addr < 0x800) || (addr >= 0xe00 && addr < 0x1e00)) && ((addr & 3) == 0)) {
61 >                        // Look for address in A-Trap table
62 >                        uint16 opcode = (addr < 0xe00 ? 0xa000 + (addr - 0x400) / 4 : 0xa800 + (addr - 0xe00) / 4);
63 >                        uint16 mask = (addr < 0xe00 ? 0xf8ff : 0xffff);
64 >                        const atrap_info *p = atraps;
65 >                        while (p->word) {
66 >                                if ((p->word & mask) == opcode) {
67 >                                        info->fprintf_func(info->stream, p->name);
68 >                                        return;
69 >                                }
70 >                                p++;
71 >                        }
72 >                } else {
73 >                        // Look for address in low memory globals table
74 >                        const lowmem_info *p = lowmem;
75 >                        while (p->name) {
76 >                                if (addr >= p[0].addr && addr < p[1].addr) {
77 >                                        if (addr == p[0].addr)
78 >                                                info->fprintf_func(info->stream, "%s", p->name);
79 >                                        else
80 >                                                info->fprintf_func(info->stream, "%s+%d", p->name, addr - p->addr);
81 >                                        return;
82 >                                }
83 >                                p++;
84                          }
64                        p++;
85                  }
86          }
87          info->fprintf_func(info->stream, "$%08x", addr);
# Line 72 | Line 92 | int generic_symbol_at_address(bfd_vma ad
92          return 0;
93   }
94  
95 + void print_68k_invalid_opcode(unsigned long opcode, struct disassemble_info *info)
96 + {
97 +        if (mon_macos_mode) {
98 +                // Look for MacOS A-Trap
99 +                const atrap_info *p = atraps;
100 +                while (p->word) {
101 +                        if (p->word == opcode) {
102 +                                info->fprintf_func(info->stream, p->name);
103 +                                return;
104 +                        }
105 +                        p++;
106 +                }
107 +        }
108 +        info->fprintf_func(info->stream, "?");
109 + }
110 +
111   };
112  
113  
# Line 111 | Line 147 | int disass_68k(FILE *f, uint32 adr)
147          INIT_DISASSEMBLE_INFO(info, (FILE *)&sfile, (fprintf_ftype)mon_sprintf);
148  
149          // Disassemble instruction
150 <        lookup_lowmem = true;
150 >        lookup_lowmem = mon_macos_mode;
151          int num = print_insn_m68k(adr, &info);
152 <        if (num >= 2)
153 <                fprintf(f, "%04x ", mon_read_half(adr));
154 <        else
155 <                fprintf(f, "     ");
156 <        if (num >= 4)
157 <                fprintf(f, "%04x ", mon_read_half(adr + 2));
158 <        else
123 <                fprintf(f, "     ");
124 <        if (num >= 6)
125 <                fprintf(f, "%04x ", mon_read_half(adr + 4));
126 <        else
127 <                fprintf(f, "     ");
152 >
153 >        for (int i=0; i<6; i+=2) {
154 >                if (num > i)
155 >                        fprintf(f, "%04x ", mon_read_half(adr + i));
156 >                else
157 >                        fprintf(f, "     ");
158 >        }
159          if (num == 8)
160                  fprintf(f, "%04x\t%s\n", mon_read_half(adr + 6), buf);
161 <        else if (num >= 8)
161 >        else if (num > 8)
162                  fprintf(f, "...\t%s\n", buf);
163          else
164                  fprintf(f, "   \t%s\n", buf);
165 +
166          return num;
167   }
168  
# Line 147 | Line 179 | int disass_x86(FILE *f, uint32 adr)
179          // Disassemble instruction
180          lookup_lowmem = false;
181          int num = print_insn_i386(adr, &info);
182 <        fprintf(f, "%s\n", buf);
182 >
183 >        for (int i=0; i<6; i++) {
184 >                if (num > i)
185 >                        fprintf(f, "%02x ", mon_read_byte(adr + i));
186 >                else
187 >                        fprintf(f, "   ");
188 >        }
189 >        if (num == 7)
190 >                fprintf(f, "%02x\t%s\n", mon_read_byte(adr + 7), buf);
191 >        else if (num > 7)
192 >                fprintf(f, "..\t%s\n", buf);
193 >        else
194 >                fprintf(f, "  \t%s\n", buf);
195 >
196          return num;
197   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines