ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/mon/src/mon_disass.cpp
Revision: 1.1
Committed: 2000-09-25T12:44:34Z (24 years, 2 months ago) by cebix
Branch: MAIN
Log Message:
- replaced 680x0 and 80x86 disassemblers with the ones from GNU binutils
- 680x0 disassembler shows symbolic MacOS low memory globals

File Contents

# Content
1 /*
2 * mon_disass.cpp - Disassemblers
3 *
4 * mon (C) 1997-2000 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
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */
20
21 #include "sysdeps.h"
22
23 #include <stdarg.h>
24
25 #include "mon.h"
26 #include "mon_disass.h"
27 #include "mon_lowmem.h"
28
29
30 /*
31 * GNU disassembler callbacks
32 */
33
34 extern "C" {
35 #include "disass/dis-asm.h"
36
37 int buffer_read_memory(bfd_vma from, bfd_byte *to, int length, struct disassemble_info *info)
38 {
39 while (length--)
40 *to++ = mon_read_byte(from++);
41 return 0;
42 }
43
44 void perror_memory(int status, bfd_vma memaddr, struct disassemble_info *info)
45 {
46 info->fprintf_func(info->stream, "Unknown error %d\n", status);
47 }
48
49 bool lookup_lowmem;
50
51 void generic_print_address(bfd_vma addr, struct disassemble_info *info)
52 {
53 if (lookup_lowmem && ((addr >= 0x100 && addr < 0x400) || (addr >= 0x800 && addr < 0xe00) || (addr >= 0x1e00 && addr < 0x3000))) {
54 // Look for address in low memory globals table
55 const lowmem_info *p = lowmem;
56 while (p->name) {
57 if (addr >= p[0].addr && addr < p[1].addr) {
58 if (addr == p[0].addr)
59 info->fprintf_func(info->stream, "%s", p->name);
60 else
61 info->fprintf_func(info->stream, "%s+%d", p->name, addr - p->addr);
62 return;
63 }
64 p++;
65 }
66 }
67 info->fprintf_func(info->stream, "$%08x", addr);
68 }
69
70 int generic_symbol_at_address(bfd_vma addr, struct disassemble_info *info)
71 {
72 return 0;
73 }
74
75 };
76
77
78 /*
79 * sprintf into a "stream"
80 */
81
82 struct SFILE {
83 char *buffer;
84 char *current;
85 };
86
87 static int mon_sprintf(SFILE *f, const char *format, ...)
88 {
89 int n;
90 va_list args;
91 va_start(args, format);
92 vsprintf(f->current, format, args);
93 f->current += n = strlen(f->current);
94 va_end(args);
95 return n;
96 }
97
98
99 /*
100 * Disassemble one instruction, return number of bytes
101 */
102
103 int disass_68k(FILE *f, uint32 adr)
104 {
105 // Initialize info for GDB disassembler
106 disassemble_info info;
107 char buf[1024];
108 SFILE sfile = {buf, buf};
109 sfile.buffer = buf;
110 sfile.current = buf;
111 INIT_DISASSEMBLE_INFO(info, (FILE *)&sfile, (fprintf_ftype)mon_sprintf);
112
113 // Disassemble instruction
114 lookup_lowmem = true;
115 int num = print_insn_m68k(adr, &info);
116 if (num >= 2)
117 fprintf(f, "%04x ", mon_read_half(adr));
118 else
119 fprintf(f, " ");
120 if (num >= 4)
121 fprintf(f, "%04x ", mon_read_half(adr + 2));
122 else
123 fprintf(f, " ");
124 if (num >= 6)
125 fprintf(f, "%04x ", mon_read_half(adr + 4));
126 else
127 fprintf(f, " ");
128 if (num == 8)
129 fprintf(f, "%04x\t%s\n", mon_read_half(adr + 6), buf);
130 else if (num >= 8)
131 fprintf(f, "...\t%s\n", buf);
132 else
133 fprintf(f, " \t%s\n", buf);
134 return num;
135 }
136
137 int disass_x86(FILE *f, uint32 adr)
138 {
139 // Initialize info for GDB disassembler
140 disassemble_info info;
141 char buf[1024];
142 SFILE sfile = {buf, buf};
143 sfile.buffer = buf;
144 sfile.current = buf;
145 INIT_DISASSEMBLE_INFO(info, (FILE *)&sfile, (fprintf_ftype)mon_sprintf);
146
147 // Disassemble instruction
148 lookup_lowmem = false;
149 int num = print_insn_i386(adr, &info);
150 fprintf(f, "%s\n", buf);
151 return num;
152 }