* monitor.c: Move all xmodem stuff into xmodem.[ch]. Remove
[deliverable/binutils-gdb.git] / gdb / rom68k-rom.c
1 /* Remote target glue for the ROM68K ROM monitor.
2 Copyright 1988, 1991, 1992, 1993, 1994, 1995 Free Software Foundation, Inc.
3
4 This file is part of GDB.
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., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "defs.h"
21 #include "gdbcore.h"
22 #include "target.h"
23 #include "monitor.h"
24 #include "serial.h"
25
26 static void rom68k_open PARAMS ((char *args, int from_tty));
27
28 static void
29 rom68k_supply_register (regname, regnamelen, val, vallen)
30 char *regname;
31 int regnamelen;
32 char *val;
33 int vallen;
34 {
35 int numregs;
36 int regno;
37
38 numregs = 1;
39 regno = -1;
40
41 if (regnamelen == 2)
42 switch (regname[0])
43 {
44 case 'S':
45 if (regname[1] == 'R')
46 regno = PS_REGNUM;
47 break;
48 case 'P':
49 if (regname[1] == 'C')
50 regno = PC_REGNUM;
51 break;
52 case 'D':
53 if (regname[1] != 'R')
54 break;
55 regno = D0_REGNUM;
56 numregs = 8;
57 break;
58 case 'A':
59 if (regname[1] != 'R')
60 break;
61 regno = A0_REGNUM;
62 numregs = 7;
63 break;
64 }
65 else if (regnamelen == 3)
66 switch (regname[0])
67 {
68 case 'I':
69 if (regname[1] == 'S' && regname[2] == 'P')
70 regno = SP_REGNUM;
71 }
72
73 if (regno >= 0)
74 while (numregs-- > 0)
75 val = monitor_supply_register (regno++, val);
76 }
77
78 /* This array of registers need to match the indexes used by GDB.
79 This exists because the various ROM monitors use different strings
80 than does GDB, and don't necessarily support all the registers
81 either. So, typing "info reg sp" becomes a "r30". */
82
83 static char *rom68k_regnames[NUM_REGS] = {
84 "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
85 "A0", "A1", "A2", "A3", "A4", "A5", "A6", "ISP",
86 "SR", "PC" };
87
88 /* Define the monitor command strings. Since these are passed directly
89 through to a printf style function, we may include formatting
90 strings. We also need a CR or LF on the end. */
91
92 static struct target_ops rom68k_ops;
93
94 static char *rom68k_loadtypes[] = {"srec", NULL};
95 static char *rom68k_loadprotos[] = {"none", NULL};
96
97 static char *rom68k_inits[] = {".\r\r", NULL}; /* Exits pm/pr & download cmds */
98
99 static struct monitor_ops rom68k_cmds =
100 {
101 0, /* flags */
102 rom68k_inits, /* monitor init string */
103 "go\r", /* continue command */
104 "st\r", /* single step */
105 NULL, /* No way to interrupt program */
106 "db %x\r", /* set a breakpoint */
107 "cb %x\r", /* clear a breakpoint */
108 "cb *\r", /* clear all breakpoints */
109 "fm %x %x %x\r", /* fill (start len val) */
110 {
111 "pm %x %x\r", /* setmem.cmdb (addr, value) */
112 "pm.w %x %x\r", /* setmem.cmdw (addr, value) */
113 "pm.l %x %x\r", /* setmem.cmdl (addr, value) */
114 NULL, /* setmem.cmdll (addr, value) */
115 NULL, /* setreg.resp_delim */
116 NULL, /* setreg.term */
117 NULL, /* setreg.term_cmd */
118 },
119 {
120 "dm %x %x\r", /* getmem.cmdb (addr, len) */
121 "dm.w %x %x\r", /* getmem.cmdw (addr, len) */
122 "dm.l %x %x\r", /* getmem.cmdl (addr, len) */
123 NULL, /* getmem.cmdll (addr, len) */
124 " ", /* getmem.resp_delim */
125 NULL, /* getmem.term */
126 NULL, /* getmem.term_cmd */
127 },
128 {
129 "pr %s %x\r", /* setreg.cmd (name, value) */
130 NULL, /* setreg.resp_delim */
131 NULL, /* setreg.term */
132 NULL /* setreg.term_cmd */
133 },
134 {
135 "pr %s\r", /* getreg.cmd (name) */
136 ": ", /* getreg.resp_delim */
137 "= ", /* getreg.term */
138 ".\r" /* getreg.term_cmd */
139 },
140 "dr\r", /* dump_registers */
141 /* register_pattern */
142 "\\(\\w+\\)=\\([0-9a-fA-F]+\\( +[0-9a-fA-F]+\\b\\)*\\)",
143 rom68k_supply_register, /* supply_register */
144 NULL, /* load_routine (defaults to SRECs) */
145 "dc\r", /* download command */
146 "Waiting for S-records from host... ", /* Load response */
147 "ROM68K :->", /* monitor command prompt */
148 "=", /* end-of-command delimitor */
149 ".\r", /* optional command terminator */
150 &rom68k_ops, /* target operations */
151 rom68k_loadtypes, /* loadtypes */
152 rom68k_loadprotos, /* loadprotos */
153 "9600", /* supported baud rates */
154 SERIAL_1_STOPBITS, /* number of stop bits */
155 rom68k_regnames, /* registers names */
156 MONITOR_OPS_MAGIC /* magic */
157 };
158
159 static void
160 rom68k_open (args, from_tty)
161 char *args;
162 int from_tty;
163 {
164 monitor_open (args, &rom68k_cmds, from_tty);
165 }
166
167 void
168 _initialize_rom68k ()
169 {
170 init_monitor_ops (&rom68k_ops);
171
172 rom68k_ops.to_shortname = "rom68k";
173 rom68k_ops.to_longname = "Rom68k debug monitor for the IDP Eval board";
174 rom68k_ops.to_doc = "Debug on a Motorola IDP eval board running the ROM68K monitor.\n\
175 Specify the serial device it is connected to (e.g. /dev/ttya).";
176 rom68k_ops.to_open = rom68k_open;
177
178 add_target (&rom68k_ops);
179
180 /* This is the default, since it's the only baud rate supported by
181 the hardware. */
182 baud_rate = 9600;
183 }
This page took 0.034485 seconds and 5 git commands to generate.