* Makefile.in (diststuff): Make all-doc; diststuff target does not
[deliverable/binutils-gdb.git] / gdb / sh3-rom.c
CommitLineData
1480482a 1/* Remote target glue for the Hitachi SH-3 ROM monitor.
c84e5000 2 Copyright 1995, 1996 Free Software Foundation, Inc.
1480482a
SG
3
4This file is part of GDB.
5
6This program is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 2 of the License, or
9(at your option) any later version.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with this program; if not, write to the Free Software
18Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
19
20#include "defs.h"
21#include "gdbcore.h"
22#include "target.h"
23#include "monitor.h"
24#include "serial.h"
5c8ba017 25#include "srec.h"
1480482a 26
c84e5000
SC
27static serial_t parallel;
28static int parallel_in_use;
29
1480482a
SG
30static void sh3_open PARAMS ((char *args, int from_tty));
31
32static void
33sh3_supply_register (regname, regnamelen, val, vallen)
34 char *regname;
35 int regnamelen;
36 char *val;
37 int vallen;
38{
39 int numregs;
40 int regno;
41
42 numregs = 1;
43 regno = -1;
44
45 if (regnamelen == 2)
46 switch (regname[0])
47 {
48 case 'S':
49 if (regname[1] == 'R')
50 regno = SR_REGNUM;
51 break;
52 case 'P':
53 if (regname[1] == 'C')
54 regno = PC_REGNUM;
55 else if (regname[1] == 'R')
56 regno = PR_REGNUM;
57 break;
58 }
59 else if (regnamelen == 3)
60 switch (regname[0])
61 {
62 case 'G':
63 case 'V':
64 if (regname[1] == 'B' && regname[2] == 'R')
65 if (regname[0] == 'G')
66 regno = VBR_REGNUM;
67 else
68 regno = GBR_REGNUM;
69 break;
70#if 0
71 case 'S':
72 if (regname[1] == 'S' && regname[2] == 'R')
73 regno = SSR_REGNUM;
74 else if (regname[1] == 'P' && regname[2] == 'C')
75 regno = SPC_REGNUM;
76 break;
77#endif
78 }
79 else if (regnamelen == 4)
80 switch (regname[0])
81 {
82 case 'M':
83 if (regname[1] == 'A' && regname[2] == 'C')
84 if (regname[3] == 'H')
85 regno = MACH_REGNUM;
86 else if (regname[3] == 'L')
87 regno = MACL_REGNUM;
88 break;
89 case 'R':
90 if (regname[1] == '0' && regname[2] == '-' && regname[3] == '7')
91 {
92 regno = R0_REGNUM;
93 numregs = 8;
94 }
95 }
96 else if (regnamelen == 5)
97 if (regname[1] == '8' && regname[2] == '-' && regname[3] == '1'
98 && regname[4] =='5')
99 {
100 regno = R0_REGNUM + 8;
101 numregs = 8;
102 }
103
104 if (regno >= 0)
105 while (numregs-- > 0)
106 val = monitor_supply_register (regno++, val);
107}
108
5c8ba017
SG
109static void
110sh3_load (desc, file, hashmark)
111 serial_t desc;
112 char *file;
113 int hashmark;
114{
c84e5000
SC
115 if (parallel_in_use)
116 {
117 monitor_printf("pl;s\r");
118 load_srec (parallel, file, 80, SREC_ALL, hashmark);
119 monitor_expect_prompt (NULL, 0);
120 }
121 else
122 {
123 monitor_printf ("il;s:x\r");
124 monitor_expect ("\005", NULL, 0); /* Look for ENQ */
125 SERIAL_WRITE (desc, "\006", 1); /* Send ACK */
126 monitor_expect ("LO x\r", NULL, 0); /* Look for filename */
5c8ba017 127
c84e5000 128 load_srec (desc, file, 80, SREC_ALL, hashmark);
5c8ba017 129
c84e5000
SC
130 monitor_expect ("\005", NULL, 0); /* Look for ENQ */
131 SERIAL_WRITE (desc, "\006", 1); /* Send ACK */
132 monitor_expect_prompt (NULL, 0);
133 }
5c8ba017
SG
134}
135
1480482a
SG
136/* This array of registers need to match the indexes used by GDB.
137 This exists because the various ROM monitors use different strings
138 than does GDB, and don't necessarily support all the registers
139 either. So, typing "info reg sp" becomes a "r30". */
140
141static char *sh3_regnames[NUM_REGS] = {
142 "R0", "R1", "R2", "R3", "R4", "R5", "R6", "R7",
143 "R8", "R9", "R10","R11","R12","R13","R14","R15",
144 "PC", "PR", "GBR","VBR","MACH","MACL","SR",NULL,
145 NULL, NULL, NULL, NULL};
146
147/* Define the monitor command strings. Since these are passed directly
148 through to a printf style function, we may include formatting
149 strings. We also need a CR or LF on the end. */
150
151static struct target_ops sh3_ops;
152
153static char *sh3_inits[] = {"\003", NULL}; /* Exits sub-command mode & download cmds */
154
155static struct monitor_ops sh3_cmds =
156{
283dc598
SG
157 MO_CLR_BREAK_USES_ADDR
158 | MO_GETMEM_READ_SINGLE, /* flags */
1480482a
SG
159 sh3_inits, /* monitor init string */
160 "g\r", /* continue command */
161 "s\r", /* single step */
162 "\003", /* Interrupt program */
163 "b %x\r", /* set a breakpoint */
164 "b -%x\r", /* clear a breakpoint */
165 "b -\r", /* clear all breakpoints */
166 "f %x @%x %x\r", /* fill (start len val) */
167 {
168 "m %x %x\r", /* setmem.cmdb (addr, value) */
169 "m %x %x;w\r", /* setmem.cmdw (addr, value) */
170 "m %x %x;l\r", /* setmem.cmdl (addr, value) */
171 NULL, /* setmem.cmdll (addr, value) */
172 NULL, /* setreg.resp_delim */
173 NULL, /* setreg.term */
174 NULL, /* setreg.term_cmd */
175 },
176 {
283dc598
SG
177 "m %x\r", /* getmem.cmdb (addr, len) */
178 "m %x;w\r", /* getmem.cmdw (addr, len) */
179 "m %x;l\r", /* getmem.cmdl (addr, len) */
1480482a 180 NULL, /* getmem.cmdll (addr, len) */
283dc598
SG
181 "^ [0-9A-F]+ ", /* getmem.resp_delim */
182 "? ", /* getmem.term */
183 ".\r", /* getmem.term_cmd */
1480482a
SG
184 },
185 {
186 ".%s %x\r", /* setreg.cmd (name, value) */
187 NULL, /* setreg.resp_delim */
188 NULL, /* setreg.term */
189 NULL /* setreg.term_cmd */
190 },
191 {
192 ".%s\r", /* getreg.cmd (name) */
193 "=", /* getreg.resp_delim */
194 "? ", /* getreg.term */
195 ".\r" /* getreg.term_cmd */
196 },
197 "r\r", /* dump_registers */
198 /* register_pattern */
199 "\\(\\w+\\)=\\([0-9a-fA-F]+\\( +[0-9a-fA-F]+\\b\\)*\\)",
200 sh3_supply_register, /* supply_register */
5c8ba017
SG
201 sh3_load, /* load_routine */
202 NULL, /* download command */
1480482a
SG
203 NULL, /* Load response */
204 "\n:", /* monitor command prompt */
205 "\r", /* end-of-line terminator */
206 ".\r", /* optional command terminator */
207 &sh3_ops, /* target operations */
208 SERIAL_1_STOPBITS, /* number of stop bits */
209 sh3_regnames, /* registers names */
210 MONITOR_OPS_MAGIC /* magic */
211};
212
213static void
214sh3_open (args, from_tty)
215 char *args;
216 int from_tty;
217{
c84e5000
SC
218 char *serial_port_name = args;
219 char *parallel_port_name = 0;
220 if (args)
221 {
222 char *cursor = serial_port_name = strsave (args);
223
224 while (*cursor && *cursor != ' ')
225 cursor++;
226
227 if (*cursor)
228 *cursor++ = 0;
229
230 while (*cursor == ' ')
231 cursor++;
232
233 if (*cursor)
234 parallel_port_name = cursor;
235 }
236
237 monitor_open (serial_port_name, &sh3_cmds, from_tty);
238
239 if (parallel_port_name)
240 {
241 parallel = SERIAL_OPEN (parallel_port_name);
242 if (!parallel)
243 {
244 perror_with_name ("Unable to open parallel port.");
245 }
246 parallel_in_use = 1;
247 }
248}
249
250
251static void
252sh3_close (quitting)
253 int quitting;
254{
255 monitor_close (quitting);
256 if (parallel_in_use) {
257 SERIAL_CLOSE (parallel);
258 parallel_in_use = 0;
259 }
1480482a
SG
260}
261
262void
263_initialize_sh3 ()
264{
265 init_monitor_ops (&sh3_ops);
266
267 sh3_ops.to_shortname = "sh3";
268 sh3_ops.to_longname = "Hitachi SH-3 rom monitor";
c84e5000
SC
269
270 sh3_ops.to_doc =
271#ifdef _WINDOWS
272 /* On windows we can talk through the parallel port too. */
273 "Debug on a Hitachi eval board running the SH-3 rom monitor.\n"
274 "Specify the serial device it is connected to (e.g. com2).\n"
275 "If you want to use the parallel port to download to it, specify that\n"
276 "as the second argument. (e.g. lpt1)";
277#else
278 "Debug on a Hitachi eval board running the SH-3 rom monitor.\n\
1480482a 279Specify the serial device it is connected to (e.g. /dev/ttya).";
c84e5000
SC
280#endif
281
1480482a 282 sh3_ops.to_open = sh3_open;
c84e5000 283 sh3_ops.to_close = sh3_close;
1480482a
SG
284
285 add_target (&sh3_ops);
286}
This page took 0.060857 seconds and 4 git commands to generate.