rl78-decode.opc revision 1.6 1 1.1 christos /* -*- c -*- */
2 1.6 christos /* Copyright (C) 2012-2016 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.6 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.6 christos /** 1100 1010 mov %ea0, #%1 */
618 1.1 christos ID(mov); DM(DE, IMMU(1)); SC(IMMU(1));
619 1.1 christos
620 1.6 christos /** 1001 1010 mov %ea0, %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.6 christos /** 1100 1000 mov %a0, #%1 */
639 1.1 christos ID(mov); DM(SP, IMMU(1)); SC(IMMU(1));
640 1.1 christos
641 1.6 christos /** 1001 1000 mov %a0, %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.6 christos /** 1000 1010 mov %0, %ea1 */
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.6 christos /** 1000 1000 mov %0, %ea1 */
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.6 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.6 christos ID(mov); DR(ES); SR(A);
721 1.1 christos
722 1.1 christos /** 0110 0001 1011 1000 mov %0, %1 */
723 1.6 christos ID(mov); DR(ES); SM(None, SADDR);
724 1.1 christos
725 1.1 christos /** 0001 1001 mov %e0, #%1 */
726 1.6 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.6 christos ID(mov); DM(B, IMMU(2)); SR(A);
730 1.1 christos
731 1.1 christos /** 0011 1001 mov %e0, #%1 */
732 1.6 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.6 christos ID(mov); DM(BC, IMMU(2)); SR(A);
736 1.1 christos
737 1.1 christos /** 0011 1000 mov %e0, #%1 */
738 1.6 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.6 christos /** 1001 1110 mov %s0, %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.6 christos /** 1011 1010 movw %ea0, %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.6 christos /** 1011 1000 movw %a0, %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.6 christos /** 1010 1010 movw %0, %ea1 */
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.6 christos /** 1010 1000 movw %0, %a1 */
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.6 christos /** 11ra 1011 movw %0, %es!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.6 christos /** 1100 1011 movw %s0, #%1 */
898 1.1 christos ID(mov); W(); DM(None, SFR); SC(IMMU(2));
899 1.1 christos
900 1.6 christos /** 1011 1110 movw %s0, %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.6 christos ID(mulu);
907 1.1 christos
908 1.1 christos /*----------------------------------------------------------------------*/
909 1.1 christos
910 1.1 christos /** 0000 0000 nop */
911 1.1 christos ID(nop);
912 1.1 christos
913 1.1 christos /*----------------------------------------------------------------------*/
914 1.1 christos
915 1.1 christos /** 0111 0001 1100 0000 not1 cy */
916 1.1 christos ID(xor); DCY(); SC(1);
917 1.1 christos
918 1.1 christos /*----------------------------------------------------------------------*/
919 1.1 christos
920 1.1 christos /** 1110 0101 oneb %e!0 */
921 1.1 christos ID(mov); DM(None, IMMU(2)); SC(1);
922 1.1 christos
923 1.1 christos /** 1110 00rg oneb %0 */
924 1.1 christos ID(mov); DRB(rg); SC(1);
925 1.1 christos
926 1.1 christos /** 1110 0100 oneb %0 */
927 1.1 christos ID(mov); DM(None, SADDR); SC(1);
928 1.1 christos
929 1.1 christos /*----------------------------------------------------------------------*/
930 1.1 christos
931 1.1 christos /** 1110 0110 onew %0 */
932 1.1 christos ID(mov); DR(AX); SC(1);
933 1.1 christos
934 1.1 christos /** 1110 0111 onew %0 */
935 1.1 christos ID(mov); DR(BC); SC(1);
936 1.1 christos
937 1.1 christos /*----------------------------------------------------------------------*/
938 1.1 christos
939 1.1 christos /** 0110 1111 or %0, %e!1 */
940 1.1 christos ID(or); DR(A); SM(None, IMMU(2)); Fz;
941 1.1 christos
942 1.1 christos /** 0110 1101 or %0, %e1 */
943 1.1 christos ID(or); DR(A); SM(HL, 0); Fz;
944 1.1 christos
945 1.1 christos /** 0110 0001 1110 0000 or %0, %e1 */
946 1.1 christos ID(or); DR(A); SM2(HL, B, 0); Fz;
947 1.1 christos
948 1.5 christos /** 0110 1110 or %0, %ea1 */
949 1.1 christos ID(or); DR(A); SM(HL, IMMU(1)); Fz;
950 1.1 christos
951 1.1 christos /** 0110 0001 1110 0010 or %0, %e1 */
952 1.1 christos ID(or); DR(A); SM2(HL, C, 0); Fz;
953 1.1 christos
954 1.1 christos /** 0110 1100 or %0, #%1 */
955 1.1 christos ID(or); DR(A); SC(IMMU(1)); Fz;
956 1.1 christos
957 1.1 christos /** 0110 0001 0110 1rba or %0, %1 */
958 1.1 christos ID(or); DR(A); SRB(rba); Fz;
959 1.1 christos
960 1.1 christos /** 0110 0001 0110 0reg or %0, %1 */
961 1.1 christos ID(or); DRB(reg); SR(A); Fz;
962 1.1 christos
963 1.1 christos /** 0110 1011 or %0, %1 */
964 1.1 christos ID(or); DR(A); SM(None, SADDR); Fz;
965 1.1 christos
966 1.1 christos /** 0110 1010 or %0, #%1 */
967 1.1 christos ID(or); DM(None, SADDR); SC(IMMU(1)); Fz;
968 1.1 christos
969 1.1 christos /*----------------------------------------------------------------------*/
970 1.1 christos
971 1.1 christos /** 0111 0001 1bit 0110 or1 cy, %e1 */
972 1.1 christos ID(or); DCY(); SM(HL, 0); SB(bit);
973 1.1 christos
974 1.1 christos /** 0111 0001 1bit 1110 or1 cy, %1 */
975 1.1 christos ID(or); DCY(); SR(A); SB(bit);
976 1.1 christos
977 1.1 christos /** 0111 0001 0bit 1110 or1 cy, %s1 */
978 1.1 christos ID(or); DCY(); SM(None, SFR); SB(bit);
979 1.1 christos
980 1.1 christos /** 0111 0001 0bit 0110 or1 cy, %s1 */
981 1.1 christos ID(or); DCY(); SM(None, SADDR); SB(bit);
982 1.1 christos
983 1.1 christos /*----------------------------------------------------------------------*/
984 1.1 christos
985 1.1 christos /** 1100 0rg0 pop %0 */
986 1.1 christos ID(mov); W(); DRW(rg); SPOP();
987 1.1 christos
988 1.1 christos /** 0110 0001 1100 1101 pop %s0 */
989 1.1 christos ID(mov); W(); DR(PSW); SPOP();
990 1.1 christos
991 1.1 christos /*----------------------------------------------------------------------*/
992 1.1 christos
993 1.1 christos /** 1100 0rg1 push %1 */
994 1.1 christos ID(mov); W(); DPUSH(); SRW(rg);
995 1.1 christos
996 1.1 christos /** 0110 0001 1101 1101 push %s1 */
997 1.1 christos ID(mov); W(); DPUSH(); SR(PSW);
998 1.1 christos
999 1.1 christos /*----------------------------------------------------------------------*/
1000 1.1 christos
1001 1.1 christos /** 1101 0111 ret */
1002 1.1 christos ID(ret);
1003 1.1 christos
1004 1.1 christos /** 0110 0001 1111 1100 reti */
1005 1.1 christos ID(reti);
1006 1.1 christos
1007 1.1 christos /** 0110 0001 1110 1100 retb */
1008 1.1 christos ID(reti);
1009 1.1 christos
1010 1.1 christos /*----------------------------------------------------------------------*/
1011 1.1 christos
1012 1.1 christos /** 0110 0001 1110 1011 rol %0, %1 */
1013 1.1 christos ID(rol); DR(A); SC(1);
1014 1.1 christos
1015 1.1 christos /** 0110 0001 1101 1100 rolc %0, %1 */
1016 1.1 christos ID(rolc); DR(A); SC(1);
1017 1.1 christos
1018 1.1 christos /** 0110 0001 111r 1110 rolwc %0, %1 */
1019 1.1 christos ID(rolc); W(); DRW(r); SC(1);
1020 1.1 christos
1021 1.1 christos /** 0110 0001 1101 1011 ror %0, %1 */
1022 1.1 christos ID(ror); DR(A); SC(1);
1023 1.1 christos
1024 1.1 christos /** 0110 0001 1111 1011 rorc %0, %1 */
1025 1.1 christos ID(rorc); DR(A); SC(1);
1026 1.1 christos
1027 1.1 christos /*----------------------------------------------------------------------*/
1028 1.1 christos
1029 1.1 christos /* Note that the branch insns need to be listed before the shift
1030 1.1 christos ones, as "shift count of zero" means "branch insn" */
1031 1.1 christos
1032 1.1 christos /** 0011 0001 0cnt 1011 sar %0, %1 */
1033 1.1 christos ID(sar); DR(A); SC(cnt);
1034 1.1 christos
1035 1.1 christos /** 0011 0001 wcnt 1111 sarw %0, %1 */
1036 1.1 christos ID(sar); W(); DR(AX); SC(wcnt);
1037 1.1 christos
1038 1.1 christos /*----------------------------------------------------------------------*/
1039 1.1 christos
1040 1.1 christos /** 0110 0001 11rb 1111 sel rb%1 */
1041 1.1 christos ID(sel); SC(rb);
1042 1.1 christos
1043 1.1 christos /*----------------------------------------------------------------------*/
1044 1.1 christos
1045 1.1 christos /** 0111 0001 0bit 0000 set1 %e!0 */
1046 1.1 christos ID(mov); DM(None, IMMU(2)); DB(bit); SC(1);
1047 1.1 christos
1048 1.1 christos /** 0111 0001 1bit 0010 set1 %e0 */
1049 1.1 christos ID(mov); DM(HL, 0); DB(bit); SC(1);
1050 1.1 christos
1051 1.1 christos /** 0111 0001 1bit 1010 set1 %0 */
1052 1.1 christos ID(mov); DR(A); DB(bit); SC(1);
1053 1.1 christos
1054 1.1 christos /** 0111 0001 1000 0000 set1 cy */
1055 1.1 christos ID(mov); DCY(); SC(1);
1056 1.1 christos
1057 1.1 christos /** 0111 0001 0bit 1010 set1 %s0 */
1058 1.1 christos op0 = SFR;
1059 1.1 christos ID(mov); DM(None, op0); DB(bit); SC(1);
1060 1.1 christos if (op0 == RL78_SFR_PSW && bit == 7)
1061 1.1 christos rl78->syntax = "ei";
1062 1.1 christos
1063 1.1 christos /** 0111 0001 0bit 0010 set1 %0 */
1064 1.1 christos ID(mov); DM(None, SADDR); DB(bit); SC(1);
1065 1.1 christos
1066 1.1 christos /*----------------------------------------------------------------------*/
1067 1.1 christos
1068 1.1 christos /** 0011 0001 0cnt 1001 shl %0, %1 */
1069 1.1 christos ID(shl); DR(A); SC(cnt);
1070 1.1 christos
1071 1.1 christos /** 0011 0001 0cnt 1000 shl %0, %1 */
1072 1.1 christos ID(shl); DR(B); SC(cnt);
1073 1.1 christos
1074 1.1 christos /** 0011 0001 0cnt 0111 shl %0, %1 */
1075 1.1 christos ID(shl); DR(C); SC(cnt);
1076 1.1 christos
1077 1.1 christos /** 0011 0001 wcnt 1101 shlw %0, %1 */
1078 1.1 christos ID(shl); W(); DR(AX); SC(wcnt);
1079 1.1 christos
1080 1.1 christos /** 0011 0001 wcnt 1100 shlw %0, %1 */
1081 1.1 christos ID(shl); W(); DR(BC); SC(wcnt);
1082 1.1 christos
1083 1.1 christos /*----------------------------------------------------------------------*/
1084 1.1 christos
1085 1.1 christos /** 0011 0001 0cnt 1010 shr %0, %1 */
1086 1.1 christos ID(shr); DR(A); SC(cnt);
1087 1.1 christos
1088 1.1 christos /** 0011 0001 wcnt 1110 shrw %0, %1 */
1089 1.1 christos ID(shr); W(); DR(AX); SC(wcnt);
1090 1.1 christos
1091 1.1 christos /*----------------------------------------------------------------------*/
1092 1.1 christos
1093 1.1 christos /** 0110 0001 1100 1000 sk%c1 */
1094 1.1 christos ID(skip); COND(C);
1095 1.1 christos
1096 1.1 christos /** 0110 0001 1110 0011 sk%c1 */
1097 1.1 christos ID(skip); COND(H);
1098 1.1 christos
1099 1.1 christos /** 0110 0001 1101 1000 sk%c1 */
1100 1.1 christos ID(skip); COND(NC);
1101 1.1 christos
1102 1.1 christos /** 0110 0001 1111 0011 sk%c1 */
1103 1.1 christos ID(skip); COND(NH);
1104 1.1 christos
1105 1.1 christos /** 0110 0001 1111 1000 sk%c1 */
1106 1.1 christos ID(skip); COND(NZ);
1107 1.1 christos
1108 1.1 christos /** 0110 0001 1110 1000 sk%c1 */
1109 1.1 christos ID(skip); COND(Z);
1110 1.1 christos
1111 1.1 christos /*----------------------------------------------------------------------*/
1112 1.1 christos
1113 1.1 christos /** 0110 0001 1111 1101 stop */
1114 1.1 christos ID(stop);
1115 1.1 christos
1116 1.1 christos /*----------------------------------------------------------------------*/
1117 1.1 christos
1118 1.1 christos /** 0010 1111 sub %0, %e!1 */
1119 1.1 christos ID(sub); DR(A); SM(None, IMMU(2)); Fzac;
1120 1.1 christos
1121 1.1 christos /** 0010 1101 sub %0, %e1 */
1122 1.1 christos ID(sub); DR(A); SM(HL, 0); Fzac;
1123 1.1 christos
1124 1.1 christos /** 0110 0001 1010 000 sub %0, %e1 */
1125 1.1 christos ID(sub); DR(A); SM2(HL, B, 0); Fzac;
1126 1.1 christos
1127 1.5 christos /** 0010 1110 sub %0, %ea1 */
1128 1.1 christos ID(sub); DR(A); SM(HL, IMMU(1)); Fzac;
1129 1.1 christos
1130 1.1 christos /** 0110 0001 1010 0010 sub %0, %e1 */
1131 1.1 christos ID(sub); DR(A); SM2(HL, C, 0); Fzac;
1132 1.1 christos
1133 1.1 christos /** 0010 1100 sub %0, #%1 */
1134 1.1 christos ID(sub); DR(A); SC(IMMU(1)); Fzac;
1135 1.1 christos
1136 1.1 christos /** 0110 0001 0010 1rba sub %0, %1 */
1137 1.1 christos ID(sub); DR(A); SRB(rba); Fzac;
1138 1.1 christos
1139 1.1 christos /** 0010 1011 sub %0, %1 */
1140 1.1 christos ID(sub); DR(A); SM(None, SADDR); Fzac;
1141 1.1 christos
1142 1.1 christos /** 0110 0001 0010 0reg sub %0, %1 */
1143 1.1 christos ID(sub); DRB(reg); SR(A); Fzac;
1144 1.1 christos
1145 1.1 christos /** 0010 1010 sub %0, #%1 */
1146 1.1 christos ID(sub); DM(None, SADDR); SC(IMMU(1)); Fzac;
1147 1.1 christos
1148 1.1 christos /*----------------------------------------------------------------------*/
1149 1.1 christos
1150 1.1 christos /** 0011 1111 subc %0, %e!1 */
1151 1.1 christos ID(subc); DR(A); SM(None, IMMU(2)); Fzac;
1152 1.1 christos
1153 1.1 christos /** 0011 1101 subc %0, %e1 */
1154 1.1 christos ID(subc); DR(A); SM(HL, 0); Fzac;
1155 1.1 christos
1156 1.1 christos /** 0110 0001 1011 0000 subc %0, %e1 */
1157 1.1 christos ID(subc); DR(A); SM2(HL, B, 0); Fzac;
1158 1.1 christos
1159 1.1 christos /** 0110 0001 1011 0010 subc %0, %e1 */
1160 1.1 christos ID(subc); DR(A); SM2(HL, C, 0); Fzac;
1161 1.1 christos
1162 1.5 christos /** 0011 1110 subc %0, %ea1 */
1163 1.1 christos ID(subc); DR(A); SM(HL, IMMU(1)); Fzac;
1164 1.1 christos
1165 1.1 christos /** 0011 1100 subc %0, #%1 */
1166 1.1 christos ID(subc); DR(A); SC(IMMU(1)); Fzac;
1167 1.1 christos
1168 1.1 christos /** 0110 0001 0011 1rba subc %0, %1 */
1169 1.1 christos ID(subc); DR(A); SRB(rba); Fzac;
1170 1.1 christos
1171 1.1 christos /** 0110 0001 0011 0reg subc %0, %1 */
1172 1.1 christos ID(subc); DRB(reg); SR(A); Fzac;
1173 1.1 christos
1174 1.1 christos /** 0011 1011 subc %0, %1 */
1175 1.1 christos ID(subc); DR(A); SM(None, SADDR); Fzac;
1176 1.1 christos
1177 1.1 christos /** 0011 1010 subc %0, #%1 */
1178 1.1 christos ID(subc); DM(None, SADDR); SC(IMMU(1)); Fzac;
1179 1.1 christos
1180 1.1 christos /*----------------------------------------------------------------------*/
1181 1.1 christos
1182 1.1 christos /** 0010 0010 subw %0, %e!1 */
1183 1.1 christos ID(sub); W(); DR(AX); SM(None, IMMU(2)); Fzac;
1184 1.1 christos
1185 1.5 christos /** 0110 0001 0010 1001 subw %0, %ea1 */
1186 1.1 christos ID(sub); W(); DR(AX); SM(HL, IMMU(1)); Fzac;
1187 1.1 christos
1188 1.1 christos /** 0010 0100 subw %0, #%1 */
1189 1.1 christos ID(sub); W(); DR(AX); SC(IMMU(2)); Fzac;
1190 1.1 christos
1191 1.1 christos /** 0010 0rw1 subw %0, %1 */
1192 1.1 christos ID(sub); W(); DR(AX); SRW(rw); Fzac;
1193 1.1 christos
1194 1.1 christos /** 0010 0110 subw %0, %1 */
1195 1.1 christos ID(sub); W(); DR(AX); SM(None, SADDR); Fzac;
1196 1.1 christos
1197 1.1 christos /** 0010 0000 subw %0, #%1 */
1198 1.1 christos ID(sub); W(); DR(SP); SC(IMMU(1)); Fzac;
1199 1.1 christos
1200 1.1 christos /*----------------------------------------------------------------------*/
1201 1.1 christos
1202 1.1 christos /** 0110 0001 1010 1010 xch %0, %e!1 */
1203 1.1 christos ID(xch); DR(A); SM(None, IMMU(2));
1204 1.1 christos
1205 1.1 christos /** 0110 0001 1010 1110 xch %0, %e1 */
1206 1.1 christos ID(xch); DR(A); SM(DE, 0);
1207 1.1 christos
1208 1.6 christos /** 0110 0001 1010 1111 xch %0, %ea1 */
1209 1.1 christos ID(xch); DR(A); SM(DE, IMMU(1));
1210 1.1 christos
1211 1.1 christos /** 0110 0001 1010 1100 xch %0, %e1 */
1212 1.1 christos ID(xch); DR(A); SM(HL, 0);
1213 1.1 christos
1214 1.1 christos /** 0110 0001 1011 1001 xch %0, %e1 */
1215 1.1 christos ID(xch); DR(A); SM2(HL, B, 0);
1216 1.1 christos
1217 1.5 christos /** 0110 0001 1010 1101 xch %0, %ea1 */
1218 1.1 christos ID(xch); DR(A); SM(HL, IMMU(1));
1219 1.1 christos
1220 1.1 christos /** 0110 0001 1010 1001 xch %0, %e1 */
1221 1.1 christos ID(xch); DR(A); SM2(HL, C, 0);
1222 1.1 christos
1223 1.1 christos /** 0110 0001 1000 1reg xch %0, %1 */
1224 1.1 christos /* Note: DECW uses reg == X, so this must follow DECW */
1225 1.1 christos ID(xch); DR(A); SRB(reg);
1226 1.1 christos
1227 1.1 christos /** 0110 0001 1010 1000 xch %0, %1 */
1228 1.1 christos ID(xch); DR(A); SM(None, SADDR);
1229 1.1 christos
1230 1.6 christos /** 0110 0001 1010 1011 xch %0, %s1 */
1231 1.1 christos ID(xch); DR(A); SM(None, SFR);
1232 1.1 christos
1233 1.1 christos /** 0000 1000 xch a, x */
1234 1.1 christos ID(xch); DR(A); SR(X);
1235 1.1 christos
1236 1.1 christos /*----------------------------------------------------------------------*/
1237 1.1 christos
1238 1.1 christos /** 0011 0ra1 xchw %0, %1 */
1239 1.1 christos ID(xch); W(); DR(AX); SRW(ra);
1240 1.1 christos
1241 1.1 christos /*----------------------------------------------------------------------*/
1242 1.1 christos
1243 1.1 christos /** 0111 1111 xor %0, %e!1 */
1244 1.1 christos ID(xor); DR(A); SM(None, IMMU(2)); Fz;
1245 1.1 christos
1246 1.1 christos /** 0111 1101 xor %0, %e1 */
1247 1.1 christos ID(xor); DR(A); SM(HL, 0); Fz;
1248 1.1 christos
1249 1.1 christos /** 0110 0001 1111 0000 xor %0, %e1 */
1250 1.1 christos ID(xor); DR(A); SM2(HL, B, 0); Fz;
1251 1.1 christos
1252 1.5 christos /** 0111 1110 xor %0, %ea1 */
1253 1.1 christos ID(xor); DR(A); SM(HL, IMMU(1)); Fz;
1254 1.1 christos
1255 1.1 christos /** 0110 0001 1111 0010 xor %0, %e1 */
1256 1.1 christos ID(xor); DR(A); SM2(HL, C, 0); Fz;
1257 1.1 christos
1258 1.1 christos /** 0111 1100 xor %0, #%1 */
1259 1.1 christos ID(xor); DR(A); SC(IMMU(1)); Fz;
1260 1.1 christos
1261 1.1 christos /** 0110 0001 0111 1rba xor %0, %1 */
1262 1.1 christos ID(xor); DR(A); SRB(rba); Fz;
1263 1.1 christos
1264 1.1 christos /** 0110 0001 0111 0reg xor %0, %1 */
1265 1.1 christos ID(xor); DRB(reg); SR(A); Fz;
1266 1.1 christos
1267 1.1 christos /** 0111 1011 xor %0, %1 */
1268 1.1 christos ID(xor); DR(A); SM(None, SADDR); Fz;
1269 1.1 christos
1270 1.1 christos /** 0111 1010 xor %0, #%1 */
1271 1.1 christos ID(xor); DM(None, SADDR); SC(IMMU(1)); Fz;
1272 1.1 christos
1273 1.1 christos /*----------------------------------------------------------------------*/
1274 1.1 christos
1275 1.1 christos /** 0111 0001 1bit 0111 xor1 cy, %e1 */
1276 1.1 christos ID(xor); DCY(); SM(HL, 0); SB(bit);
1277 1.1 christos
1278 1.1 christos /** 0111 0001 1bit 1111 xor1 cy, %1 */
1279 1.1 christos ID(xor); DCY(); SR(A); SB(bit);
1280 1.1 christos
1281 1.1 christos /** 0111 0001 0bit 1111 xor1 cy, %s1 */
1282 1.1 christos ID(xor); DCY(); SM(None, SFR); SB(bit);
1283 1.1 christos
1284 1.1 christos /** 0111 0001 0bit 0111 xor1 cy, %s1 */
1285 1.1 christos ID(xor); DCY(); SM(None, SADDR); SB(bit);
1286 1.1 christos
1287 1.1 christos /*----------------------------------------------------------------------*/
1288 1.1 christos
1289 1.1 christos /** */
1290 1.1 christos
1291 1.1 christos return rl78->n_bytes;
1292 1.1 christos }
1293