diff options
author | Andrew Hsieh <andrewhsieh@google.com> | 2014-06-13 12:38:00 -0700 |
---|---|---|
committer | Andrew Hsieh <andrewhsieh@google.com> | 2014-06-13 12:38:00 -0700 |
commit | 54f1b3cf509cd889905287cb8ce6c5ae33911a21 (patch) | |
tree | e39b1a7fa04db86a8215b7f9d4656d74e394aec0 /binutils-2.25/opcodes/w65-dis.c | |
parent | 2a6558a8ecfb81d75215b4ec7dc61113e12cfd5f (diff) | |
download | toolchain_binutils-54f1b3cf509cd889905287cb8ce6c5ae33911a21.tar.gz toolchain_binutils-54f1b3cf509cd889905287cb8ce6c5ae33911a21.tar.bz2 toolchain_binutils-54f1b3cf509cd889905287cb8ce6c5ae33911a21.zip |
Add upstream binutils-2.25 snapshot 4/4 2014
For MIPS -mmsa support
Change-Id: I08c4f002fa7b33dec85ed75956e6ab551bb03c96
Diffstat (limited to 'binutils-2.25/opcodes/w65-dis.c')
-rw-r--r-- | binutils-2.25/opcodes/w65-dis.c | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/binutils-2.25/opcodes/w65-dis.c b/binutils-2.25/opcodes/w65-dis.c new file mode 100644 index 00000000..943e432d --- /dev/null +++ b/binutils-2.25/opcodes/w65-dis.c @@ -0,0 +1,99 @@ +/* Disassemble WDC 65816 instructions. + Copyright 1995, 1998, 2000, 2001, 2002, 2005, 2007, 2012 + Free Software Foundation, Inc. + + This file is part of the GNU opcodes library. + + This library 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 3, or (at your option) + any later version. + + It 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., 51 Franklin Street - Fifth Floor, Boston, + MA 02110-1301, USA. */ + +#include "sysdep.h" +#include <stdio.h> + +#define STATIC_TABLE +#define DEFINE_TABLE + +#include "w65-opc.h" +#include "dis-asm.h" + +static fprintf_ftype fpr; +static void *stream; +static struct disassemble_info *local_info; + +static void +print_operand (int lookup, char *format, int *args) +{ + int val; + int c; + + while (*format) + { + switch (c = *format++) + { + case '$': + val = args[(*format++) - '0']; + if (lookup) + local_info->print_address_func (val, local_info); + else + fpr (stream, "0x%x", val); + + break; + default: + fpr (stream, "%c", c); + break; + } + } +} + +int +print_insn_w65 (bfd_vma memaddr, struct disassemble_info *info) +{ + int status = 0; + unsigned char insn[4]; + const struct opinfo *op; + int i; + int X = 0; + int M = 0; + int args[2]; + + stream = info->stream; + fpr = info->fprintf_func; + local_info = info; + + for (i = 0; i < 4 && status == 0; i++) + status = info->read_memory_func (memaddr + i, insn + i, 1, info); + + for (op = optable; op->val != insn[0]; op++) + ; + + fpr (stream, "%s", op->name); + + /* Prepare all the posible operand values. */ + { + int size = 1; + int asR_W65_ABS8 = insn[1]; + int asR_W65_ABS16 = (insn[2] << 8) + asR_W65_ABS8; + int asR_W65_ABS24 = (insn[3] << 16) + asR_W65_ABS16; + int asR_W65_PCR8 = ((char) (asR_W65_ABS8)) + memaddr + 2; + int asR_W65_PCR16 = ((short) (asR_W65_ABS16)) + memaddr + 3; + + switch (op->amode) + { + DISASM (); + } + + return size; + } +} |