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
41int debug;
42
43host_callback *sim_callback;
44
45static SIM_OPEN_KIND sim_kind;
46static 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.  */
52static 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
64static int
65sim_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
90static unsigned int
91h8_get_pc (SIM_DESC sd)
92{
93  return (STATE_CPU (sd, 0)) -> pc;
94}
95
96static void
97h8_set_pc (SIM_DESC sd, unsigned int val)
98{
99  (STATE_CPU (sd, 0)) -> pc = val;
100}
101
102static unsigned int
103h8_get_ccr (SIM_DESC sd)
104{
105  return (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM];
106}
107
108static void
109h8_set_ccr (SIM_DESC sd, unsigned int val)
110{
111  (STATE_CPU (sd, 0)) -> regs[CCR_REGNUM] = val;
112}
113
114static unsigned int
115h8_get_exr (SIM_DESC sd)
116{
117  return (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM];
118}
119
120static void
121h8_set_exr (SIM_DESC sd, unsigned int val)
122{
123  (STATE_CPU (sd, 0)) -> regs[EXR_REGNUM] = val;
124}
125
126static int
127h8_get_sbr (SIM_DESC sd)
128{
129  return (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM];
130}
131
132static void
133h8_set_sbr (SIM_DESC sd, int val)
134{
135  (STATE_CPU (sd, 0)) -> regs[SBR_REGNUM] = val;
136}
137
138static int
139h8_get_vbr (SIM_DESC sd)
140{
141  return (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM];
142}
143
144static void
145h8_set_vbr (SIM_DESC sd, int val)
146{
147  (STATE_CPU (sd, 0)) -> regs[VBR_REGNUM] = val;
148}
149
150static int
151h8_get_cache_top (SIM_DESC sd)
152{
153  return sd -> cache_top;
154}
155
156static void
157h8_set_cache_top (SIM_DESC sd, int val)
158{
159  sd -> cache_top = val;
160}
161
162static int
163h8_get_mask (SIM_DESC sd)
164{
165  return (STATE_CPU (sd, 0)) -> mask;
166}
167
168static void
169h8_set_mask (SIM_DESC sd, int val)
170{
171  (STATE_CPU (sd, 0)) -> mask = val;
172}
173#if 0
174static int
175h8_get_exception (SIM_DESC sd)
176{
177  return (STATE_CPU (sd, 0)) -> exception;
178}
179
180static void
181h8_set_exception (SIM_DESC sd, int val)
182{
183  (STATE_CPU (sd, 0)) -> exception = val;
184}
185
186static enum h8300_sim_state
187h8_get_state (SIM_DESC sd)
188{
189  return sd -> state;
190}
191
192static void
193h8_set_state (SIM_DESC sd, enum h8300_sim_state val)
194{
195  sd -> state = val;
196}
197#endif
198static unsigned int
199h8_get_cycles (SIM_DESC sd)
200{
201  return (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM];
202}
203
204static void
205h8_set_cycles (SIM_DESC sd, unsigned int val)
206{
207  (STATE_CPU (sd, 0)) -> regs[CYCLE_REGNUM] = val;
208}
209
210static unsigned int
211h8_get_insts (SIM_DESC sd)
212{
213  return (STATE_CPU (sd, 0)) -> regs[INST_REGNUM];
214}
215
216static void
217h8_set_insts (SIM_DESC sd, unsigned int val)
218{
219  (STATE_CPU (sd, 0)) -> regs[INST_REGNUM] = val;
220}
221
222static unsigned int
223h8_get_ticks (SIM_DESC sd)
224{
225  return (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM];
226}
227
228static void
229h8_set_ticks (SIM_DESC sd, unsigned int val)
230{
231  (STATE_CPU (sd, 0)) -> regs[TICK_REGNUM] = val;
232}
233
234static unsigned int
235h8_get_mach (SIM_DESC sd)
236{
237  return (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM];
238}
239
240static void
241h8_set_mach (SIM_DESC sd, unsigned int val)
242{
243  (STATE_CPU (sd, 0)) -> regs[MACH_REGNUM] = val;
244}
245
246static unsigned int
247h8_get_macl (SIM_DESC sd)
248{
249  return (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM];
250}
251
252static void
253h8_set_macl (SIM_DESC sd, unsigned int val)
254{
255  (STATE_CPU (sd, 0)) -> regs[MACL_REGNUM] = val;
256}
257
258static int
259h8_get_compiles (SIM_DESC sd)
260{
261  return sd -> compiles;
262}
263
264static void
265h8_increment_compiles (SIM_DESC sd)
266{
267  sd -> compiles ++;
268}
269
270static unsigned int *
271h8_get_reg_buf (SIM_DESC sd)
272{
273  return &(((STATE_CPU (sd, 0)) -> regs)[0]);
274}
275
276static unsigned int
277h8_get_reg (SIM_DESC sd, int regnum)
278{
279  return (STATE_CPU (sd, 0)) -> regs[regnum];
280}
281
282static void
283h8_set_reg (SIM_DESC sd, int regnum, int val)
284{
285  (STATE_CPU (sd, 0)) -> regs[regnum] = val;
286}
287
288#ifdef ADEBUG
289static int
290h8_get_stats (SIM_DESC sd, int idx)
291{
292  return sd -> stats[idx];
293}
294
295static void
296h8_increment_stats (SIM_DESC sd, int idx)
297{
298  sd -> stats[idx] ++;
299}
300#endif /* ADEBUG */
301
302static unsigned short *
303h8_get_cache_idx_buf (SIM_DESC sd)
304{
305  return sd -> cache_idx;
306}
307
308static void
309h8_set_cache_idx_buf (SIM_DESC sd, unsigned short *ptr)
310{
311  sd -> cache_idx = ptr;
312}
313
314static unsigned short
315h8_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
322static void
323h8_set_cache_idx (SIM_DESC sd, int idx, unsigned int val)
324{
325  sd -> cache_idx[idx] = (unsigned short) val;
326}
327
328static unsigned char *
329h8_get_memory_buf (SIM_DESC sd)
330{
331  return (STATE_CPU (sd, 0)) -> memory;
332}
333
334static void
335h8_set_memory_buf (SIM_DESC sd, unsigned char *ptr)
336{
337  (STATE_CPU (sd, 0)) -> memory = ptr;
338}
339
340static unsigned char
341h8_get_memory (SIM_DESC sd, int idx)
342{
343  return (STATE_CPU (sd, 0)) -> memory[idx];
344}
345
346static void
347h8_set_memory (SIM_DESC sd, int idx, unsigned int val)
348{
349  (STATE_CPU (sd, 0)) -> memory[idx] = (unsigned char) val;
350}
351
352static unsigned char *
353h8_get_eightbit_buf (SIM_DESC sd)
354{
355  return (STATE_CPU (sd, 0)) -> eightbit;
356}
357
358static void
359h8_set_eightbit_buf (SIM_DESC sd, unsigned char *ptr)
360{
361  (STATE_CPU (sd, 0)) -> eightbit = ptr;
362}
363
364static unsigned char
365h8_get_eightbit (SIM_DESC sd, int idx)
366{
367  return (STATE_CPU (sd, 0)) -> eightbit[idx];
368}
369
370static void
371h8_set_eightbit (SIM_DESC sd, int idx, unsigned int val)
372{
373  (STATE_CPU (sd, 0)) -> eightbit[idx] = (unsigned char) val;
374}
375
376static unsigned int
377h8_get_delayed_branch (SIM_DESC sd)
378{
379  return (STATE_CPU (sd, 0)) -> delayed_branch;
380}
381
382static void
383h8_set_delayed_branch (SIM_DESC sd, unsigned int dest)
384{
385  (STATE_CPU (sd, 0)) -> delayed_branch = dest;
386}
387
388static char **
389h8_get_command_line (SIM_DESC sd)
390{
391  return (STATE_CPU (sd, 0)) -> command_line;
392}
393
394static void
395h8_set_command_line (SIM_DESC sd, char ** val)
396{
397  (STATE_CPU (sd, 0)) -> command_line = val;
398}
399
400static char *
401h8_get_cmdline_arg (SIM_DESC sd, int index)
402{
403  return (STATE_CPU (sd, 0)) -> command_line[index];
404}
405
406static void
407h8_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 */
413static int
414h8_get_macS (SIM_DESC sd)
415{
416  return (STATE_CPU (sd, 0)) -> macS;
417}
418
419static void
420h8_set_macS (SIM_DESC sd, int val)
421{
422  (STATE_CPU (sd, 0)) -> macS = (val != 0);
423}
424
425/* MAC Zero Flag */
426static int
427h8_get_macZ (SIM_DESC sd)
428{
429  return (STATE_CPU (sd, 0)) -> macZ;
430}
431
432static void
433h8_set_macZ (SIM_DESC sd, int val)
434{
435  (STATE_CPU (sd, 0)) -> macZ = (val != 0);
436}
437
438/* MAC Negative Flag */
439static int
440h8_get_macN (SIM_DESC sd)
441{
442  return (STATE_CPU (sd, 0)) -> macN;
443}
444
445static void
446h8_set_macN (SIM_DESC sd, int val)
447{
448  (STATE_CPU (sd, 0)) -> macN = (val != 0);
449}
450
451/* MAC Overflow Flag */
452static int
453h8_get_macV (SIM_DESC sd)
454{
455  return (STATE_CPU (sd, 0)) -> macV;
456}
457
458static void
459h8_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
468enum { 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
511int h8300hmode  = 0;
512int h8300smode  = 0;
513int h8300_normal_mode  = 0;
514int h8300sxmode = 0;
515
516static int memory_size;
517
518static int
519get_now (void)
520{
521  return time (0);	/* WinXX HAS UNIX like 'time', so why not use it? */
522}
523
524static int
525now_persec (void)
526{
527  return 1;
528}
529
530static int
531bitfrom (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
552static unsigned int
553lvalue (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
576static int
577cmdline_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
587static void
588decode (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
1227static void
1228compile (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
1255static unsigned char  *breg[32];
1256static unsigned short *wreg[16];
1257static 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
1310static int
1311fetch_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
1526static int
1527fetch (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
1536static int
1537fetch2 (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
1546static int
1547store_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
1735static int
1736store (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
1745static int
1746store2 (SIM_DESC sd, ea_type *arg, int n)
1747{
1748  return store_1 (sd, arg, n, 1);
1749}
1750
1751static 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.  */
1763static int init_pointers_needed = 1;
1764
1765static void
1766init_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.  */
1862static SIM_DESC control_c_sim_desc;
1863
1864static void
1865control_c (int sig)
1866{
1867  sim_engine_set_run_state (control_c_sim_desc, sim_stopped, SIGINT);
1868}
1869
1870int
1871sim_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) 			\
1879case 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
1896void
1897sim_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
4609int
4610sim_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
4618int
4619sim_write (SIM_DESC sd, SIM_ADDR addr, const 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
4641int
4642sim_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
4655int
4656sim_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 length;
4719}
4720
4721int
4722sim_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
4799void
4800sim_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
4807void
4808sim_size (int n)
4809{
4810  /* Memory size is fixed.  */
4811}
4812
4813static void
4814set_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
4826void
4827sim_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
4874void
4875set_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
4898static void
4899free_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
4908SIM_DESC
4909sim_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
4981void
4982sim_close (SIM_DESC sd, int quitting)
4983{
4984  /* Nothing to do.  */
4985}
4986
4987/* Called by gdb to load a program into memory.  */
4988
4989SIM_RC
4990sim_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
5076SIM_RC
5077sim_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
5110void
5111sim_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
5117void
5118sim_set_callbacks (struct host_callback_struct *ptr)
5119{
5120  sim_callback = ptr;
5121}
5122