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