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