/* Remote debugging interface for ABug Rom monitor for GDB, the GNU debugger.
   Copyright 1995, 1996, 1998 Free Software Foundation, Inc.

   Written by Rob Savoye of Cygnus Support

This file is part of GDB.

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "monitor.h"
#include "serial.h"

/* Prototypes for local functions. */

static void abug_open PARAMS ((char *args, int from_tty));

static void
abug_supply_register (regname, regnamelen, val, vallen)
     char *regname;
     int regnamelen;
     char *val;
     int vallen;
{
  int regno;

  if (regnamelen != 2)
    return;

  switch (regname[0])
    {
    case 'S':
      if (regname[1] != 'R')
	return;
      regno = PS_REGNUM;
      break;
    case 'P':
      if (regname[1] != 'C')
	return;
      regno = PC_REGNUM;
      break;
    case 'D':
      if (regname[1] < '0' || regname[1] > '7')
	return;
      regno = regname[1] - '0' + D0_REGNUM;
      break;
    case 'A':
      if (regname[1] < '0' || regname[1] > '7')
	return;
      regno = regname[1] - '0' + A0_REGNUM;
      break;
    default:
      return;
    }

  monitor_supply_register (regno, val);
}

/*
 * This array of registers needs to match the indexes used by GDB. The
 * whole reason this exists is because the various ROM monitors use
 * different names than GDB does, and don't support all the
 * registers either. So, typing "info reg sp" becomes an "A7".
 */

static char *abug_regnames[NUM_REGS] =
{
  "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7",
  "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7",
  "PC",
};

/*
 * Define the monitor command strings. Since these are passed directly
 * through to a printf style function, we need can include formatting
 * strings. We also need a CR or LF on the end.
 */

static struct target_ops abug_ops;

static char *abug_inits[] = {"\r", NULL};

static struct monitor_ops abug_cmds ;

static void 
init_abug_cmds(void)
{
  abug_cmds.flags =   MO_CLR_BREAK_USES_ADDR;
  abug_cmds.init =   abug_inits;			/* Init strings */
  abug_cmds.cont =   "g\r";			/* continue command */
  abug_cmds.step =   "t\r";			/* single step */
  abug_cmds.stop =   NULL;				/* interrupt command */
  abug_cmds.set_break =   "br %x\r";			/* set a breakpoint */
  abug_cmds.clr_break =   "nobr %x\r";			/* clear a breakpoint */
  abug_cmds.clr_all_break =   "nobr\r";			/* clear all breakpoints */
  abug_cmds.fill =   "bf %x:%x %x;b\r";		/* fill (start count val) */
  abug_cmds.setmem.cmdb =     "ms %x %02x\r";		/* setmem.cmdb (addr, value) */
  abug_cmds.setmem.cmdw =     "ms %x %04x\r";		/* setmem.cmdw (addr, value) */
  abug_cmds.setmem.cmdl =     "ms %x %08x\r";		/* setmem.cmdl (addr, value) */
  abug_cmds.setmem.cmdll =     NULL;			/* setmem.cmdll (addr, value) */
  abug_cmds.setmem.resp_delim =     NULL;			/* setreg.resp_delim */
  abug_cmds.setmem.term =     NULL;			/* setreg.term */
  abug_cmds.setmem.term_cmd =     NULL;			/* setreg.term_cmd */
  abug_cmds.getmem.cmdb =     "md %x:%x;b\r";		/* getmem.cmdb (addr, len) */
  abug_cmds.getmem.cmdw =     "md %x:%x;b\r";		/* getmem.cmdw (addr, len) */
  abug_cmds.getmem.cmdl =     "md %x:%x;b\r";		/* getmem.cmdl (addr, len) */
  abug_cmds.getmem.cmdll =     NULL;			/* getmem.cmdll (addr, len) */
  abug_cmds.getmem.resp_delim =     " ";			/* getmem.resp_delim */
  abug_cmds.getmem.term =     NULL;			/* getmem.term */
  abug_cmds.getmem.term_cmd =     NULL;			/* getmem.term_cmd */
  abug_cmds.setreg.cmd =     "rm %s %x\r";		/* setreg.cmd (name, value) */
  abug_cmds.setreg.resp_delim =     "=";			/* setreg.resp_delim */
  abug_cmds.setreg.term =     "? ";			/* setreg.term */
  abug_cmds.setreg.term_cmd =     ".\r"	;		/* setreg.term_cmd */
  abug_cmds.getreg.cmd =     "rm %s\r";			/* getreg.cmd (name) */
  abug_cmds.getreg.resp_delim =     "=";			/* getreg.resp_delim */
  abug_cmds.getreg.term =     "? ";			/* getreg.term */
  abug_cmds.getreg.term_cmd =     ".\r"	;		/* getreg.term_cmd */
    abug_cmds.dump_registers =   "rd\r";			/* dump_registers */
  abug_cmds.register_pattern =   "\\(\\w+\\) +=\\([0-9a-fA-F]+\\b\\)"; /* register_pattern */
  abug_cmds.supply_register =   abug_supply_register;	/* supply_register */
  abug_cmds.load_routine =   NULL;				/* load_routine (defaults to SRECs) */
  abug_cmds.load =   "lo 0\r";			/* download command */
  abug_cmds.loadresp =   "\n";				/* load response */
  abug_cmds.prompt =   "135Bug>";			/* monitor command prompt */
  abug_cmds.line_term =   "\r";				/* end-of-line terminator */
  abug_cmds.cmd_end =   NULL;				/* optional command terminator */
  abug_cmds.target =   &abug_ops;			/* target operations */
  abug_cmds.stopbits =   SERIAL_1_STOPBITS;		/* number of stop bits */
  abug_cmds.regnames =   abug_regnames;		/* registers names */
  abug_cmds.magic =   MONITOR_OPS_MAGIC	;	/* magic */
}; 

static void
abug_open(args, from_tty)
     char *args;
     int from_tty;
{
  monitor_open (args, &abug_cmds, from_tty);
}

void
_initialize_abug_rom ()
{
  init_abug_cmds() ;
  init_monitor_ops (&abug_ops);

  abug_ops.to_shortname = "abug";
  abug_ops.to_longname = "ABug monitor";
  abug_ops.to_doc = "Debug via the ABug monitor.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).";
  abug_ops.to_open = abug_open;

  add_target (&abug_ops);
}
