xref: /aosp_15_r20/external/capstone/bindings/python/test_mos65xx.py (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python
2*9a0e4156SSadaf Ebrahimi
3*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Sebastian Macke <Sebastian Macke>
4*9a0e4156SSadaf Ebrahimifrom __future__ import print_function
5*9a0e4156SSadaf Ebrahimifrom capstone import *
6*9a0e4156SSadaf Ebrahimifrom capstone.mos65xx import *
7*9a0e4156SSadaf Ebrahimifrom xprint import to_hex, to_x
8*9a0e4156SSadaf Ebrahimi
9*9a0e4156SSadaf EbrahimiMOS65XX_CODE = b"\x0d\x34\x12\x00\x81\x65\x6c\x01\x00\x85\xFF\x10\x00\x19\x42\x42\x00\x49\x42"
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimiaddress_modes=[
12*9a0e4156SSadaf Ebrahimi    'No address mode',
13*9a0e4156SSadaf Ebrahimi    'implied addressing (no addressing mode)',
14*9a0e4156SSadaf Ebrahimi    'accumulator addressing',
15*9a0e4156SSadaf Ebrahimi    'absolute addressing',
16*9a0e4156SSadaf Ebrahimi    'zeropage addressing',
17*9a0e4156SSadaf Ebrahimi    '8 Bit immediate value',
18*9a0e4156SSadaf Ebrahimi    'indexed absolute addressing by the X index register',
19*9a0e4156SSadaf Ebrahimi    'indexed absolute addressing by the Y index register',
20*9a0e4156SSadaf Ebrahimi    'indexed indirect addressing by the X index register',
21*9a0e4156SSadaf Ebrahimi    'indirect indexed addressing by the Y index register',
22*9a0e4156SSadaf Ebrahimi    'indexed zeropage addressing by the X index register',
23*9a0e4156SSadaf Ebrahimi    'indexed zeropage addressing by the Y index register',
24*9a0e4156SSadaf Ebrahimi    'relative addressing used by branches',
25*9a0e4156SSadaf Ebrahimi    'absolute indirect addressing'
26*9a0e4156SSadaf Ebrahimi];
27*9a0e4156SSadaf Ebrahimi
28*9a0e4156SSadaf Ebrahimi
29*9a0e4156SSadaf Ebrahimidef print_insn_detail(insn):
30*9a0e4156SSadaf Ebrahimi    # print address, mnemonic and operands
31*9a0e4156SSadaf Ebrahimi    print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str))
32*9a0e4156SSadaf Ebrahimi
33*9a0e4156SSadaf Ebrahimi    # "data" instruction generated by SKIPDATA option has no detail
34*9a0e4156SSadaf Ebrahimi    if insn.id == 0:
35*9a0e4156SSadaf Ebrahimi        return
36*9a0e4156SSadaf Ebrahimi    print("\taddress mode: %s" % (address_modes[insn.am]))
37*9a0e4156SSadaf Ebrahimi    print("\tmodifies flags: %s" % ('true' if insn.modifies_flags != 0 else 'false'))
38*9a0e4156SSadaf Ebrahimi    if len(insn.operands) > 0:
39*9a0e4156SSadaf Ebrahimi        print("\top_count: %u" % len(insn.operands))
40*9a0e4156SSadaf Ebrahimi        c = -1
41*9a0e4156SSadaf Ebrahimi        for i in insn.operands:
42*9a0e4156SSadaf Ebrahimi            c += 1
43*9a0e4156SSadaf Ebrahimi            if i.type == MOS65XX_OP_REG:
44*9a0e4156SSadaf Ebrahimi                print("\t\toperands[%u].type: REG = %s" % (c, insn.reg_name(i.reg)))
45*9a0e4156SSadaf Ebrahimi            if i.type == MOS65XX_OP_IMM:
46*9a0e4156SSadaf Ebrahimi                print("\t\toperands[%u].type: IMM = 0x%s" % (c, to_x(i.imm)))
47*9a0e4156SSadaf Ebrahimi            if i.type == MOS65XX_OP_MEM:
48*9a0e4156SSadaf Ebrahimi                print("\t\toperands[%u].type: MEM = 0x%s" % (c, to_x(i.mem)))
49*9a0e4156SSadaf Ebrahimi
50*9a0e4156SSadaf Ebrahimi
51*9a0e4156SSadaf Ebrahimi# ## Test class Cs
52*9a0e4156SSadaf Ebrahimidef test_class():
53*9a0e4156SSadaf Ebrahimi    print("*" * 16)
54*9a0e4156SSadaf Ebrahimi    print("Platform: %s" % "MOS65XX")
55*9a0e4156SSadaf Ebrahimi    print("Code: %s" % to_hex(MOS65XX_CODE))
56*9a0e4156SSadaf Ebrahimi    print("Disasm:")
57*9a0e4156SSadaf Ebrahimi
58*9a0e4156SSadaf Ebrahimi    try:
59*9a0e4156SSadaf Ebrahimi        md = Cs(CS_ARCH_MOS65XX, 0)
60*9a0e4156SSadaf Ebrahimi        md.detail = True
61*9a0e4156SSadaf Ebrahimi        for insn in md.disasm(MOS65XX_CODE, 0x1000):
62*9a0e4156SSadaf Ebrahimi            print_insn_detail(insn)
63*9a0e4156SSadaf Ebrahimi            print()
64*9a0e4156SSadaf Ebrahimi
65*9a0e4156SSadaf Ebrahimi        print("0x%x:\n" % (insn.address + insn.size))
66*9a0e4156SSadaf Ebrahimi    except CsError as e:
67*9a0e4156SSadaf Ebrahimi        print("ERROR: %s" % e)
68*9a0e4156SSadaf Ebrahimi
69*9a0e4156SSadaf Ebrahimi
70*9a0e4156SSadaf Ebrahimiif __name__ == '__main__':
71*9a0e4156SSadaf Ebrahimi    test_class()
72