1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */
2*9a0e4156SSadaf Ebrahimi /* M680X Backend by Wolfgang Schwotzer <[email protected]> 2017 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_M680X
5*9a0e4156SSadaf Ebrahimi #include <stdio.h>
6*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
7*9a0e4156SSadaf Ebrahimi #include <string.h>
8*9a0e4156SSadaf Ebrahimi #include <capstone/platform.h>
9*9a0e4156SSadaf Ebrahimi
10*9a0e4156SSadaf Ebrahimi #include "../../MCInst.h"
11*9a0e4156SSadaf Ebrahimi #include "../../SStream.h"
12*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h"
13*9a0e4156SSadaf Ebrahimi #include "../../utils.h"
14*9a0e4156SSadaf Ebrahimi #include "M680XInstPrinter.h"
15*9a0e4156SSadaf Ebrahimi #include "M680XDisassembler.h"
16*9a0e4156SSadaf Ebrahimi #include "M680XDisassemblerInternals.h"
17*9a0e4156SSadaf Ebrahimi
18*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
19*9a0e4156SSadaf Ebrahimi static const char s_reg_names[][10] = {
20*9a0e4156SSadaf Ebrahimi "<invalid>", "a", "b", "e", "f", "0", "d", "w", "cc", "dp", "md",
21*9a0e4156SSadaf Ebrahimi "hx", "h", "x", "y", "s", "u", "v", "q", "pc", "tmp2", "tmp3",
22*9a0e4156SSadaf Ebrahimi };
23*9a0e4156SSadaf Ebrahimi
24*9a0e4156SSadaf Ebrahimi static const char s_instruction_names[][6] = {
25*9a0e4156SSadaf Ebrahimi "invld", "aba", "abx", "aby", "adc", "adca", "adcb", "adcd", "adcr",
26*9a0e4156SSadaf Ebrahimi "add", "adda", "addb", "addd", "adde", "addf", "addr", "addw",
27*9a0e4156SSadaf Ebrahimi "aim", "ais", "aix", "and", "anda", "andb", "andcc", "andd", "andr",
28*9a0e4156SSadaf Ebrahimi "asl", "asla", "aslb", "asld",
29*9a0e4156SSadaf Ebrahimi "asr", "asra", "asrb", "asrd", "asrx",
30*9a0e4156SSadaf Ebrahimi "band",
31*9a0e4156SSadaf Ebrahimi "bcc", "bclr", "bcs", "beor", "beq", "bge", "bgnd", "bgt", "bhcc",
32*9a0e4156SSadaf Ebrahimi "bhcs", "bhi",
33*9a0e4156SSadaf Ebrahimi "biand", "bieor", "bih", "bil",
34*9a0e4156SSadaf Ebrahimi "bior", "bit", "bita", "bitb", "bitd", "bitmd", "ble", "bls", "blt",
35*9a0e4156SSadaf Ebrahimi "bmc",
36*9a0e4156SSadaf Ebrahimi "bmi", "bms",
37*9a0e4156SSadaf Ebrahimi "bne", "bor", "bpl", "brclr", "brset", "bra", "brn", "bset", "bsr",
38*9a0e4156SSadaf Ebrahimi "bvc", "bvs",
39*9a0e4156SSadaf Ebrahimi "call", "cba", "cbeq", "cbeqa", "cbeqx", "clc", "cli",
40*9a0e4156SSadaf Ebrahimi "clr", "clra", "clrb", "clrd", "clre", "clrf", "clrh", "clrw", "clrx",
41*9a0e4156SSadaf Ebrahimi "clv", "cmp",
42*9a0e4156SSadaf Ebrahimi "cmpa", "cmpb", "cmpd", "cmpe", "cmpf", "cmpr", "cmps", "cmpu", "cmpw",
43*9a0e4156SSadaf Ebrahimi "cmpx", "cmpy",
44*9a0e4156SSadaf Ebrahimi "com", "coma", "comb", "comd", "come", "comf", "comw", "comx", "cpd",
45*9a0e4156SSadaf Ebrahimi "cphx", "cps", "cpx", "cpy",
46*9a0e4156SSadaf Ebrahimi "cwai", "daa", "dbeq", "dbne", "dbnz", "dbnza", "dbnzx",
47*9a0e4156SSadaf Ebrahimi "dec", "deca", "decb", "decd", "dece", "decf", "decw",
48*9a0e4156SSadaf Ebrahimi "decx", "des", "dex", "dey",
49*9a0e4156SSadaf Ebrahimi "div", "divd", "divq", "ediv", "edivs", "eim", "emacs", "emaxd",
50*9a0e4156SSadaf Ebrahimi "emaxm", "emind", "eminm", "emul", "emuls",
51*9a0e4156SSadaf Ebrahimi "eor", "eora", "eorb", "eord", "eorr", "etbl",
52*9a0e4156SSadaf Ebrahimi "exg", "fdiv", "ibeq", "ibne", "idiv", "idivs", "illgl",
53*9a0e4156SSadaf Ebrahimi "inc", "inca", "incb", "incd", "ince", "incf", "incw", "incx",
54*9a0e4156SSadaf Ebrahimi "ins", "inx", "iny",
55*9a0e4156SSadaf Ebrahimi "jmp", "jsr",
56*9a0e4156SSadaf Ebrahimi "lbcc", "lbcs", "lbeq", "lbge", "lbgt", "lbhi", "lble", "lbls", "lblt",
57*9a0e4156SSadaf Ebrahimi "lbmi", "lbne", "lbpl", "lbra", "lbrn", "lbsr", "lbvc", "lbvs",
58*9a0e4156SSadaf Ebrahimi "lda", "ldaa", "ldab", "ldb", "ldbt", "ldd", "lde", "ldf", "ldhx",
59*9a0e4156SSadaf Ebrahimi "ldmd",
60*9a0e4156SSadaf Ebrahimi "ldq", "lds", "ldu", "ldw", "ldx", "ldy",
61*9a0e4156SSadaf Ebrahimi "leas", "leau", "leax", "leay",
62*9a0e4156SSadaf Ebrahimi "lsl", "lsla", "lslb", "lsld", "lslx",
63*9a0e4156SSadaf Ebrahimi "lsr", "lsra", "lsrb", "lsrd", "lsrw", "lsrx",
64*9a0e4156SSadaf Ebrahimi "maxa", "maxm", "mem", "mina", "minm", "mov", "movb", "movw", "mul",
65*9a0e4156SSadaf Ebrahimi "muld",
66*9a0e4156SSadaf Ebrahimi "neg", "nega", "negb", "negd", "negx",
67*9a0e4156SSadaf Ebrahimi "nop", "nsa", "oim", "ora", "oraa", "orab", "orb", "orcc", "ord", "orr",
68*9a0e4156SSadaf Ebrahimi "psha", "pshb", "pshc", "pshd", "pshh", "pshs", "pshsw", "pshu",
69*9a0e4156SSadaf Ebrahimi "pshuw", "pshx", "pshy",
70*9a0e4156SSadaf Ebrahimi "pula", "pulb", "pulc", "puld", "pulh", "puls", "pulsw", "pulu",
71*9a0e4156SSadaf Ebrahimi "puluw", "pulx", "puly", "rev", "revw",
72*9a0e4156SSadaf Ebrahimi "rol", "rola", "rolb", "rold", "rolw", "rolx",
73*9a0e4156SSadaf Ebrahimi "ror", "rora", "rorb", "rord", "rorw", "rorx",
74*9a0e4156SSadaf Ebrahimi "rsp", "rtc", "rti", "rts", "sba", "sbc", "sbca", "sbcb", "sbcd",
75*9a0e4156SSadaf Ebrahimi "sbcr",
76*9a0e4156SSadaf Ebrahimi "sec", "sei", "sev", "sex", "sexw", "slp", "sta", "staa", "stab", "stb",
77*9a0e4156SSadaf Ebrahimi "stbt", "std", "ste", "stf", "stop", "sthx",
78*9a0e4156SSadaf Ebrahimi "stq", "sts", "stu", "stw", "stx", "sty",
79*9a0e4156SSadaf Ebrahimi "sub", "suba", "subb", "subd", "sube", "subf", "subr", "subw",
80*9a0e4156SSadaf Ebrahimi "swi", "swi2", "swi3",
81*9a0e4156SSadaf Ebrahimi "sync", "tab", "tap", "tax", "tba", "tbeq", "tbl", "tbne", "test",
82*9a0e4156SSadaf Ebrahimi "tfm", "tfr",
83*9a0e4156SSadaf Ebrahimi "tim", "tpa",
84*9a0e4156SSadaf Ebrahimi "tst", "tsta", "tstb", "tstd", "tste", "tstf", "tstw", "tstx",
85*9a0e4156SSadaf Ebrahimi "tsx", "tsy", "txa", "txs", "tys", "wai", "wait", "wav", "wavr",
86*9a0e4156SSadaf Ebrahimi "xgdx", "xgdy",
87*9a0e4156SSadaf Ebrahimi };
88*9a0e4156SSadaf Ebrahimi
89*9a0e4156SSadaf Ebrahimi static name_map s_group_names[] = {
90*9a0e4156SSadaf Ebrahimi { M680X_GRP_INVALID, "<invalid>" },
91*9a0e4156SSadaf Ebrahimi { M680X_GRP_JUMP, "jump" },
92*9a0e4156SSadaf Ebrahimi { M680X_GRP_CALL, "call" },
93*9a0e4156SSadaf Ebrahimi { M680X_GRP_RET, "return" },
94*9a0e4156SSadaf Ebrahimi { M680X_GRP_INT, "interrupt" },
95*9a0e4156SSadaf Ebrahimi { M680X_GRP_IRET, "interrupt_return" },
96*9a0e4156SSadaf Ebrahimi { M680X_GRP_PRIV, "privileged" },
97*9a0e4156SSadaf Ebrahimi { M680X_GRP_BRAREL, "branch_relative" },
98*9a0e4156SSadaf Ebrahimi };
99*9a0e4156SSadaf Ebrahimi #endif
100*9a0e4156SSadaf Ebrahimi
printRegName(cs_struct * handle,SStream * OS,unsigned int reg)101*9a0e4156SSadaf Ebrahimi static void printRegName(cs_struct *handle, SStream *OS, unsigned int reg)
102*9a0e4156SSadaf Ebrahimi {
103*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
104*9a0e4156SSadaf Ebrahimi SStream_concat(OS, handle->reg_name((csh)handle, reg));
105*9a0e4156SSadaf Ebrahimi #endif
106*9a0e4156SSadaf Ebrahimi }
107*9a0e4156SSadaf Ebrahimi
printInstructionName(cs_struct * handle,SStream * OS,unsigned int insn)108*9a0e4156SSadaf Ebrahimi static void printInstructionName(cs_struct *handle, SStream *OS,
109*9a0e4156SSadaf Ebrahimi unsigned int insn)
110*9a0e4156SSadaf Ebrahimi {
111*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
112*9a0e4156SSadaf Ebrahimi SStream_concat(OS, handle->insn_name((csh)handle, insn));
113*9a0e4156SSadaf Ebrahimi #endif
114*9a0e4156SSadaf Ebrahimi }
115*9a0e4156SSadaf Ebrahimi
get_unsigned(int32_t value,int byte_size)116*9a0e4156SSadaf Ebrahimi static uint32_t get_unsigned(int32_t value, int byte_size)
117*9a0e4156SSadaf Ebrahimi {
118*9a0e4156SSadaf Ebrahimi switch (byte_size) {
119*9a0e4156SSadaf Ebrahimi case 1:
120*9a0e4156SSadaf Ebrahimi return (uint32_t)(value & 0xff);
121*9a0e4156SSadaf Ebrahimi
122*9a0e4156SSadaf Ebrahimi case 2:
123*9a0e4156SSadaf Ebrahimi return (uint32_t)(value & 0xffff);
124*9a0e4156SSadaf Ebrahimi
125*9a0e4156SSadaf Ebrahimi default:
126*9a0e4156SSadaf Ebrahimi case 4:
127*9a0e4156SSadaf Ebrahimi return (uint32_t)value;
128*9a0e4156SSadaf Ebrahimi }
129*9a0e4156SSadaf Ebrahimi }
130*9a0e4156SSadaf Ebrahimi
printIncDec(bool isPost,SStream * O,m680x_info * info,cs_m680x_op * op)131*9a0e4156SSadaf Ebrahimi static void printIncDec(bool isPost, SStream *O, m680x_info *info,
132*9a0e4156SSadaf Ebrahimi cs_m680x_op *op)
133*9a0e4156SSadaf Ebrahimi {
134*9a0e4156SSadaf Ebrahimi static const char s_inc_dec[][3] = { "--", "-", "", "+", "++" };
135*9a0e4156SSadaf Ebrahimi
136*9a0e4156SSadaf Ebrahimi if (!op->idx.inc_dec)
137*9a0e4156SSadaf Ebrahimi return;
138*9a0e4156SSadaf Ebrahimi
139*9a0e4156SSadaf Ebrahimi if ((!isPost && !(op->idx.flags & M680X_IDX_POST_INC_DEC)) ||
140*9a0e4156SSadaf Ebrahimi (isPost && (op->idx.flags & M680X_IDX_POST_INC_DEC))) {
141*9a0e4156SSadaf Ebrahimi const char *prePostfix = "";
142*9a0e4156SSadaf Ebrahimi
143*9a0e4156SSadaf Ebrahimi if (info->cpu_type == M680X_CPU_TYPE_CPU12)
144*9a0e4156SSadaf Ebrahimi prePostfix = (op->idx.inc_dec < 0) ? "-" : "+";
145*9a0e4156SSadaf Ebrahimi else if (op->idx.inc_dec >= -2 && (op->idx.inc_dec <= 2)) {
146*9a0e4156SSadaf Ebrahimi prePostfix = (char *)s_inc_dec[op->idx.inc_dec + 2];
147*9a0e4156SSadaf Ebrahimi }
148*9a0e4156SSadaf Ebrahimi
149*9a0e4156SSadaf Ebrahimi SStream_concat(O, prePostfix);
150*9a0e4156SSadaf Ebrahimi }
151*9a0e4156SSadaf Ebrahimi }
152*9a0e4156SSadaf Ebrahimi
printOperand(MCInst * MI,SStream * O,m680x_info * info,cs_m680x_op * op)153*9a0e4156SSadaf Ebrahimi static void printOperand(MCInst *MI, SStream *O, m680x_info *info,
154*9a0e4156SSadaf Ebrahimi cs_m680x_op *op)
155*9a0e4156SSadaf Ebrahimi {
156*9a0e4156SSadaf Ebrahimi switch (op->type) {
157*9a0e4156SSadaf Ebrahimi case M680X_OP_REGISTER:
158*9a0e4156SSadaf Ebrahimi printRegName(MI->csh, O, op->reg);
159*9a0e4156SSadaf Ebrahimi break;
160*9a0e4156SSadaf Ebrahimi
161*9a0e4156SSadaf Ebrahimi case M680X_OP_CONSTANT:
162*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%u", op->const_val);
163*9a0e4156SSadaf Ebrahimi break;
164*9a0e4156SSadaf Ebrahimi
165*9a0e4156SSadaf Ebrahimi case M680X_OP_IMMEDIATE:
166*9a0e4156SSadaf Ebrahimi if (MI->csh->imm_unsigned)
167*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%u",
168*9a0e4156SSadaf Ebrahimi get_unsigned(op->imm, op->size));
169*9a0e4156SSadaf Ebrahimi else
170*9a0e4156SSadaf Ebrahimi SStream_concat(O, "#%d", op->imm);
171*9a0e4156SSadaf Ebrahimi
172*9a0e4156SSadaf Ebrahimi break;
173*9a0e4156SSadaf Ebrahimi
174*9a0e4156SSadaf Ebrahimi case M680X_OP_INDEXED:
175*9a0e4156SSadaf Ebrahimi if (op->idx.flags & M680X_IDX_INDIRECT)
176*9a0e4156SSadaf Ebrahimi SStream_concat(O, "[");
177*9a0e4156SSadaf Ebrahimi
178*9a0e4156SSadaf Ebrahimi if (op->idx.offset_reg != M680X_REG_INVALID)
179*9a0e4156SSadaf Ebrahimi printRegName(MI->csh, O, op->idx.offset_reg);
180*9a0e4156SSadaf Ebrahimi else if (op->idx.offset_bits > 0) {
181*9a0e4156SSadaf Ebrahimi if (op->idx.base_reg == M680X_REG_PC)
182*9a0e4156SSadaf Ebrahimi SStream_concat(O, "$%04X", op->idx.offset_addr);
183*9a0e4156SSadaf Ebrahimi else
184*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%d", op->idx.offset);
185*9a0e4156SSadaf Ebrahimi }
186*9a0e4156SSadaf Ebrahimi else if (op->idx.inc_dec != 0 &&
187*9a0e4156SSadaf Ebrahimi info->cpu_type == M680X_CPU_TYPE_CPU12)
188*9a0e4156SSadaf Ebrahimi SStream_concat(O, "%d", abs(op->idx.inc_dec));
189*9a0e4156SSadaf Ebrahimi
190*9a0e4156SSadaf Ebrahimi if (!(op->idx.flags & M680X_IDX_NO_COMMA))
191*9a0e4156SSadaf Ebrahimi SStream_concat(O, ",");
192*9a0e4156SSadaf Ebrahimi
193*9a0e4156SSadaf Ebrahimi printIncDec(false, O, info, op);
194*9a0e4156SSadaf Ebrahimi
195*9a0e4156SSadaf Ebrahimi printRegName(MI->csh, O, op->idx.base_reg);
196*9a0e4156SSadaf Ebrahimi
197*9a0e4156SSadaf Ebrahimi if (op->idx.base_reg == M680X_REG_PC &&
198*9a0e4156SSadaf Ebrahimi (op->idx.offset_bits > 0))
199*9a0e4156SSadaf Ebrahimi SStream_concat(O, "R");
200*9a0e4156SSadaf Ebrahimi
201*9a0e4156SSadaf Ebrahimi printIncDec(true, O, info, op);
202*9a0e4156SSadaf Ebrahimi
203*9a0e4156SSadaf Ebrahimi if (op->idx.flags & M680X_IDX_INDIRECT)
204*9a0e4156SSadaf Ebrahimi SStream_concat(O, "]");
205*9a0e4156SSadaf Ebrahimi
206*9a0e4156SSadaf Ebrahimi break;
207*9a0e4156SSadaf Ebrahimi
208*9a0e4156SSadaf Ebrahimi case M680X_OP_RELATIVE:
209*9a0e4156SSadaf Ebrahimi SStream_concat(O, "$%04X", op->rel.address);
210*9a0e4156SSadaf Ebrahimi break;
211*9a0e4156SSadaf Ebrahimi
212*9a0e4156SSadaf Ebrahimi case M680X_OP_DIRECT:
213*9a0e4156SSadaf Ebrahimi SStream_concat(O, "$%02X", op->direct_addr);
214*9a0e4156SSadaf Ebrahimi break;
215*9a0e4156SSadaf Ebrahimi
216*9a0e4156SSadaf Ebrahimi case M680X_OP_EXTENDED:
217*9a0e4156SSadaf Ebrahimi if (op->ext.indirect)
218*9a0e4156SSadaf Ebrahimi SStream_concat(O, "[$%04X]", op->ext.address);
219*9a0e4156SSadaf Ebrahimi else {
220*9a0e4156SSadaf Ebrahimi if (op->ext.address < 256) {
221*9a0e4156SSadaf Ebrahimi SStream_concat(O, ">$%04X", op->ext.address);
222*9a0e4156SSadaf Ebrahimi }
223*9a0e4156SSadaf Ebrahimi else {
224*9a0e4156SSadaf Ebrahimi SStream_concat(O, "$%04X", op->ext.address);
225*9a0e4156SSadaf Ebrahimi }
226*9a0e4156SSadaf Ebrahimi }
227*9a0e4156SSadaf Ebrahimi
228*9a0e4156SSadaf Ebrahimi break;
229*9a0e4156SSadaf Ebrahimi
230*9a0e4156SSadaf Ebrahimi default:
231*9a0e4156SSadaf Ebrahimi SStream_concat(O, "<invalid_operand>");
232*9a0e4156SSadaf Ebrahimi break;
233*9a0e4156SSadaf Ebrahimi }
234*9a0e4156SSadaf Ebrahimi }
235*9a0e4156SSadaf Ebrahimi
getDelimiter(m680x_info * info,cs_m680x * m680x)236*9a0e4156SSadaf Ebrahimi static const char *getDelimiter(m680x_info *info, cs_m680x *m680x)
237*9a0e4156SSadaf Ebrahimi {
238*9a0e4156SSadaf Ebrahimi bool indexed = false;
239*9a0e4156SSadaf Ebrahimi int count = 0;
240*9a0e4156SSadaf Ebrahimi int i;
241*9a0e4156SSadaf Ebrahimi
242*9a0e4156SSadaf Ebrahimi if (info->insn == M680X_INS_TFM)
243*9a0e4156SSadaf Ebrahimi return ",";
244*9a0e4156SSadaf Ebrahimi
245*9a0e4156SSadaf Ebrahimi if (m680x->op_count > 1) {
246*9a0e4156SSadaf Ebrahimi for (i = 0; i < m680x->op_count; ++i) {
247*9a0e4156SSadaf Ebrahimi if (m680x->operands[i].type == M680X_OP_INDEXED)
248*9a0e4156SSadaf Ebrahimi indexed = true;
249*9a0e4156SSadaf Ebrahimi
250*9a0e4156SSadaf Ebrahimi if (m680x->operands[i].type != M680X_OP_REGISTER)
251*9a0e4156SSadaf Ebrahimi count++;
252*9a0e4156SSadaf Ebrahimi }
253*9a0e4156SSadaf Ebrahimi }
254*9a0e4156SSadaf Ebrahimi
255*9a0e4156SSadaf Ebrahimi return (indexed && (count >= 1)) ? ";" : ",";
256*9a0e4156SSadaf Ebrahimi };
257*9a0e4156SSadaf Ebrahimi
M680X_printInst(MCInst * MI,SStream * O,void * PrinterInfo)258*9a0e4156SSadaf Ebrahimi void M680X_printInst(MCInst *MI, SStream *O, void *PrinterInfo)
259*9a0e4156SSadaf Ebrahimi {
260*9a0e4156SSadaf Ebrahimi m680x_info *info = (m680x_info *)PrinterInfo;
261*9a0e4156SSadaf Ebrahimi cs_m680x *m680x = &info->m680x;
262*9a0e4156SSadaf Ebrahimi cs_detail *detail = MI->flat_insn->detail;
263*9a0e4156SSadaf Ebrahimi int suppress_operands = 0;
264*9a0e4156SSadaf Ebrahimi const char *delimiter = getDelimiter(info, m680x);
265*9a0e4156SSadaf Ebrahimi int i;
266*9a0e4156SSadaf Ebrahimi
267*9a0e4156SSadaf Ebrahimi if (detail != NULL)
268*9a0e4156SSadaf Ebrahimi memcpy(&detail->m680x, m680x, sizeof(cs_m680x));
269*9a0e4156SSadaf Ebrahimi
270*9a0e4156SSadaf Ebrahimi if (info->insn == M680X_INS_INVLD || info->insn == M680X_INS_ILLGL) {
271*9a0e4156SSadaf Ebrahimi if (m680x->op_count)
272*9a0e4156SSadaf Ebrahimi SStream_concat(O, "fcb $%02X", m680x->operands[0].imm);
273*9a0e4156SSadaf Ebrahimi else
274*9a0e4156SSadaf Ebrahimi SStream_concat(O, "fcb $<unknown>");
275*9a0e4156SSadaf Ebrahimi
276*9a0e4156SSadaf Ebrahimi return;
277*9a0e4156SSadaf Ebrahimi }
278*9a0e4156SSadaf Ebrahimi
279*9a0e4156SSadaf Ebrahimi printInstructionName(MI->csh, O, info->insn);
280*9a0e4156SSadaf Ebrahimi SStream_concat(O, " ");
281*9a0e4156SSadaf Ebrahimi
282*9a0e4156SSadaf Ebrahimi if ((m680x->flags & M680X_FIRST_OP_IN_MNEM) != 0)
283*9a0e4156SSadaf Ebrahimi suppress_operands++;
284*9a0e4156SSadaf Ebrahimi
285*9a0e4156SSadaf Ebrahimi if ((m680x->flags & M680X_SECOND_OP_IN_MNEM) != 0)
286*9a0e4156SSadaf Ebrahimi suppress_operands++;
287*9a0e4156SSadaf Ebrahimi
288*9a0e4156SSadaf Ebrahimi for (i = 0; i < m680x->op_count; ++i) {
289*9a0e4156SSadaf Ebrahimi if (i >= suppress_operands) {
290*9a0e4156SSadaf Ebrahimi printOperand(MI, O, info, &m680x->operands[i]);
291*9a0e4156SSadaf Ebrahimi
292*9a0e4156SSadaf Ebrahimi if ((i + 1) != m680x->op_count)
293*9a0e4156SSadaf Ebrahimi SStream_concat(O, delimiter);
294*9a0e4156SSadaf Ebrahimi }
295*9a0e4156SSadaf Ebrahimi }
296*9a0e4156SSadaf Ebrahimi }
297*9a0e4156SSadaf Ebrahimi
M680X_reg_name(csh handle,unsigned int reg)298*9a0e4156SSadaf Ebrahimi const char *M680X_reg_name(csh handle, unsigned int reg)
299*9a0e4156SSadaf Ebrahimi {
300*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
301*9a0e4156SSadaf Ebrahimi
302*9a0e4156SSadaf Ebrahimi if (reg >= ARR_SIZE(s_reg_names))
303*9a0e4156SSadaf Ebrahimi return NULL;
304*9a0e4156SSadaf Ebrahimi
305*9a0e4156SSadaf Ebrahimi return s_reg_names[(int)reg];
306*9a0e4156SSadaf Ebrahimi #else
307*9a0e4156SSadaf Ebrahimi return NULL;
308*9a0e4156SSadaf Ebrahimi #endif
309*9a0e4156SSadaf Ebrahimi }
310*9a0e4156SSadaf Ebrahimi
M680X_insn_name(csh handle,unsigned int id)311*9a0e4156SSadaf Ebrahimi const char *M680X_insn_name(csh handle, unsigned int id)
312*9a0e4156SSadaf Ebrahimi {
313*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
314*9a0e4156SSadaf Ebrahimi
315*9a0e4156SSadaf Ebrahimi if (id >= ARR_SIZE(s_instruction_names))
316*9a0e4156SSadaf Ebrahimi return NULL;
317*9a0e4156SSadaf Ebrahimi else
318*9a0e4156SSadaf Ebrahimi return s_instruction_names[(int)id];
319*9a0e4156SSadaf Ebrahimi
320*9a0e4156SSadaf Ebrahimi #else
321*9a0e4156SSadaf Ebrahimi return NULL;
322*9a0e4156SSadaf Ebrahimi #endif
323*9a0e4156SSadaf Ebrahimi }
324*9a0e4156SSadaf Ebrahimi
M680X_group_name(csh handle,unsigned int id)325*9a0e4156SSadaf Ebrahimi const char *M680X_group_name(csh handle, unsigned int id)
326*9a0e4156SSadaf Ebrahimi {
327*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
328*9a0e4156SSadaf Ebrahimi return id2name(s_group_names, ARR_SIZE(s_group_names), id);
329*9a0e4156SSadaf Ebrahimi #else
330*9a0e4156SSadaf Ebrahimi return NULL;
331*9a0e4156SSadaf Ebrahimi #endif
332*9a0e4156SSadaf Ebrahimi }
333*9a0e4156SSadaf Ebrahimi
M680X_instprinter_init(cs_struct * ud)334*9a0e4156SSadaf Ebrahimi cs_err M680X_instprinter_init(cs_struct *ud)
335*9a0e4156SSadaf Ebrahimi {
336*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET
337*9a0e4156SSadaf Ebrahimi
338*9a0e4156SSadaf Ebrahimi if (M680X_REG_ENDING != ARR_SIZE(s_reg_names)) {
339*9a0e4156SSadaf Ebrahimi fprintf(stderr, "Internal error: Size mismatch in enum "
340*9a0e4156SSadaf Ebrahimi "m680x_reg and s_reg_names\n");
341*9a0e4156SSadaf Ebrahimi
342*9a0e4156SSadaf Ebrahimi return CS_ERR_MODE;
343*9a0e4156SSadaf Ebrahimi }
344*9a0e4156SSadaf Ebrahimi
345*9a0e4156SSadaf Ebrahimi if (M680X_INS_ENDING != ARR_SIZE(s_instruction_names)) {
346*9a0e4156SSadaf Ebrahimi fprintf(stderr, "Internal error: Size mismatch in enum "
347*9a0e4156SSadaf Ebrahimi "m680x_insn and s_instruction_names\n");
348*9a0e4156SSadaf Ebrahimi
349*9a0e4156SSadaf Ebrahimi return CS_ERR_MODE;
350*9a0e4156SSadaf Ebrahimi }
351*9a0e4156SSadaf Ebrahimi
352*9a0e4156SSadaf Ebrahimi if (M680X_GRP_ENDING != ARR_SIZE(s_group_names)) {
353*9a0e4156SSadaf Ebrahimi fprintf(stderr, "Internal error: Size mismatch in enum "
354*9a0e4156SSadaf Ebrahimi "m680x_group_type and s_group_names\n");
355*9a0e4156SSadaf Ebrahimi
356*9a0e4156SSadaf Ebrahimi return CS_ERR_MODE;
357*9a0e4156SSadaf Ebrahimi }
358*9a0e4156SSadaf Ebrahimi
359*9a0e4156SSadaf Ebrahimi #endif
360*9a0e4156SSadaf Ebrahimi
361*9a0e4156SSadaf Ebrahimi return CS_ERR_OK;
362*9a0e4156SSadaf Ebrahimi }
363*9a0e4156SSadaf Ebrahimi
364*9a0e4156SSadaf Ebrahimi #endif
365*9a0e4156SSadaf Ebrahimi
366