source: branches/libc-0.6/src/binutils/opcodes/w65-dis.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 2.7 KB
Line 
1/* Disassemble WDC 65816 instructions.
2 Copyright 1995, 1998, 2000, 2001, 2002 Free Software Foundation, Inc.
3
4This program is free software; you can redistribute it and/or modify
5it under the terms of the GNU General Public License as published by
6the Free Software Foundation; either version 2 of the License, or
7(at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12GNU General Public License for more details.
13
14You should have received a copy of the GNU General Public License
15along with this program; if not, write to the Free Software
16Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
17
18#include <stdio.h>
19#include "sysdep.h"
20#define STATIC_TABLE
21#define DEFINE_TABLE
22
23#include "w65-opc.h"
24#include "dis-asm.h"
25
26static fprintf_ftype fpr;
27static void *stream;
28static struct disassemble_info *local_info;
29
30static void print_operand PARAMS ((int, char *, unsigned int *));
31
32#if 0
33static char *lname[] = { "r0","r1","r2","r3","r4","r5","r6","r7","s0" };
34
35static char *
36findname (val)
37 unsigned int val;
38{
39 if (val >= 0x10 && val <= 0x20)
40 return lname[(val - 0x10) / 2];
41 return 0;
42}
43#endif
44static void
45print_operand (lookup, format, args)
46 int lookup;
47 char *format;
48 unsigned int *args;
49{
50 int val;
51 int c;
52
53 while (*format)
54 {
55 switch (c = *format++)
56 {
57 case '$':
58 val = args[(*format++) - '0'];
59 if (lookup)
60 {
61#if 0
62 name = findname (val);
63 if (name)
64 fpr (stream, "%s", name);
65 else
66#endif
67 local_info->print_address_func (val, local_info);
68 }
69 else
70 fpr (stream, "0x%x", val);
71
72 break;
73 default:
74 fpr (stream, "%c", c);
75 break;
76 }
77 }
78}
79
80int
81print_insn_w65 (memaddr, info)
82 bfd_vma memaddr;
83 struct disassemble_info *info;
84{
85 int status = 0;
86 unsigned char insn[4];
87 const struct opinfo *op;
88 int i;
89 int X = 0;
90 int M = 0;
91 int args[2];
92 stream = info->stream;
93 fpr = info->fprintf_func;
94 local_info = info;
95 for (i = 0; i < 4 && status == 0; i++)
96 {
97 status = info->read_memory_func (memaddr + i, insn + i, 1, info);
98 }
99
100 for (op = optable; op->val != insn[0]; op++)
101 ;
102
103 fpr (stream, "%s", op->name);
104
105 /* Prepare all the posible operand values. */
106 {
107 int size = 1;
108 int asR_W65_ABS8 = insn[1];
109 int asR_W65_ABS16 = (insn[2] << 8) + asR_W65_ABS8;
110 int asR_W65_ABS24 = (insn[3] << 16) + asR_W65_ABS16;
111 int asR_W65_PCR8 = ((char) (asR_W65_ABS8)) + memaddr + 2;
112 int asR_W65_PCR16 = ((short) (asR_W65_ABS16)) + memaddr + 3;
113
114 switch (op->amode)
115 {
116 DISASM ();
117 }
118
119 return size;
120 }
121}
Note: See TracBrowser for help on using the repository browser.