Rizin
unix-like reverse engineering framework and cli tools
mcs96.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2015-2019 condret <condr3t@protonmail.com>
2 // SPDX-License-Identifier: LGPL-3.0-only
3 
4 #include <rz_util.h>
5 #include <rz_types.h>
6 
7 typedef struct mcs96_op_t {
8  const char *ins;
9  const ut32 type;
11 
12 #define MCS96_1B 0x1
13 #define MCS96_2B 0x2
14 #define MCS96_3B 0x4
15 #define MCS96_4B 0x8
16 #define MCS96_5B 0x10
17 
18 #define MCS96_3B_OR_4B 0x20
19 #define MCS96_4B_OR_5B 0x40
20 #define MCS96_5B_OR_6B 0x80
21 
22 #define MCS96_2OP 0x100
23 #define MCS96_3OP 0x200
24 #define MCS96_4OP 0x400
25 #define MCS96_5OP 0x800
26 
27 #define MCS96_REG_8 0x1000
28 
29 #define MCS96_FE 0x2000 // 0xfe extension
30 
31 static Mcs96Op mcs96_op[] = {
32  { "skip", MCS96_1B },
33  { "invalid", MCS96_1B },
34  { "invalid", MCS96_1B },
35  { "invalid", MCS96_1B },
36  { "invalid", MCS96_1B },
37  { "invalid", MCS96_1B },
38  { "invalid", MCS96_1B },
39  { "invalid", MCS96_1B },
40  { "shr", MCS96_3B },
41  { "shl", MCS96_3B },
42  { "shra", MCS96_3B }, // 0x0a
43  { "invalid", MCS96_1B },
44  { "shrl", MCS96_3B },
45  { "shll", MCS96_3B },
46  { "shral", MCS96_3B },
47  { "norml", MCS96_3B },
48  { "invalid", MCS96_1B }, // 0x10
49  { "invalid", MCS96_1B },
50  { "invalid", MCS96_1B },
51  { "invalid", MCS96_1B },
52  { "invalid", MCS96_1B },
53  { "invalid", MCS96_1B },
54  { "invalid", MCS96_1B },
55  { "invalid", MCS96_1B },
56  { "shrb", MCS96_3B },
57  { "shlb", MCS96_3B },
58  { "shrab", MCS96_3B },
59  { "invalid", MCS96_1B },
60  { "invalid", MCS96_1B },
61  { "invalid", MCS96_1B },
62  { "invalid", MCS96_1B },
63  { "invalid", MCS96_1B },
64  { "sjmp", MCS96_2B }, // 0x20
65  { "sjmp", MCS96_2B },
66  { "sjmp", MCS96_2B },
67  { "sjmp", MCS96_2B },
68  { "sjmp", MCS96_2B },
69  { "sjmp", MCS96_2B },
70  { "sjmp", MCS96_2B },
71  { "sjmp", MCS96_2B },
72  { "scall", MCS96_2B }, // 0x28
73  { "scall", MCS96_2B },
74  { "scall", MCS96_2B },
75  { "scall", MCS96_2B },
76  { "scall", MCS96_2B },
77  { "scall", MCS96_2B },
78  { "scall", MCS96_2B },
79  { "scall", MCS96_2B },
80  { "jbc", MCS96_3B }, // 0x30
81  { "jbc", MCS96_3B },
82  { "jbc", MCS96_3B },
83  { "jbc", MCS96_3B },
84  { "jbc", MCS96_3B },
85  { "jbc", MCS96_3B },
86  { "jbc", MCS96_3B },
87  { "jbc", MCS96_3B },
88  { "jbs", MCS96_3B }, // 0x38
89  { "jbs", MCS96_3B },
90  { "jbs", MCS96_3B },
91  { "jbs", MCS96_3B },
92  { "jbs", MCS96_3B },
93  { "jbs", MCS96_3B },
94  { "jbs", MCS96_3B },
95  { "jbs", MCS96_3B },
96  { "and", MCS96_4B | MCS96_3OP }, // 0x40
97  { "and", MCS96_5B | MCS96_3OP },
98  { "and", MCS96_4B | MCS96_3OP },
99  { "and", MCS96_5B_OR_6B | MCS96_3OP },
100  { "add", MCS96_4B | MCS96_3OP },
101  { "add", MCS96_5B | MCS96_3OP },
102  { "add", MCS96_4B | MCS96_3OP },
103  { "add", MCS96_5B_OR_6B | MCS96_3OP },
104  { "sub", MCS96_4B | MCS96_3OP },
105  { "sub", MCS96_5B | MCS96_3OP },
106  { "sub", MCS96_4B | MCS96_3OP },
107  { "sub", MCS96_5B_OR_6B | MCS96_3OP },
108  { "mulu", MCS96_4B | MCS96_3OP | MCS96_FE },
109  { "mulu", MCS96_5B | MCS96_3OP | MCS96_FE },
110  { "mulu", MCS96_4B | MCS96_3OP | MCS96_FE },
111  { "mulu", MCS96_5B_OR_6B | MCS96_3OP | MCS96_FE }, // 0x4f
112  { "andb", MCS96_4B | MCS96_3OP | MCS96_REG_8 },
113  { "andb", MCS96_4B | MCS96_3OP },
114  { "andb", MCS96_4B | MCS96_3OP },
115  { "andb", MCS96_5B_OR_6B | MCS96_3OP }, // datasheet says that this is always 5 byte
116  // that datasheet already has proven to have typos
117  { "addb", MCS96_4B | MCS96_3OP },
118  { "addb", MCS96_4B | MCS96_3OP },
119  { "addb", MCS96_4B | MCS96_3OP },
120  { "addb", MCS96_5B_OR_6B | MCS96_3OP },
121  { "subb", MCS96_4B | MCS96_3OP },
122  { "subb", MCS96_4B | MCS96_3OP },
123  { "subb", MCS96_4B | MCS96_3OP },
124  { "subb", MCS96_5B_OR_6B | MCS96_3OP },
125  { "mulub", MCS96_4B | MCS96_3OP | MCS96_FE },
126  { "mulub", MCS96_4B | MCS96_3OP | MCS96_FE },
127  { "mulub", MCS96_4B | MCS96_3OP | MCS96_FE },
128  { "mulub", MCS96_5B_OR_6B | MCS96_3OP | MCS96_FE }, // 0x5f
129  { "and", MCS96_3B | MCS96_2OP },
130  { "and", MCS96_4B | MCS96_2OP },
131  { "and", MCS96_3B | MCS96_2OP },
132  { "and", MCS96_4B_OR_5B | MCS96_2OP },
133  { "add", MCS96_3B | MCS96_2OP },
134  { "add", MCS96_4B | MCS96_2OP },
135  { "add", MCS96_3B | MCS96_2OP },
136  { "add", MCS96_4B_OR_5B | MCS96_2OP },
137  { "sub", MCS96_3B | MCS96_2OP },
138  { "sub", MCS96_4B | MCS96_2OP },
139  { "sub", MCS96_3B | MCS96_2OP },
140  { "sub", MCS96_4B_OR_5B | MCS96_2OP },
141  { "mulu", MCS96_3B | MCS96_2OP | MCS96_FE },
142  { "mulu", MCS96_4B | MCS96_2OP | MCS96_FE },
143  { "mulu", MCS96_3B | MCS96_2OP | MCS96_FE },
144  { "mulu", MCS96_4B_OR_5B | MCS96_2OP | MCS96_FE }, // 0x6f
145  { "andb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
146  { "andb", MCS96_3B | MCS96_2OP },
147  { "andb", MCS96_3B | MCS96_2OP },
148  { "andb", MCS96_4B_OR_5B | MCS96_2OP }, // again i don't trust the data-sheet here
149  { "addb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
150  { "addb", MCS96_3B | MCS96_2OP },
151  { "addb", MCS96_3B | MCS96_2OP },
152  { "addb", MCS96_4B_OR_5B | MCS96_2OP },
153  { "subb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
154  { "subb", MCS96_3B | MCS96_2OP },
155  { "subb", MCS96_3B | MCS96_2OP },
156  { "subb", MCS96_4B_OR_5B | MCS96_2OP },
157  { "mulub", MCS96_3B | MCS96_2OP | MCS96_FE | MCS96_REG_8 },
158  { "mulub", MCS96_3B | MCS96_2OP | MCS96_FE },
159  { "mulub", MCS96_3B | MCS96_2OP | MCS96_FE },
160  { "mulub", MCS96_4B_OR_5B | MCS96_2OP | MCS96_FE }, // 0x7f
161  { "or", MCS96_3B | MCS96_2OP },
162  { "or", MCS96_4B | MCS96_2OP },
163  { "or", MCS96_3B | MCS96_2OP },
164  { "or", MCS96_4B_OR_5B | MCS96_2OP },
165  { "xor", MCS96_3B | MCS96_2OP },
166  { "xor", MCS96_4B | MCS96_2OP },
167  { "xor", MCS96_3B | MCS96_2OP },
168  { "xor", MCS96_4B_OR_5B | MCS96_2OP },
169  { "cmp", MCS96_3B | MCS96_2OP },
170  { "cmp", MCS96_4B | MCS96_2OP },
171  { "cmp", MCS96_3B | MCS96_2OP },
172  { "cmp", MCS96_4B_OR_5B | MCS96_2OP },
173  { "divu", MCS96_3B | MCS96_2OP | MCS96_FE },
174  { "divu", MCS96_4B | MCS96_2OP | MCS96_FE },
175  { "divu", MCS96_3B | MCS96_2OP | MCS96_FE },
176  { "divu", MCS96_4B_OR_5B | MCS96_2OP | MCS96_FE }, // 0x8f
177  { "orb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
178  { "orb", MCS96_3B | MCS96_2OP },
179  { "orb", MCS96_3B | MCS96_2OP },
180  { "orb", MCS96_4B_OR_5B | MCS96_2OP },
181  { "xorb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
182  { "xorb", MCS96_3B | MCS96_2OP },
183  { "xorb", MCS96_3B | MCS96_2OP },
184  { "xorb", MCS96_4B_OR_5B | MCS96_2OP },
185  { "cmpb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
186  { "cmpb", MCS96_3B | MCS96_2OP },
187  { "cmpb", MCS96_3B | MCS96_2OP },
188  { "cmpb", MCS96_4B_OR_5B | MCS96_2OP },
189  { "divub", MCS96_3B | MCS96_2OP | MCS96_FE | MCS96_REG_8 },
190  { "divub", MCS96_3B | MCS96_2OP | MCS96_FE },
191  { "divub", MCS96_3B | MCS96_2OP | MCS96_FE },
192  { "divub", MCS96_4B_OR_5B | MCS96_2OP | MCS96_FE }, // 0x9f
193  { "ld", MCS96_3B | MCS96_2OP },
194  { "ld", MCS96_4B | MCS96_2OP },
195  { "ld", MCS96_3B | MCS96_2OP },
196  { "ld", MCS96_4B_OR_5B | MCS96_2OP },
197  { "addc", MCS96_3B | MCS96_2OP },
198  { "addc", MCS96_4B | MCS96_2OP },
199  { "addc", MCS96_3B | MCS96_2OP },
200  { "addc", MCS96_4B_OR_5B | MCS96_2OP },
201  { "subc", MCS96_3B | MCS96_2OP },
202  { "subc", MCS96_4B | MCS96_2OP },
203  { "subc", MCS96_3B | MCS96_2OP },
204  { "subc", MCS96_4B_OR_5B | MCS96_2OP },
205  { "lbsze", MCS96_3B | MCS96_2OP },
206  { "lbsze", MCS96_3B | MCS96_2OP },
207  { "lbsze", MCS96_3B | MCS96_2OP },
208  { "lbsze", MCS96_4B_OR_5B | MCS96_2OP }, // 0xaf
209  { "ldb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
210  { "ldb", MCS96_3B | MCS96_2OP },
211  { "ldb", MCS96_3B | MCS96_2OP },
212  { "ldb", MCS96_4B_OR_5B | MCS96_2OP },
213  { "addcb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
214  { "addcb", MCS96_3B | MCS96_2OP },
215  { "addcb", MCS96_3B | MCS96_2OP },
216  { "addcb", MCS96_4B_OR_5B | MCS96_2OP },
217  { "subcb", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
218  { "subcb", MCS96_3B | MCS96_2OP },
219  { "subcb", MCS96_3B | MCS96_2OP },
220  { "subcb", MCS96_4B_OR_5B | MCS96_2OP },
221  { "ldbse", MCS96_3B | MCS96_2OP | MCS96_REG_8 },
222  { "ldbse", MCS96_3B | MCS96_2OP },
223  { "ldbse", MCS96_3B | MCS96_2OP },
224  { "ldbse", MCS96_4B_OR_5B | MCS96_2OP }, // 0xbf
225  { "st", MCS96_3B | MCS96_2OP },
226  { "invalid", MCS96_1B },
227  { "st", MCS96_3B | MCS96_2OP },
228  { "st", MCS96_4B_OR_5B | MCS96_2OP },
229  { "stb", MCS96_3B | MCS96_2OP },
230  { "invalid", MCS96_1B },
231  { "stb", MCS96_3B | MCS96_2OP },
232  { "stb", MCS96_4B_OR_5B | MCS96_2OP },
233  { "push", MCS96_2B },
234  { "push", MCS96_3B },
235  { "push", MCS96_2B },
236  { "push", MCS96_3B_OR_4B },
237  { "pop", MCS96_2B },
238  { "invalid", MCS96_1B },
239  { "pop", MCS96_2B },
240  { "pop", MCS96_3B_OR_4B }, // 0xcf
241  { "jnst", MCS96_2B },
242  { "jnh", MCS96_2B },
243  { "jgt", MCS96_2B },
244  { "jnc", MCS96_2B },
245  { "jnvt", MCS96_2B },
246  { "jnv", MCS96_2B },
247  { "jge", MCS96_2B },
248  { "jne", MCS96_2B },
249  { "jst", MCS96_2B },
250  { "jh", MCS96_2B },
251  { "jle", MCS96_2B },
252  { "jc", MCS96_2B },
253  { "jvt", MCS96_2B },
254  { "jv", MCS96_2B },
255  { "jlt", MCS96_2B },
256  { "je", MCS96_2B }, // 0xdf
257  { "djnz", MCS96_3B },
258  { "invalid", MCS96_1B },
259  { "invalid", MCS96_1B },
260  { "br", MCS96_2B },
261  { "invalid", MCS96_1B },
262  { "invalid", MCS96_1B },
263  { "invalid", MCS96_1B },
264  { "ljmp", MCS96_3B },
265  { "invalid", MCS96_1B },
266  { "invalid", MCS96_1B },
267  { "invalid", MCS96_1B },
268  { "invalid", MCS96_1B },
269  { "invalid", MCS96_1B },
270  { "invalid", MCS96_1B },
271  { "invalid", MCS96_1B },
272  { "lcall", MCS96_3B }, // 0xef
273  { "ret", MCS96_1B },
274  { "invalid", MCS96_1B },
275  { "pushf", MCS96_1B },
276  { "popf", MCS96_1B },
277  { "invalid", MCS96_1B },
278  { "invalid", MCS96_1B },
279  { "invalid", MCS96_1B },
280  { "trap", MCS96_1B },
281  { "clrc", MCS96_1B },
282  { "setc", MCS96_1B },
283  { "di", MCS96_1B },
284  { "ei", MCS96_1B },
285  { "clrvt", MCS96_1B },
286  { "nop", MCS96_1B },
287  { "invalid", MCS96_1B },
288  { "rst", MCS96_1B }
289 };
290 
291 static const char *mcs96_fe_op[] = { "mul", "mulb", "mul", "mulb", "div", "divb", "invalid", "invalid" };
292 // in theory these invalids can never happen
uint32_t ut32
#define MCS96_FE
Definition: mcs96.h:29
#define MCS96_3B
Definition: mcs96.h:14
#define MCS96_3OP
Definition: mcs96.h:23
#define MCS96_2OP
Definition: mcs96.h:22
static const char * mcs96_fe_op[]
Definition: mcs96.h:291
#define MCS96_REG_8
Definition: mcs96.h:27
#define MCS96_4B
Definition: mcs96.h:15
#define MCS96_4B_OR_5B
Definition: mcs96.h:19
#define MCS96_5B
Definition: mcs96.h:16
struct mcs96_op_t Mcs96Op
#define MCS96_5B_OR_6B
Definition: mcs96.h:20
#define MCS96_1B
Definition: mcs96.h:12
#define MCS96_3B_OR_4B
Definition: mcs96.h:18
#define MCS96_2B
Definition: mcs96.h:13
static Mcs96Op mcs96_op[]
Definition: mcs96.h:31
const char * ins
Definition: mcs96.h:8
const ut32 type
Definition: mcs96.h:9