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