1*9a0e4156SSadaf Ebrahimi /* Capstone testing regression */
2*9a0e4156SSadaf Ebrahimi /* By Do Minh Tuan <[email protected]>, 02-2019 */
3*9a0e4156SSadaf Ebrahimi
4*9a0e4156SSadaf Ebrahimi
5*9a0e4156SSadaf Ebrahimi #include "factory.h"
6*9a0e4156SSadaf Ebrahimi
get_am_name(mos65xx_address_mode mode)7*9a0e4156SSadaf Ebrahimi static const char *get_am_name(mos65xx_address_mode mode)
8*9a0e4156SSadaf Ebrahimi {
9*9a0e4156SSadaf Ebrahimi switch(mode) {
10*9a0e4156SSadaf Ebrahimi default:
11*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_NONE:
12*9a0e4156SSadaf Ebrahimi return "No address mode";
13*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_IMP:
14*9a0e4156SSadaf Ebrahimi return "implied addressing (no addressing mode)";
15*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ACC:
16*9a0e4156SSadaf Ebrahimi return "accumulator addressing";
17*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ABS:
18*9a0e4156SSadaf Ebrahimi return "absolute addressing";
19*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ZP:
20*9a0e4156SSadaf Ebrahimi return "zeropage addressing";
21*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_IMM:
22*9a0e4156SSadaf Ebrahimi return "8 Bit immediate value";
23*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ABSX:
24*9a0e4156SSadaf Ebrahimi return "indexed absolute addressing by the X index register";
25*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ABSY:
26*9a0e4156SSadaf Ebrahimi return "indexed absolute addressing by the Y index register";
27*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_INDX:
28*9a0e4156SSadaf Ebrahimi return "indexed indirect addressing by the X index register";
29*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_INDY:
30*9a0e4156SSadaf Ebrahimi return "indirect indexed addressing by the Y index register";
31*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ZPX:
32*9a0e4156SSadaf Ebrahimi return "indexed zeropage addressing by the X index register";
33*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_ZPY:
34*9a0e4156SSadaf Ebrahimi return "indexed zeropage addressing by the Y index register";
35*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_REL:
36*9a0e4156SSadaf Ebrahimi return "relative addressing used by branches";
37*9a0e4156SSadaf Ebrahimi case MOS65XX_AM_IND:
38*9a0e4156SSadaf Ebrahimi return "absolute indirect addressing";
39*9a0e4156SSadaf Ebrahimi }
40*9a0e4156SSadaf Ebrahimi }
41*9a0e4156SSadaf Ebrahimi
42*9a0e4156SSadaf Ebrahimi
get_detail_mos65xx(csh * handle,cs_mode mode,cs_insn * ins)43*9a0e4156SSadaf Ebrahimi char *get_detail_mos65xx(csh *handle, cs_mode mode, cs_insn *ins)
44*9a0e4156SSadaf Ebrahimi {
45*9a0e4156SSadaf Ebrahimi int i;
46*9a0e4156SSadaf Ebrahimi cs_mos65xx *mos65xx;
47*9a0e4156SSadaf Ebrahimi char *result;
48*9a0e4156SSadaf Ebrahimi
49*9a0e4156SSadaf Ebrahimi result = (char *)malloc(sizeof(char));
50*9a0e4156SSadaf Ebrahimi result[0] = '\0';
51*9a0e4156SSadaf Ebrahimi
52*9a0e4156SSadaf Ebrahimi if (ins->detail == NULL)
53*9a0e4156SSadaf Ebrahimi return result;
54*9a0e4156SSadaf Ebrahimi
55*9a0e4156SSadaf Ebrahimi mos65xx = &(ins->detail->mos65xx);
56*9a0e4156SSadaf Ebrahimi add_str(&result, " ; address mode: %s", get_am_name(mos65xx->am));
57*9a0e4156SSadaf Ebrahimi add_str(&result, " ; modifies flags: %s", mos65xx->modifies_flags ? "true": "false");
58*9a0e4156SSadaf Ebrahimi
59*9a0e4156SSadaf Ebrahimi if (mos65xx->op_count)
60*9a0e4156SSadaf Ebrahimi add_str(&result, " ; op_count: %u", mos65xx->op_count);
61*9a0e4156SSadaf Ebrahimi
62*9a0e4156SSadaf Ebrahimi for (i = 0; i < mos65xx->op_count; i++) {
63*9a0e4156SSadaf Ebrahimi cs_mos65xx_op *op = &(mos65xx->operands[i]);
64*9a0e4156SSadaf Ebrahimi switch((int)op->type) {
65*9a0e4156SSadaf Ebrahimi default:
66*9a0e4156SSadaf Ebrahimi break;
67*9a0e4156SSadaf Ebrahimi case MOS65XX_OP_REG:
68*9a0e4156SSadaf Ebrahimi add_str(&result, " ; operands[%u].type: REG = %s", i, cs_reg_name(*handle, op->reg));
69*9a0e4156SSadaf Ebrahimi break;
70*9a0e4156SSadaf Ebrahimi case MOS65XX_OP_IMM:
71*9a0e4156SSadaf Ebrahimi add_str(&result, " ; operands[%u].type: IMM = 0x%x", i, op->imm);
72*9a0e4156SSadaf Ebrahimi break;
73*9a0e4156SSadaf Ebrahimi case MOS65XX_OP_MEM:
74*9a0e4156SSadaf Ebrahimi add_str(&result, " ; operands[%u].type: MEM = 0x%x", i, op->mem);
75*9a0e4156SSadaf Ebrahimi break;
76*9a0e4156SSadaf Ebrahimi }
77*9a0e4156SSadaf Ebrahimi }
78*9a0e4156SSadaf Ebrahimi return result;
79*9a0e4156SSadaf Ebrahimi }
80