rl78-decode.opc revision 1.5 1 1.1 christos /* -*- c -*- */
2 1.3 christos /* Copyright (C) 2012-2015 Free Software Foundation, Inc.
3 1.1 christos Contributed by Red Hat.
4 1.1 christos Written by DJ Delorie.
5 1.1 christos
6 1.1 christos This file is part of the GNU opcodes library.
7 1.1 christos
8 1.1 christos This library is free software; you can redistribute it and/or modify
9 1.1 christos it under the terms of the GNU General Public License as published by
10 1.1 christos the Free Software Foundation; either version 3, or (at your option)
11 1.1 christos any later version.
12 1.1 christos
13 1.1 christos It is distributed in the hope that it will be useful, but WITHOUT
14 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 1.1 christos License for more details.
17 1.1 christos
18 1.1 christos You should have received a copy of the GNU General Public License
19 1.1 christos along with this program; if not, write to the Free Software
20 1.1 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 1.1 christos MA 02110-1301, USA. */
22 1.1 christos
23 1.1 christos #include "sysdep.h"
24 1.1 christos #include <stdio.h>
25 1.1 christos #include <stdlib.h>
26 1.1 christos #include <string.h>
27 1.1 christos #include "ansidecl.h"
28 1.1 christos #include "opcode/rl78.h"
29 1.1 christos
30 1.1 christos static int trace = 0;
31 1.1 christos
32 1.1 christos typedef struct
33 1.1 christos {
34 1.1 christos RL78_Opcode_Decoded * rl78;
35 1.1 christos int (* getbyte)(void *);
36 1.1 christos void * ptr;
37 1.1 christos unsigned char * op;
38 1.1 christos } LocalData;
39 1.1 christos
40 1.1 christos #define ID(x) rl78->id = RLO_##x, rl78->lineno = __LINE__
41 1.1 christos #define OP(n,t,r,a) (rl78->op[n].type = t, \
42 1.1 christos rl78->op[n].reg = r, \
43 1.1 christos rl78->op[n].addend = a )
44 1.1 christos #define OPX(n,t,r1,r2,a) \
45 1.1 christos (rl78->op[n].type = t, \
46 1.1 christos rl78->op[n].reg = r1, \
47 1.1 christos rl78->op[n].reg2 = r2, \
48 1.1 christos rl78->op[n].addend = a )
49 1.1 christos
50 1.1 christos #define W() rl78->size = RL78_Word
51 1.1 christos
52 1.1 christos #define AU ATTRIBUTE_UNUSED
53 1.1 christos #define GETBYTE() (ld->op [ld->rl78->n_bytes++] = ld->getbyte (ld->ptr))
54 1.1 christos #define B ((unsigned long) GETBYTE())
55 1.1 christos
56 1.1 christos #define SYNTAX(x) rl78->syntax = x
57 1.1 christos
58 1.1 christos #define UNSUPPORTED() \
59 1.1 christos rl78->syntax = "*unknown*"
60 1.1 christos
61 1.1 christos #define RB(x) ((x)+RL78_Reg_X)
62 1.1 christos #define RW(x) ((x)+RL78_Reg_AX)
63 1.1 christos
64 1.1 christos #define Fz rl78->flags = RL78_PSW_Z
65 1.1 christos #define Fza rl78->flags = RL78_PSW_Z | RL78_PSW_AC
66 1.1 christos #define Fzc rl78->flags = RL78_PSW_Z | RL78_PSW_CY
67 1.1 christos #define Fzac rl78->flags = RL78_PSW_Z | RL78_PSW_AC | RL78_PSW_CY
68 1.1 christos #define Fa rl78->flags = RL78_PSW_AC
69 1.1 christos #define Fc rl78->flags = RL78_PSW_CY
70 1.1 christos #define Fac rl78->flags = RL78_PSW_AC | RL78_PSW_CY
71 1.1 christos
72 1.1 christos #define IMMU(bytes) immediate (bytes, 0, ld)
73 1.1 christos #define IMMS(bytes) immediate (bytes, 1, ld)
74 1.1 christos
75 1.1 christos static int
76 1.1 christos immediate (int bytes, int sign_extend, LocalData * ld)
77 1.1 christos {
78 1.1 christos unsigned long i = 0;
79 1.1 christos
80 1.1 christos switch (bytes)
81 1.1 christos {
82 1.1 christos case 1:
83 1.1 christos i |= B;
84 1.1 christos if (sign_extend && (i & 0x80))
85 1.1 christos i -= 0x100;
86 1.1 christos break;
87 1.1 christos case 2:
88 1.1 christos i |= B;
89 1.1 christos i |= B << 8;
90 1.1 christos if (sign_extend && (i & 0x8000))
91 1.1 christos i -= 0x10000;
92 1.1 christos break;
93 1.1 christos case 3:
94 1.1 christos i |= B;
95 1.1 christos i |= B << 8;
96 1.1 christos i |= B << 16;
97 1.1 christos if (sign_extend && (i & 0x800000))
98 1.1 christos i -= 0x1000000;
99 1.1 christos break;
100 1.1 christos default:
101 1.1 christos fprintf (stderr, "Programmer error: immediate() called with invalid byte count %d\n", bytes);
102 1.1 christos abort();
103 1.1 christos }
104 1.1 christos return i;
105 1.1 christos }
106 1.1 christos
107 1.1 christos #define DC(c) OP (0, RL78_Operand_Immediate, 0, c)
108 1.1 christos #define DR(r) OP (0, RL78_Operand_Register, RL78_Reg_##r, 0)
109 1.1 christos #define DRB(r) OP (0, RL78_Operand_Register, RB(r), 0)
110 1.1 christos #define DRW(r) OP (0, RL78_Operand_Register, RW(r), 0)
111 1.1 christos #define DM(r,a) OP (0, RL78_Operand_Indirect, RL78_Reg_##r, a)
112 1.1 christos #define DM2(r1,r2,a) OPX (0, RL78_Operand_Indirect, RL78_Reg_##r1, RL78_Reg_##r2, a)
113 1.1 christos #define DE() rl78->op[0].use_es = 1
114 1.1 christos #define DB(b) set_bit (rl78->op, b)
115 1.1 christos #define DCY() DR(PSW); DB(0)
116 1.1 christos #define DPUSH() OP (0, RL78_Operand_PreDec, RL78_Reg_SP, 0);
117 1.1 christos
118 1.1 christos #define SC(c) OP (1, RL78_Operand_Immediate, 0, c)
119 1.1 christos #define SR(r) OP (1, RL78_Operand_Register, RL78_Reg_##r, 0)
120 1.1 christos #define SRB(r) OP (1, RL78_Operand_Register, RB(r), 0)
121 1.1 christos #define SRW(r) OP (1, RL78_Operand_Register, RW(r), 0)
122 1.1 christos #define SM(r,a) OP (1, RL78_Operand_Indirect, RL78_Reg_##r, a)
123 1.1 christos #define SM2(r1,r2,a) OPX (1, RL78_Operand_Indirect, RL78_Reg_##r1, RL78_Reg_##r2, a)
124 1.1 christos #define SE() rl78->op[1].use_es = 1
125 1.1 christos #define SB(b) set_bit (rl78->op+1, b)
126 1.1 christos #define SCY() SR(PSW); SB(0)
127 1.1 christos #define COND(c) rl78->op[1].condition = RL78_Condition_##c
128 1.1 christos #define SPOP() OP (1, RL78_Operand_PostInc, RL78_Reg_SP, 0);
129 1.1 christos
130 1.1 christos static void
131 1.1 christos set_bit (RL78_Opcode_Operand *op, int bit)
132 1.1 christos {
133 1.1 christos op->bit_number = bit;
134 1.1 christos switch (op->type) {
135 1.1 christos case RL78_Operand_Register:
136 1.1 christos op->type = RL78_Operand_Bit;
137 1.1 christos break;
138 1.1 christos case RL78_Operand_Indirect:
139 1.1 christos op->type = RL78_Operand_BitIndirect;
140 1.1 christos break;
141 1.1 christos default:
142 1.1 christos break;
143 1.1 christos }
144 1.1 christos }
145 1.1 christos
146 1.1 christos static int
147 1.1 christos saddr (int x)
148 1.1 christos {
149 1.1 christos if (x < 0x20)
150 1.1 christos return 0xfff00 + x;
151 1.1 christos return 0xffe00 + x;
152 1.1 christos }
153 1.1 christos
154 1.1 christos static int
155 1.1 christos sfr (int x)
156 1.1 christos {
157 1.1 christos return 0xfff00 + x;
158 1.1 christos }
159 1.1 christos
160 1.1 christos #define SADDR saddr (IMMU (1))
161 1.1 christos #define SFR sfr (IMMU (1))
162 1.1 christos
163 1.1 christos int
164 1.1 christos rl78_decode_opcode (unsigned long pc AU,
165 1.1 christos RL78_Opcode_Decoded * rl78,
166 1.1 christos int (* getbyte)(void *),
167 1.5 christos void * ptr,
168 1.5 christos RL78_Dis_Isa isa)
169 1.1 christos {
170 1.1 christos LocalData lds, * ld = &lds;
171 1.1 christos unsigned char op_buf[20] = {0};
172 1.1 christos unsigned char *op = op_buf;
173 1.1 christos int op0, op1;
174 1.1 christos
175 1.1 christos lds.rl78 = rl78;
176 1.1 christos lds.getbyte = getbyte;
177 1.1 christos lds.ptr = ptr;
178 1.1 christos lds.op = op;
179 1.1 christos
180 1.1 christos memset (rl78, 0, sizeof (*rl78));
181 1.1 christos
182 1.1 christos start_again:
183 1.1 christos
184 1.1 christos /* Byte registers, not including A. */
185 1.1 christos /** VARY rba 000 010 011 100 101 110 111 */
186 1.1 christos /* Word registers, not including AX. */
187 1.1 christos /** VARY ra 01 10 11 */
188 1.1 christos
189 1.1 christos /*----------------------------------------------------------------------*/
190 1.1 christos /* ES: prefix */
191 1.1 christos
192 1.1 christos /** 0001 0001 es: */
193 1.1 christos DE(); SE();
194 1.1 christos op ++;
195 1.1 christos pc ++;
196 1.1 christos goto start_again;
197 1.1 christos
198 1.1 christos /*----------------------------------------------------------------------*/
199 1.1 christos
200 1.1 christos /** 0000 1111 add %0, %e!1 */
201 1.1 christos ID(add); DR(A); SM(None, IMMU(2)); Fzac;
202 1.1 christos
203 1.1 christos /** 0000 1101 add %0, %e1 */
204 1.1 christos ID(add); DR(A); SM(HL, 0); Fzac;
205 1.1 christos
206 1.1 christos /** 0110 0001 1000 000 add %0, %e1 */
207 1.1 christos ID(add); DR(A); SM2(HL, B, 0); Fzac;
208 1.1 christos
209 1.5 christos /** 0000 1110 add %0, %ea1 */
210 1.1 christos ID(add); DR(A); SM(HL, IMMU(1)); Fzac;
211 1.1 christos
212 1.1 christos /** 0110 0001 1000 0010 add %0, %e1 */
213 1.1 christos ID(add); DR(A); SM2(HL, C, 0); Fzac;
214 1.1 christos
215 1.1 christos /** 0000 1100 add %0, #%1 */
216 1.1 christos ID(add); DR(A); SC(IMMU(1)); Fzac;
217 1.1 christos
218 1.1 christos /** 0110 0001 0000 1rba add %0, %1 */
219 1.1 christos ID(add); DR(A); SRB(rba); Fzac;
220 1.1 christos
221 1.1 christos /** 0000 1011 add %0, %1 */
222 1.1 christos ID(add); DR(A); SM(None, SADDR); Fzac;
223 1.1 christos
224 1.1 christos /** 0110 0001 0000 0reg add %0, %1 */
225 1.1 christos ID(add); DRB(reg); SR(A); Fzac;
226 1.1 christos
227 1.1 christos /** 0000 1010 add %0, #%1 */
228 1.1 christos ID(add); DM(None, SADDR); SC(IMMU(1)); Fzac;
229 1.1 christos
230 1.1 christos /*----------------------------------------------------------------------*/
231 1.1 christos
232 1.1 christos /** 0001 1111 addc %0, %e!1 */
233 1.1 christos ID(addc); DR(A); SM(None, IMMU(2)); Fzac;
234 1.1 christos
235 1.1 christos /** 0001 1101 addc %0, %e1 */
236 1.1 christos ID(addc); DR(A); SM(HL, 0); Fzac;
237 1.1 christos
238 1.1 christos /** 0110 0001 1001 0000 addc %0, %e1 */
239 1.1 christos ID(addc); DR(A); SM2(HL, B, 0); Fzac;
240 1.1 christos
241 1.1 christos /** 0110 0001 1001 0010 addc %0, %e1 */
242 1.1 christos ID(addc); DR(A); SM2(HL, C, 0); Fzac;
243 1.1 christos
244 1.5 christos /** 0001 1110 addc %0, %ea1 */
245 1.1 christos ID(addc); DR(A); SM(HL, IMMU(1)); Fzac;
246 1.1 christos
247 1.1 christos /** 0001 1100 addc %0, #%1 */
248 1.1 christos ID(addc); DR(A); SC(IMMU(1)); Fzac;
249 1.1 christos
250 1.1 christos /** 0110 0001 0001 1rba addc %0, %1 */
251 1.1 christos ID(addc); DR(A); SRB(rba); Fzac;
252 1.1 christos
253 1.1 christos /** 0110 0001 0001 0reg addc %0, %1 */
254 1.1 christos ID(addc); DRB(reg); SR(A); Fzac;
255 1.1 christos
256 1.1 christos /** 0001 1011 addc %0, %1 */
257 1.1 christos ID(addc); DR(A); SM(None, SADDR); Fzac;
258 1.1 christos
259 1.1 christos /** 0001 1010 addc %0, #%1 */
260 1.1 christos ID(addc); DM(None, SADDR); SC(IMMU(1)); Fzac;
261 1.1 christos
262 1.1 christos /*----------------------------------------------------------------------*/
263 1.1 christos
264 1.1 christos /** 0000 0010 addw %0, %e!1 */
265 1.1 christos ID(add); W(); DR(AX); SM(None, IMMU(2)); Fzac;
266 1.1 christos
267 1.5 christos /** 0110 0001 0000 1001 addw %0, %ea1 */
268 1.1 christos ID(add); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
269 1.1 christos
270 1.1 christos /** 0000 0100 addw %0, #%1 */
271 1.1 christos ID(add); W(); DR(AX); SC(IMMU(2)); Fzac;
272 1.1 christos
273 1.1 christos /** 0000 0rw1 addw %0, %1 */
274 1.1 christos ID(add); W(); DR(AX); SRW(rw); Fzac;
275 1.1 christos
276 1.1 christos /** 0000 0110 addw %0, %1 */
277 1.1 christos ID(add); W(); DR(AX); SM(None, SADDR); Fzac;
278 1.1 christos
279 1.1 christos /** 0001 0000 addw %0, #%1 */
280 1.1 christos ID(add); W(); DR(SP); SC(IMMU(1)); Fzac;
281 1.1 christos
282 1.1 christos /*----------------------------------------------------------------------*/
283 1.1 christos
284 1.1 christos /** 0101 1111 and %0, %e!1 */
285 1.1 christos ID(and); DR(A); SM(None, IMMU(2)); Fz;
286 1.1 christos
287 1.1 christos /** 0101 1101 and %0, %e1 */
288 1.1 christos ID(and); DR(A); SM(HL, 0); Fz;
289 1.1 christos
290 1.1 christos /** 0110 0001 1101 0000 and %0, %e1 */
291 1.1 christos ID(and); DR(A); SM2(HL, B, 0); Fz;
292 1.1 christos
293 1.5 christos /** 0101 1110 and %0, %ea1 */
294 1.1 christos ID(and); DR(A); SM(HL, IMMU(1)); Fz;
295 1.1 christos
296 1.1 christos /** 0110 0001 1101 0010 and %0, %e1 */
297 1.1 christos ID(and); DR(A); SM2(HL, C, 0); Fz;
298 1.1 christos
299 1.1 christos /** 0101 1100 and %0, #%1 */
300 1.1 christos ID(and); DR(A); SC(IMMU(1)); Fz;
301 1.1 christos
302 1.1 christos /** 0110 0001 0101 1rba and %0, %1 */
303 1.1 christos ID(and); DR(A); SRB(rba); Fz;
304 1.1 christos
305 1.1 christos /** 0110 0001 0101 0reg and %0, %1 */
306 1.1 christos ID(and); DRB(reg); SR(A); Fz;
307 1.1 christos
308 1.1 christos /** 0101 1011 and %0, %1 */
309 1.1 christos ID(and); DR(A); SM(None, SADDR); Fz;
310 1.1 christos
311 1.1 christos /** 0101 1010 and %0, #%1 */
312 1.1 christos ID(and); DM(None, SADDR); SC(IMMU(1)); Fz;
313 1.1 christos
314 1.1 christos /*----------------------------------------------------------------------*/
315 1.1 christos
316 1.1 christos /** 0111 0001 1bit 0101 and1 cy, %e1 */
317 1.1 christos ID(and); DCY(); SM(HL, 0); SB(bit);
318 1.1 christos
319 1.1 christos /** 0111 0001 1bit 1101 and1 cy, %1 */
320 1.1 christos ID(and); DCY(); SR(A); SB(bit);
321 1.1 christos
322 1.1 christos /** 0111 0001 0bit 1101 and1 cy, %s1 */
323 1.1 christos ID(and); DCY(); SM(None, SFR); SB(bit);
324 1.1 christos
325 1.1 christos /** 0111 0001 0bit 0101 and1 cy, %s1 */
326 1.1 christos ID(and); DCY(); SM(None, SADDR); SB(bit);
327 1.1 christos
328 1.1 christos /*----------------------------------------------------------------------*/
329 1.1 christos
330 1.1 christos /* Note that the branch insns need to be listed before the shift
331 1.1 christos ones, as "shift count of zero" means "branch insn" */
332 1.1 christos
333 1.1 christos /** 1101 1100 bc $%a0 */
334 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(C);
335 1.1 christos
336 1.1 christos /** 1101 1110 bnc $%a0 */
337 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(NC);
338 1.1 christos
339 1.1 christos /** 0110 0001 1100 0011 bh $%a0 */
340 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SR(None); COND(H);
341 1.1 christos
342 1.1 christos /** 0110 0001 1101 0011 bnh $%a0 */
343 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SR(None); COND(NH);
344 1.1 christos
345 1.1 christos /** 1101 1101 bz $%a0 */
346 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(Z);
347 1.1 christos
348 1.1 christos /** 1101 1111 bnz $%a0 */
349 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+2); SR(None); COND(NZ);
350 1.1 christos
351 1.1 christos /*----------------------------------------------------------------------*/
352 1.1 christos
353 1.1 christos /** 0011 0001 1bit 0101 bf %e1, $%a0 */
354 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(F);
355 1.1 christos
356 1.1 christos /** 0011 0001 0bit 0101 bf %1, $%a0 */
357 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(F);
358 1.1 christos
359 1.1 christos /** 0011 0001 1bit 0100 bf %s1, $%a0 */
360 1.1 christos ID(branch_cond); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(F);
361 1.1 christos
362 1.1 christos /** 0011 0001 0bit 0100 bf %s1, $%a0 */
363 1.1 christos ID(branch_cond); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(F);
364 1.1 christos
365 1.1 christos /*----------------------------------------------------------------------*/
366 1.1 christos
367 1.1 christos /** 1110 1100 br !%!a0 */
368 1.1 christos ID(branch); DC(IMMU(3));
369 1.1 christos
370 1.1 christos /** 1110 1101 br %!a0 */
371 1.1 christos ID(branch); DC(IMMU(2));
372 1.1 christos
373 1.1 christos /** 1110 1110 br $%!a0 */
374 1.1 christos ID(branch); DC(pc+IMMS(2)+3);
375 1.1 christos
376 1.1 christos /** 1110 1111 br $%a0 */
377 1.1 christos ID(branch); DC(pc+IMMS(1)+2);
378 1.1 christos
379 1.1 christos /** 0110 0001 1100 1011 br ax */
380 1.1 christos ID(branch); DR(AX);
381 1.1 christos
382 1.1 christos /*----------------------------------------------------------------------*/
383 1.1 christos
384 1.1 christos /** 1111 1111 brk1 */
385 1.1 christos ID(break);
386 1.1 christos
387 1.1 christos /** 0110 0001 1100 1100 brk */
388 1.1 christos ID(break);
389 1.1 christos
390 1.1 christos /*----------------------------------------------------------------------*/
391 1.1 christos
392 1.1 christos /** 0011 0001 1bit 0011 bt %e1, $%a0 */
393 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(T);
394 1.1 christos
395 1.1 christos /** 0011 0001 0bit 0011 bt %1, $%a0 */
396 1.1 christos ID(branch_cond); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(T);
397 1.1 christos
398 1.1 christos /** 0011 0001 1bit 0010 bt %s1, $%a0 */
399 1.1 christos ID(branch_cond); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
400 1.1 christos
401 1.1 christos /** 0011 0001 0bit 0010 bt %s1, $%a0 */
402 1.1 christos ID(branch_cond); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
403 1.1 christos
404 1.1 christos /*----------------------------------------------------------------------*/
405 1.1 christos
406 1.1 christos /** 0011 0001 1bit 0001 btclr %e1, $%a0 */
407 1.1 christos ID(branch_cond_clear); DC(pc+IMMS(1)+3); SM(HL,0); SB(bit); COND(T);
408 1.1 christos
409 1.1 christos /** 0011 0001 0bit 0001 btclr %1, $%a0 */
410 1.1 christos ID(branch_cond_clear); DC(pc+IMMS(1)+3); SR(A); SB(bit); COND(T);
411 1.1 christos
412 1.1 christos /** 0011 0001 1bit 0000 btclr %s1, $%a0 */
413 1.1 christos ID(branch_cond_clear); SM(None, SFR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
414 1.1 christos
415 1.1 christos /** 0011 0001 0bit 0000 btclr %s1, $%a0 */
416 1.1 christos ID(branch_cond_clear); SM(None, SADDR); SB(bit); DC(pc+IMMS(1)+4); COND(T);
417 1.1 christos
418 1.1 christos /*----------------------------------------------------------------------*/
419 1.1 christos
420 1.1 christos /** 1111 1100 call !%!a0 */
421 1.1 christos ID(call); DC(IMMU(3));
422 1.1 christos
423 1.1 christos /** 1111 1101 call %!a0 */
424 1.1 christos ID(call); DC(IMMU(2));
425 1.1 christos
426 1.1 christos /** 1111 1110 call $%!a0 */
427 1.1 christos ID(call); DC(pc+IMMS(2)+3);
428 1.1 christos
429 1.1 christos /** 0110 0001 11rg 1010 call %0 */
430 1.1 christos ID(call); DRW(rg);
431 1.1 christos
432 1.1 christos /** 0110 0001 1nnn 01mm callt [%x0] */
433 1.1 christos ID(call); DM(None, 0x80 + mm*16 + nnn*2);
434 1.1 christos
435 1.1 christos /*----------------------------------------------------------------------*/
436 1.1 christos
437 1.1 christos /** 0111 0001 0bit 1000 clr1 %e!0 */
438 1.1 christos ID(mov); DM(None, IMMU(2)); DB(bit); SC(0);
439 1.1 christos
440 1.1 christos /** 0111 0001 1bit 0011 clr1 %e0 */
441 1.1 christos ID(mov); DM(HL, 0); DB(bit); SC(0);
442 1.1 christos
443 1.1 christos /** 0111 0001 1bit 1011 clr1 %0 */
444 1.1 christos ID(mov); DR(A); DB(bit); SC(0);
445 1.1 christos
446 1.1 christos /** 0111 0001 1000 1000 clr1 cy */
447 1.1 christos ID(mov); DCY(); SC(0);
448 1.1 christos
449 1.1 christos /** 0111 0001 0bit 1011 clr1 %s0 */
450 1.1 christos op0 = SFR;
451 1.1 christos ID(mov); DM(None, op0); DB(bit); SC(0);
452 1.1 christos if (op0 == RL78_SFR_PSW && bit == 7)
453 1.1 christos rl78->syntax = "di";
454 1.1 christos
455 1.1 christos /** 0111 0001 0bit 0011 clr1 %0 */
456 1.1 christos ID(mov); DM(None, SADDR); DB(bit); SC(0);
457 1.1 christos
458 1.1 christos /*----------------------------------------------------------------------*/
459 1.1 christos
460 1.1 christos /** 1111 0101 clrb %e!0 */
461 1.1 christos ID(mov); DM(None, IMMU(2)); SC(0);
462 1.1 christos
463 1.1 christos /** 1111 00rg clrb %0 */
464 1.1 christos ID(mov); DRB(rg); SC(0);
465 1.1 christos
466 1.1 christos /** 1111 0100 clrb %0 */
467 1.1 christos ID(mov); DM(None, SADDR); SC(0);
468 1.1 christos
469 1.1 christos /*----------------------------------------------------------------------*/
470 1.1 christos
471 1.1 christos /** 1111 0110 clrw %0 */
472 1.1 christos ID(mov); DR(AX); SC(0);
473 1.1 christos
474 1.1 christos /** 1111 0111 clrw %0 */
475 1.1 christos ID(mov); DR(BC); SC(0);
476 1.1 christos
477 1.1 christos /*----------------------------------------------------------------------*/
478 1.1 christos
479 1.1 christos /** 0100 0000 cmp %e!0, #%1 */
480 1.1 christos ID(cmp); DM(None, IMMU(2)); SC(IMMU(1)); Fzac;
481 1.1 christos
482 1.1 christos /** 0100 1010 cmp %0, #%1 */
483 1.1 christos ID(cmp); DM(None, SADDR); SC(IMMU(1)); Fzac;
484 1.1 christos
485 1.1 christos /** 0100 1111 cmp %0, %e!1 */
486 1.1 christos ID(cmp); DR(A); SM(None, IMMU(2)); Fzac;
487 1.1 christos
488 1.1 christos /** 0100 1101 cmp %0, %e1 */
489 1.1 christos ID(cmp); DR(A); SM(HL, 0); Fzac;
490 1.1 christos
491 1.1 christos /** 0110 0001 1100 0000 cmp %0, %e1 */
492 1.1 christos ID(cmp); DR(A); SM2(HL, B, 0); Fzac;
493 1.1 christos
494 1.1 christos /** 0110 0001 1100 0010 cmp %0, %e1 */
495 1.1 christos ID(cmp); DR(A); SM2(HL, C, 0); Fzac;
496 1.1 christos
497 1.5 christos /** 0100 1110 cmp %0, %ea1 */
498 1.1 christos ID(cmp); DR(A); SM(HL, IMMU(1)); Fzac;
499 1.1 christos
500 1.1 christos /** 0100 1100 cmp %0, #%1 */
501 1.1 christos ID(cmp); DR(A); SC(IMMU(1)); Fzac;
502 1.1 christos
503 1.1 christos /** 0110 0001 0100 1rba cmp %0, %1 */
504 1.1 christos ID(cmp); DR(A); SRB(rba); Fzac;
505 1.1 christos
506 1.1 christos /** 0110 0001 0100 0reg cmp %0, %1 */
507 1.1 christos ID(cmp); DRB(reg); SR(A); Fzac;
508 1.1 christos
509 1.1 christos /** 0100 1011 cmp %0, %1 */
510 1.1 christos ID(cmp); DR(A); SM(None, SADDR); Fzac;
511 1.1 christos
512 1.1 christos /*----------------------------------------------------------------------*/
513 1.1 christos
514 1.1 christos /** 1101 0101 cmp0 %e!0 */
515 1.1 christos ID(cmp); DM(None, IMMU(2)); SC(0); Fzac;
516 1.1 christos
517 1.1 christos /** 1101 00rg cmp0 %0 */
518 1.1 christos ID(cmp); DRB(rg); SC(0); Fzac;
519 1.1 christos
520 1.1 christos /** 1101 0100 cmp0 %0 */
521 1.1 christos ID(cmp); DM(None, SADDR); SC(0); Fzac;
522 1.1 christos
523 1.1 christos /*----------------------------------------------------------------------*/
524 1.1 christos
525 1.5 christos /** 0110 0001 1101 1110 cmps %0, %ea1 */
526 1.1 christos ID(cmp); DR(X); SM(HL, IMMU(1)); Fzac;
527 1.1 christos
528 1.1 christos /*----------------------------------------------------------------------*/
529 1.1 christos
530 1.1 christos /** 0100 0010 cmpw %0, %e!1 */
531 1.1 christos ID(cmp); W(); DR(AX); SM(None, IMMU(2)); Fzac;
532 1.1 christos
533 1.5 christos /** 0110 0001 0100 1001 cmpw %0, %ea1 */
534 1.1 christos ID(cmp); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
535 1.1 christos
536 1.1 christos /** 0100 0100 cmpw %0, #%1 */
537 1.1 christos ID(cmp); W(); DR(AX); SC(IMMU(2)); Fzac;
538 1.1 christos
539 1.1 christos /** 0100 0ra1 cmpw %0, %1 */
540 1.1 christos ID(cmp); W(); DR(AX); SRW(ra); Fzac;
541 1.1 christos
542 1.1 christos /** 0100 0110 cmpw %0, %1 */
543 1.1 christos ID(cmp); W(); DR(AX); SM(None, SADDR); Fzac;
544 1.1 christos
545 1.1 christos /*----------------------------------------------------------------------*/
546 1.1 christos
547 1.1 christos /** 1011 0000 dec %e!0 */
548 1.1 christos ID(sub); DM(None, IMMU(2)); SC(1); Fza;
549 1.1 christos
550 1.5 christos /** 0110 0001 0110 1001 dec %ea0 */
551 1.1 christos ID(sub); DM(HL, IMMU(1)); SC(1); Fza;
552 1.1 christos
553 1.1 christos /** 1001 0reg dec %0 */
554 1.1 christos ID(sub); DRB(reg); SC(1); Fza;
555 1.1 christos
556 1.1 christos /** 1011 0100 dec %0 */
557 1.1 christos ID(sub); DM(None, SADDR); SC(1); Fza;
558 1.1 christos
559 1.1 christos /*----------------------------------------------------------------------*/
560 1.1 christos
561 1.1 christos /** 1011 0010 decw %e!0 */
562 1.1 christos ID(sub); W(); DM(None, IMMU(2)); SC(1);
563 1.1 christos
564 1.5 christos /** 0110 0001 1000 1001 decw %ea0 */
565 1.1 christos ID(sub); W(); DM(HL, IMMU(1)); SC(1);
566 1.1 christos
567 1.1 christos /** 1011 0rg1 decw %0 */
568 1.1 christos ID(sub); W(); DRW(rg); SC(1);
569 1.1 christos
570 1.1 christos /** 1011 0110 decw %0 */
571 1.1 christos ID(sub); W(); DM(None, SADDR); SC(1);
572 1.1 christos
573 1.1 christos /*----------------------------------------------------------------------*/
574 1.1 christos
575 1.1 christos /** 0110 0001 1110 1101 halt */
576 1.1 christos ID(halt);
577 1.1 christos
578 1.1 christos /*----------------------------------------------------------------------*/
579 1.1 christos
580 1.1 christos /** 1010 0000 inc %e!0 */
581 1.1 christos ID(add); DM(None, IMMU(2)); SC(1); Fza;
582 1.1 christos
583 1.5 christos /** 0110 0001 0101 1001 inc %ea0 */
584 1.1 christos ID(add); DM(HL, IMMU(1)); SC(1); Fza;
585 1.1 christos
586 1.1 christos /** 1000 0reg inc %0 */
587 1.1 christos ID(add); DRB(reg); SC(1); Fza;
588 1.1 christos
589 1.1 christos /** 1010 0100 inc %0 */
590 1.1 christos ID(add); DM(None, SADDR); SC(1); Fza;
591 1.1 christos
592 1.1 christos /*----------------------------------------------------------------------*/
593 1.1 christos
594 1.1 christos /** 1010 0010 incw %e!0 */
595 1.1 christos ID(add); W(); DM(None, IMMU(2)); SC(1);
596 1.1 christos
597 1.5 christos /** 0110 0001 0111 1001 incw %ea0 */
598 1.1 christos ID(add); W(); DM(HL, IMMU(1)); SC(1);
599 1.1 christos
600 1.1 christos /** 1010 0rg1 incw %0 */
601 1.1 christos ID(add); W(); DRW(rg); SC(1);
602 1.1 christos
603 1.1 christos /** 1010 0110 incw %0 */
604 1.1 christos ID(add); W(); DM(None, SADDR); SC(1);
605 1.1 christos
606 1.1 christos /*----------------------------------------------------------------------*/
607 1.1 christos
608 1.1 christos /** 1100 1111 mov %e!0, #%1 */
609 1.1 christos ID(mov); DM(None, IMMU(2)); SC(IMMU(1));
610 1.1 christos
611 1.1 christos /** 1001 1111 mov %e!0, %1 */
612 1.1 christos ID(mov); DM(None, IMMU(2)); SR(A);
613 1.1 christos
614 1.5 christos /** 1001 1001 mov %e0, %1 */
615 1.1 christos ID(mov); DM(DE, 0); SR(A);
616 1.1 christos
617 1.1 christos /** 1100 1010 mov %e0, #%1 */
618 1.1 christos ID(mov); DM(DE, IMMU(1)); SC(IMMU(1));
619 1.1 christos
620 1.1 christos /** 1001 1010 mov %e0, %1 */
621 1.1 christos ID(mov); DM(DE, IMMU(1)); SR(A);
622 1.1 christos
623 1.5 christos /** 1001 1011 mov %e0, %1 */
624 1.1 christos ID(mov); DM(HL, 0); SR(A);
625 1.1 christos
626 1.1 christos /** 0110 0001 1101 1001 mov %e0, %1 */
627 1.1 christos ID(mov); DM2(HL, B, 0); SR(A);
628 1.1 christos
629 1.5 christos /** 1100 1100 mov %ea0, #%1 */
630 1.1 christos ID(mov); DM(HL, IMMU(1)); SC(IMMU(1));
631 1.1 christos
632 1.5 christos /** 1001 1100 mov %ea0, %1 */
633 1.1 christos ID(mov); DM(HL, IMMU(1)); SR(A);
634 1.1 christos
635 1.1 christos /** 0110 0001 1111 1001 mov %e0, %1 */
636 1.1 christos ID(mov); DM2(HL, C, 0); SR(A);
637 1.1 christos
638 1.1 christos /** 1100 1000 mov %0, #%1 */
639 1.1 christos ID(mov); DM(SP, IMMU(1)); SC(IMMU(1));
640 1.1 christos
641 1.1 christos /** 1001 1000 mov %0, %1 */
642 1.1 christos ID(mov); DM(SP, IMMU(1)); SR(A);
643 1.1 christos
644 1.1 christos /** 1000 1111 mov %0, %e!1 */
645 1.1 christos ID(mov); DR(A); SM(None, IMMU(2));
646 1.1 christos
647 1.1 christos /** 1000 1001 mov %0, %e1 */
648 1.1 christos ID(mov); DR(A); SM(DE, 0);
649 1.1 christos
650 1.1 christos /** 1000 1010 mov %0, %e1 */
651 1.1 christos ID(mov); DR(A); SM(DE, IMMU(1));
652 1.1 christos
653 1.1 christos /** 1000 1011 mov %0, %e1 */
654 1.1 christos ID(mov); DR(A); SM(HL, 0);
655 1.1 christos
656 1.5 christos /** 1000 1100 mov %0, %ea1 */
657 1.1 christos ID(mov); DR(A); SM(HL, IMMU(1));
658 1.1 christos
659 1.1 christos /** 0110 0001 1100 1001 mov %0, %e1 */
660 1.1 christos ID(mov); DR(A); SM2(HL, B, 0);
661 1.1 christos
662 1.1 christos /** 0110 0001 1110 1001 mov %0, %e1 */
663 1.1 christos ID(mov); DR(A); SM2(HL, C, 0);
664 1.1 christos
665 1.1 christos /** 1000 1000 mov %0, %e1 */
666 1.1 christos ID(mov); DR(A); SM(SP, IMMU(1));
667 1.1 christos
668 1.1 christos /** 0101 0reg mov %0, #%1 */
669 1.1 christos ID(mov); DRB(reg); SC(IMMU(1));
670 1.1 christos
671 1.1 christos /** 0110 0rba mov %0, %1 */
672 1.1 christos ID(mov); DR(A); SRB(rba);
673 1.1 christos
674 1.1 christos /** 1000 1110 1111 1101 mov %0, %1 */
675 1.1 christos ID(mov); DR(A); SR(ES);
676 1.1 christos
677 1.1 christos /** 0000 1001 mov %0, %e1 */
678 1.1 christos ID(mov); DR(A); SM(B, IMMU(2));
679 1.1 christos
680 1.1 christos /** 0100 1001 mov %0, %e1 */
681 1.1 christos ID(mov); DR(A); SM(BC, IMMU(2));
682 1.1 christos
683 1.1 christos /** 0010 1001 mov %0, %e1 */
684 1.1 christos ID(mov); DR(A); SM(C, IMMU(2));
685 1.1 christos
686 1.1 christos /** 1000 1110 mov %0, %s1 */
687 1.1 christos ID(mov); DR(A); SM(None, SFR);
688 1.1 christos
689 1.1 christos /** 1000 1101 mov %0, %1 */
690 1.1 christos ID(mov); DR(A); SM(None, SADDR);
691 1.1 christos
692 1.1 christos /** 1110 1001 mov %0, %e!1 */
693 1.1 christos ID(mov); DR(B); SM(None, IMMU(2));
694 1.1 christos
695 1.1 christos /** 0111 0rba mov %0, %1 */
696 1.1 christos ID(mov); DRB(rba); SR(A);
697 1.1 christos
698 1.1 christos /** 1110 1000 mov %0, %1 */
699 1.1 christos ID(mov); DR(B); SM(None, SADDR);
700 1.1 christos
701 1.1 christos /** 1111 1001 mov %0, %e!1 */
702 1.1 christos ID(mov); DR(C); SM(None, IMMU(2));
703 1.1 christos
704 1.1 christos /** 1111 1000 mov %0, %1 */
705 1.1 christos ID(mov); DR(C); SM(None, SADDR);
706 1.1 christos
707 1.1 christos /** 1101 1001 mov %0, %e!1 */
708 1.1 christos ID(mov); DR(X); SM(None, IMMU(2));
709 1.1 christos
710 1.1 christos /** 1101 1000 mov %0, %1 */
711 1.1 christos ID(mov); DR(X); SM(None, SADDR);
712 1.1 christos
713 1.1 christos /** 1001 1110 1111 1100 mov %0, %1 */
714 1.1 christos ID(mov); DR(CS); SR(A);
715 1.1 christos
716 1.1 christos /** 0100 0001 mov %0, #%1 */
717 1.1 christos ID(mov); DR(ES); SC(IMMU(1));
718 1.1 christos
719 1.1 christos /** 1001 1110 1111 1101 mov %0, %1 */
720 1.1 christos ID(mov); DR(ES); SR(A);
721 1.1 christos
722 1.1 christos /** 0110 0001 1011 1000 mov %0, %1 */
723 1.1 christos ID(mov); DR(ES); SM(None, SADDR);
724 1.1 christos
725 1.1 christos /** 0001 1001 mov %e0, #%1 */
726 1.1 christos ID(mov); DM(B, IMMU(2)); SC(IMMU(1));
727 1.1 christos
728 1.1 christos /** 0001 1000 mov %e0, %1 */
729 1.1 christos ID(mov); DM(B, IMMU(2)); SR(A);
730 1.1 christos
731 1.1 christos /** 0011 1001 mov %e0, #%1 */
732 1.1 christos ID(mov); DM(BC, IMMU(2)); SC(IMMU(1));
733 1.1 christos
734 1.1 christos /** 0100 1000 mov %e0, %1 */
735 1.1 christos ID(mov); DM(BC, IMMU(2)); SR(A);
736 1.1 christos
737 1.1 christos /** 0011 1000 mov %e0, #%1 */
738 1.1 christos ID(mov); DM(C, IMMU(2)); SC(IMMU(1));
739 1.1 christos
740 1.1 christos /** 0010 1000 mov %e0, %1 */
741 1.1 christos ID(mov); DM(C, IMMU(2)); SR(A);
742 1.1 christos
743 1.1 christos /** 1100 1101 mov %0, #%1 */
744 1.1 christos ID(mov); DM(None, SADDR); SC(IMMU(1));
745 1.1 christos
746 1.1 christos /** 1001 1101 mov %0, %1 */
747 1.1 christos ID(mov); DM(None, SADDR); SR(A);
748 1.1 christos
749 1.1 christos /** 1100 1110 mov %s0, #%1 */
750 1.1 christos op0 = SFR;
751 1.1 christos op1 = IMMU(1);
752 1.1 christos ID(mov); DM(None, op0); SC(op1);
753 1.5 christos if (op0 == 0xffffb && isa == RL78_ISA_G14)
754 1.1 christos switch (op1)
755 1.1 christos {
756 1.1 christos case 0x01:
757 1.1 christos rl78->syntax = "mulhu"; ID(mulhu);
758 1.1 christos break;
759 1.1 christos case 0x02:
760 1.1 christos rl78->syntax = "mulh"; ID(mulh);
761 1.1 christos break;
762 1.1 christos case 0x03:
763 1.1 christos rl78->syntax = "divhu"; ID(divhu);
764 1.1 christos break;
765 1.1 christos case 0x04:
766 1.1 christos rl78->syntax = "divwu <old-encoding>"; ID(divwu);
767 1.1 christos break;
768 1.1 christos case 0x05:
769 1.1 christos rl78->syntax = "machu"; ID(machu);
770 1.1 christos break;
771 1.1 christos case 0x06:
772 1.1 christos rl78->syntax = "mach"; ID(mach);
773 1.1 christos break;
774 1.1 christos case 0x0b:
775 1.1 christos rl78->syntax = "divwu"; ID(divwu);
776 1.1 christos break;
777 1.1 christos }
778 1.1 christos
779 1.1 christos /** 1001 1110 mov %0, %1 */
780 1.1 christos ID(mov); DM(None, SFR); SR(A);
781 1.1 christos
782 1.1 christos /*----------------------------------------------------------------------*/
783 1.1 christos
784 1.1 christos /** 0111 0001 1bit 0001 mov1 %e0, cy */
785 1.1 christos ID(mov); DM(HL, 0); DB(bit); SCY();
786 1.1 christos
787 1.1 christos /** 0111 0001 1bit 1001 mov1 %e0, cy */
788 1.1 christos ID(mov); DR(A); DB(bit); SCY();
789 1.1 christos
790 1.1 christos /** 0111 0001 1bit 0100 mov1 cy, %e1 */
791 1.1 christos ID(mov); DCY(); SM(HL, 0); SB(bit);
792 1.1 christos
793 1.1 christos /** 0111 0001 1bit 1100 mov1 cy, %e1 */
794 1.1 christos ID(mov); DCY(); SR(A); SB(bit);
795 1.1 christos
796 1.1 christos /** 0111 0001 0bit 0100 mov1 cy, %1 */
797 1.1 christos ID(mov); DCY(); SM(None, SADDR); SB(bit);
798 1.1 christos
799 1.1 christos /** 0111 0001 0bit 1100 mov1 cy, %s1 */
800 1.1 christos ID(mov); DCY(); SM(None, SFR); SB(bit);
801 1.1 christos
802 1.1 christos /** 0111 0001 0bit 0001 mov1 %0, cy */
803 1.1 christos ID(mov); DM(None, SADDR); DB(bit); SCY();
804 1.1 christos
805 1.1 christos /** 0111 0001 0bit 1001 mov1 %s0, cy */
806 1.1 christos ID(mov); DM(None, SFR); DB(bit); SCY();
807 1.1 christos
808 1.1 christos /*----------------------------------------------------------------------*/
809 1.1 christos
810 1.5 christos /** 0110 0001 1100 1110 movs %ea0, %1 */
811 1.1 christos ID(mov); DM(HL, IMMU(1)); SR(X); Fzc;
812 1.1 christos
813 1.1 christos /*----------------------------------------------------------------------*/
814 1.1 christos
815 1.1 christos /** 1011 1111 movw %e!0, %1 */
816 1.1 christos ID(mov); W(); DM(None, IMMU(2)); SR(AX);
817 1.1 christos
818 1.1 christos /** 1011 1001 movw %e0, %1 */
819 1.1 christos ID(mov); W(); DM(DE, 0); SR(AX);
820 1.1 christos
821 1.1 christos /** 1011 1010 movw %e0, %1 */
822 1.1 christos ID(mov); W(); DM(DE, IMMU(1)); SR(AX);
823 1.1 christos
824 1.1 christos /** 1011 1011 movw %e0, %1 */
825 1.1 christos ID(mov); W(); DM(HL, 0); SR(AX);
826 1.1 christos
827 1.5 christos /** 1011 1100 movw %ea0, %1 */
828 1.1 christos ID(mov); W(); DM(HL, IMMU(1)); SR(AX);
829 1.1 christos
830 1.1 christos /** 1011 1000 movw %0, %1 */
831 1.1 christos ID(mov); W(); DM(SP, IMMU(1)); SR(AX);
832 1.1 christos
833 1.1 christos /** 1010 1111 movw %0, %e!1 */
834 1.1 christos ID(mov); W(); DR(AX); SM(None, IMMU(2));
835 1.1 christos
836 1.1 christos
837 1.1 christos /** 1010 1001 movw %0, %e1 */
838 1.1 christos ID(mov); W(); DR(AX); SM(DE, 0);
839 1.1 christos
840 1.1 christos /** 1010 1010 movw %0, %e1 */
841 1.1 christos ID(mov); W(); DR(AX); SM(DE, IMMU(1));
842 1.1 christos
843 1.1 christos /** 1010 1011 movw %0, %e1 */
844 1.1 christos ID(mov); W(); DR(AX); SM(HL, 0);
845 1.1 christos
846 1.5 christos /** 1010 1100 movw %0, %ea1 */
847 1.1 christos ID(mov); W(); DR(AX); SM(HL, IMMU(1));
848 1.1 christos
849 1.1 christos /** 1010 1000 movw %0, %1 */
850 1.1 christos ID(mov); W(); DR(AX); SM(SP, IMMU(1));
851 1.1 christos
852 1.1 christos /** 0011 0rg0 movw %0, #%1 */
853 1.1 christos ID(mov); W(); DRW(rg); SC(IMMU(2));
854 1.1 christos
855 1.1 christos /** 0001 0ra1 movw %0, %1 */
856 1.1 christos ID(mov); W(); DR(AX); SRW(ra);
857 1.1 christos
858 1.1 christos /** 0001 0ra0 movw %0, %1 */
859 1.1 christos ID(mov); W(); DRW(ra); SR(AX);
860 1.1 christos
861 1.1 christos /** 0101 1001 movw %0, %e1 */
862 1.1 christos ID(mov); W(); DR(AX); SM(B, IMMU(2));
863 1.1 christos
864 1.1 christos /** 0110 1001 movw %0, %e1 */
865 1.1 christos ID(mov); W(); DR(AX); SM(C, IMMU(2));
866 1.1 christos
867 1.1 christos /** 0111 1001 movw %0, %e1 */
868 1.1 christos ID(mov); W(); DR(AX); SM(BC, IMMU(2));
869 1.1 christos
870 1.1 christos /** 0101 1000 movw %e0, %1 */
871 1.1 christos ID(mov); W(); DM(B, IMMU(2)); SR(AX);
872 1.1 christos
873 1.1 christos /** 0110 1000 movw %e0, %1 */
874 1.1 christos ID(mov); W(); DM(C, IMMU(2)); SR(AX);
875 1.1 christos
876 1.1 christos /** 0111 1000 movw %e0, %1 */
877 1.1 christos ID(mov); W(); DM(BC, IMMU(2)); SR(AX);
878 1.1 christos
879 1.1 christos /** 1010 1101 movw %0, %1 */
880 1.1 christos ID(mov); W(); DR(AX); SM(None, SADDR);
881 1.1 christos
882 1.1 christos /** 1010 1110 movw %0, %s1 */
883 1.1 christos ID(mov); W(); DR(AX); SM(None, SFR);
884 1.1 christos
885 1.1 christos /** 11ra 1011 movw %0, %e!1 */
886 1.1 christos ID(mov); W(); DRW(ra); SM(None, IMMU(2));
887 1.1 christos
888 1.1 christos /** 11ra 1010 movw %0, %1 */
889 1.1 christos ID(mov); W(); DRW(ra); SM(None, SADDR);
890 1.1 christos
891 1.1 christos /** 1100 1001 movw %0, #%1 */
892 1.1 christos ID(mov); W(); DM(None, SADDR); SC(IMMU(2));
893 1.1 christos
894 1.1 christos /** 1011 1101 movw %0, %1 */
895 1.1 christos ID(mov); W(); DM(None, SADDR); SR(AX);
896 1.1 christos
897 1.1 christos /** 1100 1011 movw %0, #%1 */
898 1.1 christos ID(mov); W(); DM(None, SFR); SC(IMMU(2));
899 1.1 christos
900 1.1 christos /** 1011 1110 movw %0, %1 */
901 1.1 christos ID(mov); W(); DM(None, SFR); SR(AX);
902 1.1 christos
903 1.1 christos /*----------------------------------------------------------------------*/
904 1.1 christos
905 1.1 christos /** 1101 0110 mulu x */
906 1.5 christos if (isa == RL78_ISA_G14)
907 1.5 christos ID(mulu);
908 1.1 christos
909 1.1 christos /*----------------------------------------------------------------------*/
910 1.1 christos
911 1.1 christos /** 0000 0000 nop */
912 1.1 christos ID(nop);
913 1.1 christos
914 1.1 christos /*----------------------------------------------------------------------*/
915 1.1 christos
916 1.1 christos /** 0111 0001 1100 0000 not1 cy */
917 1.1 christos ID(xor); DCY(); SC(1);
918 1.1 christos
919 1.1 christos /*----------------------------------------------------------------------*/
920 1.1 christos
921 1.1 christos /** 1110 0101 oneb %e!0 */
922 1.1 christos ID(mov); DM(None, IMMU(2)); SC(1);
923 1.1 christos
924 1.1 christos /** 1110 00rg oneb %0 */
925 1.1 christos ID(mov); DRB(rg); SC(1);
926 1.1 christos
927 1.1 christos /** 1110 0100 oneb %0 */
928 1.1 christos ID(mov); DM(None, SADDR); SC(1);
929 1.1 christos
930 1.1 christos /*----------------------------------------------------------------------*/
931 1.1 christos
932 1.1 christos /** 1110 0110 onew %0 */
933 1.1 christos ID(mov); DR(AX); SC(1);
934 1.1 christos
935 1.1 christos /** 1110 0111 onew %0 */
936 1.1 christos ID(mov); DR(BC); SC(1);
937 1.1 christos
938 1.1 christos /*----------------------------------------------------------------------*/
939 1.1 christos
940 1.1 christos /** 0110 1111 or %0, %e!1 */
941 1.1 christos ID(or); DR(A); SM(None, IMMU(2)); Fz;
942 1.1 christos
943 1.1 christos /** 0110 1101 or %0, %e1 */
944 1.1 christos ID(or); DR(A); SM(HL, 0); Fz;
945 1.1 christos
946 1.1 christos /** 0110 0001 1110 0000 or %0, %e1 */
947 1.1 christos ID(or); DR(A); SM2(HL, B, 0); Fz;
948 1.1 christos
949 1.5 christos /** 0110 1110 or %0, %ea1 */
950 1.1 christos ID(or); DR(A); SM(HL, IMMU(1)); Fz;
951 1.1 christos
952 1.1 christos /** 0110 0001 1110 0010 or %0, %e1 */
953 1.1 christos ID(or); DR(A); SM2(HL, C, 0); Fz;
954 1.1 christos
955 1.1 christos /** 0110 1100 or %0, #%1 */
956 1.1 christos ID(or); DR(A); SC(IMMU(1)); Fz;
957 1.1 christos
958 1.1 christos /** 0110 0001 0110 1rba or %0, %1 */
959 1.1 christos ID(or); DR(A); SRB(rba); Fz;
960 1.1 christos
961 1.1 christos /** 0110 0001 0110 0reg or %0, %1 */
962 1.1 christos ID(or); DRB(reg); SR(A); Fz;
963 1.1 christos
964 1.1 christos /** 0110 1011 or %0, %1 */
965 1.1 christos ID(or); DR(A); SM(None, SADDR); Fz;
966 1.1 christos
967 1.1 christos /** 0110 1010 or %0, #%1 */
968 1.1 christos ID(or); DM(None, SADDR); SC(IMMU(1)); Fz;
969 1.1 christos
970 1.1 christos /*----------------------------------------------------------------------*/
971 1.1 christos
972 1.1 christos /** 0111 0001 1bit 0110 or1 cy, %e1 */
973 1.1 christos ID(or); DCY(); SM(HL, 0); SB(bit);
974 1.1 christos
975 1.1 christos /** 0111 0001 1bit 1110 or1 cy, %1 */
976 1.1 christos ID(or); DCY(); SR(A); SB(bit);
977 1.1 christos
978 1.1 christos /** 0111 0001 0bit 1110 or1 cy, %s1 */
979 1.1 christos ID(or); DCY(); SM(None, SFR); SB(bit);
980 1.1 christos
981 1.1 christos /** 0111 0001 0bit 0110 or1 cy, %s1 */
982 1.1 christos ID(or); DCY(); SM(None, SADDR); SB(bit);
983 1.1 christos
984 1.1 christos /*----------------------------------------------------------------------*/
985 1.1 christos
986 1.1 christos /** 1100 0rg0 pop %0 */
987 1.1 christos ID(mov); W(); DRW(rg); SPOP();
988 1.1 christos
989 1.1 christos /** 0110 0001 1100 1101 pop %s0 */
990 1.1 christos ID(mov); W(); DR(PSW); SPOP();
991 1.1 christos
992 1.1 christos /*----------------------------------------------------------------------*/
993 1.1 christos
994 1.1 christos /** 1100 0rg1 push %1 */
995 1.1 christos ID(mov); W(); DPUSH(); SRW(rg);
996 1.1 christos
997 1.1 christos /** 0110 0001 1101 1101 push %s1 */
998 1.1 christos ID(mov); W(); DPUSH(); SR(PSW);
999 1.1 christos
1000 1.1 christos /*----------------------------------------------------------------------*/
1001 1.1 christos
1002 1.1 christos /** 1101 0111 ret */
1003 1.1 christos ID(ret);
1004 1.1 christos
1005 1.1 christos /** 0110 0001 1111 1100 reti */
1006 1.1 christos ID(reti);
1007 1.1 christos
1008 1.1 christos /** 0110 0001 1110 1100 retb */
1009 1.1 christos ID(reti);
1010 1.1 christos
1011 1.1 christos /*----------------------------------------------------------------------*/
1012 1.1 christos
1013 1.1 christos /** 0110 0001 1110 1011 rol %0, %1 */
1014 1.1 christos ID(rol); DR(A); SC(1);
1015 1.1 christos
1016 1.1 christos /** 0110 0001 1101 1100 rolc %0, %1 */
1017 1.1 christos ID(rolc); DR(A); SC(1);
1018 1.1 christos
1019 1.1 christos /** 0110 0001 111r 1110 rolwc %0, %1 */
1020 1.1 christos ID(rolc); W(); DRW(r); SC(1);
1021 1.1 christos
1022 1.1 christos /** 0110 0001 1101 1011 ror %0, %1 */
1023 1.1 christos ID(ror); DR(A); SC(1);
1024 1.1 christos
1025 1.1 christos /** 0110 0001 1111 1011 rorc %0, %1 */
1026 1.1 christos ID(rorc); DR(A); SC(1);
1027 1.1 christos
1028 1.1 christos /*----------------------------------------------------------------------*/
1029 1.1 christos
1030 1.1 christos /* Note that the branch insns need to be listed before the shift
1031 1.1 christos ones, as "shift count of zero" means "branch insn" */
1032 1.1 christos
1033 1.1 christos /** 0011 0001 0cnt 1011 sar %0, %1 */
1034 1.1 christos ID(sar); DR(A); SC(cnt);
1035 1.1 christos
1036 1.1 christos /** 0011 0001 wcnt 1111 sarw %0, %1 */
1037 1.1 christos ID(sar); W(); DR(AX); SC(wcnt);
1038 1.1 christos
1039 1.1 christos /*----------------------------------------------------------------------*/
1040 1.1 christos
1041 1.1 christos /** 0110 0001 11rb 1111 sel rb%1 */
1042 1.1 christos ID(sel); SC(rb);
1043 1.1 christos
1044 1.1 christos /*----------------------------------------------------------------------*/
1045 1.1 christos
1046 1.1 christos /** 0111 0001 0bit 0000 set1 %e!0 */
1047 1.1 christos ID(mov); DM(None, IMMU(2)); DB(bit); SC(1);
1048 1.1 christos
1049 1.1 christos /** 0111 0001 1bit 0010 set1 %e0 */
1050 1.1 christos ID(mov); DM(HL, 0); DB(bit); SC(1);
1051 1.1 christos
1052 1.1 christos /** 0111 0001 1bit 1010 set1 %0 */
1053 1.1 christos ID(mov); DR(A); DB(bit); SC(1);
1054 1.1 christos
1055 1.1 christos /** 0111 0001 1000 0000 set1 cy */
1056 1.1 christos ID(mov); DCY(); SC(1);
1057 1.1 christos
1058 1.1 christos /** 0111 0001 0bit 1010 set1 %s0 */
1059 1.1 christos op0 = SFR;
1060 1.1 christos ID(mov); DM(None, op0); DB(bit); SC(1);
1061 1.1 christos if (op0 == RL78_SFR_PSW && bit == 7)
1062 1.1 christos rl78->syntax = "ei";
1063 1.1 christos
1064 1.1 christos /** 0111 0001 0bit 0010 set1 %0 */
1065 1.1 christos ID(mov); DM(None, SADDR); DB(bit); SC(1);
1066 1.1 christos
1067 1.1 christos /*----------------------------------------------------------------------*/
1068 1.1 christos
1069 1.1 christos /** 0011 0001 0cnt 1001 shl %0, %1 */
1070 1.1 christos ID(shl); DR(A); SC(cnt);
1071 1.1 christos
1072 1.1 christos /** 0011 0001 0cnt 1000 shl %0, %1 */
1073 1.1 christos ID(shl); DR(B); SC(cnt);
1074 1.1 christos
1075 1.1 christos /** 0011 0001 0cnt 0111 shl %0, %1 */
1076 1.1 christos ID(shl); DR(C); SC(cnt);
1077 1.1 christos
1078 1.1 christos /** 0011 0001 wcnt 1101 shlw %0, %1 */
1079 1.1 christos ID(shl); W(); DR(AX); SC(wcnt);
1080 1.1 christos
1081 1.1 christos /** 0011 0001 wcnt 1100 shlw %0, %1 */
1082 1.1 christos ID(shl); W(); DR(BC); SC(wcnt);
1083 1.1 christos
1084 1.1 christos /*----------------------------------------------------------------------*/
1085 1.1 christos
1086 1.1 christos /** 0011 0001 0cnt 1010 shr %0, %1 */
1087 1.1 christos ID(shr); DR(A); SC(cnt);
1088 1.1 christos
1089 1.1 christos /** 0011 0001 wcnt 1110 shrw %0, %1 */
1090 1.1 christos ID(shr); W(); DR(AX); SC(wcnt);
1091 1.1 christos
1092 1.1 christos /*----------------------------------------------------------------------*/
1093 1.1 christos
1094 1.1 christos /** 0110 0001 1100 1000 sk%c1 */
1095 1.1 christos ID(skip); COND(C);
1096 1.1 christos
1097 1.1 christos /** 0110 0001 1110 0011 sk%c1 */
1098 1.1 christos ID(skip); COND(H);
1099 1.1 christos
1100 1.1 christos /** 0110 0001 1101 1000 sk%c1 */
1101 1.1 christos ID(skip); COND(NC);
1102 1.1 christos
1103 1.1 christos /** 0110 0001 1111 0011 sk%c1 */
1104 1.1 christos ID(skip); COND(NH);
1105 1.1 christos
1106 1.1 christos /** 0110 0001 1111 1000 sk%c1 */
1107 1.1 christos ID(skip); COND(NZ);
1108 1.1 christos
1109 1.1 christos /** 0110 0001 1110 1000 sk%c1 */
1110 1.1 christos ID(skip); COND(Z);
1111 1.1 christos
1112 1.1 christos /*----------------------------------------------------------------------*/
1113 1.1 christos
1114 1.1 christos /** 0110 0001 1111 1101 stop */
1115 1.1 christos ID(stop);
1116 1.1 christos
1117 1.1 christos /*----------------------------------------------------------------------*/
1118 1.1 christos
1119 1.1 christos /** 0010 1111 sub %0, %e!1 */
1120 1.1 christos ID(sub); DR(A); SM(None, IMMU(2)); Fzac;
1121 1.1 christos
1122 1.1 christos /** 0010 1101 sub %0, %e1 */
1123 1.1 christos ID(sub); DR(A); SM(HL, 0); Fzac;
1124 1.1 christos
1125 1.1 christos /** 0110 0001 1010 000 sub %0, %e1 */
1126 1.1 christos ID(sub); DR(A); SM2(HL, B, 0); Fzac;
1127 1.1 christos
1128 1.5 christos /** 0010 1110 sub %0, %ea1 */
1129 1.1 christos ID(sub); DR(A); SM(HL, IMMU(1)); Fzac;
1130 1.1 christos
1131 1.1 christos /** 0110 0001 1010 0010 sub %0, %e1 */
1132 1.1 christos ID(sub); DR(A); SM2(HL, C, 0); Fzac;
1133 1.1 christos
1134 1.1 christos /** 0010 1100 sub %0, #%1 */
1135 1.1 christos ID(sub); DR(A); SC(IMMU(1)); Fzac;
1136 1.1 christos
1137 1.1 christos /** 0110 0001 0010 1rba sub %0, %1 */
1138 1.1 christos ID(sub); DR(A); SRB(rba); Fzac;
1139 1.1 christos
1140 1.1 christos /** 0010 1011 sub %0, %1 */
1141 1.1 christos ID(sub); DR(A); SM(None, SADDR); Fzac;
1142 1.1 christos
1143 1.1 christos /** 0110 0001 0010 0reg sub %0, %1 */
1144 1.1 christos ID(sub); DRB(reg); SR(A); Fzac;
1145 1.1 christos
1146 1.1 christos /** 0010 1010 sub %0, #%1 */
1147 1.1 christos ID(sub); DM(None, SADDR); SC(IMMU(1)); Fzac;
1148 1.1 christos
1149 1.1 christos /*----------------------------------------------------------------------*/
1150 1.1 christos
1151 1.1 christos /** 0011 1111 subc %0, %e!1 */
1152 1.1 christos ID(subc); DR(A); SM(None, IMMU(2)); Fzac;
1153 1.1 christos
1154 1.1 christos /** 0011 1101 subc %0, %e1 */
1155 1.1 christos ID(subc); DR(A); SM(HL, 0); Fzac;
1156 1.1 christos
1157 1.1 christos /** 0110 0001 1011 0000 subc %0, %e1 */
1158 1.1 christos ID(subc); DR(A); SM2(HL, B, 0); Fzac;
1159 1.1 christos
1160 1.1 christos /** 0110 0001 1011 0010 subc %0, %e1 */
1161 1.1 christos ID(subc); DR(A); SM2(HL, C, 0); Fzac;
1162 1.1 christos
1163 1.5 christos /** 0011 1110 subc %0, %ea1 */
1164 1.1 christos ID(subc); DR(A); SM(HL, IMMU(1)); Fzac;
1165 1.1 christos
1166 1.1 christos /** 0011 1100 subc %0, #%1 */
1167 1.1 christos ID(subc); DR(A); SC(IMMU(1)); Fzac;
1168 1.1 christos
1169 1.1 christos /** 0110 0001 0011 1rba subc %0, %1 */
1170 1.1 christos ID(subc); DR(A); SRB(rba); Fzac;
1171 1.1 christos
1172 1.1 christos /** 0110 0001 0011 0reg subc %0, %1 */
1173 1.1 christos ID(subc); DRB(reg); SR(A); Fzac;
1174 1.1 christos
1175 1.1 christos /** 0011 1011 subc %0, %1 */
1176 1.1 christos ID(subc); DR(A); SM(None, SADDR); Fzac;
1177 1.1 christos
1178 1.1 christos /** 0011 1010 subc %0, #%1 */
1179 1.1 christos ID(subc); DM(None, SADDR); SC(IMMU(1)); Fzac;
1180 1.1 christos
1181 1.1 christos /*----------------------------------------------------------------------*/
1182 1.1 christos
1183 1.1 christos /** 0010 0010 subw %0, %e!1 */
1184 1.1 christos ID(sub); W(); DR(AX); SM(None, IMMU(2)); Fzac;
1185 1.1 christos
1186 1.5 christos /** 0110 0001 0010 1001 subw %0, %ea1 */
1187 1.1 christos ID(sub); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
1188 1.1 christos
1189 1.1 christos /** 0010 0100 subw %0, #%1 */
1190 1.1 christos ID(sub); W(); DR(AX); SC(IMMU(2)); Fzac;
1191 1.1 christos
1192 1.1 christos /** 0010 0rw1 subw %0, %1 */
1193 1.1 christos ID(sub); W(); DR(AX); SRW(rw); Fzac;
1194 1.1 christos
1195 1.1 christos /** 0010 0110 subw %0, %1 */
1196 1.1 christos ID(sub); W(); DR(AX); SM(None, SADDR); Fzac;
1197 1.1 christos
1198 1.1 christos /** 0010 0000 subw %0, #%1 */
1199 1.1 christos ID(sub); W(); DR(SP); SC(IMMU(1)); Fzac;
1200 1.1 christos
1201 1.1 christos /*----------------------------------------------------------------------*/
1202 1.1 christos
1203 1.1 christos /** 0110 0001 1010 1010 xch %0, %e!1 */
1204 1.1 christos ID(xch); DR(A); SM(None, IMMU(2));
1205 1.1 christos
1206 1.1 christos /** 0110 0001 1010 1110 xch %0, %e1 */
1207 1.1 christos ID(xch); DR(A); SM(DE, 0);
1208 1.1 christos
1209 1.1 christos /** 0110 0001 1010 1111 xch %0, %e1 */
1210 1.1 christos ID(xch); DR(A); SM(DE, IMMU(1));
1211 1.1 christos
1212 1.1 christos /** 0110 0001 1010 1100 xch %0, %e1 */
1213 1.1 christos ID(xch); DR(A); SM(HL, 0);
1214 1.1 christos
1215 1.1 christos /** 0110 0001 1011 1001 xch %0, %e1 */
1216 1.1 christos ID(xch); DR(A); SM2(HL, B, 0);
1217 1.1 christos
1218 1.5 christos /** 0110 0001 1010 1101 xch %0, %ea1 */
1219 1.1 christos ID(xch); DR(A); SM(HL, IMMU(1));
1220 1.1 christos
1221 1.1 christos /** 0110 0001 1010 1001 xch %0, %e1 */
1222 1.1 christos ID(xch); DR(A); SM2(HL, C, 0);
1223 1.1 christos
1224 1.1 christos /** 0110 0001 1000 1reg xch %0, %1 */
1225 1.1 christos /* Note: DECW uses reg == X, so this must follow DECW */
1226 1.1 christos ID(xch); DR(A); SRB(reg);
1227 1.1 christos
1228 1.1 christos /** 0110 0001 1010 1000 xch %0, %1 */
1229 1.1 christos ID(xch); DR(A); SM(None, SADDR);
1230 1.1 christos
1231 1.1 christos /** 0110 0001 1010 1011 xch %0, %1 */
1232 1.1 christos ID(xch); DR(A); SM(None, SFR);
1233 1.1 christos
1234 1.1 christos /** 0000 1000 xch a, x */
1235 1.1 christos ID(xch); DR(A); SR(X);
1236 1.1 christos
1237 1.1 christos /*----------------------------------------------------------------------*/
1238 1.1 christos
1239 1.1 christos /** 0011 0ra1 xchw %0, %1 */
1240 1.1 christos ID(xch); W(); DR(AX); SRW(ra);
1241 1.1 christos
1242 1.1 christos /*----------------------------------------------------------------------*/
1243 1.1 christos
1244 1.1 christos /** 0111 1111 xor %0, %e!1 */
1245 1.1 christos ID(xor); DR(A); SM(None, IMMU(2)); Fz;
1246 1.1 christos
1247 1.1 christos /** 0111 1101 xor %0, %e1 */
1248 1.1 christos ID(xor); DR(A); SM(HL, 0); Fz;
1249 1.1 christos
1250 1.1 christos /** 0110 0001 1111 0000 xor %0, %e1 */
1251 1.1 christos ID(xor); DR(A); SM2(HL, B, 0); Fz;
1252 1.1 christos
1253 1.5 christos /** 0111 1110 xor %0, %ea1 */
1254 1.1 christos ID(xor); DR(A); SM(HL, IMMU(1)); Fz;
1255 1.1 christos
1256 1.1 christos /** 0110 0001 1111 0010 xor %0, %e1 */
1257 1.1 christos ID(xor); DR(A); SM2(HL, C, 0); Fz;
1258 1.1 christos
1259 1.1 christos /** 0111 1100 xor %0, #%1 */
1260 1.1 christos ID(xor); DR(A); SC(IMMU(1)); Fz;
1261 1.1 christos
1262 1.1 christos /** 0110 0001 0111 1rba xor %0, %1 */
1263 1.1 christos ID(xor); DR(A); SRB(rba); Fz;
1264 1.1 christos
1265 1.1 christos /** 0110 0001 0111 0reg xor %0, %1 */
1266 1.1 christos ID(xor); DRB(reg); SR(A); Fz;
1267 1.1 christos
1268 1.1 christos /** 0111 1011 xor %0, %1 */
1269 1.1 christos ID(xor); DR(A); SM(None, SADDR); Fz;
1270 1.1 christos
1271 1.1 christos /** 0111 1010 xor %0, #%1 */
1272 1.1 christos ID(xor); DM(None, SADDR); SC(IMMU(1)); Fz;
1273 1.1 christos
1274 1.1 christos /*----------------------------------------------------------------------*/
1275 1.1 christos
1276 1.1 christos /** 0111 0001 1bit 0111 xor1 cy, %e1 */
1277 1.1 christos ID(xor); DCY(); SM(HL, 0); SB(bit);
1278 1.1 christos
1279 1.1 christos /** 0111 0001 1bit 1111 xor1 cy, %1 */
1280 1.1 christos ID(xor); DCY(); SR(A); SB(bit);
1281 1.1 christos
1282 1.1 christos /** 0111 0001 0bit 1111 xor1 cy, %s1 */
1283 1.1 christos ID(xor); DCY(); SM(None, SFR); SB(bit);
1284 1.1 christos
1285 1.1 christos /** 0111 0001 0bit 0111 xor1 cy, %s1 */
1286 1.1 christos ID(xor); DCY(); SM(None, SADDR); SB(bit);
1287 1.1 christos
1288 1.1 christos /*----------------------------------------------------------------------*/
1289 1.1 christos
1290 1.1 christos /** */
1291 1.1 christos
1292 1.1 christos return rl78->n_bytes;
1293 1.1 christos }
1294