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