xref: /aosp_15_r20/external/capstone/bindings/python/test_m68k.py (revision 9a0e4156d50a75a99ec4f1653a0e9602a5d45c18)
1*9a0e4156SSadaf Ebrahimi#!/usr/bin/env python
2*9a0e4156SSadaf Ebrahimi
3*9a0e4156SSadaf Ebrahimi# Capstone Python bindings, by Nicolas PLANEL <[email protected]>
4*9a0e4156SSadaf Ebrahimifrom __future__ import print_function
5*9a0e4156SSadaf Ebrahimifrom capstone import *
6*9a0e4156SSadaf Ebrahimifrom capstone.m68k import *
7*9a0e4156SSadaf Ebrahimifrom xprint import to_hex, to_x
8*9a0e4156SSadaf Ebrahimi
9*9a0e4156SSadaf EbrahimiM68K_CODE = b"\x4c\x00\x54\x04\x48\xe7\xe0\x30\x4c\xdf\x0c\x07\xd4\x40\x87\x5a\x4e\x71\x02\xb4\xc0\xde\xc0\xde\x5c\x00\x1d\x80\x71\x12\x01\x23\xf2\x3c\x44\x22\x40\x49\x0e\x56\x54\xc5\xf2\x3c\x44\x00\x44\x7a\x00\x00\xf2\x00\x0a\x28\x4e\xb9\x00\x00\x00\x12\x4e\x75"
10*9a0e4156SSadaf Ebrahimi
11*9a0e4156SSadaf Ebrahimiall_tests = (
12*9a0e4156SSadaf Ebrahimi        (CS_ARCH_M68K, CS_MODE_BIG_ENDIAN | CS_MODE_M68K_040, M68K_CODE, "M68K"),
13*9a0e4156SSadaf Ebrahimi)
14*9a0e4156SSadaf Ebrahimi
15*9a0e4156SSadaf Ebrahimis_addressing_modes = {
16*9a0e4156SSadaf Ebrahimi	0:  "<invalid mode>",
17*9a0e4156SSadaf Ebrahimi
18*9a0e4156SSadaf Ebrahimi	1:  "Register Direct - Data",
19*9a0e4156SSadaf Ebrahimi	2:  "Register Direct - Address",
20*9a0e4156SSadaf Ebrahimi
21*9a0e4156SSadaf Ebrahimi	3:  "Register Indirect - Address",
22*9a0e4156SSadaf Ebrahimi	4:  "Register Indirect - Address with Postincrement",
23*9a0e4156SSadaf Ebrahimi	5:  "Register Indirect - Address with Predecrement",
24*9a0e4156SSadaf Ebrahimi	6:  "Register Indirect - Address with Displacement",
25*9a0e4156SSadaf Ebrahimi
26*9a0e4156SSadaf Ebrahimi	7:  "Address Register Indirect With Index - 8-bit displacement",
27*9a0e4156SSadaf Ebrahimi	8:  "Address Register Indirect With Index - Base displacement",
28*9a0e4156SSadaf Ebrahimi
29*9a0e4156SSadaf Ebrahimi	9:  "Memory indirect - Postindex",
30*9a0e4156SSadaf Ebrahimi	10: "Memory indirect - Preindex",
31*9a0e4156SSadaf Ebrahimi
32*9a0e4156SSadaf Ebrahimi	11: "Program Counter Indirect - with Displacement",
33*9a0e4156SSadaf Ebrahimi
34*9a0e4156SSadaf Ebrahimi	12: "Program Counter Indirect with Index - with 8-Bit Displacement",
35*9a0e4156SSadaf Ebrahimi	13: "Program Counter Indirect with Index - with Base Displacement",
36*9a0e4156SSadaf Ebrahimi
37*9a0e4156SSadaf Ebrahimi	14: "Program Counter Memory Indirect - Postindexed",
38*9a0e4156SSadaf Ebrahimi	15: "Program Counter Memory Indirect - Preindexed",
39*9a0e4156SSadaf Ebrahimi
40*9a0e4156SSadaf Ebrahimi	16: "Absolute Data Addressing  - Short",
41*9a0e4156SSadaf Ebrahimi	17: "Absolute Data Addressing  - Long",
42*9a0e4156SSadaf Ebrahimi	18: "Immediate value",
43*9a0e4156SSadaf Ebrahimi
44*9a0e4156SSadaf Ebrahimi    19: "Branch Displacement",
45*9a0e4156SSadaf Ebrahimi}
46*9a0e4156SSadaf Ebrahimi
47*9a0e4156SSadaf Ebrahimidef print_read_write_regs(insn):
48*9a0e4156SSadaf Ebrahimi    for m in insn.regs_read:
49*9a0e4156SSadaf Ebrahimi        print("\treading from reg: %s" % insn.reg_name(m))
50*9a0e4156SSadaf Ebrahimi
51*9a0e4156SSadaf Ebrahimi    for m in insn.regs_write:
52*9a0e4156SSadaf Ebrahimi        print("\twriting to reg:   %s" % insn.reg_name(m))
53*9a0e4156SSadaf Ebrahimi
54*9a0e4156SSadaf Ebrahimidef print_insn_detail(insn):
55*9a0e4156SSadaf Ebrahimi    if len(insn.operands) > 0:
56*9a0e4156SSadaf Ebrahimi        print("\top_count: %u" % (len(insn.operands)))
57*9a0e4156SSadaf Ebrahimi        print("\tgroups_count: %u" % len(insn.groups))
58*9a0e4156SSadaf Ebrahimi
59*9a0e4156SSadaf Ebrahimi    print_read_write_regs(insn)
60*9a0e4156SSadaf Ebrahimi
61*9a0e4156SSadaf Ebrahimi    for i, op in enumerate(insn.operands):
62*9a0e4156SSadaf Ebrahimi        if op.type == M68K_OP_REG:
63*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].type: REG = %s" % (i, insn.reg_name(op.reg)))
64*9a0e4156SSadaf Ebrahimi        elif op.type == M68K_OP_IMM:
65*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].type: IMM = 0x%x" % (i, op.imm & 0xffffffff))
66*9a0e4156SSadaf Ebrahimi        elif op.type == M68K_OP_MEM:
67*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].type: MEM" % (i))
68*9a0e4156SSadaf Ebrahimi            if op.mem.base_reg != M68K_REG_INVALID:
69*9a0e4156SSadaf Ebrahimi                print("\t\t\toperands[%u].mem.base: REG = %s" % (i, insn.reg_name(op.mem.base_reg)))
70*9a0e4156SSadaf Ebrahimi            if op.mem.index_reg != M68K_REG_INVALID:
71*9a0e4156SSadaf Ebrahimi                print("\t\t\toperands[%u].mem.index: REG = %s" % (i, insn.reg_name(op.mem.index_reg)))
72*9a0e4156SSadaf Ebrahimi                mem_index_str = "w"
73*9a0e4156SSadaf Ebrahimi                if op.mem.index_size > 0:
74*9a0e4156SSadaf Ebrahimi                    mem_index_str = "l"
75*9a0e4156SSadaf Ebrahimi                print("\t\t\toperands[%u].mem.index: size = %s" % (i, mem_index_str))
76*9a0e4156SSadaf Ebrahimi            if op.mem.disp != 0:
77*9a0e4156SSadaf Ebrahimi                print("\t\t\toperands[%u].mem.disp: 0x%x" % (i, op.mem.disp))
78*9a0e4156SSadaf Ebrahimi            if op.mem.scale != 0:
79*9a0e4156SSadaf Ebrahimi                print("\t\t\toperands[%u].mem.scale: %d" % (i, op.mem.scale))
80*9a0e4156SSadaf Ebrahimi            print("\t\taddress mode: %s" % (s_addressing_modes[op.address_mode]))
81*9a0e4156SSadaf Ebrahimi        elif op.type == M68K_OP_FP_SINGLE:
82*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].type: FP_SINGLE" % i)
83*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].simm: %f", i, op.simm)
84*9a0e4156SSadaf Ebrahimi        elif op.type == M68K_OP_FP_DOUBLE:
85*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].type: FP_DOUBLE" % i)
86*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].dimm: %lf", i, op.dimm)
87*9a0e4156SSadaf Ebrahimi        elif op.type == M68K_OP_BR_DISP:
88*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].br_disp.disp: 0x%x" % (i, op.br_disp.disp))
89*9a0e4156SSadaf Ebrahimi            print("\t\toperands[%u].br_disp.disp_size: %d" % (i, op.br_disp.disp_size))
90*9a0e4156SSadaf Ebrahimi    print()
91*9a0e4156SSadaf Ebrahimi
92*9a0e4156SSadaf Ebrahimi# ## Test class Cs
93*9a0e4156SSadaf Ebrahimidef test_class():
94*9a0e4156SSadaf Ebrahimi    address = 0x01000
95*9a0e4156SSadaf Ebrahimi    for (arch, mode, code, comment) in all_tests:
96*9a0e4156SSadaf Ebrahimi        print("*" * 16)
97*9a0e4156SSadaf Ebrahimi        print("Platform: %s" % comment)
98*9a0e4156SSadaf Ebrahimi        print("Code: %s " % to_hex(code))
99*9a0e4156SSadaf Ebrahimi        print("Disasm:")
100*9a0e4156SSadaf Ebrahimi
101*9a0e4156SSadaf Ebrahimi        try:
102*9a0e4156SSadaf Ebrahimi            md = Cs(arch, mode)
103*9a0e4156SSadaf Ebrahimi            md.detail = True
104*9a0e4156SSadaf Ebrahimi            last_address = 0
105*9a0e4156SSadaf Ebrahimi            for insn in md.disasm(code, address):
106*9a0e4156SSadaf Ebrahimi                last_address = insn.address + insn.size
107*9a0e4156SSadaf Ebrahimi                print("0x%x:\t%s\t%s" % (insn.address, insn.mnemonic, insn.op_str))
108*9a0e4156SSadaf Ebrahimi                print_insn_detail(insn)
109*9a0e4156SSadaf Ebrahimi            print("0x%x:\n" % (last_address))
110*9a0e4156SSadaf Ebrahimi
111*9a0e4156SSadaf Ebrahimi        except CsError as e:
112*9a0e4156SSadaf Ebrahimi            print("ERROR: %s" % e.__str__())
113*9a0e4156SSadaf Ebrahimi
114*9a0e4156SSadaf Ebrahimiif __name__ == '__main__':
115*9a0e4156SSadaf Ebrahimi    test_class()
116*9a0e4156SSadaf Ebrahimi
117*9a0e4156SSadaf Ebrahimi
118*9a0e4156SSadaf Ebrahimi
119*9a0e4156SSadaf Ebrahimi
120*9a0e4156SSadaf Ebrahimi
121