mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-16 06:28:03 +08:00
* ChangeLog, Makefile.in, configure, configure.in, v850_sim.h,
gencode.c, interp.c, simops.c: Created. So we've got something to hack on.
This commit is contained in:
39
sim/v850/.Sanitize
Normal file
39
sim/v850/.Sanitize
Normal file
@ -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.
|
5
sim/v850/ChangeLog
Normal file
5
sim/v850/ChangeLog
Normal file
@ -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.
|
||||||
|
|
149
sim/v850/Makefile.in
Normal file
149
sim/v850/Makefile.in
Normal file
@ -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
|
29
sim/v850/configure.in
Normal file
29
sim/v850/configure.in
Normal file
@ -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)
|
144
sim/v850/gencode.c
Normal file
144
sim/v850/gencode.c
Normal file
@ -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");
|
||||||
|
}
|
423
sim/v850/interp.c
Normal file
423
sim/v850/interp.c
Normal file
@ -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;
|
||||||
|
}
|
374
sim/v850/simops.c
Normal file
374
sim/v850/simops.c
Normal file
@ -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 ()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
111
sim/v850/v850_sim.h
Normal file
111
sim/v850/v850_sim.h
Normal file
@ -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 */
|
Reference in New Issue
Block a user