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