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.7 by gbeauche, 2003-02-03T21:40:46Z

# Line 1 | Line 1
1   /*
2   *  mon_disass.cpp - Disassemblers
3   *
4 < *  mon (C) 1997-2000 Christian Bauer, Marc Hellwig
4 > *  cxmon (C) 1997-2002 Christian Bauer, Marc Hellwig
5   *
6   *  This program is free software; you can redistribute it and/or modify
7   *  it under the terms of the GNU General Public License as published by
# 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 34 | Line 40
40   extern "C" {
41   #include "disass/dis-asm.h"
42  
43 < int buffer_read_memory(bfd_vma from, bfd_byte *to, int length, struct disassemble_info *info)
43 > int buffer_read_memory(bfd_vma from, bfd_byte *to, unsigned int length, struct disassemble_info *info)
44   {
45          while (length--)
46                  *to++ = mon_read_byte(from++);
# 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  
169 < int disass_x86(FILE *f, uint32 adr)
169 > int disass_x86(FILE *f, uint32 adr, uint32 bits)
170   {
171          // Initialize info for GDB disassembler
172          disassemble_info info;
# Line 143 | Line 175 | int disass_x86(FILE *f, uint32 adr)
175          sfile.buffer = buf;
176          sfile.current = buf;
177          INIT_DISASSEMBLE_INFO(info, (FILE *)&sfile, (fprintf_ftype)mon_sprintf);
178 +        if (bits == 16)
179 +                info.mach = bfd_mach_i386_i8086;
180 +        else if (bits == 64)
181 +                info.mach = bfd_mach_x86_64;
182  
183          // Disassemble instruction
184          lookup_lowmem = false;
185 <        int num = print_insn_i386(adr, &info);
186 <        fprintf(f, "%s\n", buf);
185 >        int num = print_insn_i386_att(adr, &info);
186 >
187 >        for (int i=0; i<6; i++) {
188 >                if (num > i)
189 >                        fprintf(f, "%02x ", mon_read_byte(adr + i));
190 >                else
191 >                        fprintf(f, "   ");
192 >        }
193 >        if (num == 7)
194 >                fprintf(f, "%02x\t%s\n", mon_read_byte(adr + 7), buf);
195 >        else if (num > 7)
196 >                fprintf(f, "..\t%s\n", buf);
197 >        else
198 >                fprintf(f, "  \t%s\n", buf);
199 >
200          return num;
201   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines