Home | History | Annotate | Line # | Download | only in h8300
compile.c revision 1.7
      1 /*
      2  * Simulator for the Renesas (formerly Hitachi) H8/300 architecture.
      3  *
      4  * Written by Steve Chamberlain of Cygnus Support. sac (at) 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 
     43 int debug;
     44 
     45 static 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 
     57 static unsigned int
     58 h8_get_reg (sim_cpu *cpu, int regnum)
     59 {
     60   return cpu->regs[regnum];
     61 }
     62 
     63 static void
     64 h8_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 
     88 static int
     89 h8_get_mask (sim_cpu *cpu)
     90 {
     91   return cpu->mask;
     92 }
     93 
     94 static void
     95 h8_set_mask (sim_cpu *cpu, int val)
     96 {
     97   cpu->mask = val;
     98 }
     99 #if 0
    100 static int
    101 h8_get_exception (sim_cpu *cpu)
    102 {
    103   return cpu->exception;
    104 }
    105 
    106 static void
    107 h8_set_exception (sim_cpu *cpu, int val)
    108 {
    109   cpu->exception = val;
    110 }
    111 
    112 static enum h8300_sim_state
    113 h8_get_state (SIM_DESC sd)
    114 {
    115   return H8300_SIM_STATE (sd)->state;
    116 }
    117 
    118 static void
    119 h8_set_state (SIM_DESC sd, enum h8300_sim_state val)
    120 {
    121   H8300_SIM_STATE (sd)->state = val;
    122 }
    123 #endif
    124 
    125 static unsigned int *
    126 h8_get_reg_buf (sim_cpu *cpu)
    127 {
    128   return &cpu->regs[0];
    129 }
    130 
    131 #ifdef ADEBUG
    132 static int
    133 h8_get_stats (SIM_DESC sd, int idx)
    134 {
    135   return H8300_SIM_STATE (sd)->stats[idx];
    136 }
    137 
    138 static void
    139 h8_increment_stats (SIM_DESC sd, int idx)
    140 {
    141   H8300_SIM_STATE (sd)->stats[idx] ++;
    142 }
    143 #endif /* ADEBUG */
    144 
    145 static unsigned char *
    146 h8_get_memory_buf (sim_cpu *cpu)
    147 {
    148   return cpu->memory;
    149 }
    150 
    151 static void
    152 h8_set_memory_buf (sim_cpu *cpu, unsigned char *ptr)
    153 {
    154   cpu->memory = ptr;
    155 }
    156 
    157 static unsigned char
    158 h8_get_memory (sim_cpu *cpu, int idx)
    159 {
    160   ASSERT (idx < memory_size);
    161   return cpu->memory[idx];
    162 }
    163 
    164 static void
    165 h8_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 
    171 static unsigned int
    172 h8_get_delayed_branch (sim_cpu *cpu)
    173 {
    174   return cpu->delayed_branch;
    175 }
    176 
    177 static void
    178 h8_set_delayed_branch (sim_cpu *cpu, unsigned int dest)
    179 {
    180   cpu->delayed_branch = dest;
    181 }
    182 
    183 static char **
    184 h8_get_command_line (sim_cpu *cpu)
    185 {
    186   return cpu->command_line;
    187 }
    188 
    189 static void
    190 h8_set_command_line (sim_cpu *cpu, char ** val)
    191 {
    192   cpu->command_line = val;
    193 }
    194 
    195 static char *
    196 h8_get_cmdline_arg (sim_cpu *cpu, int index)
    197 {
    198   return cpu->command_line[index];
    199 }
    200 
    201 static void
    202 h8_set_cmdline_arg (sim_cpu *cpu, int index, char * val)
    203 {
    204   cpu->command_line[index] = val;
    205 }
    206 
    207 /* MAC Saturation Mode */
    208 static int
    209 h8_get_macS (sim_cpu *cpu)
    210 {
    211   return cpu->macS;
    212 }
    213 
    214 #if 0
    215 static void
    216 h8_set_macS (sim_cpu *cpu, int val)
    217 {
    218   cpu->macS = (val != 0);
    219 }
    220 #endif
    221 
    222 /* MAC Zero Flag */
    223 static int
    224 h8_get_macZ (sim_cpu *cpu)
    225 {
    226   return cpu->macZ;
    227 }
    228 
    229 static void
    230 h8_set_macZ (sim_cpu *cpu, int val)
    231 {
    232   cpu->macZ = (val != 0);
    233 }
    234 
    235 /* MAC Negative Flag */
    236 static int
    237 h8_get_macN (sim_cpu *cpu)
    238 {
    239   return cpu->macN;
    240 }
    241 
    242 static void
    243 h8_set_macN (sim_cpu *cpu, int val)
    244 {
    245   cpu->macN = (val != 0);
    246 }
    247 
    248 /* MAC Overflow Flag */
    249 static int
    250 h8_get_macV (sim_cpu *cpu)
    251 {
    252   return cpu->macV;
    253 }
    254 
    255 static void
    256 h8_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 
    265 enum { 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 
    308 int h8300hmode  = 0;
    309 int h8300smode  = 0;
    310 int h8300_normal_mode  = 0;
    311 int h8300sxmode = 0;
    312 
    313 static int
    314 get_now (void)
    315 {
    316   return time (0);	/* WinXX HAS UNIX like 'time', so why not use it? */
    317 }
    318 
    319 static int
    320 now_persec (void)
    321 {
    322   return 1;
    323 }
    324 
    325 static int
    326 bitfrom (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 
    347 static unsigned int
    348 lvalue (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 
    371 static int
    372 cmdline_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 
    382 static void
    383 decode (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 
   1052 static unsigned char  *breg[32];
   1053 static 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 
   1096 static int
   1097 fetch_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 
   1332 static int
   1333 fetch (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 
   1342 static int
   1343 fetch2 (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 
   1352 static int
   1353 store_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 
   1542 static int
   1543 store (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 
   1552 static int
   1553 store2 (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.  */
   1559 static int init_pointers_needed = 1;
   1560 
   1561 static void
   1562 init_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) 			\
   1645 case 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 
   1662 static void
   1663 step_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 
   4323 void
   4324 sim_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 
   4343 int
   4344 sim_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 
   4365 int
   4366 sim_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 
   4380 static int
   4381 h8300_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 
   4428 static int
   4429 h8300_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 
   4489 void
   4490 sim_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 
   4522 static void
   4523 set_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.  */
   4546 typedef enum {
   4547   OPTION_H8300H,
   4548   OPTION_H8300S,
   4549   OPTION_H8300SX
   4550 } H8300_OPTIONS;
   4551 
   4552 static SIM_RC
   4553 h8300_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 
   4578 static 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 
   4592 static sim_cia
   4593 h8300_pc_get (sim_cpu *cpu)
   4594 {
   4595   return cpu->pc;
   4596 }
   4597 
   4598 static void
   4599 h8300_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 
   4606 static void
   4607 free_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 
   4616 SIM_DESC
   4617 sim_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 
   4707 SIM_RC
   4708 sim_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 
   4788 SIM_RC
   4789 sim_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