xref: /aosp_15_r20/external/capstone/suite/cstest/src/mos65xx_detail.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
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