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