/* Remote debugging interface for AMD 290*0 Adapt Monitor Version 2.1d18. 
   Copyright 1990, 1991, 1992 Free Software Foundation, Inc.
   Contributed by David Wood at New York University (wood@lab.ultra.nyu.edu).
   Adapted from work done at Cygnus Support in remote-eb.c.

   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 is like remote.c but is for an esoteric situation--
   having a 29k board attached to an Adapt inline monitor. 
   The  monitor is connected via serial line to a unix machine 
   running gdb. 

   3/91 -  developed on Sun3 OS 4.1, by David Wood
   o - I can't get binary coff to load. 
   o - I can't get 19200 baud rate to work. 
   7/91 o - Freeze mode tracing can be done on a 29050.  */



#include "defs.h"
#include "gdb_string.h"
#include "inferior.h"
#include "wait.h"
#include "value.h"
#include <ctype.h>
#include <fcntl.h>
#include <signal.h>
#include <errno.h>
#include "terminal.h"
#include "target.h"
#include "gdbcore.h"

/* This processor is getting rusty but I am trying to keep it
   up to date at least with data structure changes.
   Activate this block to compile just this file.
 */
#define COMPILE_CHECK 0
#if COMPILE_CHECK
#define Q_REGNUM 0
#define VAB_REGNUM 0
#define CPS_REGNUM 0
#define IPA_REGNUM 0
#define IPB_REGNUM 0
#define GR1_REGNUM 0
#define LR0_REGNUM 0
#define IPC_REGNUM 0
#define CR_REGNUM 0
#define BP_REGNUM 0
#define FC_REGNUM 0
#define INTE_REGNUM 0
#define EXO_REGNUM 0
#define GR96_REGNUM 0
#define NPC_REGNUM
#define FPE_REGNUM 0
#define PC2_REGNUM 0
#define FPS_REGNUM 0
#define ALU_REGNUM 0
#define LRU_REGNUM 0
#define TERMINAL int
#define RAW 1
#define ANYP 1
extern int a29k_freeze_mode;
extern int processor_type;
extern char *processor_name;
#endif

/* External data declarations */
extern int stop_soon_quietly;	/* for wait_for_inferior */

/* Forward data declarations */
extern struct target_ops adapt_ops;	/* Forward declaration */

/* Forward function declarations */
static void adapt_fetch_registers ();
static void adapt_store_registers ();
static void adapt_close ();
static int adapt_clear_breakpoints ();

#define FREEZE_MODE 	(read_register(CPS_REGNUM) && 0x400)
#define USE_SHADOW_PC	((processor_type == a29k_freeze_mode) && FREEZE_MODE)

/* Can't seem to get binary coff working */
#define ASCII_COFF		/* Adapt will be downloaded with ascii coff */

/* FIXME: Replace with `set remotedebug'.  */
#define LOG_FILE "adapt.log"
#if defined (LOG_FILE)
FILE *log_file = NULL;
#endif

static int timeout = 5;
static char *dev_name;

/* Descriptor for I/O to remote machine.  Initialize it to -1 so that
   adapt_open knows that we don't have a file open when the program
   starts.  */
int adapt_desc = -1;

/* stream which is fdopen'd from adapt_desc.  Only valid when
   adapt_desc != -1.  */
FILE *adapt_stream;

#define ON	1
#define OFF	0
static void
rawmode (desc, turnon)
     int desc;
     int turnon;
{

  TERMINAL sg;

  if (desc < 0)
    return;

  ioctl (desc, TIOCGETP, &sg);

  if (turnon)
    {
#ifdef HAVE_TERMIO
      sg.c_lflag &= ~(ICANON);
#else
      sg.sg_flags |= RAW;
#endif
    }
  else
    {
#ifdef HAVE_TERMIO
      sg.c_lflag |= ICANON;
#else
      sg.sg_flags &= ~(RAW);
#endif
    }
  ioctl (desc, TIOCSETP, &sg);
}

/* Suck up all the input from the adapt */
slurp_input ()
{
  char buf[8];

#ifdef HAVE_TERMIO
  /* termio does the timeout for us.  */
  while (read (adapt_desc, buf, 8) > 0);
#else
  alarm (timeout);
  while (read (adapt_desc, buf, 8) > 0);
  alarm (0);
#endif
}

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

  buf = '\0';
#ifdef HAVE_TERMIO
  /* termio does the timeout for us.  */
  read (adapt_desc, &buf, 1);
#else
  alarm (timeout);
  if (read (adapt_desc, &buf, 1) < 0)
    {
      if (errno == EINTR)
	error ("Timeout reading from remote system.");
      else
	perror_with_name ("remote");
    }
  alarm (0);
#endif

  if (buf == '\0')
    error ("Timeout reading from remote system.");
#if defined (LOG_FILE)
  putc (buf & 0x7f, log_file);
#endif
  return buf & 0x7f;
}

/* Keep discarding input from the remote system, until STRING is found. 
   Let the user break out immediately.  */
static void
expect (string)
     char *string;
{
  char *p = string;

  fflush (adapt_stream);
  immediate_quit = 1;
  while (1)
    {
      if (readchar () == *p)
	{
	  p++;
	  if (*p == '\0')
	    {
	      immediate_quit = 0;
	      return;
	    }
	}
      else
	p = string;
    }
}

/* Keep discarding input until we see the adapt 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:  adapt_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 adapt_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 ()
{
#if defined (LOG_FILE)
  /* 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);
#endif
  fflush (adapt_stream);
  expect ("\n# ");
}

/* 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 ();
      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 ();
	  error ("Invalid hex digit from remote system.");
	}
    }
}

/* Get a byte from adapt_desc 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;
}

/* Read a 32-bit hex word from the adapt, preceded by a space  */
static long
get_hex_word ()
{
  long val;
  int j;

  val = 0;
  for (j = 0; j < 8; j++)
    val = (val << 4) + get_hex_digit (j == 0);
  return val;
}
/* Get N 32-bit hex 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;
  while (n--)
    {
      val = get_hex_word ();
      supply_register (regno++, (char *) &val);
    }
}
/* Called when SIGALRM signal sent due to alarm() timeout.  */
#ifndef HAVE_TERMIO

#ifndef __STDC__
#ifndef volatile
#define volatile
/**/
# endif
#endif
volatile int n_alarms;

void
adapt_timer ()
{
#if 0
  if (kiodebug)
    printf ("adapt_timer called\n");
#endif
  n_alarms++;
}
#endif

/* malloc'd name of the program on the remote system.  */
static char *prog_name = NULL;

/* Number of SIGTRAPs we need to simulate.  That is, the next
   NEED_ARTIFICIAL_TRAP calls to adapt_wait should just return
   SIGTRAP without actually waiting for anything.  */

static int need_artificial_trap = 0;

void
adapt_kill (arg, from_tty)
     char *arg;
     int from_tty;
{
  fprintf (adapt_stream, "K");
  fprintf (adapt_stream, "\r");
  expect_prompt ();
}
/*
 * Download a file specified in 'args', to the adapt. 
 * FIXME: Assumes the file to download is a binary coff file.
 */
static void
adapt_load (args, fromtty)
     char *args;
     int fromtty;
{
  FILE *fp;
  int n;
  char buffer[1024];

  if (!adapt_stream)
    {
      printf_filtered ("Adapt not open. Use 'target' command to open adapt\n");
      return;
    }

  /* OK, now read in the file.  Y=read, C=COFF, T=dTe port
     0=start address.  */

#ifdef ASCII_COFF		/* Ascii coff */
  fprintf (adapt_stream, "YA T,0\r");
  fflush (adapt_stream);	/* Just in case */
  /* FIXME: should check args for only 1 argument */
  sprintf (buffer, "cat %s | btoa > /tmp/#adapt-btoa", args);
  system (buffer);
  fp = fopen ("/tmp/#adapt-btoa", "r");
  rawmode (adapt_desc, OFF);
  while (n = fread (buffer, 1, 1024, fp))
    {
      do
	{
	  n -= write (adapt_desc, buffer, n);
	}
      while (n > 0);
      if (n < 0)
	{
	  perror ("writing ascii coff");
	  break;
	}
    }
  fclose (fp);
  rawmode (adapt_desc, ON);
  system ("rm /tmp/#adapt-btoa");
#else /* Binary coff - can't get it to work . */
  fprintf (adapt_stream, "YC T,0\r");
  fflush (adapt_stream);	/* Just in case */
  if (!(fp = fopen (args, "r")))
    {
      printf_filtered ("Can't open %s\n", args);
      return;
    }
  while (n = fread (buffer, 1, 512, fp))
    {
      do
	{
	  n -= write (adapt_desc, buffer, n);
	}
      while (n > 0);
      if (n < 0)
	{
	  perror ("writing ascii coff");
	  break;
	}
    }
  fclose (fp);
#endif
  expect_prompt ();		/* Skip garbage that comes out */
  fprintf (adapt_stream, "\r");
  expect_prompt ();
}

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

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

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

  entry_pt = (int) bfd_get_start_address (exec_bfd);

  if (adapt_stream)
    {
      adapt_kill (NULL, NULL);
      adapt_clear_breakpoints ();
      init_wait_for_inferior ();
      /* Clear the input because what the adapt sends back is different
       * depending on whether it was running or not.
       */
      slurp_input ();		/* After this there should be a prompt */
      fprintf (adapt_stream, "\r");
      expect_prompt ();
      printf_filtered ("Do you want to download '%s' (y/n)? [y] : ", prog_name);
      {
	char buffer[10];
	gets (buffer);
	if (*buffer != 'n')
	  {
	    adapt_load (prog_name, 0);
	  }
      }

#ifdef NOTDEF
      /* Set the PC and wait for a go/cont */
      fprintf (adapt_stream, "G %x,N\r", entry_pt);
      printf_filtered ("Now use the 'continue' command to start.\n");
      expect_prompt ();
#else
      insert_breakpoints ();	/* Needed to get correct instruction in cache */
      proceed (entry_pt, TARGET_SIGNAL_DEFAULT, 0);
#endif

    }
  else
    {
      printf_filtered ("Adapt not open yet.\n");
    }
}

/* Translate baud rates from integers to damn B_codes.  Unix should
   have outgrown this crap years ago, but even POSIX wouldn't buck it.  */

#ifndef B19200
#define B19200 EXTA
#endif
#ifndef B38400
#define B38400 EXTB
#endif

static struct
{
  int rate, damn_b;
}
baudtab[] =
{
  {
    0, B0
  }
  ,
  {
    50, B50
  }
  ,
  {
    75, B75
  }
  ,
  {
    110, B110
  }
  ,
  {
    134, B134
  }
  ,
  {
    150, B150
  }
  ,
  {
    200, B200
  }
  ,
  {
    300, B300
  }
  ,
  {
    600, B600
  }
  ,
  {
    1200, B1200
  }
  ,
  {
    1800, B1800
  }
  ,
  {
    2400, B2400
  }
  ,
  {
    4800, B4800
  }
  ,
  {
    9600, B9600
  }
  ,
  {
    19200, B19200
  }
  ,
  {
    38400, B38400
  }
  ,
  {
    -1, -1
  }
  ,
};

static int
damn_b (rate)
     int rate;
{
  int i;

  for (i = 0; baudtab[i].rate != -1; i++)
    if (rate == baudtab[i].rate)
      return baudtab[i].damn_b;
  return B38400;		/* Random */
}


/* Open a connection to a remote debugger.
   NAME is the filename used for communication, then a space,
   then the baud rate.
 */

static int baudrate = 9600;
static void
adapt_open (name, from_tty)
     char *name;
     int from_tty;
{
  TERMINAL sg;
  unsigned int prl;
  char *p;

  /* Find the first whitespace character, it separates dev_name from
     prog_name.  */
  if (name == 0)
    goto erroid;

  for (p = name;
       *p != '\0' && !isspace (*p); p++)
    ;
  if (*p == '\0')
  erroid:
    error ("\
Please include the name of the device for the serial port,\n\
the baud rate, and the name of the program to run on the remote system.");
  dev_name = (char *) xmalloc (p - name + 1);
  strncpy (dev_name, name, p - name);
  dev_name[p - name] = '\0';

  /* Skip over the whitespace after dev_name */
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (1 != sscanf (p, "%d ", &baudrate))
    goto erroid;

  /* Skip the number and then the spaces */
  for (; isdigit (*p); p++)
    /*EMPTY */ ;
  for (; isspace (*p); p++)
    /*EMPTY */ ;

  if (prog_name != NULL)
    free (prog_name);
  prog_name = savestring (p, strlen (p));

  adapt_close (0);

  adapt_desc = open (dev_name, O_RDWR);
  if (adapt_desc < 0)
    perror_with_name (dev_name);
  ioctl (adapt_desc, TIOCGETP, &sg);
#if ! defined(COMPILE_CHECK)
#ifdef HAVE_TERMIO
  sg.c_cc[VMIN] = 0;		/* read with timeout.  */
  sg.c_cc[VTIME] = timeout * 10;
  sg.c_lflag &= ~(ICANON | ECHO);
  sg.c_cflag = (sg.c_cflag & ~CBAUD) | damn_b (baudrate);
#else
  sg.sg_ispeed = damn_b (baudrate);
  sg.sg_ospeed = damn_b (baudrate);
  sg.sg_flags |= RAW | ANYP;
  sg.sg_flags &= ~ECHO;
#endif

  ioctl (adapt_desc, TIOCSETP, &sg);
  adapt_stream = fdopen (adapt_desc, "r+");
#endif /* compile_check */
  push_target (&adapt_ops);

#ifndef HAVE_TERMIO
#ifndef NO_SIGINTERRUPT
  /* Cause SIGALRM's to make reads fail with EINTR instead of resuming
     the read.  */
  if (siginterrupt (SIGALRM, 1) != 0)
    perror ("adapt_open: error in siginterrupt");
#endif

  /* Set up read timeout timer.  */
  if ((void (*)) signal (SIGALRM, adapt_timer) == (void (*)) -1)
    perror ("adapt_open: error in signal");
#endif

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

  /* Put this port into NORMAL mode, send the 'normal' character */
  write (adapt_desc, "", 1);	/* Control A */
  write (adapt_desc, "\r", 1);
  expect_prompt ();

  /* Hello?  Are you there?  */
  write (adapt_desc, "\r", 1);

  expect_prompt ();

  /* Clear any break points */
  adapt_clear_breakpoints ();

  /* Print out some stuff, letting the user now what's going on */
  printf_filtered ("Connected to an Adapt via %s.\n", dev_name);
  /* FIXME: can this restriction be removed? */
  printf_filtered ("Remote debugging using virtual addresses works only\n");
  printf_filtered ("\twhen virtual addresses map 1:1 to physical addresses.\n");
  if (processor_type != a29k_freeze_mode)
    {
      fprintf_filtered (gdb_stderr,
			"Freeze-mode debugging not available, and can only be done on an A29050.\n");
    }
}

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

static void
adapt_close (quitting)
     int quitting;
{

  /* Clear any break points */
  adapt_clear_breakpoints ();

  /* Put this port back into REMOTE mode */
  if (adapt_stream)
    {
      fflush (adapt_stream);
      sleep (1);		/* Let any output make it all the way back */
      write (adapt_desc, "R\r", 2);
    }

  /* Due to a bug in Unix, fclose closes not only the stdio stream,
     but also the file descriptor.  So we don't actually close
     adapt_desc.  */
  if (adapt_stream)
    fclose (adapt_stream);	/* This also closes adapt_desc */
  if (adapt_desc >= 0)
    /* close (adapt_desc); */

    /* Do not try to close adapt_desc again, later in the program.  */
    adapt_stream = NULL;
  adapt_desc = -1;

#if defined (LOG_FILE)
  if (log_file)
    {
      if (ferror (log_file))
	printf_filtered ("Error writing log file.\n");
      if (fclose (log_file) != 0)
	printf_filtered ("Error closing log file.\n");
      log_file = NULL;
    }
#endif
}

/* Attach to the target that is already loaded and possibly running */
static void
adapt_attach (args, from_tty)
     char *args;
     int from_tty;
{

  if (from_tty)
    printf_filtered ("Attaching to remote program %s.\n", prog_name);

  /* Send the adapt a kill. It is ok if it is not already running */
  fprintf (adapt_stream, "K\r");
  fflush (adapt_stream);
  expect_prompt ();		/* Slurp the echo */
}


/* Terminate the open connection to the remote debugger.
   Use this when you want to detach and do something else
   with your gdb.  */
void
adapt_detach (args, from_tty)
     char *args;
     int from_tty;
{

  if (adapt_stream)
    {				/* Send it on its way (tell it to continue)  */
      adapt_clear_breakpoints ();
      fprintf (adapt_stream, "G\r");
    }

  pop_target ();		/* calls adapt_close to do the real work */
  if (from_tty)
    printf_filtered ("Ending remote %s debugging\n", target_shortname);
}

/* Tell the remote machine to resume.  */

void
adapt_resume (pid, step, sig)
     int pid, step;
     enum target_signal sig;
{
  if (step)
    {
      write (adapt_desc, "t 1,s\r", 6);
      /* Wait for the echo.  */
      expect ("t 1,s\r\n");
      /* Then comes a line containing the instruction we stepped to.  */
      expect ("@");
      /* Then we get the prompt.  */
      expect_prompt ();

      /* Force the next adapt_wait to return a trap.  Not doing anything
         about I/O from the target means that the user has to type
         "continue" to see any.  FIXME, this should be fixed.  */
      need_artificial_trap = 1;
    }
  else
    {
      write (adapt_desc, "G\r", 2);
      /* Swallow the echo.  */
      expect_prompt ();
    }
}

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

int
adapt_wait (status)
     struct target_waitstatus *status;
{
  /* Strings to look for.  '?' means match any single character.  
     Note that with the algorithm we use, the initial character
     of the string cannot recur in the string, or we will not
     find some cases of the string in the input.  */

  static char bpt[] = "@";
  /* It would be tempting to look for "\n[__exit + 0x8]\n"
     but that requires loading symbols with "yc i" and even if
     we did do that we don't know that the file has symbols.  */
  static char exitmsg[] = "@????????I    JMPTI     GR121,LR0";
  char *bp = bpt;
  char *ep = exitmsg;

  /* Large enough for either sizeof (bpt) or sizeof (exitmsg) chars.  */
  char swallowed[50];
  /* Current position in swallowed.  */
  char *swallowed_p = swallowed;

  int ch;
  int ch_handled;
  int old_timeout = timeout;
  int old_immediate_quit = immediate_quit;

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

  if (need_artificial_trap != 0)
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
      need_artificial_trap--;
      return 0;
    }

  timeout = 0;			/* Don't time out -- user program is running. */
  immediate_quit = 1;		/* Helps ability to QUIT */
  while (1)
    {
      QUIT;			/* Let user quit and leave process running */
      ch_handled = 0;
      ch = readchar ();
      if (ch == *bp)
	{
	  bp++;
	  if (*bp == '\0')
	    break;
	  ch_handled = 1;

	  *swallowed_p++ = ch;
	}
      else
	bp = bpt;
      if (ch == *ep || *ep == '?')
	{
	  ep++;
	  if (*ep == '\0')
	    break;

	  if (!ch_handled)
	    *swallowed_p++ = ch;
	  ch_handled = 1;
	}
      else
	ep = exitmsg;
      if (!ch_handled)
	{
	  char *p;
	  /* Print out any characters which have been swallowed.  */
	  for (p = swallowed; p < swallowed_p; ++p)
	    putc (*p, stdout);
	  swallowed_p = swallowed;
	  putc (ch, stdout);
	}
    }
  expect_prompt ();
  if (*bp == '\0')
    {
      status->kind = TARGET_WAITKIND_STOPPED;
      status->value.sig = TARGET_SIGNAL_TRAP;
    }
  else
    {
      status->kind = TARGET_WAITKIND_EXITED;
      status->value.integer = 0;
    }
  timeout = old_timeout;
  immediate_quit = old_immediate_quit;
  return 0;
}

/* Return the name of register number REGNO
   in the form input and output by adapt.

   Returns a pointer to a static buffer containing the answer.  */
static char *
get_reg_name (regno)
     int regno;
{
  static char buf[80];
  if (regno >= GR96_REGNUM && regno < GR96_REGNUM + 32)
    sprintf (buf, "GR%03d", regno - GR96_REGNUM + 96);
#if defined(GR64_REGNUM)
  else if (regno >= GR64_REGNUM && regno < GR64_REGNUM + 32)
    sprintf (buf, "GR%03d", regno - GR64_REGNUM + 64);
#endif
  else if (regno >= LR0_REGNUM && regno < LR0_REGNUM + 128)
    sprintf (buf, "LR%03d", regno - LR0_REGNUM);
  else if (regno == Q_REGNUM)
    strcpy (buf, "SR131");
  else if (regno >= BP_REGNUM && regno <= CR_REGNUM)
    sprintf (buf, "SR%03d", regno - BP_REGNUM + 133);
  else if (regno == ALU_REGNUM)
    strcpy (buf, "SR132");
  else if (regno >= IPC_REGNUM && regno <= IPB_REGNUM)
    sprintf (buf, "SR%03d", regno - IPC_REGNUM + 128);
  else if (regno >= VAB_REGNUM && regno <= LRU_REGNUM)
    {
      /* When a 29050 is in freeze-mode, read shadow pcs instead */
      if ((regno >= NPC_REGNUM && regno <= PC2_REGNUM) && USE_SHADOW_PC)
	sprintf (buf, "SR%03d", regno - NPC_REGNUM + 20);
      else
	sprintf (buf, "SR%03d", regno - VAB_REGNUM);
    }
  else if (regno == GR1_REGNUM)
    strcpy (buf, "GR001");
  return buf;
}

/* Read the remote registers.  */

static void
adapt_fetch_registers ()
{
  int reg_index;
  int regnum_index;
  char tempbuf[10];
  int sreg_buf[16];
  int i, j;

/* 
 * Global registers
 */
#if defined(GR64_REGNUM)
  write (adapt_desc, "dw gr64,gr95\r", 13);
  for (reg_index = 64, regnum_index = GR64_REGNUM;
       reg_index < 96;
       reg_index += 4, regnum_index += 4)
    {
      sprintf (tempbuf, "GR%03d ", reg_index);
      expect (tempbuf);
      get_hex_regs (4, regnum_index);
      expect ("\n");
    }
#endif
  write (adapt_desc, "dw gr96,gr127\r", 14);
  for (reg_index = 96, regnum_index = GR96_REGNUM;
       reg_index < 128;
       reg_index += 4, regnum_index += 4)
    {
      sprintf (tempbuf, "GR%03d ", reg_index);
      expect (tempbuf);
      get_hex_regs (4, regnum_index);
      expect ("\n");
    }

/* 
 * Local registers
 */
  for (i = 0; i < 128; i += 32)
    {
      /* The PC has a tendency to hang if we get these
         all in one fell swoop ("dw lr0,lr127").  */
      sprintf (tempbuf, "dw lr%d\r", i);
      write (adapt_desc, tempbuf, strlen (tempbuf));
      for (reg_index = i, regnum_index = LR0_REGNUM + i;
	   reg_index < i + 32;
	   reg_index += 4, regnum_index += 4)
	{
	  sprintf (tempbuf, "LR%03d ", reg_index);
	  expect (tempbuf);
	  get_hex_regs (4, regnum_index);
	  expect ("\n");
	}
    }

/* 
 * Special registers
 */
  sprintf (tempbuf, "dw sr0\r");
  write (adapt_desc, tempbuf, strlen (tempbuf));
  for (i = 0; i < 4; i++)
    {				/* SR0 - SR14 */
      sprintf (tempbuf, "SR%3d", i * 4);
      expect (tempbuf);
      for (j = 0; j < (i == 3 ? 3 : 4); j++)
	sreg_buf[i * 4 + j] = get_hex_word ();
    }
  expect_prompt ();
  /* 
   * Read the pcs individually if we are in freeze mode.
   * See get_reg_name(), it translates the register names for the pcs to
   * the names of the shadow pcs.
   */
  if (USE_SHADOW_PC)
    {
      sreg_buf[10] = read_register (NPC_REGNUM);	/* pc0 */
      sreg_buf[11] = read_register (PC_REGNUM);		/* pc1 */
      sreg_buf[12] = read_register (PC2_REGNUM);	/* pc2 */
    }
  for (i = 0; i < 14; i++)	/* Supply vab -> lru */
    supply_register (VAB_REGNUM + i, (char *) &sreg_buf[i]);
  sprintf (tempbuf, "dw sr128\r");
  write (adapt_desc, tempbuf, strlen (tempbuf));
  for (i = 0; i < 2; i++)
    {				/* SR128 - SR135 */
      sprintf (tempbuf, "SR%3d", 128 + i * 4);
      expect (tempbuf);
      for (j = 0; j < 4; j++)
	sreg_buf[i * 4 + j] = get_hex_word ();
    }
  expect_prompt ();
  supply_register (IPC_REGNUM, (char *) &sreg_buf[0]);
  supply_register (IPA_REGNUM, (char *) &sreg_buf[1]);
  supply_register (IPB_REGNUM, (char *) &sreg_buf[2]);
  supply_register (Q_REGNUM, (char *) &sreg_buf[3]);
  /* Skip ALU */
  supply_register (BP_REGNUM, (char *) &sreg_buf[5]);
  supply_register (FC_REGNUM, (char *) &sreg_buf[6]);
  supply_register (CR_REGNUM, (char *) &sreg_buf[7]);

  /* There doesn't seem to be any way to get these.  */
  {
    int val = -1;
    supply_register (FPE_REGNUM, (char *) &val);
    supply_register (INTE_REGNUM, (char *) &val);
    supply_register (FPS_REGNUM, (char *) &val);
    supply_register (EXO_REGNUM, (char *) &val);
  }

  write (adapt_desc, "dw gr1,gr1\r", 11);
  expect ("GR001 ");
  get_hex_regs (1, GR1_REGNUM);
  expect_prompt ();
}

/* Fetch register REGNO, or all registers if REGNO is -1.
 */
static void
adapt_fetch_register (regno)
     int regno;
{
  if (regno == -1)
    adapt_fetch_registers ();
  else
    {
      char *name = get_reg_name (regno);
      fprintf (adapt_stream, "dw %s,%s\r", name, name);
      expect (name);
      expect (" ");
      get_hex_regs (1, regno);
      expect_prompt ();
    }
}

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

static void
adapt_store_registers ()
{
  int i, j;

  fprintf (adapt_stream, "s gr1,%x\r", read_register (GR1_REGNUM));
  expect_prompt ();

#if defined(GR64_REGNUM)
  for (j = 0; j < 32; j += 16)
    {
      fprintf (adapt_stream, "s gr%d,", j + 64);
      for (i = 0; i < 15; ++i)
	fprintf (adapt_stream, "%x,", read_register (GR64_REGNUM + j + i));
      fprintf (adapt_stream, "%x\r", read_register (GR64_REGNUM + j + 15));
      expect_prompt ();
    }
#endif
  for (j = 0; j < 32; j += 16)
    {
      fprintf (adapt_stream, "s gr%d,", j + 96);
      for (i = 0; i < 15; ++i)
	fprintf (adapt_stream, "%x,", read_register (GR96_REGNUM + j + i));
      fprintf (adapt_stream, "%x\r", read_register (GR96_REGNUM + j + 15));
      expect_prompt ();
    }

  for (j = 0; j < 128; j += 16)
    {
      fprintf (adapt_stream, "s lr%d,", j);
      for (i = 0; i < 15; ++i)
	fprintf (adapt_stream, "%x,", read_register (LR0_REGNUM + j + i));
      fprintf (adapt_stream, "%x\r", read_register (LR0_REGNUM + j + 15));
      expect_prompt ();
    }

  fprintf (adapt_stream, "s sr128,%x,%x,%x\r", read_register (IPC_REGNUM),
	   read_register (IPA_REGNUM), read_register (IPB_REGNUM));
  expect_prompt ();
  fprintf (adapt_stream, "s sr133,%x,%x,%x\r", read_register (BP_REGNUM),
	   read_register (FC_REGNUM), read_register (CR_REGNUM));
  expect_prompt ();
  fprintf (adapt_stream, "s sr131,%x\r", read_register (Q_REGNUM));
  expect_prompt ();
  fprintf (adapt_stream, "s sr0,");
  for (i = 0; i < 7; ++i)
    fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
  expect_prompt ();
  fprintf (adapt_stream, "s sr7,");
  for (i = 7; i < 14; ++i)
    fprintf (adapt_stream, "%x,", read_register (VAB_REGNUM + i));
  expect_prompt ();
}

/* Store register REGNO, or all if REGNO == -1.
   Return errno value.  */
void
adapt_store_register (regno)
     int regno;
{
  /* printf("adapt_store_register() called.\n"); fflush(stdout); /* */
  if (regno == -1)
    adapt_store_registers ();
  else
    {
      char *name = get_reg_name (regno);
      fprintf (adapt_stream, "s %s,%x\r", name, read_register (regno));
      /* Setting GR1 changes the numbers of all the locals, so
         invalidate the register cache.  Do this *after* calling
         read_register, because we want read_register to return the
         value that write_register has just stuffed into the registers
         array, not the value of the register fetched from the
         inferior.  */
      if (regno == GR1_REGNUM)
	registers_changed ();
      expect_prompt ();
    }
}

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

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

static CORE_ADDR
translate_addr (addr)
     CORE_ADDR addr;
{
#if defined(KERNEL_DEBUGGING)
  /* Check for a virtual address in the kernel */
  /* Assume physical address of ublock is in  paddr_u register */
  if (addr >= UVADDR)
    {
      /* PADDR_U register holds the physical address of the ublock */
      CORE_ADDR i = (CORE_ADDR) read_register (PADDR_U_REGNUM);
      return (i + addr - (CORE_ADDR) UVADDR);
    }
  else
    {
      return (addr);
    }
#else
  return (addr);
#endif
}


/* FIXME!  Merge these two.  */
int
adapt_xfer_inferior_memory (memaddr, myaddr, len, write)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
     int write;
{

  memaddr = translate_addr (memaddr);

  if (write)
    return adapt_write_inferior_memory (memaddr, myaddr, len);
  else
    return adapt_read_inferior_memory (memaddr, myaddr, len);
}

void
adapt_files_info ()
{
  printf_filtered ("\tAttached to %s at %d baud and running program %s\n",
		   dev_name, baudrate, prog_name);
  printf_filtered ("\ton an %s processor.\n", processor_name[processor_type]);
}

/* Copy LEN bytes of data from debugger memory at MYADDR
   to inferior's memory at MEMADDR.  Returns errno value.  
   * sb/sh instructions don't work on unaligned addresses, when TU=1. 
 */
int
adapt_write_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i;
  unsigned int cps;

  /* Turn TU bit off so we can do 'sb' commands */
  cps = read_register (CPS_REGNUM);
  if (cps & 0x00000800)
    write_register (CPS_REGNUM, cps & ~(0x00000800));

  for (i = 0; i < len; i++)
    {
      if ((i % 16) == 0)
	fprintf (adapt_stream, "sb %x,", memaddr + i);
      if ((i % 16) == 15 || i == len - 1)
	{
	  fprintf (adapt_stream, "%x\r", ((unsigned char *) myaddr)[i]);
	  expect_prompt ();
	}
      else
	fprintf (adapt_stream, "%x,", ((unsigned char *) myaddr)[i]);
    }
  /* Restore the old value of cps if the TU bit was on */
  if (cps & 0x00000800)
    write_register (CPS_REGNUM, cps);
  return len;
}

/* Read LEN bytes from inferior memory at MEMADDR.  Put the result
   at debugger address MYADDR.  Returns errno value.  */
int
adapt_read_inferior_memory (memaddr, myaddr, len)
     CORE_ADDR memaddr;
     char *myaddr;
     int len;
{
  int i;

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

  /* 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
     adapt_read_bytes (CORE_ADDR_MAX - 4, foo, 4)
     works--it never adds len to memaddr and gets 0.  */
  /* However, something like
     adapt_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)
    return EIO;

  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);

      fprintf (adapt_stream, "db %x,%x\r", startaddr,
	       (startaddr - 1) + len_this_pass);

#ifdef NOTDEF			/* Why do this */
      expect ("\n");
      /* Look for 8 hex digits.  */
      i = 0;
      while (1)
	{
	  if (isxdigit (readchar ()))
	    ++i;
	  else
	    {
	      expect_prompt ();
	      error ("Hex digit expected from remote system.");
	    }
	  if (i >= 8)
	    break;
	}
#endif /* NOTDEF */

      expect ("  ");

      for (i = 0; i < len_this_pass; i++)
	get_hex_byte (&myaddr[count++]);

      expect_prompt ();

      startaddr += len_this_pass;
    }
  return count;
}

#define MAX_BREAKS	8
static int num_brkpts = 0;
static int
adapt_insert_breakpoint (addr, save)
     CORE_ADDR addr;
     char *save;		/* Throw away, let adapt save instructions */
{
  if (num_brkpts < MAX_BREAKS)
    {
      num_brkpts++;
      fprintf (adapt_stream, "B %x", addr);
      fprintf (adapt_stream, "\r");
      expect_prompt ();
      return (0);		/* Success */
    }
  else
    {
      fprintf_filtered (gdb_stderr,
		      "Too many break points, break point not installed\n");
      return (1);		/* Failure */
    }

}
static int
adapt_remove_breakpoint (addr, save)
     CORE_ADDR addr;
     char *save;		/* Throw away, let adapt save instructions */
{
  if (num_brkpts > 0)
    {
      num_brkpts--;
      fprintf (adapt_stream, "BR %x", addr);
      fprintf (adapt_stream, "\r");
      fflush (adapt_stream);
      expect_prompt ();
    }
  return (0);
}

/* Clear the adapts notion of what the break points are */
static int
adapt_clear_breakpoints ()
{
  if (adapt_stream)
    {
      fprintf (adapt_stream, "BR");	/* Clear all break points */
      fprintf (adapt_stream, "\r");
      fflush (adapt_stream);
      expect_prompt ();
    }
  num_brkpts = 0;
}
static void
adapt_mourn ()
{
  adapt_clear_breakpoints ();
  pop_target ();		/* Pop back to no-child state */
  generic_mourn_inferior ();
}

/* Display everthing we read in from the adapt until we match/see the
 * specified string
 */
static int
display_until (str)
     char *str;
{
  int i = 0, j, c;

  while (c = readchar ())
    {
      if (c == str[i])
	{
	  i++;
	  if (i == strlen (str))
	    return;
	}
      else
	{
	  if (i)
	    {
	      for (j = 0; j < i; j++)	/* Put everthing we matched */
		putchar (str[j]);
	      i = 0;
	    }
	  putchar (c);
	}
    }

}


/* Put a command string, in args, out to the adapt.  The adapt is assumed to
   be in raw mode, all writing/reading done through adapt_desc.
   Ouput from the adapt is placed on the users terminal until the
   prompt from the adapt is seen.
   FIXME: Can't handle commands that take input.  */

void
adapt_com (args, fromtty)
     char *args;
     int fromtty;
{
  if (!adapt_stream)
    {
      printf_filtered ("Adapt not open.  Use the 'target' command to open.\n");
      return;
    }

  /* Clear all input so only command relative output is displayed */
  slurp_input ();

  switch (islower (args[0]) ? toupper (args[0]) : args[0])
    {
    default:
      printf_filtered ("Unknown/Unimplemented adapt command '%s'\n", args);
      break;
    case 'G':			/* Go, begin execution */
      write (adapt_desc, args, strlen (args));
      write (adapt_desc, "\r", 1);
      expect_prompt ();
      break;
    case 'B':			/* Break points, B or BR */
    case 'C':			/* Check current 29k status (running/halted) */
    case 'D':			/* Display data/registers */
    case 'I':			/* Input from i/o space */
    case 'J':			/* Jam an instruction */
    case 'K':			/* Kill, stop execution */
    case 'L':			/* Disassemble */
    case 'O':			/* Output to i/o space */
    case 'T':			/* Trace */
    case 'P':			/* Pulse an input line */
    case 'X':			/* Examine special purpose registers */
    case 'Z':			/* Display trace buffer */
      write (adapt_desc, args, strlen (args));
      write (adapt_desc, "\r", 1);
      expect (args);		/* Don't display the command */
      display_until ("# ");
      break;
      /* Begin commands that take input in the form 'c x,y[,z...]' */
    case 'S':			/* Set memory or register */
      if (strchr (args, ','))
	{			/* Assume it is properly formatted */
	  write (adapt_desc, args, strlen (args));
	  write (adapt_desc, "\r", 1);
	  expect_prompt ();
	}
      break;
    }
}

/* Define the target subroutine names */

struct target_ops adapt_ops;

static void
init_adapt_ops (void)
{
  adapt_ops.to_shortname = "adapt";
  adapt_ops.to_longname = "Remote AMD `Adapt' target";
  adapt_ops.to_doc = "Remote debug an AMD 290*0 using an `Adapt' monitor via RS232";
  adapt_ops.to_open = adapt_open;
  adapt_ops.to_close = adapt_close;
  adapt_ops.to_attach = adapt_attach;
  adapt_ops.to_post_attach = NULL;
  adapt_ops.to_require_attach = NULL;
  adapt_ops.to_detach = adapt_detach;
  adapt_ops.to_require_detach = NULL;
  adapt_ops.to_resume = adapt_resume;
  adapt_ops.to_wait = adapt_wait;
  adapt_ops.to_post_wait = NULL;
  adapt_ops.to_fetch_registers = adapt_fetch_register;
  adapt_ops.to_store_registers = adapt_store_register;
  adapt_ops.to_prepare_to_store = adapt_prepare_to_store;
  adapt_ops.to_xfer_memory = adapt_xfer_inferior_memory;
  adapt_ops.to_files_info = adapt_files_info;
  adapt_ops.to_insert_breakpoint = adapt_insert_breakpoint;
  adapt_ops.to_remove_breakpoint = adapt_remove_breakpoint;
  adapt_ops.to_terminal_init = 0;
  adapt_ops.to_terminal_inferior = 0;
  adapt_ops.to_terminal_ours_for_output = 0;
  adapt_ops.to_terminal_ours = 0;
  adapt_ops.to_terminal_info = 0;
  adapt_ops.to_kill = adapt_kill;
  adapt_ops.to_load = adapt_load;
  adapt_ops.to_lookup_symbol = 0;
  adapt_ops.to_create_inferior = adapt_create_inferior;
  adapt_ops.to_post_startup_inferior = NULL;
  adapt_ops.to_acknowledge_created_inferior = NULL;
  adapt_ops.to_clone_and_follow_inferior = NULL;
  adapt_ops.to_post_follow_inferior_by_clone = NULL;
  adapt_ops.to_insert_fork_catchpoint = NULL;
  adapt_ops.to_remove_fork_catchpoint = NULL;
  adapt_ops.to_insert_vfork_catchpoint = NULL;
  adapt_ops.to_remove_vfork_catchpoint = NULL;
  adapt_ops.to_has_forked = NULL;
  adapt_ops.to_has_vforked = NULL;
  adapt_ops.to_can_follow_vfork_prior_to_exec = NULL;
  adapt_ops.to_post_follow_vfork = NULL;
  adapt_ops.to_insert_exec_catchpoint = NULL;
  adapt_ops.to_remove_exec_catchpoint = NULL;
  adapt_ops.to_has_execd = NULL;
  adapt_ops.to_reported_exec_events_per_exec_call = NULL;
  adapt_ops.to_has_exited = NULL;
  adapt_ops.to_mourn_inferior = adapt_mourn;
  adapt_ops.to_can_run = 0;
  adapt_ops.to_notice_signals = 0;
  adapt_ops.to_thread_alive = 0;
  adapt_ops.to_stop = 0;	/* process_stratum; */
  adapt_ops.to_pid_to_exec_file = NULL;
  adapt_ops.to_core_file_to_sym_file = NULL;
  adapt_ops.to_stratum = 0;
  adapt_ops.DONT_USE = 0;
  adapt_ops.to_has_all_memory = 1;
  adapt_ops.to_has_memory = 1;
  adapt_ops.to_has_stack = 1;
  adapt_ops.to_has_registers = 1;
  adapt_ops.to_has_execution = 0;
  adapt_ops.to_sections = 0;
  adapt_ops.to_sections_end = 0;
  adapt_ops.to_magic = OPS_MAGIC;
}				/* init_adapt_ops */

void
_initialize_remote_adapt ()
{
  init_adapt_ops ();
  add_target (&adapt_ops);
  add_com ("adapt <command>", class_obscure, adapt_com,
	   "Send a command to the AMD Adapt remote monitor.");
}
