diff options
author | Richard Henderson <rth@redhat.com> | 1999-05-03 07:29:06 +0000 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 1999-05-03 07:29:06 +0000 |
commit | 860acaebec6b57ce27e244cc02a58e6651a4b6c3 (patch) | |
tree | eff5420756a4bd56b40b74c2b828b261f327610b /opcodes/w65-dis.c | |
parent | f9c53ad2d7cb541cbe821d645b90437ac063e5db (diff) | |
download | gdb-860acaebec6b57ce27e244cc02a58e6651a4b6c3.tar.gz |
Initial revision
Diffstat (limited to 'opcodes/w65-dis.c')
-rw-r--r-- | opcodes/w65-dis.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/opcodes/w65-dis.c b/opcodes/w65-dis.c new file mode 100644 index 00000000000..a12e896de67 --- /dev/null +++ b/opcodes/w65-dis.c @@ -0,0 +1,118 @@ +/* Disassemble WDC 65816 instructions. + Copyright (C) 1995, 1998 Free Software Foundation, Inc. + +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. */ + +#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; +#if 0 +static char *lname[] = {"r0","r1","r2","r3","r4","r5","r6","r7","s0"}; + +static char *findname (val) + unsigned int val; +{ + if (val >= 0x10 && val <= 0x20) + return lname[(val - 0x10) / 2]; + return 0; +} +#endif +static void +print_operand (lookup, format, args) + int lookup; + char *format; + unsigned int *args; +{ + int val; + int c; + + while (*format) + { + switch ( c = *format++) + { + case '$': + val = args[(*format++) - '0']; + if (lookup) + { +#if 0 + name = findname(val); + if (name) + fpr(stream, "%s", name); + else +#endif + 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(memaddr, info) + bfd_vma memaddr; + struct disassemble_info *info; +{ + + + int status = 0; + unsigned char insn[4]; + register 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; + } + +} |