]> Git Repo - binutils.git/blob - gdb/rom68k-rom.c
* remote.texi: Update list of stubs in the GDB distribution.
[binutils.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., 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"
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_inits[] = {".\r\r", NULL}; /* Exits pm/pr & download cmds */
95
96 static struct monitor_ops rom68k_cmds =
97 {
98   0,                            /* flags */
99   rom68k_inits,                 /* monitor init string */
100   "go\r",                       /* continue command */
101   "st\r",                       /* single step */
102   NULL,                         /* No way to interrupt program */
103   "db %x\r",                    /* set a breakpoint */
104   "cb %x\r",                    /* clear a breakpoint */
105   "cb *\r",                     /* clear all breakpoints */
106   "fm %x %x %x\r",              /* fill (start len val) */
107   {
108     "pm %x %x\r",               /* setmem.cmdb (addr, value) */
109     "pm.w %x %x\r",             /* setmem.cmdw (addr, value) */
110     "pm.l %x %x\r",             /* setmem.cmdl (addr, value) */
111     NULL,                       /* setmem.cmdll (addr, value) */
112     NULL,                       /* setreg.resp_delim */
113     NULL,                       /* setreg.term */
114     NULL,                       /* setreg.term_cmd */
115   },
116   {
117     "dm %x %x\r",               /* getmem.cmdb (addr, len) */
118     "dm.w %x %x\r",             /* getmem.cmdw (addr, len) */
119     "dm.l %x %x\r",             /* getmem.cmdl (addr, len) */
120     NULL,                       /* getmem.cmdll (addr, len) */
121     "  ",                       /* getmem.resp_delim */
122     NULL,                       /* getmem.term */
123     NULL,                       /* getmem.term_cmd */
124   },
125   {
126     "pr %s %x\r",               /* setreg.cmd (name, value) */
127     NULL,                       /* setreg.resp_delim */
128     NULL,                       /* setreg.term */
129     NULL                        /* setreg.term_cmd */
130   },
131   {
132     "pr %s\r",                  /* getreg.cmd (name) */
133     ":  ",                      /* getreg.resp_delim */
134     "= ",                       /* getreg.term */
135     ".\r"                       /* getreg.term_cmd */
136   },
137   "dr\r",                       /* dump_registers */
138                                 /* register_pattern */
139   "\\(\\w+\\)=\\([0-9a-fA-F]+\\( +[0-9a-fA-F]+\\b\\)*\\)",
140   rom68k_supply_register,       /* supply_register */
141   NULL,                         /* load_routine (defaults to SRECs) */
142   "dc\r",                       /* download command */
143   "Waiting for S-records from host... ", /* Load response */
144   "ROM68K :-> ",                /* monitor command prompt */
145   "\r",                         /* end-of-line terminator */
146   ".\r",                        /* optional command terminator */
147   &rom68k_ops,                  /* target operations */
148   SERIAL_1_STOPBITS,            /* number of stop bits */
149   rom68k_regnames,              /* registers names */
150   MONITOR_OPS_MAGIC             /* magic */
151 };
152
153 static void
154 rom68k_open (args, from_tty)
155      char *args;
156      int from_tty;
157 {
158   monitor_open (args, &rom68k_cmds, from_tty);
159 }
160
161 void
162 _initialize_rom68k ()
163 {
164   init_monitor_ops (&rom68k_ops);
165
166   rom68k_ops.to_shortname = "rom68k";
167   rom68k_ops.to_longname = "Rom68k debug monitor for the IDP Eval board";
168   rom68k_ops.to_doc = "Debug on a Motorola IDP eval board running the ROM68K monitor.\n\
169 Specify the serial device it is connected to (e.g. /dev/ttya).";
170   rom68k_ops.to_open = rom68k_open;
171
172   add_target (&rom68k_ops);
173 }
This page took 0.035728 seconds and 4 git commands to generate.