/* Remote debugging interface for boot monitors, for GDB.
   Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc.

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.  */

/* This file was derived from remote-eb.c, which did a similar job, but for
   an AMD-29K running EBMON.  That file was in turn derived from remote.c
   as mentioned in the following comment (left in for comic relief):

  "This is like remote.c but is for a different situation--
   having a PC running os9000 hook up with a unix machine with
   a serial line, and running ctty com2 on the PC. os9000 has a debug
   monitor called ROMBUG running.  Not to mention that the PC
   has PC/NFS, so it can access the same executables that gdb can,
   over the net in real time."

   In reality, this module talks to a debug monitor called 'ROMBUG', which
   We communicate with ROMBUG via a direct serial line, the network version
   of ROMBUG is not available yet.
*/

/* FIXME This file needs to be rewritten if it's to work again, either
   to self-contained or to use the new monitor interface.  */

#include "defs.h"
#include "gdbcore.h"
#include "target.h"
#include "wait.h"
#ifdef ANSI_PROTOTYPES
#include <stdarg.h>
#else
#include <varargs.h>
#endif
#include <signal.h>
#include "gdb_string.h"
#include <sys/types.h>
#include "command.h"
#include "serial.h"
#include "monitor.h"
#include "remote-utils.h"
#include "symtab.h"
#include "symfile.h"
#include "objfiles.h"
#include "gdb-stabs.h"

struct cmd_list_element *showlist;
extern struct target_ops rombug_ops;		/* Forward declaration */
extern struct monitor_ops rombug_cmds;		/* Forward declaration */
extern struct cmd_list_element *setlist;
extern struct cmd_list_element *unsetlist;
extern int attach_flag;

static void rombug_close();
static void rombug_fetch_register();
static void rombug_fetch_registers();
static void rombug_store_register();
#if 0
static int sr_get_debug();			/* flag set by "set remotedebug" */
#endif
static int hashmark;				/* flag set by "set hash" */
static int rombug_is_open = 0;

/* FIXME: Replace with sr_get_debug ().  */
#define LOG_FILE "monitor.log"
FILE *log_file;
static int monitor_log = 0;
static int tty_xon = 0;
static int tty_xoff = 0;

static int timeout = 10;
static int is_trace_mode = 0;
/* Descriptor for I/O to remote machine.  Initialize it to NULL*/
static serial_t monitor_desc = NULL;

static CORE_ADDR bufaddr = 0;
static int buflen = 0;
static char readbuf[16];

/* Send data to monitor.  Works just like printf. */
static void
#ifdef ANSI_PROTOTYPES
printf_monitor(char *pattern, ...)
#else
printf_monitor(va_alist)
     va_dcl
#endif
{
  va_list args;
  char buf[200];
  int i;

#ifdef ANSI_PROTOTYPES
  va_start (args, pattern);
#else
  char *pattern;
  va_start(args);
  pattern = va_arg(args, char *);
#endif

  vsprintf(buf, pattern, args);
  va_end(args);

  if (SERIAL_WRITE(monitor_desc, buf, strlen(buf)))
    fprintf(stderr, "SERIAL_WRITE failed: %s\n", safe_strerror(errno));
}

/* Read a character from the remote system, doing all the fancy timeout stuff*/
static int
readchar(timeout)
     int timeout;
{
  int c;

  c = SERIAL_READCHAR(monitor_desc, timeout);

  if (sr_get_debug())
    putchar(c & 0x7f);

  if (monitor_log && isascii(c))
    putc(c & 0x7f, log_file);

  if (c >= 0)
    return c & 0x7f;

  if (c == SERIAL_TIMEOUT)
    {
      if (timeout == 0)
	return c;		/* Polls shouldn't generate timeout errors */

      error("Timeout reading from remote system.");
    }

  perror_with_name("remote-monitor");
}

/* Scan input from the remote system, until STRING is found.  If DISCARD is
   non-zero, then discard non-matching input, else print it out.
   Let the user break out immediately.  */
static void
expect(string, discard)
     char *string;
     int discard;
{
  char *p = string;
  int c;

  if (sr_get_debug())
    printf ("Expecting \"%s\"\n", string);

  immediate_quit = 1;
  while (1)
    {
      c = readchar(timeout);
      if (!isascii (c))
	continue;
      if (c == *p++)
	{
	  if (*p == '\0')
	    {
	      immediate_quit = 0;
	      if (sr_get_debug())
		printf ("\nMatched\n");
	      return;
	    }
	}
      else
	{
	  if (!discard)
	    {
	      fwrite(string, 1, (p - 1) - string, stdout);
	      putchar((char)c);
	      fflush(stdout);
	    }
	  p = string;
	}
    }
}

/* Keep discarding input until we see the ROMBUG prompt.

   The convention for dealing with the prompt is that you
   o give your command
   o *then* wait for the prompt.

   Thus the last thing that a procedure does with the serial line
   will be an expect_prompt().  Exception:  rombug_resume does not
   wait for the prompt, because the terminal is being handed over
   to the inferior.  However, the next thing which happens after that
   is a rombug_wait which does wait for the prompt.
   Note that this includes abnormal exit, e.g. error().  This is
   necessary to prevent getting into states from which we can't
   recover.  */
static void
expect_prompt(discard)
     int discard;
{
  if (monitor_log)
  /* This is a convenient place to do this.  The idea is to do it often
     enough that we never lose much data if we terminate abnormally.  */
    fflush(log_file);

  if (is_trace_mode) {
    expect("trace", discard);
  } else {
    expect (PROMPT, discard);
  }
}

/* Get a hex digit from the remote system & return its value.
   If ignore_space is nonzero, ignore spaces (not newline, tab, etc).  */
static int
get_hex_digit(ignore_space)
     int ignore_space;
{
  int ch;
  while (1)
    {
      ch = readchar(timeout);
      if (ch >= '0' && ch <= '9')
	return ch - '0';
      else if (ch >= 'A' && ch <= 'F')
	return ch - 'A' + 10;
      else if (ch >= 'a' && ch <= 'f')
	return ch - 'a' + 10;
      else if (ch == ' ' && ignore_space)
	;
      else
	{
	  expect_prompt(1);
	  error("Invalid hex digit from remote system.");
	}
    }
}

/* Get a byte from monitor and put it in *BYT.  Accept any number
   leading spaces.  */
static void
get_hex_byte (byt)
     char *byt;
{
  int val;

  val = get_hex_digit (1) << 4;
  val |= get_hex_digit (0);
  *byt = val;
}

/* Get N 32-bit words from remote, each preceded by a space,
   and put them in registers starting at REGNO.  */
static void
get_hex_regs (n, regno)
     int n;
     int regno;
{
  long val;
  int i;
  unsigned char b;

  for (i = 0; i < n; i++)
    {
      int j;
      
      val = 0;
      for (j = 0; j < 4; j++)
	{
	  get_hex_byte (&b);
	  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
	    val = (val << 8) + b;
	  else
	    val = val + (b << (j*8));
	}
      supply_register (regno++, (char *) &val);
    }
}

/* This is called not only when we first attach, but also when the
   user types "run" after having attached.  */
static void
rombug_create_inferior (execfile, args, env)
     char *execfile;
     char *args;
     char **env;
{
  int entry_pt;

  if (args && *args)
    error("Can't pass arguments to remote ROMBUG process");

  if (execfile == 0 || exec_bfd == 0)
    error("No executable file specified");

  entry_pt = (int) bfd_get_start_address (exec_bfd);

  if (monitor_log)
    fputs ("\nIn Create_inferior()", log_file);


/* The "process" (board) is already stopped awaiting our commands, and
   the program is already downloaded.  We just set its PC and go.  */

  init_wait_for_inferior ();
  proceed ((CORE_ADDR)entry_pt, TARGET_SIGNAL_DEFAULT, 0);
}

/* Open a connection to a remote debugger.
   NAME is the filename used for communication.  */

static char dev_name[100];

static void
rombug_open(args, from_tty)
     char *args;
     int from_tty;
{
  if (args == NULL)
    error ("Use `target RomBug DEVICE-NAME' to use a serial port, or \n\
`target RomBug HOST-NAME:PORT-NUMBER' to use a network connection.");

  target_preopen(from_tty);

  if (rombug_is_open)
    unpush_target(&rombug_ops);

  strcpy(dev_name, args);
  monitor_desc = SERIAL_OPEN(dev_name);
  if (monitor_desc == NULL)
    perror_with_name(dev_name);

  /* if baud rate is set by 'set remotebaud' */
  if (SERIAL_SETBAUDRATE (monitor_desc, sr_get_baud_rate()))
    {
      SERIAL_CLOSE (monitor_desc);
      perror_with_name ("RomBug");
    }
  SERIAL_RAW(monitor_desc);
  if (tty_xon || tty_xoff)
    {
    struct hardware_ttystate { struct termios t;} *tty_s;

      tty_s =(struct hardware_ttystate  *)SERIAL_GET_TTY_STATE(monitor_desc);
      if (tty_xon) tty_s->t.c_iflag |= IXON; 
      if (tty_xoff) tty_s->t.c_iflag |= IXOFF;
      SERIAL_SET_TTY_STATE(monitor_desc, (serial_ttystate) tty_s);
    }

  rombug_is_open = 1;

  log_file = fopen (LOG_FILE, "w");
  if (log_file == NULL)
    perror_with_name (LOG_FILE);

  push_monitor (&rombug_cmds);
  printf_monitor("\r");	/* CR wakes up monitor */
  expect_prompt(1);
  push_target (&rombug_ops);
  attach_flag = 1;

  if (from_tty)
    printf("Remote %s connected to %s\n", target_shortname,
	   dev_name);

  rombug_fetch_registers();

  printf_monitor ("ov e \r");
  expect_prompt(1);
  bufaddr = 0;
  buflen = 0;
}

/*
 * Close out all files and local state before this target loses control.
 */

static void
rombug_close (quitting)
     int quitting;
{
  if (rombug_is_open) {
    SERIAL_CLOSE(monitor_desc);
    monitor_desc = NULL;
    rombug_is_open = 0;
  }

  if (log_file) {
    if (ferror(log_file))
      fprintf(stderr, "Error writing log file.\n");
    if (fclose(log_file) != 0)
      fprintf(stderr, "Error closing log file.\n");
    log_file = 0;
  }
}

int
rombug_link(mod_name, text_reloc)
     char *mod_name;
     CORE_ADDR *text_reloc;
{
  int i, j;
  unsigned long val;
  unsigned char b;

  printf_monitor("l %s \r", mod_name); 
  expect_prompt(1);
  printf_monitor(".r \r");
  expect(REG_DELIM, 1);
  for (i=0; i <= 7; i++)
    {
      val = 0;
      for (j = 0; j < 4; j++)
        {
          get_hex_byte(&b);
          val = (val << 8) + b;
	}
    }
  expect_prompt(1);
  *text_reloc = val;
  return 1;
}

/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else
   with your gdb.  */
static void
rombug_detach (from_tty)
     int from_tty;
{
  if (attach_flag) {
    printf_monitor (GO_CMD);
    attach_flag = 0;
  }
  pop_target();		/* calls rombug_close to do the real work */
  if (from_tty)
    printf ("Ending remote %s debugging\n", target_shortname);
}
 
/*
 * Tell the remote machine to resume.
 */
static void
rombug_resume (pid, step, sig)
     int pid, step;
     enum target_signal sig;
{
  if (monitor_log)
    fprintf (log_file, "\nIn Resume (step=%d, sig=%d)\n", step, sig);

  if (step)
    {
      is_trace_mode = 1;
      printf_monitor (STEP_CMD);
      /* wait for the echo.  **
      expect (STEP_CMD, 1);
      */
    }
  else
    {
      printf_monitor (GO_CMD);
      /* swallow the echo.  **
      expect (GO_CMD, 1);
      */
    }
  bufaddr = 0;
  buflen= 0;
}

/*
 * Wait until the remote machine stops, then return,
 * storing status in status just as `wait' would.
 */

static int
rombug_wait (pid, status)
     int pid;
     struct target_waitstatus *status;
{
  int old_timeout = timeout;
  struct section_offsets *offs;
  CORE_ADDR addr, pc;
  struct obj_section *obj_sec;

  if (monitor_log)
    fputs ("\nIn wait ()", log_file);

  status->kind = TARGET_WAITKIND_EXITED;
  status->value.integer = 0;

  timeout = -1;		/* Don't time out -- user program is running. */
  expect ("eax:", 0);   /* output any message before register display */
  expect_prompt(1);     /* Wait for prompt, outputting extraneous text */

  status->kind = TARGET_WAITKIND_STOPPED;
  status->value.sig = TARGET_SIGNAL_TRAP;
  timeout = old_timeout;
  rombug_fetch_registers();
  bufaddr = 0;
  buflen = 0;
  pc = read_register(PC_REGNUM);
  addr = read_register(DATABASE_REG);
  obj_sec = find_pc_section (pc);
  if (obj_sec != NULL)
    {
      if (obj_sec->objfile != symfile_objfile)
        new_symfile_objfile(obj_sec->objfile, 1, 0);
      offs = ((struct section_offsets *)
	 alloca (sizeof (struct section_offsets)
	 + (symfile_objfile->num_sections * sizeof (offs->offsets))));
      memcpy (offs, symfile_objfile->section_offsets,
         (sizeof (struct section_offsets) + 
	 (symfile_objfile->num_sections * sizeof (offs->offsets))));
      ANOFFSET (offs, SECT_OFF_DATA) = addr;
      ANOFFSET (offs, SECT_OFF_BSS) = addr;

      objfile_relocate(symfile_objfile, offs);
    }

  return 0;
}

/* Return the name of register number regno in the form input and output by
   monitor.  Currently, register_names just happens to contain exactly what
   monitor wants.  Lets take advantage of that just as long as possible! */

static char *
get_reg_name (regno)
     int regno;
{
  static char buf[50];
  char *p;
  char *b;

  b = buf;

  if (regno < 0)
    return ("");
/*
  for (p = REGISTER_NAME (regno); *p; p++)
    *b++ = toupper(*p);
  *b = '\000';
*/
  p = (char *)REGISTER_NAME (regno);
  return p;
/*
  return buf;
*/
}

/* read the remote registers into the block regs.  */

static void
rombug_fetch_registers ()
{
  int regno, j, i;
  long val;
  unsigned char b;

  printf_monitor (GET_REG);
  expect("eax:", 1);
  expect("\n", 1);
  get_hex_regs(1, 0);
  get_hex_regs(1, 3);
  get_hex_regs(1, 1);
  get_hex_regs(1, 2);
  get_hex_regs(1, 6);
  get_hex_regs(1, 7);
  get_hex_regs(1, 5);
  get_hex_regs(1, 4);
  for (regno = 8; regno <= 15; regno++)
    {
      expect(REG_DELIM, 1);
      if (regno >= 8 && regno <= 13)
	{
	  val = 0;
	  for (j = 0; j < 2; j++)
            {
              get_hex_byte (&b);
	      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
		val = (val << 8) + b;
	      else
		val = val + (b << (j*8));
            }

	  if (regno == 8) i = 10;
	  if (regno >=  9 && regno <= 12) i = regno + 3;
	  if (regno == 13) i = 11;
	  supply_register (i, (char *) &val);
	}
      else if (regno == 14)
	{
	  get_hex_regs(1, PC_REGNUM);
	}
      else if (regno == 15)
	{
	  get_hex_regs(1, 9);
	}
      else
	{
	  val = 0;
	  supply_register(regno, (char *) &val);
	}
    }
  is_trace_mode = 0;
  expect_prompt (1);
}

/* Fetch register REGNO, or all registers if REGNO is -1.
   Returns errno value.  */
static void
rombug_fetch_register (regno)
     int regno;
{
  int val, j;
  unsigned char b;

  if (monitor_log) {
    fprintf (log_file, "\nIn Fetch Register (reg=%s)\n", get_reg_name (regno));
    fflush (log_file);
  }

  if (regno < 0)
    {
      rombug_fetch_registers ();
    }
  else
    {
      char *name = get_reg_name (regno);
      printf_monitor (GET_REG);
      if (regno >= 10 && regno <= 15)
	{
	  expect ("\n", 1);
	  expect ("\n", 1);
          expect (name, 1);
          expect (REG_DELIM, 1);
	  val = 0;
	  for (j = 0; j < 2; j++)
            {
              get_hex_byte (&b);
	      if (TARGET_BYTE_ORDER == BIG_ENDIAN)
		val = (val << 8) + b;
	      else
		val = val + (b << (j*8));
            }
	  supply_register (regno, (char *) &val);
	}
      else if (regno == 8 || regno == 9)
	{
	  expect ("\n", 1);
	  expect ("\n", 1);
	  expect ("\n", 1);
          expect (name, 1);
          expect (REG_DELIM, 1);
	  get_hex_regs (1, regno);
	}
      else
	{
          expect (name, 1);
          expect (REG_DELIM, 1);
	  expect("\n", 1);
	  get_hex_regs(1, 0);
	  get_hex_regs(1, 3);
	  get_hex_regs(1, 1);
	  get_hex_regs(1, 2);
	  get_hex_regs(1, 6);
	  get_hex_regs(1, 7);
	  get_hex_regs(1, 5);
	  get_hex_regs(1, 4);
	}
      expect_prompt (1);
    }
  return;
}

/* Store the remote registers from the contents of the block REGS.  */

static void
rombug_store_registers ()
{
  int regno;

  for (regno = 0; regno <= PC_REGNUM; regno++)
    rombug_store_register(regno);

  registers_changed ();
}

/* Store register REGNO, or all if REGNO == 0.
   return errno value.  */
static void
rombug_store_register (regno)
     int regno;
{
char *name;

  if (monitor_log)
    fprintf (log_file, "\nIn Store_register (regno=%d)\n", regno);

  if (regno == -1)
    rombug_store_registers ();
  else
    {
      if (sr_get_debug())
	printf ("Setting register %s to 0x%x\n", get_reg_name (regno), read_register (regno));

      name = get_reg_name(regno);
      if (name == 0) return;
      printf_monitor (SET_REG, name, read_register (regno));

      is_trace_mode = 0;
      expect_prompt (1);
    }
}

/* Get ready to modify the registers array.  On machines which store
   individual registers, this doesn't need to do anything.  On machines
   which store all the registers in one fell swoop, this makes sure
   that registers contains all the registers from the program being
   debugged.  */

static void
rombug_prepare_to_store ()
{
  /* Do nothing, since we can store individual regs */
}

static void
rombug_files_info ()
{
  printf ("\tAttached to %s at %d baud.\n",
	  dev_name, sr_get_baud_rate());
}

/* Copy LEN bytes of data from debugger memory at MYADDR
   to inferior's memory at MEMADDR.  Returns length moved.  */
static int
rombug_write_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     unsigned char *myaddr;
     int len;
{
  int i;
  char buf[10];

  if (monitor_log)
    fprintf (log_file, "\nIn Write_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);

  printf_monitor (MEM_SET_CMD, memaddr);
  for (i = 0; i < len; i++)
    {
      expect (CMD_DELIM, 1);
      printf_monitor ("%x \r", myaddr[i]);
      if (sr_get_debug())
	printf ("\nSet 0x%x to 0x%x\n", memaddr + i, myaddr[i]);
    }
  expect (CMD_DELIM, 1);
  if (CMD_END)
    printf_monitor (CMD_END);
  is_trace_mode = 0;
  expect_prompt (1);

  bufaddr = 0;
  buflen = 0;
  return len;
}

/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
   at debugger address MYADDR.  Returns length moved.  */
static int
rombug_read_inferior_memory(memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i, j;

  /* Number of bytes read so far.  */
  int count;

  /* Starting address of this pass.  */
  unsigned long startaddr;

  /* Number of bytes to read in this pass.  */
  int len_this_pass;

  if (monitor_log)
    fprintf (log_file, "\nIn Read_inferior_memory (memaddr=%x, len=%d)\n", memaddr, len);

  /* Note that this code works correctly if startaddr is just less
     than UINT_MAX (well, really CORE_ADDR_MAX if there was such a
     thing).  That is, something like
     rombug_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
     works--it never adds len To memaddr and gets 0.  */
  /* However, something like
     rombug_read_bytes (CORE_ADDR_MAX - 3, foo, 4)
     doesn't need to work.  Detect it and give up if there's an attempt
     to do that.  */
  if (((memaddr - 1) + len) < memaddr) {
    errno = EIO;
    return 0;
  }
  if (bufaddr <= memaddr && (memaddr+len) <= (bufaddr+buflen))
    {
      memcpy(myaddr, &readbuf[memaddr-bufaddr], len);
      return len;
    }
  
  startaddr = memaddr;
  count = 0;
  while (count < len)
    {
      len_this_pass = 16;
      if ((startaddr % 16) != 0)
	len_this_pass -= startaddr % 16;
      if (len_this_pass > (len - count))
	len_this_pass = (len - count);
      if (sr_get_debug())
	printf ("\nDisplay %d bytes at %x\n", len_this_pass, startaddr);

      printf_monitor (MEM_DIS_CMD, startaddr, 8);
      expect ("- ", 1);
      for (i = 0; i < 16; i++)
	{
	  get_hex_byte (&readbuf[i]);
	}
      bufaddr = startaddr;
      buflen = 16;
      memcpy(&myaddr[count], readbuf, len_this_pass); 
      count += len_this_pass;
      startaddr += len_this_pass;
      expect(CMD_DELIM, 1);
    }
  if (CMD_END) 
      printf_monitor (CMD_END);
  is_trace_mode = 0;
  expect_prompt (1);

  return len;
}

/* FIXME-someday!  merge these two.  */
static int
rombug_xfer_inferior_memory (memaddr, myaddr, len, write, target)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
     int write;
     struct target_ops *target;		/* ignored */
{
  if (write)
    return rombug_write_inferior_memory (memaddr, myaddr, len);
  else
    return rombug_read_inferior_memory (memaddr, myaddr, len);
}

static void
rombug_kill (args, from_tty)
     char *args;
     int from_tty;
{
  return;		/* ignore attempts to kill target system */
}

/* Clean up when a program exits.
   The program actually lives on in the remote processor's RAM, and may be
   run again without a download.  Don't leave it full of breakpoint
   instructions.  */

static void
rombug_mourn_inferior ()
{
  remove_breakpoints ();
  generic_mourn_inferior ();	/* Do all the proper things now */
}

#define MAX_MONITOR_BREAKPOINTS 16

static CORE_ADDR breakaddr[MAX_MONITOR_BREAKPOINTS] = {0};

static int
rombug_insert_breakpoint (addr, shadow)
     CORE_ADDR addr;
     char *shadow;
{
  int i;
  CORE_ADDR bp_addr = addr;
  int bp_size = 0;

  if (monitor_log)
    fprintf (log_file, "\nIn Insert_breakpoint (addr=%x)\n", addr);
  BREAKPOINT_FROM_PC (&bp_addr, &bp_size);

  for (i = 0; i <= MAX_MONITOR_BREAKPOINTS; i++)
    if (breakaddr[i] == 0)
      {
	breakaddr[i] = addr;
	if (sr_get_debug())
	  printf ("Breakpoint at %x\n", addr);
	rombug_read_inferior_memory (bp_addr, shadow, bp_size);
	printf_monitor(SET_BREAK_CMD, addr);
	is_trace_mode = 0;
	expect_prompt(1);
	return 0;
      }

  fprintf(stderr, "Too many breakpoints (> 16) for monitor\n");
  return 1;
}

/*
 * _remove_breakpoint -- Tell the monitor to remove a breakpoint
 */
static int
rombug_remove_breakpoint (addr, shadow)
     CORE_ADDR addr;
     char *shadow;
{
  int i;

  if (monitor_log)
    fprintf (log_file, "\nIn Remove_breakpoint (addr=%x)\n", addr);

  for (i = 0; i < MAX_MONITOR_BREAKPOINTS; i++)
    if (breakaddr[i] == addr)
      {
	breakaddr[i] = 0;
	printf_monitor(CLR_BREAK_CMD, addr);
	is_trace_mode = 0;
	expect_prompt(1);
	return 0;
      }

  fprintf(stderr, "Can't find breakpoint associated with 0x%x\n", addr);
  return 1;
}

/* Load a file. This is usually an srecord, which is ascii. No 
   protocol, just sent line by line. */

#define DOWNLOAD_LINE_SIZE 100
static void
rombug_load (arg)
    char	*arg;
{
/* this part comment out for os9* */
#if 0
  FILE *download;
  char buf[DOWNLOAD_LINE_SIZE];
  int i, bytes_read;

  if (sr_get_debug())
    printf ("Loading %s to monitor\n", arg);

  download = fopen (arg, "r");
  if (download == NULL)
    {
    error (sprintf (buf, "%s Does not exist", arg));
    return;
  }

  printf_monitor (LOAD_CMD);
/*  expect ("Waiting for S-records from host... ", 1); */

  while (!feof (download))
    {
      bytes_read = fread (buf, sizeof (char), DOWNLOAD_LINE_SIZE, download);
      if (hashmark)
	{
	  putchar ('.');
	  fflush (stdout);
	}

      if (SERIAL_WRITE(monitor_desc, buf, bytes_read)) {
	fprintf(stderr, "SERIAL_WRITE failed: (while downloading) %s\n", safe_strerror(errno));
	break;
      }
      i = 0;
      while (i++ <=200000) {} ;     			/* Ugly HACK, probably needs flow control */
      if (bytes_read < DOWNLOAD_LINE_SIZE)
	{
	  if (!feof (download))
	    error ("Only read %d bytes\n", bytes_read);
	  break;
	}
    }

  if (hashmark)
    {
      putchar ('\n');
    }
  if (!feof (download))
    error ("Never got EOF while downloading");
  fclose (download);
#endif 0
}

/* Put a command string, in args, out to MONITOR.  
   Output from MONITOR is placed on the users terminal until the prompt 
   is seen. */

static void
rombug_command (args, fromtty)
     char	*args;
     int	fromtty;
{
  if (monitor_desc == NULL)
    error("monitor target not open.");
  
  if (monitor_log)
    fprintf (log_file, "\nIn command (args=%s)\n", args);

  if (!args)
    error("Missing command.");
	
  printf_monitor("%s\r", args);
  expect_prompt(0);
}

#if 0
/* Connect the user directly to MONITOR.  This command acts just like the
   'cu' or 'tip' command.  Use <CR>~. or <CR>~^D to break out.  */

static struct ttystate ttystate;

static void
cleanup_tty()
{  printf("\r\n[Exiting connect mode]\r\n");
  /*SERIAL_RESTORE(0, &ttystate);*/
}

static void
connect_command (args, fromtty)
     char	*args;
     int	fromtty;
{
  fd_set readfds;
  int numfds;
  int c;
  char cur_esc = 0;

  dont_repeat();

  if (monitor_desc == NULL)
    error("monitor target not open.");
  
  if (args)
    fprintf("This command takes no args.  They have been ignored.\n");
	
  printf("[Entering connect mode.  Use ~. or ~^D to escape]\n");

  serial_raw(0, &ttystate);

  make_cleanup(cleanup_tty, 0);

  FD_ZERO(&readfds);

  while (1)
    {
      do
	{
	  FD_SET(0, &readfds);
	  FD_SET(monitor_desc, &readfds);
	  numfds = select(sizeof(readfds)*8, &readfds, 0, 0, 0);
	}
      while (numfds == 0);

      if (numfds < 0)
	perror_with_name("select");

      if (FD_ISSET(0, &readfds))
	{			/* tty input, send to monitor */
	  c = getchar();
	  if (c < 0)
	    perror_with_name("connect");

	  printf_monitor("%c", c);
	  switch (cur_esc)
	    {
	    case 0:
	      if (c == '\r')
		cur_esc = c;
	      break;
	    case '\r':
	      if (c == '~')
		cur_esc = c;
	      else
		cur_esc = 0;
	      break;
	    case '~':
	      if (c == '.' || c == '\004')
		return;
	      else
		cur_esc = 0;
	    }
	}

      if (FD_ISSET(monitor_desc, &readfds))
	{
	  while (1)
	    {
	      c = readchar(0);
	      if (c < 0)
		break;
	      putchar(c);
	    }
	  fflush(stdout);
	}
    }
}
#endif

/*
 * 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.
 */
#warning FIXME: monitor interface pattern strings, stale struct decl
struct monitor_ops rombug_cmds = {
  "g \r",				/* execute or usually GO command */
  "g \r",				/* continue command */
  "t \r",				/* single step */
  "b %x\r",				/* set a breakpoint */
  "k %x\r",				/* clear a breakpoint */
  "c %x\r",				/* set memory to a value */
  "d %x %d\r",				/* display memory */
  "$%08X",				/* prompt memory commands use */
  ".%s %x\r",				/* set a register */
  ":",					/* delimiter between registers */
  ". \r",				/* read a register */
  "mf \r",				/* download command */
  "RomBug: ",				/* monitor command prompt */
  ": ",					/* end-of-command delimitor */
  ".\r"					/* optional command terminator */
};

struct target_ops rombug_ops ;

static void 
init_rombug_ops(void)
{
  rombug_ops.to_shortname =   "rombug";
  rombug_ops.to_longname =   "Microware's ROMBUG debug monitor";
  rombug_ops.to_doc =   "Use a remote computer running the ROMBUG debug monitor.\n\
Specify the serial device it is connected to (e.g. /dev/ttya).",
    rombug_ops.to_open =   rombug_open;
  rombug_ops.to_close =   rombug_close;
  rombug_ops.to_attach =   0;
  rombug_ops.to_post_attach = NULL;
  rombug_ops.to_require_attach = NULL;
  rombug_ops.to_detach =   rombug_detach;
  rombug_ops.to_require_detach = NULL;
  rombug_ops.to_resume =   rombug_resume;
  rombug_ops.to_wait  =   rombug_wait;
  rombug_ops.to_post_wait = NULL;
  rombug_ops.to_fetch_registers  =   rombug_fetch_register;
  rombug_ops.to_store_registers  =   rombug_store_register;
  rombug_ops.to_prepare_to_store =   rombug_prepare_to_store;
  rombug_ops.to_xfer_memory  =   rombug_xfer_inferior_memory;
  rombug_ops.to_files_info  =   rombug_files_info;
  rombug_ops.to_insert_breakpoint =   rombug_insert_breakpoint;
  rombug_ops.to_remove_breakpoint =   rombug_remove_breakpoint;	/* Breakpoints */
  rombug_ops.to_terminal_init  =   0;
  rombug_ops.to_terminal_inferior =   0;
  rombug_ops.to_terminal_ours_for_output =   0;
  rombug_ops.to_terminal_ours  =   0;
  rombug_ops.to_terminal_info  =   0;				/* Terminal handling */
  rombug_ops.to_kill  =   rombug_kill;
  rombug_ops.to_load  =   rombug_load;			/* load */
  rombug_ops.to_lookup_symbol =   rombug_link;				/* lookup_symbol */
  rombug_ops.to_create_inferior =   rombug_create_inferior;
  rombug_ops.to_post_startup_inferior = NULL;
  rombug_ops.to_acknowledge_created_inferior = NULL;
  rombug_ops.to_clone_and_follow_inferior = NULL;
  rombug_ops.to_post_follow_inferior_by_clone = NULL;
  rombug_ops.to_insert_fork_catchpoint = NULL;
  rombug_ops.to_remove_fork_catchpoint = NULL;
  rombug_ops.to_insert_vfork_catchpoint = NULL;
  rombug_ops.to_remove_vfork_catchpoint = NULL;
  rombug_ops.to_has_forked = NULL;
  rombug_ops.to_has_vforked = NULL;
  rombug_ops.to_can_follow_vfork_prior_to_exec = NULL;
  rombug_ops.to_post_follow_vfork = NULL;
  rombug_ops.to_insert_exec_catchpoint = NULL;
  rombug_ops.to_remove_exec_catchpoint = NULL;
  rombug_ops.to_has_execd = NULL;
  rombug_ops.to_reported_exec_events_per_exec_call = NULL;
  rombug_ops.to_has_exited = NULL;
  rombug_ops.to_mourn_inferior =   rombug_mourn_inferior;
  rombug_ops.to_can_run  =   0;				/* can_run */
  rombug_ops.to_notice_signals =   0; 				/* notice_signals */
  rombug_ops.to_thread_alive  =   0;
  rombug_ops.to_stop  =   0;				/* to_stop */
  rombug_ops.to_pid_to_exec_file = NULL;
  rombug_ops.to_core_file_to_sym_file = NULL;
  rombug_ops.to_stratum =   process_stratum;
  rombug_ops.DONT_USE =   0;				/* next */
  rombug_ops.to_has_all_memory =   1;
  rombug_ops.to_has_memory =   1;
  rombug_ops.to_has_stack =   1;
  rombug_ops.to_has_registers =   1;
  rombug_ops.to_has_execution =   1;				/* has execution */
  rombug_ops.to_sections =   0;
  rombug_ops.to_sections_end =   0;				/* Section pointers */
  rombug_ops.to_magic =   OPS_MAGIC;			/* Always the last thing */
} 

void
_initialize_remote_os9k ()
{
  init_rombug_ops() ;
  add_target (&rombug_ops);

  add_show_from_set (
        add_set_cmd ("hash", no_class, var_boolean, (char *)&hashmark,
		"Set display of activity while downloading a file.\nWhen enabled, a period \'.\' is displayed.",
                &setlist),
	&showlist);

  add_show_from_set (
        add_set_cmd ("timeout", no_class, var_zinteger,
                 (char *) &timeout,
                 "Set timeout in seconds for remote MIPS serial I/O.",
                 &setlist),
        &showlist);

  add_show_from_set (
        add_set_cmd ("remotelog", no_class, var_zinteger,
                 (char *) &monitor_log,
                 "Set monitor activity log on(=1) or off(=0).",
                 &setlist),
        &showlist);

  add_show_from_set (
        add_set_cmd ("remotexon", no_class, var_zinteger,
                 (char *) &tty_xon,
                 "Set remote tty line XON control",
                 &setlist),
        &showlist);

  add_show_from_set (
        add_set_cmd ("remotexoff", no_class, var_zinteger,
                 (char *) &tty_xoff,
                 "Set remote tty line XOFF control",
                 &setlist),
        &showlist);

  add_com ("rombug <command>", class_obscure, rombug_command,
	   "Send a command to the debug monitor."); 
#if 0
  add_com ("connect", class_obscure, connect_command,
   	   "Connect the terminal directly up to a serial based command monitor.\nUse <CR>~. or <CR>~^D to break out.");
#endif
}
