1*9a0e4156SSadaf Ebrahimi /* Capstone Disassembly Engine */ 2*9a0e4156SSadaf Ebrahimi /* M680X Backend by Wolfgang Schwotzer <[email protected]> 2017 */ 3*9a0e4156SSadaf Ebrahimi 4*9a0e4156SSadaf Ebrahimi #ifdef CAPSTONE_HAS_M680X 5*9a0e4156SSadaf Ebrahimi 6*9a0e4156SSadaf Ebrahimi #include "../../utils.h" 7*9a0e4156SSadaf Ebrahimi #include "../../MCRegisterInfo.h" 8*9a0e4156SSadaf Ebrahimi #include "M680XDisassembler.h" 9*9a0e4156SSadaf Ebrahimi #include "M680XDisassemblerInternals.h" 10*9a0e4156SSadaf Ebrahimi #include "M680XInstPrinter.h" 11*9a0e4156SSadaf Ebrahimi #include "M680XModule.h" 12*9a0e4156SSadaf Ebrahimi M680X_global_init(cs_struct * ud)13*9a0e4156SSadaf Ebrahimics_err M680X_global_init(cs_struct *ud) 14*9a0e4156SSadaf Ebrahimi { 15*9a0e4156SSadaf Ebrahimi m680x_info *info; 16*9a0e4156SSadaf Ebrahimi cs_err errcode; 17*9a0e4156SSadaf Ebrahimi 18*9a0e4156SSadaf Ebrahimi /* Do some validation checks */ 19*9a0e4156SSadaf Ebrahimi errcode = M680X_disassembler_init(ud); 20*9a0e4156SSadaf Ebrahimi 21*9a0e4156SSadaf Ebrahimi if (errcode != CS_ERR_OK) 22*9a0e4156SSadaf Ebrahimi return errcode; 23*9a0e4156SSadaf Ebrahimi 24*9a0e4156SSadaf Ebrahimi errcode = M680X_instprinter_init(ud); 25*9a0e4156SSadaf Ebrahimi 26*9a0e4156SSadaf Ebrahimi if (errcode != CS_ERR_OK) 27*9a0e4156SSadaf Ebrahimi return errcode; 28*9a0e4156SSadaf Ebrahimi 29*9a0e4156SSadaf Ebrahimi // verify if requested mode is valid 30*9a0e4156SSadaf Ebrahimi if (ud->mode & ~(CS_MODE_M680X_6800 | CS_MODE_M680X_6801 | 31*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6805 | CS_MODE_M680X_6808 | 32*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6809 | CS_MODE_M680X_6811 | 33*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6301 | CS_MODE_M680X_6309 | 34*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_CPU12 | CS_MODE_M680X_HCS08)) { 35*9a0e4156SSadaf Ebrahimi // At least one mode is not supported by M680X 36*9a0e4156SSadaf Ebrahimi return CS_ERR_MODE; 37*9a0e4156SSadaf Ebrahimi } 38*9a0e4156SSadaf Ebrahimi 39*9a0e4156SSadaf Ebrahimi if (!(ud->mode & (CS_MODE_M680X_6800 | CS_MODE_M680X_6801 | 40*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6805 | CS_MODE_M680X_6808 | 41*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6809 | CS_MODE_M680X_6811 | 42*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_6301 | CS_MODE_M680X_6309 | 43*9a0e4156SSadaf Ebrahimi CS_MODE_M680X_CPU12 | CS_MODE_M680X_HCS08))) { 44*9a0e4156SSadaf Ebrahimi // At least the cpu type has to be selected. No default. 45*9a0e4156SSadaf Ebrahimi return CS_ERR_MODE; 46*9a0e4156SSadaf Ebrahimi } 47*9a0e4156SSadaf Ebrahimi 48*9a0e4156SSadaf Ebrahimi info = cs_mem_malloc(sizeof(m680x_info)); 49*9a0e4156SSadaf Ebrahimi 50*9a0e4156SSadaf Ebrahimi if (!info) 51*9a0e4156SSadaf Ebrahimi return CS_ERR_MEM; 52*9a0e4156SSadaf Ebrahimi 53*9a0e4156SSadaf Ebrahimi ud->printer = M680X_printInst; 54*9a0e4156SSadaf Ebrahimi ud->printer_info = info; 55*9a0e4156SSadaf Ebrahimi ud->getinsn_info = NULL; 56*9a0e4156SSadaf Ebrahimi ud->disasm = M680X_getInstruction; 57*9a0e4156SSadaf Ebrahimi ud->reg_name = M680X_reg_name; 58*9a0e4156SSadaf Ebrahimi ud->insn_id = M680X_get_insn_id; 59*9a0e4156SSadaf Ebrahimi ud->insn_name = M680X_insn_name; 60*9a0e4156SSadaf Ebrahimi ud->group_name = M680X_group_name; 61*9a0e4156SSadaf Ebrahimi ud->skipdata_size = 1; 62*9a0e4156SSadaf Ebrahimi ud->post_printer = NULL; 63*9a0e4156SSadaf Ebrahimi #ifndef CAPSTONE_DIET 64*9a0e4156SSadaf Ebrahimi ud->reg_access = M680X_reg_access; 65*9a0e4156SSadaf Ebrahimi #endif 66*9a0e4156SSadaf Ebrahimi 67*9a0e4156SSadaf Ebrahimi return CS_ERR_OK; 68*9a0e4156SSadaf Ebrahimi } 69*9a0e4156SSadaf Ebrahimi M680X_option(cs_struct * handle,cs_opt_type type,size_t value)70*9a0e4156SSadaf Ebrahimics_err M680X_option(cs_struct *handle, cs_opt_type type, size_t value) 71*9a0e4156SSadaf Ebrahimi { 72*9a0e4156SSadaf Ebrahimi //TODO 73*9a0e4156SSadaf Ebrahimi return CS_ERR_OK; 74*9a0e4156SSadaf Ebrahimi } 75*9a0e4156SSadaf Ebrahimi 76*9a0e4156SSadaf Ebrahimi #endif 77*9a0e4156SSadaf Ebrahimi 78