/* Simulator for the Hitachi H8/500 architecture.

   Written by Steve Chamberlain of Cygnus Support.
   sac@cygnus.com

   This file is part of H8/500 sim


		THIS SOFTWARE IS NOT COPYRIGHTED

   Cygnus offers the following for use in the public domain.  Cygnus
   makes no warranty with regard to the software or it's performance
   and the user accepts the software "AS IS" with all faults.

   CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
   THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

*/

#include "config.h"

#include <signal.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
#include <sys/param.h>
#include <setjmp.h>
#include "ansidecl.h"
#include "bfd.h"
#include "gdb/callback.h"
#include "gdb/remote-sim.h"

#define O_RECOMPILE 85
#define DEFINE_TABLE
#define DISASSEMBLER_TABLE

/* FIXME: Needs to live in header file.
   This header should also include the things in remote-sim.h.
   One could move this to remote-sim.h but this function isn't needed
   by gdb.  */
void sim_set_simcache_size PARAMS ((int));

int debug;

host_callback *sim_callback;

static SIM_OPEN_KIND sim_kind;
static char *myname;

/* This code can be compiled with any old C compiler, in which case
   four or five switch statements will be executed for each
   instruction simulated.  It can be compiled with GCC, then the
   simulated instructions thread through the code fragments, and
   everything goes much faster.

   These definitions make the code work either way
*/
#ifdef __GNUC__
#define DISPATCH(X) goto *(X); do
#define LABEL(X) X##_L
#define LABELN(X,N) X##_L##N
#define LABEL_REF(X) &&X##_L
#define LABEL_REFN(X,N) &&X##_L##N
#define ENDDISPATCH while (0);
#define fastref void *

#define DEFAULT ;
#define INLINE __inline__
#else
#define DEFAULT default :
#define DISPATCH(X) switch (X)
#define LABEL(X) case X
#define LABELN(X,N) case X
#define LABEL_REF(X) X
#define LABEL_REFN(X,N) X
#define ENDDISPATCH
#define fastref int



#define INLINE
#define STORE_REG_B 	1
#define STORE_REG_W 	2
#define STORE_INC_B 	3
#define STORE_INC_W 	4
#define STORE_DEC_B 	5
#define STORE_DEC_W 	6
#define STORE_DISP_B 	7
#define STORE_DISP_W 	8
#define STORE_CRB 	9
#define STORE_CRW 	10
#define STORE_REG_L 	11
#define STORE_NOP 	12

#define FETCH_NOP 	9
#define FETCH_REG_B 	10
#define FETCH_REG_W 	11
#define FETCH_INC_B 	12
#define FETCH_INC_W 	13
#define FETCH_DEC_B 	14
#define FETCH_DEC_W 	15
#define FETCH_DISP_B 	16
#define FETCH_DISP_W 	17
#define FETCH_IMM 	18
#define FETCH_CRB 	19
#define FETCH_CRW 	20
#define FETCH_LVAL 	21
#define FETCH_LVAL24 	22
#define FETCH_REG_L 	23

#define FLAG_m 		20
#define FLAG_M 		21
#define FLAG_A 		22
#define FLAG_NONE 	23
#define FLAG_NOSTORE 	24
#define FLAG_CLEAR 	25
#define FLAG_a 		26
#define FLAG_BRANCH 	27
#define FLAG_special 	28

#define FLAG_shiftword 	29
#define FLAG_shiftbyte 	30

#define FLAG_multword 	31
#define FLAG_multbyte 	32
#endif


#define h8500_table h8500_compile_table
#include "../opcodes/h8500-opc.h"

#include "inst.h"

#define LOW_BYTE(x) ((x) & 0xff)
#define HIGH_BYTE(x) (((x)>>8) & 0xff)
#define NORMAL_CP ((cpu.regs[R_CP].c - cpu.memory)>>16)
#define NORMAL_DP ((cpu.regs[R_DP].c - cpu.memory)>>16)
#define NORMAL_EP ((cpu.regs[R_EP].c - cpu.memory)>>16)
#define NORMAL_TP ((cpu.regs[R_TP].c - cpu.memory)>>16)
#define SET_NORMREG(x,y) ((cpu.regs[x].l = (y)))
#define GET_NORMREG(x) (cpu.regs[x].l)
#define SET_SEGREG(x,y) { cpu.regs[x].c = ((y) & 0xff0000) + cpu.memory;}
#define GET_SEGREG(x)  ( (cpu.regs[x].c  - cpu.memory ) >> 16)
#define SET_NORMAL_CPPC(x) { pc = (x) & 0xffff; SET_SEGREG(R_CP, (x));}
#define NORMAL_SR ((N<<3)|(Z<<2)|(V<<1)|(C))
#define P(X,Y) ((X<<8) | Y)

#define BUILDSR()   cpu.regs[R_SR].s[LOW] = (N << 3) | (Z << 2) | (V<<1) | C;

#define GETSR()		    \
  C = (cpu.regs[R_SR].s[LOW] >> 0) & 1;\
  V = (cpu.regs[R_SR].s[LOW] >> 1) & 1;\
  Z = (cpu.regs[R_SR].s[LOW] >> 2) & 1;\
  N = (cpu.regs[R_SR].s[LOW] >> 3) & 1;

#ifdef __CHAR_IS_SIGNED__
#define SEXTCHAR(x) ((char)(x))
#endif

#ifndef SEXTCHAR
#define SEXTCHAR(x) ((x & 0x80) ? (x | ~0xff):x)
#endif

#define SEXTSHORT(x) ((short)(x))

/* Which segment registers go with which pointer registers */
static unsigned char **segmap[R_LAST];
static unsigned char *(regptr[R_LAST][3]);
static unsigned char *(segregptr[R_LAST][3]);
static cpu_state_type cpu;

static int segforreg[] = {R_DP, R_DP, R_DP, R_DP,
			    R_EP, R_EP, R_TP, R_TP,
			    R_DP, R_DP, R_DP, R_DP,
			    R_EP, R_EP, R_TP, R_TP};
int LOW;
int HIGH;

/* routines for getting and storing args */
#define elval(struct, lit) \
 (((*(struct.reg.wptr) + lit) & 0xffff) + (*(struct.r2.segreg)))

#define displval(s) elval((s),(s).literal)

#define ireglval(struct) elval(struct, 0)
#define wordat(x) (((x)[0] << 8) | (x)[1])
#define longat(x) ((wordat((x))<<16)|(wordat((x)+2)))
#define byteat(x) ((x)[0])

#define setwordat(x,y) {x[0] =( y)>>8; x[1] = y;}
#define setbyteat(x,y) {x[0] = y;}

/*#define setalignedwordat(x,y) {((short *)x)[0] =y;}*/
/*
statics
*/

ea_type rd;
ea_type rs;
ea_type imm;
ea_type cr;
ea_type ea;
ea_type nop;
ea_type lval;
ea_type lval24;

ea_type eavector[2];

int disp;

#define JBYTE 0
#define JWORD 1
#define JLONG 2

typedef union
{
  struct
    {
      fastref srcabyte;
      fastref srcaword;
      fastref srcalong;

      fastref srcbbyte;
      fastref srcbword;
      fastref srcblong;

      fastref dstbyte;
      fastref dstword;
      fastref dstlong;
    } s;
  struct
    {
      fastref byte;
      fastref word;
      fastref lon;
    } a[3];

  fastref j[9];
} size_ptr;

union
{
  struct ea_struct
    {
      size_ptr ea_nop;
      size_ptr ea_reg;
      size_ptr ea_inc;
      size_ptr ea_dec;
      size_ptr ea_disp;

      size_ptr ea_imm;
      size_ptr ea_cr;
      size_ptr ea_lval;
      size_ptr ea_lval24;
    } s;
#define N_EATYPES (sizeof(struct ea_struct) / sizeof(size_ptr))
  size_ptr a[N_EATYPES];
} eas;

/* This function takes an ea structure filled in for the 1st source
 operand and modifies it to be for either the 1st, 2nd or dst operand */

static void
howto_workout (encoded, semiencoded, n)
     ea_type *encoded;
     ea_type *semiencoded;
     int n;
{
  int i;
  *encoded = *semiencoded;

  for (i = 0; i < N_EATYPES; i++)
    {
      if (encoded->type == eas.a[i].s.srcabyte)
	{
	  encoded->type = eas.a[i].a[n].byte;
	  return;
	}
      else if (encoded->type == eas.a[i].s.srcaword)
	{
	  encoded->type = eas.a[i].a[n].word;
	  return;
	}
      else if (encoded->type == eas.a[i].s.srcalong)
	{
	  encoded->type = eas.a[i].a[n].lon;
	  return;
	}
    }

  abort ();
}

fastref flag_shiftword;
fastref flag_shiftbyte;
fastref flag_multword;
fastref flag_multbyte;
fastref flag_mp;
fastref flag_special;
fastref flag_Mp;
fastref flag_ap;
fastref flag_Ap;
fastref flag_nonep;
fastref flag_nostorep;
fastref flag_clearp;
fastref flag_branch;
fastref exec_dispatch[100];

static int
get_now ()
{
  return time (0);
}

static int
now_persec ()
{
  return 1;
}

static void
gotcr (ptr, n)
     ea_type *ptr;
     int n;
{
  int size;
  n &= 0x7;
  if (n == 0)
    {
      abort ();
    }
  else
    {
      ptr->type = eas.s.ea_cr.j[JBYTE];
      ptr->reg.bptr = segregptr[n][JLONG];
    }
}
static void
gotreg (ptr, n, size)
     ea_type *ptr;
     int n;
     int size;
{
  n &= 0x7;
  ptr->type = eas.s.ea_reg.j[size];
  ptr->reg.bptr = regptr[n][size];
}

static void
gotinc (ptr, n, inc, size)
     ea_type *ptr;
     int n;
     int size;
{
  n &= 0x7;
  if (inc > 0)
    {
      ptr->type = eas.s.ea_inc.j[size];
    }
  else
    {
      ptr->type = eas.s.ea_dec.j[size];
    }
  ptr->reg.bptr = regptr[n][JWORD];
  ptr->r2.segreg = segmap[n];
}


static void
gotabs (ptr, disp, reg, size)
     ea_type *ptr;
     int disp;
     int reg;
     int size;
{
  ptr->type = eas.s.ea_disp.j[size];
  ptr->reg.bptr = regptr[reg][JWORD];
  ptr->r2.segreg = segmap[reg];
  ptr->literal = disp;
}

static void
gotind (ptr, disp, reg, size)
     ea_type *ptr;
     int disp;
     int reg;
     int size;
{
  gotabs (ptr, disp, reg & 0x7, size);
}

static void
gotimm (ptr, val)
     ea_type *ptr;
     int val;
{
  ptr->type = eas.s.ea_imm.j[0];
  ptr->literal = val;
}

static void
indoff (ptr)
     ea_type *ptr;
{
  int i;
  for (i = 0; i < 6; i++)
    {
      if (ptr->type == eas.s.ea_disp.j[i])
	{
	  ptr->type = eas.s.ea_lval.j[i];
	  return;
	}
    }
}

thinkabout_shifts (d, bytesized)
     decoded_inst *d;
     int bytesized;
{
  if (bytesized)
    {
      /* Got a byte shift, fake up second arg */
      d->srcb.type = eas.s.ea_imm.s.srcbword;
      d->srcb.literal = 8;
    }
  else
    {
      /* got a word shift, fake up second arg */
      d->srcb.type = eas.s.ea_imm.s.srcbword;
      d->srcb.literal = 16;
    }
}

/* Calculate the number of cycles required to run this
   instruction
*/
static void
compcycles (dst, opcode)
     decoded_inst *dst;
     h8500_opcode_info *opcode;
{
  int cycles = 0;
  /* Guess for the time being - 1 cycle for the first two bytes in the
     opcode - to fecth the operand, and 3 cycles for all the rest of
     the bytes, since they mean that there is probably an operand to
     fetch */

  switch (opcode->length)
    {
    case 1:
    case 2:
      cycles += opcode->length;
      break;
    default:
      cycles += opcode->length * 3;
      break;
    }

  dst->cycles = cycles;
}

static void
translate (ptr, from, to)
     ea_type *ptr;
     fastref from;
     fastref to;
{
  if (ptr->reg.wptr == &cpu.regs[7].s[LOW]
      && ptr->type == from)
    {
      ptr->type = to;
    }
}

static
void
fix_incdecs (dst)
     decoded_inst *dst;
{
  if (dst->dst.type == eas.s.ea_inc.s.dstbyte
      && (dst->srca.type == eas.s.ea_inc.s.srcabyte
	  || dst->srcb.type == eas.s.ea_inc.s.srcbbyte))
    {
      dst->dst.type = eas.s.ea_disp.s.dstbyte;
    }

  if (dst->dst.type == eas.s.ea_inc.s.dstword
      && (dst->srca.type == eas.s.ea_inc.s.srcaword
	  || dst->srcb.type == eas.s.ea_inc.s.srcbword))
    {
      dst->dst.type = eas.s.ea_disp.s.dstword;
    }

  if (dst->dst.type == eas.s.ea_dec.s.dstbyte
      || dst->dst.type == eas.s.ea_dec.s.dstword)
    {
      if (dst->srca.type == eas.s.ea_dec.s.srcabyte)
	{
	  dst->srca.type = eas.s.ea_disp.s.srcabyte;
	}
      else if (dst->srca.type == eas.s.ea_dec.s.srcaword)
	{
	  dst->srca.type = eas.s.ea_disp.s.srcaword;
	}
      else if (dst->srcb.type == eas.s.ea_dec.s.srcbbyte)
	{
	  dst->srcb.type = eas.s.ea_disp.s.srcbbyte;
	}
      else if (dst->srcb.type == eas.s.ea_dec.s.srcbword)
	{
	  dst->srcb.type = eas.s.ea_disp.s.srcbword;
	}
    }


  /* Turn a byte ops from the sp into word ops */
  translate (&dst->dst, eas.s.ea_dec.s.dstbyte, eas.s.ea_dec.s.dstword);
  translate (&dst->dst, eas.s.ea_inc.s.dstbyte, eas.s.ea_inc.s.dstword);

  translate (&dst->srca, eas.s.ea_dec.s.srcabyte, eas.s.ea_dec.s.srcaword);
  translate (&dst->srca, eas.s.ea_inc.s.srcabyte, eas.s.ea_inc.s.srcaword);

  translate (&dst->srcb, eas.s.ea_dec.s.srcbbyte, eas.s.ea_dec.s.srcbword);
  translate (&dst->srcb, eas.s.ea_inc.s.srcbbyte, eas.s.ea_inc.s.srcbword);


}


static void
find (pc, buffer, dst)
     int pc;
     unsigned char *buffer;
     decoded_inst *dst;
{
  h8500_opcode_info *opcode;
  int i;
  int idx;
  int hadimm = 0;
  dst->srca.reg.rptr = 0;

  /* Run down the table to find the one which matches */
  for (opcode = h8500_table; opcode->name; opcode++)
    {
      int byte;
      int rn;
      int rd;
      int rs;
      int disp;
      int abs;
      int imm;
      int pcrel;
      int qim;
      int i;
      int cr;


      dst->opcode = exec_dispatch[opcode->flavor & 0x7f];

      for (byte = 0; byte < opcode->length; byte++)
	{
	  if ((buffer[byte] & opcode->bytes[byte].mask)
	      != (opcode->bytes[byte].contents))
	    {
	      goto next;
	    }
	  else
	    {
	      /* extract any info parts */
	      switch (opcode->bytes[byte].insert)
		{
		case 0:
		case FP:
		  break;
		default:
		  abort ();
		  break;
		case RN:
		  rn = buffer[byte] & 0x7;
		  break;
		case RS:
		  rs = buffer[byte] & 0x7;
		  break;
		case CRB:
		  cr = buffer[byte] & 0x7;
		  if (cr == 0)
		    goto next;
		  break;
		case CRW:
		  cr = buffer[byte] & 0x7;
		  if (cr != 0)
		    goto next;
		  break;
		case DISP16:
		  disp = (buffer[byte] << 8) | (buffer[byte + 1]);
		  break;
		case FPIND_D8:
		case DISP8:
		  disp = ((char) (buffer[byte]));
		  break;
		case RD:
		case RDIND:
		  rd = buffer[byte] & 0x7;
		  break;
		case ABS24:
		  abs =
		    (buffer[byte] << 16)
		      | (buffer[byte + 1] << 8)
			| (buffer[byte + 2]);
		  break;
		case ABS16:
		  abs = (buffer[byte] << 8) | (buffer[byte + 1]);
		  break;
		case ABS8:
		  abs = (buffer[byte]);
		  break;
		case IMM16:
		  imm = (buffer[byte] << 8) | (buffer[byte + 1]);
		  break;
		case IMM4:
		  imm = (buffer[byte]) & 0xf;
		  break;
		case IMM8:
		case RLIST:
		  imm = SEXTCHAR (buffer[byte]);
		  break;
		case PCREL16:
		  pcrel = SEXTSHORT ((buffer[byte] << 8) | (buffer[byte + 1]));
		  break;
		case PCREL8:
		  pcrel = SEXTCHAR ((buffer[byte]));
		  break;
		case QIM:
		  switch (buffer[byte] & 0x7)
		    {
		    case 0:
		      imm = 1;
		      break;
		    case 1:
		      imm = 2;
		      break;
		    case 4:
		      imm = -1;
		      break;
		    case 5:
		      imm = -2;
		      break;
		    }
		  break;

		}
	    }
	}
      if (opcode->flavor & O_BYTE)
	{
	  idx = 0;
	  switch (opcode->flags)
	    {
	    case 'h':
	      dst->flags = flag_shiftbyte;
	      break;
	    case 'p':
	      dst->flags = flag_multbyte;
	      break;
	    case 'B':
	      dst->flags = flag_branch;
	      break;
	    case 'm':
	      dst->flags = flag_mp;
	      break;
	    case 'a':
	      dst->flags = flag_ap;
	      break;
	    case '-':
	      dst->flags = flag_nonep;
	      break;
	    case 0:
	      dst->flags = flag_nostorep;
	      break;
	    case 'c':
	      dst->flags = flag_clearp;
	      break;
	    case 's':
	      /* special */
	      dst->flags = flag_special;
	    }
	}
      else
	{
	  idx = 1;
	  switch (opcode->flags)
	    {
	    case 'h':
	      dst->flags = flag_shiftword;
	      break;
	    case 'p':
	      dst->flags = flag_multword;
	      break;
	    case 'B':
	      dst->flags = flag_branch;
	      break;
	    case 'm':
	      dst->flags = flag_Mp;
	      break;
	    case 'a':
	      dst->flags = flag_Ap;
	      break;
	    case '-':
	      dst->flags = flag_nonep;
	      break;
	    case 0:
	      dst->flags = flag_nostorep;
	      break;
	    case 'c':
	      dst->flags = flag_clearp;
	      break;
	    case 's':
	      /* special */
	      dst->flags = flag_special;
	      break;
	    }
	}

      for (i = 0; i < opcode->nargs; i++)
	{
	  ea_type *p = eavector + i;

	  switch (opcode->arg_type[i])
	    {
	    default:
	      abort ();

	    case FP:
	      gotreg (p, 6, idx);
	      break;
	    case RNIND:
	      disp = 0;
	    case RNIND_D16:
	    case RNIND_D8:
	      gotind (p, disp, rn, idx);
	      break;
	      break;
	    case RDIND:
	      disp = 0;
	    case RDIND_D16:
	    case RDIND_D8:
	      gotind (p, disp, rd, idx);
	      break;
	    case FPIND_D8:
	      gotind (p, disp, 6, idx);
	      break;
	    case CRB:
	    case CRW:
	      gotcr (p, cr);
	      break;
	    case RN:
	      gotreg (p, rn, idx);
	      break;
	    case RD:
	      gotreg (p, rd, idx);
	      break;
	    case RS:
	      gotreg (p, rs, idx);
	      break;
	    case RNDEC:
	      gotinc (p, rn, -1, idx);
	      break;
	    case RNINC:
	      gotinc (p, rn, 1, idx);
	      break;
	    case SPINC:
	      gotinc (p, 7, 1, idx);
	      break;
	    case SPDEC:
	      gotinc (p, 7, -1, idx);
	      break;
	    case ABS24:
	    case ABS16:
	      gotabs (p, abs, R_HARD_0, idx);
	      break;
	    case ABS8:
	      gotabs (p, abs, R_HARD8_0, idx);
	      break;
	    case IMM16:
	    case RLIST:
	    case QIM:
	    case IMM4:
	    case IMM8:
	      gotimm (p, imm);
	      break;
	    case PCREL16:
	    case PCREL8:
	      gotimm (p,
		      ((pcrel + pc + opcode->length) & 0xffff) | (pc & 0xff0000),
		      R_HARD_0, JLONG);

	    }
	}

      /* Finished and done - turn from two operand stuff into three */

      dst->srca.type = eas.s.ea_nop.s.srcabyte;
      dst->srcb.type = eas.s.ea_nop.s.srcbbyte;
      dst->dst.type = eas.s.ea_nop.s.dstbyte;

      if (opcode->nargs)
	{
	  switch (opcode->nargs)
	    {
	    case 1:
	      howto_workout (&dst->srca, &eavector[0], 0);
	      if (opcode->dst != '!')
		howto_workout (&dst->dst, &eavector[0], 2);
	      break;
	    case 2:
	      if (opcode->src2 == '!')
		{
		  howto_workout (&dst->srca, &eavector[0], 0);
		  howto_workout (&dst->dst, &eavector[1], 2);
		}
	      else
		{
		  howto_workout (&dst->srca, &eavector[0], 0);
		  howto_workout (&dst->srcb, &eavector[1], 1);
		  if (opcode->dst != '!')
		    {
		      howto_workout (&dst->dst, &eavector[1], 2);
		    }
		}
	      break;
	    }



	  /* Some extra stuff with pre inc and post dec,
	     make sure that if the same ea is there twice, only one of the
	     ops is auto inc/dec */

	  fix_incdecs (dst);


	  /* Some special cases */
	  if (dst->opcode == exec_dispatch[O_PJSR]
	      || dst->opcode == exec_dispatch[O_PJMP])
	    {
	      /* Both the @abs:24 and @rn turn into a disp word,
		 chose the right a mode since  @abs:24 is 4 bytes
		 long */

	      if (opcode->length == 4)
		{
		  dst->srca.type = eas.s.ea_lval24.s.srcabyte;
		}
	      else
		{
		  dst->srca.type = eas.s.ea_reg.s.srcalong;
		}

	      dst->srca.r2.rptr = &cpu.regs[R_HARD_0];

	      /* For [P]JSR, keep return address precomputed */
	      dst->srcb.literal = pc + opcode->length;
	      dst->srcb.type = eas.s.ea_imm.s.srcbword;
	    }
	  else if (dst->opcode == exec_dispatch[O_MULXU])
	    {
	      /* This is a multiply -fix the destination op */
	      if (dst->dst.type == eas.s.ea_reg.s.dstword)
		{
		  dst->dst.type = eas.s.ea_reg.s.dstlong;
		}
	      else
		{
		  dst->dst.type = eas.s.ea_reg.s.dstword;
		}
	      dst->dst.reg.bptr = regptr[rd][JWORD];
	    }
	  else if (dst->opcode == exec_dispatch[O_DIVXU])
	    {
	      /* This is a wider than normal, fix the source operand */
	      dst->srcb.type
		= (dst->srcb.type == eas.s.ea_reg.s.srcbword)
		  ? eas.s.ea_reg.s.srcblong
		    : eas.s.ea_reg.s.srcbword;

	      dst->dst.type
		= (dst->dst.type == eas.s.ea_reg.s.dstword)
		  ? eas.s.ea_reg.s.dstlong
		    : eas.s.ea_reg.s.dstword;

	    }

	  else if (dst->opcode == exec_dispatch[O_LDM])
	    {
	      /* Turn of the stack ref */
	      dst->srca.type = eas.s.ea_nop.s.srcabyte;
	    }
	  else if (dst->opcode == exec_dispatch[O_STM])
	    {
	      /* Turn of the stack ref */
	      dst->srcb.type = eas.s.ea_nop.s.srcbbyte;
	    }


	  /* extends read one size and write another */
	  else if (dst->opcode == exec_dispatch[O_EXTS]
		   || dst->opcode == exec_dispatch[O_EXTU])
	    {
	      dst->dst.type = eas.s.ea_reg.s.dstword;
	      dst->dst.reg.bptr = regptr[rd][JWORD];
	      dst->flags = flag_Ap;
	    }


	  if (opcode->flags == 'h')
	    thinkabout_shifts (dst, opcode->flavor & O_BYTE);


	  /* For a branch, turn off one level of indirection */
	  if (opcode->src1 == 'B')
	    {
	      indoff (&dst->srca, 0);
	    }

	}
      dst->next_pc = pc + opcode->length;

      compcycles (dst, opcode);

      return;


    next:;
    }

  /* Couldn't understand anything */
  dst->opcode = exec_dispatch[O_TRAPA];
  dst->next_pc = pc + 1;

}

compile (pc)
{
  int idx;

  /* find the next cache entry to use */

  idx = cpu.cache_top + 1;
  cpu.compiles++;
  if (idx >= cpu.csize)
    {
      idx = 1;
    }
  cpu.cache_top = idx;

  /* Throw away its old meaning */
  cpu.cache_idx[cpu.cache[idx].oldpc] = 0;

  /* set to new address */
  cpu.cache[idx].oldpc = pc;

  /* fill in instruction info */
  find (pc, cpu.memory + pc, cpu.cache + idx);

  /* point to new cache entry */
  cpu.cache_idx[pc] = idx;
}

baddefault (x)
{
  printf ("bad default %d\n", x);
}

static int fetch_l (arg)
     ea_type *arg;
{
  int l, r;

  int h = *(arg->reg.wptr);
  r = (union rtype *) (arg->reg.wptr) - &cpu.regs[0];
  r++;

  l = cpu.regs[r].s[LOW];
  return (h << 16) | l;

}

#define FETCH(dst, arg, n)  \
{ \
 int r; unsigned char*lval; \
 DISPATCH((arg).type) \
 { LABELN(FETCH_NOP,n): \
 dst= 0; \
 break; \
 DEFAULT baddefault((arg).type); break; \
 LABELN(FETCH_LVAL,n):  \
 dst = (*(((arg).reg.wptr)) + (arg.literal)) ; \
 break; \
 LABELN(FETCH_LVAL24,n):  \
 dst = (*(((arg).reg.wptr)) + *(((arg).r2.wptr)) + (arg.literal)) &0xffffff; \
 break; \
 LABELN(FETCH_CRB,n):  \
 dst = (*((arg).reg.segptr) - cpu.memory)>>16; \
 break; \
 LABELN(FETCH_CRW,n):  \
  dst = BUILDSR();\
 break; \
 LABELN(FETCH_REG_B,n): \
 dst = *((arg).reg.bptr); \
 break; \
 LABELN(FETCH_REG_W,n): \
 dst = *((arg).reg.wptr); \
 break; \
 LABELN(FETCH_REG_L,n): \
 dst = fetch_l(&(arg));\
 break; \
 LABELN(FETCH_INC_B,n): \
 lval = elval ((arg), 0); \
 dst = byteat (lval); \
 (*((arg).reg.wptr))++; \
 break; \
 LABELN(FETCH_INC_W,n): \
 lval = elval ((arg), 0); \
 dst = wordat (lval); \
 (*(((arg).reg.wptr))) += 2; \
 break; \
 LABELN(FETCH_DEC_B, n): \
 (*(arg).reg.wptr)--; \
 lval = elval ((arg), 0); \
 r = byteat (lval); \
 dst = r; \
 break; \
 LABELN(FETCH_DEC_W, n): \
 (*((arg).reg.wptr)) -= 2; \
 lval = elval ((arg), 0); \
 r = wordat (lval); \
 dst = r; \
 break; \
 LABELN(FETCH_DISP_B,n): \
 lval = displval ((arg)); \
 dst = byteat (lval); \
 break; \
 LABELN(FETCH_DISP_W,n): \
 lval = displval ((arg)); \
 dst = wordat (lval); \
 break; \
 LABELN(FETCH_IMM, n): \
 dst = (arg).literal; \
 break; \
 } \
 ENDDISPATCH; \
}

static union
{
  short int i;
  struct
    {
      char low;
      char high;
    }
  u;
}

littleendian;

static
void
init_pointers ()
{
  static int init;

  if (!init)
    {
      int i;

      init = 1;
      littleendian.i = 1;

      for (i = 0; i < (int) R_LAST; i++)
	{
	  if (littleendian.u.high)
	    {
	      /* big endian host */


	      LOW = 1;
	      HIGH = 0;

	      regptr[i][0] = ((unsigned char *) (cpu.regs + i)) + 3;
	      regptr[i][1] = ((unsigned char *) (cpu.regs + i)) + 2;
	    }
	  else
	    {
	      LOW = 0;
	      HIGH = 1;

	      regptr[i][0] = (unsigned char *) &(cpu.regs[i]);
	      regptr[i][1] = (unsigned char *) (&(cpu.regs[i]));
	    }

	  regptr[i][2] = (unsigned char *) &(cpu.regs[i]);
	}

      memcpy (segregptr + 0, regptr + R_SR, sizeof (segregptr[0]));
      memcpy (segregptr + 1, regptr + R_TP, sizeof (segregptr[1]));
      memcpy (segregptr + 3, regptr + R_BR, sizeof (segregptr[3]));
      memcpy (segregptr + 4, regptr + R_EP, sizeof (segregptr[4]));
      memcpy (segregptr + 5, regptr + R_DP, sizeof (segregptr[5]));
      memcpy (segregptr + 6, regptr + R_CP, sizeof (segregptr[6]));
      memcpy (segregptr + 7, regptr + R_TP, sizeof (segregptr[7]));

      /* Pointers to into the cpu state for the seg registers */

      segmap[R0] = &cpu.regs[R_DP].c;
      segmap[R1] = &cpu.regs[R_DP].c;
      segmap[R2] = &cpu.regs[R_DP].c;
      segmap[R3] = &cpu.regs[R_DP].c;
      segmap[R4] = &cpu.regs[R_EP].c;
      segmap[R5] = &cpu.regs[R_EP].c;
      segmap[R6] = &cpu.regs[R_TP].c;
      segmap[R7] = &cpu.regs[R_TP].c;
      segmap[R_HARD_0] = &cpu.regs[R_DP].c;
      segmap[R_HARD8_0] = &cpu.regs[R_BP].c;

      cpu.memory = (unsigned char *) calloc (sizeof (char), H8500_MSIZE);
      cpu.cache_idx = (unsigned short *) calloc (sizeof (short), H8500_MSIZE);

      /* initialize the seg registers */

      cpu.regs[R_DP].c = cpu.memory;
      cpu.regs[R_TP].c = cpu.memory;
      cpu.regs[R_CP].c = cpu.memory;
      cpu.regs[R_BP].c = cpu.memory;
      cpu.regs[R_EP].c = cpu.memory;
      cpu.regs[R7].s[LOW] = 0xfffe;
      cpu.regs[R6].s[LOW] = 0xfffe;
      if (!cpu.cache)
	sim_set_simcache_size (CSIZE);
    }
}

#define PUSHWORD(x)				\
{						\
  int sp = cpu.regs[R7].s[LOW];			\
  unsigned char *p;				\
						\
  sp -= 2;					\
  p = (sp & 0xffff) + (cpu.regs[R_TP].c);	\
  cpu.regs[R7].s[LOW] = sp;			\
  setwordat (p, x);				\
}						\

#define POPWORD(d)				\
{						\
  int spx= cpu.regs[R7].s[LOW];			\
  unsigned char *p;				\
	        				\
  p = (spx& 0xffff) + (cpu.regs[R_TP].c);	\
  spx+= 2;					\
  cpu.regs[R7].s[LOW] = spx;                    \
  d = wordat (p);				\
}						\

/* simulate a monitor trap */
trap ()
{
  switch (cpu.regs[R3].s[LOW] & 0xff)
    {
    case 33:
      /* exit */
      cpu.exception = SIGQUIT;
      break;
    case 34:
      /* abort */
      cpu.exception = SIGABRT;
      break;
    case 6:
      /* print char in r0 */
      printf ("%c", cpu.regs[R0].s[LOW]);
      break;
    }
}
void
control_c (sig, code, scp, addr)
     int sig;
     int code;
     char *scp;
     char *addr;
{
  cpu.exception = SIGINT;
}

static jmp_buf jbuf;
static void
segv ()
{
  cpu.exception = SIGSEGV;
  longjmp (jbuf, 1);
}

int
sim_stop (sd)
     SIM_DESC sd;
{
  cpu.exception = SIGINT;
  return 1;
}

void
sim_resume (sd, step, siggnal)
     SIM_DESC sd;
{
  static int init1;
  int res;
  int tmp;
  int arga;
  int argb;
  int bit;
  int pc;
  int C, Z, V, N;
  int cycles = 0;
  int insts = 0;
  int tick_start = get_now ();
  void (*prev) ();
  void (*prev_seg) ();

  if (!init1)
    {
      int i;

      init1 = 1;
      init_pointers ();

      for (i = 0; i < N_EATYPES; i++)
	{
	  eas.a[i].s.srcabyte = LABEL_REFN (FETCH_NOP, 0);
	  eas.a[i].s.srcaword = LABEL_REFN (FETCH_NOP, 0);
	  eas.a[i].s.srcalong = LABEL_REFN (FETCH_NOP, 0);

	  eas.a[i].s.srcbbyte = LABEL_REFN (FETCH_NOP, 1);
	  eas.a[i].s.srcbword = LABEL_REFN (FETCH_NOP, 1);
	  eas.a[i].s.srcblong = LABEL_REFN (FETCH_NOP, 1);

	  eas.a[i].s.dstbyte = LABEL_REF (STORE_NOP);
	  eas.a[i].s.dstword = LABEL_REF (STORE_NOP);
	  eas.a[i].s.dstlong = LABEL_REF (STORE_NOP);
	}

      eas.s.ea_lval.s.srcabyte = LABEL_REFN (FETCH_LVAL, 0);
      eas.s.ea_lval.s.srcaword = LABEL_REFN (FETCH_LVAL, 0);
      eas.s.ea_lval24.s.srcabyte = LABEL_REFN (FETCH_LVAL24, 0);
      eas.s.ea_lval24.s.srcaword = LABEL_REFN (FETCH_LVAL24, 0);

      eas.s.ea_nop.s.srcabyte = LABEL_REFN (FETCH_NOP, 0);
      eas.s.ea_nop.s.srcaword = LABEL_REFN (FETCH_NOP, 0);
      eas.s.ea_nop.s.srcbbyte = LABEL_REFN (FETCH_NOP, 1);
      eas.s.ea_nop.s.srcbword = LABEL_REFN (FETCH_NOP, 1);
      eas.s.ea_nop.s.dstbyte = LABEL_REF (STORE_NOP);
      eas.s.ea_nop.s.dstword = LABEL_REF (STORE_NOP);

      eas.s.ea_cr.s.srcabyte = LABEL_REFN (FETCH_CRB, 0);
      eas.s.ea_cr.s.srcaword = LABEL_REFN (FETCH_CRW, 0);

      eas.s.ea_cr.s.srcbbyte = LABEL_REFN (FETCH_CRB, 1);
      eas.s.ea_cr.s.srcbword = LABEL_REFN (FETCH_CRW, 1);

      eas.s.ea_cr.s.dstbyte = LABEL_REF (STORE_CRB);
      eas.s.ea_cr.s.dstword = LABEL_REF (STORE_CRW);

      eas.s.ea_reg.s.srcabyte = LABEL_REFN (FETCH_REG_B, 0);
      eas.s.ea_reg.s.srcaword = LABEL_REFN (FETCH_REG_W, 0);
      eas.s.ea_reg.s.srcalong = LABEL_REFN (FETCH_REG_L, 0);

      eas.s.ea_reg.s.srcbbyte = LABEL_REFN (FETCH_REG_B, 1);
      eas.s.ea_reg.s.srcbword = LABEL_REFN (FETCH_REG_W, 1);
      eas.s.ea_reg.s.srcblong = LABEL_REFN (FETCH_REG_L, 1);

      eas.s.ea_reg.s.dstbyte = LABEL_REF (STORE_REG_B);
      eas.s.ea_reg.s.dstword = LABEL_REF (STORE_REG_W);
      eas.s.ea_reg.s.dstlong = LABEL_REF (STORE_REG_L);

      eas.s.ea_inc.s.srcabyte = LABEL_REFN (FETCH_INC_B, 0);
      eas.s.ea_inc.s.srcaword = LABEL_REFN (FETCH_INC_W, 0);
      eas.s.ea_inc.s.srcbbyte = LABEL_REFN (FETCH_INC_B, 1);
      eas.s.ea_inc.s.srcbword = LABEL_REFN (FETCH_INC_W, 1);
      eas.s.ea_inc.s.dstbyte = LABEL_REF (STORE_INC_B);
      eas.s.ea_inc.s.dstword = LABEL_REF (STORE_INC_W);

      eas.s.ea_dec.s.srcabyte = LABEL_REFN (FETCH_DEC_B, 0);
      eas.s.ea_dec.s.srcaword = LABEL_REFN (FETCH_DEC_W, 0);
      eas.s.ea_dec.s.srcbbyte = LABEL_REFN (FETCH_DEC_B, 1);
      eas.s.ea_dec.s.srcbword = LABEL_REFN (FETCH_DEC_W, 1);
      eas.s.ea_dec.s.dstbyte = LABEL_REF (STORE_DEC_B);
      eas.s.ea_dec.s.dstword = LABEL_REF (STORE_DEC_W);

      eas.s.ea_disp.s.srcabyte = LABEL_REFN (FETCH_DISP_B, 0);
      eas.s.ea_disp.s.srcaword = LABEL_REFN (FETCH_DISP_W, 0);
      eas.s.ea_disp.s.srcbbyte = LABEL_REFN (FETCH_DISP_B, 1);
      eas.s.ea_disp.s.srcbword = LABEL_REFN (FETCH_DISP_W, 1);
      eas.s.ea_disp.s.dstbyte = LABEL_REF (STORE_DISP_B);
      eas.s.ea_disp.s.dstword = LABEL_REF (STORE_DISP_W);

      eas.s.ea_imm.s.srcabyte = LABEL_REFN (FETCH_IMM, 0);
      eas.s.ea_imm.s.srcaword = LABEL_REFN (FETCH_IMM, 0);
      eas.s.ea_imm.s.srcbbyte = LABEL_REFN (FETCH_IMM, 1);
      eas.s.ea_imm.s.srcbword = LABEL_REFN (FETCH_IMM, 1);

      flag_special = LABEL_REF (FLAG_special);
      flag_mp = LABEL_REF (FLAG_m);
      flag_Mp = LABEL_REF (FLAG_M);
      flag_ap = LABEL_REF (FLAG_a);
      flag_Ap = LABEL_REF (FLAG_A);
      flag_nonep = LABEL_REF (FLAG_NONE);
      flag_nostorep = LABEL_REF (FLAG_NOSTORE);
      flag_clearp = LABEL_REF (FLAG_CLEAR);
      flag_shiftbyte = LABEL_REF (FLAG_shiftbyte);
      flag_shiftword = LABEL_REF (FLAG_shiftword);
      flag_multbyte = LABEL_REF (FLAG_multbyte);
      flag_multword = LABEL_REF (FLAG_multword);


      exec_dispatch[O_ADDS] = LABEL_REF (O_ADDS);
      exec_dispatch[O_ADDX] = LABEL_REF (O_ADDX);
      exec_dispatch[O_ADD] = LABEL_REF (O_ADD);
      exec_dispatch[O_ANDC] = LABEL_REF (O_ANDC);
      exec_dispatch[O_AND] = LABEL_REF (O_AND);
      exec_dispatch[O_BCC] = LABEL_REF (O_BCC);
      exec_dispatch[O_BCLR] = LABEL_REF (O_BCLR);
      exec_dispatch[O_BCS] = LABEL_REF (O_BCS);
      exec_dispatch[O_BEQ] = LABEL_REF (O_BEQ);
      exec_dispatch[O_BF] = LABEL_REF (O_BF);
      exec_dispatch[O_BGE] = LABEL_REF (O_BGE);
      exec_dispatch[O_BGT] = LABEL_REF (O_BGT);
      exec_dispatch[O_BHI] = LABEL_REF (O_BHI);
      exec_dispatch[O_BHS] = LABEL_REF (O_BHS);
      exec_dispatch[O_BLE] = LABEL_REF (O_BLE);
      exec_dispatch[O_BLO] = LABEL_REF (O_BLO);
      exec_dispatch[O_BLS] = LABEL_REF (O_BLS);
      exec_dispatch[O_BLT] = LABEL_REF (O_BLT);
      exec_dispatch[O_BMI] = LABEL_REF (O_BMI);
      exec_dispatch[O_BNE] = LABEL_REF (O_BNE);
      exec_dispatch[O_BNOT] = LABEL_REF (O_BNOT);
      exec_dispatch[O_BPL] = LABEL_REF (O_BPL);
      exec_dispatch[O_BPT] = LABEL_REF (O_BPT);
      exec_dispatch[O_BRA] = LABEL_REF (O_BRA);
      exec_dispatch[O_BRN] = LABEL_REF (O_BRN);
      exec_dispatch[O_BSET] = LABEL_REF (O_BSET);
      exec_dispatch[O_BSR] = LABEL_REF (O_BSR);
      exec_dispatch[O_BTST] = LABEL_REF (O_BTST);
      exec_dispatch[O_BT] = LABEL_REF (O_BT);
      exec_dispatch[O_BVC] = LABEL_REF (O_BVC);
      exec_dispatch[O_BVS] = LABEL_REF (O_BVS);
      exec_dispatch[O_CLR] = LABEL_REF (O_CLR);
      exec_dispatch[O_CMP] = LABEL_REF (O_CMP);
      exec_dispatch[O_DADD] = LABEL_REF (O_DADD);
      exec_dispatch[O_DIVXU] = LABEL_REF (O_DIVXU);
      exec_dispatch[O_DSUB] = LABEL_REF (O_DSUB);
      exec_dispatch[O_EXTS] = LABEL_REF (O_EXTS);
      exec_dispatch[O_EXTU] = LABEL_REF (O_EXTU);
      exec_dispatch[O_JMP] = LABEL_REF (O_JMP);
      exec_dispatch[O_JSR] = LABEL_REF (O_JSR);
      exec_dispatch[O_LDC] = LABEL_REF (O_LDC);
      exec_dispatch[O_LDM] = LABEL_REF (O_LDM);
      exec_dispatch[O_LINK] = LABEL_REF (O_LINK);
      exec_dispatch[O_MOVFPE] = LABEL_REF (O_MOVFPE);
      exec_dispatch[O_MOVTPE] = LABEL_REF (O_MOVTPE);
      exec_dispatch[O_MOV] = LABEL_REF (O_MOV);
      exec_dispatch[O_MULXU] = LABEL_REF (O_MULXU);
      exec_dispatch[O_NEG] = LABEL_REF (O_NEG);
      exec_dispatch[O_NOP] = LABEL_REF (O_NOP);
      exec_dispatch[O_NOT] = LABEL_REF (O_NOT);
      exec_dispatch[O_ORC] = LABEL_REF (O_ORC);
      exec_dispatch[O_OR] = LABEL_REF (O_OR);
      exec_dispatch[O_PJMP] = LABEL_REF (O_PJMP);
      exec_dispatch[O_PJSR] = LABEL_REF (O_PJSR);
      exec_dispatch[O_PRTD] = LABEL_REF (O_PRTD);
      exec_dispatch[O_PRTS] = LABEL_REF (O_PRTS);
      exec_dispatch[O_RECOMPILE] = LABEL_REF (O_RECOMPILE);

      exec_dispatch[O_ROTL] = LABEL_REF (O_ROTL);
      exec_dispatch[O_ROTR] = LABEL_REF (O_ROTR);
      exec_dispatch[O_ROTXL] = LABEL_REF (O_ROTXL);
      exec_dispatch[O_ROTXR] = LABEL_REF (O_ROTXR);

      exec_dispatch[O_RTD] = LABEL_REF (O_RTD);
      exec_dispatch[O_RTS] = LABEL_REF (O_RTS);
      exec_dispatch[O_SCB_EQ] = LABEL_REF (O_SCB_EQ);
      exec_dispatch[O_SCB_F] = LABEL_REF (O_SCB_F);
      exec_dispatch[O_SCB_NE] = LABEL_REF (O_SCB_NE);
      exec_dispatch[O_SHAL] = LABEL_REF (O_SHAL);
      exec_dispatch[O_SHAR] = LABEL_REF (O_SHAR);
      exec_dispatch[O_SHLL] = LABEL_REF (O_SHLL);
      exec_dispatch[O_SHLR] = LABEL_REF (O_SHLR);

      exec_dispatch[O_SLEEP] = LABEL_REF (O_SLEEP);
      exec_dispatch[O_STC] = LABEL_REF (O_STC);
      exec_dispatch[O_STM] = LABEL_REF (O_STM);
      exec_dispatch[O_SUBS] = LABEL_REF (O_SUBS);
      exec_dispatch[O_SUBX] = LABEL_REF (O_SUBX);
      exec_dispatch[O_SUB] = LABEL_REF (O_SUB);
      exec_dispatch[O_SWAP] = LABEL_REF (O_SWAP);
      exec_dispatch[O_TAS] = LABEL_REF (O_TAS);
      exec_dispatch[O_TRAPA] = LABEL_REF (O_TRAPA);
      exec_dispatch[O_TRAP_VS] = LABEL_REF (O_TRAP_VS);
      exec_dispatch[O_TST] = LABEL_REF (O_TST);
      exec_dispatch[O_UNLK] = LABEL_REF (O_UNLK);
      exec_dispatch[O_XCH] = LABEL_REF (O_XCH);
      exec_dispatch[O_XORC] = LABEL_REF (O_XORC);
      exec_dispatch[O_XOR] = LABEL_REF (O_XOR);
      nop.type = eas.s.ea_nop.s.srcabyte;
      cpu.cache[0].opcode = exec_dispatch[O_RECOMPILE];
      cpu.cache[0].srca.type = eas.s.ea_nop.s.srcabyte;
      cpu.cache[0].srcb.type = eas.s.ea_nop.s.srcbbyte;
    }

  prev = signal (SIGINT, control_c);
  prev_seg = signal (SIGSEGV, segv);

  if (step)
    {
      cpu.exception = SIGTRAP;
    }
  else
    {
      cpu.exception = 0;
    }

  pc = cpu.regs[R_PC].s[LOW] + (NORMAL_CP << 16);

  GETSR ();

  if (setjmp (jbuf) == 0) {
    do
      {
	int cidx;
	decoded_inst *code;

      top:
	cidx = cpu.cache_idx[pc];
	code = cpu.cache + cidx;

	FETCH (arga, code->srca, 0);
	FETCH (argb, code->srcb, 1);


	
#ifdef DEBUG
	if (debug)
	  {
	    printf ("%x %d %s\n", pc, code->opcode,
		    code->op ? code->op->name : "**");
	  }
#endif

	cycles += code->cycles;
	insts++;
	DISPATCH (code->opcode)
	  {
	    LABEL (O_RECOMPILE):
	    /* This opcode is a fake for when we get to an instruction which
	       hasn't been compiled */
	    compile (pc);
	    goto top;
	    break;
	    LABEL (O_NEG):
	    arga = -arga;
	    argb = 0;
	    res = arga + argb;
	    break;
	    LABEL (O_SUBX):
	    arga += C;
	    LABEL (O_SUB):
	    LABEL (O_SUBS):
	    arga = -arga;
	    LABEL (O_ADD):
	    LABEL (O_ADDS):
	    res = arga + argb;
	    break;

	    LABEL (O_ADDX):
	    res = arga + argb + C;
	    break;

	    LABEL (O_AND):
	    LABEL (O_ANDC):
	    res = arga & argb;
	    break;
	    break;

	    LABEL (O_BCLR):
	    arga &= 0xf;
	    bit = (argb & (1 << arga));
	    res = argb & ~(1 << arga);
	    goto bitop;


	    LABEL (O_BRA):
	    LABEL (O_BT):
	    if (1)
	      goto condtrue;

	    LABEL (O_BRN):
	    LABEL (O_BF):
	    if (0)
	      goto condtrue;
	    break;

	    LABEL (O_BHI):
	    if ((C || Z) == 0)
	      goto condtrue;
	    break;

	    LABEL (O_BLS):
	    if ((C || Z))
	      goto condtrue;
	    break;

	    LABEL (O_BCS):
	    LABEL (O_BLO):
	    if ((C == 1))
	      goto condtrue;
	    break;

	    LABEL (O_BCC):
	    LABEL (O_BHS):
	    if ((C == 0))
	      goto condtrue;
	    break;

	    LABEL (O_BEQ):
	    if (Z)
	      goto condtrue;
	    break;
	    LABEL (O_BGT):
	    if (((Z || (N ^ V)) == 0))
	      goto condtrue;
	    break;


	    LABEL (O_BLE):
	    if (((Z || (N ^ V)) == 1))
	      goto condtrue;
	    break;

	    LABEL (O_BGE):
	    if ((N ^ V) == 0)
	      goto condtrue;
	    break;
	    LABEL (O_BLT):
	    if ((N ^ V))
	      goto condtrue;
	    break;
	    LABEL (O_BMI):
	    if ((N))
	      goto condtrue;
	    break;
	    LABEL (O_BNE):
	    if ((Z == 0))
	      goto condtrue;
	    break;
	    LABEL (O_BPL):
	    if (N == 0)
	      goto condtrue;
	    break;
	    break;
	    LABEL (O_BVC):
	    if ((V == 0))
	      goto condtrue;
	    break;
	    LABEL (O_BVS):
	    if ((V == 1))
	      goto condtrue;
	    break;

	    LABEL (O_BNOT):
	    bit = argb & (1<<(arga & 0xf));
	    res = argb ^ (1<<(arga & 0xf));
	    goto bitop;
	    break;

	    LABEL (O_BSET):
	    arga = 1 << (arga & 0xf);
	    bit = argb & arga;
	    res = argb | arga;
	    goto bitop;
	    break;

	    LABEL (O_PJMP):
	    pc = arga;
	    goto next;

	    LABEL (O_UNLK):
	    {
	      int t;
	      SET_NORMREG (R7, GET_NORMREG (R6));
	      POPWORD (t);
	      SET_NORMREG (R6, t);
	      pc = code->next_pc;
	      goto next;
	    }

	    LABEL (O_RTS):
	    {
	      int cp = pc & 0xff0000;
	      POPWORD (pc);
	      pc |= cp;
	      goto next;
	    }
	    break;

	    LABEL (O_PRTS):
	    {
	      int cp;
	      int off;
	      POPWORD (cp);
	      POPWORD (off);
	      cp <<= 16;
	      SET_SEGREG (R_CP, cp);
	      pc = cp + off;
	    }
	    goto next;

	    LABEL (O_PJSR):
	    PUSHWORD (argb & 0xffff);
	    PUSHWORD (argb >> 16);
	    pc = (arga & 0xffffff);
	    goto next;

	    LABEL (O_BSR):
	    LABEL (O_JSR):
	    PUSHWORD (code->next_pc);
	    pc = arga | (pc & 0xff0000);
	    goto next;

	    LABEL (O_BTST):
	    Z = (((argb >> (arga & 0xf)) & 1) == 0);
	    pc = code->next_pc;
	    goto next;

	    LABEL (O_CLR):
	    res = 0;
	    break;

	    LABEL (O_CMP):
	    arga = -arga;
	    res = arga + argb;
	    break;

	    LABEL (O_DADD):
	    res = arga + argb + C;
	    if (res > 99)
	      {
		res -= 100;
		C = 1;
	      }
	    else
	      {
		C = 0;
	      }
	    Z = Z && (res == 0);
	    break;


	    LABEL (O_DSUB):
	    res = argb - arga - C;
	    if (res < 0)
	      {
		res += 100;
		C = 1;
	      }
	    else
	      {
		C = 0;
	      }
	    Z = Z && (res == 0);
	    break;

	    LABEL (O_EXTS):
	    res = SEXTCHAR (arga);
	    break;

	    LABEL (O_EXTU):
	    res = (unsigned char) arga;
	    break;

	    LABEL (O_JMP):
	    pc = arga | (pc & 0xff0000);
	    goto next;
	    break;

	    LABEL (O_LDM):

	    for (tmp = 0; tmp < 7; tmp++)
	      {
		if (argb & (1 << tmp))
		  {
		    POPWORD (cpu.regs[tmp].s[LOW]);
		  }
	      }
	    if (argb & 0x80)
	      POPWORD (tmp);	/* dummy ready for sp */
	    goto nextpc;
	    break;

	    LABEL (O_LINK):
	    PUSHWORD (cpu.regs[R6].s[LOW]);
	    cpu.regs[R6].s[LOW] = cpu.regs[R7].s[LOW];
	    cpu.regs[R7].s[LOW] += argb;
	    goto nextpc;

	    LABEL (O_STC):
	    LABEL (O_LDC):
	    LABEL (O_MOVFPE):
	    LABEL (O_MOVTPE):
	    LABEL (O_MOV):
	    LABEL (O_TST):
	    res = arga;
	    break;

	    LABEL (O_TRAPA):
	    if (arga == 15)
	      {
		trap ();
	      }
	    else
	      {
		PUSHWORD (pc & 0xffff);
		if (cpu.maximum)
		  {
		    PUSHWORD (NORMAL_CP);
		  }
		PUSHWORD (NORMAL_SR);
		if (cpu.maximum)
		  {
		    arga = arga * 4 + 0x40;
		    SET_NORMAL_CPPC (longat (cpu.memory + arga));
		  }
		else
		  {
		    arga = arga * 2 + 0x20;
		    SET_NORMAL_CPPC (wordat (cpu.memory + arga));
		  }
	      }
	    break;

	    LABEL (O_OR):
	    LABEL (O_ORC):
	    res = arga | argb;
	    break;

	    LABEL (O_XOR):
	    LABEL (O_XORC):
	    res = arga ^ argb;
	    break;

	    LABEL (O_SCB_F):
	    {
	    scb_f:
	      res = arga - 1;
	      code->srca.reg.wptr[0] = res;
	      if (res != -1)
		{
		  pc = argb;
		  goto next;
		}
	    }
	    break;

	    LABEL (O_SCB_EQ):
	    if (Z == 1)
	      break;
	    else
	      goto scb_f;

	    LABEL (O_SCB_NE):
	    if (Z == 0)
	      break;
	    else
	      goto scb_f;

	    LABEL (O_NOP):
	    /* If only they were all as simple as this */
	    break;

	    LABEL (O_ROTL):
	    res = arga << 1;
	    C = (res >> argb) & 1;
	    res |= C;
	    break;


	    LABEL (O_ROTR):
	    C = arga & 1;
	    res = arga >> 1;
	    res |= (C << (argb - 1));
	    break;

	    LABEL (O_ROTXL):
	    res = arga << 1;
	    res |= C;
	    C = (res >> argb) & 1;
	    break;

	    LABEL (O_ROTXR):
	    res = arga >> 1;
	    res |= (C << (argb - 1));
	    C = arga & 1;
	    break;

	    LABEL (O_SHAL):
	    res = arga << 1;
	    if (argb == 16)
	      {
		C = (res >> (16)) & 1;
		Z = ((res & 0xffff) == 0);
		N = ((res & 0x8000) != 0);
	      }

	    else
	      {
		C = (res >> (8)) & 1;
		Z = ((res & 0xff) == 0);
		N = ((res & 0x80) != 0);

	      }
	    V = C ^ N;
	    goto none;

	    LABEL (O_SHAR):
	    C = arga & 1;
	    if (argb == 16)
	      {
		res = ((short) arga) >> 1;
	      }
	    else
	      {
		res = (SEXTCHAR (arga)) >> 1;
	      }
	    break;

	    LABEL (O_SHLL):
	    res = arga << 1;
	    C = (res >> argb) & 1;
	    break;

	    LABEL (O_SHLR):
	    C = arga & 1;
	    res = arga >> 1;
	    break;

	    LABEL (O_DIVXU):
	    if (arga == 0)
	      {
		N = V = C = 0;
		Z = 1;
		cpu.exception = SIGILL;
	      }
	    else
	      {
		int d = argb / arga;
		int m = argb % arga;
		if (code->dst.type == eas.s.ea_reg.s.dstlong)
		  {
		    res = (m << 16) | (d & 0xffff);
		  }
		else
		  {
		    res = (m << 8) | (d & 0xff);
		  }

	      }
	    break;

	    LABEL (O_MULXU):
	    res = arga * argb;
	    break;

	    LABEL (O_NOT):
	    res = ~arga;
	    break;

	    LABEL (O_SWAP):
	    res = ((arga >> 8) & 0xff) | ((arga << 8) & 0xff00);
	    break;


	    LABEL (O_STM):
	    for (tmp = 7; tmp >= 0; tmp--)
	      {
		if (arga & (1 << tmp))
		  {
		    PUSHWORD (cpu.regs[tmp].s[LOW]);
		  }
	      }
	    goto nextpc;

	    LABEL (O_TAS):
	    C = 0;
	    V = 0;
	    Z = arga == 0;
	    N = arga < 0;
	    res = arga | 0x80;
	    goto none;

	    LABEL (O_PRTD):
	    LABEL (O_XCH):
	    LABEL (O_RTD):
	    cpu.exception = SIGILL;
	    goto next;

	    LABEL (O_TRAP_VS):
	    LABEL (O_SLEEP):
	    LABEL (O_BPT):
	    cpu.exception = SIGTRAP;
	    goto next;
	    break;
	  }

	ENDDISPATCH;

	DISPATCH (code->flags)
	  {
	  bitop:
	    Z = (res & bit) == 0;
	    pc = code->next_pc;
	    break;
	    LABEL (FLAG_multword):
	    Z = (res & 0xffff) == 0;
	    N = (res & 0x8000) != 0;
	    V = 0;
	    C = 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_multbyte):
	    /* 8*8 -> 16 */
	    Z = (res & 0xff) == 0;
	    N = (res & 0x80) != 0;
	    V = 0;
	    C = 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_shiftword):
	    N = (res & 0x8000) != 0;
	    Z = (res & 0xffff) == 0;
	    V = 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_shiftbyte):
	    N = (res & 0x80) != 0;
	    Z = (res & 0xff) == 0;
	    V = 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_special):
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_m):
	    /* Move byte flags */
	    /* after a logical instruction */
	    N = (res & 0x80) != 0;
	    Z = (res & 0xff) == 0;
	    V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x80) != 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_M):
	    /* Move word flags */
	    /* after a logical instruction */
	    N = (res & 0x8000) != 0;
	    Z = (res & 0xffff) == 0;
	    V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x8000) != 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_a):
	    /* after byte sized arith */
	    C = (res & 0x100) != 0;
	    N = (res & 0x80) != 0;
	    Z = (res & 0xff) == 0;
	    V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x80) != 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_A):
	    /* after word sized arith */
	    C = (res & 0x10000) != 0;
	    N = (res & 0x8000) != 0;
	    Z = (res & 0xffff) == 0;
	    V = (((~arga & ~argb & res) | (arga & argb & ~res)) & 0x8000) != 0;
	    pc = code->next_pc;
	    break;

	    LABEL (FLAG_NONE):
	  none:;
	    /* no flags but store */
	    pc = code->next_pc;
	    break;
	    LABEL (FLAG_NOSTORE):
	    /* no flags and no store */
	    pc = code->next_pc;
	    break;
	    LABEL (FLAG_CLEAR):
	    /* clear flags */
	    N = 0;
	    Z = 1;
	    V = 0;
	    C = 0;
	    pc = code->next_pc;
	    break;
	  condtrue:
	    pc = arga;
	    goto next;
	  }
	ENDDISPATCH;

	DISPATCH (code->dst.type)
	  {
	    unsigned char *lval;

	    LABEL (STORE_CRB):
	    (*(code->dst.reg.segptr)) = cpu.memory + (res << 16);
	    break;

	    LABEL (STORE_NOP):
	    break;

	    LABEL (STORE_REG_B):
	    (*(code->dst.reg.bptr)) = res;
	    break;

	    LABEL (STORE_REG_W):
	    (*(code->dst.reg.wptr)) = res;
	    break;

	    LABEL (STORE_REG_L):
	    {
	      int l, r;

	      r = (union rtype *) (code->dst.reg.wptr) - &cpu.regs[0];
	      r++;
	      *(code->dst.reg.wptr) = res >> 16;
	      cpu.regs[r].s[LOW] = res & 0xffff;

	    }

	    break;

	    LABEL (STORE_DISP_W):
	    lval = displval (code->dst);
	    setwordat (lval, res);
	    break;

	    LABEL (STORE_DISP_B):
	    lval = displval (code->dst);
	    setbyteat (lval, res);
	    break;

	    LABEL (STORE_INC_B):
	    lval = elval (code->dst, 0);
	    setbyteat (lval, res);
	    (*(code->dst.reg.wptr))++;
	    break;

	    LABEL (STORE_INC_W):
	    lval = elval (code->dst, 0);
	    setwordat (lval, res);
	    (*(code->dst.reg.wptr)) += 2;
	    break;

	    LABEL (STORE_DEC_B):
	    (*(code->dst.reg.wptr))--;
	    lval = elval (code->dst, 0);
	    setbyteat (lval, res);
	    break;

	    LABEL (STORE_CRW):
	    /* Make an up to date sr from the flag state */
	    cpu.regs[R_SR].s[LOW] = res;
	    GETSR ();
	    break;

	    LABEL (STORE_DEC_W):
	    (*(code->dst.reg.wptr)) -= 2;
	    lval = elval (code->dst, 0);
	    setwordat (lval, res);

	    break;

	  nextpc:
	    pc = code->next_pc;

	  }
	ENDDISPATCH;
      next:;
      }
    while (!cpu.exception);
  }

  cpu.ticks += get_now () - tick_start;
  cpu.cycles += cycles;
  cpu.insts += insts;
  cpu.regs[R_PC].s[LOW] = pc;
  BUILDSR ();

  signal (SIGINT, prev);
  signal (SIGSEGV, prev_seg);
}




int
sim_write (sd, addr, buffer, size)
     SIM_DESC sd;
     SIM_ADDR addr;
     unsigned char *buffer;
     int size;
{
  int i;

  init_pointers ();
  if (addr < 0 || addr + size > H8500_MSIZE)
    return 0;
  for (i = 0; i < size; i++)
    {
      cpu.memory[addr + i] = buffer[i];
      cpu.cache_idx[addr + i] = 0;
    }
  return size;
}

int
sim_read (sd, addr, buffer, size)
     SIM_DESC sd;
     SIM_ADDR addr;
     unsigned char *buffer;
     int size;
{
  init_pointers ();
  if (addr < 0 || addr + size > H8500_MSIZE)
    return 0;
  memcpy (buffer, cpu.memory + addr, size);
  return size;
}

/* Ripped off from tm-h8500.h */

#define R0_REGNUM	0
#define R1_REGNUM	1
#define R2_REGNUM	2
#define R3_REGNUM	3
#define R4_REGNUM	4
#define R5_REGNUM	5
#define R6_REGNUM	6
#define R7_REGNUM	7

/* As above, but with correct seg register glued on */
#define PR0_REGNUM	8
#define PR1_REGNUM	9
#define PR2_REGNUM	10
#define PR3_REGNUM	11
#define PR4_REGNUM	12
#define PR5_REGNUM	13
#define PR6_REGNUM	14
#define PR7_REGNUM	15

#define SP_REGNUM       PR7_REGNUM	/* Contains address of top of stack */
#define FP_REGNUM       PR6_REGNUM	/* Contains address of executing stack frame */


#define SEG_C_REGNUM	16	/* Segment registers */
#define SEG_D_REGNUM	17
#define SEG_E_REGNUM	18
#define SEG_T_REGNUM	19

#define CCR_REGNUM      20	/* Contains processor status */
#define PC_REGNUM       21	/* Contains program counter */

#define CYCLE_REGNUM    22
#define INST_REGNUM     23
#define TICK_REGNUM     24

int
sim_store_register (sd, rn, value, length)
     SIM_DESC sd;
     int rn;
     unsigned char *value;
     int length;
{
  int seg = 0;
  int reg = -1;

  init_pointers ();
  switch (rn)
    {
    case PC_REGNUM:
      SET_SEGREG (R_CP, (value[1]<<16));
      cpu.regs[R_PC].s[LOW] = (value[2] << 8) | value[3];
      break;
    case SEG_C_REGNUM:
    case SEG_D_REGNUM:
    case SEG_E_REGNUM:
    case SEG_T_REGNUM:
      seg = rn - SEG_C_REGNUM + R_CP;
      reg = -1;
      break;
    default:
      abort ();
    case R0_REGNUM:
    case R1_REGNUM:
    case R2_REGNUM:
    case R3_REGNUM:
    case R4_REGNUM:
    case R5_REGNUM:
    case R6_REGNUM:
    case R7_REGNUM:
      seg = 0;
      reg = rn - R0_REGNUM;
      break;
    case CCR_REGNUM:
      seg = 0;
      reg = R_SR;
      break;
    case CYCLE_REGNUM:
      cpu.cycles = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
      return;
    case INST_REGNUM:
      cpu.insts = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
      return;
    case TICK_REGNUM:
      cpu.ticks = (value[0] << 24) | (value[1] << 16) | (value[2] << 8) | value[3];
      return;
    case PR0_REGNUM:
    case PR1_REGNUM:
    case PR2_REGNUM:
    case PR3_REGNUM:
    case PR4_REGNUM:
    case PR5_REGNUM:
    case PR6_REGNUM:
    case PR7_REGNUM:
      SET_SEGREG (segforreg[rn], value[1]);
      reg = rn - PR0_REGNUM;      
      cpu.regs[reg].s[LOW] = (value[2] << 8) | value[3];
      return;
    }

  if (seg)
    SET_SEGREG (seg, value[0] << 16);

  if (reg > 0)
    {
      cpu.regs[reg].s[LOW] = (value[0] << 8) | value[1];
    }
  return -1;
}

int
sim_fetch_register (sd, rn, buf, length)
     SIM_DESC sd;
     int rn;
     unsigned char *buf;
     int length;
{
  init_pointers ();

  switch (rn)
    {
    default:
      abort ();
    case SEG_C_REGNUM:
    case SEG_D_REGNUM:
    case SEG_E_REGNUM:
    case SEG_T_REGNUM:
      buf[0] = GET_SEGREG(rn - SEG_C_REGNUM + R_CP);
      break;
    case CCR_REGNUM:
      buf[0] = cpu.regs[R_SR].s[HIGH];
      buf[1] = cpu.regs[R_SR].s[LOW];
      break;
    case PC_REGNUM:
      buf[0] = 0;
      buf[1] = GET_SEGREG(R_CP);
      buf[2] = HIGH_BYTE (cpu.regs[R_PC].s[LOW]);
      buf[3] = LOW_BYTE (cpu.regs[R_PC].s[LOW]);
      break;

    case PR0_REGNUM:
    case PR1_REGNUM:
    case PR2_REGNUM:
    case PR3_REGNUM:
    case PR4_REGNUM:
    case PR5_REGNUM:
    case PR6_REGNUM:
    case PR7_REGNUM:
      rn -= PR0_REGNUM;
      buf[0] = 0;
      buf[1] = GET_SEGREG(segforreg[rn]);
      buf[2] = HIGH_BYTE (cpu.regs[rn].s[LOW]);
      buf[3] = LOW_BYTE (cpu.regs[rn].s[LOW]);
      break;
    case R0_REGNUM:
    case R1_REGNUM:
    case R2_REGNUM:
    case R3_REGNUM:
    case R4_REGNUM:
    case R5_REGNUM:
    case R6_REGNUM:
    case R7_REGNUM:
      buf[0] = HIGH_BYTE (cpu.regs[rn].s[LOW]);
      buf[1] = LOW_BYTE (cpu.regs[rn].s[LOW]);
      break;
    case CYCLE_REGNUM:
      buf[0] = cpu.cycles >> 24;
      buf[1] = cpu.cycles >> 16;
      buf[2] = cpu.cycles >> 8;
      buf[3] = cpu.cycles >> 0;
      break;

    case TICK_REGNUM:
      buf[0] = cpu.ticks >> 24;
      buf[1] = cpu.ticks >> 16;
      buf[2] = cpu.ticks >> 8;
      buf[3] = cpu.ticks >> 0;
      break;

    case INST_REGNUM:
      buf[0] = cpu.insts >> 24;
      buf[1] = cpu.insts >> 16;
      buf[2] = cpu.insts >> 8;
      buf[3] = cpu.insts >> 0;
      break;
    }
  return -1;
}

int
sim_trace (sd)
     SIM_DESC sd;
{

  int i;

  for (i = 0; i < 12; i += 2)
    {
      unsigned char *p = cpu.regs[R_TP].c + ((cpu.regs[R6].s[LOW] + i) & 0xffff);
      unsigned short *j = (unsigned short *) p;

      printf ("%04x ", *j);
    }
  printf ("\n");
  printf ("%02x %02x %02x %02x:%04x %04x %04x %04x %04x %04x %04x %04x %04x\n",
	  NORMAL_DP,
	  NORMAL_EP,
	  NORMAL_TP,
	  NORMAL_CP,
	  cpu.regs[R_PC].s[LOW],
	  cpu.regs[0].s[LOW],
	  cpu.regs[1].s[LOW],
	  cpu.regs[2].s[LOW],
	  cpu.regs[3].s[LOW],
	  cpu.regs[4].s[LOW],
	  cpu.regs[5].s[LOW],
	  cpu.regs[6].s[LOW],
	  cpu.regs[7].s[LOW]);
  sim_resume (sd, 1, 0);
  return 0;
}

void
sim_stop_reason (sd, reason, sigrc)
     SIM_DESC sd;
     enum sim_stop *reason;
     int *sigrc;
{
  *reason = sim_stopped;
  *sigrc = cpu.exception;
}

void
sim_set_simcache_size (n)
{
  if (cpu.cache)
    free (cpu.cache);
  if (n < 2)
    n = 2;
  cpu.cache = (decoded_inst *) malloc (sizeof (decoded_inst) * n);
  cpu.csize = n;
}

void
sim_size (n)
     int n;
{
  /* Fixed size.  */
}

void
sim_info (sd, verbose)
     SIM_DESC sd;
     int verbose;
{
  double timetaken = (double) cpu.ticks / (double) now_persec ();
  double virttime = cpu.cycles / 10.0e6;

  (*sim_callback->printf_filtered) (sim_callback,
				    "\n\ninstructions executed  %10d\n",
				    cpu.insts);
  (*sim_callback->printf_filtered) (sim_callback,
				    "cycles (v approximate) %10d\n",
				    cpu.cycles);
  (*sim_callback->printf_filtered) (sim_callback,
				    "real time taken        %10.4f\n",
				    timetaken);
  (*sim_callback->printf_filtered) (sim_callback,
				    "virtual time taked     %10.4f\n",
				    virttime);
  if (timetaken) 
    {
      (*sim_callback->printf_filtered) (sim_callback,
					"simulation ratio       %10.4f\n",
					virttime / timetaken);
    }
  
  (*sim_callback->printf_filtered) (sim_callback,
				    "compiles               %10d\n",
				    cpu.compiles);
  (*sim_callback->printf_filtered) (sim_callback,
				    "cache size             %10d\n",
				    cpu.csize);
}

SIM_DESC
sim_open (kind, cb, abfd, argv)
     SIM_OPEN_KIND kind;
     host_callback *cb;
     struct bfd *abfd;
     char **argv;
{
  sim_kind = kind;
  myname = argv[0];
  sim_callback = cb;
  /* fudge our descriptor */
  return (SIM_DESC) 1;
}

void
sim_close (sd, quitting)
     SIM_DESC sd;
     int quitting;
{
  /* nothing to do */
}

SIM_RC
sim_load (sd, prog, abfd, from_tty)
     SIM_DESC sd;
     char *prog;
     bfd *abfd;
     int from_tty;
{
  extern bfd *sim_load_file (); /* ??? Don't know where this should live.  */
  bfd *prog_bfd;

  prog_bfd = sim_load_file (sd, myname, sim_callback, prog, abfd,
			    sim_kind == SIM_OPEN_DEBUG,
			    0, sim_write);
  if (prog_bfd == NULL)
    return SIM_RC_FAIL;
  if (abfd == NULL)
    bfd_close (prog_bfd);
  return SIM_RC_OK;
}

SIM_RC
sim_create_inferior (sd, abfd, argv, env)
     SIM_DESC sd;
     struct bfd *abfd;
     char **argv;
     char **env;
{
  int pc;
  bfd_vma start_address;
  if (abfd != NULL)
    start_address = bfd_get_start_address (abfd);
  else
    start_address = 0;

  /* ??? We assume this is a 4 byte quantity.  */
  pc = start_address;

  sim_store_register (sd, PC_REGNUM, (unsigned char *) &pc, 4);
  return SIM_RC_OK;
}

void
sim_do_command (sd, cmd)
     SIM_DESC sd;
     char *cmd;
{
  (*sim_callback->printf_filtered) (sim_callback,
				    "This simulator does not accept any commands.\n");
}

void
sim_set_callbacks (ptr)
     struct host_callback_struct *ptr;
{
  sim_callback = ptr;
}
