2009-12-09 Yoshinori Sato <ysato@users.sourceforge.jp>
[external/binutils.git] / sim / h8300 / compile.c
1 /*
2  * Simulator for the Renesas (formerly Hitachi) H8/300 architecture.
3  *
4  * Written by Steve Chamberlain of Cygnus Support. sac@cygnus.com
5  *
6  * This file is part of H8/300 sim
7  *
8  *
9  * THIS SOFTWARE IS NOT COPYRIGHTED
10  *
11  * Cygnus offers the following for use in the public domain.  Cygnus makes no
12  * warranty with regard to the software or its performance and the user
13  * accepts the software "AS IS" with all faults.
14  *
15  * CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS
16  * SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
17  * AND FITNESS FOR A PARTICULAR PURPOSE.
18  */
19
20 #include <signal.h>
21 #ifdef HAVE_TIME_H
22 #include <time.h>
23 #endif
24 #ifdef HAVE_STDLIB_H
25 #include <stdlib.h>
26 #endif
27 #ifdef HAVE_SYS_PARAM_H
28 #include <sys/param.h>
29 #endif
30
31 #include "bfd.h"
32 #include "sim-main.h"
33 #include "gdb/sim-h8300.h"
34 #include "sys/stat.h"
35 #include "sys/types.h"
36
37 #ifndef SIGTRAP
38 # define SIGTRAP 5
39 #endif
40
41 int debug;
42
43 host_callback *sim_callback;
44
45 static SIM_OPEN_KIND sim_kind;
46 static char *myname;
47
48 /* FIXME: Needs to live in header file.
49    This header should also include the things in remote-sim.h.
50    One could move this to remote-sim.h but this function isn't needed
51    by gdb.  */
52 static void set_simcache_size (SIM_DESC, int);
53
54 #define X(op, size)  (op * 4 + size)
55
56 #define SP (h8300hmode && !h8300_normal_mode ? SL : SW)
57
58 #define h8_opcodes ops
59 #define DEFINE_TABLE
60 #include "opcode/h8300.h"
61
62 /* CPU data object: */
63
64 static int
65 sim_state_initialize (SIM_DESC sd, sim_cpu *cpu)
66 {
67   /* FIXME: not really necessary, since sim_cpu_alloc calls zalloc.  */
68
69   memset (&cpu->regs, 0, sizeof(cpu->regs));
70   cpu->regs[SBR_REGNUM] = 0xFFFFFF00;
71   cpu->pc = 0;
72   cpu->delayed_branch = 0;
73   cpu->memory = NULL;
74   cpu->eightbit = NULL;
75   cpu->mask = 0;
76
77   /* Initialize local simulator state.  */
78   sd->sim_cache = NULL;
79   sd->sim_cache_size = 0;
80   sd->cache_idx = NULL;
81   sd->cache_top = 0;
82   sd->memory_size = 0;
83   sd->compiles = 0;
84 #ifdef ADEBUG
85   memset (&cpu->stats, 0, sizeof (cpu->stats));
86 #endif
87   return 0;
88 }
89
90 static unsigned int
91 h8_get_pc (SIM_DESC sd)
92 {
93   return (STATE_CPU (sd, 0)) -> pc;
94 }
95
96 static void
97 h8_set_pc (SIM_DESC sd, unsigned int val)
98 {
99   (STATE_CPU (sd, 0)) -> pc = val;
100 }
101
102 static unsigned int
103 h8_get_ccr (SIM_DESC sd)
104 {
105   return (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM];
106 }
107
108 static void
109 h8_set_ccr (SIM_DESC sd, unsigned int val)
110 {
111   (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM] = val;
112 }
113
114 static unsigned int
115 h8_get_exr (SIM_DESC sd)
116 {
117   return (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM];
118 }
119
120 static void
121 h8_set_exr (SIM_DESC sd, unsigned int val)
122 {
123   (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM] = val;
124 }
125
126 static int
127 h8_get_sbr (SIM_DESC sd)
128 {
129   return (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM];
130 }
131
132 static void
133 h8_set_sbr (SIM_DESC sd, int val)
134 {
135   (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM] = val;
136 }
137
138 static int
139 h8_get_vbr (SIM_DESC sd)
140 {
141   return (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM];
142 }
143
144 static void
145 h8_set_vbr (SIM_DESC sd, int val)
146 {
147   (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM] = val;
148 }
149
150 static int
151 h8_get_cache_top (SIM_DESC sd)
152 {
153   return sd -> cache_top;
154 }
155
156 static void
157 h8_set_cache_top (SIM_DESC sd, int val)
158 {
159   sd -> cache_top = val;
160 }
161
162 static int
163 h8_get_mask (SIM_DESC sd)
164 {
165   return (STATE_CPU (sd, 0)) -> mask;
166 }
167
168 static void
169 h8_set_mask (SIM_DESC sd, int val)
170 {
171   (STATE_CPU (sd, 0)) -> mask = val;
172 }
173 #if 0
174 static int
175 h8_get_exception (SIM_DESC sd)
176 {
177   return (STATE_CPU (sd, 0)) -> exception;
178 }
179
180 static void
181 h8_set_exception (SIM_DESC sd, int val)
182 {
183   (STATE_CPU (sd, 0)) -> exception = val;
184 }
185
186 static enum h8300_sim_state
187 h8_get_state (SIM_DESC sd)
188 {
189   return sd -> state;
190 }
191
192 static void
193 h8_set_state (SIM_DESC sd, enum h8300_sim_state val)
194 {
195   sd -> state = val;
196 }
197 #endif
198 static unsigned int
199 h8_get_cycles (SIM_DESC sd)
200 {
201   return (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM];
202 }
203
204 static void
205 h8_set_cycles (SIM_DESC sd, unsigned int val)
206 {
207   (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM] = val;
208 }
209
210 static unsigned int
211 h8_get_insts (SIM_DESC sd)
212 {
213   return (STATE_CPU (sd, 0)) -> regs[INST_REGNUM];
214 }
215
216 static void
217 h8_set_insts (SIM_DESC sd, unsigned int val)
218 {
219   (STATE_CPU (sd, 0)) -> regs[INST_REGNUM] = val;
220 }
221
222 static unsigned int
223 h8_get_ticks (SIM_DESC sd)
224 {
225   return (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM];
226 }
227
228 static void
229 h8_set_ticks (SIM_DESC sd, unsigned int val)
230 {
231   (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM] = val;
232 }
233
234 static unsigned int
235 h8_get_mach (SIM_DESC sd)
236 {
237   return (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM];
238 }
239
240 static void
241 h8_set_mach (SIM_DESC sd, unsigned int val)
242 {
243   (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM] = val;
244 }
245
246 static unsigned int
247 h8_get_macl (SIM_DESC sd)
248 {
249   return (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM];
250 }
251
252 static void
253 h8_set_macl (SIM_DESC sd, unsigned int val)
254 {
255   (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM] = val;
256 }
257
258 static int
259 h8_get_compiles (SIM_DESC sd)
260 {
261   return sd -> compiles;
262 }
263
264 static void
265 h8_increment_compiles (SIM_DESC sd)
266 {
267   sd -> compiles ++;
268 }
269
270 static unsigned int *
271 h8_get_reg_buf (SIM_DESC sd)
272 {
273   return &(((STATE_CPU (sd, 0)) -> regs)[0]);
274 }
275
276 static unsigned int
277 h8_get_reg (SIM_DESC sd, int regnum)
278 {
279   return (STATE_CPU (sd, 0)) -> regs[regnum];
280 }
281
282 static void
283 h8_set_reg (SIM_DESC sd, int regnum, int val)
284 {
285   (STATE_CPU (sd, 0)) -> regs[regnum] = val;
286 }
287
288 #ifdef ADEBUG
289 static int
290 h8_get_stats (SIM_DESC sd, int idx)
291 {
292   return sd -> stats[idx];
293 }
294
295 static void
296 h8_increment_stats (SIM_DESC sd, int idx)
297 {
298   sd -> stats[idx] ++;
299 }
300 #endif /* ADEBUG */
301
302 static unsigned short *
303 h8_get_cache_idx_buf (SIM_DESC sd)
304 {
305   return sd -> cache_idx;
306 }
307
308 static void
309 h8_set_cache_idx_buf (SIM_DESC sd, unsigned short *ptr)
310 {
311   sd -> cache_idx = ptr;
312 }
313
314 static unsigned short
315 h8_get_cache_idx (SIM_DESC sd, unsigned int idx)
316 {
317   if (idx > sd->memory_size)
318     return (unsigned short) -1;
319   return sd -> cache_idx[idx];
320 }
321
322 static void
323 h8_set_cache_idx (SIM_DESC sd, int idx, unsigned int val)
324 {
325   sd -> cache_idx[idx] = (unsigned short) val;
326 }
327
328 static unsigned char *
329 h8_get_memory_buf (SIM_DESC sd)
330 {
331   return (STATE_CPU (sd, 0)) -> memory;
332 }
333
334 static void
335 h8_set_memory_buf (SIM_DESC sd, unsigned char *ptr)
336 {
337   (STATE_CPU (sd, 0)) -> memory = ptr;
338 }
339
340 static unsigned char
341 h8_get_memory (SIM_DESC sd, int idx)
342 {
343   return (STATE_CPU (sd, 0)) -> memory[idx];
344 }
345
346 static void
347 h8_set_memory (SIM_DESC sd, int idx, unsigned int val)
348 {
349   (STATE_CPU (sd, 0)) -> memory[idx] = (unsigned char) val;
350 }
351
352 static unsigned char *
353 h8_get_eightbit_buf (SIM_DESC sd)
354 {
355   return (STATE_CPU (sd, 0)) -> eightbit;
356 }
357
358 static void
359 h8_set_eightbit_buf (SIM_DESC sd, unsigned char *ptr)
360 {
361   (STATE_CPU (sd, 0)) -> eightbit = ptr;
362 }
363
364 static unsigned char
365 h8_get_eightbit (SIM_DESC sd, int idx)
366 {
367   return (STATE_CPU (sd, 0)) -> eightbit[idx];
368 }
369
370 static void
371 h8_set_eightbit (SIM_DESC sd, int idx, unsigned int val)
372 {
373   (STATE_CPU (sd, 0)) -> eightbit[idx] = (unsigned char) val;
374 }
375
376 static unsigned int
377 h8_get_delayed_branch (SIM_DESC sd)
378 {
379   return (STATE_CPU (sd, 0)) -> delayed_branch;
380 }
381
382 static void
383 h8_set_delayed_branch (SIM_DESC sd, unsigned int dest)
384 {
385   (STATE_CPU (sd, 0)) -> delayed_branch = dest;
386 }
387
388 static char **
389 h8_get_command_line (SIM_DESC sd)
390 {
391   return (STATE_CPU (sd, 0)) -> command_line;
392 }
393
394 static void
395 h8_set_command_line (SIM_DESC sd, char ** val)
396 {
397   (STATE_CPU (sd, 0)) -> command_line = val;
398 }
399
400 static char *
401 h8_get_cmdline_arg (SIM_DESC sd, int index)
402 {
403   return (STATE_CPU (sd, 0)) -> command_line[index];
404 }
405
406 static void
407 h8_set_cmdline_arg (SIM_DESC sd, int index, char * val)
408 {
409   (STATE_CPU (sd, 0)) -> command_line[index] = val;
410 }
411
412 /* MAC Saturation Mode */
413 static int
414 h8_get_macS (SIM_DESC sd)
415 {
416   return (STATE_CPU (sd, 0)) -> macS;
417 }
418
419 static void
420 h8_set_macS (SIM_DESC sd, int val)
421 {
422   (STATE_CPU (sd, 0)) -> macS = (val != 0);
423 }
424
425 /* MAC Zero Flag */
426 static int
427 h8_get_macZ (SIM_DESC sd)
428 {
429   return (STATE_CPU (sd, 0)) -> macZ;
430 }
431
432 static void
433 h8_set_macZ (SIM_DESC sd, int val)
434 {
435   (STATE_CPU (sd, 0)) -> macZ = (val != 0);
436 }
437
438 /* MAC Negative Flag */
439 static int
440 h8_get_macN (SIM_DESC sd)
441 {
442   return (STATE_CPU (sd, 0)) -> macN;
443 }
444
445 static void
446 h8_set_macN (SIM_DESC sd, int val)
447 {
448   (STATE_CPU (sd, 0)) -> macN = (val != 0);
449 }
450
451 /* MAC Overflow Flag */
452 static int
453 h8_get_macV (SIM_DESC sd)
454 {
455   return (STATE_CPU (sd, 0)) -> macV;
456 }
457
458 static void
459 h8_set_macV (SIM_DESC sd, int val)
460 {
461   (STATE_CPU (sd, 0)) -> macV = (val != 0);
462 }
463
464 /* End CPU data object.  */
465
466 /* The rate at which to call the host's poll_quit callback.  */
467
468 enum { POLL_QUIT_INTERVAL = 0x80000 };
469
470 #define LOW_BYTE(x) ((x) & 0xff)
471 #define HIGH_BYTE(x) (((x) >> 8) & 0xff)
472 #define P(X, Y) ((X << 8) | Y)
473
474 #define C (c != 0)
475 #define Z (nz == 0)
476 #define V (v != 0)
477 #define N (n != 0)
478 #define U (u != 0)
479 #define H (h != 0)
480 #define UI (ui != 0)
481 #define I (intMaskBit != 0)
482
483 #define BUILDSR(SD)                                             \
484   h8_set_ccr (SD, (I << 7) | (UI << 6) | (H << 5) | (U << 4)    \
485              | (N << 3) | (Z << 2) | (V << 1) | C)
486
487 #define GETSR(SD) \
488   /* Get Status Register (flags).  */           \
489   c = (h8_get_ccr (sd) >> 0) & 1;               \
490   v = (h8_get_ccr (sd) >> 1) & 1;               \
491   nz = !((h8_get_ccr (sd) >> 2) & 1);           \
492   n = (h8_get_ccr (sd) >> 3) & 1;               \
493   u = (h8_get_ccr (sd) >> 4) & 1;               \
494   h = (h8_get_ccr (sd) >> 5) & 1;               \
495   ui = ((h8_get_ccr (sd) >> 6) & 1);            \
496   intMaskBit = (h8_get_ccr (sd) >> 7) & 1
497
498
499 #ifdef __CHAR_IS_SIGNED__
500 #define SEXTCHAR(x) ((char) (x))
501 #endif
502
503 #ifndef SEXTCHAR
504 #define SEXTCHAR(x) ((x & 0x80) ? (x | ~0xff) : x & 0xff)
505 #endif
506
507 #define UEXTCHAR(x) ((x) & 0xff)
508 #define UEXTSHORT(x) ((x) & 0xffff)
509 #define SEXTSHORT(x) ((short) (x))
510
511 int h8300hmode  = 0;
512 int h8300smode  = 0;
513 int h8300_normal_mode  = 0;
514 int h8300sxmode = 0;
515
516 static int memory_size;
517
518 static int
519 get_now (void)
520 {
521   return time (0);      /* WinXX HAS UNIX like 'time', so why not use it? */
522 }
523
524 static int
525 now_persec (void)
526 {
527   return 1;
528 }
529
530 static int
531 bitfrom (int x)
532 {
533   switch (x & SIZE)
534     {
535     case L_8:
536       return SB;
537     case L_16:
538     case L_16U:
539       return SW;
540     case L_32:
541       return SL;
542     case L_P:
543       return (h8300hmode && !h8300_normal_mode)? SL : SW;
544     }
545   return 0;
546 }
547
548 /* Simulate an indirection / dereference.  
549    return 0 for success, -1 for failure.
550 */
551
552 static unsigned int
553 lvalue (SIM_DESC sd, int x, int rn, unsigned int *val)
554 {
555   if (val == NULL)      /* Paranoia.  */
556     return -1;
557
558   switch (x / 4)
559     {
560     case OP_DISP:
561       if (rn == ZERO_REGNUM)
562         *val = X (OP_IMM, SP);
563       else
564         *val = X (OP_REG, SP);
565       break;
566     case OP_MEM:
567       *val = X (OP_MEM, SP);
568       break;
569     default:
570       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
571       return -1;
572     }
573   return 0;
574 }
575
576 static int
577 cmdline_location()
578 {
579   if (h8300smode && !h8300_normal_mode)
580     return 0xffff00L;
581   else if (h8300hmode && !h8300_normal_mode)
582     return 0x2ff00L;
583   else
584     return 0xff00L;
585 }
586
587 static void
588 decode (SIM_DESC sd, int addr, unsigned char *data, decoded_inst *dst)
589 {
590   int cst[3]   = {0, 0, 0};
591   int reg[3]   = {0, 0, 0};
592   int rdisp[3] = {0, 0, 0};
593   int opnum;
594   const struct h8_opcode *q;
595
596   dst->dst.type = -1;
597   dst->src.type = -1;
598
599   /* Find the exact opcode/arg combo.  */
600   for (q = h8_opcodes; q->name; q++)
601     {
602       const op_type *nib = q->data.nib;
603       unsigned int len = 0;
604
605       if ((q->available == AV_H8SX && !h8300sxmode) ||
606           (q->available == AV_H8S  && !h8300smode)  ||
607           (q->available == AV_H8H  && !h8300hmode))
608         continue;
609
610       cst[0]   = cst[1]   = cst[2]   = 0;
611       reg[0]   = reg[1]   = reg[2]   = 0;
612       rdisp[0] = rdisp[1] = rdisp[2] = 0;
613
614       while (1)
615         {
616           op_type looking_for = *nib;
617           int thisnib = data[len / 2];
618
619           thisnib = (len & 1) ? (thisnib & 0xf) : ((thisnib >> 4) & 0xf);
620           opnum = ((looking_for & OP3) ? 2 :
621                    (looking_for & DST) ? 1 : 0);
622
623           if (looking_for < 16 && looking_for >= 0)
624             {
625               if (looking_for != thisnib)
626                 goto fail;
627             }
628           else
629             {
630               if (looking_for & B31)
631                 {
632                   if (!((thisnib & 0x8) != 0))
633                     goto fail;
634
635                   looking_for = (op_type) (looking_for & ~B31);
636                   thisnib &= 0x7;
637                 }
638               else if (looking_for & B30)
639                 {
640                   if (!((thisnib & 0x8) == 0))
641                     goto fail;
642
643                   looking_for = (op_type) (looking_for & ~B30);
644                 }
645
646               if (looking_for & B21)
647                 {
648                   if (!((thisnib & 0x4) != 0))
649                     goto fail;
650
651                   looking_for = (op_type) (looking_for & ~B21);
652                   thisnib &= 0xb;
653                 }
654               else if (looking_for & B20)
655                 {
656                   if (!((thisnib & 0x4) == 0))
657                     goto fail;
658
659                   looking_for = (op_type) (looking_for & ~B20);
660                 }
661
662               if (looking_for & B11)
663                 {
664                   if (!((thisnib & 0x2) != 0))
665                     goto fail;
666
667                   looking_for = (op_type) (looking_for & ~B11);
668                   thisnib &= 0xd;
669                 }
670               else if (looking_for & B10)
671                 {
672                   if (!((thisnib & 0x2) == 0))
673                     goto fail;
674
675                   looking_for = (op_type) (looking_for & ~B10);
676                 }
677
678               if (looking_for & B01)
679                 {
680                   if (!((thisnib & 0x1) != 0))
681                     goto fail;
682
683                   looking_for = (op_type) (looking_for & ~B01);
684                   thisnib &= 0xe;
685                 }
686               else if (looking_for & B00)
687                 {
688                   if (!((thisnib & 0x1) == 0))
689                     goto fail;
690
691                   looking_for = (op_type) (looking_for & ~B00);
692                 }
693
694               if (looking_for & IGNORE)
695                 {
696                   /* Hitachi has declared that IGNORE must be zero.  */
697                   if (thisnib != 0)
698                     goto fail;
699                 }
700               else if ((looking_for & MODE) == DATA)
701                 {
702                   ;                     /* Skip embedded data.  */
703                 }
704               else if ((looking_for & MODE) == DBIT)
705                 {
706                   /* Exclude adds/subs by looking at bit 0 and 2, and
707                      make sure the operand size, either w or l,
708                      matches by looking at bit 1.  */
709                   if ((looking_for & 7) != (thisnib & 7))
710                     goto fail;
711
712                   cst[opnum] = (thisnib & 0x8) ? 2 : 1;
713                 }
714               else if ((looking_for & MODE) == REG     ||
715                        (looking_for & MODE) == LOWREG  ||
716                        (looking_for & MODE) == IND     ||
717                        (looking_for & MODE) == PREINC  ||
718                        (looking_for & MODE) == POSTINC ||
719                        (looking_for & MODE) == PREDEC  ||
720                        (looking_for & MODE) == POSTDEC)
721                 {
722                   reg[opnum] = thisnib;
723                 }
724               else if (looking_for & CTRL)
725                 {
726                   thisnib &= 7;
727                   if (((looking_for & MODE) == CCR  && (thisnib != C_CCR))  ||
728                       ((looking_for & MODE) == EXR  && (thisnib != C_EXR))  ||
729                       ((looking_for & MODE) == MACH && (thisnib != C_MACH)) ||
730                       ((looking_for & MODE) == MACL && (thisnib != C_MACL)) ||
731                       ((looking_for & MODE) == VBR  && (thisnib != C_VBR))  ||
732                       ((looking_for & MODE) == SBR  && (thisnib != C_SBR)))
733                     goto fail;
734                   if (((looking_for & MODE) == CCR_EXR && 
735                        (thisnib != C_CCR && thisnib != C_EXR)) ||
736                       ((looking_for & MODE) == VBR_SBR && 
737                        (thisnib != C_VBR && thisnib != C_SBR)) ||
738                       ((looking_for & MODE) == MACREG && 
739                        (thisnib != C_MACH && thisnib != C_MACL)))
740                     goto fail;
741                   if (((looking_for & MODE) == CC_EX_VB_SB && 
742                        (thisnib != C_CCR && thisnib != C_EXR &&
743                         thisnib != C_VBR && thisnib != C_SBR)))
744                     goto fail;
745
746                   reg[opnum] = thisnib;
747                 }
748               else if ((looking_for & MODE) == ABS)
749                 {
750                   /* Absolute addresses are unsigned.  */
751                   switch (looking_for & SIZE)
752                     {
753                     case L_8:
754                       cst[opnum] = UEXTCHAR (data[len / 2]);
755                       break;
756                     case L_16:
757                     case L_16U:
758                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
759                       break;
760                     case L_32:
761                       cst[opnum] = 
762                         (data[len / 2 + 0] << 24) + 
763                         (data[len / 2 + 1] << 16) +
764                         (data[len / 2 + 2] <<  8) +  
765                         (data[len / 2 + 3]);
766                       break;
767                     default:
768                       printf ("decode: bad size ABS: %d\n", 
769                               (looking_for & SIZE));
770                       goto end;
771                     }
772                 }
773               else if ((looking_for & MODE) == DISP   ||
774                        (looking_for & MODE) == PCREL  ||
775                        (looking_for & MODE) == INDEXB ||
776                        (looking_for & MODE) == INDEXW ||
777                        (looking_for & MODE) == INDEXL)
778                 {
779                   switch (looking_for & SIZE)
780                     {
781                     case L_2:
782                       cst[opnum] = thisnib & 3;
783                       break;
784                     case L_8:
785                       cst[opnum] = SEXTCHAR (data[len / 2]);
786                       break;
787                     case L_16:
788                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
789                       cst[opnum] = (short) cst[opnum];  /* Sign extend.  */
790                       break;
791                     case L_16U:
792                       cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
793                       break;
794                     case L_32:
795                       cst[opnum] = 
796                         (data[len / 2 + 0] << 24) + 
797                         (data[len / 2 + 1] << 16) +
798                         (data[len / 2 + 2] <<  8) +  
799                         (data[len / 2 + 3]);
800                       break;
801                     default:
802                       printf ("decode: bad size DISP/PCREL/INDEX: %d\n", 
803                               (looking_for & SIZE));
804                       goto end;
805                     }
806                 }
807               else if ((looking_for & SIZE) == L_16 ||
808                        (looking_for & SIZE) == L_16U)
809                 {
810                   cst[opnum] = (data[len / 2] << 8) + data[len / 2 + 1];
811                   /* Immediates are always unsigned.  */
812                   if ((looking_for & SIZE) != L_16U &&
813                       (looking_for & MODE) != IMM)
814                     cst[opnum] = (short) cst[opnum];    /* Sign extend.  */
815                 }
816               else if (looking_for & ABSJMP)
817                 {
818                   switch (looking_for & SIZE) {
819                   case L_24:
820                     cst[opnum] = (data[1] << 16) | (data[2] << 8) | (data[3]);
821                     break;
822                   case L_32:
823                     cst[opnum] = 
824                       (data[len / 2 + 0] << 24) + 
825                       (data[len / 2 + 1] << 16) +
826                       (data[len / 2 + 2] <<  8) +  
827                       (data[len / 2 + 3]);
828                     break;
829                   default:
830                     printf ("decode: bad size ABSJMP: %d\n", 
831                             (looking_for & SIZE));
832                       goto end;
833                   }
834                 }
835               else if ((looking_for & MODE) == MEMIND)
836                 {
837                   cst[opnum] = data[1];
838                 }
839               else if ((looking_for & MODE) == VECIND)
840                 {
841                   if(h8300_normal_mode)
842                     cst[opnum] = ((data[1] & 0x7f) + 0x80) * 2;
843                   else
844                     cst[opnum] = ((data[1] & 0x7f) + 0x80) * 4;
845                   cst[opnum] += h8_get_vbr (sd); /* Add vector base reg.  */
846                 }
847               else if ((looking_for & SIZE) == L_32)
848                 {
849                   int i = len / 2;
850
851                   cst[opnum] = 
852                     (data[i + 0] << 24) |
853                     (data[i + 1] << 16) |
854                     (data[i + 2] <<  8) |
855                     (data[i + 3]);
856                 }
857               else if ((looking_for & SIZE) == L_24)
858                 {
859                   int i = len / 2;
860
861                   cst[opnum] = 
862                     (data[i + 0] << 16) | 
863                     (data[i + 1] << 8) | 
864                     (data[i + 2]);
865                 }
866               else if (looking_for & DISPREG)
867                 {
868                   rdisp[opnum] = thisnib & 0x7;
869                 }
870               else if ((looking_for & MODE) == KBIT)
871                 {
872                   switch (thisnib)
873                     {
874                     case 9:
875                       cst[opnum] = 4;
876                       break;
877                     case 8:
878                       cst[opnum] = 2;
879                       break;
880                     case 0:
881                       cst[opnum] = 1;
882                       break;
883                     default:
884                       goto fail;
885                     }
886                 }
887               else if ((looking_for & SIZE) == L_8)
888                 {
889                   if ((looking_for & MODE) == ABS)
890                     {
891                       /* Will be combined with contents of SBR_REGNUM
892                          by fetch ().  For all modes except h8sx, this
893                          will always contain the value 0xFFFFFF00.  */
894                       cst[opnum] = data[len / 2] & 0xff;
895                     }
896                   else
897                     {
898                       cst[opnum] = data[len / 2] & 0xff;
899                     }
900                 }
901               else if ((looking_for & SIZE) == L_2)
902                 {
903                   cst[opnum] = thisnib & 3;
904                 }
905               else if ((looking_for & SIZE) == L_3 ||
906                        (looking_for & SIZE) == L_3NZ)
907                 {
908                   cst[opnum] = thisnib & 7;
909                   if (cst[opnum] == 0 && (looking_for & SIZE) == L_3NZ)
910                     goto fail;
911                 }
912               else if ((looking_for & SIZE) == L_4)
913                 {
914                   cst[opnum] = thisnib & 15;
915                 }
916               else if ((looking_for & SIZE) == L_5)
917                 {
918                   cst[opnum] = data[len / 2] & 0x1f;
919                 }
920               else if (looking_for == E)
921                 {
922 #ifdef ADEBUG
923                   dst->op = q;
924 #endif
925                   /* Fill in the args.  */
926                   {
927                     const op_type *args = q->args.nib;
928                     int hadone = 0;
929                     int nargs;
930
931                     for (nargs = 0; 
932                          nargs < 3 && *args != E; 
933                          nargs++)
934                       {
935                         int x = *args;
936                         ea_type *p;
937
938                         opnum = ((x & OP3) ? 2 :
939                                  (x & DST) ? 1 : 0);
940                         if (x & DST)
941                           p = &dst->dst;
942                         else if (x & OP3)
943                           p = &dst->op3;
944                         else
945                           p = &dst->src;
946
947                         if ((x & MODE) == IMM  ||
948                             (x & MODE) == KBIT ||
949                             (x & MODE) == DBIT)
950                           {
951                             /* Use the instruction to determine 
952                                the operand size.  */
953                             p->type = X (OP_IMM, OP_SIZE (q->how));
954                             p->literal = cst[opnum];
955                           }
956                         else if ((x & MODE) == CONST_2 ||
957                                  (x & MODE) == CONST_4 ||
958                                  (x & MODE) == CONST_8 ||
959                                  (x & MODE) == CONST_16)
960                           {
961                             /* Use the instruction to determine 
962                                the operand size.  */
963                             p->type = X (OP_IMM, OP_SIZE (q->how));
964                             switch (x & MODE) {
965                             case CONST_2:       p->literal =  2; break;
966                             case CONST_4:       p->literal =  4; break;
967                             case CONST_8:       p->literal =  8; break;
968                             case CONST_16:      p->literal = 16; break;
969                             }
970                           }
971                         else if ((x & MODE) == REG)
972                           {
973                             p->type = X (OP_REG, bitfrom (x));
974                             p->reg = reg[opnum];
975                           }
976                         else if ((x & MODE) == LOWREG)
977                           {
978                             p->type = X (OP_LOWREG, bitfrom (x));
979                             p->reg = reg[opnum];
980                           }
981                         else if ((x & MODE) == PREINC)
982                           {
983                             /* Use the instruction to determine 
984                                the operand size.  */
985                             p->type = X (OP_PREINC, OP_SIZE (q->how));
986                             p->reg = reg[opnum] & 0x7;
987                           }
988                         else if ((x & MODE) == POSTINC)
989                           {
990                             /* Use the instruction to determine 
991                                the operand size.  */
992                             p->type = X (OP_POSTINC, OP_SIZE (q->how));
993                             p->reg = reg[opnum] & 0x7;
994                           }
995                         else if ((x & MODE) == PREDEC)
996                           {
997                             /* Use the instruction to determine 
998                                the operand size.  */
999                             p->type = X (OP_PREDEC, OP_SIZE (q->how));
1000                             p->reg = reg[opnum] & 0x7;
1001                           }
1002                         else if ((x & MODE) == POSTDEC)
1003                           {
1004                             /* Use the instruction to determine 
1005                                the operand size.  */
1006                             p->type = X (OP_POSTDEC, OP_SIZE (q->how));
1007                             p->reg = reg[opnum] & 0x7;
1008                           }
1009                         else if ((x & MODE) == IND)
1010                           {
1011                             /* Note: an indirect is transformed into
1012                                a displacement of zero.  
1013                             */
1014                             /* Use the instruction to determine 
1015                                the operand size.  */
1016                             p->type = X (OP_DISP, OP_SIZE (q->how));
1017                             p->reg = reg[opnum] & 0x7;
1018                             p->literal = 0;
1019                             if (OP_KIND (q->how) == O_JSR ||
1020                                 OP_KIND (q->how) == O_JMP)
1021                               if (lvalue (sd, p->type, p->reg, (unsigned int *)&p->type))
1022                                 goto end;
1023                           }
1024                         else if ((x & MODE) == ABS)
1025                           {
1026                             /* Note: a 16 or 32 bit ABS is transformed into a 
1027                                displacement from pseudo-register ZERO_REGNUM,
1028                                which is always zero.  An 8 bit ABS becomes
1029                                a displacement from SBR_REGNUM.
1030                             */
1031                             /* Use the instruction to determine 
1032                                the operand size.  */
1033                             p->type = X (OP_DISP, OP_SIZE (q->how));
1034                             p->literal = cst[opnum];
1035
1036                             /* 8-bit ABS is displacement from SBR.
1037                                16 and 32-bit ABS are displacement from ZERO.
1038                                (SBR will always be zero except for h8/sx)
1039                             */
1040                             if ((x & SIZE) == L_8)
1041                               p->reg = SBR_REGNUM;
1042                             else
1043                               p->reg = ZERO_REGNUM;;
1044                           }
1045                         else if ((x & MODE) == MEMIND ||
1046                                  (x & MODE) == VECIND)
1047                           {
1048                             /* Size doesn't matter.  */
1049                             p->type = X (OP_MEM, SB);
1050                             p->literal = cst[opnum];
1051                             if (OP_KIND (q->how) == O_JSR ||
1052                                 OP_KIND (q->how) == O_JMP)
1053                               if (lvalue (sd, p->type, p->reg, (unsigned int *)&p->type))
1054                                 goto end;
1055                           }
1056                         else if ((x & MODE) == PCREL)
1057                           {
1058                             /* Size doesn't matter.  */
1059                             p->type = X (OP_PCREL, SB);
1060                             p->literal = cst[opnum];
1061                           }
1062                         else if (x & ABSJMP)
1063                           {
1064                             p->type = X (OP_IMM, SP);
1065                             p->literal = cst[opnum];
1066                           }
1067                         else if ((x & MODE) == INDEXB)
1068                           {
1069                             p->type = X (OP_INDEXB, OP_SIZE (q->how));
1070                             p->literal = cst[opnum];
1071                             p->reg     = rdisp[opnum];
1072                           }
1073                         else if ((x & MODE) == INDEXW)
1074                           {
1075                             p->type = X (OP_INDEXW, OP_SIZE (q->how));
1076                             p->literal = cst[opnum];
1077                             p->reg     = rdisp[opnum];
1078                           }
1079                         else if ((x & MODE) == INDEXL)
1080                           {
1081                             p->type = X (OP_INDEXL, OP_SIZE (q->how));
1082                             p->literal = cst[opnum];
1083                             p->reg     = rdisp[opnum];
1084                           }
1085                         else if ((x & MODE) == DISP)
1086                           {
1087                             /* Yuck -- special for mova args.  */
1088                             if (strncmp (q->name, "mova", 4) == 0 &&
1089                                 (x & SIZE) == L_2)
1090                               {
1091                                 /* Mova can have a DISP2 dest, with an
1092                                    INDEXB or INDEXW src.  The multiplier
1093                                    for the displacement value is determined
1094                                    by the src operand, not by the insn.  */
1095
1096                                 switch (OP_KIND (dst->src.type))
1097                                   {
1098                                   case OP_INDEXB:
1099                                     p->type = X (OP_DISP, SB);
1100                                     p->literal = cst[opnum];
1101                                     break;
1102                                   case OP_INDEXW:
1103                                     p->type = X (OP_DISP, SW);
1104                                     p->literal = cst[opnum] * 2;
1105                                     break;
1106                                   default:
1107                                     goto fail;
1108                                   }
1109                               }
1110                             else
1111                               {
1112                                 p->type = X (OP_DISP,   OP_SIZE (q->how));
1113                                 p->literal = cst[opnum];
1114                                 /* DISP2 is special.  */
1115                                 if ((x & SIZE) == L_2)
1116                                   switch (OP_SIZE (q->how))
1117                                     {
1118                                     case SB:                  break;
1119                                     case SW: p->literal *= 2; break;
1120                                     case SL: p->literal *= 4; break;
1121                                     }
1122                               }
1123                             p->reg     = rdisp[opnum];
1124                           }
1125                         else if (x & CTRL)
1126                           {
1127                             switch (reg[opnum])
1128                               {
1129                               case C_CCR:
1130                                 p->type = X (OP_CCR, SB);
1131                                 break;
1132                               case C_EXR:
1133                                 p->type = X (OP_EXR, SB);
1134                                 break;
1135                               case C_MACH:
1136                                 p->type = X (OP_MACH, SL);
1137                                 break;
1138                               case C_MACL:
1139                                 p->type = X (OP_MACL, SL);
1140                                 break;
1141                               case C_VBR:
1142                                 p->type = X (OP_VBR, SL);
1143                                 break;
1144                               case C_SBR:
1145                                 p->type = X (OP_SBR, SL);
1146                                 break;
1147                               }
1148                           }
1149                         else if ((x & MODE) == CCR)
1150                           {
1151                             p->type = OP_CCR;
1152                           }
1153                         else if ((x & MODE) == EXR)
1154                           {
1155                             p->type = OP_EXR;
1156                           }
1157                         else
1158                           printf ("Hmmmm 0x%x...\n", x);
1159
1160                         args++;
1161                       }
1162                   }
1163
1164                   /* Unary operators: treat src and dst as equivalent.  */
1165                   if (dst->dst.type == -1)
1166                     dst->dst = dst->src;
1167                   if (dst->src.type == -1)
1168                     dst->src = dst->dst;
1169
1170                   dst->opcode = q->how;
1171                   dst->cycles = q->time;
1172
1173                   /* And jsr's to these locations are turned into 
1174                      magic traps.  */
1175
1176                   if (OP_KIND (dst->opcode) == O_JSR)
1177                     {
1178                       switch (dst->src.literal)
1179                         {
1180                         case 0xc5:
1181                           dst->opcode = O (O_SYS_OPEN, SB);
1182                           break;
1183                         case 0xc6:
1184                           dst->opcode = O (O_SYS_READ, SB);
1185                           break;
1186                         case 0xc7:
1187                           dst->opcode = O (O_SYS_WRITE, SB);
1188                           break;
1189                         case 0xc8:
1190                           dst->opcode = O (O_SYS_LSEEK, SB);
1191                           break;
1192                         case 0xc9:
1193                           dst->opcode = O (O_SYS_CLOSE, SB);
1194                           break;
1195                         case 0xca:
1196                           dst->opcode = O (O_SYS_STAT, SB);
1197                           break;
1198                         case 0xcb:
1199                           dst->opcode = O (O_SYS_FSTAT, SB);
1200                           break;
1201                         case 0xcc:
1202                           dst->opcode = O (O_SYS_CMDLINE, SB);
1203                           break;
1204                         }
1205                       /* End of Processing for system calls.  */
1206                     }
1207
1208                   dst->next_pc = addr + len / 2;
1209                   return;
1210                 }
1211               else
1212                 printf ("Don't understand 0x%x \n", looking_for);
1213             }
1214
1215           len++;
1216           nib++;
1217         }
1218
1219     fail:
1220       ;
1221     }
1222  end:
1223   /* Fell off the end.  */
1224   dst->opcode = O (O_ILL, SB);
1225 }
1226
1227 static void
1228 compile (SIM_DESC sd, int pc)
1229 {
1230   int idx;
1231
1232   /* Find the next cache entry to use.  */
1233   idx = h8_get_cache_top (sd) + 1;
1234   h8_increment_compiles (sd);
1235   if (idx >= sd->sim_cache_size)
1236     {
1237       idx = 1;
1238     }
1239   h8_set_cache_top (sd, idx);
1240
1241   /* Throw away its old meaning.  */
1242   h8_set_cache_idx (sd, sd->sim_cache[idx].oldpc, 0);
1243
1244   /* Set to new address.  */
1245   sd->sim_cache[idx].oldpc = pc;
1246
1247   /* Fill in instruction info.  */
1248   decode (sd, pc, h8_get_memory_buf (sd) + pc, sd->sim_cache + idx);
1249
1250   /* Point to new cache entry.  */
1251   h8_set_cache_idx (sd, pc, idx);
1252 }
1253
1254
1255 static unsigned char  *breg[32];
1256 static unsigned short *wreg[16];
1257 static unsigned int   *lreg[18];
1258
1259 #define GET_B_REG(X)     *(breg[X])
1260 #define SET_B_REG(X, Y) (*(breg[X])) = (Y)
1261 #define GET_W_REG(X)     *(wreg[X])
1262 #define SET_W_REG(X, Y) (*(wreg[X])) = (Y)
1263 #define GET_L_REG(X)     h8_get_reg (sd, X)
1264 #define SET_L_REG(X, Y)  h8_set_reg (sd, X, Y)
1265
1266 #define GET_MEMORY_L(X) \
1267   ((X) < memory_size \
1268    ? ((h8_get_memory (sd, (X)+0) << 24) | (h8_get_memory (sd, (X)+1) << 16)  \
1269     | (h8_get_memory (sd, (X)+2) <<  8) | (h8_get_memory (sd, (X)+3) <<  0)) \
1270    : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 24) \
1271     | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 16) \
1272     | (h8_get_eightbit (sd, ((X)+2) & 0xff) <<  8) \
1273     | (h8_get_eightbit (sd, ((X)+3) & 0xff) <<  0)))
1274
1275 #define GET_MEMORY_W(X) \
1276   ((X) < memory_size \
1277    ? ((h8_get_memory   (sd, (X)+0) << 8) \
1278     | (h8_get_memory   (sd, (X)+1) << 0)) \
1279    : ((h8_get_eightbit (sd, ((X)+0) & 0xff) << 8) \
1280     | (h8_get_eightbit (sd, ((X)+1) & 0xff) << 0)))
1281
1282
1283 #define GET_MEMORY_B(X) \
1284   ((X) < memory_size ? (h8_get_memory   (sd, (X))) \
1285                      : (h8_get_eightbit (sd, (X) & 0xff)))
1286
1287 #define SET_MEMORY_L(X, Y)  \
1288 {  register unsigned char *_p; register int __y = (Y); \
1289    _p = ((X) < memory_size ? h8_get_memory_buf   (sd) +  (X) : \
1290                              h8_get_eightbit_buf (sd) + ((X) & 0xff)); \
1291    _p[0] = __y >> 24; _p[1] = __y >> 16; \
1292    _p[2] = __y >>  8; _p[3] = __y >>  0; \
1293 }
1294
1295 #define SET_MEMORY_W(X, Y) \
1296 {  register unsigned char *_p; register int __y = (Y); \
1297    _p = ((X) < memory_size ? h8_get_memory_buf   (sd) +  (X) : \
1298                              h8_get_eightbit_buf (sd) + ((X) & 0xff)); \
1299    _p[0] = __y >> 8; _p[1] = __y; \
1300 }
1301
1302 #define SET_MEMORY_B(X, Y) \
1303   ((X) < memory_size ? (h8_set_memory   (sd, (X), (Y))) \
1304                      : (h8_set_eightbit (sd, (X) & 0xff, (Y))))
1305
1306 /* Simulate a memory fetch.
1307    Return 0 for success, -1 for failure.
1308 */
1309
1310 static int
1311 fetch_1 (SIM_DESC sd, ea_type *arg, int *val, int twice)
1312 {
1313   int rn = arg->reg;
1314   int abs = arg->literal;
1315   int r;
1316   int t;
1317
1318   if (val == NULL)
1319     return -1;          /* Paranoia.  */
1320
1321   switch (arg->type)
1322     {
1323       /* Indexed register plus displacement mode:
1324
1325          This new family of addressing modes are similar to OP_DISP
1326          (register plus displacement), with two differences:
1327            1) INDEXB uses only the least significant byte of the register,
1328               INDEXW uses only the least significant word, and
1329               INDEXL uses the entire register (just like OP_DISP).
1330          and
1331            2) The displacement value in abs is multiplied by two
1332               for SW-sized operations, and by four for SL-size.
1333
1334         This gives nine possible variations.
1335       */
1336
1337     case X (OP_INDEXB, SB):
1338     case X (OP_INDEXB, SW):
1339     case X (OP_INDEXB, SL):
1340     case X (OP_INDEXW, SB):
1341     case X (OP_INDEXW, SW):
1342     case X (OP_INDEXW, SL):
1343     case X (OP_INDEXL, SB):
1344     case X (OP_INDEXL, SW):
1345     case X (OP_INDEXL, SL):
1346       t = GET_L_REG (rn);
1347       switch (OP_KIND (arg->type)) {
1348       case OP_INDEXB:   t &= 0xff;      break;
1349       case OP_INDEXW:   t &= 0xffff;    break;
1350       case OP_INDEXL:
1351       default:          break;
1352       }
1353       switch (OP_SIZE (arg->type)) {
1354       case SB:
1355         *val = GET_MEMORY_B ((t * 1 + abs) & h8_get_mask (sd));
1356         break;
1357       case SW:
1358         *val = GET_MEMORY_W ((t * 2 + abs) & h8_get_mask (sd));
1359         break;
1360       case SL:
1361         *val = GET_MEMORY_L ((t * 4 + abs) & h8_get_mask (sd));
1362         break;
1363       }
1364       break;
1365
1366     case X (OP_LOWREG, SB):
1367       *val = GET_L_REG (rn) & 0xff;
1368       break;
1369     case X (OP_LOWREG, SW):
1370       *val = GET_L_REG (rn) & 0xffff; 
1371       break;
1372
1373     case X (OP_REG, SB):        /* Register direct, byte.  */
1374       *val = GET_B_REG (rn);
1375       break;
1376     case X (OP_REG, SW):        /* Register direct, word.  */
1377       *val = GET_W_REG (rn);
1378       break;
1379     case X (OP_REG, SL):        /* Register direct, long.  */
1380       *val = GET_L_REG (rn);
1381       break;
1382     case X (OP_IMM, SB):        /* Immediate, byte.  */
1383     case X (OP_IMM, SW):        /* Immediate, word.  */
1384     case X (OP_IMM, SL):        /* Immediate, long.  */
1385       *val = abs;
1386       break;
1387     case X (OP_POSTINC, SB):    /* Register indirect w/post-incr: byte.  */
1388       t = GET_L_REG (rn);
1389       r = GET_MEMORY_B (t & h8_get_mask (sd));
1390       if (!twice)
1391         t += 1;
1392       SET_L_REG (rn, t);
1393       *val = r;
1394       break;
1395     case X (OP_POSTINC, SW):    /* Register indirect w/post-incr: word.  */
1396       t = GET_L_REG (rn);
1397       r = GET_MEMORY_W (t & h8_get_mask (sd));
1398       if (!twice)
1399         t += 2;
1400       SET_L_REG (rn, t);
1401       *val = r;
1402       break;
1403     case X (OP_POSTINC, SL):    /* Register indirect w/post-incr: long.  */
1404       t = GET_L_REG (rn);
1405       r = GET_MEMORY_L (t & h8_get_mask (sd));
1406       if (!twice)
1407         t += 4;
1408       SET_L_REG (rn, t);
1409       *val = r;
1410       break;
1411
1412     case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr: byte.  */
1413       t = GET_L_REG (rn);
1414       r = GET_MEMORY_B (t & h8_get_mask (sd));
1415       if (!twice)
1416         t -= 1;
1417       SET_L_REG (rn, t);
1418       *val = r;
1419       break;
1420     case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr: word.  */
1421       t = GET_L_REG (rn);
1422       r = GET_MEMORY_W (t & h8_get_mask (sd));
1423       if (!twice)
1424         t -= 2;
1425       SET_L_REG (rn, t);
1426       *val = r;
1427       break;
1428     case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr: long.  */
1429       t = GET_L_REG (rn);
1430       r = GET_MEMORY_L (t & h8_get_mask (sd));
1431       if (!twice)
1432         t -= 4;
1433       SET_L_REG (rn, t);
1434       *val = r;
1435       break;
1436
1437     case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr: byte.  */
1438       t = GET_L_REG (rn) - 1;
1439       SET_L_REG (rn, t);
1440       t &= h8_get_mask (sd);
1441       *val = GET_MEMORY_B (t);
1442       break;
1443       
1444     case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr: word.  */
1445       t = GET_L_REG (rn) - 2;
1446       SET_L_REG (rn, t);
1447       t &= h8_get_mask (sd);
1448       *val = GET_MEMORY_W (t);
1449       break;
1450       
1451     case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr: long.  */
1452       t = GET_L_REG (rn) - 4;
1453       SET_L_REG (rn, t);
1454       t &= h8_get_mask (sd);
1455       *val = GET_MEMORY_L (t);
1456       break;
1457       
1458     case X (OP_PREINC, SB):     /* Register indirect w/pre-incr: byte.  */
1459       t = GET_L_REG (rn) + 1;
1460       SET_L_REG (rn, t);
1461       t &= h8_get_mask (sd);
1462       *val = GET_MEMORY_B (t);
1463       break;
1464
1465     case X (OP_PREINC, SW):     /* Register indirect w/pre-incr: long.  */
1466       t = GET_L_REG (rn) + 2;
1467       SET_L_REG (rn, t);
1468       t &= h8_get_mask (sd);
1469       *val = GET_MEMORY_W (t);
1470       break;
1471
1472     case X (OP_PREINC, SL):     /* Register indirect w/pre-incr: long.  */
1473       t = GET_L_REG (rn) + 4;
1474       SET_L_REG (rn, t);
1475       t &= h8_get_mask (sd);
1476       *val = GET_MEMORY_L (t);
1477       break;
1478
1479     case X (OP_DISP, SB):       /* Register indirect w/displacement: byte.  */
1480       t = GET_L_REG (rn) + abs;
1481       t &= h8_get_mask (sd);
1482       *val = GET_MEMORY_B (t);
1483       break;
1484
1485     case X (OP_DISP, SW):       /* Register indirect w/displacement: word.  */
1486       t = GET_L_REG (rn) + abs;
1487       t &= h8_get_mask (sd);
1488       *val = GET_MEMORY_W (t);
1489       break;
1490
1491     case X (OP_DISP, SL):       /* Register indirect w/displacement: long.  */
1492       t = GET_L_REG (rn) + abs;
1493       t &= h8_get_mask (sd);
1494       *val =GET_MEMORY_L (t);
1495       break;
1496
1497     case X (OP_MEM, SL):        /* Absolute memory address, long.  */
1498       t = GET_MEMORY_L (abs);
1499       t &= h8_get_mask (sd);
1500       *val = t;
1501       break;
1502
1503     case X (OP_MEM, SW):        /* Absolute memory address, word.  */
1504       t = GET_MEMORY_W (abs);
1505       t &= h8_get_mask (sd);
1506       *val = t;
1507       break;
1508
1509     case X (OP_PCREL, SB):      /* PC relative (for jump, branch etc).  */
1510     case X (OP_PCREL, SW):
1511     case X (OP_PCREL, SL):
1512     case X (OP_PCREL, SN):
1513       *val = abs;
1514       break;
1515
1516     case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1517     default:
1518       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1519       return -1;
1520     }
1521   return 0;     /* Success.  */
1522 }
1523
1524 /* Normal fetch.  */
1525
1526 static int
1527 fetch (SIM_DESC sd, ea_type *arg, int *val)
1528 {
1529   return fetch_1 (sd, arg, val, 0);
1530 }
1531
1532 /* Fetch which will be followed by a store to the same location.
1533    The difference being that we don't want to do a post-increment
1534    or post-decrement at this time: we'll do it when we store.  */
1535
1536 static int
1537 fetch2 (SIM_DESC sd, ea_type *arg, int *val)
1538 {
1539   return fetch_1 (sd, arg, val, 1);
1540 }
1541
1542 /* Simulate a memory store.
1543    Return 0 for success, -1 for failure.
1544 */
1545
1546 static int
1547 store_1 (SIM_DESC sd, ea_type *arg, int n, int twice)
1548 {
1549   int rn = arg->reg;
1550   int abs = arg->literal;
1551   int t;
1552
1553   switch (arg->type)
1554     {
1555       /* Indexed register plus displacement mode:
1556
1557          This new family of addressing modes are similar to OP_DISP
1558          (register plus displacement), with two differences:
1559            1) INDEXB uses only the least significant byte of the register,
1560               INDEXW uses only the least significant word, and
1561               INDEXL uses the entire register (just like OP_DISP).
1562          and
1563            2) The displacement value in abs is multiplied by two
1564               for SW-sized operations, and by four for SL-size.
1565
1566         This gives nine possible variations.
1567       */
1568
1569     case X (OP_INDEXB, SB):
1570     case X (OP_INDEXB, SW):
1571     case X (OP_INDEXB, SL):
1572     case X (OP_INDEXW, SB):
1573     case X (OP_INDEXW, SW):
1574     case X (OP_INDEXW, SL):
1575     case X (OP_INDEXL, SB):
1576     case X (OP_INDEXL, SW):
1577     case X (OP_INDEXL, SL):
1578       t = GET_L_REG (rn);
1579       switch (OP_KIND (arg->type)) {
1580       case OP_INDEXB:   t &= 0xff;      break;
1581       case OP_INDEXW:   t &= 0xffff;    break;
1582       case OP_INDEXL:
1583       default:          break;
1584       }
1585       switch (OP_SIZE (arg->type)) {
1586       case SB:
1587         SET_MEMORY_B ((t * 1 + abs) & h8_get_mask (sd), n);
1588         break;
1589       case SW:
1590         SET_MEMORY_W ((t * 2 + abs) & h8_get_mask (sd), n);
1591         break;
1592       case SL:
1593         SET_MEMORY_L ((t * 4 + abs) & h8_get_mask (sd), n);
1594         break;
1595       }
1596       break;
1597
1598     case X (OP_REG, SB):        /* Register direct, byte.  */
1599       SET_B_REG (rn, n);
1600       break;
1601     case X (OP_REG, SW):        /* Register direct, word.  */
1602       SET_W_REG (rn, n);
1603       break;
1604     case X (OP_REG, SL):        /* Register direct, long.  */
1605       SET_L_REG (rn, n);
1606       break;
1607
1608     case X (OP_PREDEC, SB):     /* Register indirect w/pre-decr, byte.  */
1609       t = GET_L_REG (rn);
1610       if (!twice)
1611         t -= 1;
1612       SET_L_REG (rn, t);
1613       t &= h8_get_mask (sd);
1614       SET_MEMORY_B (t, n);
1615
1616       break;
1617     case X (OP_PREDEC, SW):     /* Register indirect w/pre-decr, word.  */
1618       t = GET_L_REG (rn);
1619       if (!twice)
1620         t -= 2;
1621       SET_L_REG (rn, t);
1622       t &= h8_get_mask (sd);
1623       SET_MEMORY_W (t, n);
1624       break;
1625
1626     case X (OP_PREDEC, SL):     /* Register indirect w/pre-decr, long.  */
1627       t = GET_L_REG (rn);
1628       if (!twice)
1629         t -= 4;
1630       SET_L_REG (rn, t);
1631       t &= h8_get_mask (sd);
1632       SET_MEMORY_L (t, n);
1633       break;
1634
1635     case X (OP_PREINC, SB):     /* Register indirect w/pre-incr, byte.  */
1636       t = GET_L_REG (rn);
1637       if (!twice)
1638         t += 1;
1639       SET_L_REG (rn, t);
1640       t &= h8_get_mask (sd);
1641       SET_MEMORY_B (t, n);
1642
1643       break;
1644     case X (OP_PREINC, SW):     /* Register indirect w/pre-incr, word.  */
1645       t = GET_L_REG (rn);
1646       if (!twice)
1647         t += 2;
1648       SET_L_REG (rn, t);
1649       t &= h8_get_mask (sd);
1650       SET_MEMORY_W (t, n);
1651       break;
1652
1653     case X (OP_PREINC, SL):     /* Register indirect w/pre-incr, long.  */
1654       t = GET_L_REG (rn);
1655       if (!twice)
1656         t += 4;
1657       SET_L_REG (rn, t);
1658       t &= h8_get_mask (sd);
1659       SET_MEMORY_L (t, n);
1660       break;
1661
1662     case X (OP_POSTDEC, SB):    /* Register indirect w/post-decr, byte.  */
1663       t = GET_L_REG (rn);
1664       SET_L_REG (rn, t - 1);
1665       t &= h8_get_mask (sd);
1666       SET_MEMORY_B (t, n);
1667       break;
1668
1669     case X (OP_POSTDEC, SW):    /* Register indirect w/post-decr, word.  */
1670       t = GET_L_REG (rn);
1671       SET_L_REG (rn, t - 2);
1672       t &= h8_get_mask (sd);
1673       SET_MEMORY_W (t, n);
1674       break;
1675
1676     case X (OP_POSTDEC, SL):    /* Register indirect w/post-decr, long.  */
1677       t = GET_L_REG (rn);
1678       SET_L_REG (rn, t - 4);
1679       t &= h8_get_mask (sd);
1680       SET_MEMORY_L (t, n);
1681       break;
1682
1683     case X (OP_POSTINC, SB):    /* Register indirect w/post-incr, byte.  */
1684       t = GET_L_REG (rn);
1685       SET_L_REG (rn, t + 1);
1686       t &= h8_get_mask (sd);
1687       SET_MEMORY_B (t, n);
1688       break;
1689
1690     case X (OP_POSTINC, SW):    /* Register indirect w/post-incr, word.  */
1691       t = GET_L_REG (rn);
1692       SET_L_REG (rn, t + 2);
1693       t &= h8_get_mask (sd);
1694       SET_MEMORY_W (t, n);
1695       break;
1696
1697     case X (OP_POSTINC, SL):    /* Register indirect w/post-incr, long.  */
1698       t = GET_L_REG (rn);
1699       SET_L_REG (rn, t + 4);
1700       t &= h8_get_mask (sd);
1701       SET_MEMORY_L (t, n);
1702       break;
1703
1704     case X (OP_DISP, SB):       /* Register indirect w/displacement, byte.  */
1705       t = GET_L_REG (rn) + abs;
1706       t &= h8_get_mask (sd);
1707       SET_MEMORY_B (t, n);
1708       break;
1709
1710     case X (OP_DISP, SW):       /* Register indirect w/displacement, word.  */
1711       t = GET_L_REG (rn) + abs;
1712       t &= h8_get_mask (sd);
1713       SET_MEMORY_W (t, n);
1714       break;
1715
1716     case X (OP_DISP, SL):       /* Register indirect w/displacement, long.  */
1717       t = GET_L_REG (rn) + abs;
1718       t &= h8_get_mask (sd);
1719       SET_MEMORY_L (t, n);
1720       break;
1721
1722
1723     case X (OP_MEM, SB):        /* Why isn't this implemented?  */
1724     case X (OP_MEM, SW):        /* Why isn't this implemented?  */
1725     case X (OP_MEM, SL):        /* Why isn't this implemented?  */
1726     default:
1727       sim_engine_set_run_state (sd, sim_stopped, SIGSEGV);
1728       return -1;
1729     }
1730   return 0;
1731 }
1732
1733 /* Normal store.  */
1734
1735 static int
1736 store (SIM_DESC sd, ea_type *arg, int n)
1737 {
1738   return store_1 (sd, arg, n, 0);
1739 }
1740
1741 /* Store which follows a fetch from the same location.
1742    The difference being that we don't want to do a pre-increment
1743    or pre-decrement at this time: it was already done when we fetched.  */
1744
1745 static int
1746 store2 (SIM_DESC sd, ea_type *arg, int n)
1747 {
1748   return store_1 (sd, arg, n, 1);
1749 }
1750
1751 static union
1752 {
1753   short int i;
1754   struct
1755     {
1756       char low;
1757       char high;
1758     }
1759   u;
1760 } littleendian;
1761
1762 /* Flag to be set whenever a new SIM_DESC object is created.  */
1763 static int init_pointers_needed = 1;
1764
1765 static void
1766 init_pointers (SIM_DESC sd)
1767 {
1768   if (init_pointers_needed)
1769     {
1770       int i;
1771
1772       littleendian.i = 1;
1773
1774       if (h8300smode && !h8300_normal_mode)
1775         memory_size = H8300S_MSIZE;
1776       else if (h8300hmode && !h8300_normal_mode)
1777         memory_size = H8300H_MSIZE;
1778       else
1779         memory_size = H8300_MSIZE;
1780       /* `msize' must be a power of two.  */
1781       if ((memory_size & (memory_size - 1)) != 0)
1782         {
1783           (*sim_callback->printf_filtered) 
1784             (sim_callback,
1785              "init_pointers: bad memory size %d, defaulting to %d.\n", 
1786              memory_size, memory_size = H8300S_MSIZE);
1787         }
1788
1789       if (h8_get_memory_buf (sd))
1790         free (h8_get_memory_buf (sd));
1791       if (h8_get_cache_idx_buf (sd))
1792         free (h8_get_cache_idx_buf (sd));
1793       if (h8_get_eightbit_buf (sd))
1794         free (h8_get_eightbit_buf (sd));
1795
1796       h8_set_memory_buf (sd, (unsigned char *) 
1797                          calloc (sizeof (char), memory_size));
1798       h8_set_cache_idx_buf (sd, (unsigned short *) 
1799                             calloc (sizeof (short), memory_size));
1800       sd->memory_size = memory_size;
1801       h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
1802
1803       h8_set_mask (sd, memory_size - 1);
1804
1805       memset (h8_get_reg_buf (sd), 0, sizeof (((STATE_CPU (sd, 0))->regs)));
1806
1807       for (i = 0; i < 8; i++)
1808         {
1809           /* FIXME: rewrite using local buffer.  */
1810           unsigned char *p = (unsigned char *) (h8_get_reg_buf (sd) + i);
1811           unsigned char *e = (unsigned char *) (h8_get_reg_buf (sd) + i + 1);
1812           unsigned short *q = (unsigned short *) (h8_get_reg_buf (sd) + i);
1813           unsigned short *u = (unsigned short *) (h8_get_reg_buf (sd) + i + 1);
1814           h8_set_reg (sd, i, 0x00112233);
1815
1816           while (p < e)
1817             {
1818               if (*p == 0x22)
1819                   breg[i] = p;
1820               if (*p == 0x33)
1821                   breg[i + 8] = p;
1822               if (*p == 0x11)
1823                 breg[i + 16] = p;
1824               if (*p == 0x00)
1825                 breg[i + 24] = p;
1826               p++;
1827             }
1828
1829           wreg[i] = wreg[i + 8] = 0;
1830           while (q < u)
1831             {
1832               if (*q == 0x2233)
1833                 {
1834                   wreg[i] = q;
1835                 }
1836               if (*q == 0x0011)
1837                 {
1838                   wreg[i + 8] = q;
1839                 }
1840               q++;
1841             }
1842
1843           if (wreg[i] == 0 || wreg[i + 8] == 0)
1844             (*sim_callback->printf_filtered) (sim_callback, 
1845                                               "init_pointers: internal error.\n");
1846
1847           h8_set_reg (sd, i, 0);
1848           lreg[i] = h8_get_reg_buf (sd) + i;
1849         }
1850
1851       /* Note: sim uses pseudo-register ZERO as a zero register.  */
1852       lreg[ZERO_REGNUM] = h8_get_reg_buf (sd) + ZERO_REGNUM;
1853       init_pointers_needed = 0;
1854
1855       /* Initialize the seg registers.  */
1856       if (!sd->sim_cache)
1857         set_simcache_size (sd, CSIZE);
1858     }
1859 }
1860
1861 /* Grotty global variable for use by control_c signal handler.  */
1862 static SIM_DESC control_c_sim_desc;
1863
1864 static void
1865 control_c (int sig)
1866 {
1867   sim_engine_set_run_state (control_c_sim_desc, sim_stopped, SIGINT);
1868 }
1869
1870 int
1871 sim_stop (SIM_DESC sd)
1872 {
1873   /* FIXME: use a real signal value.  */
1874   sim_engine_set_run_state (sd, sim_stopped, SIGINT);
1875   return 1;
1876 }
1877
1878 #define OBITOP(name, f, s, op)                  \
1879 case O (name, SB):                              \
1880 {                                               \
1881   int m, tmp;                                   \
1882                                                 \
1883   if (f)                                        \
1884     if (fetch (sd, &code->dst, &ea))            \
1885       goto end;                                 \
1886   if (fetch (sd, &code->src, &tmp))             \
1887     goto end;                                   \
1888   m = 1 << (tmp & 7);                           \
1889   op;                                           \
1890   if (s)                                        \
1891     if (store (sd, &code->dst,ea))              \
1892       goto end;                                 \
1893   goto next;                                    \
1894 }
1895
1896 void
1897 sim_resume (SIM_DESC sd, int step, int siggnal)
1898 {
1899   static int init1;
1900   int cycles = 0;
1901   int insts = 0;
1902   int tick_start = get_now ();
1903   void (*prev) ();
1904   int poll_count = 0;
1905   int res;
1906   int tmp;
1907   int rd;
1908   int ea;
1909   int bit;
1910   int pc;
1911   int c, nz, v, n, u, h, ui, intMaskBit;
1912   int trace, intMask;
1913   int oldmask;
1914   enum sim_stop reason;
1915   int sigrc;
1916
1917   init_pointers (sd);
1918
1919   control_c_sim_desc = sd;
1920   prev = signal (SIGINT, control_c);
1921
1922   if (step)
1923     {
1924       sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
1925     }
1926   else
1927     {
1928       sim_engine_set_run_state (sd, sim_running, 0);
1929     }
1930
1931   pc = h8_get_pc (sd);
1932
1933   /* The PC should never be odd.  */
1934   if (pc & 0x1)
1935     {
1936       sim_engine_set_run_state (sd, sim_stopped, SIGBUS);
1937       return;
1938     }
1939
1940   /* Get Status Register (flags).  */
1941   GETSR (sd);
1942
1943   if (h8300smode)       /* Get exr.  */
1944     {
1945       trace = (h8_get_exr (sd) >> 7) & 1;
1946       intMask = h8_get_exr (sd) & 7;
1947     }
1948
1949   oldmask = h8_get_mask (sd);
1950   if (!h8300hmode || h8300_normal_mode)
1951     h8_set_mask (sd, 0xffff);
1952   do
1953     {
1954       unsigned short cidx;
1955       decoded_inst *code;
1956
1957     top:
1958       cidx = h8_get_cache_idx (sd, pc);
1959       if (cidx == (unsigned short) -1 ||
1960           cidx >= sd->sim_cache_size)
1961         goto illegal;
1962           
1963       code = sd->sim_cache + cidx;
1964
1965 #if ADEBUG
1966       if (debug)
1967         {
1968           printf ("%x %d %s\n", pc, code->opcode,
1969                   code->op ? code->op->name : "**");
1970         }
1971       h8_increment_stats (sd, code->opcode);
1972 #endif
1973
1974       if (code->opcode)
1975         {
1976           cycles += code->cycles;
1977           insts++;
1978         }
1979
1980       switch (code->opcode)
1981         {
1982         case 0:
1983           /*
1984            * This opcode is a fake for when we get to an
1985            * instruction which hasnt been compiled
1986            */
1987           compile (sd, pc);
1988           goto top;
1989           break;
1990
1991         case O (O_MOVAB, SL):
1992         case O (O_MOVAW, SL):
1993         case O (O_MOVAL, SL):
1994           /* 1) Evaluate 2nd argument (dst).
1995              2) Mask / zero extend according to whether 1st argument (src)
1996                 is INDEXB, INDEXW, or INDEXL.
1997              3) Left-shift the result by 0, 1 or 2, according to size of mova
1998                 (mova/b, mova/w, mova/l).
1999              4) Add literal value of 1st argument (src).
2000              5) Store result in 3rd argument (op3).
2001           */
2002
2003           /* Alas, since this is the only instruction with 3 arguments, 
2004              decode doesn't handle them very well.  Some fix-up is required.
2005
2006              a) The size of dst is determined by whether src is 
2007                 INDEXB or INDEXW.  */
2008
2009           if (OP_KIND (code->src.type) == OP_INDEXB)
2010             code->dst.type = X (OP_KIND (code->dst.type), SB);
2011           else if (OP_KIND (code->src.type) == OP_INDEXW)
2012             code->dst.type = X (OP_KIND (code->dst.type), SW);
2013
2014           /* b) If op3 == null, then this is the short form of the insn.
2015                 Dst is the dispreg of src, and op3 is the 32-bit form
2016                 of the same register.
2017           */
2018
2019           if (code->op3.type == 0)
2020             {
2021               /* Short form: src == INDEXB/INDEXW, dst == op3 == 0.
2022                  We get to compose dst and op3 as follows:
2023
2024                      op3 is a 32-bit register, ID == src.reg.
2025                      dst is the same register, but 8 or 16 bits
2026                      depending on whether src is INDEXB or INDEXW.
2027               */
2028
2029               code->op3.type = X (OP_REG, SL);
2030               code->op3.reg  = code->src.reg;
2031               code->op3.literal = 0;
2032
2033               if (OP_KIND (code->src.type) == OP_INDEXB)
2034                 {
2035                   code->dst.type = X (OP_REG, SB);
2036                   code->dst.reg = code->op3.reg + 8;
2037                 }
2038               else
2039                 code->dst.type = X (OP_REG, SW);
2040             }
2041
2042           if (fetch (sd, &code->dst, &ea))
2043             goto end;
2044
2045           switch (OP_KIND (code->src.type)) {
2046           case OP_INDEXB:    ea = ea & 0xff;            break;
2047           case OP_INDEXW:    ea = ea & 0xffff;          break;
2048           case OP_INDEXL:                               break;
2049           default:           goto illegal;
2050           }
2051
2052           switch (code->opcode) {
2053           case O (O_MOVAB, SL):                         break;
2054           case O (O_MOVAW, SL):     ea = ea << 1;       break;
2055           case O (O_MOVAL, SL):     ea = ea << 2;       break;
2056           default:                  goto illegal;
2057           }
2058           
2059           ea = ea + code->src.literal;
2060
2061           if (store (sd, &code->op3, ea))
2062             goto end;
2063
2064           goto next;      
2065
2066         case O (O_SUBX, SB):    /* subx, extended sub */
2067           if (fetch2 (sd, &code->dst, &rd))
2068             goto end;
2069           if (fetch (sd, &code->src, &ea))
2070             goto end;
2071           ea = -(ea + C);
2072           res = rd + ea;
2073           goto alu8;
2074
2075         case O (O_SUBX, SW):    /* subx, extended sub */
2076           if (fetch2 (sd, &code->dst, &rd))
2077             goto end;
2078           if (fetch (sd, &code->src, &ea))
2079             goto end;
2080           ea = -(ea + C);
2081           res = rd + ea;
2082           goto alu16;
2083
2084         case O (O_SUBX, SL):    /* subx, extended sub */
2085           if (fetch2 (sd, &code->dst, &rd))
2086             goto end;
2087           if (fetch (sd, &code->src, &ea))
2088             goto end;
2089           ea = -(ea + C);
2090           res = rd + ea;
2091           goto alu32;
2092
2093         case O (O_ADDX, SB):    /* addx, extended add */
2094           if (fetch2 (sd, &code->dst, &rd))
2095             goto end;
2096           if (fetch (sd, &code->src, &ea))
2097             goto end;
2098           ea = ea + C;
2099           res = rd + ea;
2100           goto alu8;
2101
2102         case O (O_ADDX, SW):    /* addx, extended add */
2103           if (fetch2 (sd, &code->dst, &rd))
2104             goto end;
2105           if (fetch (sd, &code->src, &ea))
2106             goto end;
2107           ea = ea + C;
2108           res = rd + ea;
2109           goto alu16;
2110
2111         case O (O_ADDX, SL):    /* addx, extended add */
2112           if (fetch2 (sd, &code->dst, &rd))
2113             goto end;
2114           if (fetch (sd, &code->src, &ea))
2115             goto end;
2116           ea = ea + C;
2117           res = rd + ea;
2118           goto alu32;
2119
2120         case O (O_SUB, SB):             /* sub.b */
2121           /* Fetch rd and ea.  */
2122           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2123             goto end;
2124           ea = -ea;
2125           res = rd + ea;
2126           goto alu8;
2127
2128         case O (O_SUB, SW):             /* sub.w */
2129           /* Fetch rd and ea.  */
2130           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2131             goto end;
2132           ea = -ea;
2133           res = rd + ea;
2134           goto alu16;
2135
2136         case O (O_SUB, SL):             /* sub.l */
2137           /* Fetch rd and ea.  */
2138           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2139             goto end;
2140           ea = -ea;
2141           res = rd + ea;
2142           goto alu32;
2143
2144         case O (O_NEG, SB):             /* neg.b */
2145           /* Fetch ea.  */
2146           if (fetch2 (sd, &code->src, &ea)) 
2147             goto end;
2148           ea = -ea;
2149           rd = 0;
2150           res = rd + ea;
2151           goto alu8;
2152
2153         case O (O_NEG, SW):             /* neg.w */
2154           /* Fetch ea.  */
2155           if (fetch2 (sd, &code->src, &ea)) 
2156             goto end;
2157           ea = -ea;
2158           rd = 0;
2159           res = rd + ea;
2160           goto alu16;
2161
2162         case O (O_NEG, SL):             /* neg.l */
2163           /* Fetch ea.  */
2164           if (fetch2 (sd, &code->src, &ea)) 
2165             goto end;
2166           ea = -ea;
2167           rd = 0;
2168           res = rd + ea;
2169           goto alu32;
2170
2171         case O (O_ADD, SB):             /* add.b */
2172           if (fetch2 (sd, &code->dst, &rd))
2173             goto end;
2174           if (fetch (sd, &code->src, &ea))
2175             goto end;
2176           res = rd + ea;
2177           goto alu8;
2178
2179         case O (O_ADD, SW):             /* add.w */
2180           if (fetch2 (sd, &code->dst, &rd))
2181             goto end;
2182           if (fetch (sd, &code->src, &ea))
2183             goto end;
2184           res = rd + ea;
2185           goto alu16;
2186
2187         case O (O_ADD, SL):             /* add.l */
2188           if (fetch2 (sd, &code->dst, &rd))
2189             goto end;
2190           if (fetch (sd, &code->src, &ea))
2191             goto end;
2192           res = rd + ea;
2193           goto alu32;
2194
2195         case O (O_AND, SB):             /* and.b */
2196           /* Fetch rd and ea.  */
2197           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2198             goto end;
2199           res = rd & ea;
2200           goto log8;
2201
2202         case O (O_AND, SW):             /* and.w */
2203           /* Fetch rd and ea.  */
2204           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2205             goto end;
2206           res = rd & ea;
2207           goto log16;
2208
2209         case O (O_AND, SL):             /* and.l */
2210           /* Fetch rd and ea.  */
2211           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2212             goto end;
2213           res = rd & ea;
2214           goto log32;
2215
2216         case O (O_OR, SB):              /* or.b */
2217           /* Fetch rd and ea.  */
2218           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2219             goto end;
2220           res = rd | ea;
2221           goto log8;
2222
2223         case O (O_OR, SW):              /* or.w */
2224           /* Fetch rd and ea.  */
2225           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2226             goto end;
2227           res = rd | ea;
2228           goto log16;
2229
2230         case O (O_OR, SL):              /* or.l */
2231           /* Fetch rd and ea.  */
2232           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2233             goto end;
2234           res = rd | ea;
2235           goto log32;
2236
2237         case O (O_XOR, SB):             /* xor.b */
2238           /* Fetch rd and ea.  */
2239           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2240             goto end;
2241           res = rd ^ ea;
2242           goto log8;
2243
2244         case O (O_XOR, SW):             /* xor.w */
2245           /* Fetch rd and ea.  */
2246           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2247             goto end;
2248           res = rd ^ ea;
2249           goto log16;
2250
2251         case O (O_XOR, SL):             /* xor.l */
2252           /* Fetch rd and ea.  */
2253           if (fetch (sd, &code->src, &ea) || fetch2 (sd, &code->dst, &rd)) 
2254             goto end;
2255           res = rd ^ ea;
2256           goto log32;
2257
2258         case O (O_MOV, SB):
2259           if (fetch (sd, &code->src, &res))
2260             goto end;
2261           if (store (sd, &code->dst, res))
2262             goto end;
2263           goto just_flags_log8;
2264         case O (O_MOV, SW):
2265           if (fetch (sd, &code->src, &res))
2266             goto end;
2267           if (store (sd, &code->dst, res))
2268             goto end;
2269           goto just_flags_log16;
2270         case O (O_MOV, SL):
2271           if (fetch (sd, &code->src, &res))
2272             goto end;
2273           if (store (sd, &code->dst, res))
2274             goto end;
2275           goto just_flags_log32;
2276
2277         case O (O_MOVMD, SB):           /* movmd.b */
2278           ea = GET_W_REG (4);
2279           if (ea == 0)
2280             ea = 0x10000;
2281
2282           while (ea--)
2283             {
2284               rd = GET_MEMORY_B (GET_L_REG (5));
2285               SET_MEMORY_B (GET_L_REG (6), rd);
2286               SET_L_REG (5, GET_L_REG (5) + 1);
2287               SET_L_REG (6, GET_L_REG (6) + 1);
2288               SET_W_REG (4, ea);
2289             }
2290           goto next;
2291
2292         case O (O_MOVMD, SW):           /* movmd.w */
2293           ea = GET_W_REG (4);
2294           if (ea == 0)
2295             ea = 0x10000;
2296
2297           while (ea--)
2298             {
2299               rd = GET_MEMORY_W (GET_L_REG (5));
2300               SET_MEMORY_W (GET_L_REG (6), rd);
2301               SET_L_REG (5, GET_L_REG (5) + 2);
2302               SET_L_REG (6, GET_L_REG (6) + 2);
2303               SET_W_REG (4, ea);
2304             }
2305           goto next;
2306
2307         case O (O_MOVMD, SL):           /* movmd.l */
2308           ea = GET_W_REG (4);
2309           if (ea == 0)
2310             ea = 0x10000;
2311
2312           while (ea--)
2313             {
2314               rd = GET_MEMORY_L (GET_L_REG (5));
2315               SET_MEMORY_L (GET_L_REG (6), rd);
2316               SET_L_REG (5, GET_L_REG (5) + 4);
2317               SET_L_REG (6, GET_L_REG (6) + 4);
2318               SET_W_REG (4, ea);
2319             }
2320           goto next;
2321
2322         case O (O_MOVSD, SB):           /* movsd.b */
2323           /* This instruction implements strncpy, with a conditional branch.
2324              r4 contains n, r5 contains src, and r6 contains dst.
2325              The 16-bit displacement operand is added to the pc
2326              if and only if the end of string is reached before
2327              n bytes are transferred.  */
2328
2329           ea = GET_L_REG (4) & 0xffff;
2330           if (ea == 0)
2331             ea = 0x10000;
2332
2333           while (ea--)
2334             {
2335               rd = GET_MEMORY_B (GET_L_REG (5));
2336               SET_MEMORY_B (GET_L_REG (6), rd);
2337               SET_L_REG (5, GET_L_REG (5) + 1);
2338               SET_L_REG (6, GET_L_REG (6) + 1);
2339               SET_W_REG (4, ea); 
2340               if (rd == 0)
2341                 goto condtrue;
2342             }
2343           goto next;
2344
2345         case O (O_EEPMOV, SB):          /* eepmov.b */
2346         case O (O_EEPMOV, SW):          /* eepmov.w */
2347           if (h8300hmode || h8300smode)
2348             {
2349               register unsigned char *_src, *_dst;
2350               unsigned int count = ((code->opcode == O (O_EEPMOV, SW))
2351                                     ? h8_get_reg (sd, R4_REGNUM) & 0xffff
2352                                     : h8_get_reg (sd, R4_REGNUM) & 0xff);
2353
2354               _src = (h8_get_reg (sd, R5_REGNUM) < memory_size
2355                       ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R5_REGNUM)
2356                       : h8_get_eightbit_buf (sd) + 
2357                        (h8_get_reg (sd, R5_REGNUM) & 0xff));
2358               if ((_src + count) >= (h8_get_memory_buf (sd) + memory_size))
2359                 {
2360                   if ((_src + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2361                     goto illegal;
2362                 }
2363               _dst = (h8_get_reg (sd, R6_REGNUM) < memory_size
2364                       ? h8_get_memory_buf   (sd) + h8_get_reg (sd, R6_REGNUM)
2365                       : h8_get_eightbit_buf (sd) + 
2366                        (h8_get_reg (sd, R6_REGNUM) & 0xff));
2367
2368               if ((_dst + count) >= (h8_get_memory_buf (sd) + memory_size))
2369                 {
2370                   if ((_dst + count) >= (h8_get_eightbit_buf (sd) + 0x100))
2371                     goto illegal;
2372                 }
2373               memcpy (_dst, _src, count);
2374
2375               h8_set_reg (sd, R5_REGNUM, h8_get_reg (sd, R5_REGNUM) + count);
2376               h8_set_reg (sd, R6_REGNUM, h8_get_reg (sd, R6_REGNUM) + count);
2377               h8_set_reg (sd, R4_REGNUM, h8_get_reg (sd, R4_REGNUM) &
2378                           ((code->opcode == O (O_EEPMOV, SW))
2379                           ? (~0xffff) : (~0xff)));
2380               cycles += 2 * count;
2381               goto next;
2382             }
2383           goto illegal;
2384
2385         case O (O_ADDS, SL):            /* adds (.l) */
2386           /* FIXME fetch.
2387            * This insn only uses register operands, but still
2388            * it would be cleaner to use fetch and store...  */    
2389           SET_L_REG (code->dst.reg,
2390                      GET_L_REG (code->dst.reg)
2391                      + code->src.literal);
2392
2393           goto next;
2394
2395         case O (O_SUBS, SL):            /* subs (.l) */
2396           /* FIXME fetch.
2397            * This insn only uses register operands, but still
2398            * it would be cleaner to use fetch and store...  */    
2399           SET_L_REG (code->dst.reg,
2400                      GET_L_REG (code->dst.reg)
2401                      - code->src.literal);
2402           goto next;
2403
2404         case O (O_CMP, SB):             /* cmp.b */
2405           if (fetch (sd, &code->dst, &rd))
2406             goto end;
2407           if (fetch (sd, &code->src, &ea))
2408             goto end;
2409           ea = -ea;
2410           res = rd + ea;
2411           goto just_flags_alu8;
2412
2413         case O (O_CMP, SW):             /* cmp.w */
2414           if (fetch (sd, &code->dst, &rd))
2415             goto end;
2416           if (fetch (sd, &code->src, &ea))
2417             goto end;
2418           ea = -ea;
2419           res = rd + ea;
2420           goto just_flags_alu16;
2421
2422         case O (O_CMP, SL):             /* cmp.l */
2423           if (fetch (sd, &code->dst, &rd))
2424             goto end;
2425           if (fetch (sd, &code->src, &ea))
2426             goto end;
2427           ea = -ea;
2428           res = rd + ea;
2429           goto just_flags_alu32;
2430
2431         case O (O_DEC, SB):             /* dec.b */
2432           /* FIXME fetch.
2433            * This insn only uses register operands, but still
2434            * it would be cleaner to use fetch and store...  */    
2435           rd = GET_B_REG (code->src.reg);
2436           ea = -1;
2437           res = rd + ea;
2438           SET_B_REG (code->src.reg, res);
2439           goto just_flags_inc8;
2440
2441         case O (O_DEC, SW):             /* dec.w */
2442           /* FIXME fetch.
2443            * This insn only uses register operands, but still
2444            * it would be cleaner to use fetch and store...  */    
2445           rd = GET_W_REG (code->dst.reg);
2446           ea = -code->src.literal;
2447           res = rd + ea;
2448           SET_W_REG (code->dst.reg, res);
2449           goto just_flags_inc16;
2450
2451         case O (O_DEC, SL):             /* dec.l */
2452           /* FIXME fetch.
2453            * This insn only uses register operands, but still
2454            * it would be cleaner to use fetch and store...  */    
2455           rd = GET_L_REG (code->dst.reg);
2456           ea = -code->src.literal;
2457           res = rd + ea;
2458           SET_L_REG (code->dst.reg, res);
2459           goto just_flags_inc32;
2460
2461         case O (O_INC, SB):             /* inc.b */
2462           /* FIXME fetch.
2463            * This insn only uses register operands, but still
2464            * it would be cleaner to use fetch and store...  */    
2465           rd = GET_B_REG (code->src.reg);
2466           ea = 1;
2467           res = rd + ea;
2468           SET_B_REG (code->src.reg, res);
2469           goto just_flags_inc8;
2470
2471         case O (O_INC, SW):             /* inc.w */
2472           /* FIXME fetch.
2473            * This insn only uses register operands, but still
2474            * it would be cleaner to use fetch and store...  */    
2475           rd = GET_W_REG (code->dst.reg);
2476           ea = code->src.literal;
2477           res = rd + ea;
2478           SET_W_REG (code->dst.reg, res);
2479           goto just_flags_inc16;
2480
2481         case O (O_INC, SL):             /* inc.l */
2482           /* FIXME fetch.
2483            * This insn only uses register operands, but still
2484            * it would be cleaner to use fetch and store...  */    
2485           rd = GET_L_REG (code->dst.reg);
2486           ea = code->src.literal;
2487           res = rd + ea;
2488           SET_L_REG (code->dst.reg, res);
2489           goto just_flags_inc32;
2490
2491         case O (O_LDC, SB):             /* ldc.b */
2492           if (fetch (sd, &code->src, &res))
2493             goto end;
2494           goto setc;
2495
2496         case O (O_LDC, SW):             /* ldc.w */
2497           if (fetch (sd, &code->src, &res))
2498             goto end;
2499
2500           /* Word operand, value from MSB, must be shifted.  */
2501           res >>= 8;
2502           goto setc;
2503
2504         case O (O_LDC, SL):             /* ldc.l */
2505           if (fetch (sd, &code->src, &res))
2506             goto end;
2507           switch (code->dst.type) {
2508           case X (OP_SBR, SL):
2509             h8_set_sbr (sd, res);
2510             break;
2511           case X (OP_VBR, SL):
2512             h8_set_vbr (sd, res);
2513             break;
2514           default:
2515             goto illegal;
2516           }
2517           goto next;
2518
2519         case O (O_STC, SW):             /* stc.w */
2520         case O (O_STC, SB):             /* stc.b */
2521           if (code->src.type == X (OP_CCR, SB))
2522             {
2523               BUILDSR (sd);
2524               res = h8_get_ccr (sd);
2525             }
2526           else if (code->src.type == X (OP_EXR, SB) && h8300smode)
2527             {
2528               if (h8300smode)
2529                 h8_set_exr (sd, (trace << 7) | intMask);
2530               res = h8_get_exr (sd);
2531             }
2532           else
2533             goto illegal;
2534
2535           /* Word operand, value to MSB, must be shifted.  */
2536           if (code->opcode == X (O_STC, SW))
2537             res <<= 8;
2538           if (store (sd, &code->dst, res))
2539             goto end;
2540           goto next;
2541         case O (O_STC, SL):             /* stc.l */
2542           switch (code->src.type) {
2543           case X (OP_SBR, SL):
2544             res = h8_get_sbr (sd);
2545             break;
2546           case X (OP_VBR, SL):
2547             res = h8_get_vbr (sd);
2548             break;
2549           default:
2550             goto illegal;
2551           }
2552           if (store (sd, &code->dst, res))
2553             goto end;
2554           goto next;
2555
2556         case O (O_ANDC, SB):            /* andc.b */
2557           if (code->dst.type == X (OP_CCR, SB))
2558             {
2559               BUILDSR (sd);
2560               rd = h8_get_ccr (sd);
2561             }
2562           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2563             {
2564               if (h8300smode)
2565                 h8_set_exr (sd, (trace << 7) | intMask);
2566               rd = h8_get_exr (sd);
2567             }
2568           else
2569             goto illegal;
2570           ea = code->src.literal;
2571           res = rd & ea;
2572           goto setc;
2573
2574         case O (O_ORC, SB):             /* orc.b */
2575           if (code->dst.type == X (OP_CCR, SB))
2576             {
2577               BUILDSR (sd);
2578               rd = h8_get_ccr (sd);
2579             }
2580           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2581             {
2582               if (h8300smode)
2583                 h8_set_exr (sd, (trace << 7) | intMask);
2584               rd = h8_get_exr (sd);
2585             }
2586           else
2587             goto illegal;
2588           ea = code->src.literal;
2589           res = rd | ea;
2590           goto setc;
2591
2592         case O (O_XORC, SB):            /* xorc.b */
2593           if (code->dst.type == X (OP_CCR, SB))
2594             {
2595               BUILDSR (sd);
2596               rd = h8_get_ccr (sd);
2597             }
2598           else if (code->dst.type == X (OP_EXR, SB) && h8300smode)
2599             {
2600               if (h8300smode)
2601                 h8_set_exr (sd, (trace << 7) | intMask);
2602               rd = h8_get_exr (sd);
2603             }
2604           else
2605             goto illegal;
2606           ea = code->src.literal;
2607           res = rd ^ ea;
2608           goto setc;
2609
2610         case O (O_BRAS, SB):            /* bra/s  */
2611           /* This is basically an ordinary branch, with a delay slot.  */
2612           if (fetch (sd, &code->src, &res))
2613             goto end;
2614
2615           if ((res & 1) == 0)
2616             goto illegal;
2617
2618           res -= 1;
2619
2620           /* Execution continues at next instruction, but
2621              delayed_branch is set up for next cycle.  */
2622           h8_set_delayed_branch (sd, code->next_pc + res);
2623           pc = code->next_pc;
2624           goto end;
2625
2626         case O (O_BRAB, SB):            /* bra rd.b */
2627         case O (O_BRAW, SW):            /* bra rd.w */
2628         case O (O_BRAL, SL):            /* bra erd.l */
2629           if (fetch (sd, &code->src, &rd))
2630             goto end;
2631           switch (OP_SIZE (code->opcode)) {
2632           case SB:      rd &= 0xff;             break;
2633           case SW:      rd &= 0xffff;           break;
2634           case SL:      rd &= 0xffffffff;       break;
2635           }
2636           pc = code->next_pc + rd;
2637           goto end;
2638
2639         case O (O_BRABC, SB):           /* bra/bc, branch if bit clear */
2640         case O (O_BRABS, SB):           /* bra/bs, branch if bit set   */
2641         case O (O_BSRBC, SB):           /* bsr/bc, call   if bit clear */
2642         case O (O_BSRBS, SB):           /* bsr/bs, call   if bit set   */
2643           if (fetch (sd, &code->dst, &rd) ||
2644               fetch (sd, &code->src, &bit))
2645             goto end;
2646
2647           if (code->opcode == O (O_BRABC, SB) || /* branch if clear */
2648               code->opcode == O (O_BSRBC, SB))   /* call   if clear */
2649             {
2650               if ((rd & (1 << bit)))            /* no branch */
2651                 goto next;
2652             }
2653           else                                  /* branch/call if set */
2654             {
2655               if (!(rd & (1 << bit)))           /* no branch */
2656                 goto next;
2657             }
2658
2659           if (fetch (sd, &code->op3, &res))     /* branch */
2660             goto end;
2661           pc = code->next_pc + res;
2662
2663           if (code->opcode == O (O_BRABC, SB) ||
2664               code->opcode == O (O_BRABS, SB))  /* branch */
2665             goto end;
2666           else                                  /* call   */
2667             goto call;
2668
2669         case O (O_BRA, SN):
2670         case O (O_BRA, SL):
2671         case O (O_BRA, SW):
2672         case O (O_BRA, SB):             /* bra, branch always */
2673           if (1)
2674             goto condtrue;
2675           goto next;
2676
2677         case O (O_BRN, SB):             /* brn, ;-/  branch never? */
2678           if (0)
2679             goto condtrue;
2680           goto next;
2681
2682         case O (O_BHI, SB):             /* bhi */
2683           if ((C || Z) == 0)
2684             goto condtrue;
2685           goto next;
2686
2687
2688         case O (O_BLS, SB):             /* bls */
2689           if ((C || Z))
2690             goto condtrue;
2691           goto next;
2692
2693         case O (O_BCS, SB):             /* bcs, branch if carry set */
2694           if ((C == 1))
2695             goto condtrue;
2696           goto next;
2697
2698         case O (O_BCC, SB):             /* bcc, branch if carry clear */
2699           if ((C == 0))
2700             goto condtrue;
2701           goto next;
2702
2703         case O (O_BEQ, SB):             /* beq, branch if zero set */
2704           if (Z)
2705             goto condtrue;
2706           goto next;
2707         case O (O_BGT, SB):             /* bgt */
2708           if (((Z || (N ^ V)) == 0))
2709             goto condtrue;
2710           goto next;
2711
2712         case O (O_BLE, SB):             /* ble */
2713           if (((Z || (N ^ V)) == 1))
2714             goto condtrue;
2715           goto next;
2716
2717         case O (O_BGE, SB):             /* bge */
2718           if ((N ^ V) == 0)
2719             goto condtrue;
2720           goto next;
2721         case O (O_BLT, SB):             /* blt */
2722           if ((N ^ V))
2723             goto condtrue;
2724           goto next;
2725         case O (O_BMI, SB):             /* bmi */
2726           if ((N))
2727             goto condtrue;
2728           goto next;
2729         case O (O_BNE, SB):             /* bne, branch if zero clear */
2730           if ((Z == 0))
2731             goto condtrue;
2732           goto next;
2733
2734         case O (O_BPL, SB):             /* bpl */
2735           if (N == 0)
2736             goto condtrue;
2737           goto next;
2738         case O (O_BVC, SB):             /* bvc */
2739           if ((V == 0))
2740             goto condtrue;
2741           goto next;
2742         case O (O_BVS, SB):             /* bvs */
2743           if ((V == 1))
2744             goto condtrue;
2745           goto next;
2746
2747         /* Trap for Command Line setup.  */
2748         case O (O_SYS_CMDLINE, SB):
2749           {
2750             int i = 0;          /* Loop counter.  */
2751             int j = 0;          /* Loop counter.  */
2752             int ind_arg_len = 0;        /* Length of each argument.  */
2753             int no_of_args = 0; /* The no. or cmdline args.  */
2754             int current_location = 0;   /* Location of string.  */
2755             int old_sp = 0;     /* The Initial Stack Pointer.  */
2756             int no_of_slots = 0;        /* No. of slots required on the stack
2757                                            for storing cmdline args.  */
2758             int sp_move = 0;    /* No. of locations by which the stack needs
2759                                    to grow.  */
2760             int new_sp = 0;     /* The final stack pointer location passed
2761                                    back.  */
2762             int *argv_ptrs;     /* Pointers of argv strings to be stored.  */
2763             int argv_ptrs_location = 0; /* Location of pointers to cmdline
2764                                            args on the stack.  */
2765             int char_ptr_size = 0;      /* Size of a character pointer on
2766                                            target machine.  */
2767             int addr_cmdline = 0;       /* Memory location where cmdline has
2768                                            to be stored.  */
2769             int size_cmdline = 0;       /* Size of cmdline.  */
2770
2771             /* Set the address of 256 free locations where command line is
2772                stored.  */
2773             addr_cmdline = cmdline_location();
2774             h8_set_reg (sd, 0, addr_cmdline);
2775
2776             /* Counting the no. of commandline arguments.  */
2777             for (i = 0; h8_get_cmdline_arg (sd, i) != NULL; i++)
2778               continue;
2779
2780             /* No. of arguments in the command line.  */
2781             no_of_args = i;
2782
2783             /* Current location is just a temporary variable,which we are
2784                setting to the point to the start of our commandline string.  */
2785             current_location = addr_cmdline;
2786
2787             /* Allocating space for storing pointers of the command line
2788                arguments.  */
2789             argv_ptrs = (int *) malloc (sizeof (int) * no_of_args);
2790
2791             /* Setting char_ptr_size to the sizeof (char *) on the different
2792                architectures.  */
2793             if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2794               {
2795                 char_ptr_size = 4;
2796               }
2797             else
2798               {
2799                 char_ptr_size = 2;
2800               }
2801
2802             for (i = 0; i < no_of_args; i++)
2803               {
2804                 ind_arg_len = 0;
2805
2806                 /* The size of the commandline argument.  */
2807                 ind_arg_len = strlen (h8_get_cmdline_arg (sd, i)) + 1;
2808
2809                 /* The total size of the command line string.  */
2810                 size_cmdline += ind_arg_len;
2811
2812                 /* As we have only 256 bytes, we need to provide a graceful
2813                    exit. Anyways, a program using command line arguments 
2814                    where we cannot store all the command line arguments
2815                    given may behave unpredictably.  */
2816                 if (size_cmdline >= 256)
2817                   {
2818                     h8_set_reg (sd, 0, 0);
2819                     goto next;
2820                   }
2821                 else
2822                   {
2823                     /* current_location points to the memory where the next
2824                        commandline argument is stored.  */
2825                     argv_ptrs[i] = current_location;
2826                     for (j = 0; j < ind_arg_len; j++)
2827                       {
2828                         SET_MEMORY_B ((current_location +
2829                                        (sizeof (char) * j)),
2830                                       *(h8_get_cmdline_arg (sd, i) + 
2831                                        sizeof (char) * j));
2832                       }
2833
2834                     /* Setting current_location to the starting of next
2835                        argument.  */
2836                     current_location += ind_arg_len;
2837                   }
2838               }
2839
2840             /* This is the original position of the stack pointer.  */
2841             old_sp = h8_get_reg (sd, SP_REGNUM);
2842
2843             /* We need space from the stack to store the pointers to argvs.  */
2844             /* As we will infringe on the stack, we need to shift the stack
2845                pointer so that the data is not overwritten. We calculate how
2846                much space is required.  */
2847             sp_move = (no_of_args) * (char_ptr_size);
2848
2849             /* The final position of stack pointer, we have thus taken some
2850                space from the stack.  */
2851             new_sp = old_sp - sp_move;
2852
2853             /* Temporary variable holding value where the argv pointers need
2854                to be stored.  */
2855             argv_ptrs_location = new_sp;
2856
2857             /* The argv pointers are stored at sequential locations. As per
2858                the H8300 ABI.  */
2859             for (i = 0; i < no_of_args; i++)
2860               {
2861                 /* Saving the argv pointer.  */
2862                 if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2863                   {
2864                     SET_MEMORY_L (argv_ptrs_location, argv_ptrs[i]);
2865                   }
2866                 else
2867                   {
2868                     SET_MEMORY_W (argv_ptrs_location, argv_ptrs[i]);
2869                   }
2870         
2871                 /* The next location where the pointer to the next argv
2872                    string has to be stored.  */    
2873                 argv_ptrs_location += char_ptr_size;
2874               }
2875
2876             /* Required by POSIX, Setting 0x0 at the end of the list of argv
2877                pointers.  */
2878             if ((h8300hmode || h8300smode) && !h8300_normal_mode)
2879               {
2880                 SET_MEMORY_L (old_sp, 0x0);
2881               }
2882             else
2883               {
2884                 SET_MEMORY_W (old_sp, 0x0);
2885               }
2886
2887             /* Freeing allocated memory.  */
2888             free (argv_ptrs);
2889             for (i = 0; i <= no_of_args; i++)
2890               {
2891                 free (h8_get_cmdline_arg (sd, i));
2892               }
2893             free (h8_get_command_line (sd));
2894
2895             /* The no. of argv arguments are returned in Reg 0.  */
2896             h8_set_reg (sd, 0, no_of_args);
2897             /* The Pointer to argv in Register 1.  */
2898             h8_set_reg (sd, 1, new_sp);
2899             /* Setting the stack pointer to the new value.  */
2900             h8_set_reg (sd, SP_REGNUM, new_sp);
2901           }
2902           goto next;
2903
2904           /* System call processing starts.  */
2905         case O (O_SYS_OPEN, SB):
2906           {
2907             int len = 0;        /* Length of filename.  */
2908             char *filename;     /* Filename would go here.  */
2909             char temp_char;     /* Temporary character */
2910             int mode = 0;       /* Mode bits for the file.  */
2911             int open_return;    /* Return value of open, file descriptor.  */
2912             int i;              /* Loop counter */
2913             int filename_ptr;   /* Pointer to filename in cpu memory.  */
2914
2915             /* Setting filename_ptr to first argument of open,  */
2916             /* and trying to get mode.  */
2917             if ((h8300sxmode || h8300hmode || h8300smode) && !h8300_normal_mode)
2918               {
2919                 filename_ptr = GET_L_REG (0);
2920                 mode = GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM) + 4);
2921               }
2922             else
2923               {
2924                 filename_ptr = GET_W_REG (0);
2925                 mode = GET_MEMORY_W (h8_get_reg (sd, SP_REGNUM) + 2);
2926               }
2927
2928             /* Trying to find the length of the filename.  */
2929             temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
2930
2931             len = 1;
2932             while (temp_char != '\0')
2933               {
2934                 temp_char = GET_MEMORY_B (filename_ptr + len);
2935                 len++;
2936               }
2937
2938             /* Allocating space for the filename.  */
2939             filename = (char *) malloc (sizeof (char) * len);
2940
2941             /* String copying the filename from memory.  */
2942             for (i = 0; i < len; i++)
2943               {
2944                 temp_char = GET_MEMORY_B (filename_ptr + i);
2945                 filename[i] = temp_char;
2946               }
2947
2948             /* Callback to open and return the file descriptor.  */
2949             open_return = sim_callback->open (sim_callback, filename, mode);
2950
2951             /* Return value in register 0.  */
2952             h8_set_reg (sd, 0, open_return);
2953
2954             /* Freeing memory used for filename. */
2955             free (filename);
2956           }
2957           goto next;
2958
2959         case O (O_SYS_READ, SB):
2960           {
2961             char *char_ptr;     /* Where characters read would be stored.  */
2962             int fd;             /* File descriptor */
2963             int buf_size;       /* BUF_SIZE parameter in read.  */
2964             int i = 0;          /* Temporary Loop counter */
2965             int read_return = 0;        /* Return value from callback to
2966                                            read.  */
2967
2968             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
2969             buf_size = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
2970
2971             char_ptr = (char *) malloc (sizeof (char) * buf_size);
2972
2973             /* Callback to read and return the no. of characters read.  */
2974             read_return =
2975               sim_callback->read (sim_callback, fd, char_ptr, buf_size);
2976
2977             /* The characters read are stored in cpu memory.  */
2978             for (i = 0; i < buf_size; i++)
2979               {
2980                 SET_MEMORY_B ((h8_get_reg (sd, 1) + (sizeof (char) * i)),
2981                               *(char_ptr + (sizeof (char) * i)));
2982               }
2983
2984             /* Return value in Register 0.  */
2985             h8_set_reg (sd, 0, read_return);
2986
2987             /* Freeing memory used as buffer.  */
2988             free (char_ptr);
2989           }
2990           goto next;
2991
2992         case O (O_SYS_WRITE, SB):
2993           {
2994             int fd;             /* File descriptor */
2995             char temp_char;     /* Temporary character */
2996             int len;            /* Length of write, Parameter II to write.  */
2997             int char_ptr;       /* Character Pointer, Parameter I of write.  */
2998             char *ptr;          /* Where characters to be written are stored. 
2999                                  */
3000             int write_return;   /* Return value from callback to write.  */
3001             int i = 0;          /* Loop counter */
3002
3003             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3004             char_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3005             len = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3006
3007             /* Allocating space for the characters to be written.  */
3008             ptr = (char *) malloc (sizeof (char) * len);
3009
3010             /* Fetching the characters from cpu memory.  */
3011             for (i = 0; i < len; i++)
3012               {
3013                 temp_char = GET_MEMORY_B (char_ptr + i);
3014                 ptr[i] = temp_char;
3015               }
3016
3017             /* Callback write and return the no. of characters written.  */
3018             write_return = sim_callback->write (sim_callback, fd, ptr, len);
3019
3020             /* Return value in Register 0.  */
3021             h8_set_reg (sd, 0, write_return);
3022
3023             /* Freeing memory used as buffer.  */
3024             free (ptr);
3025           }
3026           goto next;
3027
3028         case O (O_SYS_LSEEK, SB):
3029           {
3030             int fd;             /* File descriptor */
3031             int offset;         /* Offset */
3032             int origin;         /* Origin */
3033             int lseek_return;   /* Return value from callback to lseek.  */
3034
3035             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3036             offset = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3037             origin = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (2) : GET_W_REG (2);
3038
3039             /* Callback lseek and return offset.  */
3040             lseek_return =
3041               sim_callback->lseek (sim_callback, fd, offset, origin);
3042
3043             /* Return value in register 0.  */
3044             h8_set_reg (sd, 0, lseek_return);
3045           }
3046           goto next;
3047
3048         case O (O_SYS_CLOSE, SB):
3049           {
3050             int fd;             /* File descriptor */
3051             int close_return;   /* Return value from callback to close.  */
3052
3053             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3054
3055             /* Callback close and return.  */
3056             close_return = sim_callback->close (sim_callback, fd);
3057
3058             /* Return value in register 0.  */
3059             h8_set_reg (sd, 0, close_return);
3060           }
3061           goto next;
3062
3063         case O (O_SYS_FSTAT, SB):
3064           {
3065             int fd;             /* File descriptor */
3066             struct stat stat_rec;       /* Stat record */
3067             int fstat_return;   /* Return value from callback to stat.  */
3068             int stat_ptr;       /* Pointer to stat record.  */
3069             char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3070
3071             fd = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3072
3073             /* Setting stat_ptr to second argument of stat.  */
3074             stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3075
3076             /* Callback stat and return.  */
3077             fstat_return = sim_callback->fstat (sim_callback, fd, &stat_rec);
3078
3079             /* Have stat_ptr point to starting of stat_rec.  */
3080             temp_stat_ptr = (char *) (&stat_rec);
3081
3082             /* Setting up the stat structure returned.  */
3083             SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3084             stat_ptr += 2;
3085             SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3086             stat_ptr += 2;
3087             SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3088             stat_ptr += 4;
3089             SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3090             stat_ptr += 2;
3091             SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3092             stat_ptr += 2;
3093             SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3094             stat_ptr += 2;
3095             SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3096             stat_ptr += 2;
3097             SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3098             stat_ptr += 4;
3099             SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3100             stat_ptr += 8;
3101             SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3102             stat_ptr += 8;
3103             SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3104
3105             /* Return value in register 0.  */
3106             h8_set_reg (sd, 0, fstat_return);
3107           }
3108           goto next;
3109
3110         case O (O_SYS_STAT, SB):
3111           {
3112             int len = 0;        /* Length of filename.  */
3113             char *filename;     /* Filename would go here.  */
3114             char temp_char;     /* Temporary character */
3115             int filename_ptr;   /* Pointer to filename in cpu memory.  */
3116             struct stat stat_rec;       /* Stat record */
3117             int stat_return;    /* Return value from callback to stat */
3118             int stat_ptr;       /* Pointer to stat record.  */
3119             char *temp_stat_ptr;        /* Temporary stat_rec pointer.  */
3120             int i = 0;          /* Loop Counter */
3121
3122             /* Setting filename_ptr to first argument of open.  */
3123             filename_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (0) : GET_W_REG (0);
3124
3125             /* Trying to find the length of the filename.  */
3126             temp_char = GET_MEMORY_B (h8_get_reg (sd, 0));
3127
3128             len = 1;
3129             while (temp_char != '\0')
3130               {
3131                 temp_char = GET_MEMORY_B (filename_ptr + len);
3132                 len++;
3133               }
3134
3135             /* Allocating space for the filename.  */
3136             filename = (char *) malloc (sizeof (char) * len);
3137
3138             /* String copying the filename from memory.  */
3139             for (i = 0; i < len; i++)
3140               {
3141                 temp_char = GET_MEMORY_B (filename_ptr + i);
3142                 filename[i] = temp_char;
3143               }
3144
3145             /* Setting stat_ptr to second argument of stat.  */
3146             /* stat_ptr = h8_get_reg (sd, 1); */
3147             stat_ptr = (h8300hmode && !h8300_normal_mode) ? GET_L_REG (1) : GET_W_REG (1);
3148
3149             /* Callback stat and return.  */
3150             stat_return =
3151               sim_callback->stat (sim_callback, filename, &stat_rec);
3152
3153             /* Have stat_ptr point to starting of stat_rec.  */
3154             temp_stat_ptr = (char *) (&stat_rec);
3155  
3156             /* Freeing memory used for filename.  */
3157             free (filename);
3158  
3159             /* Setting up the stat structure returned.  */
3160             SET_MEMORY_W (stat_ptr, stat_rec.st_dev);
3161             stat_ptr += 2;
3162             SET_MEMORY_W (stat_ptr, stat_rec.st_ino);
3163             stat_ptr += 2;
3164             SET_MEMORY_L (stat_ptr, stat_rec.st_mode);
3165             stat_ptr += 4;
3166             SET_MEMORY_W (stat_ptr, stat_rec.st_nlink);
3167             stat_ptr += 2;
3168             SET_MEMORY_W (stat_ptr, stat_rec.st_uid);
3169             stat_ptr += 2;
3170             SET_MEMORY_W (stat_ptr, stat_rec.st_gid);
3171             stat_ptr += 2;
3172             SET_MEMORY_W (stat_ptr, stat_rec.st_rdev);
3173             stat_ptr += 2;
3174             SET_MEMORY_L (stat_ptr, stat_rec.st_size);
3175             stat_ptr += 4;
3176             SET_MEMORY_L (stat_ptr, stat_rec.st_atime);
3177             stat_ptr += 8;
3178             SET_MEMORY_L (stat_ptr, stat_rec.st_mtime);
3179             stat_ptr += 8;
3180             SET_MEMORY_L (stat_ptr, stat_rec.st_ctime);
3181  
3182             /* Return value in register 0.  */
3183             h8_set_reg (sd, 0, stat_return);
3184           }
3185           goto next;
3186           /* End of system call processing.  */
3187
3188         case O (O_NOT, SB):             /* not.b */
3189           if (fetch2 (sd, &code->src, &rd))
3190             goto end;
3191           rd = ~rd; 
3192           v = 0;
3193           goto shift8;
3194
3195         case O (O_NOT, SW):             /* not.w */
3196           if (fetch2 (sd, &code->src, &rd))
3197             goto end;
3198           rd = ~rd; 
3199           v = 0;
3200           goto shift16;
3201
3202         case O (O_NOT, SL):             /* not.l */
3203           if (fetch2 (sd, &code->src, &rd))
3204             goto end;
3205           rd = ~rd; 
3206           v = 0;
3207           goto shift32;
3208
3209         case O (O_SHLL, SB):    /* shll.b */
3210         case O (O_SHLR, SB):    /* shlr.b */
3211           if (fetch2 (sd, &code->dst, &rd))
3212             goto end;
3213
3214           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3215             ea = 1;             /* unary  op */
3216           else                  /* binary op */
3217             fetch (sd, &code->src, &ea);
3218
3219           if (code->opcode == O (O_SHLL, SB))
3220             {
3221               v = (ea > 8);
3222               c = rd & (0x80 >> (ea - 1));
3223               rd <<= ea;
3224             }
3225           else
3226             {
3227               v = 0;
3228               c = rd & (1 << (ea - 1));
3229               rd = (unsigned char) rd >> ea;
3230             }
3231           goto shift8;
3232
3233         case O (O_SHLL, SW):    /* shll.w */
3234         case O (O_SHLR, SW):    /* shlr.w */
3235           if (fetch2 (sd, &code->dst, &rd))
3236             goto end;
3237
3238           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3239             ea = 1;             /* unary  op */
3240           else
3241             fetch (sd, &code->src, &ea);
3242
3243           if (code->opcode == O (O_SHLL, SW))
3244             {
3245               v = (ea > 16);
3246               c = rd & (0x8000 >> (ea - 1));
3247               rd <<= ea;
3248             }
3249           else
3250             {
3251               v = 0;
3252               c = rd & (1 << (ea - 1));
3253               rd = (unsigned short) rd >> ea;
3254             }
3255           goto shift16;
3256
3257         case O (O_SHLL, SL):    /* shll.l */
3258         case O (O_SHLR, SL):    /* shlr.l */
3259           if (fetch2 (sd, &code->dst, &rd))
3260             goto end;
3261
3262           if (memcmp (&code->src, &code->dst, sizeof (code->src)) == 0)
3263             ea = 1;             /* unary  op */
3264           else
3265             fetch (sd, &code->src, &ea);
3266
3267           if (code->opcode == O (O_SHLL, SL))
3268             {
3269               v = (ea > 32);
3270               c = rd & (0x80000000 >> (ea - 1));
3271               rd <<= ea;
3272             }
3273           else
3274             {
3275               v = 0;
3276               c = rd & (1 << (ea - 1));
3277               rd = (unsigned int) rd >> ea;
3278             }
3279           goto shift32;
3280
3281         case O (O_SHAL, SB):
3282         case O (O_SHAR, SB):
3283           if (fetch2 (sd, &code->dst, &rd))
3284             goto end;
3285
3286           if (code->src.type == X (OP_IMM, SB))
3287             fetch (sd, &code->src, &ea);
3288           else
3289             ea = 1;
3290
3291           if (code->opcode == O (O_SHAL, SB))
3292             {
3293               c = rd & (0x80 >> (ea - 1));
3294               res = rd >> (7 - ea);
3295               v = ((res & 1) && !(res & 2)) 
3296                 || (!(res & 1) && (res & 2));
3297               rd <<= ea;
3298             }
3299           else
3300             {
3301               c = rd & (1 << (ea - 1));
3302               v = 0;
3303               rd = ((signed char) rd) >> ea;
3304             }
3305           goto shift8;
3306
3307         case O (O_SHAL, SW):
3308         case O (O_SHAR, SW):
3309           if (fetch2 (sd, &code->dst, &rd))
3310             goto end;
3311
3312           if (code->src.type == X (OP_IMM, SW))
3313             fetch (sd, &code->src, &ea);
3314           else
3315             ea = 1;
3316
3317           if (code->opcode == O (O_SHAL, SW))
3318             {
3319               c = rd & (0x8000 >> (ea - 1));
3320               res = rd >> (15 - ea);
3321               v = ((res & 1) && !(res & 2)) 
3322                 || (!(res & 1) && (res & 2));
3323               rd <<= ea;
3324             }
3325           else
3326             {
3327               c = rd & (1 << (ea - 1));
3328               v = 0;
3329               rd = ((signed short) rd) >> ea;
3330             }
3331           goto shift16;
3332
3333         case O (O_SHAL, SL):
3334         case O (O_SHAR, SL):
3335           if (fetch2 (sd, &code->dst, &rd))
3336             goto end;
3337
3338           if (code->src.type == X (OP_IMM, SL))
3339             fetch (sd, &code->src, &ea);
3340           else
3341             ea = 1;
3342
3343           if (code->opcode == O (O_SHAL, SL))
3344             {
3345               c = rd & (0x80000000 >> (ea - 1));
3346               res = rd >> (31 - ea);
3347               v = ((res & 1) && !(res & 2)) 
3348                 || (!(res & 1) && (res & 2));
3349               rd <<= ea;
3350             }
3351           else
3352             {
3353               c = rd & (1 << (ea - 1));
3354               v = 0;
3355               rd = ((signed int) rd) >> ea;
3356             }
3357           goto shift32;
3358
3359         case O (O_ROTL, SB):
3360         case O (O_ROTR, SB):
3361           if (fetch2 (sd, &code->dst, &rd))
3362             goto end;
3363
3364           if (code->src.type == X (OP_IMM, SB))
3365             fetch (sd, &code->src, &ea);
3366           else
3367             ea = 1;
3368
3369           while (ea--)
3370             if (code->opcode == O (O_ROTL, SB))
3371               {
3372                 c = rd & 0x80;
3373                 rd <<= 1;
3374                 if (c)
3375                   rd |= 1;
3376               }
3377             else
3378               {
3379                 c = rd & 1;
3380                 rd = ((unsigned char) rd) >> 1;
3381                 if (c)
3382                   rd |= 0x80;
3383               }
3384
3385           v = 0;
3386           goto shift8;
3387
3388         case O (O_ROTL, SW):
3389         case O (O_ROTR, SW):
3390           if (fetch2 (sd, &code->dst, &rd))
3391             goto end;
3392
3393           if (code->src.type == X (OP_IMM, SW))
3394             fetch (sd, &code->src, &ea);
3395           else
3396             ea = 1;
3397
3398           while (ea--)
3399             if (code->opcode == O (O_ROTL, SW))
3400               {
3401                 c = rd & 0x8000;
3402                 rd <<= 1;
3403                 if (c)
3404                   rd |= 1;
3405               }
3406             else
3407               {
3408                 c = rd & 1;
3409                 rd = ((unsigned short) rd) >> 1;
3410                 if (c)
3411                   rd |= 0x8000;
3412               }
3413
3414           v = 0;
3415           goto shift16;
3416
3417         case O (O_ROTL, SL):
3418         case O (O_ROTR, SL):
3419           if (fetch2 (sd, &code->dst, &rd))
3420             goto end;
3421
3422           if (code->src.type == X (OP_IMM, SL))
3423             fetch (sd, &code->src, &ea);
3424           else
3425             ea = 1;
3426
3427           while (ea--)
3428             if (code->opcode == O (O_ROTL, SL))
3429               {
3430                 c = rd & 0x80000000;
3431                 rd <<= 1;
3432                 if (c)
3433                   rd |= 1;
3434               }
3435             else
3436               {
3437                 c = rd & 1;
3438                 rd = ((unsigned int) rd) >> 1;
3439                 if (c)
3440                   rd |= 0x80000000;
3441               }
3442
3443           v = 0;
3444           goto shift32;
3445
3446         case O (O_ROTXL, SB):
3447         case O (O_ROTXR, SB):
3448           if (fetch2 (sd, &code->dst, &rd))
3449             goto end;
3450
3451           if (code->src.type == X (OP_IMM, SB))
3452             fetch (sd, &code->src, &ea);
3453           else
3454             ea = 1;
3455
3456           while (ea--)
3457             if (code->opcode == O (O_ROTXL, SB))
3458               {
3459                 res = rd & 0x80;
3460                 rd <<= 1;
3461                 if (C)
3462                   rd |= 1;
3463                 c = res;
3464               }
3465             else
3466               {
3467                 res = rd & 1;
3468                 rd = ((unsigned char) rd) >> 1;
3469                 if (C)
3470                   rd |= 0x80;
3471                 c = res;
3472               }
3473
3474           v = 0;
3475           goto shift8;
3476
3477         case O (O_ROTXL, SW):
3478         case O (O_ROTXR, SW):
3479           if (fetch2 (sd, &code->dst, &rd))
3480             goto end;
3481
3482           if (code->src.type == X (OP_IMM, SW))
3483             fetch (sd, &code->src, &ea);
3484           else
3485             ea = 1;
3486
3487           while (ea--)
3488             if (code->opcode == O (O_ROTXL, SW))
3489               {
3490                 res = rd & 0x8000;
3491                 rd <<= 1;
3492                 if (C)
3493                   rd |= 1;
3494                 c = res;
3495               }
3496             else
3497               {
3498                 res = rd & 1;
3499                 rd = ((unsigned short) rd) >> 1;
3500                 if (C)
3501                   rd |= 0x8000;
3502                 c = res;
3503               }
3504
3505           v = 0;
3506           goto shift16;
3507
3508         case O (O_ROTXL, SL):
3509         case O (O_ROTXR, SL):
3510           if (fetch2 (sd, &code->dst, &rd))
3511             goto end;
3512
3513           if (code->src.type == X (OP_IMM, SL))
3514             fetch (sd, &code->src, &ea);
3515           else
3516             ea = 1;
3517
3518           while (ea--)
3519             if (code->opcode == O (O_ROTXL, SL))
3520               {
3521                 res = rd & 0x80000000;
3522                 rd <<= 1;
3523                 if (C)
3524                   rd |= 1;
3525                 c = res;
3526               }
3527             else
3528               {
3529                 res = rd & 1;
3530                 rd = ((unsigned int) rd) >> 1;
3531                 if (C)
3532                   rd |= 0x80000000;
3533                 c = res;
3534               }
3535
3536           v = 0;
3537           goto shift32;
3538
3539         case O (O_JMP, SN):
3540         case O (O_JMP, SL):
3541         case O (O_JMP, SB):             /* jmp */
3542         case O (O_JMP, SW):
3543           fetch (sd, &code->src, &pc);
3544           goto end;
3545
3546         case O (O_JSR, SN):
3547         case O (O_JSR, SL):
3548         case O (O_JSR, SB):             /* jsr, jump to subroutine */
3549         case O (O_JSR, SW):
3550           if (fetch (sd, &code->src, &pc))
3551             goto end;
3552         call:
3553           tmp = h8_get_reg (sd, SP_REGNUM);
3554
3555           if (h8300hmode && !h8300_normal_mode)
3556             {
3557               tmp -= 4;
3558               SET_MEMORY_L (tmp, code->next_pc);
3559             }
3560           else
3561             {
3562               tmp -= 2;
3563               SET_MEMORY_W (tmp, code->next_pc);
3564             }
3565           h8_set_reg (sd, SP_REGNUM, tmp);
3566
3567           goto end;
3568
3569         case O (O_BSR, SW):
3570         case O (O_BSR, SL):
3571         case O (O_BSR, SB):             /* bsr, branch to subroutine */
3572           if (fetch (sd, &code->src, &res))
3573             goto end;
3574           pc = code->next_pc + res;
3575           goto call;
3576
3577         case O (O_RTE, SN):             /* rte, return from exception */
3578         rte:
3579           /* Pops exr and ccr before pc -- otherwise identical to rts.  */
3580           tmp = h8_get_reg (sd, SP_REGNUM);
3581
3582           if (h8300smode)                       /* pop exr */
3583             {
3584               h8_set_exr (sd, GET_MEMORY_L (tmp));
3585               tmp += 4;
3586             }
3587           if (h8300hmode && !h8300_normal_mode)
3588             {
3589               h8_set_ccr (sd, GET_MEMORY_L (tmp));
3590               tmp += 4;
3591               pc = GET_MEMORY_L (tmp);
3592               tmp += 4;
3593             }
3594           else
3595             {
3596               h8_set_ccr (sd, GET_MEMORY_W (tmp));
3597               tmp += 2;
3598               pc = GET_MEMORY_W (tmp);
3599               tmp += 2;
3600             }
3601
3602           GETSR (sd);
3603           h8_set_reg (sd, SP_REGNUM, tmp);
3604           goto end;
3605
3606         case O (O_RTS, SN):             /* rts, return from subroutine */
3607         rts:
3608           tmp = h8_get_reg (sd, SP_REGNUM);
3609
3610           if (h8300hmode && !h8300_normal_mode)
3611             {
3612               pc = GET_MEMORY_L (tmp);
3613               tmp += 4;
3614             }
3615           else
3616             {
3617               pc = GET_MEMORY_W (tmp);
3618               tmp += 2;
3619             }
3620
3621           h8_set_reg (sd, SP_REGNUM, tmp);
3622           goto end;
3623
3624         case O (O_ILL, SB):             /* illegal */
3625           sim_engine_set_run_state (sd, sim_stopped, SIGILL);
3626           goto end;
3627
3628         case O (O_SLEEP, SN):           /* sleep */
3629           /* Check for magic numbers in r1 and r2.  */
3630           if ((h8_get_reg (sd, R1_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC1 &&
3631               (h8_get_reg (sd, R2_REGNUM) & 0xffff) == LIBC_EXIT_MAGIC2 &&
3632               SIM_WIFEXITED (h8_get_reg (sd, 0)))
3633             {
3634               /* This trap comes from _exit, not from gdb.  */
3635               sim_engine_set_run_state (sd, sim_exited, 
3636                                         SIM_WEXITSTATUS (h8_get_reg (sd, 0)));
3637             }
3638 #if 0
3639           /* Unfortunately this won't really work, because
3640              when we take a breakpoint trap, R0 has a "random", 
3641              user-defined value.  Don't see any immediate solution.  */
3642           else if (SIM_WIFSTOPPED (h8_get_reg (sd, 0)))
3643             {
3644               /* Pass the stop signal up to gdb.  */
3645               sim_engine_set_run_state (sd, sim_stopped, 
3646                                         SIM_WSTOPSIG (h8_get_reg (sd, 0)));
3647             }
3648 #endif
3649           else
3650             {
3651               /* Treat it as a sigtrap.  */
3652               sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3653             }
3654           goto end;
3655
3656         case O (O_TRAPA, SB):           /* trapa */
3657           if (fetch (sd, &code->src, &res))
3658             goto end;                   /* res is vector number.  */
3659   
3660           tmp = h8_get_reg (sd, SP_REGNUM);
3661           if(h8300_normal_mode)
3662             {
3663               tmp -= 2;
3664               SET_MEMORY_W (tmp, code->next_pc);
3665               tmp -= 2;
3666               SET_MEMORY_W (tmp, h8_get_ccr (sd));
3667             }
3668           else
3669             {
3670               tmp -= 4;
3671               SET_MEMORY_L (tmp, code->next_pc);
3672               tmp -= 4;
3673               SET_MEMORY_L (tmp, h8_get_ccr (sd));
3674             }
3675           intMaskBit = 1;
3676           BUILDSR (sd);
3677  
3678           if (h8300smode)
3679             {
3680               tmp -= 4;
3681               SET_MEMORY_L (tmp, h8_get_exr (sd));
3682             }
3683
3684           h8_set_reg (sd, SP_REGNUM, tmp);
3685
3686           if(h8300_normal_mode)
3687             pc = GET_MEMORY_L (0x10 + res * 2); /* Vector addresses are 0x10,0x12,0x14 and 0x16 */
3688           else
3689             pc = GET_MEMORY_L (0x20 + res * 4);
3690           goto end;
3691
3692         case O (O_BPT, SN):
3693           sim_engine_set_run_state (sd, sim_stopped, SIGTRAP);
3694           goto end;
3695
3696         case O (O_BSETEQ, SB):
3697           if (Z)
3698             goto bset;
3699           goto next;
3700
3701         case O (O_BSETNE, SB):
3702           if (!Z)
3703             goto bset;
3704           goto next;
3705
3706         case O (O_BCLREQ, SB):
3707           if (Z)
3708             goto bclr;
3709           goto next;
3710
3711         case O (O_BCLRNE, SB):
3712           if (!Z)
3713             goto bclr;
3714           goto next;
3715
3716           OBITOP (O_BNOT, 1, 1, ea ^= m);               /* bnot */
3717           OBITOP (O_BTST, 1, 0, nz = ea & m);           /* btst */
3718         bset:
3719           OBITOP (O_BSET, 1, 1, ea |= m);               /* bset */
3720         bclr:
3721           OBITOP (O_BCLR, 1, 1, ea &= ~m);              /* bclr */
3722           OBITOP (O_BLD, 1, 0, c = ea & m);             /* bld  */
3723           OBITOP (O_BILD, 1, 0, c = !(ea & m));         /* bild */
3724           OBITOP (O_BST, 1, 1, ea &= ~m;
3725                   if (C) ea |= m);                      /* bst  */
3726           OBITOP (O_BIST, 1, 1, ea &= ~m;
3727                   if (!C) ea |= m);                     /* bist */
3728           OBITOP (O_BSTZ, 1, 1, ea &= ~m;
3729                   if (Z) ea |= m);                      /* bstz */
3730           OBITOP (O_BISTZ, 1, 1, ea &= ~m;
3731                   if (!Z) ea |= m);                     /* bistz */
3732           OBITOP (O_BAND, 1, 0, c = (ea & m) && C);     /* band */
3733           OBITOP (O_BIAND, 1, 0, c = !(ea & m) && C);   /* biand */
3734           OBITOP (O_BOR, 1, 0, c = (ea & m) || C);      /* bor  */
3735           OBITOP (O_BIOR, 1, 0, c = !(ea & m) || C);    /* bior */
3736           OBITOP (O_BXOR, 1, 0, c = ((ea & m) != 0)!= C);       /* bxor */
3737           OBITOP (O_BIXOR, 1, 0, c = !(ea & m) != C);   /* bixor */
3738
3739         case O (O_BFLD, SB):                            /* bfld */
3740           /* bitfield load */
3741           ea = 0;
3742           if (fetch (sd, &code->src, &bit))
3743             goto end;
3744
3745           if (bit != 0)
3746             {
3747               if (fetch (sd, &code->dst, &ea))
3748                 goto end;
3749
3750               ea &= bit;
3751               while (!(bit & 1))
3752                 {
3753                   ea  >>= 1;
3754                   bit >>= 1;
3755                 }
3756             }
3757           if (store (sd, &code->op3, ea))
3758             goto end;
3759
3760           goto next;
3761
3762         case O(O_BFST, SB):                     /* bfst */
3763           /* bitfield store */
3764           /* NOTE: the imm8 value is in dst, and the ea value
3765              (which is actually the destination) is in op3.
3766              It has to be that way, to avoid breaking the assembler.  */
3767
3768           if (fetch (sd, &code->dst, &bit))     /* imm8 */
3769             goto end;
3770           if (bit == 0)                         /* noop -- nothing to do.  */
3771             goto next;
3772
3773           if (fetch (sd, &code->src, &rd))      /* reg8 src */
3774             goto end;
3775
3776           if (fetch2 (sd, &code->op3, &ea))     /* ea dst */
3777             goto end;
3778
3779           /* Left-shift the register data into position.  */
3780           for (tmp = bit; !(tmp & 1); tmp >>= 1)
3781             rd <<= 1;
3782
3783           /* Combine it with the neighboring bits.  */
3784           ea = (ea & ~bit) | (rd & bit);
3785
3786           /* Put it back.  */
3787           if (store2 (sd, &code->op3, ea))
3788             goto end;
3789           goto next;
3790
3791         case O (O_CLRMAC, SN):          /* clrmac */
3792           h8_set_mach (sd, 0);
3793           h8_set_macl (sd, 0);
3794           h8_set_macZ (sd, 1);
3795           h8_set_macV (sd, 0);
3796           h8_set_macN (sd, 0);
3797           goto next;
3798
3799         case O (O_STMAC, SL):           /* stmac, 260 */
3800           switch (code->src.type) {
3801           case X (OP_MACH, SL): 
3802             res = h8_get_mach (sd);
3803             if (res & 0x200)            /* sign extend */
3804               res |= 0xfffffc00;
3805             break;
3806           case X (OP_MACL, SL): 
3807             res = h8_get_macl (sd);
3808             break;
3809           default:      goto illegal;
3810           }
3811           nz = !h8_get_macZ (sd);
3812           n = h8_get_macN (sd);
3813           v = h8_get_macV (sd);
3814
3815           if (store (sd, &code->dst, res))
3816             goto end;
3817
3818           goto next;
3819
3820         case O (O_LDMAC, SL):           /* ldmac, 179 */
3821           if (fetch (sd, &code->src, &rd))
3822             goto end;
3823
3824           switch (code->dst.type) {
3825           case X (OP_MACH, SL): 
3826             rd &= 0x3ff;                /* Truncate to 10 bits */
3827             h8_set_mach (sd, rd);
3828             break;
3829           case X (OP_MACL, SL): 
3830             h8_set_macl (sd, rd);
3831             break;
3832           default:      goto illegal;
3833           }
3834           h8_set_macV (sd, 0);
3835           goto next;
3836
3837         case O (O_MAC, SW):
3838           if (fetch (sd, &code->src, &rd) ||
3839               fetch (sd, &code->dst, &res))
3840             goto end;
3841
3842           /* Ye gods, this is non-portable!
3843              However, the existing mul/div code is similar.  */
3844           res = SEXTSHORT (res) * SEXTSHORT (rd);
3845
3846           if (h8_get_macS (sd))         /* Saturating mode */
3847             {
3848               long long mac = h8_get_macl (sd);
3849
3850               if (mac & 0x80000000)             /* sign extend */
3851                 mac |= 0xffffffff00000000LL;
3852
3853               mac += res;
3854               if (mac > 0x7fffffff || mac < 0xffffffff80000000LL)
3855                 h8_set_macV (sd, 1);
3856               h8_set_macZ (sd, (mac == 0));
3857               h8_set_macN (sd, (mac  < 0));
3858               h8_set_macl (sd, (int) mac);
3859             }
3860           else                          /* "Less Saturating" mode */
3861             {
3862               long long mac = h8_get_mach (sd);
3863               mac <<= 32;
3864               mac += h8_get_macl (sd);
3865
3866               if (mac & 0x20000000000LL)        /* sign extend */
3867                 mac |= 0xfffffc0000000000LL;
3868
3869               mac += res;
3870               if (mac > 0x1ffffffffffLL || 
3871                   mac < (long long) 0xfffffe0000000000LL)
3872                 h8_set_macV (sd, 1);
3873               h8_set_macZ (sd, (mac == 0));
3874               h8_set_macN (sd, (mac  < 0));
3875               h8_set_macl (sd, (int) mac);
3876               mac >>= 32;
3877               h8_set_mach (sd, (int) (mac & 0x3ff));
3878             }
3879           goto next;
3880
3881         case O (O_MULS, SW):            /* muls.w */
3882           if (fetch (sd, &code->src, &ea) ||
3883               fetch (sd, &code->dst, &rd))
3884             goto end;
3885
3886           ea = SEXTSHORT (ea);
3887           res = SEXTSHORT (ea * SEXTSHORT (rd));
3888
3889           n  = res & 0x8000;
3890           nz = res & 0xffff;
3891           if (store (sd, &code->dst, res))
3892             goto end;
3893
3894           goto next;
3895
3896         case O (O_MULS, SL):            /* muls.l */
3897           if (fetch (sd, &code->src, &ea) ||
3898               fetch (sd, &code->dst, &rd))
3899             goto end;
3900
3901           res = ea * rd;
3902
3903           n  = res & 0x80000000;
3904           nz = res & 0xffffffff;
3905           if (store (sd, &code->dst, res))
3906             goto end;
3907           goto next;
3908
3909         case O (O_MULSU, SL):           /* muls/u.l */
3910           if (fetch (sd, &code->src, &ea) ||
3911               fetch (sd, &code->dst, &rd))
3912             goto end;
3913
3914           /* Compute upper 32 bits of the 64-bit result.  */
3915           res = (((long long) ea) * ((long long) rd)) >> 32;
3916
3917           n  = res & 0x80000000;
3918           nz = res & 0xffffffff;
3919           if (store (sd, &code->dst, res))
3920             goto end;
3921           goto next;
3922
3923         case O (O_MULU, SW):            /* mulu.w */
3924           if (fetch (sd, &code->src, &ea) ||
3925               fetch (sd, &code->dst, &rd))
3926             goto end;
3927
3928           res = UEXTSHORT ((UEXTSHORT (ea) * UEXTSHORT (rd)));
3929
3930           /* Don't set Z or N.  */
3931           if (store (sd, &code->dst, res))
3932             goto end;
3933
3934           goto next;
3935
3936         case O (O_MULU, SL):            /* mulu.l */
3937           if (fetch (sd, &code->src, &ea) ||
3938               fetch (sd, &code->dst, &rd))
3939             goto end;
3940
3941           res = ea * rd;
3942
3943           /* Don't set Z or N.  */
3944           if (store (sd, &code->dst, res))
3945             goto end;
3946
3947           goto next;
3948
3949         case O (O_MULUU, SL):           /* mulu/u.l */
3950           if (fetch (sd, &code->src, &ea) ||
3951               fetch (sd, &code->dst, &rd))
3952             goto end;
3953
3954           /* Compute upper 32 bits of the 64-bit result.  */
3955           res = (((unsigned long long) (unsigned) ea) *
3956                  ((unsigned long long) (unsigned) rd)) >> 32;
3957
3958           /* Don't set Z or N.  */
3959           if (store (sd, &code->dst, res))
3960             goto end;
3961
3962           goto next;
3963
3964         case O (O_MULXS, SB):           /* mulxs.b */
3965           if (fetch (sd, &code->src, &ea) ||
3966               fetch (sd, &code->dst, &rd))
3967             goto end;
3968
3969           ea = SEXTCHAR (ea);
3970           res = ea * SEXTCHAR (rd);
3971
3972           n  = res & 0x8000;
3973           nz = res & 0xffff;
3974           if (store (sd, &code->dst, res))
3975             goto end;
3976
3977           goto next;
3978
3979         case O (O_MULXS, SW):           /* mulxs.w */
3980           if (fetch (sd, &code->src, &ea) ||
3981               fetch (sd, &code->dst, &rd))
3982             goto end;
3983
3984           ea = SEXTSHORT (ea);
3985           res = ea * SEXTSHORT (rd & 0xffff);
3986
3987           n  = res & 0x80000000;
3988           nz = res & 0xffffffff;
3989           if (store (sd, &code->dst, res))
3990             goto end;
3991
3992           goto next;
3993
3994         case O (O_MULXU, SB):           /* mulxu.b */
3995           if (fetch (sd, &code->src, &ea) ||
3996               fetch (sd, &code->dst, &rd))
3997             goto end;
3998
3999           res = UEXTCHAR (ea) * UEXTCHAR (rd);
4000
4001           if (store (sd, &code->dst, res))
4002             goto end;
4003
4004           goto next;
4005
4006         case O (O_MULXU, SW):           /* mulxu.w */
4007           if (fetch (sd, &code->src, &ea) ||
4008               fetch (sd, &code->dst, &rd))
4009             goto end;
4010
4011           res = UEXTSHORT (ea) * UEXTSHORT (rd);
4012
4013           if (store (sd, &code->dst, res))
4014             goto end;
4015
4016           goto next;
4017
4018         case O (O_TAS, SB):             /* tas (test and set) */
4019           if (!h8300sxmode)             /* h8sx can use any register. */
4020             switch (code->src.reg)
4021               {
4022               case R0_REGNUM:
4023               case R1_REGNUM:
4024               case R4_REGNUM:
4025               case R5_REGNUM:
4026                 break;
4027               default:
4028                 goto illegal;
4029               }
4030
4031           if (fetch (sd, &code->src, &res))
4032             goto end;
4033           if (store (sd, &code->src, res | 0x80))
4034             goto end;
4035
4036           goto just_flags_log8;
4037
4038         case O (O_DIVU, SW):                    /* divu.w */
4039           if (fetch (sd, &code->src, &ea) ||
4040               fetch (sd, &code->dst, &rd))
4041             goto end;
4042
4043           n  = ea & 0x8000;
4044           nz = ea & 0xffff;
4045           if (ea)
4046             res = (unsigned) (UEXTSHORT (rd) / UEXTSHORT (ea));
4047           else
4048             res = 0;
4049
4050           if (store (sd, &code->dst, res))
4051             goto end;
4052           goto next;
4053
4054         case O (O_DIVU, SL):                    /* divu.l */
4055           if (fetch (sd, &code->src, &ea) ||
4056               fetch (sd, &code->dst, &rd))
4057             goto end;
4058
4059           n  = ea & 0x80000000;
4060           nz = ea & 0xffffffff;
4061           if (ea)
4062             res = (unsigned) rd / ea;
4063           else
4064             res = 0;
4065
4066           if (store (sd, &code->dst, res))
4067             goto end;
4068           goto next;
4069
4070         case O (O_DIVS, SW):                    /* divs.w */
4071           if (fetch (sd, &code->src, &ea) ||
4072               fetch (sd, &code->dst, &rd))
4073             goto end;
4074
4075           if (ea)
4076             {
4077               res = SEXTSHORT (rd) / SEXTSHORT (ea);
4078               nz  = 1;
4079             }
4080           else
4081             {
4082               res = 0;
4083               nz  = 0;
4084             }
4085
4086           n = res & 0x8000;
4087           if (store (sd, &code->dst, res))
4088             goto end;
4089           goto next;
4090
4091         case O (O_DIVS, SL):                    /* divs.l */
4092           if (fetch (sd, &code->src, &ea) ||
4093               fetch (sd, &code->dst, &rd))
4094             goto end;
4095
4096           if (ea)
4097             {
4098               res = rd / ea;
4099               nz  = 1;
4100             }
4101           else
4102             {
4103               res = 0;
4104               nz  = 0;
4105             }
4106
4107           n = res & 0x80000000;
4108           if (store (sd, &code->dst, res))
4109             goto end;
4110           goto next;
4111
4112         case O (O_DIVXU, SB):                   /* divxu.b */
4113           if (fetch (sd, &code->src, &ea) ||
4114               fetch (sd, &code->dst, &rd))
4115             goto end;
4116
4117           rd = UEXTSHORT (rd);
4118           ea = UEXTCHAR (ea);
4119
4120           n  = ea & 0x80;
4121           nz = ea & 0xff;
4122           if (ea)
4123             {
4124               tmp = (unsigned) rd % ea;
4125               res = (unsigned) rd / ea;
4126             }
4127           else
4128             {
4129               tmp = 0;
4130               res = 0;
4131             }
4132
4133           if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4134             goto end;
4135           goto next;
4136
4137         case O (O_DIVXU, SW):                   /* divxu.w */
4138           if (fetch (sd, &code->src, &ea) ||
4139               fetch (sd, &code->dst, &rd))
4140             goto end;
4141
4142           ea = UEXTSHORT (ea);
4143
4144           n  = ea & 0x8000;
4145           nz = ea & 0xffff;
4146           if (ea)
4147             {
4148               tmp = (unsigned) rd % ea;
4149               res = (unsigned) rd / ea;
4150             }
4151           else
4152             {
4153               tmp = 0;
4154               res = 0;
4155             }
4156
4157           if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4158             goto end;
4159           goto next;
4160
4161         case O (O_DIVXS, SB):                   /* divxs.b */
4162           if (fetch (sd, &code->src, &ea) ||
4163               fetch (sd, &code->dst, &rd))
4164             goto end;
4165
4166           rd = SEXTSHORT (rd);
4167           ea = SEXTCHAR (ea);
4168
4169           if (ea)
4170             {
4171               tmp = (int) rd % (int) ea;
4172               res = (int) rd / (int) ea;
4173               nz  = 1;
4174             }
4175           else
4176             {
4177               tmp = 0;
4178               res = 0;
4179               nz  = 0;
4180             }
4181
4182           n = res & 0x8000;
4183           if (store (sd, &code->dst, (res & 0xff) | (tmp << 8)))
4184             goto end;
4185           goto next;
4186
4187         case O (O_DIVXS, SW):                   /* divxs.w */
4188           if (fetch (sd, &code->src, &ea) ||
4189               fetch (sd, &code->dst, &rd))
4190             goto end;
4191
4192           ea = SEXTSHORT (ea);
4193
4194           if (ea)
4195             {
4196               tmp = (int) rd % (int) ea;
4197               res = (int) rd / (int) ea;
4198               nz  = 1;
4199             }
4200           else
4201             {
4202               tmp = 0;
4203               res = 0;
4204               nz  = 0;
4205             }
4206
4207           n = res & 0x80000000;
4208           if (store (sd, &code->dst, (res & 0xffff) | (tmp << 16)))
4209             goto end;
4210           goto next;
4211
4212         case O (O_EXTS, SW):                    /* exts.w, signed extend */
4213           if (fetch2 (sd, &code->dst, &rd))
4214             goto end;
4215           ea = rd & 0x80 ? -256 : 0;
4216           res = (rd & 0xff) + ea;
4217           goto log16;
4218
4219         case O (O_EXTS, SL):                    /* exts.l, signed extend */
4220           if (fetch2 (sd, &code->dst, &rd))
4221             goto end;
4222           if (code->src.type == X (OP_IMM, SL))
4223             {
4224               if (fetch (sd, &code->src, &ea))
4225                 goto end;
4226
4227               if (ea == 2)                      /* exts.l #2, nn */
4228                 {
4229                   /* Sign-extend from 8-bit to 32-bit.  */
4230                   ea = rd & 0x80 ? -256 : 0;
4231                   res = (rd & 0xff) + ea;
4232                   goto log32;
4233                 }
4234             }
4235           /* Sign-extend from 16-bit to 32-bit.  */
4236           ea = rd & 0x8000 ? -65536 : 0;
4237           res = (rd & 0xffff) + ea;
4238           goto log32;
4239
4240         case O (O_EXTU, SW):                    /* extu.w, unsigned extend */
4241           if (fetch2 (sd, &code->dst, &rd))
4242             goto end;
4243           ea = 0;
4244           res = (rd & 0xff) + ea;
4245           goto log16;
4246
4247         case O (O_EXTU, SL):                    /* extu.l, unsigned extend */
4248           if (fetch2 (sd, &code->dst, &rd))
4249             goto end;
4250           if (code->src.type == X (OP_IMM, SL))
4251             {
4252               if (fetch (sd, &code->src, &ea))
4253                 goto end;
4254
4255               if (ea == 2)                      /* extu.l #2, nn */
4256                 {
4257                   /* Zero-extend from 8-bit to 32-bit.  */
4258                   ea = 0;
4259                   res = (rd & 0xff) + ea;
4260                   goto log32;
4261                 }
4262             }
4263           /* Zero-extend from 16-bit to 32-bit.  */
4264           ea = 0;
4265           res = (rd & 0xffff) + ea;
4266           goto log32;
4267
4268         case O (O_NOP, SN):                     /* nop */
4269           goto next;
4270
4271         case O (O_STM, SL):                     /* stm, store to memory */
4272           {
4273             int nregs, firstreg, i;
4274
4275             nregs = GET_MEMORY_B (pc + 1);
4276             nregs >>= 4;
4277             nregs &= 0xf;
4278             firstreg = code->src.reg;
4279             firstreg &= 0xf;
4280             for (i = firstreg; i <= firstreg + nregs; i++)
4281               {
4282                 h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) - 4);
4283                 SET_MEMORY_L (h8_get_reg (sd, SP_REGNUM), h8_get_reg (sd, i));
4284               }
4285           }
4286           goto next;
4287
4288         case O (O_LDM, SL):                     /* ldm,  load from memory */
4289         case O (O_RTEL, SN):                    /* rte/l, ldm plus rte */
4290         case O (O_RTSL, SN):                    /* rts/l, ldm plus rts */
4291           {
4292             int nregs, firstreg, i;
4293
4294             nregs = ((GET_MEMORY_B (pc + 1) >> 4) & 0xf);
4295             firstreg = code->dst.reg & 0xf;
4296             for (i = firstreg; i >= firstreg - nregs; i--)
4297               {
4298                 h8_set_reg (sd, i, GET_MEMORY_L (h8_get_reg (sd, SP_REGNUM)));
4299                 h8_set_reg (sd, SP_REGNUM, h8_get_reg (sd, SP_REGNUM) + 4);
4300               }
4301           }
4302           switch (code->opcode) {
4303           case O (O_RTEL, SN):
4304             goto rte;
4305           case O (O_RTSL, SN):
4306             goto rts;
4307           case O (O_LDM, SL):
4308             goto next;
4309           default:
4310             goto illegal;
4311           }
4312
4313         case O (O_DAA, SB):
4314           /* Decimal Adjust Addition.  This is for BCD arithmetic.  */
4315           res = GET_B_REG (code->src.reg);      /* FIXME fetch? */
4316           if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4317               !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4318             res = res;          /* Value added == 0.  */
4319           else if (!c && (0  <= (res >>  4) && (res >>  4) <=  8) && 
4320                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4321             res = res + 0x6;            /* Value added == 6.  */
4322           else if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4323                     h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4324             res = res + 0x6;            /* Value added == 6.  */
4325           else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) && 
4326                    !h && (0  <= (res & 0xf) && (res & 0xf) <=  9))
4327             res = res + 0x60;           /* Value added == 60.  */
4328           else if (!c && (9  <= (res >>  4) && (res >>  4) <= 15) && 
4329                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4330             res = res + 0x66;           /* Value added == 66.  */
4331           else if (!c && (10 <= (res >>  4) && (res >>  4) <= 15) && 
4332                     h && (0  <= (res & 0xf) && (res & 0xf) <=  3))
4333             res = res + 0x66;           /* Value added == 66.  */
4334           else if ( c && (1 <= (res >>  4) && (res >>  4) <= 2) && 
4335                    !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4336             res = res + 0x60;           /* Value added == 60.  */
4337           else if ( c && (1  <= (res >>  4) && (res >>  4) <=  2) && 
4338                    !h && (10 <= (res & 0xf) && (res & 0xf) <= 15))
4339             res = res + 0x66;           /* Value added == 66.  */
4340           else if (c && (1 <= (res >>  4) && (res >>  4) <= 3) && 
4341                    h && (0 <= (res & 0xf) && (res & 0xf) <= 3))
4342             res = res + 0x66;           /* Value added == 66.  */
4343
4344           goto alu8;
4345
4346         case O (O_DAS, SB):
4347           /* Decimal Adjust Subtraction.  This is for BCD arithmetic.  */
4348           res = GET_B_REG (code->src.reg); /* FIXME fetch, fetch2... */
4349           if (!c && (0 <= (res >>  4) && (res >>  4) <= 9) && 
4350               !h && (0 <= (res & 0xf) && (res & 0xf) <= 9))
4351             res = res;          /* Value added == 0.  */
4352           else if (!c && (0 <= (res >>  4) && (res >>  4) <=  8) && 
4353                     h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4354             res = res + 0xfa;           /* Value added == 0xfa.  */
4355           else if ( c && (7 <= (res >>  4) && (res >>  4) <= 15) && 
4356                    !h && (0 <= (res & 0xf) && (res & 0xf) <=  9))
4357             res = res + 0xa0;           /* Value added == 0xa0.  */
4358           else if (c && (6 <= (res >>  4) && (res >>  4) <= 15) && 
4359                    h && (6 <= (res & 0xf) && (res & 0xf) <= 15))
4360             res = res + 0x9a;           /* Value added == 0x9a.  */
4361
4362           goto alu8;
4363
4364         default:
4365         illegal:
4366           sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4367           goto end;
4368
4369         }
4370
4371       (*sim_callback->printf_filtered) (sim_callback,
4372                                         "sim_resume: internal error.\n");
4373       sim_engine_set_run_state (sd, sim_stopped, SIGILL);
4374       goto end;
4375
4376     setc:
4377       if (code->dst.type == X (OP_CCR, SB) ||
4378           code->dst.type == X (OP_CCR, SW))
4379         {
4380           h8_set_ccr (sd, res);
4381           GETSR (sd);
4382         }
4383       else if (h8300smode &&
4384                (code->dst.type == X (OP_EXR, SB) ||
4385                 code->dst.type == X (OP_EXR, SW)))
4386         {
4387           h8_set_exr (sd, res);
4388           if (h8300smode)       /* Get exr.  */
4389             {
4390               trace = (h8_get_exr (sd) >> 7) & 1;
4391               intMask = h8_get_exr (sd) & 7;
4392             }
4393         }
4394       else
4395         goto illegal;
4396
4397       goto next;
4398
4399     condtrue:
4400       /* When a branch works */
4401       if (fetch (sd, &code->src, &res))
4402         goto end;
4403       if (res & 1)              /* bad address */
4404         goto illegal;
4405       pc = code->next_pc + res;
4406       goto end;
4407
4408       /* Set the cond codes from res */
4409     bitop:
4410
4411       /* Set the flags after an 8 bit inc/dec operation */
4412     just_flags_inc8:
4413       n = res & 0x80;
4414       nz = res & 0xff;
4415       v = (rd & 0x7f) == 0x7f;
4416       goto next;
4417
4418       /* Set the flags after an 16 bit inc/dec operation */
4419     just_flags_inc16:
4420       n = res & 0x8000;
4421       nz = res & 0xffff;
4422       v = (rd & 0x7fff) == 0x7fff;
4423       goto next;
4424
4425       /* Set the flags after an 32 bit inc/dec operation */
4426     just_flags_inc32:
4427       n = res & 0x80000000;
4428       nz = res & 0xffffffff;
4429       v = (rd & 0x7fffffff) == 0x7fffffff;
4430       goto next;
4431
4432     shift8:
4433       /* Set flags after an 8 bit shift op, carry,overflow set in insn */
4434       n = (rd & 0x80);
4435       nz = rd & 0xff;
4436       if (store2 (sd, &code->dst, rd))
4437         goto end;
4438       goto next;
4439
4440     shift16:
4441       /* Set flags after an 16 bit shift op, carry,overflow set in insn */
4442       n = (rd & 0x8000);
4443       nz = rd & 0xffff;
4444       if (store2 (sd, &code->dst, rd))
4445         goto end;
4446       goto next;
4447
4448     shift32:
4449       /* Set flags after an 32 bit shift op, carry,overflow set in insn */
4450       n = (rd & 0x80000000);
4451       nz = rd & 0xffffffff;
4452       if (store2 (sd, &code->dst, rd))
4453         goto end;
4454       goto next;
4455
4456     log32:
4457       if (store2 (sd, &code->dst, res))
4458         goto end;
4459
4460     just_flags_log32:
4461       /* flags after a 32bit logical operation */
4462       n = res & 0x80000000;
4463       nz = res & 0xffffffff;
4464       v = 0;
4465       goto next;
4466
4467     log16:
4468       if (store2 (sd, &code->dst, res))
4469         goto end;
4470
4471     just_flags_log16:
4472       /* flags after a 16bit logical operation */
4473       n = res & 0x8000;
4474       nz = res & 0xffff;
4475       v = 0;
4476       goto next;
4477
4478     log8:
4479       if (store2 (sd, &code->dst, res))
4480         goto end;
4481
4482     just_flags_log8:
4483       n = res & 0x80;
4484       nz = res & 0xff;
4485       v = 0;
4486       goto next;
4487
4488     alu8:
4489       if (store2 (sd, &code->dst, res))
4490         goto end;
4491
4492     just_flags_alu8:
4493       n = res & 0x80;
4494       nz = res & 0xff;
4495       c = (res & 0x100);
4496       switch (code->opcode / 4)
4497         {
4498         case O_ADD:
4499         case O_ADDX:
4500           v = ((rd & 0x80) == (ea & 0x80)
4501                && (rd & 0x80) != (res & 0x80));
4502           break;
4503         case O_SUB:
4504         case O_SUBX:
4505         case O_CMP:
4506           v = ((rd & 0x80) != (-ea & 0x80)
4507                && (rd & 0x80) != (res & 0x80));
4508           break;
4509         case O_NEG:
4510           v = (rd == 0x80);
4511           break;
4512         case O_DAA:
4513         case O_DAS:
4514           break;        /* No effect on v flag.  */
4515         }
4516       goto next;
4517
4518     alu16:
4519       if (store2 (sd, &code->dst, res))
4520         goto end;
4521
4522     just_flags_alu16:
4523       n = res & 0x8000;
4524       nz = res & 0xffff;
4525       c = (res & 0x10000);
4526       switch (code->opcode / 4)
4527         {
4528         case O_ADD:
4529         case O_ADDX:
4530           v = ((rd & 0x8000) == (ea & 0x8000)
4531                && (rd & 0x8000) != (res & 0x8000));
4532           break;
4533         case O_SUB:
4534         case O_SUBX:
4535         case O_CMP:
4536           v = ((rd & 0x8000) != (-ea & 0x8000)
4537                && (rd & 0x8000) != (res & 0x8000));
4538           break;
4539         case O_NEG:
4540           v = (rd == 0x8000);
4541           break;
4542         }
4543       goto next;
4544
4545     alu32:
4546       if (store2 (sd, &code->dst, res))
4547         goto end;
4548
4549     just_flags_alu32:
4550       n = res & 0x80000000;
4551       nz = res & 0xffffffff;
4552       switch (code->opcode / 4)
4553         {
4554         case O_ADD:
4555         case O_ADDX:
4556           v = ((rd & 0x80000000) == (ea & 0x80000000)
4557                && (rd & 0x80000000) != (res & 0x80000000));
4558           c = ((unsigned) res < (unsigned) rd) || 
4559             ((unsigned) res < (unsigned) ea);
4560           break;
4561         case O_SUB:
4562         case O_SUBX:
4563         case O_CMP:
4564           v = ((rd & 0x80000000) != (-ea & 0x80000000)
4565                && (rd & 0x80000000) != (res & 0x80000000));
4566           c = (unsigned) rd < (unsigned) -ea;
4567           break;
4568         case O_NEG:
4569           v = (rd == 0x80000000);
4570           c = res != 0;
4571           break;
4572         }
4573       goto next;
4574
4575     next:
4576       if ((res = h8_get_delayed_branch (sd)) != 0)
4577         {
4578           pc = res;
4579           h8_set_delayed_branch (sd, 0);
4580         }
4581       else
4582         pc = code->next_pc;
4583
4584     end:
4585       
4586       if (--poll_count < 0)
4587         {
4588           poll_count = POLL_QUIT_INTERVAL;
4589           if ((*sim_callback->poll_quit) != NULL
4590               && (*sim_callback->poll_quit) (sim_callback))
4591             sim_engine_set_run_state (sd, sim_stopped, SIGINT);
4592         }
4593       sim_engine_get_run_state (sd, &reason, &sigrc);
4594     } while (reason == sim_running);
4595
4596   h8_set_ticks (sd, h8_get_ticks (sd) + get_now () - tick_start);
4597   h8_set_cycles (sd, h8_get_cycles (sd) + cycles);
4598   h8_set_insts (sd, h8_get_insts (sd) + insts);
4599   h8_set_pc (sd, pc);
4600   BUILDSR (sd);
4601
4602   if (h8300smode)
4603     h8_set_exr (sd, (trace<<7) | intMask);
4604
4605   h8_set_mask (sd, oldmask);
4606   signal (SIGINT, prev);
4607 }
4608
4609 int
4610 sim_trace (SIM_DESC sd)
4611 {
4612   /* FIXME: Unfinished.  */
4613   (*sim_callback->printf_filtered) (sim_callback,
4614                                     "sim_trace: trace not supported.\n");
4615   return 1;     /* Done.  */
4616 }
4617
4618 int
4619 sim_write (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4620 {
4621   int i;
4622
4623   init_pointers (sd);
4624   if (addr < 0)
4625     return 0;
4626   for (i = 0; i < size; i++)
4627     {
4628       if (addr < memory_size)
4629         {
4630           h8_set_memory    (sd, addr + i, buffer[i]);
4631           h8_set_cache_idx (sd, addr + i,  0);
4632         }
4633       else
4634         {
4635           h8_set_eightbit (sd, (addr + i) & 0xff, buffer[i]);
4636         }
4637     }
4638   return size;
4639 }
4640
4641 int
4642 sim_read (SIM_DESC sd, SIM_ADDR addr, unsigned char *buffer, int size)
4643 {
4644   init_pointers (sd);
4645   if (addr < 0)
4646     return 0;
4647   if (addr < memory_size)
4648     memcpy (buffer, h8_get_memory_buf (sd) + addr, size);
4649   else
4650     memcpy (buffer, h8_get_eightbit_buf (sd) + (addr & 0xff), size);
4651   return size;
4652 }
4653
4654
4655 int
4656 sim_store_register (SIM_DESC sd, int rn, unsigned char *value, int length)
4657 {
4658   int longval;
4659   int shortval;
4660   int intval;
4661   longval = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
4662   shortval = (value[0] << 8) | (value[1]);
4663   intval = h8300hmode ? longval : shortval;
4664
4665   init_pointers (sd);
4666   switch (rn)
4667     {
4668     case PC_REGNUM:
4669       if(h8300_normal_mode)
4670         h8_set_pc (sd, shortval); /* PC for Normal mode is 2 bytes */
4671       else
4672         h8_set_pc (sd, intval);
4673       break;
4674     default:
4675       (*sim_callback->printf_filtered) (sim_callback, 
4676                                         "sim_store_register: bad regnum %d.\n",
4677                                         rn);
4678     case R0_REGNUM:
4679     case R1_REGNUM:
4680     case R2_REGNUM:
4681     case R3_REGNUM:
4682     case R4_REGNUM:
4683     case R5_REGNUM:
4684     case R6_REGNUM:
4685     case R7_REGNUM:
4686       h8_set_reg (sd, rn, intval);
4687       break;
4688     case CCR_REGNUM:
4689       h8_set_ccr (sd, intval);
4690       break;
4691     case EXR_REGNUM:
4692       h8_set_exr (sd, intval);
4693       break;
4694     case SBR_REGNUM:
4695       h8_set_sbr (sd, intval);
4696       break;
4697     case VBR_REGNUM:
4698       h8_set_vbr (sd, intval);
4699       break;
4700     case MACH_REGNUM:
4701       h8_set_mach (sd, intval);
4702       break;
4703     case MACL_REGNUM:
4704       h8_set_macl (sd, intval);
4705       break;
4706     case CYCLE_REGNUM:
4707       h8_set_cycles (sd, longval);
4708       break;
4709
4710     case INST_REGNUM:
4711       h8_set_insts (sd, longval);
4712       break;
4713
4714     case TICK_REGNUM:
4715       h8_set_ticks (sd, longval);
4716       break;
4717     }
4718   return -1;
4719 }
4720
4721 int
4722 sim_fetch_register (SIM_DESC sd, int rn, unsigned char *buf, int length)
4723 {
4724   int v;
4725   int longreg = 0;
4726
4727   init_pointers (sd);
4728
4729   if (!h8300smode && rn >= EXR_REGNUM)
4730     rn++;
4731   switch (rn)
4732     {
4733     default:
4734       (*sim_callback->printf_filtered) (sim_callback, 
4735                                         "sim_fetch_register: bad regnum %d.\n",
4736                                         rn);
4737       v = 0;
4738       break;
4739     case CCR_REGNUM:
4740       v = h8_get_ccr (sd);
4741       break;
4742     case EXR_REGNUM:
4743       v = h8_get_exr (sd);
4744       break;
4745     case PC_REGNUM:
4746       v = h8_get_pc (sd);
4747       break;
4748     case SBR_REGNUM:
4749       v = h8_get_sbr (sd);
4750       break;
4751     case VBR_REGNUM:
4752       v = h8_get_vbr (sd);
4753       break;
4754     case MACH_REGNUM:
4755       v = h8_get_mach (sd);
4756       break;
4757     case MACL_REGNUM:
4758       v = h8_get_macl (sd);
4759       break;
4760     case R0_REGNUM:
4761     case R1_REGNUM:
4762     case R2_REGNUM:
4763     case R3_REGNUM:
4764     case R4_REGNUM:
4765     case R5_REGNUM:
4766     case R6_REGNUM:
4767     case R7_REGNUM:
4768       v = h8_get_reg (sd, rn);
4769       break;
4770     case CYCLE_REGNUM:
4771       v = h8_get_cycles (sd);
4772       longreg = 1;
4773       break;
4774     case TICK_REGNUM:
4775       v = h8_get_ticks (sd);
4776       longreg = 1;
4777       break;
4778     case INST_REGNUM:
4779       v = h8_get_insts (sd);
4780       longreg = 1;
4781       break;
4782     }
4783   /* In Normal mode PC is 2 byte, but other registers are 4 byte */
4784   if ((h8300hmode || longreg) && !(rn == PC_REGNUM && h8300_normal_mode))
4785     {
4786       buf[0] = v >> 24;
4787       buf[1] = v >> 16;
4788       buf[2] = v >> 8;
4789       buf[3] = v >> 0;
4790     }
4791   else
4792     {
4793       buf[0] = v >> 8;
4794       buf[1] = v;
4795     }
4796   return -1;
4797 }
4798
4799 void
4800 sim_stop_reason (SIM_DESC sd, enum sim_stop *reason, int *sigrc)
4801 {
4802   sim_engine_get_run_state (sd, reason, sigrc);
4803 }
4804
4805 /* FIXME: Rename to sim_set_mem_size.  */
4806
4807 void
4808 sim_size (int n)
4809 {
4810   /* Memory size is fixed.  */
4811 }
4812
4813 static void
4814 set_simcache_size (SIM_DESC sd, int n)
4815 {
4816   if (sd->sim_cache)
4817     free (sd->sim_cache);
4818   if (n < 2)
4819     n = 2;
4820   sd->sim_cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
4821   memset (sd->sim_cache, 0, sizeof (decoded_inst) * n);
4822   sd->sim_cache_size = n;
4823 }
4824
4825
4826 void
4827 sim_info (SIM_DESC sd, int verbose)
4828 {
4829   double timetaken = (double) h8_get_ticks (sd) / (double) now_persec ();
4830   double virttime = h8_get_cycles (sd) / 10.0e6;
4831
4832   (*sim_callback->printf_filtered) (sim_callback,
4833                                     "\n\n#instructions executed  %10d\n",
4834                                     h8_get_insts (sd));
4835   (*sim_callback->printf_filtered) (sim_callback,
4836                                     "#cycles (v approximate) %10d\n",
4837                                     h8_get_cycles (sd));
4838   (*sim_callback->printf_filtered) (sim_callback,
4839                                     "#real time taken        %10.4f\n",
4840                                     timetaken);
4841   (*sim_callback->printf_filtered) (sim_callback,
4842                                     "#virtual time taken     %10.4f\n",
4843                                     virttime);
4844   if (timetaken != 0.0)
4845     (*sim_callback->printf_filtered) (sim_callback,
4846                                       "#simulation ratio       %10.4f\n",
4847                                       virttime / timetaken);
4848   (*sim_callback->printf_filtered) (sim_callback,
4849                                     "#compiles               %10d\n",
4850                                     h8_get_compiles (sd));
4851   (*sim_callback->printf_filtered) (sim_callback,
4852                                     "#cache size             %10d\n",
4853                                     sd->sim_cache_size);
4854
4855 #ifdef ADEBUG
4856   /* This to be conditional on `what' (aka `verbose'),
4857      however it was never passed as non-zero.  */
4858   if (1)
4859     {
4860       int i;
4861       for (i = 0; i < O_LAST; i++)
4862         {
4863           if (h8_get_stats (sd, i))
4864             (*sim_callback->printf_filtered) (sim_callback, "%d: %d\n", 
4865                                               i, h8_get_stats (sd, i));
4866         }
4867     }
4868 #endif
4869 }
4870
4871 /* Indicate whether the cpu is an H8/300 or H8/300H.
4872    FLAG is non-zero for the H8/300H.  */
4873
4874 void
4875 set_h8300h (unsigned long machine)
4876 {
4877   /* FIXME: Much of the code in sim_load can be moved to sim_open.
4878      This function being replaced by a sim_open:ARGV configuration
4879      option.  */
4880
4881   h8300hmode = h8300smode = h8300sxmode = h8300_normal_mode = 0;
4882
4883   if (machine == bfd_mach_h8300sx || machine == bfd_mach_h8300sxn)
4884     h8300sxmode = 1;
4885
4886   if (machine == bfd_mach_h8300s || machine == bfd_mach_h8300sn || h8300sxmode)
4887     h8300smode = 1;
4888
4889   if (machine == bfd_mach_h8300h || machine == bfd_mach_h8300hn || h8300smode)
4890     h8300hmode = 1;
4891
4892   if(machine == bfd_mach_h8300hn || machine == bfd_mach_h8300sn || machine == bfd_mach_h8300sxn)
4893     h8300_normal_mode = 1;
4894 }
4895
4896 /* Cover function of sim_state_free to free the cpu buffers as well.  */
4897
4898 static void
4899 free_state (SIM_DESC sd)
4900 {
4901   if (STATE_MODULES (sd) != NULL)
4902     sim_module_uninstall (sd);
4903
4904   /* Fixme: free buffers in _sim_cpu.  */
4905   sim_state_free (sd);
4906 }
4907
4908 SIM_DESC
4909 sim_open (SIM_OPEN_KIND kind, 
4910           struct host_callback_struct *callback, 
4911           struct bfd *abfd, 
4912           char **argv)
4913 {
4914   SIM_DESC sd;
4915   sim_cpu *cpu;
4916
4917   sd = sim_state_alloc (kind, callback);
4918   sd->cpu = sim_cpu_alloc (sd, 0);
4919   cpu = STATE_CPU (sd, 0);
4920   SIM_ASSERT (STATE_MAGIC (sd) == SIM_MAGIC_NUMBER);
4921   sim_state_initialize (sd, cpu);
4922   /* sim_cpu object is new, so some initialization is needed.  */
4923   init_pointers_needed = 1;
4924
4925   /* For compatibility (FIXME: is this right?).  */
4926   current_alignment = NONSTRICT_ALIGNMENT;
4927   current_target_byte_order = BIG_ENDIAN;
4928
4929   if (sim_pre_argv_init (sd, argv[0]) != SIM_RC_OK)
4930     {
4931       free_state (sd);
4932       return 0;
4933     }
4934
4935     /* getopt will print the error message so we just have to exit if
4936        this fails.  FIXME: Hmmm...  in the case of gdb we need getopt
4937        to call print_filtered.  */
4938   if (sim_parse_args (sd, argv) != SIM_RC_OK)
4939     {
4940       /* Uninstall the modules to avoid memory leaks,
4941          file descriptor leaks, etc.  */
4942       free_state (sd);
4943       return 0;
4944     }
4945
4946   /* Check for/establish the a reference program image.  */
4947   if (sim_analyze_program (sd,
4948                            (STATE_PROG_ARGV (sd) != NULL
4949                             ? *STATE_PROG_ARGV (sd)
4950                             : NULL), abfd) != SIM_RC_OK)
4951     {
4952       free_state (sd);
4953       return 0;
4954     }
4955
4956   /* Establish any remaining configuration options.  */
4957   if (sim_config (sd) != SIM_RC_OK)
4958     {
4959       free_state (sd);
4960       return 0;
4961     }
4962
4963   if (sim_post_argv_init (sd) != SIM_RC_OK)
4964     {
4965       /* Uninstall the modules to avoid memory leaks,
4966          file descriptor leaks, etc.  */
4967       free_state (sd);
4968       return 0;
4969     }
4970
4971   /*  sim_hw_configure (sd); */
4972
4973   /* FIXME: Much of the code in sim_load can be moved here.  */
4974
4975   sim_kind = kind;
4976   myname = argv[0];
4977   sim_callback = callback;
4978   return sd;
4979 }
4980
4981 void
4982 sim_close (SIM_DESC sd, int quitting)
4983 {
4984   /* Nothing to do.  */
4985 }
4986
4987 /* Called by gdb to load a program into memory.  */
4988
4989 SIM_RC
4990 sim_load (SIM_DESC sd, char *prog, bfd *abfd, int from_tty)
4991 {
4992   bfd *prog_bfd;
4993
4994   /* FIXME: The code below that sets a specific variant of the H8/300
4995      being simulated should be moved to sim_open().  */
4996
4997   /* See if the file is for the H8/300 or H8/300H.  */
4998   /* ??? This may not be the most efficient way.  The z8k simulator
4999      does this via a different mechanism (INIT_EXTRA_SYMTAB_INFO).  */
5000   if (abfd != NULL)
5001     prog_bfd = abfd;
5002   else
5003     prog_bfd = bfd_openr (prog, NULL);
5004   if (prog_bfd != NULL)
5005     {
5006       /* Set the cpu type.  We ignore failure from bfd_check_format
5007          and bfd_openr as sim_load_file checks too.  */
5008       if (bfd_check_format (prog_bfd, bfd_object))
5009         {
5010           set_h8300h (bfd_get_mach (prog_bfd));
5011         }
5012     }
5013
5014   /* If we're using gdb attached to the simulator, then we have to
5015      reallocate memory for the simulator.
5016
5017      When gdb first starts, it calls fetch_registers (among other
5018      functions), which in turn calls init_pointers, which allocates
5019      simulator memory.
5020
5021      The problem is when we do that, we don't know whether we're
5022      debugging an H8/300 or H8/300H program.
5023
5024      This is the first point at which we can make that determination,
5025      so we just reallocate memory now; this will also allow us to handle
5026      switching between H8/300 and H8/300H programs without exiting
5027      gdb.  */
5028
5029   if (h8300smode && !h8300_normal_mode)
5030     memory_size = H8300S_MSIZE;
5031   else if (h8300hmode && !h8300_normal_mode)
5032     memory_size = H8300H_MSIZE;
5033   else
5034     memory_size = H8300_MSIZE;
5035
5036   if (h8_get_memory_buf (sd))
5037     free (h8_get_memory_buf (sd));
5038   if (h8_get_cache_idx_buf (sd))
5039     free (h8_get_cache_idx_buf (sd));
5040   if (h8_get_eightbit_buf (sd))
5041     free (h8_get_eightbit_buf (sd));
5042
5043   h8_set_memory_buf (sd, (unsigned char *) 
5044                      calloc (sizeof (char), memory_size));
5045   h8_set_cache_idx_buf (sd, (unsigned short *) 
5046                         calloc (sizeof (short), memory_size));
5047   sd->memory_size = memory_size;
5048   h8_set_eightbit_buf (sd, (unsigned char *) calloc (sizeof (char), 256));
5049
5050   /* `msize' must be a power of two.  */
5051   if ((memory_size & (memory_size - 1)) != 0)
5052     {
5053       (*sim_callback->printf_filtered) (sim_callback, 
5054                                         "sim_load: bad memory size.\n");
5055       return SIM_RC_FAIL;
5056     }
5057   h8_set_mask (sd, memory_size - 1);
5058
5059   if (sim_load_file (sd, myname, sim_callback, prog, prog_bfd,
5060                      sim_kind == SIM_OPEN_DEBUG,
5061                      0, sim_write)
5062       == NULL)
5063     {
5064       /* Close the bfd if we opened it.  */
5065       if (abfd == NULL && prog_bfd != NULL)
5066         bfd_close (prog_bfd);
5067       return SIM_RC_FAIL;
5068     }
5069
5070   /* Close the bfd if we opened it.  */
5071   if (abfd == NULL && prog_bfd != NULL)
5072     bfd_close (prog_bfd);
5073   return SIM_RC_OK;
5074 }
5075
5076 SIM_RC
5077 sim_create_inferior (SIM_DESC sd, struct bfd *abfd, char **argv, char **env)
5078 {
5079   int i = 0;
5080   int len_arg = 0;
5081   int no_of_args = 0;
5082
5083   if (abfd != NULL)
5084     h8_set_pc (sd, bfd_get_start_address (abfd));
5085   else
5086     h8_set_pc (sd, 0);
5087
5088   /* Command Line support.  */
5089   if (argv != NULL)
5090     {
5091       /* Counting the no. of commandline arguments.  */
5092       for (no_of_args = 0; argv[no_of_args] != NULL; no_of_args++)
5093         continue;
5094
5095       /* Allocating memory for the argv pointers.  */
5096       h8_set_command_line (sd, (char **) malloc ((sizeof (char *))
5097                                                  * (no_of_args + 1)));
5098
5099       for (i = 0; i < no_of_args; i++)
5100         {
5101           /* Copying the argument string.  */
5102           h8_set_cmdline_arg (sd, i, (char *) strdup (argv[i]));
5103         }
5104       h8_set_cmdline_arg (sd, i, NULL);
5105     }
5106   
5107   return SIM_RC_OK;
5108 }
5109
5110 void
5111 sim_do_command (SIM_DESC sd, char *cmd)
5112 {
5113   (*sim_callback->printf_filtered) (sim_callback,
5114                                     "This simulator does not accept any commands.\n");
5115 }
5116
5117 void
5118 sim_set_callbacks (struct host_callback_struct *ptr)
5119 {
5120   sim_callback = ptr;
5121 }