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