1 #ifndef R2_EBC_DISAS_H
2 #define R2_EBC_DISAS_H
3 
4 #include <stdint.h>
5 
6 #define EBC_OPCODE_MASK		0x3F
7 #define EBC_MODIFIER_MASK	0xC0
8 #define EBC_OPERAND1_MASK       0x07
9 #define EBC_OPERAND2_MASK       (0x07 << 4)
10 #define EBC_OPERAND1_DIRECT     0x08
11 #define EBC_OPERAND2_DIRECT     0xA0
12 #define EBC_OPERAND1_INDX	0x01
13 #define EBC_OPERAND2_INDX	0x02
14 
15 #define EBC_GET_OPCODE(byte)	(byte & EBC_OPCODE_MASK)
16 
17 #define EBC_INSTR_MAXLEN	32
18 #define EBC_OPERANDS_MAXLEN	32
19 
20 #define EBC_NTH_BIT(n)		(1ULL << n)
21 #define EBC_N_BIT_MASK(n)	(~(~0U << (n)))
22 #define EBC_GET_BIT(v,n)	((v >> n) & 1)
23 
24 #define TEST_BIT(x,n)		(x & (1 << n))
25 
26 enum ebc_opcodes {
27 	EBC_BREAK	= 0x00,
28 	EBC_JMP		= 0x01,
29 	EBC_JMP8	= 0x02,
30 	EBC_CALL	= 0x03,
31 	EBC_RET		= 0x04,
32 	EBC_CMPEQ	= 0x05,
33 	EBC_CMPLTE	= 0x06,
34 	EBC_CMPGTE	= 0x07,
35 	EBC_CMPULTE	= 0x08,
36 	EBC_CMPUGTE	= 0x09,
37 	EBC_NOT		= 0x0A,
38 	EBC_NEG		= 0x0B,
39 	EBC_ADD		= 0x0C,
40 	EBC_SUB		= 0x0D,
41 	EBC_MUL		= 0x0E,
42 	EBC_MULU	= 0x0F,
43 	EBC_DIV		= 0x10,
44 	EBC_DIVU	= 0x11,
45 	EBC_MOD		= 0x12,
46 	EBC_MODU	= 0x13,
47 	EBC_AND		= 0x14,
48 	EBC_OR		= 0x15,
49 	EBC_XOR		= 0x16,
50 	EBC_SHL		= 0x17,
51 	EBC_SHR		= 0x18,
52 	EBC_ASHR	= 0x19,
53 	EBC_EXTNDB	= 0x1A,
54 	EBC_EXTNDW	= 0x1B,
55 	EBC_EXTNDD	= 0x1C,
56 	EBC_MOVBW 	= 0x1D,
57 	EBC_MOVWW 	= 0x1E,
58 	EBC_MOVDW 	= 0x1F,
59 	EBC_MOVQW 	= 0x20,
60 	EBC_MOVBD 	= 0x21,
61 	EBC_MOVWD 	= 0x22,
62 	EBC_MOVDD 	= 0x23,
63 	EBC_MOVQD 	= 0x24,
64 	EBC_MOVSNW	= 0x25,
65 	EBC_MOVSND	= 0x26,
66 	EBC_UNDEFINED	= 0x27,
67 	EBC_MOVQQ 	= 0x28,
68 	EBC_LOADSP	= 0x29,
69 	EBC_STORESP	= 0x2A,
70 	EBC_PUSH	= 0x2B,
71 	EBC_POP		= 0x2C,
72 	EBC_CMPIEQ	= 0x2D,
73 	EBC_CMPILTE	= 0x2E,
74 	EBC_CMPIGTE	= 0x2F,
75 	EBC_CMPIULTE	= 0x30,
76 	EBC_CMPIUGTE	= 0x31,
77 	EBC_MOVNW 	= 0x32,
78 	EBC_MOVND 	= 0x33,
79 	EBC_UNDEFINED2	= 0x34,
80 	EBC_PUSHN	= 0x35,
81 	EBC_POPN	= 0x36,
82 	EBC_MOVI	= 0x37,
83 	EBC_MOVIN	= 0x38,
84 	EBC_MOVREL	= 0x39,
85 	EBC_COMMAND_NUM
86 };
87 
88 
89 typedef struct ebc_command {
90 	char instr[EBC_INSTR_MAXLEN];
91 	char operands[EBC_OPERANDS_MAXLEN];
92 } ebc_command_t;
93 
94 int ebc_decode_command(const uint8_t *instr, ebc_command_t *cmd);
95 
96 #endif /* EBC_DISAS_H */
97