aboutsummaryrefslogtreecommitdiff
path: root/sim/v850
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>1996-08-29 01:06:42 +0000
committerJeff Law <law@redhat.com>1996-08-29 01:06:42 +0000
commit22c1c7ddea0f359fe2c58e7593b51b9395572ade (patch)
tree0f233af0cdb27dd7bdfd4c4788ba2fd880503ae9 /sim/v850
parent085114ca36c21cde27a0780be9d2d6e25d7dbeac (diff)
downloadgdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.zip
gdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.tar.gz
gdb-22c1c7ddea0f359fe2c58e7593b51b9395572ade.tar.bz2
* ChangeLog, Makefile.in, configure, configure.in, v850_sim.h,
gencode.c, interp.c, simops.c: Created. So we've got something to hack on.
Diffstat (limited to 'sim/v850')
-rw-r--r--sim/v850/.Sanitize39
-rw-r--r--sim/v850/ChangeLog5
-rw-r--r--sim/v850/Makefile.in149
-rw-r--r--sim/v850/configure.in29
-rw-r--r--sim/v850/gencode.c144
-rw-r--r--sim/v850/interp.c423
-rw-r--r--sim/v850/simops.c374
-rw-r--r--sim/v850/v850_sim.h111
8 files changed, 1274 insertions, 0 deletions
diff --git a/sim/v850/.Sanitize b/sim/v850/.Sanitize
new file mode 100644
index 0000000..5ae07e7
--- /dev/null
+++ b/sim/v850/.Sanitize
@@ -0,0 +1,39 @@
+# .Sanitize for devo/sim/v850.
+
+# Each directory to survive its way into a release will need a file
+# like this one called "./.Sanitize". All keyword lines must exist,
+# and must exist in the order specified by this file. Each directory
+# in the tree will be processed, top down, in the following order.
+
+# Hash started lines like this one are comments and will be deleted
+# before anything else is done. Blank lines will also be squashed
+# out.
+
+# The lines between the "Do-first:" line and the "Things-to-keep:"
+# line are executed as a /bin/sh shell script before anything else is
+# done in this directory.
+
+Do-first:
+
+# All files listed between the "Things-to-keep:" line and the
+# "Files-to-sed:" line will be kept. All other files will be removed.
+# Directories listed in this section will have their own Sanitize
+# called. Directories not listed will be removed in their entirety
+# with rm -rf.
+
+Things-to-keep:
+
+ChangeLog
+Makefile.in
+configure
+configure.in
+v850_sim.h
+gencode.c
+interp.c
+simops.c
+
+Things-to-lose:
+
+Do-last:
+
+# End of file.
diff --git a/sim/v850/ChangeLog b/sim/v850/ChangeLog
new file mode 100644
index 0000000..2265550
--- /dev/null
+++ b/sim/v850/ChangeLog
@@ -0,0 +1,5 @@
+Wed Aug 28 13:53:22 1996 Jeffrey A Law (law@cygnus.com)
+
+ * ChangeLog, Makefile.in, configure, configure.in, v850_sim.h,
+ gencode.c, interp.c, simops.c: Created.
+
diff --git a/sim/v850/Makefile.in b/sim/v850/Makefile.in
new file mode 100644
index 0000000..0e50939
--- /dev/null
+++ b/sim/v850/Makefile.in
@@ -0,0 +1,149 @@
+# Makefile template for Configure for the V850 sim library.
+# Copyright (C) 1990, 1991, 1992, 1995 Free Software Foundation, Inc.
+# Written by Cygnus Support.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+VPATH = @srcdir@:@srcdir@/../common:@srcdir@/../../gdb/
+srcdir = @srcdir@
+srcroot = $(srcdir)/../..
+
+prefix = @prefix@
+exec_prefix = @exec_prefix@
+
+host_alias = @host_alias@
+target_alias = @target_alias@
+program_transform_name = @program_transform_name@
+bindir = @bindir@
+
+libdir = @libdir@
+tooldir = $(libdir)/$(target_alias)
+
+datadir = @datadir@
+mandir = @mandir@
+man1dir = $(mandir)/man1
+man2dir = $(mandir)/man2
+man3dir = $(mandir)/man3
+man4dir = $(mandir)/man4
+man5dir = $(mandir)/man5
+man6dir = $(mandir)/man6
+man7dir = $(mandir)/man7
+man8dir = $(mandir)/man8
+man9dir = $(mandir)/man9
+infodir = @infodir@
+includedir = @includedir@
+
+SHELL = /bin/sh
+
+INSTALL = $(srcroot)/install.sh -c
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_XFORM = $(INSTALL) -t='$(program_transform_name)'
+INSTALL_XFORM1= $(INSTALL_XFORM) -b=.1
+
+AR = @AR@
+AR_FLAGS = rc
+CC = @CC@
+CFLAGS = @CFLAGS@
+MAKEINFO = makeinfo
+RANLIB = @RANLIB@
+CC_FOR_BUILD = @CC_FOR_BUILD@
+
+HDEFINES = @HDEFINES@
+TDEFINES =
+
+.NOEXPORT:
+MAKEOVERRIDES=
+
+X=xstuff.o
+XL=-lX11
+X=
+XL=
+
+INCDIR = $(srcdir)/../../include
+CSEARCH = -I. -I$(srcdir) -I../../include \
+ -I../../bfd -I$(INCDIR) -I$(srcdir)/../../bfd -I$(srcdir)/../../gdb -I$(srcdir)/../../newlib/libc/sys/sh
+DEP = mkdep
+
+all: run libsim.a
+
+run: interp.o $(X) run.o table.o callback.o simops.o
+ $(CC) $(CFLAGS) -o run $(X) interp.o table.o callback.o simops.o run.o ../../bfd/libbfd.a ../../libiberty/libiberty.a $(XL) -lm
+
+interp.o:interp.c table.c
+run.o:run.c
+
+libsim.a:interp.o table.o simops.o
+ $(AR) $(ARFLAGS) libsim.a interp.o table.o simops.o
+ $(RANLIB) libsim.a
+
+simops.h: gencode
+ ./gencode -h >$@
+
+table.c: gencode simops.h
+ ./gencode >$@
+
+gencode: gencode.c ../../opcodes/libopcodes.a
+ $(CC) $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHE) -o gencode $(srcdir)/gencode.c ../../opcodes/libopcodes.a -lc
+
+.c.o:
+ $(CC) -c -DINSIDE_SIMULATOR $(CFLAGS) $(HDEFINES) $(TDEFINES) $(CSEARCH) $(CSWITCHES) $<
+
+check:
+
+info:
+clean-info:
+install-info:
+
+tags etags: TAGS
+
+TAGS: force
+ etags $(INCDIR)/*.h $(srcdir)/*.h $(srcdir)/*.c
+
+clean:
+ rm -f *.[oa] *~ core *.E *.p *.ip aout-params.h gen-aout
+ rm -f run table.c simops.h gencode libsim.a
+
+distclean mostlyclean maintainer-clean realclean: clean
+ rm -f TAGS
+ rm -f Makefile config.cache config.log config.status
+
+# Dummy target to force execution of dependent targets.
+#
+force:
+
+# Copy the files into directories where they will be run.
+install:
+ $(INSTALL_XFORM) run $(bindir)/run
+
+install-man: run.1
+ $(INSTALL_XFORM1) $(srcdir)/run.1 $(man1dir)/run.1
+
+Makefile: Makefile.in config.status
+ $(SHELL) ./config.status
+
+config.status: configure
+ $(SHELL) ./config.status --recheck
+
+dep: $(CFILES)
+ mkdep $(CFLAGS) $?
+
+# What appears below is generated by a hacked mkdep using gcc -MM.
+
+# DO NOT DELETE THIS LINE -- mkdep uses it.
+# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
+
+
+# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
diff --git a/sim/v850/configure.in b/sim/v850/configure.in
new file mode 100644
index 0000000..6bc9b3c
--- /dev/null
+++ b/sim/v850/configure.in
@@ -0,0 +1,29 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_PREREQ(2.5)dnl
+AC_INIT(Makefile.in)
+
+AC_CONFIG_AUX_DIR(`cd $srcdir;pwd`/../..)
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+AC_PROG_CC
+AC_PROG_INSTALL
+AC_C_BIGENDIAN
+
+. ${srcdir}/../../bfd/configure.host
+
+AC_SUBST(CFLAGS)
+AC_SUBST(HDEFINES)
+AR=${AR-ar}
+AC_SUBST(AR)
+AC_PROG_RANLIB
+
+# Put a plausible default for CC_FOR_BUILD in Makefile.
+AC_C_CROSS
+if test "x$cross_compiling" = "xno"; then
+ CC_FOR_BUILD='$(CC)'
+else
+ CC_FOR_BUILD=gcc
+fi
+AC_SUBST(CC_FOR_BUILD)
+
+AC_OUTPUT(Makefile)
diff --git a/sim/v850/gencode.c b/sim/v850/gencode.c
new file mode 100644
index 0000000..37f41b8
--- /dev/null
+++ b/sim/v850/gencode.c
@@ -0,0 +1,144 @@
+#include "v850_sim.h"
+
+static void write_header PARAMS ((void));
+static void write_opcodes PARAMS ((void));
+static void write_template PARAMS ((void));
+
+int
+main (argc, argv)
+ int argc;
+ char *argv[];
+{
+ if ((argc > 1) && (strcmp (argv[1],"-h") == 0))
+ write_header();
+ else if ((argc > 1) && (strcmp (argv[1],"-t") == 0))
+ write_template ();
+ else
+ write_opcodes();
+ return 0;
+}
+
+
+static void
+write_header ()
+{
+ struct v850_opcode *opcode;
+
+ for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++)
+ printf("void OP_%X PARAMS ((void));\t\t/* %s */\n",opcode->opcode, opcode->name);
+}
+
+
+/* write_template creates a file all required functions, ready */
+/* to be filled out */
+
+static void
+write_template ()
+{
+ struct v850_opcode *opcode;
+ int i,j;
+
+ printf ("#include \"v850_sim.h\"\n");
+ printf ("#include \"simops.h\"\n");
+
+ for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++)
+ {
+ printf("/* %s */\nvoid\nOP_%X ()\n{\n",opcode->name,opcode->opcode);
+
+ /* count operands */
+ j = 0;
+ for (i = 0; i < 6; i++)
+ {
+ int flags = v850_operands[opcode->operands[i]].flags;
+
+ if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC))
+ j++;
+ }
+ switch (j)
+ {
+ case 0:
+ printf ("printf(\" %s\\n\");\n",opcode->name);
+ break;
+ case 1:
+ printf ("printf(\" %s\\t%%x\\n\",OP[0]);\n",opcode->name);
+ break;
+ case 2:
+ printf ("printf(\" %s\\t%%x,%%x\\n\",OP[0],OP[1]);\n",opcode->name);
+ break;
+ case 3:
+ printf ("printf(\" %s\\t%%x,%%x,%%x\\n\",OP[0],OP[1],OP[2]);\n",opcode->name);
+ break;
+ default:
+ fprintf (stderr,"Too many operands: %d\n",j);
+ }
+ printf ("}\n\n");
+ }
+}
+
+
+long Opcodes[512];
+static int curop=0;
+
+check_opcodes( long op)
+{
+ int i;
+
+ for (i=0;i<curop;i++)
+ if (Opcodes[i] == op)
+ fprintf(stderr,"DUPLICATE OPCODES: %x\n",op);
+}
+
+
+static void
+write_opcodes ()
+{
+ struct v850_opcode *opcode;
+ int i, j;
+
+ /* write out opcode table */
+ printf ("#include \"v850_sim.h\"\n");
+ printf ("#include \"simops.h\"\n\n");
+ printf ("struct simops Simops[] = {\n");
+
+ for (opcode = (struct v850_opcode *)v850_opcodes; opcode->name; opcode++)
+ {
+ printf (" { %ld,%ld,OP_%X,",
+ opcode->opcode, opcode->mask, opcode->opcode);
+
+ /* REMOVE ME */
+ check_opcodes (opcode->opcode);
+ Opcodes[curop++] = opcode->opcode;
+
+ /* count operands */
+ j = 0;
+ for (i = 0; i < 6; i++)
+ {
+ int flags = v850_operands[opcode->operands[i]].flags;
+
+ if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC))
+ j++;
+ }
+ printf ("%d,{",j);
+
+ j = 0;
+ for (i = 0; i < 6; i++)
+ {
+ int flags = v850_operands[opcode->operands[i]].flags;
+ int shift = v850_operands[opcode->operands[i]].shift;
+
+ if (flags & (V850_OPERAND_REG | V850_OPERAND_SRG | V850_OPERAND_CC))
+ {
+ if (j)
+ printf (", ");
+#if 0
+ if ((flags & OPERAND_REG) && (opcode->format == LONG_L))
+ shift += 15;
+#endif
+ printf ("%d,%d,%d",shift,v850_operands[opcode->operands[i]].bits,flags);
+ j = 1;
+ }
+ }
+ printf ("}},\n");
+ }
+ printf ("{ 0,0,NULL,0,{ }},\n};\n");
+}
diff --git a/sim/v850/interp.c b/sim/v850/interp.c
new file mode 100644
index 0000000..0e9d102
--- /dev/null
+++ b/sim/v850/interp.c
@@ -0,0 +1,423 @@
+#include <signal.h>
+#include "sysdep.h"
+#include "bfd.h"
+#include "remote-sim.h"
+#include "callback.h"
+
+#include "v850_sim.h"
+
+#define IMEM_SIZE 18 /* V850 instruction memory size is 18 bits */
+#define DMEM_SIZE 16 /* Data memory */
+
+uint16 OP[4];
+
+static struct hash_entry *lookup_hash PARAMS ((uint32 ins));
+
+#define MAX_HASH 63
+struct hash_entry
+{
+ struct hash_entry *next;
+ long opcode;
+ long mask;
+ struct simops *ops;
+};
+
+struct hash_entry hash_table[MAX_HASH+1];
+
+static long
+hash(insn)
+ long insn;
+{
+ /* XXX This isn't right for 32bit opcodes, hell it isn't even
+ right for 16bit opcodes! */
+ if (insn & 0x0600)
+ return ((insn & 0x3F000000) >> 24);
+ else
+ return((insn & 0x07E0) >> 5);
+}
+
+static struct hash_entry *
+lookup_hash (ins)
+ uint32 ins;
+{
+ struct hash_entry *h;
+
+ if (ins & 0x0f00)
+ h = &hash_table[(ins & 0x3F000000) >> 24];
+ else
+ h = &hash_table[(ins & 0x07E0) >> 5];
+
+ while ( (ins & h->mask) != h->opcode)
+ {
+ if (h->next == NULL)
+ {
+ printf ("ERROR looking up hash for %x\n",ins);
+ exit(1);
+ }
+ h = h->next;
+ }
+ return (h);
+}
+
+uint32
+get_longword_swap (x)
+ uint16 x;
+{
+ uint8 *a = (uint8 *)(x + State.imem);
+ return (a[0]<<24) + (a[1]<<16) + (a[2]<<8) + (a[3]);
+}
+
+uint16
+get_word_swap (x)
+ uint16 x;
+{
+ uint8 *a = (uint8 *)(x + State.imem);
+ return (a[0]<<8) + a[1];
+}
+
+void
+write_word_swap (addr, data)
+ uint16 addr, data;
+{
+ uint8 *a = (uint8 *)(addr + State.imem);
+ a[0] = data >> 8;
+ a[1] = data & 0xff;
+}
+
+static void
+do_format_1 (insn)
+ uint32 insn;
+{
+ printf("format 1 0x%x\n", insn >> 16);
+}
+
+static void
+do_format_2 (insn)
+ uint32 insn;
+{
+ printf("format 2 0x%x\n", insn >> 16);
+}
+
+static void
+do_format_3 (insn)
+ uint32 insn;
+{
+ printf("format 3 0x%x\n", insn >> 16);
+}
+
+static void
+do_format_4 (insn)
+ uint32 insn;
+{
+ printf("format 4 0x%x\n", insn >> 16);
+}
+
+static void
+do_format_5 (insn)
+ uint32 insn;
+{
+ printf("format 5 0x%x\n", insn);
+}
+
+static void
+do_format_6 (insn)
+ uint32 insn;
+{
+ printf("format 6 0x%x\n", insn);
+}
+
+static void
+do_format_7 (insn)
+ uint32 insn;
+{
+ printf("format 7 0x%x\n", insn);
+}
+
+static void
+do_format_8 (insn)
+ uint32 insn;
+{
+ printf("format 8 0x%x\n", insn);
+}
+
+static void
+do_formats_9_10 (insn)
+ uint32 insn;
+{
+ printf("formats 9 and 10 0x%x\n", insn);
+}
+
+void
+sim_size (power)
+ int power;
+
+{
+ if (State.imem)
+ {
+ free (State.imem);
+ free (State.dmem);
+ }
+
+ State.imem = (uint8 *)calloc(1,1<<IMEM_SIZE);
+ State.dmem = (uint8 *)calloc(1,1<<DMEM_SIZE);
+ if (!State.imem || !State.dmem )
+ {
+ fprintf (stderr,"Memory allocation failed.\n");
+ exit(1);
+ }
+ printf ("Allocated %d bytes instruction memory and\n",1<<IMEM_SIZE);
+ printf (" %d bytes data memory.\n",1<<DMEM_SIZE);
+}
+
+static void
+init_system ()
+{
+ if (!State.imem)
+ sim_size(1);
+}
+
+int
+sim_write (addr, buffer, size)
+ SIM_ADDR addr;
+ unsigned char *buffer;
+ int size;
+{
+ int i;
+ init_system ();
+
+ /* printf ("sim_write %d bytes to 0x%x\n",size,addr); */
+ for (i = 0; i < size; i++)
+ {
+ State.imem[i+addr] = buffer[i];
+ }
+ return size;
+}
+
+void
+sim_open (args)
+ char *args;
+{
+ struct simops *s;
+ struct hash_entry *h, *prev;
+ if (args != NULL)
+ printf ("sim_open %s\n",args);
+
+ /* put all the opcodes in the hash table */
+ for (s = Simops; s->func; s++)
+ {
+ h = &hash_table[hash(s->opcode)];
+
+ /* go to the last entry in the chain */
+ while (h->next)
+ h = h->next;
+
+ if (h->ops)
+ {
+ h->next = calloc(1,sizeof(struct hash_entry));
+ h = h->next;
+ }
+ h->ops = s;
+ h->mask = s->mask;
+ h->opcode = s->opcode;
+ }
+}
+
+
+void
+sim_close (quitting)
+ int quitting;
+{
+ /* nothing to do */
+}
+
+void
+sim_set_profile (n)
+ int n;
+{
+ printf ("sim_set_profile %d\n",n);
+}
+
+void
+sim_set_profile_size (n)
+ int n;
+{
+ printf ("sim_set_profile_size %d\n",n);
+}
+
+void
+sim_resume (step, siggnal)
+ int step, siggnal;
+{
+ uint32 inst, opcode;
+ int i;
+ reg_t oldpc;
+
+/* printf ("sim_resume (%d,%d) PC=0x%x\n",step,siggnal,PC); */
+
+ if (step)
+ State.exception = SIGTRAP;
+ else
+ State.exception = 0;
+
+ do
+ {
+ inst = RLW (PC);
+ oldpc = PC;
+ opcode = (inst & 0x07e00000) >> 21;
+ if ((opcode & 0x30) == 0)
+ {
+ do_format_1 (inst >> 16);
+ PC += 2;
+ }
+ else if ((opcode & 0x38) == 0x10)
+ {
+ do_format_2 (inst >> 16);
+ PC += 2;
+ }
+ else if ((opcode & 0x3C) == 0x18
+ || (opcode & 0x3C) == 0x1C
+ || (opcode & 0x3C) == 0x20
+ || (opcode & 0x3C) == 0x24
+ || (opcode & 0x3C) == 0x28)
+ {
+ do_format_4 (inst >> 16);
+ PC += 2;
+ }
+ else if ((opcode& 0x3C) == 0x23)
+ {
+ do_format_3 (inst >> 16);
+ PC += 2;
+ }
+ else if ((opcode & 0x38) == 0x30)
+ {
+ do_format_6 (inst);
+ PC += 4;
+ }
+ else if ((opcode & 0x3C) == 0x38)
+ {
+ do_format_7 (inst);
+ PC += 4;
+ }
+ else if ((opcode & 0x3E) == 0x3C)
+ {
+ do_format_5 (inst);
+ PC += 4;
+ }
+ else if ((opcode & 0x3E) == 0x3C)
+ {
+ do_format_8 (inst);
+ PC += 4;
+ }
+ else
+ {
+ do_formats_9_10 (inst);
+ PC += 4;
+ }
+ }
+ while (!State.exception);
+}
+
+int
+sim_trace ()
+{
+ printf ("sim_trace\n");
+ return 0;
+}
+
+void
+sim_info (verbose)
+ int verbose;
+{
+ printf ("sim_info\n");
+}
+
+void
+sim_create_inferior (start_address, argv, env)
+ SIM_ADDR start_address;
+ char **argv;
+ char **env;
+{
+ printf ("sim_create_inferior: PC=0x%x\n",start_address);
+ PC = start_address;
+}
+
+
+void
+sim_kill ()
+{
+ /* nothing to do */
+}
+
+void
+sim_set_callbacks(p)
+ host_callback *p;
+{
+ printf ("sim_set_callbacks\n");
+ /* callback = p; */
+}
+
+void
+sim_stop_reason (reason, sigrc)
+ enum sim_stop *reason;
+ int *sigrc;
+{
+/* printf ("sim_stop_reason: PC=0x%x\n",PC); */
+
+ if (State.exception == SIGQUIT)
+ {
+ *reason = sim_exited;
+ *sigrc = State.exception;
+ }
+ else
+ {
+ *reason = sim_stopped;
+ *sigrc = State.exception;
+ }
+}
+
+void
+sim_fetch_register (rn, memory)
+ int rn;
+ unsigned char *memory;
+{
+ *(uint32 *)memory = State.regs[rn];
+ /* printf ("sim_fetch_register %d 0x%x\n",rn,State.regs[rn]); */
+}
+
+void
+sim_store_register (rn, memory)
+ int rn;
+ unsigned char *memory;
+{
+ State.regs[rn]= *(uint32 *)memory;
+ /* printf ("store: r%d=0x%x\n",rn,State.regs[rn]); */
+}
+
+sim_read (addr, buffer, size)
+ SIM_ADDR addr;
+ unsigned char *buffer;
+ int size;
+{
+ int i;
+ for (i = 0; i < size; i++)
+ {
+ buffer[i] = State.imem[addr + i];
+ }
+ return size;
+}
+
+void
+sim_do_command (cmd)
+ char *cmd;
+{
+ printf("sim_do_command: %s\n",cmd);
+}
+
+int
+sim_load (prog, from_tty)
+ char *prog;
+ int from_tty;
+{
+ /* Return nonzero so GDB will handle it. */
+ return 1;
+}
diff --git a/sim/v850/simops.c b/sim/v850/simops.c
new file mode 100644
index 0000000..0eb54d8
--- /dev/null
+++ b/sim/v850/simops.c
@@ -0,0 +1,374 @@
+#include <signal.h>
+#include "v850_sim.h"
+#include "simops.h"
+
+void
+OP_1A0 ()
+{
+}
+
+void
+OP_280 ()
+{
+}
+
+void
+OP_220 ()
+{
+}
+
+void
+OP_10760 ()
+{
+}
+
+void
+OP_C7C0 ()
+{
+}
+
+void
+OP_760 ()
+{
+}
+
+void
+OP_6A0 ()
+{
+}
+
+void
+OP_580 ()
+{
+}
+
+void
+OP_700 ()
+{
+}
+
+void
+OP_581 ()
+{
+}
+
+void
+OP_40 ()
+{
+}
+
+void
+OP_582 ()
+{
+}
+
+void
+OP_583 ()
+{
+}
+
+void
+OP_584 ()
+{
+}
+
+void
+OP_585 ()
+{
+}
+
+void
+OP_586 ()
+{
+}
+
+void
+OP_587 ()
+{
+}
+
+void
+OP_588 ()
+{
+}
+
+void
+OP_589 ()
+{
+}
+
+void
+OP_58A ()
+{
+}
+
+void
+OP_58B ()
+{
+}
+
+void
+OP_58C ()
+{
+}
+
+void
+OP_400 ()
+{
+}
+
+void
+OP_2E0 ()
+{
+}
+
+void
+OP_160 ()
+{
+}
+
+void
+OP_58D ()
+{
+}
+
+void
+OP_58E ()
+{
+}
+
+void
+OP_58F ()
+{
+}
+
+void
+OP_660 ()
+{
+}
+
+void
+OP_100 ()
+{
+}
+
+void
+OP_E0 ()
+{
+}
+
+void
+OP_16087E0 ()
+{
+}
+
+void
+OP_16007E0 ()
+{
+}
+
+void
+OP_600 ()
+{
+}
+
+void
+OP_1C0 ()
+{
+}
+
+void
+OP_8007E0 ()
+{
+}
+
+void
+OP_C007E0 ()
+{
+}
+
+void
+OP_12007E0 ()
+{
+}
+
+void
+OP_240 ()
+{
+}
+
+void
+OP_4007E0 ()
+{
+}
+
+void
+OP_10720 ()
+{
+}
+
+void
+OP_780 ()
+{
+}
+
+void
+OP_6C0 ()
+{
+}
+
+void
+OP_720 ()
+{
+}
+
+void
+OP_60 ()
+{
+}
+
+void
+OP_2A0 ()
+{
+}
+
+void
+OP_87C0 ()
+{
+}
+
+void
+OP_180 ()
+{
+}
+
+void
+OP_300 ()
+{
+}
+
+void
+OP_0 ()
+{
+}
+
+void
+OP_680 ()
+{
+}
+
+void
+OP_7C0 ()
+{
+}
+
+void
+OP_120 ()
+{
+}
+
+void
+OP_1687E0 ()
+{
+}
+
+void
+OP_620 ()
+{
+}
+
+void
+OP_1E0 ()
+{
+}
+
+void
+OP_A0 ()
+{
+}
+
+void
+OP_260 ()
+{
+}
+
+void
+OP_200 ()
+{
+}
+
+void
+OP_6E0 ()
+{
+}
+
+void
+OP_740 ()
+{
+}
+
+void
+OP_80 ()
+{
+}
+
+void
+OP_14007E0 ()
+{
+}
+
+void
+OP_20 ()
+{
+}
+
+void
+OP_A007E0 ()
+{
+}
+
+void
+OP_500 ()
+{
+}
+
+void
+OP_2C0 ()
+{
+}
+
+void
+OP_10007E0 ()
+{
+}
+
+void
+OP_47C0 ()
+{
+}
+
+void
+OP_2007E0 ()
+{
+}
+
+void
+OP_7E0 ()
+{
+}
+
+void
+OP_140 ()
+{
+}
+
+void
+OP_640 ()
+{
+}
+
+void
+OP_C0 ()
+{
+}
+
diff --git a/sim/v850/v850_sim.h b/sim/v850/v850_sim.h
new file mode 100644
index 0000000..a840da1
--- /dev/null
+++ b/sim/v850/v850_sim.h
@@ -0,0 +1,111 @@
+#include <stdio.h>
+#include <ctype.h>
+#include "ansidecl.h"
+#include "opcode/v850.h"
+
+/* FIXME: host defines */
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+typedef signed char int8;
+typedef signed short int16;
+typedef signed int int32;
+typedef signed long long int64;
+
+/* FIXME: V850 defines */
+typedef uint16 reg_t;
+
+struct simops
+{
+ long opcode;
+ long mask;
+ void (*func)();
+ int numops;
+ int operands[9];
+};
+
+struct _state
+{
+ reg_t regs[16]; /* general-purpose registers */
+ reg_t cregs[16]; /* control registers */
+ int64 a[2]; /* accumulators */
+ uint8 SM;
+ uint8 EA;
+ uint8 DB;
+ uint8 IE;
+ uint8 RP;
+ uint8 MD;
+ uint8 FX;
+ uint8 ST;
+ uint8 F0;
+ uint8 F1;
+ uint8 C;
+ uint8 exe;
+ uint8 *imem;
+ uint8 *dmem;
+ int exception;
+} State;
+
+extern uint16 OP[4];
+extern struct simops Simops[];
+
+#define PC (State.cregs[2])
+#define PSW (State.cregs[0])
+#define BPSW (State.cregs[1])
+#define BPC (State.cregs[3])
+#define RPT_C (State.cregs[7])
+#define RPT_S (State.cregs[8])
+#define RPT_E (State.cregs[9])
+#define MOD_S (State.cregs[10])
+#define MOD_E (State.cregs[11])
+#define IBA (State.cregs[14])
+
+#define SEXT3(x) ((((x)&0x7)^(~3))+4)
+
+/* sign-extend a 4-bit number */
+#define SEXT4(x) ((((x)&0xf)^(~7))+8)
+
+/* sign-extend an 8-bit number */
+#define SEXT8(x) ((((x)&0xff)^(~0x7f))+0x80)
+
+/* sign-extend a 16-bit number */
+#define SEXT16(x) ((((x)&0xffff)^(~0x7fff))+0x8000)
+
+/* sign-extend a 32-bit number */
+#define SEXT32(x) ((((x)&0xffffffffLL)^(~0x7fffffffLL))+0x80000000LL)
+
+/* sign extend a 40 bit number */
+#define SEXT40(x) ((((x)&0xffffffffffLL)^(~0x7fffffffffLL))+0x8000000000LL)
+
+/* sign extend a 44 bit number */
+#define SEXT44(x) ((((x)&0xfffffffffffLL)^(~0x7ffffffffffLL))+0x80000000000LL)
+
+/* sign extend a 60 bit number */
+#define SEXT60(x) ((((x)&0xfffffffffffffffLL)^(~0x7ffffffffffffffLL))+0x800000000000000LL)
+
+#define MAX32 0x7fffffffLL
+#define MIN32 0xff80000000LL
+#define MASK32 0xffffffffLL
+#define MASK40 0xffffffffffLL
+
+#define INC_ADDR(x,i) x = ((State.MD && x == MOD_E) ? MOD_S : (x)+(i))
+
+#define RB(x) (*((uint8 *)((x)+State.imem)))
+#define SB(addr,data) ( RB(addr) = (data & 0xff))
+
+#ifdef WORDS_BIGENDIAN
+
+#define RW(x) (*((uint16 *)((x)+State.imem)))
+#define RLW(x) (*((uint32 *)((x)+State.imem)))
+#define SW(addr,data) RW(addr)=data
+
+#else
+
+uint32 get_longword_swap PARAMS ((uint16 x));
+uint16 get_word_swap PARAMS ((uint16 x));
+void write_word_swap PARAMS ((uint16 addr, uint16 data));
+#define SW(addr,data) write_word_swap(addr,data)
+#define RW(x) get_word_swap(x)
+#define RLW(x) get_longword_swap(x)
+
+#endif /* not WORDS_BIGENDIAN */