Rizin
unix-like reverse engineering framework and cli tools
6502dis.c
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2015-2016 pancake <pancake@nopcode.org>
2 // SPDX-FileCopyrightText: 2015-2016 condret <condr3t@protonmail.com>
3 // SPDX-FileCopyrightText: 2015-2016 riq <ricardoquesada@gmail.com>
4 // SPDX-FileCopyrightText: 2015-2016 qnix <qnix@0x80.org>
5 // SPDX-License-Identifier: LGPL-3.0-only
6 
7 #include <rz_asm.h>
8 #include <rz_lib.h>
9 #include <string.h>
10 #include "../snes/snesdis.c"
11 
12 static struct {
14  char *name;
15  size_t len;
16 } ops[] = {
17  { 0x00, "brk", 1 },
18  { 0x0b, "anc #0x%02x", 2 },
19  { 0x2b, "anc #0x%02x", 2 },
20  { 0x8b, "ane #0x%02x", 2 },
21  { 0x6b, "arr #0x%02x", 2 },
22  { 0x4b, "asr #0x%02x", 2 },
23  { 0xc7, "dcp 0x%02x", 2 },
24  { 0xd7, "dcp 0x%02x,x", 2 },
25  { 0xcf, "dcp 0x%04x", 3 },
26  { 0xdf, "dcp 0x%04x,x", 3 },
27  { 0xdb, "dcp 0x%04x,y", 3 },
28  { 0xc3, "dcp (0x%02x,x)", 2 },
29  { 0xd3, "dcp (0x%02x),y", 2 },
30  { 0xe7, "isb 0x%02x", 2 },
31  { 0xf7, "isb 0x%02x,x", 2 },
32  { 0xef, "isb 0x%04x", 3 },
33  { 0xff, "isb 0x%04x,x", 3 },
34  { 0xfb, "isb 0x%04x,y", 3 },
35  { 0xe3, "isb (0x%02x,x)", 2 },
36  { 0xf3, "isb (0x%02x),y", 2 },
37  { 0x02, "hlt", 1 },
38  { 0x12, "hlt", 1 },
39  { 0x22, "hlt", 1 },
40  { 0x32, "hlt", 1 },
41  { 0x42, "hlt", 1 },
42  { 0x52, "hlt", 1 },
43  { 0x62, "hlt", 1 },
44  { 0x72, "hlt", 1 },
45  { 0x92, "hlt", 1 },
46  { 0xb2, "hlt", 1 },
47  { 0xd2, "hlt", 1 },
48  { 0xf2, "hlt", 1 },
49  { 0xbb, "lae 0x%04x,y", 3 },
50  { 0xa7, "lax 0x%02x", 2 },
51  { 0xb7, "lax 0x%02x,y", 2 },
52  { 0xaf, "lax 0x%04x", 3 },
53  { 0xbf, "lax 0x%04x,y", 3 },
54  { 0xa3, "lax (0x%02x,x)", 2 },
55  { 0xb3, "lax (0x%02x),y", 2 },
56  { 0xab, "lxa #0x%02x", 2 },
57  { 0xea, "nop", 1 },
58  { 0x1a, "nop", 1 },
59  { 0x3a, "nop", 1 },
60  { 0x5a, "nop", 1 },
61  { 0x7a, "nop", 1 },
62  { 0xda, "nop", 1 },
63  { 0xfa, "nop", 1 },
64  { 0x80, "nop #0x%02x", 2 },
65  { 0x82, "nop #0x%02x", 2 },
66  { 0x89, "nop #0x%02x", 2 },
67  { 0xc2, "nop #0x%02x", 2 },
68  { 0xe2, "nop #0x%02x", 2 },
69  { 0x04, "nop 0x%02x", 2 },
70  { 0x44, "nop 0x%02x", 2 },
71  { 0x64, "nop 0x%02x", 2 },
72  { 0x14, "nop 0x%02x,x", 2 },
73  { 0x34, "nop 0x%02x,x", 2 },
74  { 0x54, "nop 0x%02x,x", 2 },
75  { 0x74, "nop 0x%02x,x", 2 },
76  { 0xd4, "nop 0x%02x,x", 2 },
77  { 0xf4, "nop 0x%02x,x", 2 },
78  { 0x0c, "nop 0x%04x", 3 },
79  { 0x1c, "nop 0x%04x,x", 3 },
80  { 0x3c, "nop 0x%04x,x", 3 },
81  { 0x5c, "nop 0x%04x,x", 3 },
82  { 0x7c, "nop 0x%04x,x", 3 },
83  { 0xdc, "nop 0x%04x,x", 3 },
84  { 0xfc, "nop 0x%04x,x", 3 },
85  { 0x27, "rla 0x%02x", 2 },
86  { 0x37, "rla 0x%02x,x", 2 },
87  { 0x2f, "rla 0x%04x", 3 },
88  { 0x3f, "rla 0x%04x,x", 3 },
89  { 0x3b, "rla 0x%04x,y", 3 },
90  { 0x23, "rla (0x%02x,x)", 2 },
91  { 0x33, "rla (0x%02x),y", 2 },
92  { 0x67, "rra 0x%02x", 2 },
93  { 0x77, "rra 0x%02x,x", 2 },
94  { 0x6f, "rra 0x%04x", 3 },
95  { 0x7f, "rra 0x%04x,x", 3 },
96  { 0x7b, "rra 0x%04x,y", 3 },
97  { 0x63, "rra (0x%02x,x)", 2 },
98  { 0x73, "rra (0x%02x),y", 2 },
99  { 0x87, "sax 0x%02x", 2 },
100  { 0x97, "sax 0x%02x,y", 2 },
101  { 0x8f, "sax 0x%04x", 3 },
102  { 0x83, "sax (0x%02x,x)", 2 },
103  { 0xe9, "sbc #0x%02x", 2 },
104  { 0xe5, "sbc 0x%02x", 2 },
105  { 0xf5, "sbc 0x%02x,x", 2 },
106  { 0xed, "sbc 0x%04x", 3 },
107  { 0xfd, "sbc 0x%04x,x", 3 },
108  { 0xf9, "sbc 0x%04x,y", 3 },
109  { 0xe1, "sbc (0x%02x,x)", 2 },
110  { 0xf1, "sbc (0x%02x),y", 2 },
111  { 0xeb, "sbc #0x%02x", 2 },
112  //{0xef, "sbc 0x%06x", 4},
113  //{0xff, "sbc 0x%06x,x", 4},
114  //{0xf2, "sbc (0x%02x)", 2},
115  //{0xe7, "sbc [0x%02x]", 2},
116  //{0xf7, "sbc [0x%02x],y", 2},
117  //{0xe3, "sbc 0x%02x,s", 2},
118  //{0xf3, "sbc (0x%02x,s),y", 2},
119  { 0xcb, "sbx 0x%02x", 2 },
120  { 0x93, "sha 0x%04x,x", 3 },
121  { 0x9f, "sha 0x%04x,y", 3 },
122  { 0x9b, "shs 0x%04x,y", 3 },
123  { 0x9e, "shx 0x%04x,y", 3 },
124  { 0x9c, "shy 0x%04x,x", 3 },
125  { 0x07, "slo 0x%02x", 2 },
126  { 0x17, "slo 0x%02x,x", 2 },
127  { 0x0f, "slo 0x%04x", 3 },
128  { 0x1f, "slo 0x%04x,x", 3 },
129  { 0x1b, "slo 0x%04x,y", 3 },
130  { 0x03, "slo (0x%02x,x)", 2 },
131  { 0x13, "slo (0x%02x),y", 2 },
132  { 0x47, "sre 0x%02x", 2 },
133  { 0x57, "sre 0x%02x,x", 2 },
134  { 0x4f, "sre 0x%04x", 3 },
135  { 0x5f, "sre 0x%04x,x", 3 },
136  { 0x5b, "sre 0x%04x,y", 3 },
137  { 0x43, "sre (0x%02x,x)", 2 },
138  { 0x53, "sre (0x%02x),y", 2 },
139  { -1, NULL, 0 }
140 };
141 
142 static int _6502Disass(ut64 pc, RzAsmOp *op, const ut8 *buf, ut64 len) {
143  int i;
144  for (i = 0; ops[i].name != NULL; i++) {
145  if (ops[i].op == buf[0]) {
146  const char *buf_asm = "invalid";
147  int len = ops[i].len;
148  switch (ops[i].len) {
149  case 1:
150  buf_asm = sdb_fmt("%s", ops[i].name);
151  break;
152  case 2:
153  if (len > 1) {
154  buf_asm = sdb_fmt(ops[i].name, buf[1]);
155  } else {
156  buf_asm = "truncated";
157  len = -1;
158  }
159  break;
160  case 3:
161  if (len > 2) {
162  buf_asm = sdb_fmt(ops[i].name, buf[1] + 0x100 * buf[2]);
163  } else {
164  buf_asm = "truncated";
165  len = -1;
166  }
167  break;
168  case 4:
169  if (len > 3) {
170  buf_asm = sdb_fmt(ops[i].name, buf[1] + 0x100 * buf[2] + 0x10000 * buf[3]);
171  } else {
172  buf_asm = "truncated";
173  len = -1;
174  }
175  break;
176  default:
177  goto beach;
178  }
179  rz_strbuf_set(&op->buf_asm, buf_asm);
180  return len;
181  }
182  }
183 beach:
184  return snesDisass(1, 1, pc, op, buf, len);
185 }
char * name
Definition: 6502dis.c:14
size_t len
Definition: 6502dis.c:15
static int _6502Disass(ut64 pc, RzAsmOp *op, const ut8 *buf, ut64 len)
Definition: 6502dis.c:142
static struct @29 ops[]
ut8 op
Definition: 6502dis.c:13
lzma_index ** i
Definition: index.h:629
#define NULL
Definition: cris-opc.c:27
RZ_API char * sdb_fmt(const char *fmt,...)
Definition: fmt.c:26
voidpf void * buf
Definition: ioapi.h:138
uint8_t ut8
Definition: lh5801.h:11
RZ_API const char * rz_strbuf_set(RzStrBuf *sb, const char *s)
Definition: strbuf.c:153
static int snesDisass(int M_flag, int X_flag, ut64 pc, RzAsmOp *op, const ut8 *buf, int len)
Definition: snesdis.c:12
Definition: z80asm.h:102
Definition: dis.c:32
ut64(WINAPI *w32_GetEnabledXStateFeatures)()