Protoization.
[external/binutils.git] / gdb / remote-es.c
1 /* Memory-access and commands for remote es1800 processes, for GDB.
2    Copyright (C) 1988, 1992 Free Software Foundation, Inc.
3
4    This file is added to GDB to make it possible to do debugging via an
5    ES-1800 emulator. The code was originally written by Johan Holmberg
6    TT/SJ Ericsson Telecom AB and later modified by Johan Henriksson
7    TT/SJ. It was modified for gdb 4.0 by TX/DK Jan Nordenand by TX/DKG
8    Harald Johansen.
9
10    This file is part of GDB.
11
12    GDB is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 1, or (at your option)
15    any later version.
16
17    GDB is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21
22    You should have received a copy of the GNU General Public License
23    along with this program; if not, write to the Free Software
24    Foundation, Inc., 59 Temple Place - Suite 330,
25    Boston, MA 02111-1307, USA.  */
26
27
28 /* Emulator communication protocol.
29    All values are encoded in ascii hex digits.
30
31    Request
32    Command
33    Reply
34    read registers:
35    DR<cr>
36    - 0 -    - 1 -    - 2 -    - 3 -      - 4 -    - 5 -    -- 6 -   - 7 - 
37    D = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX   XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
38    A = XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX   XXXXXXXX XXXXXXXX XXXXXXXX 
39    PC = XXXXXX       SSP = XXXXXX    USP = XXXXXX     SR = XXXXXXXX
40    >
41    Each byte of register data is described by two hex digits.
42
43    write regs
44    D0=XXXXXXXX<cr>
45    >D1=XXXXXXXX<cr>
46    >D2=XXXXXXXX<cr>
47    >D3=XXXXXXXX<cr>
48    >D4=XXXXXXXX<cr>
49    >D5=XXXXXXXX<cr>
50    >D6=XXXXXXXX<cr>
51    >D7=XXXXXXXX<cr>
52    >A0=XXXXXXXX<cr>
53    >A1=XXXXXXXX<cr>
54    >A2=XXXXXXXX<cr>
55    >A3=XXXXXXXX<cr>
56    >A4=XXXXXXXX<cr>
57    >A5=XXXXXXXX<cr>
58    >A6=XXXXXXXX<cr>
59    >A7=XXXXXXXX<cr>
60    >SR=XXXXXXXX<cr>
61    >PC=XXXXXX<cr>
62    >
63    Each byte of register data is described by two hex digits.
64
65    read mem
66    @.BAA..AA
67    $FFFFFFXX
68    >
69    AA..AA is address, XXXXXXX is the contents
70
71    write mem
72    @.BAA..AA=$XXXXXXXX
73    >
74    AA..AA is address, XXXXXXXX is data
75
76    cont
77    PC=$AA..AA
78    >RBK
79    R>
80    AA..AA is address to resume. If AA..AA is omitted, resume at same address.
81
82    step
83    PC=$AA..AA
84    >STP
85    R>
86    AA..AA is address to resume. If AA..AA is omitted, resume at same address.
87
88    kill req
89    STP
90    >
91  */
92
93
94 #include <stdio.h>
95 #include <signal.h>
96 #include <sys/ioctl.h>
97 #include <sys/file.h>
98 #include <errno.h>
99 #include <ctype.h>
100 #include <setjmp.h>
101 #include <fcntl.h>
102 #include "defs.h"
103 #include "gdb_string.h"
104 #include "frame.h"
105 #include "inferior.h"
106 #include "target.h"
107 #include "gdb_wait.h"
108 #include "command.h"
109 #include "remote-utils.h"
110 #include "gdbcore.h"
111 #include "serial.h"
112
113 /* Prototypes for local functions */
114
115 static void es1800_child_detach (char *, int);
116
117 static void es1800_child_open (char *, int);
118
119 static void es1800_transparent (char *, int);
120
121 static void es1800_create_inferior (char *, char *, char **);
122
123 static void es1800_load (char *, int);
124
125 static void es1800_kill (void);
126
127 static int verify_break (int);
128
129 static int es1800_remove_breakpoint (CORE_ADDR, char *);
130
131 static int es1800_insert_breakpoint (CORE_ADDR, char *);
132
133 static void es1800_files_info (struct target_ops *);
134
135 static int
136 es1800_xfer_inferior_memory (CORE_ADDR, char *, int, int,
137                              struct target_ops *);
138
139 static void es1800_prepare_to_store (void);
140
141 static int es1800_wait (int, struct target_waitstatus *);
142
143 static void es1800_resume (int, int, enum target_signal);
144
145 static void es1800_detach (char *, int);
146
147 static void es1800_attach (char *, int);
148
149 static int damn_b (char *);
150
151 static void es1800_open (char *, int);
152
153 static void es1800_timer (void);
154
155 static void es1800_reset (char *);
156
157 static void es1800_request_quit (void);
158
159 static int readchar (void);
160
161 static void expect (char *, int);
162
163 static void expect_prompt (void);
164
165 static void download (FILE *, int, int);
166
167 #if 0
168 static void bfd_copy (bfd *, bfd *);
169 #endif
170
171 static void get_break_addr (int, CORE_ADDR *);
172
173 static int fromhex (int);
174
175 static int tohex (int);
176
177 static void es1800_close (int);
178
179 static void es1800_fetch_registers (void);
180
181 static void es1800_fetch_register (int);
182
183 static void es1800_store_register (int);
184
185 static void es1800_read_bytes (CORE_ADDR, char *, int);
186
187 static void es1800_write_bytes (CORE_ADDR, char *, int);
188
189 static void send_with_reply (char *, char *, int);
190
191 static void send_command (char *);
192
193 static void send (char *);
194
195 static void getmessage (char *, int);
196
197 static void es1800_mourn_inferior (void);
198
199 static void es1800_create_break_insn (char *, int);
200
201 static void es1800_init_break (char *, int);
202
203 /* Local variables */
204
205 /* FIXME: Convert this to use "set remotedebug" instead.  */
206 #define LOG_FILE "es1800.log"
207 #if defined (LOG_FILE)
208 static FILE *log_file;
209 #endif
210
211 extern struct target_ops es1800_ops;    /* Forward decl */
212 extern struct target_ops es1800_child_ops;      /* Forward decl */
213
214 static int kiodebug;
215 static int timeout = 100;
216 static char *savename;          /* Name of i/o device used */
217 static serial_ttystate es1800_saved_ttystate;
218 static int es1800_fc_save;      /* Save fcntl state */
219
220 /* indicates that the emulator uses 32-bit data-adress (68020-mode) 
221    instead of 24-bit (68000 -mode) */
222
223 static int m68020;
224
225 #define MODE (m68020 ? "M68020" : "M68000" )
226 #define ES1800_BREAK_VEC (0xf)
227
228 /* Descriptor for I/O to remote machine.  Initialize it to NULL so that
229    es1800_open knows that we don't have a file open when the program
230    starts.  */
231
232 static serial_t es1800_desc = NULL;
233
234 #define PBUFSIZ 1000
235 #define HDRLEN sizeof("@.BAAAAAAAA=$VV\r")
236
237 /* Maximum number of bytes to read/write at once.  The value here
238    is chosen to fill up a packet.  */
239
240 #define MAXBUFBYTES ((PBUFSIZ-150)*16/75 )
241
242 static int es1800_break_vec = 0;
243 static char es1800_break_insn[2];
244 static long es1800_break_address;
245 static void (*old_sigint) ();   /* Old signal-handler for sigint */
246 static jmp_buf interrupt;
247
248 /* Local signalhandler to allow breaking tranfers or program run.
249    Rely on global variables: old_sigint(), interrupt */
250
251 static void
252 es1800_request_quit (void)
253 {
254   /* restore original signalhandler */
255   signal (SIGINT, old_sigint);
256   longjmp (interrupt, 1);
257 }
258
259
260 /* Reset emulator.
261    Sending reset character(octal 32) to emulator.
262    quit - return to '(esgdb)' prompt or continue        */
263
264 static void
265 es1800_reset (char *quit)
266 {
267   char buf[80];
268
269   if (quit)
270     {
271       printf ("\nResetting emulator...  ");
272     }
273   strcpy (buf, "\032");
274   send (buf);
275   expect_prompt ();
276   if (quit)
277     {
278       error ("done\n");
279     }
280 }
281
282
283 /* Open a connection to a remote debugger and push the new target
284    onto the stack. Check if the emulator is responding and find out
285    what kind of processor the emulator is connected to.
286    Initiate the breakpoint handling in the emulator.
287
288    name     - the filename used for communication (ex. '/dev/tta')
289    from_tty - says whether to be verbose or not */
290
291 static void
292 es1800_open (char *name, int from_tty)
293 {
294   char buf[PBUFSIZ];
295   char *p;
296   int i, fcflag;
297
298   m68020 = 0;
299
300   if (!name)                    /* no device name given in target command */
301     {
302       error_no_arg ("serial port device name");
303     }
304
305   target_preopen (from_tty);
306   es1800_close (0);
307
308   /* open the device and configure it for communication */
309
310 #ifndef DEBUG_STDIN
311
312   es1800_desc = SERIAL_OPEN (name);
313   if (es1800_desc == NULL)
314     {
315       perror_with_name (name);
316     }
317   savename = savestring (name, strlen (name));
318
319   es1800_saved_ttystate = SERIAL_GET_TTY_STATE (es1800_desc);
320
321   if ((fcflag = fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_GETFL, 0)) == -1)
322     {
323       perror_with_name ("fcntl serial");
324     }
325   es1800_fc_save = fcflag;
326
327   fcflag = (fcflag & (FREAD | FWRITE));         /* mask out any funny stuff */
328   if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, fcflag) == -1)
329     {
330       perror_with_name ("fcntl serial");
331     }
332
333   if (baud_rate != -1)
334     {
335       if (SERIAL_SETBAUDRATE (es1800_desc, baud_rate))
336         {
337           SERIAL_CLOSE (es1800_desc);
338           perror_with_name (name);
339         }
340     }
341
342   SERIAL_RAW (es1800_desc);
343
344   /* If there is something sitting in the buffer we might take it as a
345      response to a command, which would be bad.  */
346   SERIAL_FLUSH_INPUT (es1800_desc);
347
348 #endif /* DEBUG_STDIN */
349
350   push_target (&es1800_ops);    /* Switch to using remote target now */
351   if (from_tty)
352     {
353       printf ("Remote ES1800 debugging using %s\n", name);
354     }
355
356 #if defined (LOG_FILE)
357
358   log_file = fopen (LOG_FILE, "w");
359   if (log_file == NULL)
360     {
361       perror_with_name (LOG_FILE);
362     }
363
364 #endif /* LOG_FILE */
365
366   /* Hello?  Are you there?, also check mode  */
367
368   /*  send_with_reply( "DB 0 TO 1", buf, sizeof(buf)); */
369   /*  for (p = buf, i = 0; *p++ =='0';)  *//* count the number of zeros */
370   /*      i++; */
371
372   send ("\032");
373   getmessage (buf, sizeof (buf));       /* send reset character */
374
375   if (from_tty)
376     {
377       printf ("Checking mode.... ");
378     }
379   /*  m68020 = (i==8); *//* if eight zeros then we are in m68020 mode */
380
381   /* What kind of processor am i talking to ? */
382   p = buf;
383   while (*p++ != '\n')
384     {;
385     }
386   while (*p++ != '\n')
387     {;
388     }
389   while (*p++ != '\n')
390     {;
391     }
392   for (i = 0; i < 20; i++, p++)
393     {;
394     }
395   m68020 = !strncmp (p, "68020", 5);
396   if (from_tty)
397     {
398       printf ("You are in %s(%c%c%c%c%c)-mode\n", MODE, p[0], p[1], p[2],
399               p[3], p[4]);
400     }
401
402   /* if no init_break statement is present in .gdb file we have to check 
403      whether to download a breakpoint routine or not */
404
405 #if 0
406   if ((es1800_break_vec == 0) || (verify_break (es1800_break_vec) != 0)
407       && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
408     {
409       CORE_ADDR memaddress;
410       printf ("Give the start address of the breakpoint routine: ");
411       scanf ("%li", &memaddress);
412       es1800_init_break ((es1800_break_vec ? es1800_break_vec :
413                           ES1800_BREAK_VEC), memaddress);
414     }
415 #endif
416
417 }
418
419 /*  Close out all files and local state before this target loses control.
420    quitting - are we quitting gdb now? */
421
422 static void
423 es1800_close (int quitting)
424 {
425   if (es1800_desc != NULL)
426     {
427       printf ("\nClosing connection to emulator...\n");
428       if (SERIAL_SET_TTY_STATE (es1800_desc, es1800_saved_ttystate) < 0)
429         print_sys_errmsg ("warning: unable to restore tty state", errno);
430       fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, es1800_fc_save);
431       SERIAL_CLOSE (es1800_desc);
432       es1800_desc = NULL;
433     }
434   if (savename != NULL)
435     {
436       free (savename);
437     }
438   savename = NULL;
439
440 #if defined (LOG_FILE)
441
442   if (log_file != NULL)
443     {
444       if (ferror (log_file))
445         {
446           printf ("Error writing log file.\n");
447         }
448       if (fclose (log_file) != 0)
449         {
450           printf ("Error closing log file.\n");
451         }
452       log_file = NULL;
453     }
454
455 #endif /* LOG_FILE */
456
457 }
458
459 /*  Attaches to a process on the target side
460    proc_id  - the id of the process to be attached.
461    from_tty - says whether to be verbose or not */
462
463 static void
464 es1800_attach (char *args, int from_tty)
465 {
466   error ("Cannot attach to pid %s, this feature is not implemented yet.",
467          args);
468 }
469
470
471 /* Takes a program previously attached to and detaches it.
472    We better not have left any breakpoints
473    in the program or it'll die when it hits one.
474    Close the open connection to the remote debugger.
475    Use this when you want to detach and do something else
476    with your gdb.
477
478    args     - arguments given to the 'detach' command
479    from_tty - says whether to be verbose or not */
480
481 static void
482 es1800_detach (char *args, int from_tty)
483 {
484   if (args)
485     {
486       error ("Argument given to \"detach\" when remotely debugging.");
487     }
488   pop_target ();
489   if (from_tty)
490     {
491       printf ("Ending es1800 remote debugging.\n");
492     }
493 }
494
495
496 /* Tell the remote machine to resume.
497    step    - single-step or run free
498    siggnal - the signal value to be given to the target (0 = no signal) */
499
500 static void
501 es1800_resume (int pid, int step, enum target_signal siggnal)
502 {
503   char buf[PBUFSIZ];
504
505   if (siggnal)
506     {
507       error ("Can't send signals to a remote system.");
508     }
509   if (step)
510     {
511       strcpy (buf, "STP\r");
512       send (buf);
513     }
514   else
515     {
516       send_command ("RBK");
517     }
518 }
519
520 /* Wait until the remote machine stops, then return,
521    storing status in STATUS just as `wait' would.
522    status -  */
523
524 static int
525 es1800_wait (int pid, struct target_waitstatus *status)
526 {
527   unsigned char buf[PBUFSIZ];
528   int old_timeout = timeout;
529
530   status->kind = TARGET_WAITKIND_EXITED;
531   status->value.integer = 0;
532
533   timeout = 0;                  /* Don't time out -- user program is running. */
534   if (!setjmp (interrupt))
535     {
536       old_sigint = signal (SIGINT, es1800_request_quit);
537       while (1)
538         {
539           getmessage (buf, sizeof (buf));
540           if (strncmp (buf, "\r\n* BREAK *", 11) == 0)
541             {
542               status->kind = TARGET_WAITKIND_STOPPED;
543               status->value.sig = TARGET_SIGNAL_TRAP;
544               send_command ("STP");     /* Restore stack and PC and such */
545               if (m68020)
546                 {
547                   send_command ("STP");
548                 }
549               break;
550             }
551           if (strncmp (buf, "STP\r\n ", 6) == 0)
552             {
553               status->kind = TARGET_WAITKIND_STOPPED;
554               status->value.sig = TARGET_SIGNAL_TRAP;
555               break;
556             }
557           if (buf[strlen (buf) - 2] == 'R')
558             {
559               printf ("Unexpected emulator reply: \n%s\n", buf);
560             }
561           else
562             {
563               printf ("Unexpected stop: \n%s\n", buf);
564               status->kind = TARGET_WAITKIND_STOPPED;
565               status->value.sig = TARGET_SIGNAL_QUIT;
566               break;
567             }
568         }
569     }
570   else
571     {
572       fflush (stdin);
573       printf ("\nStopping emulator...");
574       if (!setjmp (interrupt))
575         {
576           old_sigint = signal (SIGINT, es1800_request_quit);
577           send_command ("STP");
578           printf (" emulator stopped\n");
579           status->kind = TARGET_WAITKIND_STOPPED;
580           status->value.sig = TARGET_SIGNAL_INT;
581         }
582       else
583         {
584           fflush (stdin);
585           es1800_reset ((char *) 1);
586         }
587     }
588   signal (SIGINT, old_sigint);
589   timeout = old_timeout;
590   return (0);
591 }
592
593
594 /* Fetch register values from remote machine.
595    regno - the register to be fetched (fetch all registers if -1) */
596
597 static void
598 es1800_fetch_register (int regno)
599 {
600   char buf[PBUFSIZ];
601   int k;
602   int r;
603   char *p;
604   static char regtab[18][4] =
605   {
606     "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
607     "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
608     "SR ", "PC "
609   };
610
611   if ((regno < 15) || (regno == 16) || (regno == 17))
612     {
613       r = regno * 4;
614       send_with_reply (regtab[regno], buf, sizeof (buf));
615       p = buf;
616       for (k = 0; k < 4; k++)
617         {
618           if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
619             {
620               error ("Emulator reply is too short: %s", buf);
621             }
622           registers[r++] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
623         }
624     }
625   else
626     {
627       es1800_fetch_registers ();
628     }
629 }
630
631 /* Read the remote registers into REGISTERS.
632    Always fetches all registers. */
633
634 static void
635 es1800_fetch_registers (void)
636 {
637   char buf[PBUFSIZ];
638   char SR_buf[PBUFSIZ];
639   int i;
640   int k;
641   int r;
642   char *p;
643
644   send_with_reply ("DR", buf, sizeof (buf));
645
646   /* Reply is edited to a string that describes registers byte by byte,
647      each byte encoded as two hex characters.  */
648
649   p = buf;
650   r = 0;
651
652   /*  parsing row one - D0-D7-registers  */
653
654   while (*p++ != '\n')
655     {;
656     }
657   for (i = 4; i < 70; i += (i == 39 ? 3 : 1))
658     {
659       for (k = 0; k < 4; k++)
660         {
661           if (p[i + 0] == 0 || p[i + 1] == 0)
662             {
663               error ("Emulator reply is too short: %s", buf);
664             }
665           registers[r++] = (fromhex (p[i + 0]) * 16) + fromhex (p[i + 1]);
666           i += 2;
667         }
668     }
669   p += i;
670
671   /*  parsing row two - A0-A6-registers  */
672
673   while (*p++ != '\n')
674     {;
675     }
676   for (i = 4; i < 61; i += (i == 39 ? 3 : 1))
677     {
678       for (k = 0; k < 4; k++)
679         {
680           if (p[i + 0] == 0 || p[i + 1] == 0)
681             {
682               error ("Emulator reply is too short: %s", buf);
683             }
684           registers[r++] = (fromhex (p[i + 0])) * 16 + fromhex (p[i + 1]);
685           i += 2;
686         }
687     }
688   p += i;
689
690   while (*p++ != '\n')
691     {;
692     }
693
694   /* fetch SSP-, SR- and PC-registers  */
695
696   /* first - check STATUS-word and decide which stackpointer to use */
697
698   send_with_reply ("SR", SR_buf, sizeof (SR_buf));
699   p = SR_buf;
700   p += 5;
701
702   if (m68020)
703     {
704       if (*p == '3')            /* use masterstackpointer MSP */
705         {
706           send_with_reply ("MSP", buf, sizeof (buf));
707         }
708       else if (*p == '2')       /* use interruptstackpointer ISP  */
709         {
710           send_with_reply ("ISP", buf, sizeof (buf));
711         }
712       else
713         /* use userstackpointer USP  */
714         {
715           send_with_reply ("USP", buf, sizeof (buf));
716         }
717       p = buf;
718       for (k = 0; k < 4; k++)
719         {
720           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
721             {
722               error ("Emulator reply is too short: %s", buf);
723             }
724           registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
725         }
726
727       p = SR_buf;
728       for (k = 0; k < 4; k++)
729         {
730           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
731             {
732               error ("Emulator reply is too short: %s", buf);
733             }
734           registers[r++] =
735             fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
736         }
737       send_with_reply ("PC", buf, sizeof (buf));
738       p = buf;
739       for (k = 0; k < 4; k++)
740         {
741           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
742             {
743               error ("Emulator reply is too short: %s", buf);
744             }
745           registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
746         }
747     }
748   else
749     /* 68000-mode */
750     {
751       if (*p == '2')            /* use supervisorstackpointer SSP  */
752         {
753           send_with_reply ("SSP", buf, sizeof (buf));
754         }
755       else
756         /* use userstackpointer USP  */
757         {
758           send_with_reply ("USP", buf, sizeof (buf));
759         }
760
761       /* fetch STACKPOINTER */
762
763       p = buf;
764       for (k = 0; k < 4; k++)
765         {
766           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
767             {
768               error ("Emulator reply is too short: %s", buf);
769             }
770           registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
771         }
772
773       /* fetch STATUS */
774
775       p = SR_buf;
776       for (k = 0; k < 4; k++)
777         {
778           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
779             {
780               error ("Emulator reply is too short: %s", buf);
781             }
782           registers[r++] =
783             fromhex (SR_buf[k * 2 + 1]) * 16 + fromhex (SR_buf[k * 2 + 2]);
784         }
785
786       /* fetch PC */
787
788       send_with_reply ("PC", buf, sizeof (buf));
789       p = buf;
790       for (k = 0; k < 4; k++)
791         {
792           if (p[k * 2 + 1] == 0 || p[k * 2 + 2] == 0)
793             {
794               error ("Emulator reply is too short: %s", buf);
795             }
796           registers[r++] = fromhex (buf[k * 2 + 1]) * 16 + fromhex (buf[k * 2 + 2]);
797         }
798     }
799 }
800
801 /* Store register value, located in REGISTER, on the target processor.
802    regno - the register-number of the register to store
803    (-1 means store them all)
804    FIXME: Return errno value.  */
805
806 static void
807 es1800_store_register (int regno)
808 {
809
810   static char regtab[18][4] =
811   {
812     "D0 ", "D1 ", "D2 ", "D3 ", "D4 ", "D5 ", "D6 ", "D7 ",
813     "A0 ", "A1 ", "A2 ", "A3 ", "A4 ", "A5 ", "A6 ", "SSP",
814     "SR ", "PC "
815   };
816
817   char buf[PBUFSIZ];
818   char SR_buf[PBUFSIZ];
819   char stack_pointer[4];
820   char *p;
821   int i;
822   int j;
823   int k;
824   unsigned char *r;
825
826   r = (unsigned char *) registers;
827
828   if (regno == -1)              /* write all registers */
829     {
830       j = 0;
831       k = 18;
832     }
833   else
834     /* write one register */
835     {
836       j = regno;
837       k = regno + 1;
838       r += regno * 4;
839     }
840
841   if ((regno == -1) || (regno == 15))
842     {
843       /* fetch current status */
844       send_with_reply ("SR", SR_buf, sizeof (SR_buf));
845       p = SR_buf;
846       p += 5;
847       if (m68020)
848         {
849           if (*p == '3')        /* use masterstackpointer MSP */
850             {
851               strcpy (stack_pointer, "MSP");
852             }
853           else
854             {
855               if (*p == '2')    /* use interruptstackpointer ISP  */
856                 {
857                   strcpy (stack_pointer, "ISP");
858                 }
859               else
860                 {
861                   strcpy (stack_pointer, "USP");        /* use userstackpointer USP  */
862                 }
863             }
864         }
865       else
866         /* 68000-mode */
867         {
868           if (*p == '2')        /* use supervisorstackpointer SSP  */
869             {
870               strcpy (stack_pointer, "SSP");
871             }
872           else
873             {
874               strcpy (stack_pointer, "USP");    /* use userstackpointer USP  */
875             }
876         }
877       strcpy (regtab[15], stack_pointer);
878     }
879
880   for (i = j; i < k; i++)
881     {
882       buf[0] = regtab[i][0];
883       buf[1] = regtab[i][1];
884       buf[2] = regtab[i][2];
885       buf[3] = '=';
886       buf[4] = '$';
887       buf[5] = tohex ((*r >> 4) & 0x0f);
888       buf[6] = tohex (*r++ & 0x0f);
889       buf[7] = tohex ((*r >> 4) & 0x0f);
890       buf[8] = tohex (*r++ & 0x0f);
891       buf[9] = tohex ((*r >> 4) & 0x0f);
892       buf[10] = tohex (*r++ & 0x0f);
893       buf[11] = tohex ((*r >> 4) & 0x0f);
894       buf[12] = tohex (*r++ & 0x0f);
895       buf[13] = 0;
896
897       send_with_reply (buf, buf, sizeof (buf));         /* FIXME, reply not used? */
898     }
899 }
900
901
902 /* Prepare to store registers.  */
903
904 static void
905 es1800_prepare_to_store (void)
906 {
907   /* Do nothing, since we can store individual regs */
908 }
909
910 /* Convert hex digit A to a number.  */
911
912 static int
913 fromhex (int a)
914 {
915   if (a >= '0' && a <= '9')
916     {
917       return a - '0';
918     }
919   else if (a >= 'a' && a <= 'f')
920     {
921       return a - 'a' + 10;
922     }
923   else if (a >= 'A' && a <= 'F')
924     {
925       return a - 'A' + 10;
926     }
927   else
928     {
929       error ("Reply contains invalid hex digit");
930     }
931   return (-1);
932 }
933
934
935 /* Convert number NIB to a hex digit.  */
936
937 static int
938 tohex (int nib)
939 {
940   if (nib < 10)
941     {
942       return ('0' + nib);
943     }
944   else
945     {
946       return ('A' + nib - 10);
947     }
948 }
949
950 /* Read or write LEN bytes from inferior memory at MEMADDR, transferring
951    to or from debugger address MYADDR.  Write to inferior if WRITE is
952    nonzero.  Returns length of data written or read; 0 for error. 
953
954    memaddr - the target's address
955    myaddr  - gdb's address
956    len     - number of bytes 
957    write   - write if != 0 otherwise read       */
958
959 static int
960 es1800_xfer_inferior_memory (memaddr, myaddr, len, write, tops)
961      CORE_ADDR memaddr;
962      char *myaddr;
963      int len;
964      int write;
965      struct target_ops *tops;   /* Unused */
966 {
967   int origlen = len;
968   int xfersize;
969
970   while (len > 0)
971     {
972       xfersize = len > MAXBUFBYTES ? MAXBUFBYTES : len;
973       if (write)
974         {
975           es1800_write_bytes (memaddr, myaddr, xfersize);
976         }
977       else
978         {
979           es1800_read_bytes (memaddr, myaddr, xfersize);
980         }
981       memaddr += xfersize;
982       myaddr += xfersize;
983       len -= xfersize;
984     }
985   return (origlen);             /* no error possible */
986 }
987
988
989 /* Write memory data directly to the emulator.
990    This does not inform the data cache; the data cache uses this.
991    MEMADDR is the address in the remote memory space.
992    MYADDR is the address of the buffer in our space.
993    LEN is the number of bytes.
994
995    memaddr - the target's address
996    myaddr  - gdb's address
997    len     - number of bytes   */
998
999 static void
1000 es1800_write_bytes (CORE_ADDR memaddr, char *myaddr, int len)
1001 {
1002   char buf[PBUFSIZ];
1003   int i;
1004   char *p;
1005
1006   p = myaddr;
1007   for (i = 0; i < len; i++)
1008     {
1009       sprintf (buf, "@.B$%x=$%x", memaddr + i, (*p++) & 0xff);
1010       send_with_reply (buf, buf, sizeof (buf));         /* FIXME send_command? */
1011     }
1012 }
1013
1014
1015 /* Read memory data directly from the emulator.
1016    This does not use the data cache; the data cache uses this.
1017
1018    memaddr - the target's address
1019    myaddr  - gdb's address
1020    len     - number of bytes   */
1021
1022 static void
1023 es1800_read_bytes (CORE_ADDR memaddr, char *myaddr, int len)
1024 {
1025   static int DB_tab[16] =
1026   {8, 11, 14, 17, 20, 23, 26, 29, 34, 37, 40, 43, 46, 49, 52, 55};
1027   char buf[PBUFSIZ];
1028   int i;
1029   int low_addr;
1030   char *p;
1031   char *b;
1032
1033   if (len > PBUFSIZ / 2 - 1)
1034     {
1035       abort ();
1036     }
1037
1038   if (len == 1)                 /* The emulator does not like expressions like:  */
1039     {
1040       len = 2;                  /* DB.B $20018 TO $20018                       */
1041     }
1042
1043   /* Reply describes registers byte by byte, each byte encoded as two hex
1044      characters.  */
1045
1046   sprintf (buf, "DB.B $%x TO $%x", memaddr, memaddr + len - 1);
1047   send_with_reply (buf, buf, sizeof (buf));
1048   b = buf;
1049   low_addr = memaddr & 0x0f;
1050   for (i = low_addr; i < low_addr + len; i++)
1051     {
1052       if ((!(i % 16)) && i)
1053         {                       /* if (i = 16,32,48)  */
1054           while (*p++ != '\n')
1055             {;
1056             }
1057           b = p;
1058         }
1059       p = b + DB_tab[i % 16] + (m68020 ? 2 : 0);
1060       if (p[0] == 32 || p[1] == 32)
1061         {
1062           error ("Emulator reply is too short: %s", buf);
1063         }
1064       myaddr[i - low_addr] = fromhex (p[0]) * 16 + fromhex (p[1]);
1065     }
1066 }
1067
1068 /* Information about the current target  */
1069
1070 static void
1071 es1800_files_info (tops)
1072      struct target_ops *tops;   /* Unused */
1073 {
1074   printf ("ES1800 Attached to %s at %d baud in %s mode\n", savename, 19200,
1075           MODE);
1076 }
1077
1078
1079 /* We read the contents of the target location and stash it,
1080    then overwrite it with a breakpoint instruction.
1081
1082    addr           - is the target location in the target machine.
1083    contents_cache - is a pointer to memory allocated for saving the target contents.
1084    It is guaranteed by the caller to be long enough to save sizeof 
1085    BREAKPOINT bytes.
1086
1087    FIXME: This size is target_arch dependent and should be available in
1088    the target_arch transfer vector, if we ever have one...  */
1089
1090 static int
1091 es1800_insert_breakpoint (CORE_ADDR addr, char *contents_cache)
1092 {
1093   int val;
1094
1095   val = target_read_memory (addr, contents_cache, sizeof (es1800_break_insn));
1096
1097   if (val == 0)
1098     {
1099       val = target_write_memory (addr, es1800_break_insn,
1100                                  sizeof (es1800_break_insn));
1101     }
1102
1103   return (val);
1104 }
1105
1106
1107 /* Write back the stashed instruction
1108
1109    addr           - is the target location in the target machine.
1110    contents_cache - is a pointer to memory allocated for saving the target contents.
1111    It is guaranteed by the caller to be long enough to save sizeof 
1112    BREAKPOINT bytes.    */
1113
1114 static int
1115 es1800_remove_breakpoint (CORE_ADDR addr, char *contents_cache)
1116 {
1117
1118   return (target_write_memory (addr, contents_cache,
1119                                sizeof (es1800_break_insn)));
1120 }
1121
1122 /* create_break_insn ()
1123    Primitive datastructures containing the es1800 breakpoint instruction  */
1124
1125 static void
1126 es1800_create_break_insn (char *ins, int vec)
1127 {
1128   if (vec == 15)
1129     {
1130       ins[0] = 0x4e;
1131       ins[1] = 0x4f;
1132     }
1133 }
1134
1135
1136 /* verify_break ()
1137    Seach for breakpoint routine in emulator memory.
1138    returns non-zero on failure
1139    vec - trap vector used for breakpoints  */
1140
1141 static int
1142 verify_break (int vec)
1143 {
1144   CORE_ADDR memaddress;
1145   char buf[8];
1146   char *instr = "NqNqNqNs";     /* breakpoint routine */
1147   int status;
1148
1149   get_break_addr (vec, &memaddress);
1150
1151   if (memaddress)
1152     {
1153       status = target_read_memory (memaddress, buf, 8);
1154       if (status != 0)
1155         {
1156           memory_error (status, memaddress);
1157         }
1158       return (STRCMP (instr, buf));
1159     }
1160   return (-1);
1161 }
1162
1163
1164 /* get_break_addr ()
1165    find address of breakpint routine
1166    vec - trap vector used for breakpoints
1167    addrp - store the address here       */
1168
1169 static void
1170 get_break_addr (int vec, CORE_ADDR *addrp)
1171 {
1172   CORE_ADDR memaddress = 0;
1173   int status;
1174   int k;
1175   char buf[PBUFSIZ];
1176   char base_addr[4];
1177   char *p;
1178
1179   if (m68020)
1180     {
1181       send_with_reply ("VBR ", buf, sizeof (buf));
1182       p = buf;
1183       for (k = 0; k < 4; k++)
1184         {
1185           if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
1186             {
1187               error ("Emulator reply is too short: %s", buf);
1188             }
1189           base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
1190         }
1191       /* base addr of exception vector table */
1192       memaddress = *((CORE_ADDR *) base_addr);
1193     }
1194
1195   memaddress += (vec + 32) * 4; /* address of trap vector */
1196   status = target_read_memory (memaddress, (char *) addrp, 4);
1197   if (status != 0)
1198     {
1199       memory_error (status, memaddress);
1200     }
1201 }
1202
1203
1204 /* Kill an inferior process */
1205
1206 static void
1207 es1800_kill (void)
1208 {
1209   if (inferior_pid != 0)
1210     {
1211       inferior_pid = 0;
1212       es1800_mourn_inferior ();
1213     }
1214 }
1215
1216
1217 /* Load a file to the ES1800 emulator. 
1218    Converts the file from a.out format into Extended Tekhex format
1219    before the file is loaded.
1220    Also loads the trap routine, and sets the ES1800 breakpoint on it
1221    filename - the a.out to be loaded
1222    from_tty - says whether to be verbose or not
1223    FIXME Uses emulator overlay memory for trap routine  */
1224
1225 static void
1226 es1800_load (char *filename, int from_tty)
1227 {
1228
1229   FILE *instream;
1230   char loadname[15];
1231   char buf[160];
1232   struct cleanup *old_chain;
1233   int es1800_load_format = 5;
1234
1235   if (es1800_desc == NULL)
1236     {
1237       printf ("No emulator attached, type emulator-command first\n");
1238       return;
1239     }
1240
1241   filename = tilde_expand (filename);
1242   make_cleanup (free, filename);
1243
1244   switch (es1800_load_format)
1245     {
1246     case 2:                     /* Extended Tekhex  */
1247       if (from_tty)
1248         {
1249           printf ("Converting \"%s\" to Extended Tekhex Format\n", filename);
1250         }
1251       sprintf (buf, "tekhex %s", filename);
1252       system (buf);
1253       sprintf (loadname, "out.hex");
1254       break;
1255
1256     case 5:                     /* Motorola S-rec  */
1257       if (from_tty)
1258         {
1259           printf ("Converting \"%s\" to Motorola S-record format\n",
1260                   filename);
1261         }
1262       /* in the future the source code in copy (part of binutils-1.93) will
1263          be included in this file */
1264       sprintf (buf,
1265                "copy -s \"a.out-sunos-big\" -d \"srec\" %s /tmp/out.hex",
1266                filename);
1267       system (buf);
1268       sprintf (loadname, "/tmp/out.hex");
1269       break;
1270
1271     default:
1272       error ("Downloading format not defined\n");
1273     }
1274
1275   breakpoint_init_inferior ();
1276   inferior_pid = 0;
1277   if (from_tty)
1278     {
1279       printf ("Downloading \"%s\" to the ES 1800\n", filename);
1280     }
1281   if ((instream = fopen (loadname, "r")) == NULL)
1282     {
1283       perror_with_name ("fopen:");
1284     }
1285
1286   old_chain = make_cleanup (fclose, instream);
1287   immediate_quit++;
1288
1289   es1800_reset (0);
1290
1291   download (instream, from_tty, es1800_load_format);
1292
1293   /* if breakpoint routine is not present anymore we have to check 
1294      whether to download a new breakpoint routine or not */
1295
1296   if ((verify_break (es1800_break_vec) != 0)
1297       && query ("No breakpoint routine in ES 1800 emulator!\nDownload a breakpoint routine to the emulator? "))
1298     {
1299       char buf[128];
1300       printf ("Using break vector 0x%x\n", es1800_break_vec);
1301       sprintf (buf, "0x%x ", es1800_break_vec);
1302       printf ("Give the start address of the breakpoint routine: ");
1303       fgets (buf + strlen (buf), sizeof (buf) - strlen (buf), stdin);
1304       es1800_init_break (buf, 0);
1305     }
1306
1307   do_cleanups (old_chain);
1308   expect_prompt ();
1309   readchar ();                  /* FIXME I am getting a ^G = 7 after the prompt  */
1310   printf ("\n");
1311
1312   if (fclose (instream) == EOF)
1313     {
1314       ;
1315     }
1316
1317   if (es1800_load_format != 2)
1318     {
1319       sprintf (buf, "/usr/bin/rm %s", loadname);
1320       system (buf);
1321     }
1322
1323   symbol_file_command (filename, from_tty);     /* reading symbol table */
1324   immediate_quit--;
1325 }
1326
1327 #if 0
1328
1329 #define NUMCPYBYTES 20
1330
1331 static void
1332 bfd_copy (bfd *from_bfd, bfd *to_bfd)
1333 {
1334   asection *p, *new;
1335   int i;
1336   char buf[NUMCPYBYTES];
1337
1338   for (p = from_bfd->sections; p != NULL; p = p->next)
1339     {
1340       printf ("  Copying section %s. Size = %x.\n", p->name, p->_cooked_size);
1341       printf ("    vma = %x,  offset = %x,  output_sec = %x\n",
1342               p->vma, p->output_offset, p->output_section);
1343       new = bfd_make_section (to_bfd, p->name);
1344       if (p->_cooked_size &&
1345           !bfd_set_section_size (to_bfd, new, p->_cooked_size))
1346         {
1347           error ("Wrong BFD size!\n");
1348         }
1349       if (!bfd_set_section_flags (to_bfd, new, p->flags))
1350         {
1351           error ("bfd_set_section_flags");
1352         }
1353       new->vma = p->vma;
1354
1355       for (i = 0; (i + NUMCPYBYTES) < p->_cooked_size; i += NUMCPYBYTES)
1356         {
1357           if (!bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1358                                          (bfd_size_type) NUMCPYBYTES))
1359             {
1360               error ("bfd_get_section_contents\n");
1361             }
1362           if (!bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1363                                          (bfd_size_type) NUMCPYBYTES))
1364             {
1365               error ("bfd_set_section_contents\n");
1366             }
1367         }
1368       bfd_get_section_contents (from_bfd, p, (PTR) buf, (file_ptr) i,
1369                                 (bfd_size_type) (p->_cooked_size - i));
1370       bfd_set_section_contents (to_bfd, new, (PTR) buf, (file_ptr) i,
1371                                 (bfd_size_type) (p->_cooked_size - i));
1372     }
1373 }
1374
1375 #endif
1376
1377 /* Start an process on the es1800 and set inferior_pid to the new
1378    process' pid.
1379    execfile - the file to run
1380    args     - arguments passed to the program
1381    env      - the environment vector to pass    */
1382
1383 static void
1384 es1800_create_inferior (char *execfile, char *args, char **env)
1385 {
1386   int entry_pt;
1387   int pid;
1388 #if 0
1389   struct expression *expr;
1390   register struct cleanup *old_chain = 0;
1391   register value val;
1392 #endif
1393
1394   if (args && *args)
1395     {
1396       error ("Can't pass arguments to remote ES1800 process");
1397     }
1398
1399 #if 0
1400   if (query ("Use 'start' as entry point? "))
1401     {
1402       expr = parse_c_expression ("start");
1403       old_chain = make_cleanup (free_current_contents, &expr);
1404       val = evaluate_expression (expr);
1405       entry_pt = (val->location).address;
1406     }
1407   else
1408     {
1409       printf ("Enter the program's entry point (in hexadecimal): ");
1410       scanf ("%x", &entry_pt);
1411     }
1412 #endif
1413
1414   if (execfile == 0 || exec_bfd == 0)
1415     {
1416       error ("No executable file specified");
1417     }
1418
1419   entry_pt = (int) bfd_get_start_address (exec_bfd);
1420
1421   pid = 42;
1422
1423   /* Now that we have a child process, make it our target.  */
1424
1425   push_target (&es1800_child_ops);
1426
1427   /* The "process" (board) is already stopped awaiting our commands, and
1428      the program is already downloaded.  We just set its PC and go.  */
1429
1430   inferior_pid = pid;           /* Needed for wait_for_inferior below */
1431
1432   clear_proceed_status ();
1433
1434   /* Tell wait_for_inferior that we've started a new process.  */
1435
1436   init_wait_for_inferior ();
1437
1438   /* Set up the "saved terminal modes" of the inferior
1439      based on what modes we are starting it with.  */
1440
1441   target_terminal_init ();
1442
1443   /* Install inferior's terminal modes.  */
1444
1445   target_terminal_inferior ();
1446
1447   /* remote_start (args); */
1448   /* trap_expected = 0; */
1449   /* insert_step_breakpoint ();  FIXME, do we need this?  */
1450
1451   /* Let 'er rip... */
1452   proceed ((CORE_ADDR) entry_pt, TARGET_SIGNAL_DEFAULT, 0);
1453
1454 }
1455
1456
1457 /* The process has died, clean up.  */
1458
1459 static void
1460 es1800_mourn_inferior (void)
1461 {
1462   remove_breakpoints ();
1463   unpush_target (&es1800_child_ops);
1464   generic_mourn_inferior ();    /* Do all the proper things now */
1465 }
1466
1467 /* ES1800-protocol specific routines */
1468
1469 /* Keep discarding input from the remote system, until STRING is found. 
1470    Let the user break out immediately. 
1471    string - the string to expect
1472    nowait - break out if string not the emulator's first respond otherwise
1473    read until string is found (== 0)   */
1474
1475 static void
1476 expect (char *string, int nowait)
1477 {
1478   char c;
1479   char *p = string;
1480
1481   immediate_quit++;
1482   while (1)
1483     {
1484       c = readchar ();
1485       if (isalpha (c))
1486         {
1487           c = toupper (c);
1488         }
1489       if (c == toupper (*p))
1490         {
1491           p++;
1492           if (*p == '\0')
1493             {
1494               immediate_quit--;
1495               return;
1496             }
1497         }
1498       else if (!nowait)
1499         {
1500           p = string;
1501         }
1502       else
1503         {
1504           printf ("\'%s\' expected\n", string);
1505           printf ("char %d is %d", p - string, c);
1506           error ("\n");
1507         }
1508     }
1509 }
1510
1511 /* Keep discarding input until we see the prompt.  */
1512
1513 static void
1514 expect_prompt (void)
1515 {
1516   expect (">", 0);
1517 }
1518
1519
1520 /* Read one character */
1521
1522 #ifdef DEBUG_STDIN
1523
1524 /* read from stdin */
1525
1526 static int
1527 readchar (void)
1528 {
1529   char buf[1];
1530
1531   buf[0] = '\0';
1532   printf ("readchar, give one character\n");
1533   read (0, buf, 1);
1534
1535 #if defined (LOG_FILE)
1536   putc (buf[0] & 0x7f, log_file);
1537 #endif
1538
1539   return (buf[0] & 0x7f);
1540 }
1541
1542 #else /* !DEBUG_STDIN */
1543
1544 /* Read a character from the remote system, doing all the fancy
1545    timeout stuff.  */
1546
1547 static int
1548 readchar (void)
1549 {
1550   int ch;
1551
1552   ch = SERIAL_READCHAR (es1800_desc, timeout);
1553
1554   /* FIXME: doing an error() here will probably cause trouble, at least if from
1555      es1800_wait.  */
1556   if (ch == SERIAL_TIMEOUT)
1557     error ("Timeout reading from remote system.");
1558   else if (ch == SERIAL_ERROR)
1559     perror_with_name ("remote read");
1560
1561 #if defined (LOG_FILE)
1562   putc (ch & 0x7f, log_file);
1563   fflush (log_file);
1564 #endif
1565
1566   return (ch);
1567 }
1568
1569 #endif /* DEBUG_STDIN */
1570
1571
1572 /* Send a command to the emulator and save the reply.
1573    Report an error if we get an error reply.
1574    string - the es1800 command
1575    buf    - containing the emulator reply on return
1576    len    - size of buf  */
1577
1578 static void
1579 send_with_reply (char *string, char *buf, int len)
1580 {
1581   send (string);
1582   SERIAL_WRITE (es1800_desc, "\r", 1);
1583
1584 #ifndef DEBUG_STDIN
1585   expect (string, 1);
1586   expect ("\r\n", 0);
1587 #endif
1588
1589   getmessage (buf, len);
1590 }
1591
1592
1593 /* Send the command in STR to the emulator adding \r. check
1594    the echo for consistency. 
1595    string - the es1800 command  */
1596
1597 static void
1598 send_command (char *string)
1599 {
1600   send (string);
1601   SERIAL_WRITE (es1800_desc, "\r", 1);
1602
1603 #ifndef DEBUG_STDIN
1604   expect (string, 0);
1605   expect_prompt ();
1606 #endif
1607
1608 }
1609
1610 /* Send a string
1611    string - the es1800 command  */
1612
1613 static void
1614 send (char *string)
1615 {
1616   if (kiodebug)
1617     {
1618       fprintf (stderr, "Sending: %s\n", string);
1619     }
1620   SERIAL_WRITE (es1800_desc, string, strlen (string));
1621 }
1622
1623
1624 /* Read a message from the emulator and store it in BUF. 
1625    buf    - containing the emulator reply on return
1626    len    - size of buf  */
1627
1628 static void
1629 getmessage (char *buf, int len)
1630 {
1631   char *bp;
1632   int c;
1633   int prompt_found = 0;
1634   extern kiodebug;
1635
1636 #if defined (LOG_FILE)
1637   /* This is a convenient place to do this.  The idea is to do it often
1638      enough that we never lose much data if we terminate abnormally.  */
1639   fflush (log_file);
1640 #endif
1641
1642   bp = buf;
1643   c = readchar ();
1644   do
1645     {
1646       if (c)
1647         {
1648           if (len-- < 2)        /* char and terminaling NULL */
1649             {
1650               error ("input buffer overrun\n");
1651             }
1652           *bp++ = c;
1653         }
1654       c = readchar ();
1655       if ((c == '>') && (*(bp - 1) == ' '))
1656         {
1657           prompt_found = 1;
1658         }
1659     }
1660   while (!prompt_found);
1661   *bp = 0;
1662
1663   if (kiodebug)
1664     {
1665       fprintf (stderr, "message received :%s\n", buf);
1666     }
1667 }
1668
1669 static void
1670 download (FILE *instream, int from_tty, int format)
1671 {
1672   char c;
1673   char buf[160];
1674   int i = 0;
1675
1676   send_command ("SET #2,$1A");  /* reset char = ^Z */
1677   send_command ("SET #3,$11,$13");      /* XON  XOFF */
1678   if (format == 2)
1679     {
1680       send_command ("SET #26,#2");
1681     }
1682   else
1683     {
1684       send_command ("SET #26,#5");      /* Format=Extended Tekhex */
1685     }
1686   send_command ("DFB = $10");
1687   send_command ("PUR");
1688   send_command ("CES");
1689   send ("DNL\r");
1690   expect ("DNL", 1);
1691   if (from_tty)
1692     {
1693       printf ("    0 records loaded...\r");
1694     }
1695   while (fgets (buf, 160, instream))
1696     {
1697       send (buf);
1698       if (from_tty)
1699         {
1700           printf ("%5d\b\b\b\b\b", ++i);
1701           fflush (stdout);
1702         }
1703       if ((c = readchar ()) != 006)
1704         {
1705           error ("expected ACK");
1706         }
1707     }
1708   if (from_tty)
1709     {
1710       printf ("- All");
1711     }
1712 }
1713
1714 /* Additional commands */
1715
1716 #if defined (TIOCGETP) && defined (FNDELAY) && defined (EWOULDBLOCK)
1717 #define PROVIDE_TRANSPARENT
1718 #endif
1719
1720 #ifdef PROVIDE_TRANSPARENT
1721 /* Talk directly to the emulator
1722    FIXME, uses busy wait, and is SUNOS (or at least BSD) specific  */
1723
1724 /*ARGSUSED */
1725 static void
1726 es1800_transparent (char *args, int from_tty)
1727 {
1728   int console;
1729   struct sgttyb modebl;
1730   int fcflag;
1731   int cc;
1732   struct sgttyb console_mode_save;
1733   int console_fc_save;
1734   int es1800_fc_save;
1735   int inputcnt = 80;
1736   char inputbuf[80];
1737   int consolecnt = 0;
1738   char consolebuf[80];
1739   int es1800_cnt = 0;
1740   char es1800_buf[80];
1741   int i;
1742
1743   dont_repeat ();
1744   if (es1800_desc == NULL)
1745     {
1746       printf ("No emulator attached, type emulator-command first\n");
1747       return;
1748     }
1749
1750   printf ("\n");
1751   printf ("You are now communicating directly with the ES 1800 emulator.\n");
1752   printf ("To leave this mode (transparent mode), press ^E.\n");
1753   printf ("\n");
1754   printf (" >");
1755   fflush (stdout);
1756
1757   if ((console = open ("/dev/tty", O_RDWR)) == -1)
1758     {
1759       perror_with_name ("/dev/tty:");
1760     }
1761
1762   if ((fcflag = fcntl (console, F_GETFL, 0)) == -1)
1763     {
1764       perror_with_name ("fcntl console");
1765     }
1766
1767   console_fc_save = fcflag;
1768   fcflag = fcflag | FNDELAY;
1769
1770   if (fcntl (console, F_SETFL, fcflag) == -1)
1771     {
1772       perror_with_name ("fcntl console");
1773     }
1774
1775   if (ioctl (console, TIOCGETP, &modebl))
1776     {
1777       perror_with_name ("ioctl console");
1778     }
1779
1780   console_mode_save = modebl;
1781   modebl.sg_flags = RAW;
1782
1783   if (ioctl (console, TIOCSETP, &modebl))
1784     {
1785       perror_with_name ("ioctl console");
1786     }
1787
1788   if ((fcflag = fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_GETFL, 0)) == -1)
1789     {
1790       perror_with_name ("fcntl serial");
1791     }
1792
1793   es1800_fc_save = fcflag;
1794   fcflag = fcflag | FNDELAY;
1795
1796   if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, fcflag) == -1)
1797     {
1798       perror_with_name ("fcntl serial");
1799     }
1800
1801   while (1)
1802     {
1803       cc = read (console, inputbuf, inputcnt);
1804       if (cc != -1)
1805         {
1806           if ((*inputbuf & 0x7f) == 0x05)
1807             {
1808               break;
1809             }
1810           for (i = 0; i < cc;)
1811             {
1812               es1800_buf[es1800_cnt++] = inputbuf[i++];
1813             }
1814           if ((cc = SERIAL_WRITE (es1800_desc, es1800_buf, es1800_cnt)) == -1)
1815             {
1816               perror_with_name ("FEL! write:");
1817             }
1818           es1800_cnt -= cc;
1819           if (es1800_cnt && cc)
1820             {
1821               for (i = 0; i < es1800_cnt; i++)
1822                 {
1823                   es1800_buf[i] = es1800_buf[cc + i];
1824                 }
1825             }
1826         }
1827       else if (errno != EWOULDBLOCK)
1828         {
1829           perror_with_name ("FEL! read:");
1830         }
1831
1832       cc = read (DEPRECATED_SERIAL_FD (es1800_desc), inputbuf, inputcnt);
1833       if (cc != -1)
1834         {
1835           for (i = 0; i < cc;)
1836             {
1837               consolebuf[consolecnt++] = inputbuf[i++];
1838             }
1839           if ((cc = write (console, consolebuf, consolecnt)) == -1)
1840             {
1841               perror_with_name ("FEL! write:");
1842             }
1843           consolecnt -= cc;
1844           if (consolecnt && cc)
1845             {
1846               for (i = 0; i < consolecnt; i++)
1847                 {
1848                   consolebuf[i] = consolebuf[cc + i];
1849                 }
1850             }
1851         }
1852       else if (errno != EWOULDBLOCK)
1853         {
1854           perror_with_name ("FEL! read:");
1855         }
1856     }
1857
1858   console_fc_save = console_fc_save & !FNDELAY;
1859   if (fcntl (console, F_SETFL, console_fc_save) == -1)
1860     {
1861       perror_with_name ("FEL! fcntl");
1862     }
1863
1864   if (ioctl (console, TIOCSETP, &console_mode_save))
1865     {
1866       perror_with_name ("FEL! ioctl");
1867     }
1868
1869   close (console);
1870
1871   if (fcntl (DEPRECATED_SERIAL_FD (es1800_desc), F_SETFL, es1800_fc_save) == -1)
1872     {
1873       perror_with_name ("FEL! fcntl");
1874     }
1875
1876   printf ("\n");
1877
1878 }
1879 #endif /* PROVIDE_TRANSPARENT */
1880
1881 static void
1882 es1800_init_break (char *args, int from_tty)
1883 {
1884   CORE_ADDR memaddress = 0;
1885   char buf[PBUFSIZ];
1886   char base_addr[4];
1887   char *space_index;
1888   char *p;
1889   int k;
1890
1891   if (args == NULL)
1892     {
1893       error_no_arg ("a trap vector");
1894     }
1895
1896   if (!(space_index = strchr (args, ' ')))
1897     {
1898       error ("Two arguments needed (trap vector and address of break routine).\n");
1899     }
1900
1901   *space_index = '\0';
1902
1903   es1800_break_vec = strtol (args, (char **) NULL, 0);
1904   es1800_break_address = parse_and_eval_address (space_index + 1);
1905
1906   es1800_create_break_insn (es1800_break_insn, es1800_break_vec);
1907
1908   if (m68020)
1909     {
1910       send_with_reply ("VBR ", buf, sizeof (buf));
1911       p = buf;
1912       for (k = 0; k < 4; k++)
1913         {
1914           if ((p[k * 2 + 1] == 0) || (p[k * 2 + 2] == 0))
1915             {
1916               error ("Emulator reply is too short: %s", buf);
1917             }
1918           base_addr[k] = (fromhex (p[k * 2 + 1]) * 16) + fromhex (p[k * 2 + 2]);
1919         }
1920       /* base addr of exception vector table */
1921       memaddress = *((CORE_ADDR *) base_addr);
1922     }
1923
1924   memaddress += (es1800_break_vec + 32) * 4;    /* address of trap vector */
1925
1926   sprintf (buf, "@.L%lx=$%lx", memaddress, es1800_break_address);
1927   send_command (buf);           /* set the address of the break routine in the */
1928   /* trap vector */
1929
1930   sprintf (buf, "@.L%lx=$4E714E71", es1800_break_address);      /* NOP; NOP */
1931   send_command (buf);
1932   sprintf (buf, "@.L%lx=$4E714E73", es1800_break_address + 4);  /* NOP; RTE */
1933   send_command (buf);
1934
1935   sprintf (buf, "AC2=$%lx", es1800_break_address + 4);
1936   /* breakpoint at es1800-break_address */
1937   send_command (buf);
1938   send_command ("WHEN AC2 THEN BRK");   /* ie in exception routine */
1939
1940   if (from_tty)
1941     {
1942       printf ("Breakpoint (trap $%x) routine at address: %lx\n",
1943               es1800_break_vec, es1800_break_address);
1944     }
1945 }
1946
1947 static void
1948 es1800_child_open (char *arg, int from_tty)
1949 {
1950   error ("Use the \"run\" command to start a child process.");
1951 }
1952
1953 static void
1954 es1800_child_detach (char *args, int from_tty)
1955 {
1956   if (args)
1957     {
1958       error ("Argument given to \"detach\" when remotely debugging.");
1959     }
1960
1961   pop_target ();
1962   if (from_tty)
1963     {
1964       printf ("Ending debugging the process %d.\n", inferior_pid);
1965     }
1966 }
1967
1968
1969 /* Define the target subroutine names  */
1970
1971 struct target_ops es1800_ops;
1972
1973 static void
1974 init_es1800_ops (void)
1975 {
1976   es1800_ops.to_shortname = "es1800";
1977   es1800_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
1978   es1800_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
1979 Specify the serial device it is connected to (e.g. /dev/ttya).";
1980   es1800_ops.to_open = es1800_open;
1981   es1800_ops.to_close = es1800_close;
1982   es1800_ops.to_attach = es1800_attach;
1983   es1800_ops.to_post_attach = NULL;
1984   es1800_ops.to_require_attach = NULL;
1985   es1800_ops.to_detach = es1800_detach;
1986   es1800_ops.to_require_detach = NULL;
1987   es1800_ops.to_resume = es1800_resume;
1988   es1800_ops.to_wait = NULL;
1989   es1800_ops.to_post_wait = NULL;
1990   es1800_ops.to_fetch_registers = NULL;
1991   es1800_ops.to_store_registers = NULL;
1992   es1800_ops.to_prepare_to_store = es1800_prepare_to_store;
1993   es1800_ops.to_xfer_memory = es1800_xfer_inferior_memory;
1994   es1800_ops.to_files_info = es1800_files_info;
1995   es1800_ops.to_insert_breakpoint = es1800_insert_breakpoint;
1996   es1800_ops.to_remove_breakpoint = es1800_remove_breakpoint;
1997   es1800_ops.to_terminal_init = NULL;
1998   es1800_ops.to_terminal_inferior = NULL;
1999   es1800_ops.to_terminal_ours_for_output = NULL;
2000   es1800_ops.to_terminal_ours = NULL;
2001   es1800_ops.to_terminal_info = NULL;
2002   es1800_ops.to_kill = NULL;
2003   es1800_ops.to_load = es1800_load;
2004   es1800_ops.to_lookup_symbol = NULL;
2005   es1800_ops.to_create_inferior = es1800_create_inferior;
2006   es1800_ops.to_post_startup_inferior = NULL;
2007   es1800_ops.to_acknowledge_created_inferior = NULL;
2008   es1800_ops.to_clone_and_follow_inferior = NULL;
2009   es1800_ops.to_post_follow_inferior_by_clone = NULL;
2010   es1800_ops.to_insert_fork_catchpoint = NULL;
2011   es1800_ops.to_remove_fork_catchpoint = NULL;
2012   es1800_ops.to_insert_vfork_catchpoint = NULL;
2013   es1800_ops.to_remove_vfork_catchpoint = NULL;
2014   es1800_ops.to_has_forked = NULL;
2015   es1800_ops.to_has_vforked = NULL;
2016   es1800_ops.to_can_follow_vfork_prior_to_exec = NULL;
2017   es1800_ops.to_post_follow_vfork = NULL;
2018   es1800_ops.to_insert_exec_catchpoint = NULL;
2019   es1800_ops.to_remove_exec_catchpoint = NULL;
2020   es1800_ops.to_has_execd = NULL;
2021   es1800_ops.to_reported_exec_events_per_exec_call = NULL;
2022   es1800_ops.to_has_exited = NULL;
2023   es1800_ops.to_mourn_inferior = NULL;
2024   es1800_ops.to_can_run = 0;
2025   es1800_ops.to_notice_signals = 0;
2026   es1800_ops.to_thread_alive = 0;
2027   es1800_ops.to_stop = 0;
2028   es1800_ops.to_pid_to_exec_file = NULL;
2029   es1800_ops.to_core_file_to_sym_file = NULL;
2030   es1800_ops.to_stratum = core_stratum;
2031   es1800_ops.DONT_USE = 0;
2032   es1800_ops.to_has_all_memory = 0;
2033   es1800_ops.to_has_memory = 1;
2034   es1800_ops.to_has_stack = 0;
2035   es1800_ops.to_has_registers = 0;
2036   es1800_ops.to_has_execution = 0;
2037   es1800_ops.to_sections = NULL;
2038   es1800_ops.to_sections_end = NULL;
2039   es1800_ops.to_magic = OPS_MAGIC;
2040 }
2041
2042 /* Define the target subroutine names  */
2043
2044 struct target_ops es1800_child_ops;
2045
2046 static void
2047 init_es1800_child_ops (void)
2048 {
2049   es1800_child_ops.to_shortname = "es1800_process";
2050   es1800_child_ops.to_longname = "Remote serial target in ES1800-emulator protocol";
2051   es1800_child_ops.to_doc = "Remote debugging on the es1800 emulator via a serial line.\n\
2052 Specify the serial device it is connected to (e.g. /dev/ttya).";
2053   es1800_child_ops.to_open = es1800_child_open;
2054   es1800_child_ops.to_close = NULL;
2055   es1800_child_ops.to_attach = es1800_attach;
2056   es1800_child_ops.to_post_attach = NULL;
2057   es1800_child_ops.to_require_attach = NULL;
2058   es1800_child_ops.to_detach = es1800_child_detach;
2059   es1800_child_ops.to_require_detach = NULL;
2060   es1800_child_ops.to_resume = es1800_resume;
2061   es1800_child_ops.to_wait = es1800_wait;
2062   es1800_child_ops.to_post_wait = NULL;
2063   es1800_child_ops.to_fetch_registers = es1800_fetch_register;
2064   es1800_child_ops.to_store_registers = es1800_store_register;
2065   es1800_child_ops.to_prepare_to_store = es1800_prepare_to_store;
2066   es1800_child_ops.to_xfer_memory = es1800_xfer_inferior_memory;
2067   es1800_child_ops.to_files_info = es1800_files_info;
2068   es1800_child_ops.to_insert_breakpoint = es1800_insert_breakpoint;
2069   es1800_child_ops.to_remove_breakpoint = es1800_remove_breakpoint;
2070   es1800_child_ops.to_terminal_init = NULL;
2071   es1800_child_ops.to_terminal_inferior = NULL;
2072   es1800_child_ops.to_terminal_ours_for_output = NULL;
2073   es1800_child_ops.to_terminal_ours = NULL;
2074   es1800_child_ops.to_terminal_info = NULL;
2075   es1800_child_ops.to_kill = es1800_kill;
2076   es1800_child_ops.to_load = es1800_load;
2077   es1800_child_ops.to_lookup_symbol = NULL;
2078   es1800_child_ops.to_create_inferior = es1800_create_inferior;
2079   es1800_child_ops.to_post_startup_inferior = NULL;
2080   es1800_child_ops.to_acknowledge_created_inferior = NULL;
2081   es1800_child_ops.to_clone_and_follow_inferior = NULL;
2082   es1800_child_ops.to_post_follow_inferior_by_clone = NULL;
2083   es1800_child_ops.to_insert_fork_catchpoint = NULL;
2084   es1800_child_ops.to_remove_fork_catchpoint = NULL;
2085   es1800_child_ops.to_insert_vfork_catchpoint = NULL;
2086   es1800_child_ops.to_remove_vfork_catchpoint = NULL;
2087   es1800_child_ops.to_has_forked = NULL;
2088   es1800_child_ops.to_has_vforked = NULL;
2089   es1800_child_ops.to_can_follow_vfork_prior_to_exec = NULL;
2090   es1800_child_ops.to_post_follow_vfork = NULL;
2091   es1800_child_ops.to_insert_exec_catchpoint = NULL;
2092   es1800_child_ops.to_remove_exec_catchpoint = NULL;
2093   es1800_child_ops.to_has_execd = NULL;
2094   es1800_child_ops.to_reported_exec_events_per_exec_call = NULL;
2095   es1800_child_ops.to_has_exited = NULL;
2096   es1800_child_ops.to_mourn_inferior = es1800_mourn_inferior;
2097   es1800_child_ops.to_can_run = 0;
2098   es1800_child_ops.to_notice_signals = 0;
2099   es1800_child_ops.to_thread_alive = 0;
2100   es1800_child_ops.to_stop = 0;
2101   es1800_child_ops.to_pid_to_exec_file = NULL;
2102   es1800_child_ops.to_core_file_to_sym_file = NULL;
2103   es1800_child_ops.to_stratum = process_stratum;
2104   es1800_child_ops.DONT_USE = 0;
2105   es1800_child_ops.to_has_all_memory = 1;
2106   es1800_child_ops.to_has_memory = 1;
2107   es1800_child_ops.to_has_stack = 1;
2108   es1800_child_ops.to_has_registers = 1;
2109   es1800_child_ops.to_has_execution = 1;
2110   es1800_child_ops.to_sections = NULL;
2111   es1800_child_ops.to_sections_end = NULL;
2112   es1800_child_ops.to_magic = OPS_MAGIC;
2113 }
2114
2115 void
2116 _initialize_es1800 (void)
2117 {
2118   init_es1800_ops ();
2119   init_es1800_child_ops ();
2120   add_target (&es1800_ops);
2121   add_target (&es1800_child_ops);
2122 #ifdef PROVIDE_TRANSPARENT
2123   add_com ("transparent", class_support, es1800_transparent,
2124            "Start transparent communication with the ES 1800 emulator.");
2125 #endif /* PROVIDE_TRANSPARENT */
2126   add_com ("init_break", class_support, es1800_init_break,
2127          "Download break routine and initialize break facility on ES 1800");
2128 }