/* Print National Semiconductor 32000 instructions.
- Copyright (c) 1986, 88, 91, 92, 94, 95, 1998 Free Software Foundation, Inc.
+ Copyright 1986, 1988, 1991, 1992, 1994, 1998, 2001, 2002, 2005
+ Free Software Foundation, Inc.
This file is part of opcodes library.
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. */
+Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
#include "bfd.h"
/*
* Hacks to get it to compile <= READ THESE AS FIXES NEEDED
*/
-#define INVALID_FLOAT(val, size) invalid_float((char *)val, size)
+#define INVALID_FLOAT(val, size) invalid_float((bfd_byte *)val, size)
static int print_insn_arg
- PARAMS ((int, int, int *, char *, bfd_vma, char *, int));
-static int get_displacement PARAMS ((char *, int *));
-static int invalid_float PARAMS ((char *, int));
+ PARAMS ((int, int, int *, bfd_byte *, bfd_vma, char *, int));
+static int get_displacement PARAMS ((bfd_byte *, int *));
+static int invalid_float PARAMS ((bfd_byte *, int));
+static long int read_memory_integer PARAMS ((unsigned char *, int));
+static int fetch_data PARAMS ((struct disassemble_info *, bfd_byte *));
+struct ns32k_option;
+static void optlist PARAMS ((int, const struct ns32k_option *, char *));
+static void list_search PARAMS ((int, const struct ns32k_option *, char *));
+static int bit_extract PARAMS ((bfd_byte *, int, int));
+static int bit_extract_simple PARAMS ((bfd_byte *, int, int));
+static void bit_copy PARAMS ((bfd_byte *, int, int, char *));
+static int sign_extend PARAMS ((int, int));
+static void flip_bytes PARAMS ((char *, int));
static long read_memory_integer(addr, nr)
unsigned char *addr;
int count;
{
int result;
- int mask;
int bit;
buffer += offset >> 3;
static void
bit_copy (buffer, offset, count, to)
- char *buffer;
+ bfd_byte *buffer;
int offset;
int count;
char *to;
bfd_vma memaddr;
disassemble_info *info;
{
- register unsigned int i;
- register char *d;
+ unsigned int i;
+ const char *d;
unsigned short first_word;
int ioffset; /* bits into instruction */
int aoffset; /* bits into arguments */
print_insn_arg (d, ioffset, aoffsetp, buffer, addr, result, index_offset)
int d;
int ioffset, *aoffsetp;
- char *buffer;
+ bfd_byte *buffer;
bfd_vma addr;
char *result;
int index_offset;
{
- int addr_mode;
- float Fvalue;
- double Lvalue;
+ union {
+ float f;
+ double d;
+ int i[2];
+ } value;
int Ivalue;
+ int addr_mode;
int disp1, disp2;
int index;
int size;
break;
case 'W':
Ivalue = bit_extract (buffer, *aoffsetp, 16);
- flip_bytes (&Ivalue, 2);
+ flip_bytes ((char *) & Ivalue, 2);
*aoffsetp += 16;
Ivalue = sign_extend (Ivalue, 16);
sprintf (result, "$%d", Ivalue);
break;
case 'D':
Ivalue = bit_extract (buffer, *aoffsetp, 32);
- flip_bytes (&Ivalue, 4);
+ flip_bytes ((char *) & Ivalue, 4);
*aoffsetp += 32;
sprintf (result, "$%d", Ivalue);
break;
case 'F':
- bit_copy (buffer, *aoffsetp, 32, (char *) &Fvalue);
- flip_bytes (&Fvalue, 4);
+ bit_copy (buffer, *aoffsetp, 32, (char *) &value.f);
+ flip_bytes ((char *) &value.f, 4);
*aoffsetp += 32;
- if (INVALID_FLOAT (&Fvalue, 4))
- sprintf (result, "<<invalid float 0x%.8x>>", *(int *) &Fvalue);
+ if (INVALID_FLOAT (&value.f, 4))
+ sprintf (result, "<<invalid float 0x%.8x>>", value.i[0]);
else /* assume host has ieee float */
- sprintf (result, "$%g", Fvalue);
+ sprintf (result, "$%g", value.f);
break;
case 'L':
- bit_copy (buffer, *aoffsetp, 64, (char *) &Lvalue);
- flip_bytes (&Lvalue, 8);
+ bit_copy (buffer, *aoffsetp, 64, (char *) &value.d);
+ flip_bytes ((char *) &value.d, 8);
*aoffsetp += 64;
- if (INVALID_FLOAT (&Lvalue, 8))
- sprintf (result, "<<invalid long 0x%.8x%.8x>>",
- *(((int *) &Lvalue) + 1), *(int *) &Lvalue);
+ if (INVALID_FLOAT (&value.d, 8))
+ sprintf (result, "<<invalid double 0x%.8x%.8x>>",
+ value.i[1], value.i[0]);
else /* assume host has ieee float */
- sprintf (result, "$%g", Lvalue);
+ sprintf (result, "$%g", value.d);
break;
}
break;
static int
get_displacement (buffer, aoffsetp)
- char *buffer;
+ bfd_byte *buffer;
int *aoffsetp;
{
int Ivalue;
break;
case 0x80:
Ivalue2 = bit_extract (buffer, *aoffsetp, 16);
- flip_bytes (&Ivalue2, 2);
+ flip_bytes ((char *) & Ivalue2, 2);
Ivalue = sign_extend (Ivalue2, 14);
*aoffsetp += 16;
break;
case 0xc0:
Ivalue = bit_extract (buffer, *aoffsetp, 32);
- flip_bytes (&Ivalue, 4);
+ flip_bytes ((char *) & Ivalue, 4);
Ivalue = sign_extend (Ivalue, 30);
*aoffsetp += 32;
break;
#if 1 /* a version that should work on ns32k f's&d's on any machine */
static int
invalid_float (p, len)
- register char *p;
+ register bfd_byte *p;
register int len;
{
register int val;