00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <stdio.h>
00024 #include "sysdep.h"
00025 #define STATIC_TABLE
00026 #define DEFINE_TABLE
00027
00028 #include "w65-opc.h"
00029 #include "dis-asm.h"
00030
00031 static fprintf_ftype fpr;
00032 static void *stream;
00033 static struct disassemble_info *local_info;
00034
00035 static void print_operand PARAMS ((int, char *, int *));
00036
00037 #if 0
00038 static char *lname[] = { "r0","r1","r2","r3","r4","r5","r6","r7","s0" };
00039
00040 static char *
00041 findname (val)
00042 unsigned int val;
00043 {
00044 if (val >= 0x10 && val <= 0x20)
00045 return lname[(val - 0x10) / 2];
00046 return 0;
00047 }
00048 #endif
00049 static void
00050 print_operand (lookup, format, args)
00051 int lookup;
00052 char *format;
00053 int *args;
00054 {
00055 int val;
00056 int c;
00057
00058 while (*format)
00059 {
00060 switch (c = *format++)
00061 {
00062 case '$':
00063 val = args[(*format++) - '0'];
00064 if (lookup)
00065 {
00066 #if 0
00067 name = findname (val);
00068 if (name)
00069 fpr (stream, "%s", name);
00070 else
00071 #endif
00072 local_info->print_address_func (val, local_info);
00073 }
00074 else
00075 fpr (stream, "0x%x", val);
00076
00077 break;
00078 default:
00079 fpr (stream, "%c", c);
00080 break;
00081 }
00082 }
00083 }
00084
00085 int
00086 print_insn_w65 (memaddr, info)
00087 bfd_vma memaddr;
00088 struct disassemble_info *info;
00089 {
00090 int status = 0;
00091 unsigned char insn[4];
00092 const struct opinfo *op;
00093 int i;
00094 int X = 0;
00095 int M = 0;
00096 int args[2];
00097 stream = info->stream;
00098 fpr = info->fprintf_func;
00099 local_info = info;
00100 for (i = 0; i < 4 && status == 0; i++)
00101 {
00102 status = info->read_memory_func (memaddr + i, insn + i, 1, info);
00103 }
00104
00105 for (op = optable; op->val != insn[0]; op++)
00106 ;
00107
00108 fpr (stream, "%s", op->name);
00109
00110
00111 {
00112 int size = 1;
00113 int asR_W65_ABS8 = insn[1];
00114 int asR_W65_ABS16 = (insn[2] << 8) + asR_W65_ABS8;
00115 int asR_W65_ABS24 = (insn[3] << 16) + asR_W65_ABS16;
00116 int asR_W65_PCR8 = ((char) (asR_W65_ABS8)) + memaddr + 2;
00117 int asR_W65_PCR16 = ((short) (asR_W65_ABS16)) + memaddr + 3;
00118
00119 switch (op->amode)
00120 {
00121 DISASM ();
00122 }
00123
00124 return size;
00125 }
00126 }