1 #ifndef R2_V850_DISASM_H
2 #define R2_V850_DISASM_H
3 
4 #define V850_INSTR_MAXLEN	24
5 
6 #define SEXT5(imm) (((imm) & 0x10) ? (imm) | 0xE0 : (imm))
7 #define SEXT9(imm) (((imm) & 0x100) ? (imm) | 0xFFFFFE00 : (imm))
8 #define SEXT26(imm) (((imm) & 0x2000000) ? (imm) | 0xFC000000 : (imm))
9 
10 enum v850_cmd_opcodes {
11 	V850_MOV	= 0x0,
12 	V850_NOT	= 0x1,
13 	V850_DIVH	= 0x2,
14 	V850_JMP	= 0x3,
15 	V850_SATSUBR	= 0x4,
16 	V850_SATSUB	= 0x5,
17 	V850_SATADD	= 0x6,
18 	V850_MULH	= 0x7,
19 	V850_OR		= 0x8,
20 	V850_XOR	= 0x9,
21 	V850_AND	= 0xA,
22 	V850_TST	= 0xB,
23 	V850_SUBR	= 0xC,
24 	V850_SUB	= 0xD,
25 	V850_ADD	= 0xE,
26 	V850_CMP	= 0xF,
27 	V850_MOV_IMM5	= 0x10,
28 	V850_SATADD_IMM5 = 0x11,
29 	V850_ADD_IMM5	= 0x12,
30 	V850_CMP_IMM5	= 0x13,
31 	V850_SHR_IMM5	= 0x14,
32 	V850_SAR_IMM5	= 0x15,
33 	V850_SHL_IMM5	= 0x16,
34 	V850_MULH_IMM5	= 0x17,
35 	V850_SLDB	= 0x18,
36 	V850_SSTB	= 0x1C,
37 	V850_SLDH	= 0x20,
38 	V850_SSTH	= 0x24,
39 	V850_SLDW	= 0x28,
40 	V850_SSTW	= 0x29,
41 	V850_BCOND	= 0x2C,
42 	V850_BCOND2	= 0x2D,
43 	V850_BCOND3	= 0x2E,
44 	V850_BCOND4	= 0x2F,
45 	V850_ADDI	= 0x30,
46 	V850_MOVEA	= 0x31,
47 	V850_MOVHI	= 0x32,
48 	V850_SATSUBI	= 0x33,
49 	V850_ORI	= 0x34,
50 	V850_XORI	= 0x35,
51 	V850_ANDI	= 0x36,
52 	V850_MULHI	= 0x37,
53 	V850_LDB	= 0x38,
54 	V850_LDHW	= 0x39,
55 	V850_STB	= 0x3A,
56 	V850_STHW	= 0x3B,
57 	V850_JARL1	= 0x3C,
58 	V850_JARL2	= 0x3D,
59 	V850_BIT_MANIP	= 0x3E,
60 	V850_EXT1	= 0x3F,
61 };
62 
63 enum v850_conds {
64 	V850_COND_V		= 0x0, // Overflow
65 	V850_COND_CL	= 0x1, // Carry/Lower
66 	V850_COND_ZE	= 0x2, // Zero/equal
67 	V850_COND_NH	= 0x3, // Not higher
68 	V850_COND_N		= 0x4, // Negative
69 	V850_COND_AL	= 0x5, // Always
70 	V850_COND_LT	= 0x6, // Less than signed
71 	V850_COND_LE	= 0x7, // Less than or equal signed
72 	V850_COND_NV	= 0x8, // No overflow
73 	V850_COND_NL	= 0x9, // No carry / not lower
74 	V850_COND_NC	= 0x9, // No carry / not lower
75 	V850_COND_NE	= 0xA, // Not zero / not equal
76 	V850_COND_NZ	= 0xA, // Not zero / not equal
77 	V850_COND_H		= 0xB, // Higher/Greater than
78 	V850_COND_P		= 0xC, // Positive / not sign
79 	V850_COND_NS	= 0xC, // Positive / not sign
80 	V850_COND_SA	= 0xD, // Saturated
81 	V850_COND_GE	= 0xE, // Greater than or equal signed
82 	V850_COND_GT	= 0xF, // Greater than signed
83 };
84 
85 enum v850_bit_ops {
86 	V850_BIT_SET1	= 0x0,
87 	V850_BIT_NOT1	= 0x1,
88 	V850_BIT_CLR1	= 0x2,
89 	V850_BIT_TST1	= 0x3,
90 };
91 
92 enum v850_extension1 {
93 	V850_EXT_SETF	= 0x0,
94 	V850_EXT_LDSR	= 0x1,
95 	V850_EXT_STSR	= 0x2,
96 	V850_EXT_UNDEF1	= 0x3,
97 	V850_EXT_SHR	= 0x4,
98 	V850_EXT_SAR	= 0x5,
99 	V850_EXT_SHL	= 0x6,
100 	V850_EXT_UNDEF2	= 0x7,
101 	V850_EXT_TRAP	= 0x8,
102 	V850_EXT_HALT	= 0x9,
103 	V850_EXT_RETI	= 0xa,
104 	V850_EXT_EXT2	= 0xb,
105 };
106 
107 enum v850_extension2 {
108 	V850_EXT_DI	= 0x0,
109 	V850_EXT_EI	= 0x4,
110 };
111 
112 enum v850_regs {
113 	V850_ZERO = 0x0,
114 	V850_R1 = 0x1,
115 	V850_R2 = 0x2,
116 	V850_SP = 0x3,
117 	V850_GP = 0x4,
118 	V850_TP = 0x5,
119 	V850_R6 = 0x6,
120 	V850_R7 = 0x7,
121 	V850_R8 = 0x8,
122 	V850_R9 = 0x9,
123 	V850_R10 = 0xA,
124 	V850_R11 = 0xB,
125 	V850_R12 = 0xC,
126 	V850_R13 = 0xD,
127 	V850_R14 = 0xE,
128 	V850_R15 = 0xF,
129 	V850_R16 = 0x10,
130 	V850_R17 = 0x11,
131 	V850_R18 = 0x12,
132 	V850_R19 = 0x13,
133 	V850_R20 = 0x14,
134 	V850_R21 = 0x15,
135 	V850_R22 = 0x16,
136 	V850_R23 = 0x17,
137 	V850_R24 = 0x18,
138 	V850_R25 = 0x19,
139 	V850_R26 = 0x1A,
140 	V850_R27 = 0x1B,
141 	V850_R28 = 0x1C,
142 	V850_R29 = 0x1D,
143 	V850_EP = 0x1E,
144 	V850_LP = 0x1F,
145 };
146 
147 enum v850_sysregs {
148 	V850_SREG_EIPC = 0x0,
149 	V850_SREG_EIPCW = 0x1,
150 	V850_SREG_FEPC = 0x2,
151 	V850_SREG_FEPSW = 0x3,
152 	V850_SREG_ECR = 0x4,
153 	V850_SREG_PSW = 0x5,
154 	V850_SREG_CTPC = 0x10,
155 	V850_SREG_CTPSW = 0x11,
156 	V850_SREG_DBPC = 0x12,
157 	V850_SREG_DBPSW = 0x13,
158 	V850_SREG_CTBP = 0x14,
159 	V850_SREG_DIR = 0x15,
160 };
161 
162 enum v850_flags {
163 	V850_FLAG_CY = 1,
164 	V850_FLAG_OV,
165 	V850_FLAG_S,
166 	V850_FLAG_Z,
167 };
168 
169 struct v850_cmd {
170 	ut64 addr;
171 	unsigned type;
172 	char	instr[V850_INSTR_MAXLEN];
173 	char	operands[V850_INSTR_MAXLEN];
174 };
175 
get_opcode(const ut16 instr)176 static inline ut8 get_opcode(const ut16 instr) {
177 	return (instr >> 5) & 0x3F;
178 }
179 
180 // FIXME: XXX: Invalid for extended instruction format 4 (Format XII)!
get_subopcode(const ut16 instr)181 static inline ut8 get_subopcode(const ut16  instr) {
182 	return (instr & 0x7e00000) >> 21;
183 }
184 
get_reg1(const ut16 instr)185 static inline ut8 get_reg1(const ut16 instr) {
186 	return instr & 0x1F;
187 }
188 
get_reg2(const ut16 instr)189 static inline ut8 get_reg2(const ut16 instr) {
190 	return instr >> 11;
191 }
192 
193 int v850_decode_command (const ut8 *instr, int len, struct v850_cmd *cmd);
194 #endif /* R2_V850_DISASM_H */
195