#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "monitor.h"
#include "gdb_string.h"
#include "regcache.h"
#include "serial.h"
static void init_picobug_cmds (void);
void _initialize_picobug_rom (void);
void picobug_open (char *args, int from_tty);
int picobug_dumpregs (void);
static char *picobug_inits[] =
{"\r", NULL};
static struct target_ops picobug_ops;
static struct monitor_ops picobug_cmds;
static char *picobug_regnames[] = {
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
"psr", "vbr", "epsr", "fpsr", "epc", "fpc", 0, "ss1",
"ss2", "ss3", "ss4", 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
"pc" };
void
picobug_open (char *args, int from_tty)
{
monitor_open (args, &picobug_cmds, from_tty);
}
int
picobug_dumpregs (void)
{
char buf[1024];
int resp_len;
char *p;
monitor_printf (picobug_cmds.dump_registers);
resp_len = monitor_expect_prompt (buf, sizeof (buf));
p = strtok (buf, " \t\r\n");
while (p)
{
if (strchr (p, '-'))
{
if (STREQN (p, "r0", 2) || STREQN (p, "r8", 2))
{
int rn = (p[1] == '0' ? 0 : 8);
int i = 0;
while (i < 8)
{
p = strtok (NULL, " \t\r\n");
if (p)
monitor_supply_register (rn + i, p);
i++;
}
}
else if (STREQN (p, "ss", 2))
{
int rn;
p = strtok (NULL, " \t\r\n");
for (rn = 39; rn < 43; rn++)
{
p = strtok (NULL, " \t\r\n");
if (p)
monitor_supply_register (rn, p);
}
}
else
{
break;
}
}
else
{
char *name = p;
int i;
p = strtok (NULL, " \t\r\n");
if (p)
{
for (i = 0; i < NUM_REGS; i++)
{
if (picobug_regnames[i] && STREQ (picobug_regnames[i], name))
break;
}
if (i <= NUM_REGS)
monitor_supply_register (i, p);
}
}
p = strtok (NULL, " \t\r\n");
}
return 0;
}
static void
init_picobug_cmds (void)
{
picobug_cmds.flags = MO_GETMEM_NEEDS_RANGE | MO_CLR_BREAK_USES_ADDR | MO_PRINT_PROGRAM_OUTPUT;
picobug_cmds.init = picobug_inits;
picobug_cmds.cont = "g\n";
picobug_cmds.step = "s\n";
picobug_cmds.set_break = "br %x\n";
picobug_cmds.clr_break = "nobr %x\n";
picobug_cmds.clr_all_break = "nobr\n";
picobug_cmds.setmem.cmdb = "mm %x %x ;b\n";
picobug_cmds.setmem.cmdw = "mm %x %x ;h\n";
picobug_cmds.setmem.cmdl = "mm %x %x ;w\n";
picobug_cmds.getmem.cmdb = "md %x %x\n";
picobug_cmds.getmem.resp_delim = ":";
picobug_cmds.setreg.cmd = "rm %s %x\n";
picobug_cmds.getreg.cmd = "rd %s\n";
picobug_cmds.getreg.resp_delim = ":";
picobug_cmds.dump_registers = "rd\n";
picobug_cmds.dumpregs = picobug_dumpregs;
picobug_cmds.load = "lo\n";
picobug_cmds.prompt = "picobug> ";
picobug_cmds.line_term = "\n";
picobug_cmds.target = &picobug_ops;
picobug_cmds.stopbits = SERIAL_1_STOPBITS;
picobug_cmds.regnames = picobug_regnames;
picobug_cmds.num_breakpoints = 20;
picobug_cmds.magic = MONITOR_OPS_MAGIC;
}
void
_initialize_picobug_rom (void)
{
int i;
init_picobug_cmds ();
init_monitor_ops (&picobug_ops);
picobug_ops.to_shortname = "picobug";
picobug_ops.to_longname = "picobug monitor";
picobug_ops.to_doc = "Debug via the picobug monitor.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
picobug_ops.to_open = picobug_open;
add_target (&picobug_ops);
}