xref: /aosp_15_r20/external/capstone/cstool/cstool_mos65xx.c (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi #include <stdio.h>
2*9a0e4156SSadaf Ebrahimi #include <stdlib.h>
3*9a0e4156SSadaf Ebrahimi 
4*9a0e4156SSadaf Ebrahimi #include <capstone/capstone.h>
5*9a0e4156SSadaf Ebrahimi 
6*9a0e4156SSadaf Ebrahimi void print_string_hex(char *comment, unsigned char *str, size_t len);
7*9a0e4156SSadaf Ebrahimi 
get_am_name(mos65xx_address_mode mode)8*9a0e4156SSadaf Ebrahimi static const char *get_am_name(mos65xx_address_mode mode)
9*9a0e4156SSadaf Ebrahimi {
10*9a0e4156SSadaf Ebrahimi 	switch(mode) {
11*9a0e4156SSadaf Ebrahimi 		default:
12*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_NONE:
13*9a0e4156SSadaf Ebrahimi 			return "No address mode";
14*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMP:
15*9a0e4156SSadaf Ebrahimi 			return "implied addressing (no addressing mode)";
16*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ACC:
17*9a0e4156SSadaf Ebrahimi 			return "accumulator addressing";
18*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABS:
19*9a0e4156SSadaf Ebrahimi 			return "absolute addressing";
20*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZP:
21*9a0e4156SSadaf Ebrahimi 			return "zeropage addressing";
22*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IMM:
23*9a0e4156SSadaf Ebrahimi 			return "8 Bit immediate value";
24*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSX:
25*9a0e4156SSadaf Ebrahimi 			return "indexed absolute addressing by the X index register";
26*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ABSY:
27*9a0e4156SSadaf Ebrahimi 			return "indexed absolute addressing by the Y index register";
28*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDX:
29*9a0e4156SSadaf Ebrahimi 			return "indexed indirect addressing by the X index register";
30*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_INDY:
31*9a0e4156SSadaf Ebrahimi 			return "indirect indexed addressing by the Y index register";
32*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPX:
33*9a0e4156SSadaf Ebrahimi 			return "indexed zeropage addressing by the X index register";
34*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_ZPY:
35*9a0e4156SSadaf Ebrahimi 			return "indexed zeropage addressing by the Y index register";
36*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_REL:
37*9a0e4156SSadaf Ebrahimi 			return "relative addressing used by branches";
38*9a0e4156SSadaf Ebrahimi 		case MOS65XX_AM_IND:
39*9a0e4156SSadaf Ebrahimi 			return "absolute indirect addressing";
40*9a0e4156SSadaf Ebrahimi 	}
41*9a0e4156SSadaf Ebrahimi }
42*9a0e4156SSadaf Ebrahimi 
43*9a0e4156SSadaf Ebrahimi 
print_insn_detail_mos65xx(csh handle,cs_insn * ins)44*9a0e4156SSadaf Ebrahimi void print_insn_detail_mos65xx(csh handle, cs_insn *ins)
45*9a0e4156SSadaf Ebrahimi {
46*9a0e4156SSadaf Ebrahimi 	int i;
47*9a0e4156SSadaf Ebrahimi 	cs_mos65xx *mos65xx;
48*9a0e4156SSadaf Ebrahimi 
49*9a0e4156SSadaf Ebrahimi 	// detail can be NULL on "data" instruction if SKIPDATA option is turned ON
50*9a0e4156SSadaf Ebrahimi 	if (ins->detail == NULL)
51*9a0e4156SSadaf Ebrahimi 		return;
52*9a0e4156SSadaf Ebrahimi 
53*9a0e4156SSadaf Ebrahimi 	mos65xx = &(ins->detail->mos65xx);
54*9a0e4156SSadaf Ebrahimi 	printf("\taddress mode: %s\n", get_am_name(mos65xx->am));
55*9a0e4156SSadaf Ebrahimi 	printf("\tmodifies flags: %s\n", mos65xx->modifies_flags ? "true": "false");
56*9a0e4156SSadaf Ebrahimi 
57*9a0e4156SSadaf Ebrahimi 	if (mos65xx->op_count)
58*9a0e4156SSadaf Ebrahimi 		printf("\top_count: %u\n", mos65xx->op_count);
59*9a0e4156SSadaf Ebrahimi 
60*9a0e4156SSadaf Ebrahimi 	for (i = 0; i < mos65xx->op_count; i++) {
61*9a0e4156SSadaf Ebrahimi 		cs_mos65xx_op *op = &(mos65xx->operands[i]);
62*9a0e4156SSadaf Ebrahimi 		switch((int)op->type) {
63*9a0e4156SSadaf Ebrahimi 			default:
64*9a0e4156SSadaf Ebrahimi 				break;
65*9a0e4156SSadaf Ebrahimi 			case MOS65XX_OP_REG:
66*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: REG = %s\n", i, cs_reg_name(handle, op->reg));
67*9a0e4156SSadaf Ebrahimi 				break;
68*9a0e4156SSadaf Ebrahimi 			case MOS65XX_OP_IMM:
69*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: IMM = 0x%x\n", i, op->imm);
70*9a0e4156SSadaf Ebrahimi 				break;
71*9a0e4156SSadaf Ebrahimi 			case MOS65XX_OP_MEM:
72*9a0e4156SSadaf Ebrahimi 				printf("\t\toperands[%u].type: MEM = 0x%x\n", i, op->mem);
73*9a0e4156SSadaf Ebrahimi 				break;
74*9a0e4156SSadaf Ebrahimi 		}
75*9a0e4156SSadaf Ebrahimi 	}
76*9a0e4156SSadaf Ebrahimi }
77