]> git.sesse.net Git - pistorm/blob - m68k_in.c
Add Meson build files.
[pistorm] / m68k_in.c
1 /*
2 must fix:
3         callm
4         chk
5 */
6 /* ======================================================================== */
7 /* ========================= LICENSING & COPYRIGHT ======================== */
8 /* ======================================================================== */
9 /*
10  *                                  MUSASHI
11  *                                Version 3.32
12  *
13  * A portable Motorola M680x0 processor emulation engine.
14  * Copyright Karl Stenerud.  All rights reserved.
15  *
16  * Permission is hereby granted, free of charge, to any person obtaining a copy
17  * of this software and associated documentation files (the "Software"), to deal
18  * in the Software without restriction, including without limitation the rights
19  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
20  * copies of the Software, and to permit persons to whom the Software is
21  * furnished to do so, subject to the following conditions:
22  *
23  * The above copyright notice and this permission notice shall be included in
24  * all copies or substantial portions of the Software.
25
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
29  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
30  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
31  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
32  * THE SOFTWARE.
33  */
34
35 /* Special thanks to Bart Trzynadlowski for his insight into the
36  * undocumented features of this chip:
37  *
38  * http://dynarec.com/~bart/files/68knotes.txt
39  */
40
41
42 /* Input file for m68kmake
43  * -----------------------
44  *
45  * All sections begin with 80 X's in a row followed by an end-of-line
46  * sequence.
47  * After this, m68kmake will expect to find one of the following section
48  * identifiers:
49  *    M68KMAKE_PROTOTYPE_HEADER      - header for opcode handler prototypes
50  *    M68KMAKE_PROTOTYPE_FOOTER      - footer for opcode handler prototypes
51  *    M68KMAKE_TABLE_HEADER          - header for opcode handler jumptable
52  *    M68KMAKE_TABLE_FOOTER          - footer for opcode handler jumptable
53  *    M68KMAKE_TABLE_BODY            - the table itself
54  *    M68KMAKE_OPCODE_HANDLER_HEADER - header for opcode handler implementation
55  *    M68KMAKE_OPCODE_HANDLER_FOOTER - footer for opcode handler implementation
56  *    M68KMAKE_OPCODE_HANDLER_BODY   - body section for opcode handler implementation
57  *
58  * NOTE: M68KMAKE_OPCODE_HANDLER_BODY must be last in the file and
59  *       M68KMAKE_TABLE_BODY must be second last in the file.
60  *
61  * The M68KMAKE_OPHANDLER_BODY section contains the opcode handler
62  * primitives themselves.  Each opcode handler begins with:
63  *    M68KMAKE_OP(A, B, C, D)
64  *
65  * where A is the opcode handler name, B is the size of the operation,
66  * C denotes any special processing mode, and D denotes a specific
67  * addressing mode.
68  * For C and D where nothing is specified, use "."
69  *
70  * Example:
71  *     M68KMAKE_OP(abcd, 8, rr, .)   abcd, size 8, register to register, default EA
72  *     M68KMAKE_OP(abcd, 8, mm, ax7) abcd, size 8, memory to memory, register X is A7
73  *     M68KMAKE_OP(tst, 16, ., pcix) tst, size 16, PCIX addressing
74  *
75  * All opcode handler primitives end with a closing curly brace "}" at column 1
76  *
77  * NOTE: Do not place a M68KMAKE_OP() directive inside the opcode handler,
78  *       and do not put a closing curly brace at column 1 unless it is
79  *       marking the end of the handler!
80  *
81  * Inside the handler, m68kmake will recognize M68KMAKE_GET_OPER_xx_xx,
82  * M68KMAKE_GET_EA_xx_xx, and M68KMAKE_CC directives, and create multiple
83  * opcode handlers to handle variations in the opcode handler.
84  * Note: M68KMAKE_CC will only be interpreted in condition code opcodes.
85  * As well, M68KMAKE_GET_EA_xx_xx and M68KMAKE_GET_OPER_xx_xx will only
86  * be interpreted on instructions where the corresponding table entry
87  * specifies multiple effective addressing modes.
88  * Example:
89  * clr       32  .     .     0100001010......  A+-DXWL...  U U U   12   6   4
90  *
91  * This table entry says that the clr.l opcde has 7 variations (A+-DXWL).
92  * It is run in user or supervisor mode for all CPUs, and uses 12 cycles for
93  * 68000, 6 cycles for 68010, and 4 cycles for 68020.
94  */
95
96 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
97 M68KMAKE_PROTOTYPE_HEADER
98
99 #ifndef M68KOPS__HEADER
100 #define M68KOPS__HEADER
101
102 /* ======================================================================== */
103 /* ============================ OPCODE HANDLERS =========================== */
104 /* ======================================================================== */
105
106
107
108 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
109 M68KMAKE_PROTOTYPE_FOOTER
110
111
112 /* Build the opcode handler table */
113 void m68ki_build_opcode_table(void);
114
115 struct m68ki_cpu_core;
116
117 extern void (*m68ki_instruction_jump_table[0x10000])(struct m68ki_cpu_core *state); /* opcode handler jump table */
118 extern unsigned char m68ki_cycles[][0x10000];
119
120
121 /* ======================================================================== */
122 /* ============================== END OF FILE ============================= */
123 /* ======================================================================== */
124
125 #endif /* M68KOPS__HEADER */
126
127
128
129 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
130 M68KMAKE_TABLE_HEADER
131
132 /* ======================================================================== */
133 /* ========================= OPCODE TABLE BUILDER ========================= */
134 /* ======================================================================== */
135
136 #include <stdio.h>
137 #include "m68kops.h"
138
139 #define NUM_CPU_TYPES 5
140
141 void  (*m68ki_instruction_jump_table[0x10000])(m68ki_cpu_core *state); /* opcode handler jump table */
142 unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */
143
144 /* This is used to generate the opcode handler jump table */
145 typedef struct
146 {
147         void (*opcode_handler)(m68ki_cpu_core *state);        /* handler function */
148         unsigned int  mask;                  /* mask on opcode */
149         unsigned int  match;                 /* what to match after masking */
150         unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */
151 } opcode_handler_struct;
152
153
154 /* Opcode handler table */
155 static const opcode_handler_struct m68k_opcode_handler_table[] =
156 {
157 /*   function                      mask    match    000  010  020  040 */
158
159
160
161 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
162 M68KMAKE_TABLE_FOOTER
163
164         {0, 0, 0, {0, 0, 0, 0, 0}}
165 };
166
167
168 /* Build the opcode handler jump table */
169 void m68ki_build_opcode_table(void)
170 {
171         const opcode_handler_struct *ostruct;
172         int cycle_cost;
173         int instr;
174         int i;
175         int j;
176         int k;
177
178         for(i = 0; i < 0x10000; i++)
179         {
180                 /* default to illegal */
181                 m68ki_instruction_jump_table[i] = m68k_op_illegal;
182                 for(k=0;k<NUM_CPU_TYPES;k++)
183                         m68ki_cycles[k][i] = 0;
184         }
185
186         ostruct = m68k_opcode_handler_table;
187         while(ostruct->mask != 0xff00)
188         {
189                 for(i = 0;i < 0x10000;i++)
190                 {
191                         if((i & ostruct->mask) == ostruct->match)
192                         {
193                                 m68ki_instruction_jump_table[i] = ostruct->opcode_handler;
194                                 for(k=0;k<NUM_CPU_TYPES;k++)
195                                         m68ki_cycles[k][i] = ostruct->cycles[k];
196                         }
197                 }
198                 ostruct++;
199         }
200         while(ostruct->mask == 0xff00)
201         {
202                 for(i = 0;i <= 0xff;i++)
203                 {
204                         m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
205                         for(k=0;k<NUM_CPU_TYPES;k++)
206                                 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
207                 }
208                 ostruct++;
209         }
210         while(ostruct->mask == 0xf1f8)
211         {
212                 for(i = 0;i < 8;i++)
213                 {
214                         for(j = 0;j < 8;j++)
215                         {
216                                 instr = ostruct->match | (i << 9) | j;
217                                 m68ki_instruction_jump_table[instr] = ostruct->opcode_handler;
218                                 for(k=0;k<NUM_CPU_TYPES;k++)
219                                         m68ki_cycles[k][instr] = ostruct->cycles[k];
220                                 // For all shift operations with known shift distance (encoded in instruction word)
221                                 if((instr & 0xf000) == 0xe000 && (!(instr & 0x20)))
222                                 {
223                                         // On the 68000 and 68010 shift distance affect execution time.
224                                         // Add the cycle cost of shifting; 2 times the shift distance
225                                         cycle_cost = ((((i-1)&7)+1)<<1);
226                                         m68ki_cycles[0][instr] += cycle_cost;
227                                         m68ki_cycles[1][instr] += cycle_cost;
228                                         // On the 68020 shift distance does not affect execution time
229                                         m68ki_cycles[2][instr] += 0;
230                                 }
231                         }
232                 }
233                 ostruct++;
234         }
235         while(ostruct->mask == 0xfff0)
236         {
237                 for(i = 0;i <= 0x0f;i++)
238                 {
239                         m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
240                         for(k=0;k<NUM_CPU_TYPES;k++)
241                                 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
242                 }
243                 ostruct++;
244         }
245         while(ostruct->mask == 0xf1ff)
246         {
247                 for(i = 0;i <= 0x07;i++)
248                 {
249                         m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler;
250                         for(k=0;k<NUM_CPU_TYPES;k++)
251                                 m68ki_cycles[k][ostruct->match | (i << 9)] = ostruct->cycles[k];
252                 }
253                 ostruct++;
254         }
255         while(ostruct->mask == 0xfff8)
256         {
257                 for(i = 0;i <= 0x07;i++)
258                 {
259                         m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
260                         for(k=0;k<NUM_CPU_TYPES;k++)
261                                 m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
262                 }
263                 ostruct++;
264         }
265         while(ostruct->mask == 0xffff)
266         {
267                 m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler;
268                 for(k=0;k<NUM_CPU_TYPES;k++)
269                         m68ki_cycles[k][ostruct->match] = ostruct->cycles[k];
270                 ostruct++;
271         }
272 }
273
274
275 /* ======================================================================== */
276 /* ============================== END OF FILE ============================= */
277 /* ======================================================================== */
278
279
280
281 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
282 M68KMAKE_OPCODE_HANDLER_HEADER
283
284 #include <stdio.h>
285 #include "m68kcpu.h"
286 extern void m68040_fpu_op0(m68ki_cpu_core *state);
287 extern void m68040_fpu_op1(m68ki_cpu_core *state);
288 extern void m68851_mmu_ops(m68ki_cpu_core *state);
289 extern void m68881_ftrap(m68ki_cpu_core *state);
290
291 /* ======================================================================== */
292 /* ========================= INSTRUCTION HANDLERS ========================= */
293 /* ======================================================================== */
294
295
296
297 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
298 M68KMAKE_OPCODE_HANDLER_FOOTER
299
300 /* ======================================================================== */
301 /* ============================== END OF FILE ============================= */
302 /* ======================================================================== */
303
304
305
306 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
307 M68KMAKE_TABLE_BODY
308
309 The following table is arranged as follows:
310
311 name:        Opcode mnemonic
312
313 size:        Operation size
314
315 spec proc:   Special processing mode:
316                  .:    normal
317                  s:    static operand
318                  r:    register operand
319                  rr:   register to register
320                  mm:   memory to memory
321                  er:   effective address to register
322                  re:   register to effective address
323                  dd:   data register to data register
324                  da:   data register to address register
325                  aa:   address register to address register
326                  cr:   control register to register
327                  rc:   register to control register
328                  toc:  to condition code register
329                  tos:  to status register
330                  tou:  to user stack pointer
331                  frc:  from condition code register
332                  frs:  from status register
333                  fru:  from user stack pointer
334                  * for move.x, the special processing mode is a specific
335                    destination effective addressing mode.
336
337 spec ea:     Specific effective addressing mode:
338                  .:    normal
339                  i:    immediate
340                  d:    data register
341                  a:    address register
342                  ai:   address register indirect
343                  pi:   address register indirect with postincrement
344                  pd:   address register indirect with predecrement
345                  di:   address register indirect with displacement
346                  ix:   address register indirect with index
347                  aw:   absolute word address
348                  al:   absolute long address
349                  pcdi: program counter relative with displacement
350                  pcix: program counter relative with index
351                  a7:   register specified in instruction is A7
352                  ax7:  register field X of instruction is A7
353                  ay7:  register field Y of instruction is A7
354                  axy7: register fields X and Y of instruction are A7
355
356 bit pattern: Pattern to recognize this opcode.  "." means don't care.
357
358 allowed ea:  List of allowed addressing modes:
359                  .: not present
360                  A: address register indirect
361                  +: ARI (address register indirect) with postincrement
362                  -: ARI with predecrement
363                  D: ARI with displacement
364                  X: ARI with index
365                  W: absolute word address
366                  L: absolute long address
367                  d: program counter indirect with displacement
368                  x: program counter indirect with index
369                  I: immediate
370 mode:        CPU operating mode for each cpu type.  U = user or supervisor,
371              S = supervisor only, "." = opcode not present.
372
373 cpu cycles:  Base number of cycles required to execute this opcode on the
374              specified CPU type.
375              Use "." if CPU does not have this opcode.
376
377
378
379               spec  spec                    allowed ea  mode       cpu cycles
380 name    size  proc   ea   bit pattern       A+-DXWLdxI  0 1 2 3 4  000 010 020 030 040  comments
381 ======  ====  ====  ====  ================  ==========  = = = = =  === === === === === =============
382 M68KMAKE_TABLE_START
383 1010       0  .     .     1010............  ..........  U U U U U   4   4   4   4   4
384 1111       0  .     .     1111............  ..........  U U U U U   4   4   4   4   4
385 040fpu0   32  .     .     11110010........  ..........  . . . . U   .   .   .   .   0
386 040fpu1   32  .     .     11110011........  ..........  . . . . U   .   .   .   .   0
387 abcd       8  rr    .     1100...100000...  ..........  U U U U U   6   6   4   4   4
388 abcd       8  mm    ax7   1100111100001...  ..........  U U U U U  18  18  16  16  16
389 abcd       8  mm    ay7   1100...100001111  ..........  U U U U U  18  18  16  16  16
390 abcd       8  mm    axy7  1100111100001111  ..........  U U U U U  18  18  16  16  16
391 abcd       8  mm    .     1100...100001...  ..........  U U U U U  18  18  16  16  16
392 add        8  er    d     1101...000000...  ..........  U U U U U   4   4   2   2   2
393 add        8  er    .     1101...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
394 add       16  er    d     1101...001000...  ..........  U U U U U   4   4   2   2   2
395 add       16  er    a     1101...001001...  ..........  U U U U U   4   4   2   2   2
396 add       16  er    .     1101...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
397 add       32  er    d     1101...010000...  ..........  U U U U U   6   6   2   2   2
398 add       32  er    a     1101...010001...  ..........  U U U U U   6   6   2   2   2
399 add       32  er    .     1101...010......  A+-DXWLdxI  U U U U U   6   6   2   2   2
400 add        8  re    .     1101...100......  A+-DXWL...  U U U U U   8   8   4   4   4
401 add       16  re    .     1101...101......  A+-DXWL...  U U U U U   8   8   4   4   4
402 add       32  re    .     1101...110......  A+-DXWL...  U U U U U  12  12   4   4   4
403 adda      16  .     d     1101...011000...  ..........  U U U U U   8   8   2   2   2
404 adda      16  .     a     1101...011001...  ..........  U U U U U   8   8   2   2   2
405 adda      16  .     .     1101...011......  A+-DXWLdxI  U U U U U   8   8   2   2   2
406 adda      32  .     d     1101...111000...  ..........  U U U U U   6   6   2   2   2
407 adda      32  .     a     1101...111001...  ..........  U U U U U   6   6   2   2   2
408 adda      32  .     .     1101...111......  A+-DXWLdxI  U U U U U   6   6   2   2   2
409 addi       8  .     d     0000011000000...  ..........  U U U U U   8   8   2   2   2
410 addi       8  .     .     0000011000......  A+-DXWL...  U U U U U  12  12   4   4   4
411 addi      16  .     d     0000011001000...  ..........  U U U U U   8   8   2   2   2
412 addi      16  .     .     0000011001......  A+-DXWL...  U U U U U  12  12   4   4   4
413 addi      32  .     d     0000011010000...  ..........  U U U U U  16  14   2   2   2
414 addi      32  .     .     0000011010......  A+-DXWL...  U U U U U  20  20   4   4   4
415 addq       8  .     d     0101...000000...  ..........  U U U U U   4   4   2   2   2
416 addq       8  .     .     0101...000......  A+-DXWL...  U U U U U   8   8   4   4   4
417 addq      16  .     d     0101...001000...  ..........  U U U U U   4   4   2   2   2
418 addq      16  .     a     0101...001001...  ..........  U U U U U   4   4   2   2   2
419 addq      16  .     .     0101...001......  A+-DXWL...  U U U U U   8   8   4   4   4
420 addq      32  .     d     0101...010000...  ..........  U U U U U   8   8   2   2   2
421 addq      32  .     a     0101...010001...  ..........  U U U U U   8   8   2   2   2
422 addq      32  .     .     0101...010......  A+-DXWL...  U U U U U  12  12   4   4   4
423 addx       8  rr    .     1101...100000...  ..........  U U U U U   4   4   2   2   2
424 addx      16  rr    .     1101...101000...  ..........  U U U U U   4   4   2   2   2
425 addx      32  rr    .     1101...110000...  ..........  U U U U U   8   6   2   2   2
426 addx       8  mm    ax7   1101111100001...  ..........  U U U U U  18  18  12  12  12
427 addx       8  mm    ay7   1101...100001111  ..........  U U U U U  18  18  12  12  12
428 addx       8  mm    axy7  1101111100001111  ..........  U U U U U  18  18  12  12  12
429 addx       8  mm    .     1101...100001...  ..........  U U U U U  18  18  12  12  12
430 addx      16  mm    .     1101...101001...  ..........  U U U U U  18  18  12  12  12
431 addx      32  mm    .     1101...110001...  ..........  U U U U U  30  30  12  12  12
432 and        8  er    d     1100...000000...  ..........  U U U U U   4   4   2   2   2
433 and        8  er    .     1100...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
434 and       16  er    d     1100...001000...  ..........  U U U U U   4   4   2   2   2
435 and       16  er    .     1100...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
436 and       32  er    d     1100...010000...  ..........  U U U U U   6   6   2   2   2
437 and       32  er    .     1100...010......  A+-DXWLdxI  U U U U U   6   6   2   2   2
438 and        8  re    .     1100...100......  A+-DXWL...  U U U U U   8   8   4   4   4
439 and       16  re    .     1100...101......  A+-DXWL...  U U U U U   8   8   4   4   4
440 and       32  re    .     1100...110......  A+-DXWL...  U U U U U  12  12   4   4   4
441 andi      16  toc   .     0000001000111100  ..........  U U U U U  20  16  12  12  12
442 andi      16  tos   .     0000001001111100  ..........  S S S S S  20  16  12  12  12
443 andi       8  .     d     0000001000000...  ..........  U U U U U   8   8   2   2   2
444 andi       8  .     .     0000001000......  A+-DXWL...  U U U U U  12  12   4   4   4
445 andi      16  .     d     0000001001000...  ..........  U U U U U   8   8   2   2   2
446 andi      16  .     .     0000001001......  A+-DXWL...  U U U U U  12  12   4   4   4
447 andi      32  .     d     0000001010000...  ..........  U U U U U  14  14   2   2   2
448 andi      32  .     .     0000001010......  A+-DXWL...  U U U U U  20  20   4   4   4
449 asr        8  s     .     1110...000000...  ..........  U U U U U   6   6   6   6   6
450 asr       16  s     .     1110...001000...  ..........  U U U U U   6   6   6   6   6
451 asr       32  s     .     1110...010000...  ..........  U U U U U   8   8   6   6   6
452 asr        8  r     .     1110...000100...  ..........  U U U U U   6   6   6   6   6
453 asr       16  r     .     1110...001100...  ..........  U U U U U   6   6   6   6   6
454 asr       32  r     .     1110...010100...  ..........  U U U U U   8   8   6   6   6
455 asr       16  .     .     1110000011......  A+-DXWL...  U U U U U   8   8   5   5   5
456 asl        8  s     .     1110...100000...  ..........  U U U U U   6   6   8   8   8
457 asl       16  s     .     1110...101000...  ..........  U U U U U   6   6   8   8   8
458 asl       32  s     .     1110...110000...  ..........  U U U U U   8   8   8   8   8
459 asl        8  r     .     1110...100100...  ..........  U U U U U   6   6   8   8   8
460 asl       16  r     .     1110...101100...  ..........  U U U U U   6   6   8   8   8
461 asl       32  r     .     1110...110100...  ..........  U U U U U   8   8   8   8   8
462 asl       16  .     .     1110000111......  A+-DXWL...  U U U U U   8   8   6   6   6
463 bcc        8  .     .     0110............  ..........  U U U U U  10  10   6   6   6
464 bcc       16  .     .     0110....00000000  ..........  U U U U U  10  10   6   6   6
465 bcc       32  .     .     0110....11111111  ..........  U U U U U  10  10   6   6   6
466 bchg       8  r     .     0000...101......  A+-DXWL...  U U U U U   8   8   4   4   4
467 bchg      32  r     d     0000...101000...  ..........  U U U U U   8   8   4   4   4
468 bchg       8  s     .     0000100001......  A+-DXWL...  U U U U U  12  12   4   4   4
469 bchg      32  s     d     0000100001000...  ..........  U U U U U  12  12   4   4   4
470 bclr       8  r     .     0000...110......  A+-DXWL...  U U U U U   8  10   4   4   4
471 bclr      32  r     d     0000...110000...  ..........  U U U U U  10  10   4   4   4
472 bclr       8  s     .     0000100010......  A+-DXWL...  U U U U U  12  12   4   4   4
473 bclr      32  s     d     0000100010000...  ..........  U U U U U  14  14   4   4   4
474 bfchg     32  .     d     1110101011000...  ..........  . . U U U   .   .  12  12  12  timing not quite correct
475 bfchg     32  .     .     1110101011......  A..DXWL...  . . U U U   .   .  20  20  20
476 bfclr     32  .     d     1110110011000...  ..........  . . U U U   .   .  12  12  12
477 bfclr     32  .     .     1110110011......  A..DXWL...  . . U U U   .   .  20  20  20
478 bfexts    32  .     d     1110101111000...  ..........  . . U U U   .   .   8   8   8
479 bfexts    32  .     .     1110101111......  A..DXWLdx.  . . U U U   .   .  15  15  15
480 bfextu    32  .     d     1110100111000...  ..........  . . U U U   .   .   8   8   8
481 bfextu    32  .     .     1110100111......  A..DXWLdx.  . . U U U   .   .  15  15  15
482 bfffo     32  .     d     1110110111000...  ..........  . . U U U   .   .  18  18  18
483 bfffo     32  .     .     1110110111......  A..DXWLdx.  . . U U U   .   .  28  28  28
484 bfins     32  .     d     1110111111000...  ..........  . . U U U   .   .  10  10  10
485 bfins     32  .     .     1110111111......  A..DXWL...  . . U U U   .   .  17  17  17
486 bfset     32  .     d     1110111011000...  ..........  . . U U U   .   .  12  12  12
487 bfset     32  .     .     1110111011......  A..DXWL...  . . U U U   .   .  20  20  20
488 bftst     32  .     d     1110100011000...  ..........  . . U U U   .   .   6   6   6
489 bftst     32  .     .     1110100011......  A..DXWLdx.  . . U U U   .   .  13  13  13
490 bkpt       0  .     .     0100100001001...  ..........  . U U U U   .  10  10  10  10
491 bra        8  .     .     01100000........  ..........  U U U U U  10  10  10  10  10
492 bra       16  .     .     0110000000000000  ..........  U U U U U  10  10  10  10  10
493 bra       32  .     .     0110000011111111  ..........  U U U U U  10  10  10  10  10
494 bset      32  r     d     0000...111000...  ..........  U U U U U   8   8   4   4   4
495 bset       8  r     .     0000...111......  A+-DXWL...  U U U U U   8   8   4   4   4
496 bset       8  s     .     0000100011......  A+-DXWL...  U U U U U  12  12   4   4   4
497 bset      32  s     d     0000100011000...  ..........  U U U U U  12  12   4   4   4
498 bsr        8  .     .     01100001........  ..........  U U U U U  18  18   7   7   7
499 bsr       16  .     .     0110000100000000  ..........  U U U U U  18  18   7   7   7
500 bsr       32  .     .     0110000111111111  ..........  U U U U U  18  18   7   7   7
501 btst       8  r     .     0000...100......  A+-DXWLdxI  U U U U U   4   4   4   4   4
502 btst      32  r     d     0000...100000...  ..........  U U U U U   6   6   4   4   4
503 btst       8  s     .     0000100000......  A+-DXWLdx.  U U U U U   8   8   4   4   4
504 btst      32  s     d     0000100000000...  ..........  U U U U U  10  10   4   4   4
505 callm     32  .     .     0000011011......  A..DXWLdx.  . . U U U   .   .  60  60  60  not properly emulated
506 cas        8  .     .     0000101011......  A+-DXWL...  . . U U U   .   .  12  12  12
507 cas       16  .     .     0000110011......  A+-DXWL...  . . U U U   .   .  12  12  12
508 cas       32  .     .     0000111011......  A+-DXWL...  . . U U U   .   .  12  12  12
509 cas2      16  .     .     0000110011111100  ..........  . . U U U   .   .  12  12  12
510 cas2      32  .     .     0000111011111100  ..........  . . U U U   .   .  12  12  12
511 chk       16  .     d     0100...110000...  ..........  U U U U U  10   8   8   8   8
512 chk       16  .     .     0100...110......  A+-DXWLdxI  U U U U U  10   8   8   8   8
513 chk       32  .     d     0100...100000...  ..........  . . U U U   .   .   8   8   8
514 chk       32  .     .     0100...100......  A+-DXWLdxI  . . U U U   .   .   8   8   8
515 chk2cmp2   8  .     pcdi  0000000011111010  ..........  . . U U U   .   .  23  23  23
516 chk2cmp2   8  .     pcix  0000000011111011  ..........  . . U U U   .   .  23  23  23
517 chk2cmp2   8  .     .     0000000011......  A..DXWL...  . . U U U   .   .  18  18  18
518 chk2cmp2  16  .     pcdi  0000001011111010  ..........  . . U U U   .   .  23  23  23
519 chk2cmp2  16  .     pcix  0000001011111011  ..........  . . U U U   .   .  23  23  23
520 chk2cmp2  16  .     .     0000001011......  A..DXWL...  . . U U U   .   .  18  18  18
521 chk2cmp2  32  .     pcdi  0000010011111010  ..........  . . U U U   .   .  23  23  23
522 chk2cmp2  32  .     pcix  0000010011111011  ..........  . . U U U   .   .  23  23  23
523 chk2cmp2  32  .     .     0000010011......  A..DXWL...  . . U U U   .   .  18  18  18
524 clr        8  .     d     0100001000000...  ..........  U U U U U   4   4   2   2   2
525 clr        8  .     .     0100001000......  A+-DXWL...  U U U U U   8   4   4   4   4
526 clr       16  .     d     0100001001000...  ..........  U U U U U   4   4   2   2   2
527 clr       16  .     .     0100001001......  A+-DXWL...  U U U U U   8   4   4   4   4
528 clr       32  .     d     0100001010000...  ..........  U U U U U   6   6   2   2   2
529 clr       32  .     .     0100001010......  A+-DXWL...  U U U U U  12   6   4   4   4
530 cmp        8  .     d     1011...000000...  ..........  U U U U U   4   4   2   2   2
531 cmp        8  .     .     1011...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
532 cmp       16  .     d     1011...001000...  ..........  U U U U U   4   4   2   2   2
533 cmp       16  .     a     1011...001001...  ..........  U U U U U   4   4   2   2   2
534 cmp       16  .     .     1011...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
535 cmp       32  .     d     1011...010000...  ..........  U U U U U   6   6   2   2   2
536 cmp       32  .     a     1011...010001...  ..........  U U U U U   6   6   2   2   2
537 cmp       32  .     .     1011...010......  A+-DXWLdxI  U U U U U   6   6   2   2   2
538 cmpa      16  .     d     1011...011000...  ..........  U U U U U   6   6   4   4   4
539 cmpa      16  .     a     1011...011001...  ..........  U U U U U   6   6   4   4   4
540 cmpa      16  .     .     1011...011......  A+-DXWLdxI  U U U U U   6   6   4   4   4
541 cmpa      32  .     d     1011...111000...  ..........  U U U U U   6   6   4   4   4
542 cmpa      32  .     a     1011...111001...  ..........  U U U U U   6   6   4   4   4
543 cmpa      32  .     .     1011...111......  A+-DXWLdxI  U U U U U   6   6   4   4   4
544 cmpi       8  .     d     0000110000000...  ..........  U U U U U   8   8   2   2   2
545 cmpi       8  .     .     0000110000......  A+-DXWL...  U U U U U   8   8   2   2   2
546 cmpi       8  .     pcdi  0000110000111010  ..........  . . U U U   .   .   7   7   7
547 cmpi       8  .     pcix  0000110000111011  ..........  . . U U U   .   .   9   9   9
548 cmpi      16  .     d     0000110001000...  ..........  U U U U U   8   8   2   2   2
549 cmpi      16  .     .     0000110001......  A+-DXWL...  U U U U U   8   8   2   2   2
550 cmpi      16  .     pcdi  0000110001111010  ..........  . . U U U   .   .   7   7   7
551 cmpi      16  .     pcix  0000110001111011  ..........  . . U U U   .   .   9   9   9
552 cmpi      32  .     d     0000110010000...  ..........  U U U U U  14  12   2   2   2
553 cmpi      32  .     .     0000110010......  A+-DXWL...  U U U U U  12  12   2   2   2
554 cmpi      32  .     pcdi  0000110010111010  ..........  . . U U U   .   .   7   7   7
555 cmpi      32  .     pcix  0000110010111011  ..........  . . U U U   .   .   9   9   9
556 cmpm       8  .     ax7   1011111100001...  ..........  U U U U U  12  12   9   9   9
557 cmpm       8  .     ay7   1011...100001111  ..........  U U U U U  12  12   9   9   9
558 cmpm       8  .     axy7  1011111100001111  ..........  U U U U U  12  12   9   9   9
559 cmpm       8  .     .     1011...100001...  ..........  U U U U U  12  12   9   9   9
560 cmpm      16  .     .     1011...101001...  ..........  U U U U U  12  12   9   9   9
561 cmpm      32  .     .     1011...110001...  ..........  U U U U U  20  20   9   9   9
562 cpbcc     32  .     .     1111...01.......  ..........  . . U U .   .   .   4   4   .  unemulated
563 cpdbcc    32  .     .     1111...001001...  ..........  . . U U .   .   .   4   4   .  unemulated
564 cpgen     32  .     .     1111...000......  ..........  . . U U .   .   .   4   4   .  unemulated
565 cpscc     32  .     .     1111...001......  ..........  . . U U .   .   .   4   4   .  unemulated
566 cptrapcc  32  .     .     1111...001111...  ..........  . . U U .   .   .   4   4   .  unemulated
567 ftrapcc   32  .     .     1111001001111...  ..........  . . U U .   .   .   4   4   .
568 dbt       16  .     .     0101000011001...  ..........  U U U U U  12  12   6   6   6
569 dbf       16  .     .     0101000111001...  ..........  U U U U U  12  12   6   6   6
570 dbcc      16  .     .     0101....11001...  ..........  U U U U U  12  12   6   6   6
571 divs      16  .     d     1000...111000...  ..........  U U U U U 158 122  56  56  56
572 divs      16  .     .     1000...111......  A+-DXWLdxI  U U U U U 158 122  56  56  56
573 divu      16  .     d     1000...011000...  ..........  U U U U U 140 108  44  44  44
574 divu      16  .     .     1000...011......  A+-DXWLdxI  U U U U U 140 108  44  44  44
575 divl      32  .     d     0100110001000...  ..........  . . U U U   .   .  84  84  84
576 divl      32  .     .     0100110001......  A+-DXWLdxI  . . U U U   .   .  84  84  84
577 eor        8  .     d     1011...100000...  ..........  U U U U U   4   4   2   2   2
578 eor        8  .     .     1011...100......  A+-DXWL...  U U U U U   8   8   4   4   4
579 eor       16  .     d     1011...101000...  ..........  U U U U U   4   4   2   2   2
580 eor       16  .     .     1011...101......  A+-DXWL...  U U U U U   8   8   4   4   4
581 eor       32  .     d     1011...110000...  ..........  U U U U U   8   6   2   2   2
582 eor       32  .     .     1011...110......  A+-DXWL...  U U U U U  12  12   4   4   4
583 eori      16  toc   .     0000101000111100  ..........  U U U U U  20  16  12  12  12
584 eori      16  tos   .     0000101001111100  ..........  S S S S S  20  16  12  12  12
585 eori       8  .     d     0000101000000...  ..........  U U U U U   8   8   2   2   2
586 eori       8  .     .     0000101000......  A+-DXWL...  U U U U U  12  12   4   4   4
587 eori      16  .     d     0000101001000...  ..........  U U U U U   8   8   2   2   2
588 eori      16  .     .     0000101001......  A+-DXWL...  U U U U U  12  12   4   4   4
589 eori      32  .     d     0000101010000...  ..........  U U U U U  16  14   2   2   2
590 eori      32  .     .     0000101010......  A+-DXWL...  U U U U U  20  20   4   4   4
591 exg       32  dd    .     1100...101000...  ..........  U U U U U   6   6   2   2   2
592 exg       32  aa    .     1100...101001...  ..........  U U U U U   6   6   2   2   2
593 exg       32  da    .     1100...110001...  ..........  U U U U U   6   6   2   2   2
594 ext       16  .     .     0100100010000...  ..........  U U U U U   4   4   4   4   4
595 ext       32  .     .     0100100011000...  ..........  U U U U U   4   4   4   4   4
596 extb      32  .     .     0100100111000...  ..........  . . U U U   .   .   4   4   4
597 illegal    0  .     .     0100101011111100  ..........  U U U U U   4   4   4   4   4
598 jmp       32  .     .     0100111011......  A..DXWLdx.  U U U U U   4   4   0   0   0
599 jsr       32  .     .     0100111010......  A..DXWLdx.  U U U U U  12  12   0   0   0
600 lea       32  .     .     0100...111......  A..DXWLdx.  U U U U U   0   0   2   2   2
601 link      16  .     a7    0100111001010111  ..........  U U U U U  16  16   5   5   5
602 link      16  .     .     0100111001010...  ..........  U U U U U  16  16   5   5   5
603 link      32  .     a7    0100100000001111  ..........  . . U U U   .   .   6   6   6
604 link      32  .     .     0100100000001...  ..........  . . U U U   .   .   6   6   6
605 lsr        8  s     .     1110...000001...  ..........  U U U U U   6   6   4   4   4
606 lsr       16  s     .     1110...001001...  ..........  U U U U U   6   6   4   4   4
607 lsr       32  s     .     1110...010001...  ..........  U U U U U   8   8   4   4   4
608 lsr        8  r     .     1110...000101...  ..........  U U U U U   6   6   6   6   6
609 lsr       16  r     .     1110...001101...  ..........  U U U U U   6   6   6   6   6
610 lsr       32  r     .     1110...010101...  ..........  U U U U U   8   8   6   6   6
611 lsr       16  .     .     1110001011......  A+-DXWL...  U U U U U   8   8   5   5   5
612 lsl        8  s     .     1110...100001...  ..........  U U U U U   6   6   4   4   4
613 lsl       16  s     .     1110...101001...  ..........  U U U U U   6   6   4   4   4
614 lsl       32  s     .     1110...110001...  ..........  U U U U U   8   8   4   4   4
615 lsl        8  r     .     1110...100101...  ..........  U U U U U   6   6   6   6   6
616 lsl       16  r     .     1110...101101...  ..........  U U U U U   6   6   6   6   6
617 lsl       32  r     .     1110...110101...  ..........  U U U U U   8   8   6   6   6
618 lsl       16  .     .     1110001111......  A+-DXWL...  U U U U U   8   8   5   5   5
619 move       8  d     d     0001...000000...  ..........  U U U U U   4   4   2   2   2
620 move       8  d     .     0001...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
621 move       8  ai    d     0001...010000...  ..........  U U U U U   8   8   4   4   4
622 move       8  ai    .     0001...010......  A+-DXWLdxI  U U U U U   8   8   4   4   4
623 move       8  pi    d     0001...011000...  ..........  U U U U U   8   8   4   4   4
624 move       8  pi    .     0001...011......  A+-DXWLdxI  U U U U U   8   8   4   4   4
625 move       8  pi7   d     0001111011000...  ..........  U U U U U   8   8   4   4   4
626 move       8  pi7   .     0001111011......  A+-DXWLdxI  U U U U U   8   8   4   4   4
627 move       8  pd    d     0001...100000...  ..........  U U U U U   8   8   5   5   5
628 move       8  pd    .     0001...100......  A+-DXWLdxI  U U U U U   8   8   5   5   5
629 move       8  pd7   d     0001111100000...  ..........  U U U U U   8   8   5   5   5
630 move       8  pd7   .     0001111100......  A+-DXWLdxI  U U U U U   8   8   5   5   5
631 move       8  di    d     0001...101000...  ..........  U U U U U  12  12   5   5   5
632 move       8  di    .     0001...101......  A+-DXWLdxI  U U U U U  12  12   5   5   5
633 move       8  ix    d     0001...110000...  ..........  U U U U U  14  14   7   7   7
634 move       8  ix    .     0001...110......  A+-DXWLdxI  U U U U U  14  14   7   7   7
635 move       8  aw    d     0001000111000...  ..........  U U U U U  12  12   4   4   4
636 move       8  aw    .     0001000111......  A+-DXWLdxI  U U U U U  12  12   4   4   4
637 move       8  al    d     0001001111000...  ..........  U U U U U  16  16   6   6   6
638 move       8  al    .     0001001111......  A+-DXWLdxI  U U U U U  16  16   6   6   6
639 move      16  d     d     0011...000000...  ..........  U U U U U   4   4   2   2   2
640 move      16  d     a     0011...000001...  ..........  U U U U U   4   4   2   2   2
641 move      16  d     .     0011...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
642 move      16  ai    d     0011...010000...  ..........  U U U U U   8   8   4   4   4
643 move      16  ai    a     0011...010001...  ..........  U U U U U   8   8   4   4   4
644 move      16  ai    .     0011...010......  A+-DXWLdxI  U U U U U   8   8   4   4   4
645 move      16  pi    d     0011...011000...  ..........  U U U U U   8   8   4   4   4
646 move      16  pi    a     0011...011001...  ..........  U U U U U   8   8   4   4   4
647 move      16  pi    .     0011...011......  A+-DXWLdxI  U U U U U   8   8   4   4   4
648 move      16  pd    d     0011...100000...  ..........  U U U U U   8   8   5   5   5
649 move      16  pd    a     0011...100001...  ..........  U U U U U   8   8   5   5   5
650 move      16  pd    .     0011...100......  A+-DXWLdxI  U U U U U   8   8   5   5   5
651 move      16  di    d     0011...101000...  ..........  U U U U U  12  12   5   5   5
652 move      16  di    a     0011...101001...  ..........  U U U U U  12  12   5   5   5
653 move      16  di    .     0011...101......  A+-DXWLdxI  U U U U U  12  12   5   5   5
654 move      16  ix    d     0011...110000...  ..........  U U U U U  14  14   7   7   7
655 move      16  ix    a     0011...110001...  ..........  U U U U U  14  14   7   7   7
656 move      16  ix    .     0011...110......  A+-DXWLdxI  U U U U U  14  14   7   7   7
657 move      16  aw    d     0011000111000...  ..........  U U U U U  12  12   4   4   4
658 move      16  aw    a     0011000111001...  ..........  U U U U U  12  12   4   4   4
659 move      16  aw    .     0011000111......  A+-DXWLdxI  U U U U U  12  12   4   4   4
660 move      16  al    d     0011001111000...  ..........  U U U U U  16  16   6   6   6
661 move      16  al    a     0011001111001...  ..........  U U U U U  16  16   6   6   6
662 move      16  al    .     0011001111......  A+-DXWLdxI  U U U U U  16  16   6   6   6
663 move      32  d     d     0010...000000...  ..........  U U U U U   4   4   2   2   2
664 move      32  d     a     0010...000001...  ..........  U U U U U   4   4   2   2   2
665 move      32  d     .     0010...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
666 move      32  ai    d     0010...010000...  ..........  U U U U U  12  12   4   4   4
667 move      32  ai    a     0010...010001...  ..........  U U U U U  12  12   4   4   4
668 move      32  ai    .     0010...010......  A+-DXWLdxI  U U U U U  12  12   4   4   4
669 move      32  pi    d     0010...011000...  ..........  U U U U U  12  12   4   4   4
670 move      32  pi    a     0010...011001...  ..........  U U U U U  12  12   4   4   4
671 move      32  pi    .     0010...011......  A+-DXWLdxI  U U U U U  12  12   4   4   4
672 move      32  pd    d     0010...100000...  ..........  U U U U U  12  14   5   5   5
673 move      32  pd    a     0010...100001...  ..........  U U U U U  12  14   5   5   5
674 move      32  pd    .     0010...100......  A+-DXWLdxI  U U U U U  12  14   5   5   5
675 move      32  di    d     0010...101000...  ..........  U U U U U  16  16   5   5   5
676 move      32  di    a     0010...101001...  ..........  U U U U U  16  16   5   5   5
677 move      32  di    .     0010...101......  A+-DXWLdxI  U U U U U  16  16   5   5   5
678 move      32  ix    d     0010...110000...  ..........  U U U U U  18  18   7   7   7
679 move      32  ix    a     0010...110001...  ..........  U U U U U  18  18   7   7   7
680 move      32  ix    .     0010...110......  A+-DXWLdxI  U U U U U  18  18   7   7   7
681 move      32  aw    d     0010000111000...  ..........  U U U U U  16  16   4   4   4
682 move      32  aw    a     0010000111001...  ..........  U U U U U  16  16   4   4   4
683 move      32  aw    .     0010000111......  A+-DXWLdxI  U U U U U  16  16   4   4   4
684 move      32  al    d     0010001111000...  ..........  U U U U U  20  20   6   6   6
685 move      32  al    a     0010001111001...  ..........  U U U U U  20  20   6   6   6
686 move      32  al    .     0010001111......  A+-DXWLdxI  U U U U U  20  20   6   6   6
687 movea     16  .     d     0011...001000...  ..........  U U U U U   4   4   2   2   2
688 movea     16  .     a     0011...001001...  ..........  U U U U U   4   4   2   2   2
689 movea     16  .     .     0011...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
690 movea     32  .     d     0010...001000...  ..........  U U U U U   4   4   2   2   2
691 movea     32  .     a     0010...001001...  ..........  U U U U U   4   4   2   2   2
692 movea     32  .     .     0010...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
693 move      16  frc   d     0100001011000...  ..........  . U U U U   .   4   4   4   4
694 move      16  frc   .     0100001011......  A+-DXWL...  . U U U U   .   8   4   4   4
695 move      16  toc   d     0100010011000...  ..........  U U U U U  12  12   4   4   4
696 move      16  toc   .     0100010011......  A+-DXWLdxI  U U U U U  12  12   4   4   4
697 move      16  frs   d     0100000011000...  ..........  U S S S S   6   4   8   8   8  U only for 000
698 move      16  frs   .     0100000011......  A+-DXWL...  U S S S S   8   8   8   8   8  U only for 000
699 move      16  tos   d     0100011011000...  ..........  S S S S S  12  12   8   8   8
700 move      16  tos   .     0100011011......  A+-DXWLdxI  S S S S S  12  12   8   8   8
701 move      32  fru   .     0100111001101...  ..........  S S S S S   4   6   2   2   2
702 move      32  tou   .     0100111001100...  ..........  S S S S S   4   6   2   2   2
703 movec     32  cr    .     0100111001111010  ..........  . S S S S   .  12   6   6   6
704 movec     32  rc    .     0100111001111011  ..........  . S S S S   .  10  12  12  12
705 movem     16  re    pd    0100100010100...  ..........  U U U U U   8   8   4   4   4
706 movem     16  re    .     0100100010......  A..DXWL...  U U U U U   8   8   4   4   4
707 movem     32  re    pd    0100100011100...  ..........  U U U U U   8   8   4   4   4
708 movem     32  re    .     0100100011......  A..DXWL...  U U U U U   8   8   4   4   4
709 movem     16  er    pi    0100110010011...  ..........  U U U U U  12  12   8   8   8
710 movem     16  er    pcdi  0100110010111010  ..........  U U U U U  16  16   9   9   9
711 movem     16  er    pcix  0100110010111011  ..........  U U U U U  18  18  11  11  11
712 movem     16  er    .     0100110010......  A..DXWL...  U U U U U  12  12   8   8   8
713 movem     32  er    pi    0100110011011...  ..........  U U U U U  12  12   8   8   8
714 movem     32  er    pcdi  0100110011111010  ..........  U U U U U  16  16   9   9   9
715 movem     32  er    pcix  0100110011111011  ..........  U U U U U  18  18  11  11  11
716 movem     32  er    .     0100110011......  A..DXWL...  U U U U U  12  12   8   8   8
717 movep     16  er    .     0000...100001...  ..........  U U U U U  16  16  12  12  12
718 movep     32  er    .     0000...101001...  ..........  U U U U U  24  24  18  18  18
719 movep     16  re    .     0000...110001...  ..........  U U U U U  16  16  11  11  11
720 movep     32  re    .     0000...111001...  ..........  U U U U U  24  24  17  17  17
721 moveq     32  .     .     0111...0........  ..........  U U U U U   4   4   2   2   2
722 moves      8  .     .     0000111000......  A+-DXWL...  . S S S S   .  14   5   5   5
723 moves     16  .     .     0000111001......  A+-DXWL...  . S S S S   .  14   5   5   5
724 moves     32  .     .     0000111010......  A+-DXWL...  . S S S S   .  16   5   5   5
725 move16    32  .     .     1111011000100...  ..........  . . . . U   .   .   .   .   4  TODO: correct timing
726 muls      16  .     d     1100...111000...  ..........  U U U U U  54  32  27  27  27
727 muls      16  .     .     1100...111......  A+-DXWLdxI  U U U U U  54  32  27  27  27
728 mulu      16  .     d     1100...011000...  ..........  U U U U U  54  30  27  27  27
729 mulu      16  .     .     1100...011......  A+-DXWLdxI  U U U U U  54  30  27  27  27
730 mull      32  .     d     0100110000000...  ..........  . . U U U   .   .  43  43  43
731 mull      32  .     .     0100110000......  A+-DXWLdxI  . . U U U   .   .  43  43  43
732 nbcd       8  .     d     0100100000000...  ..........  U U U U U   6   6   6   6   6
733 nbcd       8  .     .     0100100000......  A+-DXWL...  U U U U U   8   8   6   6   6
734 neg        8  .     d     0100010000000...  ..........  U U U U U   4   4   2   2   2
735 neg        8  .     .     0100010000......  A+-DXWL...  U U U U U   8   8   4   4   4
736 neg       16  .     d     0100010001000...  ..........  U U U U U   4   4   2   2   2
737 neg       16  .     .     0100010001......  A+-DXWL...  U U U U U   8   8   4   4   4
738 neg       32  .     d     0100010010000...  ..........  U U U U U   6   6   2   2   2
739 neg       32  .     .     0100010010......  A+-DXWL...  U U U U U  12  12   4   4   4
740 negx       8  .     d     0100000000000...  ..........  U U U U U   4   4   2   2   2
741 negx       8  .     .     0100000000......  A+-DXWL...  U U U U U   8   8   4   4   4
742 negx      16  .     d     0100000001000...  ..........  U U U U U   4   4   2   2   2
743 negx      16  .     .     0100000001......  A+-DXWL...  U U U U U   8   8   4   4   4
744 negx      32  .     d     0100000010000...  ..........  U U U U U   6   6   2   2   2
745 negx      32  .     .     0100000010......  A+-DXWL...  U U U U U  12  12   4   4   4
746 nop        0  .     .     0100111001110001  ..........  U U U U U   4   4   2   2   2
747 not        8  .     d     0100011000000...  ..........  U U U U U   4   4   2   2   2
748 not        8  .     .     0100011000......  A+-DXWL...  U U U U U   8   8   4   4   4
749 not       16  .     d     0100011001000...  ..........  U U U U U   4   4   2   2   2
750 not       16  .     .     0100011001......  A+-DXWL...  U U U U U   8   8   4   4   4
751 not       32  .     d     0100011010000...  ..........  U U U U U   6   6   2   2   2
752 not       32  .     .     0100011010......  A+-DXWL...  U U U U U  12  12   4   4   4
753 or         8  er    d     1000...000000...  ..........  U U U U U   4   4   2   2   2
754 or         8  er    .     1000...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
755 or        16  er    d     1000...001000...  ..........  U U U U U   4   4   2   2   2
756 or        16  er    .     1000...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
757 or        32  er    d     1000...010000...  ..........  U U U U U   6   6   2   2   2
758 or        32  er    .     1000...010......  A+-DXWLdxI  U U U U U   6   6   2   2   2
759 or         8  re    .     1000...100......  A+-DXWL...  U U U U U   8   8   4   4   4
760 or        16  re    .     1000...101......  A+-DXWL...  U U U U U   8   8   4   4   4
761 or        32  re    .     1000...110......  A+-DXWL...  U U U U U  12  12   4   4   4
762 ori       16  toc   .     0000000000111100  ..........  U U U U U  20  16  12  12  12
763 ori       16  tos   .     0000000001111100  ..........  S S S S S  20  16  12  12  12
764 ori        8  .     d     0000000000000...  ..........  U U U U U   8   8   2   2   2
765 ori        8  .     .     0000000000......  A+-DXWL...  U U U U U  12  12   4   4   4
766 ori       16  .     d     0000000001000...  ..........  U U U U U   8   8   2   2   2
767 ori       16  .     .     0000000001......  A+-DXWL...  U U U U U  12  12   4   4   4
768 ori       32  .     d     0000000010000...  ..........  U U U U U  16  14   2   2   2
769 ori       32  .     .     0000000010......  A+-DXWL...  U U U U U  20  20   4   4   4
770 pack      16  rr    .     1000...101000...  ..........  . . U U U   .   .   6   6   6
771 pack      16  mm    ax7   1000111101001...  ..........  . . U U U   .   .  13  13  13
772 pack      16  mm    ay7   1000...101001111  ..........  . . U U U   .   .  13  13  13
773 pack      16  mm    axy7  1000111101001111  ..........  . . U U U   .   .  13  13  13
774 pack      16  mm    .     1000...101001...  ..........  . . U U U   .   .  13  13  13
775 pea       32  .     .     0100100001......  A..DXWLdx.  U U U U U   6   6   5   5   5
776 pflusha   32  .     .     1111010100011...  ..........  . . . . S   .   .   .   .   4   TODO: correct timing
777 pflushan  32  .     .     1111010100010...  ..........  . . . . S   .   .   .   .   4   TODO: correct timing
778 pmmu      32  .     .     1111000.........  ..........  . . S S S   .   .   8   8   8
779 reset      0  .     .     0100111001110000  ..........  S S S S S   0   0   0   0   0
780 ror        8  s     .     1110...000011...  ..........  U U U U U   6   6   8   8   8
781 ror       16  s     .     1110...001011...  ..........  U U U U U   6   6   8   8   8
782 ror       32  s     .     1110...010011...  ..........  U U U U U   8   8   8   8   8
783 ror        8  r     .     1110...000111...  ..........  U U U U U   6   6   8   8   8
784 ror       16  r     .     1110...001111...  ..........  U U U U U   6   6   8   8   8
785 ror       32  r     .     1110...010111...  ..........  U U U U U   8   8   8   8   8
786 ror       16  .     .     1110011011......  A+-DXWL...  U U U U U   8   8   7   7   7
787 rol        8  s     .     1110...100011...  ..........  U U U U U   6   6   8   8   8
788 rol       16  s     .     1110...101011...  ..........  U U U U U   6   6   8   8   8
789 rol       32  s     .     1110...110011...  ..........  U U U U U   8   8   8   8   8
790 rol        8  r     .     1110...100111...  ..........  U U U U U   6   6   8   8   8
791 rol       16  r     .     1110...101111...  ..........  U U U U U   6   6   8   8   8
792 rol       32  r     .     1110...110111...  ..........  U U U U U   8   8   8   8   8
793 rol       16  .     .     1110011111......  A+-DXWL...  U U U U U   8   8   7   7   7
794 roxr       8  s     .     1110...000010...  ..........  U U U U U   6   6  12  12  12
795 roxr      16  s     .     1110...001010...  ..........  U U U U U   6   6  12  12  12
796 roxr      32  s     .     1110...010010...  ..........  U U U U U   8   8  12  12  12
797 roxr       8  r     .     1110...000110...  ..........  U U U U U   6   6  12  12  12
798 roxr      16  r     .     1110...001110...  ..........  U U U U U   6   6  12  12  12
799 roxr      32  r     .     1110...010110...  ..........  U U U U U   8   8  12  12  12
800 roxr      16  .     .     1110010011......  A+-DXWL...  U U U U U   8   8   5   5   5
801 roxl       8  s     .     1110...100010...  ..........  U U U U U   6   6  12  12  12
802 roxl      16  s     .     1110...101010...  ..........  U U U U U   6   6  12  12  12
803 roxl      32  s     .     1110...110010...  ..........  U U U U U   8   8  12  12  12
804 roxl       8  r     .     1110...100110...  ..........  U U U U U   6   6  12  12  12
805 roxl      16  r     .     1110...101110...  ..........  U U U U U   6   6  12  12  12
806 roxl      32  r     .     1110...110110...  ..........  U U U U U   8   8  12  12  12
807 roxl      16  .     .     1110010111......  A+-DXWL...  U U U U U   8   8   5   5   5
808 rtd       32  .     .     0100111001110100  ..........  . U U U U   .  16  10  10  10
809 rte       32  .     .     0100111001110011  ..........  S S S S S  20  24  20  20  20  bus fault not emulated
810 rtm       32  .     .     000001101100....  ..........  . . U U U   .   .  19  19  19  not properly emulated
811 rtr       32  .     .     0100111001110111  ..........  U U U U U  20  20  14  14  14
812 rts       32  .     .     0100111001110101  ..........  U U U U U  16  16  10  10  10
813 sbcd       8  rr    .     1000...100000...  ..........  U U U U U   6   6   4   4   4
814 sbcd       8  mm    ax7   1000111100001...  ..........  U U U U U  18  18  16  16  16
815 sbcd       8  mm    ay7   1000...100001111  ..........  U U U U U  18  18  16  16  16
816 sbcd       8  mm    axy7  1000111100001111  ..........  U U U U U  18  18  16  16  16
817 sbcd       8  mm    .     1000...100001...  ..........  U U U U U  18  18  16  16  16
818 st         8  .     d     0101000011000...  ..........  U U U U U   6   4   4   4   4
819 st         8  .     .     0101000011......  A+-DXWL...  U U U U U   8   8   6   6   6
820 sf         8  .     d     0101000111000...  ..........  U U U U U   4   4   4   4   4
821 sf         8  .     .     0101000111......  A+-DXWL...  U U U U U   8   8   6   6   6
822 scc        8  .     d     0101....11000...  ..........  U U U U U   4   4   4   4   4
823 scc        8  .     .     0101....11......  A+-DXWL...  U U U U U   8   8   6   6   6
824 stop       0  .     .     0100111001110010  ..........  S S S S S   4   4   8   8   8
825 sub        8  er    d     1001...000000...  ..........  U U U U U   4   4   2   2   2
826 sub        8  er    .     1001...000......  A+-DXWLdxI  U U U U U   4   4   2   2   2
827 sub       16  er    d     1001...001000...  ..........  U U U U U   4   4   2   2   2
828 sub       16  er    a     1001...001001...  ..........  U U U U U   4   4   2   2   2
829 sub       16  er    .     1001...001......  A+-DXWLdxI  U U U U U   4   4   2   2   2
830 sub       32  er    d     1001...010000...  ..........  U U U U U   6   6   2   2   2
831 sub       32  er    a     1001...010001...  ..........  U U U U U   6   6   2   2   2
832 sub       32  er    .     1001...010......  A+-DXWLdxI  U U U U U   6   6   2   2   2
833 sub        8  re    .     1001...100......  A+-DXWL...  U U U U U   8   8   4   4   4
834 sub       16  re    .     1001...101......  A+-DXWL...  U U U U U   8   8   4   4   4
835 sub       32  re    .     1001...110......  A+-DXWL...  U U U U U  12  12   4   4   4
836 suba      16  .     d     1001...011000...  ..........  U U U U U   8   8   2   2   2
837 suba      16  .     a     1001...011001...  ..........  U U U U U   8   8   2   2   2
838 suba      16  .     .     1001...011......  A+-DXWLdxI  U U U U U   8   8   2   2   2
839 suba      32  .     d     1001...111000...  ..........  U U U U U   6   6   2   2   2
840 suba      32  .     a     1001...111001...  ..........  U U U U U   6   6   2   2   2
841 suba      32  .     .     1001...111......  A+-DXWLdxI  U U U U U   6   6   2   2   2
842 subi       8  .     d     0000010000000...  ..........  U U U U U   8   8   2   2   2
843 subi       8  .     .     0000010000......  A+-DXWL...  U U U U U  12  12   4   4   4
844 subi      16  .     d     0000010001000...  ..........  U U U U U   8   8   2   2   2
845 subi      16  .     .     0000010001......  A+-DXWL...  U U U U U  12  12   4   4   4
846 subi      32  .     d     0000010010000...  ..........  U U U U U  16  14   2   2   2
847 subi      32  .     .     0000010010......  A+-DXWL...  U U U U U  20  20   4   4   4
848 subq       8  .     d     0101...100000...  ..........  U U U U U   4   4   2   2   2
849 subq       8  .     .     0101...100......  A+-DXWL...  U U U U U   8   8   4   4   4
850 subq      16  .     d     0101...101000...  ..........  U U U U U   4   4   2   2   2
851 subq      16  .     a     0101...101001...  ..........  U U U U U   8   4   2   2   2
852 subq      16  .     .     0101...101......  A+-DXWL...  U U U U U   8   8   4   4   4
853 subq      32  .     d     0101...110000...  ..........  U U U U U   8   8   2   2   2
854 subq      32  .     a     0101...110001...  ..........  U U U U U   8   8   2   2   2
855 subq      32  .     .     0101...110......  A+-DXWL...  U U U U U  12  12   4   4   4
856 subx       8  rr    .     1001...100000...  ..........  U U U U U   4   4   2   2   2
857 subx      16  rr    .     1001...101000...  ..........  U U U U U   4   4   2   2   2
858 subx      32  rr    .     1001...110000...  ..........  U U U U U   8   6   2   2   2
859 subx       8  mm    ax7   1001111100001...  ..........  U U U U U  18  18  12  12  12
860 subx       8  mm    ay7   1001...100001111  ..........  U U U U U  18  18  12  12  12
861 subx       8  mm    axy7  1001111100001111  ..........  U U U U U  18  18  12  12  12
862 subx       8  mm    .     1001...100001...  ..........  U U U U U  18  18  12  12  12
863 subx      16  mm    .     1001...101001...  ..........  U U U U U  18  18  12  12  12
864 subx      32  mm    .     1001...110001...  ..........  U U U U U  30  30  12  12  12
865 swap      32  .     .     0100100001000...  ..........  U U U U U   4   4   4   4   4
866 tas        8  .     d     0100101011000...  ..........  U U U U U   4   4   4   4   4
867 tas        8  .     .     0100101011......  A+-DXWL...  U U U U U  14  14  12  12  12
868 trap       0  .     .     010011100100....  ..........  U U U U U   4   4   4   4   4
869 trapt      0  .     .     0101000011111100  ..........  . . U U U   .   .   4   4   4
870 trapt     16  .     .     0101000011111010  ..........  . . U U U   .   .   6   6   6
871 trapt     32  .     .     0101000011111011  ..........  . . U U U   .   .   8   8   8
872 trapf      0  .     .     0101000111111100  ..........  . . U U U   .   .   4   4   4
873 trapf     16  .     .     0101000111111010  ..........  . . U U U   .   .   6   6   6
874 trapf     32  .     .     0101000111111011  ..........  . . U U U   .   .   8   8   8
875 trapcc     0  .     .     0101....11111100  ..........  . . U U U   .   .   4   4   4
876 trapcc    16  .     .     0101....11111010  ..........  . . U U U   .   .   6   6   6
877 trapcc    32  .     .     0101....11111011  ..........  . . U U U   .   .   8   8   8
878 trapv      0  .     .     0100111001110110  ..........  U U U U U   4   4   4   4   4
879 tst        8  .     d     0100101000000...  ..........  U U U U U   4   4   2   2   2
880 tst        8  .     .     0100101000......  A+-DXWL...  U U U U U   4   4   2   2   2
881 tst        8  .     pcdi  0100101000111010  ..........  . . U U U   .   .   7   7   7
882 tst        8  .     pcix  0100101000111011  ..........  . . U U U   .   .   9   9   9
883 tst        8  .     i     0100101000111100  ..........  . . U U U   .   .   6   6   6
884 tst       16  .     d     0100101001000...  ..........  U U U U U   4   4   2   2   2
885 tst       16  .     a     0100101001001...  ..........  . . U U U   .   .   2   2   2
886 tst       16  .     .     0100101001......  A+-DXWL...  U U U U U   4   4   2   2   2
887 tst       16  .     pcdi  0100101001111010  ..........  . . U U U   .   .   7   7   7
888 tst       16  .     pcix  0100101001111011  ..........  . . U U U   .   .   9   9   9
889 tst       16  .     i     0100101001111100  ..........  . . U U U   .   .   6   6   6
890 tst       32  .     d     0100101010000...  ..........  U U U U U   4   4   2   2   2
891 tst       32  .     a     0100101010001...  ..........  . . U U U   .   .   2   2   2
892 tst       32  .     .     0100101010......  A+-DXWL...  U U U U U   4   4   2   2   2
893 tst       32  .     pcdi  0100101010111010  ..........  . . U U U   .   .   7   7   7
894 tst       32  .     pcix  0100101010111011  ..........  . . U U U   .   .   9   9   9
895 tst       32  .     i     0100101010111100  ..........  . . U U U   .   .   6   6   6
896 unlk      32  .     a7    0100111001011111  ..........  U U U U U  12  12   6   6   6
897 unlk      32  .     .     0100111001011...  ..........  U U U U U  12  12   6   6   6
898 unpk      16  rr    .     1000...110000...  ..........  . . U U U   .   .   8   8   8
899 unpk      16  mm    ax7   1000111110001...  ..........  . . U U U   .   .  13  13  13
900 unpk      16  mm    ay7   1000...110001111  ..........  . . U U U   .   .  13  13  13
901 unpk      16  mm    axy7  1000111110001111  ..........  . . U U U   .   .  13  13  13
902 unpk      16  mm    .     1000...110001...  ..........  . . U U U   .   .  13  13  13
903
904
905
906 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
907 M68KMAKE_OPCODE_HANDLER_BODY
908
909 M68KMAKE_OP(1010, 0, ., .)
910 {
911         m68ki_exception_1010(state);
912 }
913
914
915 M68KMAKE_OP(1111, 0, ., .)
916 {
917         m68ki_exception_1111(state);
918 }
919
920
921 M68KMAKE_OP(040fpu0, 32, ., .)
922 {
923 //      printf("FPU 040fpu0 HAS_FPU=%d\n",!!HAS_FPU);
924         if(HAS_FPU)
925         {
926                 m68040_fpu_op0(state);
927                 return;
928         }
929         m68ki_exception_1111(state);
930 }
931
932
933 M68KMAKE_OP(040fpu1, 32, ., .)
934 {
935 //      printf("FPU 040fpu1 HAS_FPU=%d\n",!!HAS_FPU);
936         if(HAS_FPU)
937         {
938                 m68040_fpu_op1(state);
939                 return;
940         }
941         m68ki_exception_1111(state);
942 }
943
944
945
946 M68KMAKE_OP(abcd, 8, rr, .)
947 {
948         uint* r_dst = &DX;
949         uint src = DY;
950         uint dst = *r_dst;
951         uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
952         uint corf = 0;
953
954         if(res > 9)
955                 corf = 6;
956         res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
957         FLAG_V = ~res; /* Undefined V behavior */
958         res += corf;
959         FLAG_X = FLAG_C = (res > 0x9f) << 8;
960         if(FLAG_C)
961                 res -= 0xa0;
962
963         FLAG_V &= res; /* Undefined V behavior part II */
964         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
965
966         res = MASK_OUT_ABOVE_8(res);
967         FLAG_Z |= res;
968
969         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
970 }
971
972
973 M68KMAKE_OP(abcd, 8, mm, ax7)
974 {
975         uint src = OPER_AY_PD_8(state);
976         uint ea  = EA_A7_PD_8();
977         uint dst = m68ki_read_8(state, ea);
978         uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
979         uint corf = 0;
980
981         if(res > 9)
982                 corf = 6;
983         res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
984         FLAG_V = ~res; /* Undefined V behavior */
985         res += corf;
986         FLAG_X = FLAG_C = (res > 0x9f) << 8;
987         if(FLAG_C)
988                 res -= 0xa0;
989
990         FLAG_V &= res; /* Undefined V behavior part II */
991         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
992
993         res = MASK_OUT_ABOVE_8(res);
994         FLAG_Z |= res;
995
996         m68ki_write_8(state, ea, res);
997 }
998
999
1000 M68KMAKE_OP(abcd, 8, mm, ay7)
1001 {
1002         uint src = OPER_A7_PD_8(state);
1003         uint ea  = EA_AX_PD_8();
1004         uint dst = m68ki_read_8(state, ea);
1005         uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
1006         uint corf = 0;
1007
1008         if(res > 9)
1009                 corf = 6;
1010         res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
1011         FLAG_V = ~res; /* Undefined V behavior */
1012         res += corf;
1013         FLAG_X = FLAG_C = (res > 0x9f) << 8;
1014         if(FLAG_C)
1015                 res -= 0xa0;
1016
1017         FLAG_V &= res; /* Undefined V behavior part II */
1018         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
1019
1020         res = MASK_OUT_ABOVE_8(res);
1021         FLAG_Z |= res;
1022
1023         m68ki_write_8(state, ea, res);
1024 }
1025
1026
1027 M68KMAKE_OP(abcd, 8, mm, axy7)
1028 {
1029         uint src = OPER_A7_PD_8(state);
1030         uint ea  = EA_A7_PD_8();
1031         uint dst = m68ki_read_8(state, ea);
1032         uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
1033         uint corf = 0;
1034
1035         if(res > 9)
1036                 corf = 6;
1037         res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
1038         FLAG_V = ~res; /* Undefined V behavior */
1039         res += corf;
1040         FLAG_X = FLAG_C = (res > 0x9f) << 8;
1041         if(FLAG_C)
1042                 res -= 0xa0;
1043
1044         FLAG_V &= res; /* Undefined V behavior part II */
1045         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
1046
1047         res = MASK_OUT_ABOVE_8(res);
1048         FLAG_Z |= res;
1049
1050         m68ki_write_8(state, ea, res);
1051 }
1052
1053
1054 M68KMAKE_OP(abcd, 8, mm, .)
1055 {
1056         uint src = OPER_AY_PD_8(state);
1057         uint ea  = EA_AX_PD_8();
1058         uint dst = m68ki_read_8(state, ea);
1059         uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
1060         uint corf = 0;
1061
1062         if(res > 9)
1063                 corf = 6;
1064         res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
1065         FLAG_V = ~res; /* Undefined V behavior */
1066         res  += corf;
1067         FLAG_X = FLAG_C = (res > 0x9f) << 8;
1068         if(FLAG_C)
1069                 res -= 0xa0;
1070
1071         FLAG_V &= res; /* Undefined V behavior part II */
1072         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
1073
1074         res = MASK_OUT_ABOVE_8(res);
1075         FLAG_Z |= res;
1076
1077         m68ki_write_8(state, ea, res);
1078 }
1079
1080
1081 M68KMAKE_OP(add, 8, er, d)
1082 {
1083         uint* r_dst = &DX;
1084         uint src = MASK_OUT_ABOVE_8(DY);
1085         uint dst = MASK_OUT_ABOVE_8(*r_dst);
1086         uint res = src + dst;
1087
1088         FLAG_N = NFLAG_8(res);
1089         FLAG_V = VFLAG_ADD_8(src, dst, res);
1090         FLAG_X = FLAG_C = CFLAG_8(res);
1091         FLAG_Z = MASK_OUT_ABOVE_8(res);
1092
1093         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
1094 }
1095
1096
1097 M68KMAKE_OP(add, 8, er, .)
1098 {
1099         uint* r_dst = &DX;
1100         uint src = M68KMAKE_GET_OPER_AY_8;
1101         uint dst = MASK_OUT_ABOVE_8(*r_dst);
1102         uint res = src + dst;
1103
1104         FLAG_N = NFLAG_8(res);
1105         FLAG_V = VFLAG_ADD_8(src, dst, res);
1106         FLAG_X = FLAG_C = CFLAG_8(res);
1107         FLAG_Z = MASK_OUT_ABOVE_8(res);
1108
1109         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
1110 }
1111
1112
1113 M68KMAKE_OP(add, 16, er, d)
1114 {
1115         uint* r_dst = &DX;
1116         uint src = MASK_OUT_ABOVE_16(DY);
1117         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1118         uint res = src + dst;
1119
1120         FLAG_N = NFLAG_16(res);
1121         FLAG_V = VFLAG_ADD_16(src, dst, res);
1122         FLAG_X = FLAG_C = CFLAG_16(res);
1123         FLAG_Z = MASK_OUT_ABOVE_16(res);
1124
1125         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
1126 }
1127
1128
1129 M68KMAKE_OP(add, 16, er, a)
1130 {
1131         uint* r_dst = &DX;
1132         uint src = MASK_OUT_ABOVE_16(AY);
1133         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1134         uint res = src + dst;
1135
1136         FLAG_N = NFLAG_16(res);
1137         FLAG_V = VFLAG_ADD_16(src, dst, res);
1138         FLAG_X = FLAG_C = CFLAG_16(res);
1139         FLAG_Z = MASK_OUT_ABOVE_16(res);
1140
1141         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
1142 }
1143
1144
1145 M68KMAKE_OP(add, 16, er, .)
1146 {
1147         uint* r_dst = &DX;
1148         uint src = M68KMAKE_GET_OPER_AY_16;
1149         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1150         uint res = src + dst;
1151
1152         FLAG_N = NFLAG_16(res);
1153         FLAG_V = VFLAG_ADD_16(src, dst, res);
1154         FLAG_X = FLAG_C = CFLAG_16(res);
1155         FLAG_Z = MASK_OUT_ABOVE_16(res);
1156
1157         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
1158 }
1159
1160
1161 M68KMAKE_OP(add, 32, er, d)
1162 {
1163         uint* r_dst = &DX;
1164         uint src = DY;
1165         uint dst = *r_dst;
1166         uint res = src + dst;
1167
1168         FLAG_N = NFLAG_32(res);
1169         FLAG_V = VFLAG_ADD_32(src, dst, res);
1170         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1171         FLAG_Z = MASK_OUT_ABOVE_32(res);
1172
1173         *r_dst = FLAG_Z;
1174 }
1175
1176
1177 M68KMAKE_OP(add, 32, er, a)
1178 {
1179         uint* r_dst = &DX;
1180         uint src = AY;
1181         uint dst = *r_dst;
1182         uint res = src + dst;
1183
1184         FLAG_N = NFLAG_32(res);
1185         FLAG_V = VFLAG_ADD_32(src, dst, res);
1186         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1187         FLAG_Z = MASK_OUT_ABOVE_32(res);
1188
1189         *r_dst = FLAG_Z;
1190 }
1191
1192
1193 M68KMAKE_OP(add, 32, er, .)
1194 {
1195         uint* r_dst = &DX;
1196         uint src = M68KMAKE_GET_OPER_AY_32;
1197         uint dst = *r_dst;
1198         uint res = src + dst;
1199
1200         FLAG_N = NFLAG_32(res);
1201         FLAG_V = VFLAG_ADD_32(src, dst, res);
1202         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1203         FLAG_Z = MASK_OUT_ABOVE_32(res);
1204
1205         *r_dst = FLAG_Z;
1206 }
1207
1208
1209 M68KMAKE_OP(add, 8, re, .)
1210 {
1211         uint ea = M68KMAKE_GET_EA_AY_8;
1212         uint src = MASK_OUT_ABOVE_8(DX);
1213         uint dst = m68ki_read_8(state, ea);
1214         uint res = src + dst;
1215
1216         FLAG_N = NFLAG_8(res);
1217         FLAG_V = VFLAG_ADD_8(src, dst, res);
1218         FLAG_X = FLAG_C = CFLAG_8(res);
1219         FLAG_Z = MASK_OUT_ABOVE_8(res);
1220
1221         m68ki_write_8(state, ea, FLAG_Z);
1222 }
1223
1224
1225 M68KMAKE_OP(add, 16, re, .)
1226 {
1227         uint ea = M68KMAKE_GET_EA_AY_16;
1228         uint src = MASK_OUT_ABOVE_16(DX);
1229         uint dst = m68ki_read_16(state, ea);
1230         uint res = src + dst;
1231
1232         FLAG_N = NFLAG_16(res);
1233         FLAG_V = VFLAG_ADD_16(src, dst, res);
1234         FLAG_X = FLAG_C = CFLAG_16(res);
1235         FLAG_Z = MASK_OUT_ABOVE_16(res);
1236
1237         m68ki_write_16(state, ea, FLAG_Z);
1238 }
1239
1240
1241 M68KMAKE_OP(add, 32, re, .)
1242 {
1243         uint ea = M68KMAKE_GET_EA_AY_32;
1244         uint src = DX;
1245         uint dst = m68ki_read_32(state, ea);
1246         uint res = src + dst;
1247
1248         FLAG_N = NFLAG_32(res);
1249         FLAG_V = VFLAG_ADD_32(src, dst, res);
1250         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1251         FLAG_Z = MASK_OUT_ABOVE_32(res);
1252
1253         m68ki_write_32(state, ea, FLAG_Z);
1254 }
1255
1256
1257 M68KMAKE_OP(adda, 16, ., d)
1258 {
1259         uint* r_dst = &AX;
1260
1261         *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY));
1262 }
1263
1264
1265 M68KMAKE_OP(adda, 16, ., a)
1266 {
1267         uint* r_dst = &AX;
1268
1269         *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY));
1270 }
1271
1272
1273 M68KMAKE_OP(adda, 16, ., .)
1274 {
1275         uint* r_dst = &AX;
1276         uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
1277
1278         *r_dst = MASK_OUT_ABOVE_32(*r_dst + src);
1279 }
1280
1281
1282 M68KMAKE_OP(adda, 32, ., d)
1283 {
1284         uint* r_dst = &AX;
1285
1286         *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY);
1287 }
1288
1289
1290 M68KMAKE_OP(adda, 32, ., a)
1291 {
1292         uint* r_dst = &AX;
1293
1294         *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY);
1295 }
1296
1297
1298 M68KMAKE_OP(adda, 32, ., .)
1299 {
1300         uint src = M68KMAKE_GET_OPER_AY_32;
1301         uint* r_dst = &AX;
1302
1303         *r_dst = MASK_OUT_ABOVE_32(*r_dst + src);
1304 }
1305
1306
1307 M68KMAKE_OP(addi, 8, ., d)
1308 {
1309         uint* r_dst = &DY;
1310         uint src = OPER_I_8(state);
1311         uint dst = MASK_OUT_ABOVE_8(*r_dst);
1312         uint res = src + dst;
1313
1314         FLAG_N = NFLAG_8(res);
1315         FLAG_V = VFLAG_ADD_8(src, dst, res);
1316         FLAG_X = FLAG_C = CFLAG_8(res);
1317         FLAG_Z = MASK_OUT_ABOVE_8(res);
1318
1319         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
1320 }
1321
1322
1323 M68KMAKE_OP(addi, 8, ., .)
1324 {
1325         uint src = OPER_I_8(state);
1326         uint ea = M68KMAKE_GET_EA_AY_8;
1327         uint dst = m68ki_read_8(state, ea);
1328         uint res = src + dst;
1329
1330         FLAG_N = NFLAG_8(res);
1331         FLAG_V = VFLAG_ADD_8(src, dst, res);
1332         FLAG_X = FLAG_C = CFLAG_8(res);
1333         FLAG_Z = MASK_OUT_ABOVE_8(res);
1334
1335         m68ki_write_8(state, ea, FLAG_Z);
1336 }
1337
1338
1339 M68KMAKE_OP(addi, 16, ., d)
1340 {
1341         uint* r_dst = &DY;
1342         uint src = OPER_I_16(state);
1343         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1344         uint res = src + dst;
1345
1346         FLAG_N = NFLAG_16(res);
1347         FLAG_V = VFLAG_ADD_16(src, dst, res);
1348         FLAG_X = FLAG_C = CFLAG_16(res);
1349         FLAG_Z = MASK_OUT_ABOVE_16(res);
1350
1351         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
1352 }
1353
1354
1355 M68KMAKE_OP(addi, 16, ., .)
1356 {
1357         uint src = OPER_I_16(state);
1358         uint ea = M68KMAKE_GET_EA_AY_16;
1359         uint dst = m68ki_read_16(state, ea);
1360         uint res = src + dst;
1361
1362         FLAG_N = NFLAG_16(res);
1363         FLAG_V = VFLAG_ADD_16(src, dst, res);
1364         FLAG_X = FLAG_C = CFLAG_16(res);
1365         FLAG_Z = MASK_OUT_ABOVE_16(res);
1366
1367         m68ki_write_16(state, ea, FLAG_Z);
1368 }
1369
1370
1371 M68KMAKE_OP(addi, 32, ., d)
1372 {
1373         uint* r_dst = &DY;
1374         uint src = OPER_I_32(state);
1375         uint dst = *r_dst;
1376         uint res = src + dst;
1377
1378         FLAG_N = NFLAG_32(res);
1379         FLAG_V = VFLAG_ADD_32(src, dst, res);
1380         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1381         FLAG_Z = MASK_OUT_ABOVE_32(res);
1382
1383         *r_dst = FLAG_Z;
1384 }
1385
1386
1387 M68KMAKE_OP(addi, 32, ., .)
1388 {
1389         uint src = OPER_I_32(state);
1390         uint ea = M68KMAKE_GET_EA_AY_32;
1391         uint dst = m68ki_read_32(state, ea);
1392         uint res = src + dst;
1393
1394         FLAG_N = NFLAG_32(res);
1395         FLAG_V = VFLAG_ADD_32(src, dst, res);
1396         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1397         FLAG_Z = MASK_OUT_ABOVE_32(res);
1398
1399         m68ki_write_32(state, ea, FLAG_Z);
1400 }
1401
1402
1403 M68KMAKE_OP(addq, 8, ., d)
1404 {
1405         uint* r_dst = &DY;
1406         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1407         uint dst = MASK_OUT_ABOVE_8(*r_dst);
1408         uint res = src + dst;
1409
1410         FLAG_N = NFLAG_8(res);
1411         FLAG_V = VFLAG_ADD_8(src, dst, res);
1412         FLAG_X = FLAG_C = CFLAG_8(res);
1413         FLAG_Z = MASK_OUT_ABOVE_8(res);
1414
1415         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
1416 }
1417
1418
1419 M68KMAKE_OP(addq, 8, ., .)
1420 {
1421         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1422         uint ea = M68KMAKE_GET_EA_AY_8;
1423         uint dst = m68ki_read_8(state, ea);
1424         uint res = src + dst;
1425
1426         FLAG_N = NFLAG_8(res);
1427         FLAG_V = VFLAG_ADD_8(src, dst, res);
1428         FLAG_X = FLAG_C = CFLAG_8(res);
1429         FLAG_Z = MASK_OUT_ABOVE_8(res);
1430
1431         m68ki_write_8(state, ea, FLAG_Z);
1432 }
1433
1434
1435 M68KMAKE_OP(addq, 16, ., d)
1436 {
1437         uint* r_dst = &DY;
1438         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1439         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1440         uint res = src + dst;
1441
1442         FLAG_N = NFLAG_16(res);
1443         FLAG_V = VFLAG_ADD_16(src, dst, res);
1444         FLAG_X = FLAG_C = CFLAG_16(res);
1445         FLAG_Z = MASK_OUT_ABOVE_16(res);
1446
1447         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
1448 }
1449
1450
1451 M68KMAKE_OP(addq, 16, ., a)
1452 {
1453         uint* r_dst = &AY;
1454
1455         *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
1456 }
1457
1458
1459 M68KMAKE_OP(addq, 16, ., .)
1460 {
1461         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1462         uint ea = M68KMAKE_GET_EA_AY_16;
1463         uint dst = m68ki_read_16(state, ea);
1464         uint res = src + dst;
1465
1466         FLAG_N = NFLAG_16(res);
1467         FLAG_V = VFLAG_ADD_16(src, dst, res);
1468         FLAG_X = FLAG_C = CFLAG_16(res);
1469         FLAG_Z = MASK_OUT_ABOVE_16(res);
1470
1471         m68ki_write_16(state, ea, FLAG_Z);
1472 }
1473
1474
1475 M68KMAKE_OP(addq, 32, ., d)
1476 {
1477         uint* r_dst = &DY;
1478         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1479         uint dst = *r_dst;
1480         uint res = src + dst;
1481
1482         FLAG_N = NFLAG_32(res);
1483         FLAG_V = VFLAG_ADD_32(src, dst, res);
1484         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1485         FLAG_Z = MASK_OUT_ABOVE_32(res);
1486
1487         *r_dst = FLAG_Z;
1488 }
1489
1490
1491 M68KMAKE_OP(addq, 32, ., a)
1492 {
1493         uint* r_dst = &AY;
1494
1495         *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
1496 }
1497
1498
1499 M68KMAKE_OP(addq, 32, ., .)
1500 {
1501         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
1502         uint ea = M68KMAKE_GET_EA_AY_32;
1503         uint dst = m68ki_read_32(state, ea);
1504         uint res = src + dst;
1505
1506
1507         FLAG_N = NFLAG_32(res);
1508         FLAG_V = VFLAG_ADD_32(src, dst, res);
1509         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1510         FLAG_Z = MASK_OUT_ABOVE_32(res);
1511
1512         m68ki_write_32(state, ea, FLAG_Z);
1513 }
1514
1515
1516 M68KMAKE_OP(addx, 8, rr, .)
1517 {
1518         uint* r_dst = &DX;
1519         uint src = MASK_OUT_ABOVE_8(DY);
1520         uint dst = MASK_OUT_ABOVE_8(*r_dst);
1521         uint res = src + dst + XFLAG_AS_1();
1522
1523         FLAG_N = NFLAG_8(res);
1524         FLAG_V = VFLAG_ADD_8(src, dst, res);
1525         FLAG_X = FLAG_C = CFLAG_8(res);
1526
1527         res = MASK_OUT_ABOVE_8(res);
1528         FLAG_Z |= res;
1529
1530         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
1531 }
1532
1533
1534 M68KMAKE_OP(addx, 16, rr, .)
1535 {
1536         uint* r_dst = &DX;
1537         uint src = MASK_OUT_ABOVE_16(DY);
1538         uint dst = MASK_OUT_ABOVE_16(*r_dst);
1539         uint res = src + dst + XFLAG_AS_1();
1540
1541         FLAG_N = NFLAG_16(res);
1542         FLAG_V = VFLAG_ADD_16(src, dst, res);
1543         FLAG_X = FLAG_C = CFLAG_16(res);
1544
1545         res = MASK_OUT_ABOVE_16(res);
1546         FLAG_Z |= res;
1547
1548         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
1549 }
1550
1551
1552 M68KMAKE_OP(addx, 32, rr, .)
1553 {
1554         uint* r_dst = &DX;
1555         uint src = DY;
1556         uint dst = *r_dst;
1557         uint res = src + dst + XFLAG_AS_1();
1558
1559         FLAG_N = NFLAG_32(res);
1560         FLAG_V = VFLAG_ADD_32(src, dst, res);
1561         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1562
1563         res = MASK_OUT_ABOVE_32(res);
1564         FLAG_Z |= res;
1565
1566         *r_dst = res;
1567 }
1568
1569
1570 M68KMAKE_OP(addx, 8, mm, ax7)
1571 {
1572         uint src = OPER_AY_PD_8(state);
1573         uint ea  = EA_A7_PD_8();
1574         uint dst = m68ki_read_8(state, ea);
1575         uint res = src + dst + XFLAG_AS_1();
1576
1577         FLAG_N = NFLAG_8(res);
1578         FLAG_V = VFLAG_ADD_8(src, dst, res);
1579         FLAG_X = FLAG_C = CFLAG_8(res);
1580
1581         res = MASK_OUT_ABOVE_8(res);
1582         FLAG_Z |= res;
1583
1584         m68ki_write_8(state, ea, res);
1585 }
1586
1587
1588 M68KMAKE_OP(addx, 8, mm, ay7)
1589 {
1590         uint src = OPER_A7_PD_8(state);
1591         uint ea  = EA_AX_PD_8();
1592         uint dst = m68ki_read_8(state, ea);
1593         uint res = src + dst + XFLAG_AS_1();
1594
1595         FLAG_N = NFLAG_8(res);
1596         FLAG_V = VFLAG_ADD_8(src, dst, res);
1597         FLAG_X = FLAG_C = CFLAG_8(res);
1598
1599         res = MASK_OUT_ABOVE_8(res);
1600         FLAG_Z |= res;
1601
1602         m68ki_write_8(state, ea, res);
1603 }
1604
1605
1606 M68KMAKE_OP(addx, 8, mm, axy7)
1607 {
1608         uint src = OPER_A7_PD_8(state);
1609         uint ea  = EA_A7_PD_8();
1610         uint dst = m68ki_read_8(state, ea);
1611         uint res = src + dst + XFLAG_AS_1();
1612
1613         FLAG_N = NFLAG_8(res);
1614         FLAG_V = VFLAG_ADD_8(src, dst, res);
1615         FLAG_X = FLAG_C = CFLAG_8(res);
1616
1617         res = MASK_OUT_ABOVE_8(res);
1618         FLAG_Z |= res;
1619
1620         m68ki_write_8(state, ea, res);
1621 }
1622
1623
1624 M68KMAKE_OP(addx, 8, mm, .)
1625 {
1626         uint src = OPER_AY_PD_8(state);
1627         uint ea  = EA_AX_PD_8();
1628         uint dst = m68ki_read_8(state, ea);
1629         uint res = src + dst + XFLAG_AS_1();
1630
1631         FLAG_N = NFLAG_8(res);
1632         FLAG_V = VFLAG_ADD_8(src, dst, res);
1633         FLAG_X = FLAG_C = CFLAG_8(res);
1634
1635         res = MASK_OUT_ABOVE_8(res);
1636         FLAG_Z |= res;
1637
1638         m68ki_write_8(state, ea, res);
1639 }
1640
1641
1642 M68KMAKE_OP(addx, 16, mm, .)
1643 {
1644         uint src = OPER_AY_PD_16(state);
1645         uint ea  = EA_AX_PD_16();
1646         uint dst = m68ki_read_16(state, ea);
1647         uint res = src + dst + XFLAG_AS_1();
1648
1649         FLAG_N = NFLAG_16(res);
1650         FLAG_V = VFLAG_ADD_16(src, dst, res);
1651         FLAG_X = FLAG_C = CFLAG_16(res);
1652
1653         res = MASK_OUT_ABOVE_16(res);
1654         FLAG_Z |= res;
1655
1656         m68ki_write_16(state, ea, res);
1657 }
1658
1659
1660 M68KMAKE_OP(addx, 32, mm, .)
1661 {
1662         uint src = OPER_AY_PD_32(state);
1663         uint ea  = EA_AX_PD_32();
1664         uint dst = m68ki_read_32(state, ea);
1665         uint res = src + dst + XFLAG_AS_1();
1666
1667         FLAG_N = NFLAG_32(res);
1668         FLAG_V = VFLAG_ADD_32(src, dst, res);
1669         FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
1670
1671         res = MASK_OUT_ABOVE_32(res);
1672         FLAG_Z |= res;
1673
1674         m68ki_write_32(state, ea, res);
1675 }
1676
1677
1678 M68KMAKE_OP(and, 8, er, d)
1679 {
1680         FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00));
1681
1682         FLAG_N = NFLAG_8(FLAG_Z);
1683         FLAG_C = CFLAG_CLEAR;
1684         FLAG_V = VFLAG_CLEAR;
1685 }
1686
1687
1688 M68KMAKE_OP(and, 8, er, .)
1689 {
1690         FLAG_Z = MASK_OUT_ABOVE_8(DX &= (M68KMAKE_GET_OPER_AY_8 | 0xffffff00));
1691
1692         FLAG_N = NFLAG_8(FLAG_Z);
1693         FLAG_C = CFLAG_CLEAR;
1694         FLAG_V = VFLAG_CLEAR;
1695 }
1696
1697
1698 M68KMAKE_OP(and, 16, er, d)
1699 {
1700         FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000));
1701
1702         FLAG_N = NFLAG_16(FLAG_Z);
1703         FLAG_C = CFLAG_CLEAR;
1704         FLAG_V = VFLAG_CLEAR;
1705 }
1706
1707
1708 M68KMAKE_OP(and, 16, er, .)
1709 {
1710         FLAG_Z = MASK_OUT_ABOVE_16(DX &= (M68KMAKE_GET_OPER_AY_16 | 0xffff0000));
1711
1712         FLAG_N = NFLAG_16(FLAG_Z);
1713         FLAG_C = CFLAG_CLEAR;
1714         FLAG_V = VFLAG_CLEAR;
1715 }
1716
1717
1718 M68KMAKE_OP(and, 32, er, d)
1719 {
1720         FLAG_Z = DX &= DY;
1721
1722         FLAG_N = NFLAG_32(FLAG_Z);
1723         FLAG_C = CFLAG_CLEAR;
1724         FLAG_V = VFLAG_CLEAR;
1725 }
1726
1727
1728 M68KMAKE_OP(and, 32, er, .)
1729 {
1730         FLAG_Z = DX &= M68KMAKE_GET_OPER_AY_32;
1731
1732         FLAG_N = NFLAG_32(FLAG_Z);
1733         FLAG_C = CFLAG_CLEAR;
1734         FLAG_V = VFLAG_CLEAR;
1735 }
1736
1737
1738 M68KMAKE_OP(and, 8, re, .)
1739 {
1740         uint ea = M68KMAKE_GET_EA_AY_8;
1741         uint res = DX & m68ki_read_8(state, ea);
1742
1743         FLAG_N = NFLAG_8(res);
1744         FLAG_C = CFLAG_CLEAR;
1745         FLAG_V = VFLAG_CLEAR;
1746         FLAG_Z = MASK_OUT_ABOVE_8(res);
1747
1748         m68ki_write_8(state, ea, FLAG_Z);
1749 }
1750
1751
1752 M68KMAKE_OP(and, 16, re, .)
1753 {
1754         uint ea = M68KMAKE_GET_EA_AY_16;
1755         uint res = DX & m68ki_read_16(state, ea);
1756
1757         FLAG_N = NFLAG_16(res);
1758         FLAG_C = CFLAG_CLEAR;
1759         FLAG_V = VFLAG_CLEAR;
1760         FLAG_Z = MASK_OUT_ABOVE_16(res);
1761
1762         m68ki_write_16(state, ea, FLAG_Z);
1763 }
1764
1765
1766 M68KMAKE_OP(and, 32, re, .)
1767 {
1768         uint ea = M68KMAKE_GET_EA_AY_32;
1769         uint res = DX & m68ki_read_32(state, ea);
1770
1771         FLAG_N = NFLAG_32(res);
1772         FLAG_Z = res;
1773         FLAG_C = CFLAG_CLEAR;
1774         FLAG_V = VFLAG_CLEAR;
1775
1776         m68ki_write_32(state, ea, res);
1777 }
1778
1779
1780 M68KMAKE_OP(andi, 8, ., d)
1781 {
1782         FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8(state) | 0xffffff00));
1783
1784         FLAG_N = NFLAG_8(FLAG_Z);
1785         FLAG_C = CFLAG_CLEAR;
1786         FLAG_V = VFLAG_CLEAR;
1787 }
1788
1789
1790 M68KMAKE_OP(andi, 8, ., .)
1791 {
1792         uint src = OPER_I_8(state);
1793         uint ea = M68KMAKE_GET_EA_AY_8;
1794         uint res = src & m68ki_read_8(state, ea);
1795
1796         FLAG_N = NFLAG_8(res);
1797         FLAG_Z = res;
1798         FLAG_C = CFLAG_CLEAR;
1799         FLAG_V = VFLAG_CLEAR;
1800
1801         m68ki_write_8(state, ea, res);
1802 }
1803
1804
1805 M68KMAKE_OP(andi, 16, ., d)
1806 {
1807         FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16(state) | 0xffff0000));
1808
1809         FLAG_N = NFLAG_16(FLAG_Z);
1810         FLAG_C = CFLAG_CLEAR;
1811         FLAG_V = VFLAG_CLEAR;
1812 }
1813
1814
1815 M68KMAKE_OP(andi, 16, ., .)
1816 {
1817         uint src = OPER_I_16(state);
1818         uint ea = M68KMAKE_GET_EA_AY_16;
1819         uint res = src & m68ki_read_16(state, ea);
1820
1821         FLAG_N = NFLAG_16(res);
1822         FLAG_Z = res;
1823         FLAG_C = CFLAG_CLEAR;
1824         FLAG_V = VFLAG_CLEAR;
1825
1826         m68ki_write_16(state, ea, res);
1827 }
1828
1829
1830 M68KMAKE_OP(andi, 32, ., d)
1831 {
1832         FLAG_Z = DY &= (OPER_I_32(state));
1833
1834         FLAG_N = NFLAG_32(FLAG_Z);
1835         FLAG_C = CFLAG_CLEAR;
1836         FLAG_V = VFLAG_CLEAR;
1837 }
1838
1839
1840 M68KMAKE_OP(andi, 32, ., .)
1841 {
1842         uint src = OPER_I_32(state);
1843         uint ea = M68KMAKE_GET_EA_AY_32;
1844         uint res = src & m68ki_read_32(state, ea);
1845
1846         FLAG_N = NFLAG_32(res);
1847         FLAG_Z = res;
1848         FLAG_C = CFLAG_CLEAR;
1849         FLAG_V = VFLAG_CLEAR;
1850
1851         m68ki_write_32(state, ea, res);
1852 }
1853
1854
1855 M68KMAKE_OP(andi, 16, toc, .)
1856 {
1857         m68ki_set_ccr(state, m68ki_get_ccr(state) & OPER_I_8(state));
1858 }
1859
1860
1861 M68KMAKE_OP(andi, 16, tos, .)
1862 {
1863         if(FLAG_S)
1864         {
1865                 uint src = OPER_I_16(state);
1866                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
1867                 m68ki_set_sr(state, m68ki_get_sr() & src);
1868                 return;
1869         }
1870         m68ki_exception_privilege_violation(state);
1871 }
1872
1873
1874 M68KMAKE_OP(asr, 8, s, .)
1875 {
1876         uint* r_dst = &DY;
1877         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
1878         uint src = MASK_OUT_ABOVE_8(*r_dst);
1879         uint res = src >> shift;
1880
1881         if(shift != 0)
1882                 USE_CYCLES(shift<<CYC_SHIFT);
1883
1884         if(GET_MSB_8(src))
1885                 res |= m68ki_shift_8_table[shift];
1886
1887         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
1888
1889         FLAG_N = NFLAG_8(res);
1890         FLAG_Z = res;
1891         FLAG_V = VFLAG_CLEAR;
1892         FLAG_X = FLAG_C = src << (9-shift);
1893 }
1894
1895
1896 M68KMAKE_OP(asr, 16, s, .)
1897 {
1898         uint* r_dst = &DY;
1899         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
1900         uint src = MASK_OUT_ABOVE_16(*r_dst);
1901         uint res = src >> shift;
1902
1903         if(shift != 0)
1904                 USE_CYCLES(shift<<CYC_SHIFT);
1905
1906         if(GET_MSB_16(src))
1907                 res |= m68ki_shift_16_table[shift];
1908
1909         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
1910
1911         FLAG_N = NFLAG_16(res);
1912         FLAG_Z = res;
1913         FLAG_V = VFLAG_CLEAR;
1914         FLAG_X = FLAG_C = src << (9-shift);
1915 }
1916
1917
1918 M68KMAKE_OP(asr, 32, s, .)
1919 {
1920         uint* r_dst = &DY;
1921         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
1922         uint src = *r_dst;
1923         uint res = src >> shift;
1924
1925         if(shift != 0)
1926                 USE_CYCLES(shift<<CYC_SHIFT);
1927
1928         if(GET_MSB_32(src))
1929                 res |= m68ki_shift_32_table[shift];
1930
1931         *r_dst = res;
1932
1933         FLAG_N = NFLAG_32(res);
1934         FLAG_Z = res;
1935         FLAG_V = VFLAG_CLEAR;
1936         FLAG_X = FLAG_C = src << (9-shift);
1937 }
1938
1939
1940 M68KMAKE_OP(asr, 8, r, .)
1941 {
1942         uint* r_dst = &DY;
1943         uint shift = DX & 0x3f;
1944         uint src = MASK_OUT_ABOVE_8(*r_dst);
1945         uint res = src >> shift;
1946
1947         if(shift != 0)
1948         {
1949                 USE_CYCLES(shift<<CYC_SHIFT);
1950
1951                 if(shift < 8)
1952                 {
1953                         if(GET_MSB_8(src))
1954                                 res |= m68ki_shift_8_table[shift];
1955
1956                         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
1957
1958                         FLAG_X = FLAG_C = src << (9-shift);
1959                         FLAG_N = NFLAG_8(res);
1960                         FLAG_Z = res;
1961                         FLAG_V = VFLAG_CLEAR;
1962                         return;
1963                 }
1964
1965                 if(GET_MSB_8(src))
1966                 {
1967                         *r_dst |= 0xff;
1968                         FLAG_C = CFLAG_SET;
1969                         FLAG_X = XFLAG_SET;
1970                         FLAG_N = NFLAG_SET;
1971                         FLAG_Z = ZFLAG_CLEAR;
1972                         FLAG_V = VFLAG_CLEAR;
1973                         return;
1974                 }
1975
1976                 *r_dst &= 0xffffff00;
1977                 FLAG_C = CFLAG_CLEAR;
1978                 FLAG_X = XFLAG_CLEAR;
1979                 FLAG_N = NFLAG_CLEAR;
1980                 FLAG_Z = ZFLAG_SET;
1981                 FLAG_V = VFLAG_CLEAR;
1982                 return;
1983         }
1984
1985         FLAG_C = CFLAG_CLEAR;
1986         FLAG_N = NFLAG_8(src);
1987         FLAG_Z = src;
1988         FLAG_V = VFLAG_CLEAR;
1989 }
1990
1991
1992 M68KMAKE_OP(asr, 16, r, .)
1993 {
1994         uint* r_dst = &DY;
1995         uint shift = DX & 0x3f;
1996         uint src = MASK_OUT_ABOVE_16(*r_dst);
1997         uint res = src >> shift;
1998
1999         if(shift != 0)
2000         {
2001                 USE_CYCLES(shift<<CYC_SHIFT);
2002
2003                 if(shift < 16)
2004                 {
2005                         if(GET_MSB_16(src))
2006                                 res |= m68ki_shift_16_table[shift];
2007
2008                         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
2009
2010                         FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
2011                         FLAG_N = NFLAG_16(res);
2012                         FLAG_Z = res;
2013                         FLAG_V = VFLAG_CLEAR;
2014                         return;
2015                 }
2016
2017                 if(GET_MSB_16(src))
2018                 {
2019                         *r_dst |= 0xffff;
2020                         FLAG_C = CFLAG_SET;
2021                         FLAG_X = XFLAG_SET;
2022                         FLAG_N = NFLAG_SET;
2023                         FLAG_Z = ZFLAG_CLEAR;
2024                         FLAG_V = VFLAG_CLEAR;
2025                         return;
2026                 }
2027
2028                 *r_dst &= 0xffff0000;
2029                 FLAG_C = CFLAG_CLEAR;
2030                 FLAG_X = XFLAG_CLEAR;
2031                 FLAG_N = NFLAG_CLEAR;
2032                 FLAG_Z = ZFLAG_SET;
2033                 FLAG_V = VFLAG_CLEAR;
2034                 return;
2035         }
2036
2037         FLAG_C = CFLAG_CLEAR;
2038         FLAG_N = NFLAG_16(src);
2039         FLAG_Z = src;
2040         FLAG_V = VFLAG_CLEAR;
2041 }
2042
2043
2044 M68KMAKE_OP(asr, 32, r, .)
2045 {
2046         uint* r_dst = &DY;
2047         uint shift = DX & 0x3f;
2048         uint src = *r_dst;
2049         uint res = src >> shift;
2050
2051         if(shift != 0)
2052         {
2053                 USE_CYCLES(shift<<CYC_SHIFT);
2054
2055                 if(shift < 32)
2056                 {
2057                         if(GET_MSB_32(src))
2058                                 res |= m68ki_shift_32_table[shift];
2059
2060                         *r_dst = res;
2061
2062                         FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
2063                         FLAG_N = NFLAG_32(res);
2064                         FLAG_Z = res;
2065                         FLAG_V = VFLAG_CLEAR;
2066                         return;
2067                 }
2068
2069                 if(GET_MSB_32(src))
2070                 {
2071                         *r_dst = 0xffffffff;
2072                         FLAG_C = CFLAG_SET;
2073                         FLAG_X = XFLAG_SET;
2074                         FLAG_N = NFLAG_SET;
2075                         FLAG_Z = ZFLAG_CLEAR;
2076                         FLAG_V = VFLAG_CLEAR;
2077                         return;
2078                 }
2079
2080                 *r_dst = 0;
2081                 FLAG_C = CFLAG_CLEAR;
2082                 FLAG_X = XFLAG_CLEAR;
2083                 FLAG_N = NFLAG_CLEAR;
2084                 FLAG_Z = ZFLAG_SET;
2085                 FLAG_V = VFLAG_CLEAR;
2086                 return;
2087         }
2088
2089         FLAG_C = CFLAG_CLEAR;
2090         FLAG_N = NFLAG_32(src);
2091         FLAG_Z = src;
2092         FLAG_V = VFLAG_CLEAR;
2093 }
2094
2095
2096 M68KMAKE_OP(asr, 16, ., .)
2097 {
2098         uint ea = M68KMAKE_GET_EA_AY_16;
2099         uint src = m68ki_read_16(state, ea);
2100         uint res = src >> 1;
2101
2102         if(GET_MSB_16(src))
2103                 res |= 0x8000;
2104
2105         m68ki_write_16(state, ea, res);
2106
2107         FLAG_N = NFLAG_16(res);
2108         FLAG_Z = res;
2109         FLAG_V = VFLAG_CLEAR;
2110         FLAG_C = FLAG_X = src << 8;
2111 }
2112
2113
2114 M68KMAKE_OP(asl, 8, s, .)
2115 {
2116         uint* r_dst = &DY;
2117         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
2118         uint src = MASK_OUT_ABOVE_8(*r_dst);
2119         uint res = MASK_OUT_ABOVE_8(src << shift);
2120
2121         if(shift != 0)
2122                 USE_CYCLES(shift<<CYC_SHIFT);
2123
2124         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
2125
2126         FLAG_X = FLAG_C = src << shift;
2127         FLAG_N = NFLAG_8(res);
2128         FLAG_Z = res;
2129         src &= m68ki_shift_8_table[shift + 1];
2130         FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7;
2131 }
2132
2133
2134 M68KMAKE_OP(asl, 16, s, .)
2135 {
2136         uint* r_dst = &DY;
2137         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
2138         uint src = MASK_OUT_ABOVE_16(*r_dst);
2139         uint res = MASK_OUT_ABOVE_16(src << shift);
2140
2141         if(shift != 0)
2142                 USE_CYCLES(shift<<CYC_SHIFT);
2143
2144         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
2145
2146         FLAG_N = NFLAG_16(res);
2147         FLAG_Z = res;
2148         FLAG_X = FLAG_C = src >> (8-shift);
2149         src &= m68ki_shift_16_table[shift + 1];
2150         FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
2151 }
2152
2153
2154 M68KMAKE_OP(asl, 32, s, .)
2155 {
2156         uint* r_dst = &DY;
2157         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
2158         uint src = *r_dst;
2159         uint res = MASK_OUT_ABOVE_32(src << shift);
2160
2161         if(shift != 0)
2162                 USE_CYCLES(shift<<CYC_SHIFT);
2163
2164         *r_dst = res;
2165
2166         FLAG_N = NFLAG_32(res);
2167         FLAG_Z = res;
2168         FLAG_X = FLAG_C = src >> (24-shift);
2169         src &= m68ki_shift_32_table[shift + 1];
2170         FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
2171 }
2172
2173
2174 M68KMAKE_OP(asl, 8, r, .)
2175 {
2176         uint* r_dst = &DY;
2177         uint shift = DX & 0x3f;
2178         uint src = MASK_OUT_ABOVE_8(*r_dst);
2179         uint res = MASK_OUT_ABOVE_8(src << shift);
2180
2181         if(shift != 0)
2182         {
2183                 USE_CYCLES(shift<<CYC_SHIFT);
2184
2185                 if(shift < 8)
2186                 {
2187                         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
2188                         FLAG_X = FLAG_C = src << shift;
2189                         FLAG_N = NFLAG_8(res);
2190                         FLAG_Z = res;
2191                         src &= m68ki_shift_8_table[shift + 1];
2192                         FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7;
2193                         return;
2194                 }
2195
2196                 *r_dst &= 0xffffff00;
2197                 FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8;
2198                 FLAG_N = NFLAG_CLEAR;
2199                 FLAG_Z = ZFLAG_SET;
2200                 FLAG_V = (!(src == 0))<<7;
2201                 return;
2202         }
2203
2204         FLAG_C = CFLAG_CLEAR;
2205         FLAG_N = NFLAG_8(src);
2206         FLAG_Z = src;
2207         FLAG_V = VFLAG_CLEAR;
2208 }
2209
2210
2211 M68KMAKE_OP(asl, 16, r, .)
2212 {
2213         uint* r_dst = &DY;
2214         uint shift = DX & 0x3f;
2215         uint src = MASK_OUT_ABOVE_16(*r_dst);
2216         uint res = MASK_OUT_ABOVE_16(src << shift);
2217
2218         if(shift != 0)
2219         {
2220                 USE_CYCLES(shift<<CYC_SHIFT);
2221
2222                 if(shift < 16)
2223                 {
2224                         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
2225                         FLAG_X = FLAG_C = (src << shift) >> 8;
2226                         FLAG_N = NFLAG_16(res);
2227                         FLAG_Z = res;
2228                         src &= m68ki_shift_16_table[shift + 1];
2229                         FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
2230                         return;
2231                 }
2232
2233                 *r_dst &= 0xffff0000;
2234                 FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8;
2235                 FLAG_N = NFLAG_CLEAR;
2236                 FLAG_Z = ZFLAG_SET;
2237                 FLAG_V = (!(src == 0))<<7;
2238                 return;
2239         }
2240
2241         FLAG_C = CFLAG_CLEAR;
2242         FLAG_N = NFLAG_16(src);
2243         FLAG_Z = src;
2244         FLAG_V = VFLAG_CLEAR;
2245 }
2246
2247
2248 M68KMAKE_OP(asl, 32, r, .)
2249 {
2250         uint* r_dst = &DY;
2251         uint shift = DX & 0x3f;
2252         uint src = *r_dst;
2253         uint res = MASK_OUT_ABOVE_32(src << shift);
2254
2255         if(shift != 0)
2256         {
2257                 USE_CYCLES(shift<<CYC_SHIFT);
2258
2259                 if(shift < 32)
2260                 {
2261                         *r_dst = res;
2262                         FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
2263                         FLAG_N = NFLAG_32(res);
2264                         FLAG_Z = res;
2265                         src &= m68ki_shift_32_table[shift + 1];
2266                         FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
2267                         return;
2268                 }
2269
2270                 *r_dst = 0;
2271                 FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
2272                 FLAG_N = NFLAG_CLEAR;
2273                 FLAG_Z = ZFLAG_SET;
2274                 FLAG_V = (!(src == 0))<<7;
2275                 return;
2276         }
2277
2278         FLAG_C = CFLAG_CLEAR;
2279         FLAG_N = NFLAG_32(src);
2280         FLAG_Z = src;
2281         FLAG_V = VFLAG_CLEAR;
2282 }
2283
2284
2285 M68KMAKE_OP(asl, 16, ., .)
2286 {
2287         uint ea = M68KMAKE_GET_EA_AY_16;
2288         uint src = m68ki_read_16(state, ea);
2289         uint res = MASK_OUT_ABOVE_16(src << 1);
2290
2291         m68ki_write_16(state, ea, res);
2292
2293         FLAG_N = NFLAG_16(res);
2294         FLAG_Z = res;
2295         FLAG_X = FLAG_C = src >> 7;
2296         src &= 0xc000;
2297         FLAG_V = (!(src == 0 || src == 0xc000))<<7;
2298 }
2299
2300
2301 M68KMAKE_OP(bcc, 8, ., .)
2302 {
2303         if(M68KMAKE_CC)
2304         {
2305                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
2306                 m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
2307                 return;
2308         }
2309         USE_CYCLES(CYC_BCC_NOTAKE_B);
2310 }
2311
2312
2313 M68KMAKE_OP(bcc, 16, ., .)
2314 {
2315         if(M68KMAKE_CC)
2316         {
2317                 uint offset = OPER_I_16(state);
2318                 REG_PC -= 2;
2319                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
2320                 m68ki_branch_16(state, offset);
2321                 return;
2322         }
2323         REG_PC += 2;
2324         USE_CYCLES(CYC_BCC_NOTAKE_W);
2325 }
2326
2327
2328 M68KMAKE_OP(bcc, 32, ., .)
2329 {
2330         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2331         {
2332                 if(M68KMAKE_CC)
2333                 {
2334                         uint offset = OPER_I_32(state);
2335                         REG_PC -= 4;
2336                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
2337                         m68ki_branch_32(state, offset);
2338                         return;
2339                 }
2340                 REG_PC += 4;
2341                 return;
2342         }
2343         else
2344         {
2345                 if(M68KMAKE_CC)
2346                 {
2347                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
2348                         m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
2349                         return;
2350                 }
2351                 USE_CYCLES(CYC_BCC_NOTAKE_B);
2352         }
2353 }
2354
2355
2356 M68KMAKE_OP(bchg, 32, r, d)
2357 {
2358         uint* r_dst = &DY;
2359         uint mask = 1 << (DX & 0x1f);
2360
2361         FLAG_Z = *r_dst & mask;
2362         *r_dst ^= mask;
2363 }
2364
2365
2366 M68KMAKE_OP(bchg, 8, r, .)
2367 {
2368         uint ea = M68KMAKE_GET_EA_AY_8;
2369         uint src = m68ki_read_8(state, ea);
2370         uint mask = 1 << (DX & 7);
2371
2372         FLAG_Z = src & mask;
2373         m68ki_write_8(state, ea, src ^ mask);
2374 }
2375
2376
2377 M68KMAKE_OP(bchg, 32, s, d)
2378 {
2379         uint* r_dst = &DY;
2380         uint mask = 1 << (OPER_I_8(state) & 0x1f);
2381
2382         FLAG_Z = *r_dst & mask;
2383         *r_dst ^= mask;
2384 }
2385
2386
2387 M68KMAKE_OP(bchg, 8, s, .)
2388 {
2389         uint mask = 1 << (OPER_I_8(state) & 7);
2390         uint ea = M68KMAKE_GET_EA_AY_8;
2391         uint src = m68ki_read_8(state, ea);
2392
2393         FLAG_Z = src & mask;
2394         m68ki_write_8(state, ea, src ^ mask);
2395 }
2396
2397
2398 M68KMAKE_OP(bclr, 32, r, d)
2399 {
2400         uint* r_dst = &DY;
2401         uint mask = 1 << (DX & 0x1f);
2402
2403         FLAG_Z = *r_dst & mask;
2404         *r_dst &= ~mask;
2405 }
2406
2407
2408 M68KMAKE_OP(bclr, 8, r, .)
2409 {
2410         uint ea = M68KMAKE_GET_EA_AY_8;
2411         uint src = m68ki_read_8(state, ea);
2412         uint mask = 1 << (DX & 7);
2413
2414         FLAG_Z = src & mask;
2415         m68ki_write_8(state, ea, src & ~mask);
2416 }
2417
2418
2419 M68KMAKE_OP(bclr, 32, s, d)
2420 {
2421         uint* r_dst = &DY;
2422         uint mask = 1 << (OPER_I_8(state) & 0x1f);
2423
2424         FLAG_Z = *r_dst & mask;
2425         *r_dst &= ~mask;
2426 }
2427
2428
2429 M68KMAKE_OP(bclr, 8, s, .)
2430 {
2431         uint mask = 1 << (OPER_I_8(state) & 7);
2432         uint ea = M68KMAKE_GET_EA_AY_8;
2433         uint src = m68ki_read_8(state, ea);
2434
2435         FLAG_Z = src & mask;
2436         m68ki_write_8(state, ea, src & ~mask);
2437 }
2438
2439
2440 M68KMAKE_OP(bfchg, 32, ., d)
2441 {
2442         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2443         {
2444                 uint word2 = OPER_I_16(state);
2445                 uint offset = (word2>>6)&31;
2446                 uint width = word2;
2447                 uint* data = &DY;
2448                 uint64 mask;
2449
2450
2451                 if(BIT_B(word2))
2452                         offset = REG_D[offset&7];
2453                 if(BIT_5(word2))
2454                         width = REG_D[width&7];
2455
2456                 offset &= 31;
2457                 width = ((width-1) & 31) + 1;
2458
2459                 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2460                 mask = ROR_32(mask, offset);
2461
2462                 FLAG_N = NFLAG_32(*data<<offset);
2463                 FLAG_Z = *data & mask;
2464                 FLAG_V = VFLAG_CLEAR;
2465                 FLAG_C = CFLAG_CLEAR;
2466
2467                 *data ^= mask;
2468
2469                 return;
2470         }
2471         m68ki_exception_illegal(state);
2472 }
2473
2474
2475 M68KMAKE_OP(bfchg, 32, ., .)
2476 {
2477         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2478         {
2479                 uint word2 = OPER_I_16(state);
2480                 sint offset = (word2>>6)&31;
2481                 uint width = word2;
2482                 uint mask_base;
2483                 uint data_long;
2484                 uint mask_long;
2485                 uint data_byte = 0;
2486                 uint mask_byte = 0;
2487                 uint ea = M68KMAKE_GET_EA_AY_8;
2488
2489
2490                 if(BIT_B(word2))
2491                         offset = MAKE_INT_32(REG_D[offset&7]);
2492                 if(BIT_5(word2))
2493                         width = REG_D[width&7];
2494
2495                 /* Offset is signed so we have to use ugly math =( */
2496                 ea += offset / 8;
2497                 offset %= 8;
2498                 if(offset < 0)
2499                 {
2500                         offset += 8;
2501                         ea--;
2502                 }
2503                 width = ((width-1) & 31) + 1;
2504
2505                 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2506                 mask_long = mask_base >> offset;
2507
2508                 data_long = m68ki_read_32(state, ea);
2509                 FLAG_N = NFLAG_32(data_long << offset);
2510                 FLAG_Z = data_long & mask_long;
2511                 FLAG_V = VFLAG_CLEAR;
2512                 FLAG_C = CFLAG_CLEAR;
2513
2514                 m68ki_write_32(state, ea, data_long ^ mask_long);
2515
2516                 if((width + offset) > 32)
2517                 {
2518                         mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
2519                         data_byte = m68ki_read_8(state, ea+4);
2520                         FLAG_Z |= (data_byte & mask_byte);
2521                         m68ki_write_8(state, ea+4, data_byte ^ mask_byte);
2522                 }
2523                 return;
2524         }
2525         m68ki_exception_illegal(state);
2526 }
2527
2528
2529 M68KMAKE_OP(bfclr, 32, ., d)
2530 {
2531         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2532         {
2533                 uint word2 = OPER_I_16(state);
2534                 uint offset = (word2>>6)&31;
2535                 uint width = word2;
2536                 uint* data = &DY;
2537                 uint64 mask;
2538
2539
2540                 if(BIT_B(word2))
2541                         offset = REG_D[offset&7];
2542                 if(BIT_5(word2))
2543                         width = REG_D[width&7];
2544
2545
2546                 offset &= 31;
2547                 width = ((width-1) & 31) + 1;
2548
2549
2550                 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2551                 mask = ROR_32(mask, offset);
2552
2553                 FLAG_N = NFLAG_32(*data<<offset);
2554                 FLAG_Z = *data & mask;
2555                 FLAG_V = VFLAG_CLEAR;
2556                 FLAG_C = CFLAG_CLEAR;
2557
2558                 *data &= ~mask;
2559
2560                 return;
2561         }
2562         m68ki_exception_illegal(state);
2563 }
2564
2565
2566 M68KMAKE_OP(bfclr, 32, ., .)
2567 {
2568         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2569         {
2570                 uint word2 = OPER_I_16(state);
2571                 sint offset = (word2>>6)&31;
2572                 uint width = word2;
2573                 uint mask_base;
2574                 uint data_long;
2575                 uint mask_long;
2576                 uint data_byte = 0;
2577                 uint mask_byte = 0;
2578                 uint ea = M68KMAKE_GET_EA_AY_8;
2579
2580
2581                 if(BIT_B(word2))
2582                         offset = MAKE_INT_32(REG_D[offset&7]);
2583                 if(BIT_5(word2))
2584                         width = REG_D[width&7];
2585
2586                 /* Offset is signed so we have to use ugly math =( */
2587                 ea += offset / 8;
2588                 offset %= 8;
2589                 if(offset < 0)
2590                 {
2591                         offset += 8;
2592                         ea--;
2593                 }
2594                 width = ((width-1) & 31) + 1;
2595
2596                 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2597                 mask_long = mask_base >> offset;
2598
2599                 data_long = m68ki_read_32(state, ea);
2600                 FLAG_N = NFLAG_32(data_long << offset);
2601                 FLAG_Z = data_long & mask_long;
2602                 FLAG_V = VFLAG_CLEAR;
2603                 FLAG_C = CFLAG_CLEAR;
2604
2605                 m68ki_write_32(state, ea, data_long & ~mask_long);
2606
2607                 if((width + offset) > 32)
2608                 {
2609                         mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
2610                         data_byte = m68ki_read_8(state, ea+4);
2611                         FLAG_Z |= (data_byte & mask_byte);
2612                         m68ki_write_8(state, ea+4, data_byte & ~mask_byte);
2613                 }
2614                 return;
2615         }
2616         m68ki_exception_illegal(state);
2617 }
2618
2619
2620 M68KMAKE_OP(bfexts, 32, ., d)
2621 {
2622         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2623         {
2624                 uint word2 = OPER_I_16(state);
2625                 uint offset = (word2>>6)&31;
2626                 uint width = word2;
2627                 uint64 data = DY;
2628
2629
2630                 if(BIT_B(word2))
2631                         offset = REG_D[offset&7];
2632                 if(BIT_5(word2))
2633                         width = REG_D[width&7];
2634
2635                 offset &= 31;
2636                 width = ((width-1) & 31) + 1;
2637
2638                 data = ROL_32(data, offset);
2639                 FLAG_N = NFLAG_32(data);
2640                 data = MAKE_INT_32(data) >> (32 - width);
2641
2642                 FLAG_Z = data;
2643                 FLAG_V = VFLAG_CLEAR;
2644                 FLAG_C = CFLAG_CLEAR;
2645
2646                 REG_D[(word2>>12)&7] = data;
2647
2648                 return;
2649         }
2650         m68ki_exception_illegal(state);
2651 }
2652
2653
2654 M68KMAKE_OP(bfexts, 32, ., .)
2655 {
2656         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2657         {
2658                 uint word2 = OPER_I_16(state);
2659                 sint offset = (word2>>6)&31;
2660                 uint width = word2;
2661                 uint data;
2662                 uint ea = M68KMAKE_GET_EA_AY_8;
2663
2664
2665                 if(BIT_B(word2))
2666                         offset = MAKE_INT_32(REG_D[offset&7]);
2667                 if(BIT_5(word2))
2668                         width = REG_D[width&7];
2669
2670                 if(BIT_B(word2))  {
2671                         /* Offset is signed so we have to use ugly math =( */
2672                         ea += offset / 8;
2673                         offset %= 8;
2674                         if(offset < 0)
2675                         {
2676                                 offset += 8;
2677                                 ea--;
2678                         }
2679                 }
2680                 width = ((width-1) & 31) + 1;
2681
2682                 data = (offset+width) < 8 ? (m68ki_read_8(state, ea) << 24) :
2683                         (offset+width) < 16 ? (m68ki_read_16(state, ea) << 16) : m68ki_read_32(state, ea);
2684
2685                 data = MASK_OUT_ABOVE_32(data<<offset);
2686
2687                 if((offset+width) > 32)
2688                         data |= (m68ki_read_8(state, ea+4) << offset) >> 8;
2689
2690                 FLAG_N = NFLAG_32(data);
2691                 data  = MAKE_INT_32(data) >> (32 - width);
2692
2693                 FLAG_Z = data;
2694                 FLAG_V = VFLAG_CLEAR;
2695                 FLAG_C = CFLAG_CLEAR;
2696
2697                 REG_D[(word2 >> 12) & 7] = data;
2698
2699                 return;
2700         }
2701         m68ki_exception_illegal(state);
2702 }
2703
2704
2705 M68KMAKE_OP(bfextu, 32, ., d)
2706 {
2707         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2708         {
2709                 uint word2 = OPER_I_16(state);
2710                 uint offset = (word2>>6)&31;
2711                 uint width = word2;
2712                 uint64 data = DY;
2713
2714
2715                 if(BIT_B(word2))
2716                         offset = REG_D[offset&7];
2717                 if(BIT_5(word2))
2718                         width = REG_D[width&7];
2719
2720                 offset &= 31;
2721                 width = ((width-1) & 31) + 1;
2722
2723                 data = ROL_32(data, offset);
2724                 FLAG_N = NFLAG_32(data);
2725                 data >>= 32 - width;
2726
2727                 FLAG_Z = data;
2728                 FLAG_V = VFLAG_CLEAR;
2729                 FLAG_C = CFLAG_CLEAR;
2730
2731                 REG_D[(word2>>12)&7] = data;
2732
2733                 return;
2734         }
2735         m68ki_exception_illegal(state);
2736 }
2737
2738
2739 M68KMAKE_OP(bfextu, 32, ., .)
2740 {
2741         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2742         {
2743                 uint word2 = OPER_I_16(state);
2744                 sint offset = (word2>>6)&31;
2745                 uint width = word2;
2746                 uint data;
2747                 uint ea = M68KMAKE_GET_EA_AY_8;
2748
2749
2750                 if(BIT_B(word2))
2751                 offset = MAKE_INT_32(REG_D[offset&7]);
2752                 if(BIT_5(word2))
2753                         width = REG_D[width&7];
2754
2755                 if(BIT_B(word2)) {
2756                         /* Offset is signed so we have to use ugly math =( */
2757                         ea += offset / 8;
2758                         offset %= 8;
2759                         if(offset < 0)
2760                         {
2761                                 offset += 8;
2762                                 ea--;
2763                         }
2764                 }
2765                 width = ((width-1) & 31) + 1;
2766
2767         data = (offset+width) < 8 ? (m68ki_read_8(state, ea) << 24) :
2768                         (offset+width) < 16 ? (m68ki_read_16(state, ea) << 16) : m68ki_read_32(state, ea);
2769                 data = MASK_OUT_ABOVE_32(data<<offset);
2770
2771                 if((offset+width) > 32)
2772                         data |= (m68ki_read_8(state, ea+4) << offset) >> 8;
2773
2774                 FLAG_N = NFLAG_32(data);
2775                 data  >>= (32 - width);
2776
2777                 FLAG_Z = data;
2778                 FLAG_V = VFLAG_CLEAR;
2779                 FLAG_C = CFLAG_CLEAR;
2780
2781                 REG_D[(word2 >> 12) & 7] = data;
2782
2783                 return;
2784         }
2785         m68ki_exception_illegal(state);
2786 }
2787
2788
2789 M68KMAKE_OP(bfffo, 32, ., d)
2790 {
2791         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2792         {
2793                 uint word2 = OPER_I_16(state);
2794                 uint offset = (word2>>6)&31;
2795                 uint width = word2;
2796                 uint64 data = DY;
2797                 uint bit;
2798
2799
2800                 if(BIT_B(word2))
2801                         offset = REG_D[offset&7];
2802                 if(BIT_5(word2))
2803                         width = REG_D[width&7];
2804
2805                 offset &= 31;
2806                 width = ((width-1) & 31) + 1;
2807
2808                 data = ROL_32(data, offset);
2809                 FLAG_N = NFLAG_32(data);
2810                 data >>= 32 - width;
2811
2812                 FLAG_Z = data;
2813                 FLAG_V = VFLAG_CLEAR;
2814                 FLAG_C = CFLAG_CLEAR;
2815
2816                 for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
2817                         offset++;
2818
2819                 REG_D[(word2>>12)&7] = offset;
2820
2821                 return;
2822         }
2823         m68ki_exception_illegal(state);
2824 }
2825
2826
2827 M68KMAKE_OP(bfffo, 32, ., .)
2828 {
2829         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2830         {
2831                 uint word2 = OPER_I_16(state);
2832                 sint offset = (word2>>6)&31;
2833                 sint local_offset;
2834                 uint width = word2;
2835                 uint data;
2836                 uint bit;
2837                 uint ea = M68KMAKE_GET_EA_AY_8;
2838
2839
2840                 if(BIT_B(word2))
2841                         offset = MAKE_INT_32(REG_D[offset&7]);
2842                 if(BIT_5(word2))
2843                         width = REG_D[width&7];
2844
2845                 /* Offset is signed so we have to use ugly math =( */
2846                 ea += offset / 8;
2847                 local_offset = offset % 8;
2848                 if(local_offset < 0)
2849                 {
2850                         local_offset += 8;
2851                         ea--;
2852                 }
2853                 width = ((width-1) & 31) + 1;
2854
2855                 data = (offset+width) < 16 ? (m68ki_read_16(state, ea) << 16) : m68ki_read_32(state, ea);
2856                 data = MASK_OUT_ABOVE_32(data<<local_offset);
2857
2858                 if((local_offset+width) > 32)
2859                         data |= (m68ki_read_8(state, ea+4) << local_offset) >> 8;
2860
2861                 FLAG_N = NFLAG_32(data);
2862                 data  >>= (32 - width);
2863
2864                 FLAG_Z = data;
2865                 FLAG_V = VFLAG_CLEAR;
2866                 FLAG_C = CFLAG_CLEAR;
2867
2868                 for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
2869                         offset++;
2870
2871                 REG_D[(word2>>12)&7] = offset;
2872
2873                 return;
2874         }
2875         m68ki_exception_illegal(state);
2876 }
2877
2878
2879 M68KMAKE_OP(bfins, 32, ., d)
2880 {
2881         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2882         {
2883                 uint word2 = OPER_I_16(state);
2884                 uint offset = (word2>>6)&31;
2885                 uint width = word2;
2886                 uint* data = &DY;
2887                 uint64 mask;
2888                 uint64 insert = REG_D[(word2>>12)&7];
2889
2890
2891                 if(BIT_B(word2))
2892                         offset = REG_D[offset&7];
2893                 if(BIT_5(word2))
2894                         width = REG_D[width&7];
2895
2896
2897                 offset &= 31;
2898                 width = ((width-1) & 31) + 1;
2899
2900
2901                 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2902                 mask = ROR_32(mask, offset);
2903
2904                 insert = MASK_OUT_ABOVE_32(insert << (32 - width));
2905                 FLAG_N = NFLAG_32(insert);
2906                 FLAG_Z = insert;
2907                 insert = ROR_32(insert, offset);
2908
2909                 FLAG_V = VFLAG_CLEAR;
2910                 FLAG_C = CFLAG_CLEAR;
2911
2912                 *data &= ~mask;
2913                 *data |= insert;
2914
2915                 return;
2916         }
2917         m68ki_exception_illegal(state);
2918 }
2919
2920
2921 M68KMAKE_OP(bfins, 32, ., .)
2922 {
2923         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2924         {
2925                 uint word2 = OPER_I_16(state);
2926                 sint offset = (word2>>6)&31;
2927                 uint width = word2;
2928                 uint insert_base = REG_D[(word2>>12)&7];
2929                 uint insert_long;
2930                 uint insert_byte;
2931                 uint mask_base;
2932                 uint data_long;
2933                 uint mask_long;
2934                 uint data_byte = 0;
2935                 uint mask_byte = 0;
2936                 uint ea = M68KMAKE_GET_EA_AY_8;
2937
2938
2939                 if(BIT_B(word2))
2940                         offset = MAKE_INT_32(REG_D[offset&7]);
2941                 if(BIT_5(word2))
2942                         width = REG_D[width&7];
2943
2944                 if(BIT_B(word2)) {
2945                         /* Offset is signed so we have to use ugly math =( */
2946                         ea += offset / 8;
2947                         offset %= 8;
2948                         if(offset < 0)
2949                         {
2950                                 offset += 8;
2951                                 ea--;
2952                         }
2953                 }
2954                 width = ((width-1) & 31) + 1;
2955
2956                 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
2957                 mask_long = mask_base >> offset;
2958
2959                 insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
2960                 FLAG_N = NFLAG_32(insert_base);
2961                 FLAG_Z = insert_base;
2962                 insert_long = insert_base >> offset;
2963
2964                 data_long = (offset+width) < 8 ? (m68ki_read_8(state, ea) << 24) :
2965                                 (offset+width) < 16 ? (m68ki_read_16(state, ea) << 16) : m68ki_read_32(state, ea);
2966                 FLAG_V = VFLAG_CLEAR;
2967                 FLAG_C = CFLAG_CLEAR;
2968
2969                 if((width + offset) < 8) {
2970                         m68ki_write_8(state, ea, ((data_long & ~mask_long) | insert_long) >> 24);
2971                 } else if((width + offset) < 16) {
2972                         m68ki_write_16(state, ea, ((data_long & ~mask_long) | insert_long) >> 16);
2973                 } else {
2974                         m68ki_write_32(state, ea, (data_long & ~mask_long) | insert_long);
2975                 }
2976
2977                 if((width + offset) > 32)
2978                 {
2979                         mask_byte = MASK_OUT_ABOVE_8(mask_base);
2980                         insert_byte = MASK_OUT_ABOVE_8(insert_base);
2981                         data_byte = m68ki_read_8(state, ea+4);
2982                         FLAG_Z |= (data_byte & mask_byte);
2983                         m68ki_write_8(state, ea+4, (data_byte & ~mask_byte) | insert_byte);
2984                 }
2985                 return;
2986         }
2987         m68ki_exception_illegal(state);
2988 }
2989
2990
2991 M68KMAKE_OP(bfset, 32, ., d)
2992 {
2993         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
2994         {
2995                 uint word2 = OPER_I_16(state);
2996                 uint offset = (word2>>6)&31;
2997                 uint width = word2;
2998                 uint* data = &DY;
2999                 uint64 mask;
3000
3001
3002                 if(BIT_B(word2))
3003                         offset = REG_D[offset&7];
3004                 if(BIT_5(word2))
3005                         width = REG_D[width&7];
3006
3007
3008                 offset &= 31;
3009                 width = ((width-1) & 31) + 1;
3010
3011
3012                 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
3013                 mask = ROR_32(mask, offset);
3014
3015                 FLAG_N = NFLAG_32(*data<<offset);
3016                 FLAG_Z = *data & mask;
3017                 FLAG_V = VFLAG_CLEAR;
3018                 FLAG_C = CFLAG_CLEAR;
3019
3020                 *data |= mask;
3021
3022                 return;
3023         }
3024         m68ki_exception_illegal(state);
3025 }
3026
3027
3028 M68KMAKE_OP(bfset, 32, ., .)
3029 {
3030         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3031         {
3032                 uint word2 = OPER_I_16(state);
3033                 sint offset = (word2>>6)&31;
3034                 uint width = word2;
3035                 uint mask_base;
3036                 uint data_long;
3037                 uint mask_long;
3038                 uint data_byte = 0;
3039                 uint mask_byte = 0;
3040                 uint ea = M68KMAKE_GET_EA_AY_8;
3041
3042
3043                 if(BIT_B(word2))
3044                         offset = MAKE_INT_32(REG_D[offset&7]);
3045                 if(BIT_5(word2))
3046                         width = REG_D[width&7];
3047
3048                 /* Offset is signed so we have to use ugly math =( */
3049                 ea += offset / 8;
3050                 offset %= 8;
3051                 if(offset < 0)
3052                 {
3053                         offset += 8;
3054                         ea--;
3055                 }
3056                 width = ((width-1) & 31) + 1;
3057
3058
3059                 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
3060                 mask_long = mask_base >> offset;
3061
3062                 data_long = m68ki_read_32(state, ea);
3063                 FLAG_N = NFLAG_32(data_long << offset);
3064                 FLAG_Z = data_long & mask_long;
3065                 FLAG_V = VFLAG_CLEAR;
3066                 FLAG_C = CFLAG_CLEAR;
3067
3068                 m68ki_write_32(state, ea, data_long | mask_long);
3069
3070                 if((width + offset) > 32)
3071                 {
3072                         mask_byte = MASK_OUT_ABOVE_8(mask_base);
3073                         data_byte = m68ki_read_8(state, ea+4);
3074                         FLAG_Z |= (data_byte & mask_byte);
3075                         m68ki_write_8(state, ea+4, data_byte | mask_byte);
3076                 }
3077                 return;
3078         }
3079         m68ki_exception_illegal(state);
3080 }
3081
3082
3083 M68KMAKE_OP(bftst, 32, ., d)
3084 {
3085         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3086         {
3087                 uint word2 = OPER_I_16(state);
3088                 uint offset = (word2>>6)&31;
3089                 uint width = word2;
3090                 uint* data = &DY;
3091                 uint64 mask;
3092
3093
3094                 if(BIT_B(word2))
3095                         offset = REG_D[offset&7];
3096                 if(BIT_5(word2))
3097                         width = REG_D[width&7];
3098
3099
3100                 offset &= 31;
3101                 width = ((width-1) & 31) + 1;
3102
3103
3104                 mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
3105                 mask = ROR_32(mask, offset);
3106
3107                 FLAG_N = NFLAG_32(*data<<offset);
3108                 FLAG_Z = *data & mask;
3109                 FLAG_V = VFLAG_CLEAR;
3110                 FLAG_C = CFLAG_CLEAR;
3111
3112                 return;
3113         }
3114         m68ki_exception_illegal(state);
3115 }
3116
3117
3118 M68KMAKE_OP(bftst, 32, ., .)
3119 {
3120         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3121         {
3122                 uint word2 = OPER_I_16(state);
3123                 sint offset = (word2>>6)&31;
3124                 uint width = word2;
3125                 uint mask_base;
3126                 uint data_long;
3127                 uint mask_long;
3128                 uint data_byte = 0;
3129                 uint mask_byte = 0;
3130                 uint ea = M68KMAKE_GET_EA_AY_8;
3131
3132                 if(BIT_B(word2))
3133                         offset = MAKE_INT_32(REG_D[offset&7]);
3134                 if(BIT_5(word2))
3135                         width = REG_D[width&7];
3136
3137                 /* Offset is signed so we have to use ugly math =( */
3138                 ea += offset / 8;
3139                 offset %= 8;
3140                 if(offset < 0)
3141                 {
3142                         offset += 8;
3143                         ea--;
3144                 }
3145                 width = ((width-1) & 31) + 1;
3146
3147
3148                 mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
3149                 mask_long = mask_base >> offset;
3150
3151                 data_long = m68ki_read_32(state, ea);
3152                 FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
3153                 FLAG_Z = data_long & mask_long;
3154                 FLAG_V = VFLAG_CLEAR;
3155                 FLAG_C = CFLAG_CLEAR;
3156
3157                 if((width + offset) > 32)
3158                 {
3159                         mask_byte = MASK_OUT_ABOVE_8(mask_base);
3160                         data_byte = m68ki_read_8(state, ea+4);
3161                         FLAG_Z |= (data_byte & mask_byte);
3162                 }
3163                 return;
3164         }
3165         m68ki_exception_illegal(state);
3166 }
3167
3168
3169 M68KMAKE_OP(bkpt, 0, ., .)
3170 {
3171 // TODO: review this...
3172         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
3173         {
3174                 m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0);      /* auto-disable (see m68kcpu.h) */
3175         }
3176         m68ki_exception_illegal(state);
3177 }
3178
3179
3180 M68KMAKE_OP(bra, 8, ., .)
3181 {
3182         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
3183         m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
3184 // TODO: review this...
3185 //      if(REG_PC == REG_PPC)
3186 //              USE_ALL_CYCLES();
3187 }
3188
3189
3190 M68KMAKE_OP(bra, 16, ., .)
3191 {
3192         uint offset = OPER_I_16(state);
3193         REG_PC -= 2;
3194         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3195         m68ki_branch_16(state, offset);
3196 // TODO: review this...
3197 //      if(REG_PC == REG_PPC)
3198 //              USE_ALL_CYCLES();
3199 }
3200
3201
3202 M68KMAKE_OP(bra, 32, ., .)
3203 {
3204         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3205         {
3206                 uint offset = OPER_I_32(state);
3207                 REG_PC -= 4;
3208                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3209                 m68ki_branch_32(state, offset);
3210 // TODO: review this...
3211 //              if(REG_PC == REG_PPC)
3212 //                      USE_ALL_CYCLES();
3213                 return;
3214         }
3215         else
3216         {
3217 // TODO: review this...
3218                 m68ki_exception_illegal(state);
3219 //              m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
3220 //              m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
3221 //              if(REG_PC == REG_PPC)
3222 //                      USE_ALL_CYCLES();
3223         }
3224 }
3225
3226
3227 M68KMAKE_OP(bset, 32, r, d)
3228 {
3229         uint* r_dst = &DY;
3230         uint mask = 1 << (DX & 0x1f);
3231
3232         FLAG_Z = *r_dst & mask;
3233         *r_dst |= mask;
3234 }
3235
3236
3237 M68KMAKE_OP(bset, 8, r, .)
3238 {
3239         uint ea = M68KMAKE_GET_EA_AY_8;
3240         uint src = m68ki_read_8(state, ea);
3241         uint mask = 1 << (DX & 7);
3242
3243         FLAG_Z = src & mask;
3244         m68ki_write_8(state, ea, src | mask);
3245 }
3246
3247
3248 M68KMAKE_OP(bset, 32, s, d)
3249 {
3250         uint* r_dst = &DY;
3251         uint mask = 1 << (OPER_I_8(state) & 0x1f);
3252
3253         FLAG_Z = *r_dst & mask;
3254         *r_dst |= mask;
3255 }
3256
3257
3258 M68KMAKE_OP(bset, 8, s, .)
3259 {
3260         uint mask = 1 << (OPER_I_8(state) & 7);
3261         uint ea = M68KMAKE_GET_EA_AY_8;
3262         uint src = m68ki_read_8(state, ea);
3263
3264         FLAG_Z = src & mask;
3265         m68ki_write_8(state, ea, src | mask);
3266 }
3267
3268
3269 M68KMAKE_OP(bsr, 8, ., .)
3270 {
3271         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
3272         m68ki_push_32(state, REG_PC);
3273         m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
3274 }
3275
3276
3277 M68KMAKE_OP(bsr, 16, ., .)
3278 {
3279         uint offset = OPER_I_16(state);
3280         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3281         m68ki_push_32(state, REG_PC);
3282         REG_PC -= 2;
3283         m68ki_branch_16(state, offset);
3284 }
3285
3286
3287 M68KMAKE_OP(bsr, 32, ., .)
3288 {
3289         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3290         {
3291                 uint offset = OPER_I_32(state);
3292                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3293                 m68ki_push_32(state, REG_PC);
3294                 REG_PC -= 4;
3295                 m68ki_branch_32(state, offset);
3296                 return;
3297         }
3298         else
3299         {
3300 // TODO: review this...
3301                 m68ki_exception_illegal(state);
3302 //              m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
3303 //              m68ki_push_32(state, REG_PC);
3304 //              m68ki_branch_8(state, MASK_OUT_ABOVE_8(REG_IR));
3305         }
3306 }
3307
3308
3309 M68KMAKE_OP(btst, 32, r, d)
3310 {
3311         FLAG_Z = DY & (1 << (DX & 0x1f));
3312 }
3313
3314
3315 M68KMAKE_OP(btst, 8, r, .)
3316 {
3317         FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << (DX & 7));
3318 }
3319
3320
3321 M68KMAKE_OP(btst, 32, s, d)
3322 {
3323         FLAG_Z = DY & (1 << (OPER_I_8(state) & 0x1f));
3324 }
3325
3326
3327 M68KMAKE_OP(btst, 8, s, .)
3328 {
3329         uint bit = OPER_I_8(state) & 7;
3330
3331         FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << bit);
3332 }
3333
3334
3335 M68KMAKE_OP(callm, 32, ., .)
3336 {
3337         /* note: watch out for pcrelative modes */
3338         if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
3339         {
3340                 uint ea = M68KMAKE_GET_EA_AY_32;
3341
3342                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3343                 REG_PC += 2;
3344 (void)ea;       /* just to avoid an 'unused variable' warning */
3345                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
3346                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
3347                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
3348                 return;
3349         }
3350         m68ki_exception_illegal(state);
3351 }
3352
3353
3354 M68KMAKE_OP(cas, 8, ., .)
3355 {
3356         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3357         {
3358                 uint word2 = OPER_I_16(state);
3359                 uint ea = M68KMAKE_GET_EA_AY_8;
3360                 uint dest = m68ki_read_8(state, ea);
3361                 uint* compare = &REG_D[word2 & 7];
3362                 uint res = dest - MASK_OUT_ABOVE_8(*compare);
3363
3364                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3365                 FLAG_N = NFLAG_8(res);
3366                 FLAG_Z = MASK_OUT_ABOVE_8(res);
3367                 FLAG_V = VFLAG_SUB_8(*compare, dest, res);
3368                 FLAG_C = CFLAG_8(res);
3369
3370                 if(COND_NE())
3371                         *compare = MASK_OUT_BELOW_8(*compare) | dest;
3372                 else
3373                 {
3374                         USE_CYCLES(3);
3375                         m68ki_write_8(state, ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
3376                 }
3377                 return;
3378         }
3379         m68ki_exception_illegal(state);
3380 }
3381
3382
3383 M68KMAKE_OP(cas, 16, ., .)
3384 {
3385         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3386         {
3387                 uint word2 = OPER_I_16(state);
3388                 uint ea = M68KMAKE_GET_EA_AY_16;
3389                 uint dest = m68ki_read_16(state, ea);
3390                 uint* compare = &REG_D[word2 & 7];
3391                 uint res = dest - MASK_OUT_ABOVE_16(*compare);
3392
3393                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3394                 FLAG_N = NFLAG_16(res);
3395                 FLAG_Z = MASK_OUT_ABOVE_16(res);
3396                 FLAG_V = VFLAG_SUB_16(*compare, dest, res);
3397                 FLAG_C = CFLAG_16(res);
3398
3399                 if(COND_NE())
3400                         *compare = MASK_OUT_BELOW_16(*compare) | dest;
3401                 else
3402                 {
3403                         USE_CYCLES(3);
3404                         m68ki_write_16(state, ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
3405                 }
3406                 return;
3407         }
3408         m68ki_exception_illegal(state);
3409 }
3410
3411
3412 M68KMAKE_OP(cas, 32, ., .)
3413 {
3414         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3415         {
3416                 uint word2 = OPER_I_16(state);
3417                 uint ea = M68KMAKE_GET_EA_AY_32;
3418                 uint dest = m68ki_read_32(state, ea);
3419                 uint* compare = &REG_D[word2 & 7];
3420                 uint res = dest - *compare;
3421
3422                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3423                 FLAG_N = NFLAG_32(res);
3424                 FLAG_Z = MASK_OUT_ABOVE_32(res);
3425                 FLAG_V = VFLAG_SUB_32(*compare, dest, res);
3426                 FLAG_C = CFLAG_SUB_32(*compare, dest, res);
3427
3428                 if(COND_NE())
3429                         *compare = dest;
3430                 else
3431                 {
3432                         USE_CYCLES(3);
3433                         m68ki_write_32(state, ea, REG_D[(word2 >> 6) & 7]);
3434                 }
3435                 return;
3436         }
3437         m68ki_exception_illegal(state);
3438 }
3439
3440
3441 M68KMAKE_OP(cas2, 16, ., .)
3442 {
3443         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3444         {
3445                 uint word2 = OPER_I_32(state);
3446                 uint* compare1 = &REG_D[(word2 >> 16) & 7];
3447                 uint ea1 = REG_DA[(word2 >> 28) & 15];
3448                 uint dest1 = m68ki_read_16(state, ea1);
3449                 uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1);
3450                 uint* compare2 = &REG_D[word2 & 7];
3451                 uint ea2 = REG_DA[(word2 >> 12) & 15];
3452                 uint dest2 = m68ki_read_16(state, ea2);
3453                 uint res2;
3454
3455                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3456                 FLAG_N = NFLAG_16(res1);
3457                 FLAG_Z = MASK_OUT_ABOVE_16(res1);
3458                 FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1);
3459                 FLAG_C = CFLAG_16(res1);
3460
3461                 if(COND_EQ())
3462                 {
3463                         res2 = dest2 - MASK_OUT_ABOVE_16(*compare2);
3464
3465                         FLAG_N = NFLAG_16(res2);
3466                         FLAG_Z = MASK_OUT_ABOVE_16(res2);
3467                         FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2);
3468                         FLAG_C = CFLAG_16(res2);
3469
3470                         if(COND_EQ())
3471                         {
3472                                 USE_CYCLES(3);
3473                                 m68ki_write_16(state, ea1, REG_D[(word2 >> 22) & 7]);
3474                                 m68ki_write_16(state, ea2, REG_D[(word2 >> 6) & 7]);
3475                                 return;
3476                         }
3477                 }
3478                 *compare1 = BIT_1F(word2) ? (uint)MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1;
3479                 *compare2 = BIT_F(word2) ? (uint)MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2;
3480                 return;
3481         }
3482         m68ki_exception_illegal(state);
3483 }
3484
3485
3486 M68KMAKE_OP(cas2, 32, ., .)
3487 {
3488         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3489         {
3490                 uint word2 = OPER_I_32(state);
3491                 uint* compare1 = &REG_D[(word2 >> 16) & 7];
3492                 uint ea1 = REG_DA[(word2 >> 28) & 15];
3493                 uint dest1 = m68ki_read_32(state, ea1);
3494                 uint res1 = dest1 - *compare1;
3495                 uint* compare2 = &REG_D[word2 & 7];
3496                 uint ea2 = REG_DA[(word2 >> 12) & 15];
3497                 uint dest2 = m68ki_read_32(state, ea2);
3498                 uint res2;
3499
3500                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
3501                 FLAG_N = NFLAG_32(res1);
3502                 FLAG_Z = MASK_OUT_ABOVE_32(res1);
3503                 FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1);
3504                 FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1);
3505
3506                 if(COND_EQ())
3507                 {
3508                         res2 = dest2 - *compare2;
3509
3510                         FLAG_N = NFLAG_32(res2);
3511                         FLAG_Z = MASK_OUT_ABOVE_32(res2);
3512                         FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2);
3513                         FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2);
3514
3515                         if(COND_EQ())
3516                         {
3517                                 USE_CYCLES(3);
3518                                 m68ki_write_32(state, ea1, REG_D[(word2 >> 22) & 7]);
3519                                 m68ki_write_32(state, ea2, REG_D[(word2 >> 6) & 7]);
3520                                 return;
3521                         }
3522                 }
3523                 *compare1 = dest1;
3524                 *compare2 = dest2;
3525                 return;
3526         }
3527         m68ki_exception_illegal(state);
3528 }
3529
3530
3531 M68KMAKE_OP(chk, 16, ., d)
3532 {
3533         sint src = MAKE_INT_16(DX);
3534         sint bound = MAKE_INT_16(DY);
3535
3536         FLAG_Z = ZFLAG_16(src); /* Undocumented */
3537         FLAG_V = VFLAG_CLEAR;   /* Undocumented */
3538         FLAG_C = CFLAG_CLEAR;   /* Undocumented */
3539
3540         if(src >= 0 && src <= bound)
3541         {
3542                 return;
3543         }
3544         FLAG_N = (src < 0)<<7;
3545         m68ki_exception_trap(state, EXCEPTION_CHK);
3546 }
3547
3548
3549 M68KMAKE_OP(chk, 16, ., .)
3550 {
3551         sint src = MAKE_INT_16(DX);
3552         sint bound = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
3553
3554         FLAG_Z = ZFLAG_16(src); /* Undocumented */
3555         FLAG_V = VFLAG_CLEAR;   /* Undocumented */
3556         FLAG_C = CFLAG_CLEAR;   /* Undocumented */
3557
3558         if(src >= 0 && src <= bound)
3559         {
3560                 return;
3561         }
3562         FLAG_N = (src < 0)<<7;
3563         m68ki_exception_trap(state, EXCEPTION_CHK);
3564 }
3565
3566
3567 M68KMAKE_OP(chk, 32, ., d)
3568 {
3569         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3570         {
3571                 sint src = MAKE_INT_32(DX);
3572                 sint bound = MAKE_INT_32(DY);
3573
3574                 FLAG_Z = ZFLAG_32(src); /* Undocumented */
3575                 FLAG_V = VFLAG_CLEAR;   /* Undocumented */
3576                 FLAG_C = CFLAG_CLEAR;   /* Undocumented */
3577
3578                 if(src >= 0 && src <= bound)
3579                 {
3580                         return;
3581                 }
3582                 FLAG_N = (src < 0)<<7;
3583                 m68ki_exception_trap(state, EXCEPTION_CHK);
3584                 return;
3585         }
3586         m68ki_exception_illegal(state);
3587 }
3588
3589
3590 M68KMAKE_OP(chk, 32, ., .)
3591 {
3592         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3593         {
3594                 sint src = MAKE_INT_32(DX);
3595                 sint bound = MAKE_INT_32(M68KMAKE_GET_OPER_AY_32);
3596
3597                 FLAG_Z = ZFLAG_32(src); /* Undocumented */
3598                 FLAG_V = VFLAG_CLEAR;   /* Undocumented */
3599                 FLAG_C = CFLAG_CLEAR;   /* Undocumented */
3600
3601                 if(src >= 0 && src <= bound)
3602                 {
3603                         return;
3604                 }
3605                 FLAG_N = (src < 0)<<7;
3606                 m68ki_exception_trap(state, EXCEPTION_CHK);
3607                 return;
3608         }
3609         m68ki_exception_illegal(state);
3610 }
3611
3612
3613 M68KMAKE_OP(chk2cmp2, 8, ., pcdi)
3614 {
3615         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3616         {
3617                 uint word2 = OPER_I_16(state);
3618                 sint compare = REG_DA[(word2 >> 12) & 15];
3619                 if(!BIT_F(word2))
3620                         compare &= 0xff;
3621
3622                 uint ea = EA_PCDI_8();
3623                 sint lower_bound = m68ki_read_pcrel_8(state, ea);
3624                 sint upper_bound = m68ki_read_pcrel_8(state, ea + 1);
3625
3626                 // for signed compare, the arithmetically smaller value is the lower bound
3627                 if (lower_bound & 0x80) {
3628                         lower_bound = (int32)(int8)lower_bound;
3629                         upper_bound = (int32)(int8)upper_bound;
3630
3631                         if(!BIT_F(word2))
3632                                 compare = (int32)(int8)compare;
3633                 }
3634
3635                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3636                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3637
3638                 if(COND_CS() && BIT_B(word2))
3639                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3640                 return;
3641         }
3642
3643
3644         m68ki_exception_illegal(state);
3645 }
3646
3647
3648 M68KMAKE_OP(chk2cmp2, 8, ., pcix)
3649 {
3650         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3651         {
3652                 uint word2 = OPER_I_16(state);
3653                 sint compare = REG_DA[(word2 >> 12) & 15];
3654                 if(!BIT_F(word2))
3655                         compare &= 0xff;
3656
3657                 uint ea = EA_PCIX_8();
3658                 sint lower_bound = m68ki_read_pcrel_8(state, ea);
3659                 sint upper_bound = m68ki_read_pcrel_8(state, ea + 1);
3660
3661                 if (lower_bound & 0x80) {
3662                         lower_bound = (int32)(int8)lower_bound;
3663                         upper_bound = (int32)(int8)upper_bound;
3664
3665                         if(!BIT_F(word2))
3666                                 compare = (int32)(int8)compare;
3667                 }
3668
3669                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3670                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3671
3672                 if(COND_CS() && BIT_B(word2))
3673                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3674                 return;
3675
3676         }
3677         m68ki_exception_illegal(state);
3678 }
3679
3680
3681 M68KMAKE_OP(chk2cmp2, 8, ., .)
3682 {
3683         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3684         {
3685                 uint word2 = OPER_I_16(state);
3686                 sint compare = REG_DA[(word2 >> 12) & 15];
3687                 if(!BIT_F(word2))
3688                         compare &= 0xff;
3689
3690                 uint ea = M68KMAKE_GET_EA_AY_8;
3691                 sint lower_bound = (int8)m68ki_read_8(state, ea);
3692                 sint upper_bound = (int8)m68ki_read_8(state, ea + 1);
3693
3694                 // for signed compare, the arithmetically smaller value is the lower bound
3695                 if (lower_bound & 0x80) {
3696                         lower_bound = (int32)(int8)lower_bound;
3697                         upper_bound = (int32)(int8)upper_bound;
3698
3699                         if(!BIT_F(word2))
3700                                 compare = (int32)(int8)compare;
3701                 }
3702
3703                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3704                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3705
3706                 if(COND_CS() && BIT_B(word2))
3707                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3708                 return;
3709         }
3710         m68ki_exception_illegal(state);
3711 }
3712
3713
3714 M68KMAKE_OP(chk2cmp2, 16, ., pcdi)
3715 {
3716         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3717         {
3718                 uint word2 = OPER_I_16(state);
3719                 sint compare = REG_DA[(word2 >> 12) & 15];
3720                 if(!BIT_F(word2))
3721                         compare &= 0xffff;
3722
3723                 uint ea = EA_PCDI_16();
3724                 sint lower_bound = (int16)m68ki_read_pcrel_16(state, ea);
3725                 sint upper_bound = (int16)m68ki_read_pcrel_16(state, ea + 2);
3726
3727                 // for signed compare, the arithmetically smaller value is the lower bound
3728                 if (lower_bound & 0x8000) {
3729                         lower_bound = (int32)(int16)lower_bound;
3730                         upper_bound = (int32)(int16)upper_bound;
3731
3732                         if(!BIT_F(word2))
3733                                 compare = (int32)(int16)compare;
3734                 }
3735
3736                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3737                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3738
3739                 if(COND_CS() && BIT_B(word2))
3740                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3741                 return;
3742         }
3743         m68ki_exception_illegal(state);
3744 }
3745
3746
3747 M68KMAKE_OP(chk2cmp2, 16, ., pcix)
3748 {
3749         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3750         {
3751                 uint word2 = OPER_I_16(state);
3752                 sint compare = REG_DA[(word2 >> 12) & 15];
3753                 if(!BIT_F(word2))
3754                         compare &= 0xffff;
3755
3756                 uint ea = EA_PCIX_16();
3757                 sint lower_bound = (int16)m68ki_read_pcrel_16(state, ea);
3758                 sint upper_bound = (int16)m68ki_read_pcrel_16(state, ea + 2);
3759
3760                 // for signed compare, the arithmetically smaller value is the lower bound
3761                 if (lower_bound & 0x8000) {
3762                         lower_bound = (int32)(int16)lower_bound;
3763                         upper_bound = (int32)(int16)upper_bound;
3764
3765                         if(!BIT_F(word2))
3766                                 compare = (int32)(int16)compare;
3767                 }
3768
3769                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3770                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3771
3772                 if(COND_CS() && BIT_B(word2))
3773                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3774                 return;
3775         }
3776         m68ki_exception_illegal(state);
3777 }
3778
3779
3780 M68KMAKE_OP(chk2cmp2, 16, ., .)
3781 {
3782         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3783         {
3784                 uint word2 = OPER_I_16(state);
3785                 sint compare = REG_DA[(word2 >> 12) & 15];
3786                 if(!BIT_F(word2))
3787                         compare &= 0xffff;
3788
3789                 uint ea = M68KMAKE_GET_EA_AY_16;
3790                 sint lower_bound = (int16)m68ki_read_16(state, ea);
3791                 sint upper_bound = (int16)m68ki_read_16(state, ea + 2);
3792
3793                 // for signed compare, the arithmetically smaller value is the lower bound
3794                 if (lower_bound & 0x8000) {
3795                         lower_bound = (int32)(int16)lower_bound;
3796                         upper_bound = (int32)(int16)upper_bound;
3797
3798                         if(!BIT_F(word2))
3799                                 compare = (int32)(int16)compare;
3800                 }
3801
3802                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3803                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3804
3805                 if(COND_CS() && BIT_B(word2))
3806                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3807                 return;
3808         }
3809         m68ki_exception_illegal(state);
3810 }
3811
3812
3813 M68KMAKE_OP(chk2cmp2, 32, ., pcdi)
3814 {
3815         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3816         {
3817                 uint32 word2 = OPER_I_16(state);
3818                 sint64 compare = REG_DA[(word2 >> 12) & 15];
3819                 uint32 ea = EA_PCDI_32();
3820                 sint64 lower_bound = m68ki_read_pcrel_32(state, ea);
3821                 sint64 upper_bound = m68ki_read_pcrel_32(state, ea + 4);
3822
3823                 // for signed compare, the arithmetically smaller value is the lower bound
3824                 if (lower_bound & 0x80000000) {
3825                         lower_bound = (int64)(int32)lower_bound;
3826                         upper_bound = (int64)(int32)upper_bound;
3827                         compare = (int64)(int32)compare;
3828                 }
3829
3830                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3831                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3832
3833                 if(COND_CS() && BIT_B(word2))
3834                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3835                 return;
3836         }
3837         m68ki_exception_illegal(state);
3838 }
3839
3840
3841 M68KMAKE_OP(chk2cmp2, 32, ., pcix)
3842 {
3843         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3844         {
3845                 uint32 word2 = OPER_I_16(state);
3846                 sint64 compare = REG_DA[(word2 >> 12) & 15];
3847                 uint32 ea = EA_PCIX_32();
3848                 sint64 lower_bound = m68ki_read_32(state, ea);
3849                 sint64 upper_bound = m68ki_read_32(state, ea + 4);
3850
3851                 // for signed compare, the arithmetically smaller value is the lower bound
3852                 if (lower_bound & 0x80000000) {
3853                         lower_bound = (int64)(int32)lower_bound;
3854                         upper_bound = (int64)(int32)upper_bound;
3855                         compare = (int64)(int32)compare;
3856                 }
3857
3858                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3859                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3860
3861                 if(COND_CS() && BIT_B(word2))
3862                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3863                 return;
3864         }
3865         m68ki_exception_illegal(state);
3866 }
3867
3868
3869 M68KMAKE_OP(chk2cmp2, 32, ., .)
3870 {
3871         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
3872         {
3873                 uint32 word2 = OPER_I_16(state);
3874                 sint64 compare = REG_DA[(word2 >> 12) & 15];
3875                 uint32 ea = M68KMAKE_GET_EA_AY_32;
3876                 sint64 lower_bound = m68ki_read_32(state, ea);
3877                 sint64 upper_bound = m68ki_read_32(state, ea + 4);
3878
3879                 // for signed compare, the arithmetically smaller value is the lower bound
3880                 if (lower_bound & 0x80000000) {
3881                         lower_bound = (int64)(int32)lower_bound;
3882                         upper_bound = (int64)(int32)upper_bound;
3883                         compare = (int64)(int32)compare;
3884                 }
3885
3886                 FLAG_C = (compare >= lower_bound && compare <= upper_bound) ? CFLAG_CLEAR : CFLAG_SET;
3887                 FLAG_Z = ((upper_bound == compare) || (lower_bound == compare)) ? 0 : 1;
3888
3889                 if(COND_CS() && BIT_B(word2))
3890                                 m68ki_exception_trap(state, EXCEPTION_CHK);
3891                 return;
3892         }
3893         m68ki_exception_illegal(state);
3894 }
3895
3896
3897 M68KMAKE_OP(clr, 8, ., d)
3898 {
3899         DY &= 0xffffff00;
3900
3901         FLAG_N = NFLAG_CLEAR;
3902         FLAG_V = VFLAG_CLEAR;
3903         FLAG_C = CFLAG_CLEAR;
3904         FLAG_Z = ZFLAG_SET;
3905 }
3906
3907
3908 M68KMAKE_OP(clr, 8, ., .)
3909 {
3910         uint32 ea = M68KMAKE_GET_EA_AY_8;
3911
3912         if(CPU_TYPE_IS_000(CPU_TYPE))
3913                 m68ki_read_8(state, ea);   /* the 68000 does a dummy read, the value is discarded */
3914         m68ki_write_8(state, ea, 0);
3915
3916         FLAG_N = NFLAG_CLEAR;
3917         FLAG_V = VFLAG_CLEAR;
3918         FLAG_C = CFLAG_CLEAR;
3919         FLAG_Z = ZFLAG_SET;
3920 }
3921
3922
3923 M68KMAKE_OP(clr, 16, ., d)
3924 {
3925         DY &= 0xffff0000;
3926
3927         FLAG_N = NFLAG_CLEAR;
3928         FLAG_V = VFLAG_CLEAR;
3929         FLAG_C = CFLAG_CLEAR;
3930         FLAG_Z = ZFLAG_SET;
3931 }
3932
3933
3934 M68KMAKE_OP(clr, 16, ., .)
3935 {
3936         uint32 ea = M68KMAKE_GET_EA_AY_16;
3937
3938         if(CPU_TYPE_IS_000(CPU_TYPE))
3939                 m68ki_read_16(state, ea);  /* the 68000 does a dummy read, the value is discarded */
3940         m68ki_write_16(state, ea, 0);
3941
3942         FLAG_N = NFLAG_CLEAR;
3943         FLAG_V = VFLAG_CLEAR;
3944         FLAG_C = CFLAG_CLEAR;
3945         FLAG_Z = ZFLAG_SET;
3946 }
3947
3948
3949 M68KMAKE_OP(clr, 32, ., d)
3950 {
3951         DY = 0;
3952
3953         FLAG_N = NFLAG_CLEAR;
3954         FLAG_V = VFLAG_CLEAR;
3955         FLAG_C = CFLAG_CLEAR;
3956         FLAG_Z = ZFLAG_SET;
3957 }
3958
3959
3960 M68KMAKE_OP(clr, 32, ., .)
3961 {
3962         uint32 ea = M68KMAKE_GET_EA_AY_32;
3963
3964         if(CPU_TYPE_IS_000(CPU_TYPE))
3965                 m68ki_read_32(state, ea);  /* the 68000 does a dummy read, the value is discarded */
3966         m68ki_write_32(state, ea, 0);
3967
3968         FLAG_N = NFLAG_CLEAR;
3969         FLAG_V = VFLAG_CLEAR;
3970         FLAG_C = CFLAG_CLEAR;
3971         FLAG_Z = ZFLAG_SET;
3972 }
3973
3974
3975 M68KMAKE_OP(cmp, 8, ., d)
3976 {
3977         uint src = MASK_OUT_ABOVE_8(DY);
3978         uint dst = MASK_OUT_ABOVE_8(DX);
3979         uint res = dst - src;
3980
3981         FLAG_N = NFLAG_8(res);
3982         FLAG_Z = MASK_OUT_ABOVE_8(res);
3983         FLAG_V = VFLAG_SUB_8(src, dst, res);
3984         FLAG_C = CFLAG_8(res);
3985 }
3986
3987
3988 M68KMAKE_OP(cmp, 8, ., .)
3989 {
3990         uint src = M68KMAKE_GET_OPER_AY_8;
3991         uint dst = MASK_OUT_ABOVE_8(DX);
3992         uint res = dst - src;
3993
3994         FLAG_N = NFLAG_8(res);
3995         FLAG_Z = MASK_OUT_ABOVE_8(res);
3996         FLAG_V = VFLAG_SUB_8(src, dst, res);
3997         FLAG_C = CFLAG_8(res);
3998 }
3999
4000
4001 M68KMAKE_OP(cmp, 16, ., d)
4002 {
4003         uint src = MASK_OUT_ABOVE_16(DY);
4004         uint dst = MASK_OUT_ABOVE_16(DX);
4005         uint res = dst - src;
4006
4007         FLAG_N = NFLAG_16(res);
4008         FLAG_Z = MASK_OUT_ABOVE_16(res);
4009         FLAG_V = VFLAG_SUB_16(src, dst, res);
4010         FLAG_C = CFLAG_16(res);
4011 }
4012
4013
4014 M68KMAKE_OP(cmp, 16, ., a)
4015 {
4016         uint src = MASK_OUT_ABOVE_16(AY);
4017         uint dst = MASK_OUT_ABOVE_16(DX);
4018         uint res = dst - src;
4019
4020         FLAG_N = NFLAG_16(res);
4021         FLAG_Z = MASK_OUT_ABOVE_16(res);
4022         FLAG_V = VFLAG_SUB_16(src, dst, res);
4023         FLAG_C = CFLAG_16(res);
4024 }
4025
4026
4027 M68KMAKE_OP(cmp, 16, ., .)
4028 {
4029         uint src = M68KMAKE_GET_OPER_AY_16;
4030         uint dst = MASK_OUT_ABOVE_16(DX);
4031         uint res = dst - src;
4032
4033         FLAG_N = NFLAG_16(res);
4034         FLAG_Z = MASK_OUT_ABOVE_16(res);
4035         FLAG_V = VFLAG_SUB_16(src, dst, res);
4036         FLAG_C = CFLAG_16(res);
4037 }
4038
4039
4040 M68KMAKE_OP(cmp, 32, ., d)
4041 {
4042         uint src = DY;
4043         uint dst = DX;
4044         uint res = dst - src;
4045
4046         FLAG_N = NFLAG_32(res);
4047         FLAG_Z = MASK_OUT_ABOVE_32(res);
4048         FLAG_V = VFLAG_SUB_32(src, dst, res);
4049         FLAG_C = CFLAG_SUB_32(src, dst, res);
4050 }
4051
4052
4053 M68KMAKE_OP(cmp, 32, ., a)
4054 {
4055         uint src = AY;
4056         uint dst = DX;
4057         uint res = dst - src;
4058
4059         FLAG_N = NFLAG_32(res);
4060         FLAG_Z = MASK_OUT_ABOVE_32(res);
4061         FLAG_V = VFLAG_SUB_32(src, dst, res);
4062         FLAG_C = CFLAG_SUB_32(src, dst, res);
4063 }
4064
4065
4066 M68KMAKE_OP(cmp, 32, ., .)
4067 {
4068         uint src = M68KMAKE_GET_OPER_AY_32;
4069         uint dst = DX;
4070         uint res = dst - src;
4071
4072         FLAG_N = NFLAG_32(res);
4073         FLAG_Z = MASK_OUT_ABOVE_32(res);
4074         FLAG_V = VFLAG_SUB_32(src, dst, res);
4075         FLAG_C = CFLAG_SUB_32(src, dst, res);
4076 }
4077
4078
4079 M68KMAKE_OP(cmpa, 16, ., d)
4080 {
4081         uint src = MAKE_INT_16(DY);
4082         uint dst = AX;
4083         uint res = dst - src;
4084
4085         FLAG_N = NFLAG_32(res);
4086         FLAG_Z = MASK_OUT_ABOVE_32(res);
4087         FLAG_V = VFLAG_SUB_32(src, dst, res);
4088         FLAG_C = CFLAG_SUB_32(src, dst, res);
4089 }
4090
4091
4092 M68KMAKE_OP(cmpa, 16, ., a)
4093 {
4094         uint src = MAKE_INT_16(AY);
4095         uint dst = AX;
4096         uint res = dst - src;
4097
4098         FLAG_N = NFLAG_32(res);
4099         FLAG_Z = MASK_OUT_ABOVE_32(res);
4100         FLAG_V = VFLAG_SUB_32(src, dst, res);
4101         FLAG_C = CFLAG_SUB_32(src, dst, res);
4102 }
4103
4104
4105 M68KMAKE_OP(cmpa, 16, ., .)
4106 {
4107         uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
4108         uint dst = AX;
4109         uint res = dst - src;
4110
4111         FLAG_N = NFLAG_32(res);
4112         FLAG_Z = MASK_OUT_ABOVE_32(res);
4113         FLAG_V = VFLAG_SUB_32(src, dst, res);
4114         FLAG_C = CFLAG_SUB_32(src, dst, res);
4115 }
4116
4117
4118 M68KMAKE_OP(cmpa, 32, ., d)
4119 {
4120         uint src = DY;
4121         uint dst = AX;
4122         uint res = dst - src;
4123
4124         FLAG_N = NFLAG_32(res);
4125         FLAG_Z = MASK_OUT_ABOVE_32(res);
4126         FLAG_V = VFLAG_SUB_32(src, dst, res);
4127         FLAG_C = CFLAG_SUB_32(src, dst, res);
4128 }
4129
4130
4131 M68KMAKE_OP(cmpa, 32, ., a)
4132 {
4133         uint src = AY;
4134         uint dst = AX;
4135         uint res = dst - src;
4136
4137         FLAG_N = NFLAG_32(res);
4138         FLAG_Z = MASK_OUT_ABOVE_32(res);
4139         FLAG_V = VFLAG_SUB_32(src, dst, res);
4140         FLAG_C = CFLAG_SUB_32(src, dst, res);
4141 }
4142
4143
4144 M68KMAKE_OP(cmpa, 32, ., .)
4145 {
4146         uint src = M68KMAKE_GET_OPER_AY_32;
4147         uint dst = AX;
4148         uint res = dst - src;
4149
4150         FLAG_N = NFLAG_32(res);
4151         FLAG_Z = MASK_OUT_ABOVE_32(res);
4152         FLAG_V = VFLAG_SUB_32(src, dst, res);
4153         FLAG_C = CFLAG_SUB_32(src, dst, res);
4154 }
4155
4156
4157 M68KMAKE_OP(cmpi, 8, ., d)
4158 {
4159         uint src = OPER_I_8(state);
4160         uint dst = MASK_OUT_ABOVE_8(DY);
4161         uint res = dst - src;
4162
4163         FLAG_N = NFLAG_8(res);
4164         FLAG_Z = MASK_OUT_ABOVE_8(res);
4165         FLAG_V = VFLAG_SUB_8(src, dst, res);
4166         FLAG_C = CFLAG_8(res);
4167 }
4168
4169
4170 M68KMAKE_OP(cmpi, 8, ., .)
4171 {
4172         uint src = OPER_I_8(state);
4173         uint dst = M68KMAKE_GET_OPER_AY_8;
4174         uint res = dst - src;
4175
4176         FLAG_N = NFLAG_8(res);
4177         FLAG_Z = MASK_OUT_ABOVE_8(res);
4178         FLAG_V = VFLAG_SUB_8(src, dst, res);
4179         FLAG_C = CFLAG_8(res);
4180 }
4181
4182
4183 M68KMAKE_OP(cmpi, 8, ., pcdi)
4184 {
4185         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4186         {
4187                 uint src = OPER_I_8(state);
4188                 uint dst = OPER_PCDI_8(state);
4189                 uint res = dst - src;
4190
4191                 FLAG_N = NFLAG_8(res);
4192                 FLAG_Z = MASK_OUT_ABOVE_8(res);
4193                 FLAG_V = VFLAG_SUB_8(src, dst, res);
4194                 FLAG_C = CFLAG_8(res);
4195                 return;
4196         }
4197         m68ki_exception_illegal(state);
4198 }
4199
4200
4201 M68KMAKE_OP(cmpi, 8, ., pcix)
4202 {
4203         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4204         {
4205                 uint src = OPER_I_8(state);
4206                 uint dst = OPER_PCIX_8(state);
4207                 uint res = dst - src;
4208
4209                 FLAG_N = NFLAG_8(res);
4210                 FLAG_Z = MASK_OUT_ABOVE_8(res);
4211                 FLAG_V = VFLAG_SUB_8(src, dst, res);
4212                 FLAG_C = CFLAG_8(res);
4213                 return;
4214         }
4215         m68ki_exception_illegal(state);
4216 }
4217
4218
4219 M68KMAKE_OP(cmpi, 16, ., d)
4220 {
4221         uint src = OPER_I_16(state);
4222         uint dst = MASK_OUT_ABOVE_16(DY);
4223         uint res = dst - src;
4224
4225         FLAG_N = NFLAG_16(res);
4226         FLAG_Z = MASK_OUT_ABOVE_16(res);
4227         FLAG_V = VFLAG_SUB_16(src, dst, res);
4228         FLAG_C = CFLAG_16(res);
4229 }
4230
4231
4232 M68KMAKE_OP(cmpi, 16, ., .)
4233 {
4234         uint src = OPER_I_16(state);
4235         uint dst = M68KMAKE_GET_OPER_AY_16;
4236         uint res = dst - src;
4237
4238         FLAG_N = NFLAG_16(res);
4239         FLAG_Z = MASK_OUT_ABOVE_16(res);
4240         FLAG_V = VFLAG_SUB_16(src, dst, res);
4241         FLAG_C = CFLAG_16(res);
4242 }
4243
4244
4245 M68KMAKE_OP(cmpi, 16, ., pcdi)
4246 {
4247         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4248         {
4249                 uint src = OPER_I_16(state);
4250                 uint dst = OPER_PCDI_16(state);
4251                 uint res = dst - src;
4252
4253                 FLAG_N = NFLAG_16(res);
4254                 FLAG_Z = MASK_OUT_ABOVE_16(res);
4255                 FLAG_V = VFLAG_SUB_16(src, dst, res);
4256                 FLAG_C = CFLAG_16(res);
4257                 return;
4258         }
4259         m68ki_exception_illegal(state);
4260 }
4261
4262
4263 M68KMAKE_OP(cmpi, 16, ., pcix)
4264 {
4265         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4266         {
4267                 uint src = OPER_I_16(state);
4268                 uint dst = OPER_PCIX_16(state);
4269                 uint res = dst - src;
4270
4271                 FLAG_N = NFLAG_16(res);
4272                 FLAG_Z = MASK_OUT_ABOVE_16(res);
4273                 FLAG_V = VFLAG_SUB_16(src, dst, res);
4274                 FLAG_C = CFLAG_16(res);
4275                 return;
4276         }
4277         m68ki_exception_illegal(state);
4278 }
4279
4280
4281 M68KMAKE_OP(cmpi, 32, ., d)
4282 {
4283         uint src = OPER_I_32(state);
4284         uint dst = DY;
4285         uint res = dst - src;
4286
4287         m68ki_cmpild_callback(src, REG_IR & 7);            /* auto-disable (see m68kcpu.h) */
4288         FLAG_N = NFLAG_32(res);
4289         FLAG_Z = MASK_OUT_ABOVE_32(res);
4290         FLAG_V = VFLAG_SUB_32(src, dst, res);
4291         FLAG_C = CFLAG_SUB_32(src, dst, res);
4292 }
4293
4294
4295 M68KMAKE_OP(cmpi, 32, ., .)
4296 {
4297         uint src = OPER_I_32(state);
4298         uint dst = M68KMAKE_GET_OPER_AY_32;
4299         uint res = dst - src;
4300
4301         FLAG_N = NFLAG_32(res);
4302         FLAG_Z = MASK_OUT_ABOVE_32(res);
4303         FLAG_V = VFLAG_SUB_32(src, dst, res);
4304         FLAG_C = CFLAG_SUB_32(src, dst, res);
4305 }
4306
4307
4308 M68KMAKE_OP(cmpi, 32, ., pcdi)
4309 {
4310         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4311         {
4312                 uint src = OPER_I_32(state);
4313                 uint dst = OPER_PCDI_32(state);
4314                 uint res = dst - src;
4315
4316                 FLAG_N = NFLAG_32(res);
4317                 FLAG_Z = MASK_OUT_ABOVE_32(res);
4318                 FLAG_V = VFLAG_SUB_32(src, dst, res);
4319                 FLAG_C = CFLAG_SUB_32(src, dst, res);
4320                 return;
4321         }
4322         m68ki_exception_illegal(state);
4323 }
4324
4325
4326 M68KMAKE_OP(cmpi, 32, ., pcix)
4327 {
4328         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4329         {
4330                 uint src = OPER_I_32(state);
4331                 uint dst = OPER_PCIX_32(state);
4332                 uint res = dst - src;
4333
4334                 FLAG_N = NFLAG_32(res);
4335                 FLAG_Z = MASK_OUT_ABOVE_32(res);
4336                 FLAG_V = VFLAG_SUB_32(src, dst, res);
4337                 FLAG_C = CFLAG_SUB_32(src, dst, res);
4338                 return;
4339         }
4340         m68ki_exception_illegal(state);
4341 }
4342
4343
4344 M68KMAKE_OP(cmpm, 8, ., ax7)
4345 {
4346         uint src = OPER_AY_PI_8(state);
4347         uint dst = OPER_A7_PI_8(state);
4348         uint res = dst - src;
4349
4350         FLAG_N = NFLAG_8(res);
4351         FLAG_Z = MASK_OUT_ABOVE_8(res);
4352         FLAG_V = VFLAG_SUB_8(src, dst, res);
4353         FLAG_C = CFLAG_8(res);
4354 }
4355
4356
4357 M68KMAKE_OP(cmpm, 8, ., ay7)
4358 {
4359         uint src = OPER_A7_PI_8(state);
4360         uint dst = OPER_AX_PI_8(state);
4361         uint res = dst - src;
4362
4363         FLAG_N = NFLAG_8(res);
4364         FLAG_Z = MASK_OUT_ABOVE_8(res);
4365         FLAG_V = VFLAG_SUB_8(src, dst, res);
4366         FLAG_C = CFLAG_8(res);
4367 }
4368
4369
4370 M68KMAKE_OP(cmpm, 8, ., axy7)
4371 {
4372         uint src = OPER_A7_PI_8(state);
4373         uint dst = OPER_A7_PI_8(state);
4374         uint res = dst - src;
4375
4376         FLAG_N = NFLAG_8(res);
4377         FLAG_Z = MASK_OUT_ABOVE_8(res);
4378         FLAG_V = VFLAG_SUB_8(src, dst, res);
4379         FLAG_C = CFLAG_8(res);
4380 }
4381
4382
4383 M68KMAKE_OP(cmpm, 8, ., .)
4384 {
4385         uint src = OPER_AY_PI_8(state);
4386         uint dst = OPER_AX_PI_8(state);
4387         uint res = dst - src;
4388
4389         FLAG_N = NFLAG_8(res);
4390         FLAG_Z = MASK_OUT_ABOVE_8(res);
4391         FLAG_V = VFLAG_SUB_8(src, dst, res);
4392         FLAG_C = CFLAG_8(res);
4393 }
4394
4395
4396 M68KMAKE_OP(cmpm, 16, ., .)
4397 {
4398         uint src = OPER_AY_PI_16(state);
4399         uint dst = OPER_AX_PI_16(state);
4400         uint res = dst - src;
4401
4402         FLAG_N = NFLAG_16(res);
4403         FLAG_Z = MASK_OUT_ABOVE_16(res);
4404         FLAG_V = VFLAG_SUB_16(src, dst, res);
4405         FLAG_C = CFLAG_16(res);
4406 }
4407
4408
4409 M68KMAKE_OP(cmpm, 32, ., .)
4410 {
4411         uint src = OPER_AY_PI_32(state);
4412         uint dst = OPER_AX_PI_32(state);
4413         uint res = dst - src;
4414
4415         FLAG_N = NFLAG_32(res);
4416         FLAG_Z = MASK_OUT_ABOVE_32(res);
4417         FLAG_V = VFLAG_SUB_32(src, dst, res);
4418         FLAG_C = CFLAG_SUB_32(src, dst, res);
4419 }
4420
4421
4422 M68KMAKE_OP(cpbcc, 32, ., .)
4423 {
4424         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4425         {
4426                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
4427                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
4428                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
4429                 return;
4430         }
4431         m68ki_exception_1111(state);
4432 }
4433
4434
4435 M68KMAKE_OP(cpdbcc, 32, ., .)
4436 {
4437         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4438         {
4439                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
4440                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
4441                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
4442                 return;
4443         }
4444         m68ki_exception_1111(state);
4445 }
4446
4447
4448 M68KMAKE_OP(cpgen, 32, ., .)
4449 {
4450 // TODO: what's the condition?
4451 //      if(HAS_FPU || HAS_PMMU)
4452         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4453         {
4454                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
4455                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
4456                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
4457                 return;
4458         }
4459         m68ki_exception_1111(state);
4460 }
4461
4462
4463 M68KMAKE_OP(cpscc, 32, ., .)
4464 {
4465         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4466         {
4467                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
4468                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
4469                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
4470                 return;
4471         }
4472         m68ki_exception_1111(state);
4473 }
4474
4475
4476 M68KMAKE_OP(cptrapcc, 32, ., .)
4477 {
4478         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4479         {
4480                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
4481                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
4482                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
4483         // JFF: unsupported, but at least if the trap doesn't occur, app should still work, so at least PC increase is correct
4484         REG_PC += 4;
4485                 return;
4486         }
4487         m68ki_exception_1111(state);
4488 }
4489
4490 M68KMAKE_OP(ftrapcc,32, ., .)
4491 {
4492         if(HAS_FPU)
4493         {
4494                 m68881_ftrap(state);
4495         } else {
4496                 m68ki_exception_1111(state);
4497         }
4498 }
4499
4500 M68KMAKE_OP(dbt, 16, ., .)
4501 {
4502         REG_PC += 2;
4503 }
4504
4505
4506 M68KMAKE_OP(dbf, 16, ., .)
4507 {
4508         uint* r_dst = &DY;
4509         uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
4510
4511         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
4512         if(res != 0xffff)
4513         {
4514                 uint offset = OPER_I_16(state);
4515                 REG_PC -= 2;
4516                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
4517                 m68ki_branch_16(state, offset);
4518                 USE_CYCLES(CYC_DBCC_F_NOEXP);
4519                 return;
4520         }
4521         REG_PC += 2;
4522         USE_CYCLES(CYC_DBCC_F_EXP);
4523 }
4524
4525
4526 M68KMAKE_OP(dbcc, 16, ., .)
4527 {
4528         if(M68KMAKE_NOT_CC)
4529         {
4530                 uint* r_dst = &DY;
4531                 uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
4532
4533                 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
4534                 if(res != 0xffff)
4535                 {
4536                         uint offset = OPER_I_16(state);
4537                         REG_PC -= 2;
4538                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
4539                         m68ki_branch_16(state, offset);
4540                         USE_CYCLES(CYC_DBCC_F_NOEXP);
4541                         return;
4542                 }
4543                 REG_PC += 2;
4544                 USE_CYCLES(CYC_DBCC_F_EXP);
4545                 return;
4546         }
4547         REG_PC += 2;
4548 }
4549
4550
4551 M68KMAKE_OP(divs, 16, ., d)
4552 {
4553         uint* r_dst = &DX;
4554         sint src = MAKE_INT_16(DY);
4555         sint quotient;
4556         sint remainder;
4557
4558         if(src != 0)
4559         {
4560                 FLAG_C = CFLAG_CLEAR;
4561                 if((uint32)*r_dst == 0x80000000 && src == -1)
4562                 {
4563                         FLAG_Z = 0;
4564                         FLAG_N = NFLAG_CLEAR;
4565                         FLAG_V = VFLAG_CLEAR;
4566                         *r_dst = 0;
4567                         return;
4568                 }
4569
4570                 quotient = MAKE_INT_32(*r_dst) / src;
4571                 remainder = MAKE_INT_32(*r_dst) % src;
4572
4573                 if(quotient == MAKE_INT_16(quotient))
4574                 {
4575                         FLAG_Z = quotient;
4576                         FLAG_N = NFLAG_16(quotient);
4577                         FLAG_V = VFLAG_CLEAR;
4578                         *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
4579                         return;
4580                 }
4581                 FLAG_V = VFLAG_SET;
4582                 return;
4583         }
4584         m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4585 }
4586
4587
4588 M68KMAKE_OP(divs, 16, ., .)
4589 {
4590         uint* r_dst = &DX;
4591         sint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
4592         sint quotient;
4593         sint remainder;
4594
4595         if(src != 0)
4596         {
4597                 FLAG_C = CFLAG_CLEAR;
4598                 if((uint32)*r_dst == 0x80000000 && src == -1)
4599                 {
4600                         FLAG_Z = 0;
4601                         FLAG_N = NFLAG_CLEAR;
4602                         FLAG_V = VFLAG_CLEAR;
4603                         *r_dst = 0;
4604                         return;
4605                 }
4606
4607                 quotient = MAKE_INT_32(*r_dst) / src;
4608                 remainder = MAKE_INT_32(*r_dst) % src;
4609
4610                 if(quotient == MAKE_INT_16(quotient))
4611                 {
4612                         FLAG_Z = quotient;
4613                         FLAG_N = NFLAG_16(quotient);
4614                         FLAG_V = VFLAG_CLEAR;
4615                         *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
4616                         return;
4617                 }
4618                 FLAG_V = VFLAG_SET;
4619                 return;
4620         }
4621         m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4622 }
4623
4624
4625 M68KMAKE_OP(divu, 16, ., d)
4626 {
4627         uint* r_dst = &DX;
4628         uint src = MASK_OUT_ABOVE_16(DY);
4629
4630         if(src != 0)
4631         {
4632                 FLAG_C = CFLAG_CLEAR;
4633                 uint quotient = *r_dst / src;
4634                 uint remainder = *r_dst % src;
4635
4636                 if(quotient < 0x10000)
4637                 {
4638                         FLAG_Z = quotient;
4639                         FLAG_N = NFLAG_16(quotient);
4640                         FLAG_V = VFLAG_CLEAR;
4641                         *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
4642                         return;
4643                 }
4644                 FLAG_V = VFLAG_SET;
4645                 return;
4646         }
4647         m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4648 }
4649
4650
4651 M68KMAKE_OP(divu, 16, ., .)
4652 {
4653         uint* r_dst = &DX;
4654         uint src = M68KMAKE_GET_OPER_AY_16;
4655
4656         if(src != 0)
4657         {
4658                 FLAG_C = CFLAG_CLEAR;
4659                 uint quotient = *r_dst / src;
4660                 uint remainder = *r_dst % src;
4661
4662                 if(quotient < 0x10000)
4663                 {
4664                         FLAG_Z = quotient;
4665                         FLAG_N = NFLAG_16(quotient);
4666                         FLAG_V = VFLAG_CLEAR;
4667                         *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
4668                         return;
4669                 }
4670                 FLAG_V = VFLAG_SET;
4671                 return;
4672         }
4673         m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4674 }
4675
4676
4677 M68KMAKE_OP(divl, 32, ., d)
4678 {
4679 #if M68K_USE_64_BIT
4680
4681         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4682         {
4683                 uint word2 = OPER_I_16(state);
4684                 uint64 divisor   = DY;
4685                 uint64 dividend  = 0;
4686                 uint64 quotient  = 0;
4687                 uint64 remainder = 0;
4688
4689                 if(divisor != 0)
4690                 {
4691                         if(BIT_A(word2))        /* 64 bit */
4692                         {
4693                                 dividend = REG_D[word2 & 7];
4694                                 dividend <<= 32;
4695                                 dividend |= REG_D[(word2 >> 12) & 7];
4696
4697                                 if(BIT_B(word2))           /* signed */
4698                                 {
4699                                         quotient  = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
4700                                         remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
4701                                         if((sint64)quotient != (sint64)((sint32)quotient))
4702                                         {
4703                                                 FLAG_V = VFLAG_SET;
4704                                                 return;
4705                                         }
4706                                 }
4707                                 else                                    /* unsigned */
4708                                 {
4709                                         quotient = dividend / divisor;
4710                                         if(quotient > 0xffffffff)
4711                                         {
4712                                                 FLAG_V = VFLAG_SET;
4713                                                 return;
4714                                         }
4715                                         remainder = dividend % divisor;
4716                                 }
4717                         }
4718                         else    /* 32 bit */
4719                         {
4720                                 dividend = REG_D[(word2 >> 12) & 7];
4721                                 if(BIT_B(word2))           /* signed */
4722                                 {
4723                                         quotient  = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
4724                                         remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
4725                                 }
4726                                 else                                    /* unsigned */
4727                                 {
4728                                         quotient = dividend / divisor;
4729                                         remainder = dividend % divisor;
4730                                 }
4731                         }
4732
4733                         REG_D[word2 & 7] = remainder;
4734                         REG_D[(word2 >> 12) & 7] = quotient;
4735
4736                         FLAG_N = NFLAG_32(quotient);
4737                         FLAG_Z = quotient;
4738                         FLAG_V = VFLAG_CLEAR;
4739                         FLAG_C = CFLAG_CLEAR;
4740                         return;
4741                 }
4742                 m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4743                 return;
4744         }
4745         m68ki_exception_illegal(state);
4746
4747 #else
4748
4749         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4750         {
4751                 uint word2 = OPER_I_16(state);
4752                 uint divisor = DY;
4753                 uint dividend_hi = REG_D[word2 & 7];
4754                 uint dividend_lo = REG_D[(word2 >> 12) & 7];
4755                 uint quotient = 0;
4756                 uint remainder = 0;
4757                 uint dividend_neg = 0;
4758                 uint divisor_neg = 0;
4759                 sint i;
4760                 uint overflow;
4761
4762                 if(divisor != 0)
4763                 {
4764                         /* quad / long : long quotient, long remainder */
4765                         if(BIT_A(word2))
4766                         {
4767                                 if(BIT_B(word2))           /* signed */
4768                                 {
4769                                         /* special case in signed divide */
4770                                         if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
4771                                         {
4772                                                 REG_D[word2 & 7] = 0;
4773                                                 REG_D[(word2 >> 12) & 7] = 0x80000000;
4774
4775                                                 FLAG_N = NFLAG_SET;
4776                                                 FLAG_Z = ZFLAG_CLEAR;
4777                                                 FLAG_V = VFLAG_CLEAR;
4778                                                 FLAG_C = CFLAG_CLEAR;
4779                                                 return;
4780                                         }
4781                                         if(GET_MSB_32(dividend_hi))
4782                                         {
4783                                                 dividend_neg = 1;
4784                                                 dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
4785                                                 dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
4786                                         }
4787                                         if(GET_MSB_32(divisor))
4788                                         {
4789                                                 divisor_neg = 1;
4790                                                 divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
4791
4792                                         }
4793                                 }
4794
4795                                 /* if the upper long is greater than the divisor, we're overflowing. */
4796                                 if(dividend_hi >= divisor)
4797                                 {
4798                                         FLAG_V = VFLAG_SET;
4799                                         return;
4800                                 }
4801
4802                                 for(i = 31; i >= 0; i--)
4803                                 {
4804                                         quotient <<= 1;
4805                                         remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
4806                                         if(remainder >= divisor)
4807                                         {
4808                                                 remainder -= divisor;
4809                                                 quotient++;
4810                                         }
4811                                 }
4812                                 for(i = 31; i >= 0; i--)
4813                                 {
4814                                         quotient <<= 1;
4815                                         overflow = GET_MSB_32(remainder);
4816                                         remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
4817                                         if(remainder >= divisor || overflow)
4818                                         {
4819                                                 remainder -= divisor;
4820                                                 quotient++;
4821                                         }
4822                                 }
4823
4824                                 if(BIT_B(word2))           /* signed */
4825                                 {
4826                                         if(quotient > 0x7fffffff)
4827                                         {
4828                                                 FLAG_V = VFLAG_SET;
4829                                                 return;
4830                                         }
4831                                         if(dividend_neg)
4832                                         {
4833                                                 remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
4834                                                 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
4835                                         }
4836                                         if(divisor_neg)
4837                                                 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
4838                                 }
4839
4840                                 REG_D[word2 & 7] = remainder;
4841                                 REG_D[(word2 >> 12) & 7] = quotient;
4842
4843                                 FLAG_N = NFLAG_32(quotient);
4844                                 FLAG_Z = quotient;
4845                                 FLAG_V = VFLAG_CLEAR;
4846                                 FLAG_C = CFLAG_CLEAR;
4847                                 return;
4848                         }
4849
4850                         /* long / long: long quotient, maybe long remainder */
4851                         if(BIT_B(word2))           /* signed */
4852                         {
4853                                 /* Special case in divide */
4854                                 if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
4855                                 {
4856                                         FLAG_N = NFLAG_SET;
4857                                         FLAG_Z = ZFLAG_CLEAR;
4858                                         FLAG_V = VFLAG_CLEAR;
4859                                         FLAG_C = CFLAG_CLEAR;
4860                                         REG_D[(word2 >> 12) & 7] = 0x80000000;
4861                                         REG_D[word2 & 7] = 0;
4862                                         return;
4863                                 }
4864                                 REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
4865                                 quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
4866                         }
4867                         else
4868                         {
4869                                 REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
4870                                 quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
4871                         }
4872
4873                         FLAG_N = NFLAG_32(quotient);
4874                         FLAG_Z = quotient;
4875                         FLAG_V = VFLAG_CLEAR;
4876                         FLAG_C = CFLAG_CLEAR;
4877                         return;
4878                 }
4879                 m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4880                 return;
4881         }
4882         m68ki_exception_illegal(state);
4883
4884 #endif
4885 }
4886
4887
4888 M68KMAKE_OP(divl, 32, ., .)
4889 {
4890 #if M68K_USE_64_BIT
4891
4892         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4893         {
4894                 uint word2 = OPER_I_16(state);
4895                 uint64 divisor = M68KMAKE_GET_OPER_AY_32;
4896                 uint64 dividend  = 0;
4897                 uint64 quotient  = 0;
4898                 uint64 remainder = 0;
4899
4900                 if(divisor != 0)
4901                 {
4902                         if(BIT_A(word2))        /* 64 bit */
4903                         {
4904                                 dividend = REG_D[word2 & 7];
4905                                 dividend <<= 32;
4906                                 dividend |= REG_D[(word2 >> 12) & 7];
4907
4908                                 if(BIT_B(word2))           /* signed */
4909                                 {
4910                                         quotient  = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
4911                                         remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
4912                                         if((sint64)quotient != (sint64)((sint32)quotient))
4913                                         {
4914                                                 FLAG_V = VFLAG_SET;
4915                                                 return;
4916                                         }
4917                                 }
4918                                 else                                    /* unsigned */
4919                                 {
4920                                         quotient = dividend / divisor;
4921                                         if(quotient > 0xffffffff)
4922                                         {
4923                                                 FLAG_V = VFLAG_SET;
4924                                                 return;
4925                                         }
4926                                         remainder = dividend % divisor;
4927                                 }
4928                         }
4929                         else    /* 32 bit */
4930                         {
4931                                 dividend = REG_D[(word2 >> 12) & 7];
4932                                 if(BIT_B(word2))           /* signed */
4933                                 {
4934                                         quotient  = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
4935                                         remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
4936                                 }
4937                                 else                                    /* unsigned */
4938                                 {
4939                                         quotient = dividend / divisor;
4940                                         remainder = dividend % divisor;
4941                                 }
4942                         }
4943
4944                         REG_D[word2 & 7] = remainder;
4945                         REG_D[(word2 >> 12) & 7] = quotient;
4946
4947                         FLAG_N = NFLAG_32(quotient);
4948                         FLAG_Z = quotient;
4949                         FLAG_V = VFLAG_CLEAR;
4950                         FLAG_C = CFLAG_CLEAR;
4951                         return;
4952                 }
4953                 m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
4954                 return;
4955         }
4956         m68ki_exception_illegal(state);
4957
4958 #else
4959
4960         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
4961         {
4962                 uint word2 = OPER_I_16(state);
4963                 uint divisor = M68KMAKE_GET_OPER_AY_32;
4964                 uint dividend_hi = REG_D[word2 & 7];
4965                 uint dividend_lo = REG_D[(word2 >> 12) & 7];
4966                 uint quotient = 0;
4967                 uint remainder = 0;
4968                 uint dividend_neg = 0;
4969                 uint divisor_neg = 0;
4970                 sint i;
4971                 uint overflow;
4972
4973                 if(divisor != 0)
4974                 {
4975                         /* quad / long : long quotient, long remainder */
4976                         if(BIT_A(word2))
4977                         {
4978                                 if(BIT_B(word2))           /* signed */
4979                                 {
4980                                         /* special case in signed divide */
4981                                         if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
4982                                         {
4983                                                 REG_D[word2 & 7] = 0;
4984                                                 REG_D[(word2 >> 12) & 7] = 0x80000000;
4985
4986                                                 FLAG_N = NFLAG_SET;
4987                                                 FLAG_Z = ZFLAG_CLEAR;
4988                                                 FLAG_V = VFLAG_CLEAR;
4989                                                 FLAG_C = CFLAG_CLEAR;
4990                                                 return;
4991                                         }
4992                                         if(GET_MSB_32(dividend_hi))
4993                                         {
4994                                                 dividend_neg = 1;
4995                                                 dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
4996                                                 dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
4997                                         }
4998                                         if(GET_MSB_32(divisor))
4999                                         {
5000                                                 divisor_neg = 1;
5001                                                 divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
5002
5003                                         }
5004                                 }
5005
5006                                 /* if the upper long is greater than the divisor, we're overflowing. */
5007                                 if(dividend_hi >= divisor)
5008                                 {
5009                                         FLAG_V = VFLAG_SET;
5010                                         return;
5011                                 }
5012
5013                                 for(i = 31; i >= 0; i--)
5014                                 {
5015                                         quotient <<= 1;
5016                                         remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
5017                                         if(remainder >= divisor)
5018                                         {
5019                                                 remainder -= divisor;
5020                                                 quotient++;
5021                                         }
5022                                 }
5023                                 for(i = 31; i >= 0; i--)
5024                                 {
5025                                         quotient <<= 1;
5026                                         overflow = GET_MSB_32(remainder);
5027                                         remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
5028                                         if(remainder >= divisor || overflow)
5029                                         {
5030                                                 remainder -= divisor;
5031                                                 quotient++;
5032                                         }
5033                                 }
5034
5035                                 if(BIT_B(word2))           /* signed */
5036                                 {
5037                                         if(quotient > 0x7fffffff)
5038                                         {
5039                                                 FLAG_V = VFLAG_SET;
5040                                                 return;
5041                                         }
5042                                         if(dividend_neg)
5043                                         {
5044                                                 remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
5045                                                 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
5046                                         }
5047                                         if(divisor_neg)
5048                                                 quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
5049                                 }
5050
5051                                 REG_D[word2 & 7] = remainder;
5052                                 REG_D[(word2 >> 12) & 7] = quotient;
5053
5054                                 FLAG_N = NFLAG_32(quotient);
5055                                 FLAG_Z = quotient;
5056                                 FLAG_V = VFLAG_CLEAR;
5057                                 FLAG_C = CFLAG_CLEAR;
5058                                 return;
5059                         }
5060
5061                         /* long / long: long quotient, maybe long remainder */
5062                         if(BIT_B(word2))           /* signed */
5063                         {
5064                                 /* Special case in divide */
5065                                 if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
5066                                 {
5067                                         FLAG_N = NFLAG_SET;
5068                                         FLAG_Z = ZFLAG_CLEAR;
5069                                         FLAG_V = VFLAG_CLEAR;
5070                                         FLAG_C = CFLAG_CLEAR;
5071                                         REG_D[(word2 >> 12) & 7] = 0x80000000;
5072                                         REG_D[word2 & 7] = 0;
5073                                         return;
5074                                 }
5075                                 REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
5076                                 quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
5077                         }
5078                         else
5079                         {
5080                                 REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
5081                                 quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
5082                         }
5083
5084                         FLAG_N = NFLAG_32(quotient);
5085                         FLAG_Z = quotient;
5086                         FLAG_V = VFLAG_CLEAR;
5087                         FLAG_C = CFLAG_CLEAR;
5088                         return;
5089                 }
5090                 m68ki_exception_trap(state, EXCEPTION_ZERO_DIVIDE);
5091                 return;
5092         }
5093         m68ki_exception_illegal(state);
5094
5095 #endif
5096 }
5097
5098
5099 M68KMAKE_OP(eor, 8, ., d)
5100 {
5101         uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX));
5102
5103         FLAG_N = NFLAG_8(res);
5104         FLAG_Z = res;
5105         FLAG_C = CFLAG_CLEAR;
5106         FLAG_V = VFLAG_CLEAR;
5107 }
5108
5109
5110 M68KMAKE_OP(eor, 8, ., .)
5111 {
5112         uint ea = M68KMAKE_GET_EA_AY_8;
5113         uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(state, ea));
5114
5115         m68ki_write_8(state, ea, res);
5116
5117         FLAG_N = NFLAG_8(res);
5118         FLAG_Z = res;
5119         FLAG_C = CFLAG_CLEAR;
5120         FLAG_V = VFLAG_CLEAR;
5121 }
5122
5123
5124 M68KMAKE_OP(eor, 16, ., d)
5125 {
5126         uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX));
5127
5128         FLAG_N = NFLAG_16(res);
5129         FLAG_Z = res;
5130         FLAG_C = CFLAG_CLEAR;
5131         FLAG_V = VFLAG_CLEAR;
5132 }
5133
5134
5135 M68KMAKE_OP(eor, 16, ., .)
5136 {
5137         uint ea = M68KMAKE_GET_EA_AY_16;
5138         uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(state, ea));
5139
5140         m68ki_write_16(state, ea, res);
5141
5142         FLAG_N = NFLAG_16(res);
5143         FLAG_Z = res;
5144         FLAG_C = CFLAG_CLEAR;
5145         FLAG_V = VFLAG_CLEAR;
5146 }
5147
5148
5149 M68KMAKE_OP(eor, 32, ., d)
5150 {
5151         uint res = DY ^= DX;
5152
5153         FLAG_N = NFLAG_32(res);
5154         FLAG_Z = res;
5155         FLAG_C = CFLAG_CLEAR;
5156         FLAG_V = VFLAG_CLEAR;
5157 }
5158
5159
5160 M68KMAKE_OP(eor, 32, ., .)
5161 {
5162         uint ea = M68KMAKE_GET_EA_AY_32;
5163         uint res = DX ^ m68ki_read_32(state, ea);
5164
5165         m68ki_write_32(state, ea, res);
5166
5167         FLAG_N = NFLAG_32(res);
5168         FLAG_Z = res;
5169         FLAG_C = CFLAG_CLEAR;
5170         FLAG_V = VFLAG_CLEAR;
5171 }
5172
5173
5174 M68KMAKE_OP(eori, 8, ., d)
5175 {
5176         uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8(state));
5177
5178         FLAG_N = NFLAG_8(res);
5179         FLAG_Z = res;
5180         FLAG_C = CFLAG_CLEAR;
5181         FLAG_V = VFLAG_CLEAR;
5182 }
5183
5184
5185 M68KMAKE_OP(eori, 8, ., .)
5186 {
5187         uint src = OPER_I_8(state);
5188         uint ea = M68KMAKE_GET_EA_AY_8;
5189         uint res = src ^ m68ki_read_8(state, ea);
5190
5191         m68ki_write_8(state, ea, res);
5192
5193         FLAG_N = NFLAG_8(res);
5194         FLAG_Z = res;
5195         FLAG_C = CFLAG_CLEAR;
5196         FLAG_V = VFLAG_CLEAR;
5197 }
5198
5199
5200 M68KMAKE_OP(eori, 16, ., d)
5201 {
5202         uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16(state));
5203
5204         FLAG_N = NFLAG_16(res);
5205         FLAG_Z = res;
5206         FLAG_C = CFLAG_CLEAR;
5207         FLAG_V = VFLAG_CLEAR;
5208 }
5209
5210
5211 M68KMAKE_OP(eori, 16, ., .)
5212 {
5213         uint src = OPER_I_16(state);
5214         uint ea = M68KMAKE_GET_EA_AY_16;
5215         uint res = src ^ m68ki_read_16(state, ea);
5216
5217         m68ki_write_16(state, ea, res);
5218
5219         FLAG_N = NFLAG_16(res);
5220         FLAG_Z = res;
5221         FLAG_C = CFLAG_CLEAR;
5222         FLAG_V = VFLAG_CLEAR;
5223 }
5224
5225
5226 M68KMAKE_OP(eori, 32, ., d)
5227 {
5228         uint res = DY ^= OPER_I_32(state);
5229
5230         FLAG_N = NFLAG_32(res);
5231         FLAG_Z = res;
5232         FLAG_C = CFLAG_CLEAR;
5233         FLAG_V = VFLAG_CLEAR;
5234 }
5235
5236
5237 M68KMAKE_OP(eori, 32, ., .)
5238 {
5239         uint src = OPER_I_32(state);
5240         uint ea = M68KMAKE_GET_EA_AY_32;
5241         uint res = src ^ m68ki_read_32(state, ea);
5242
5243         m68ki_write_32(state, ea, res);
5244
5245         FLAG_N = NFLAG_32(res);
5246         FLAG_Z = res;
5247         FLAG_C = CFLAG_CLEAR;
5248         FLAG_V = VFLAG_CLEAR;
5249 }
5250
5251
5252 M68KMAKE_OP(eori, 16, toc, .)
5253 {
5254         m68ki_set_ccr(state, m68ki_get_ccr(state) ^ OPER_I_8(state));
5255 }
5256
5257
5258 M68KMAKE_OP(eori, 16, tos, .)
5259 {
5260         if(FLAG_S)
5261         {
5262                 uint src = OPER_I_16(state);
5263                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
5264                 m68ki_set_sr(state, m68ki_get_sr() ^ src);
5265                 return;
5266         }
5267         m68ki_exception_privilege_violation(state);
5268 }
5269
5270
5271 M68KMAKE_OP(exg, 32, dd, .)
5272 {
5273         uint* reg_a = &DX;
5274         uint* reg_b = &DY;
5275         uint tmp = *reg_a;
5276         *reg_a = *reg_b;
5277         *reg_b = tmp;
5278 }
5279
5280
5281 M68KMAKE_OP(exg, 32, aa, .)
5282 {
5283         uint* reg_a = &AX;
5284         uint* reg_b = &AY;
5285         uint tmp = *reg_a;
5286         *reg_a = *reg_b;
5287         *reg_b = tmp;
5288 }
5289
5290
5291 M68KMAKE_OP(exg, 32, da, .)
5292 {
5293         uint* reg_a = &DX;
5294         uint* reg_b = &AY;
5295         uint tmp = *reg_a;
5296         *reg_a = *reg_b;
5297         *reg_b = tmp;
5298 }
5299
5300
5301 M68KMAKE_OP(ext, 16, ., .)
5302 {
5303         uint* r_dst = &DY;
5304
5305         *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0);
5306
5307         FLAG_N = NFLAG_16(*r_dst);
5308         FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
5309         FLAG_V = VFLAG_CLEAR;
5310         FLAG_C = CFLAG_CLEAR;
5311 }
5312
5313
5314 M68KMAKE_OP(ext, 32, ., .)
5315 {
5316         uint* r_dst = &DY;
5317
5318         *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0);
5319
5320         FLAG_N = NFLAG_32(*r_dst);
5321         FLAG_Z = *r_dst;
5322         FLAG_V = VFLAG_CLEAR;
5323         FLAG_C = CFLAG_CLEAR;
5324 }
5325
5326
5327 M68KMAKE_OP(extb, 32, ., .)
5328 {
5329         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
5330         {
5331                 uint* r_dst = &DY;
5332
5333                 *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0);
5334
5335                 FLAG_N = NFLAG_32(*r_dst);
5336                 FLAG_Z = *r_dst;
5337                 FLAG_V = VFLAG_CLEAR;
5338                 FLAG_C = CFLAG_CLEAR;
5339                 return;
5340         }
5341         m68ki_exception_illegal(state);
5342 }
5343
5344
5345 M68KMAKE_OP(illegal, 0, ., .)
5346 {
5347         m68ki_exception_illegal(state);
5348 }
5349
5350 M68KMAKE_OP(jmp, 32, ., .)
5351 {
5352         m68ki_jump(state, M68KMAKE_GET_EA_AY_32);
5353         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
5354 }
5355
5356
5357 M68KMAKE_OP(jsr, 32, ., .)
5358 {
5359         uint ea = M68KMAKE_GET_EA_AY_32;
5360         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
5361         m68ki_push_32(state, REG_PC);
5362         m68ki_jump(state, ea);
5363 }
5364
5365
5366 M68KMAKE_OP(lea, 32, ., .)
5367 {
5368         AX = M68KMAKE_GET_EA_AY_32;
5369 }
5370
5371
5372 M68KMAKE_OP(link, 16, ., a7)
5373 {
5374         REG_A[7] -= 4;
5375         m68ki_write_32(state, REG_A[7], REG_A[7]);
5376         REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16(state)));
5377 }
5378
5379
5380 M68KMAKE_OP(link, 16, ., .)
5381 {
5382         uint* r_dst = &AY;
5383
5384         m68ki_push_32(state, *r_dst);
5385         *r_dst = REG_A[7];
5386         REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16(state)));
5387 }
5388
5389
5390 M68KMAKE_OP(link, 32, ., a7)
5391 {
5392         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
5393         {
5394                 REG_A[7] -= 4;
5395                 m68ki_write_32(state, REG_A[7], REG_A[7]);
5396                 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32(state));
5397                 return;
5398         }
5399         m68ki_exception_illegal(state);
5400 }
5401
5402
5403 M68KMAKE_OP(link, 32, ., .)
5404 {
5405         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
5406         {
5407                 uint* r_dst = &AY;
5408
5409                 m68ki_push_32(state, *r_dst);
5410                 *r_dst = REG_A[7];
5411                 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32(state));
5412                 return;
5413         }
5414         m68ki_exception_illegal(state);
5415 }
5416
5417
5418 M68KMAKE_OP(lsr, 8, s, .)
5419 {
5420         uint* r_dst = &DY;
5421         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5422         uint src = MASK_OUT_ABOVE_8(*r_dst);
5423         uint res = src >> shift;
5424
5425         if(shift != 0)
5426                 USE_CYCLES(shift<<CYC_SHIFT);
5427
5428         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5429
5430         FLAG_N = NFLAG_CLEAR;
5431         FLAG_Z = res;
5432         FLAG_X = FLAG_C = src << (9-shift);
5433         FLAG_V = VFLAG_CLEAR;
5434 }
5435
5436
5437 M68KMAKE_OP(lsr, 16, s, .)
5438 {
5439         uint* r_dst = &DY;
5440         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5441         uint src = MASK_OUT_ABOVE_16(*r_dst);
5442         uint res = src >> shift;
5443
5444         if(shift != 0)
5445                 USE_CYCLES(shift<<CYC_SHIFT);
5446
5447         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
5448
5449         FLAG_N = NFLAG_CLEAR;
5450         FLAG_Z = res;
5451         FLAG_X = FLAG_C = src << (9-shift);
5452         FLAG_V = VFLAG_CLEAR;
5453 }
5454
5455
5456 M68KMAKE_OP(lsr, 32, s, .)
5457 {
5458         uint* r_dst = &DY;
5459         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5460         uint src = *r_dst;
5461         uint res = src >> shift;
5462
5463         if(shift != 0)
5464                 USE_CYCLES(shift<<CYC_SHIFT);
5465
5466         *r_dst = res;
5467
5468         FLAG_N = NFLAG_CLEAR;
5469         FLAG_Z = res;
5470         FLAG_X = FLAG_C = src << (9-shift);
5471         FLAG_V = VFLAG_CLEAR;
5472 }
5473
5474
5475 M68KMAKE_OP(lsr, 8, r, .)
5476 {
5477         uint* r_dst = &DY;
5478         uint shift = DX & 0x3f;
5479         uint src = MASK_OUT_ABOVE_8(*r_dst);
5480         uint res = src >> shift;
5481
5482         if(shift != 0)
5483         {
5484                 USE_CYCLES(shift<<CYC_SHIFT);
5485
5486                 if(shift <= 8)
5487                 {
5488                         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5489                         FLAG_X = FLAG_C = src << (9-shift);
5490                         FLAG_N = NFLAG_CLEAR;
5491                         FLAG_Z = res;
5492                         FLAG_V = VFLAG_CLEAR;
5493                         return;
5494                 }
5495
5496                 *r_dst &= 0xffffff00;
5497                 FLAG_X = XFLAG_CLEAR;
5498                 FLAG_C = CFLAG_CLEAR;
5499                 FLAG_N = NFLAG_CLEAR;
5500                 FLAG_Z = ZFLAG_SET;
5501                 FLAG_V = VFLAG_CLEAR;
5502                 return;
5503         }
5504
5505         FLAG_C = CFLAG_CLEAR;
5506         FLAG_N = NFLAG_8(src);
5507         FLAG_Z = src;
5508         FLAG_V = VFLAG_CLEAR;
5509 }
5510
5511
5512 M68KMAKE_OP(lsr, 16, r, .)
5513 {
5514         uint* r_dst = &DY;
5515         uint shift = DX & 0x3f;
5516         uint src = MASK_OUT_ABOVE_16(*r_dst);
5517         uint res = src >> shift;
5518
5519         if(shift != 0)
5520         {
5521                 USE_CYCLES(shift<<CYC_SHIFT);
5522
5523                 if(shift <= 16)
5524                 {
5525                         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
5526                         FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
5527                         FLAG_N = NFLAG_CLEAR;
5528                         FLAG_Z = res;
5529                         FLAG_V = VFLAG_CLEAR;
5530                         return;
5531                 }
5532
5533                 *r_dst &= 0xffff0000;
5534                 FLAG_X = XFLAG_CLEAR;
5535                 FLAG_C = CFLAG_CLEAR;
5536                 FLAG_N = NFLAG_CLEAR;
5537                 FLAG_Z = ZFLAG_SET;
5538                 FLAG_V = VFLAG_CLEAR;
5539                 return;
5540         }
5541
5542         FLAG_C = CFLAG_CLEAR;
5543         FLAG_N = NFLAG_16(src);
5544         FLAG_Z = src;
5545         FLAG_V = VFLAG_CLEAR;
5546 }
5547
5548
5549 M68KMAKE_OP(lsr, 32, r, .)
5550 {
5551         uint* r_dst = &DY;
5552         uint shift = DX & 0x3f;
5553         uint src = *r_dst;
5554         uint res = src >> shift;
5555
5556         if(shift != 0)
5557         {
5558                 USE_CYCLES(shift<<CYC_SHIFT);
5559
5560                 if(shift < 32)
5561                 {
5562                         *r_dst = res;
5563                         FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
5564                         FLAG_N = NFLAG_CLEAR;
5565                         FLAG_Z = res;
5566                         FLAG_V = VFLAG_CLEAR;
5567                         return;
5568                 }
5569
5570                 *r_dst = 0;
5571                 FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0);
5572                 FLAG_N = NFLAG_CLEAR;
5573                 FLAG_Z = ZFLAG_SET;
5574                 FLAG_V = VFLAG_CLEAR;
5575                 return;
5576         }
5577
5578         FLAG_C = CFLAG_CLEAR;
5579         FLAG_N = NFLAG_32(src);
5580         FLAG_Z = src;
5581         FLAG_V = VFLAG_CLEAR;
5582 }
5583
5584
5585 M68KMAKE_OP(lsr, 16, ., .)
5586 {
5587         uint ea = M68KMAKE_GET_EA_AY_16;
5588         uint src = m68ki_read_16(state, ea);
5589         uint res = src >> 1;
5590
5591         m68ki_write_16(state, ea, res);
5592
5593         FLAG_N = NFLAG_CLEAR;
5594         FLAG_Z = res;
5595         FLAG_C = FLAG_X = src << 8;
5596         FLAG_V = VFLAG_CLEAR;
5597 }
5598
5599
5600 M68KMAKE_OP(lsl, 8, s, .)
5601 {
5602         uint* r_dst = &DY;
5603         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5604         uint src = MASK_OUT_ABOVE_8(*r_dst);
5605         uint res = MASK_OUT_ABOVE_8(src << shift);
5606
5607         if(shift != 0)
5608                 USE_CYCLES(shift<<CYC_SHIFT);
5609
5610         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5611
5612         FLAG_N = NFLAG_8(res);
5613         FLAG_Z = res;
5614         FLAG_X = FLAG_C = src << shift;
5615         FLAG_V = VFLAG_CLEAR;
5616 }
5617
5618
5619 M68KMAKE_OP(lsl, 16, s, .)
5620 {
5621         uint* r_dst = &DY;
5622         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5623         uint src = MASK_OUT_ABOVE_16(*r_dst);
5624         uint res = MASK_OUT_ABOVE_16(src << shift);
5625
5626         if(shift != 0)
5627                 USE_CYCLES(shift<<CYC_SHIFT);
5628
5629         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
5630
5631         FLAG_N = NFLAG_16(res);
5632         FLAG_Z = res;
5633         FLAG_X = FLAG_C = src >> (8-shift);
5634         FLAG_V = VFLAG_CLEAR;
5635 }
5636
5637
5638 M68KMAKE_OP(lsl, 32, s, .)
5639 {
5640         uint* r_dst = &DY;
5641         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
5642         uint src = *r_dst;
5643         uint res = MASK_OUT_ABOVE_32(src << shift);
5644
5645         if(shift != 0)
5646                 USE_CYCLES(shift<<CYC_SHIFT);
5647
5648         *r_dst = res;
5649
5650         FLAG_N = NFLAG_32(res);
5651         FLAG_Z = res;
5652         FLAG_X = FLAG_C = src >> (24-shift);
5653         FLAG_V = VFLAG_CLEAR;
5654 }
5655
5656
5657 M68KMAKE_OP(lsl, 8, r, .)
5658 {
5659         uint* r_dst = &DY;
5660         uint shift = DX & 0x3f;
5661         uint src = MASK_OUT_ABOVE_8(*r_dst);
5662         uint res = MASK_OUT_ABOVE_8(src << shift);
5663
5664         if(shift != 0)
5665         {
5666                 USE_CYCLES(shift<<CYC_SHIFT);
5667
5668                 if(shift <= 8)
5669                 {
5670                         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5671                         FLAG_X = FLAG_C = src << shift;
5672                         FLAG_N = NFLAG_8(res);
5673                         FLAG_Z = res;
5674                         FLAG_V = VFLAG_CLEAR;
5675                         return;
5676                 }
5677
5678                 *r_dst &= 0xffffff00;
5679                 FLAG_X = XFLAG_CLEAR;
5680                 FLAG_C = CFLAG_CLEAR;
5681                 FLAG_N = NFLAG_CLEAR;
5682                 FLAG_Z = ZFLAG_SET;
5683                 FLAG_V = VFLAG_CLEAR;
5684                 return;
5685         }
5686
5687         FLAG_C = CFLAG_CLEAR;
5688         FLAG_N = NFLAG_8(src);
5689         FLAG_Z = src;
5690         FLAG_V = VFLAG_CLEAR;
5691 }
5692
5693
5694 M68KMAKE_OP(lsl, 16, r, .)
5695 {
5696         uint* r_dst = &DY;
5697         uint shift = DX & 0x3f;
5698         uint src = MASK_OUT_ABOVE_16(*r_dst);
5699         uint res = MASK_OUT_ABOVE_16(src << shift);
5700
5701         if(shift != 0)
5702         {
5703                 USE_CYCLES(shift<<CYC_SHIFT);
5704
5705                 if(shift <= 16)
5706                 {
5707                         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
5708                         FLAG_X = FLAG_C = (src << shift) >> 8;
5709                         FLAG_N = NFLAG_16(res);
5710                         FLAG_Z = res;
5711                         FLAG_V = VFLAG_CLEAR;
5712                         return;
5713                 }
5714
5715                 *r_dst &= 0xffff0000;
5716                 FLAG_X = XFLAG_CLEAR;
5717                 FLAG_C = CFLAG_CLEAR;
5718                 FLAG_N = NFLAG_CLEAR;
5719                 FLAG_Z = ZFLAG_SET;
5720                 FLAG_V = VFLAG_CLEAR;
5721                 return;
5722         }
5723
5724         FLAG_C = CFLAG_CLEAR;
5725         FLAG_N = NFLAG_16(src);
5726         FLAG_Z = src;
5727         FLAG_V = VFLAG_CLEAR;
5728 }
5729
5730
5731 M68KMAKE_OP(lsl, 32, r, .)
5732 {
5733         uint* r_dst = &DY;
5734         uint shift = DX & 0x3f;
5735         uint src = *r_dst;
5736         uint res = MASK_OUT_ABOVE_32(src << shift);
5737
5738         if(shift != 0)
5739         {
5740                 USE_CYCLES(shift<<CYC_SHIFT);
5741
5742                 if(shift < 32)
5743                 {
5744                         *r_dst = res;
5745                         FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
5746                         FLAG_N = NFLAG_32(res);
5747                         FLAG_Z = res;
5748                         FLAG_V = VFLAG_CLEAR;
5749                         return;
5750                 }
5751
5752                 *r_dst = 0;
5753                 FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
5754                 FLAG_N = NFLAG_CLEAR;
5755                 FLAG_Z = ZFLAG_SET;
5756                 FLAG_V = VFLAG_CLEAR;
5757                 return;
5758         }
5759
5760         FLAG_C = CFLAG_CLEAR;
5761         FLAG_N = NFLAG_32(src);
5762         FLAG_Z = src;
5763         FLAG_V = VFLAG_CLEAR;
5764 }
5765
5766
5767 M68KMAKE_OP(lsl, 16, ., .)
5768 {
5769         uint ea = M68KMAKE_GET_EA_AY_16;
5770         uint src = m68ki_read_16(state, ea);
5771         uint res = MASK_OUT_ABOVE_16(src << 1);
5772
5773         m68ki_write_16(state, ea, res);
5774
5775         FLAG_N = NFLAG_16(res);
5776         FLAG_Z = res;
5777         FLAG_X = FLAG_C = src >> 7;
5778         FLAG_V = VFLAG_CLEAR;
5779 }
5780
5781
5782 M68KMAKE_OP(move, 8, d, d)
5783 {
5784         uint res = MASK_OUT_ABOVE_8(DY);
5785         uint* r_dst = &DX;
5786
5787         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5788
5789         FLAG_N = NFLAG_8(res);
5790         FLAG_Z = res;
5791         FLAG_V = VFLAG_CLEAR;
5792         FLAG_C = CFLAG_CLEAR;
5793 }
5794
5795
5796 M68KMAKE_OP(move, 8, d, .)
5797 {
5798         uint res = M68KMAKE_GET_OPER_AY_8;
5799         uint* r_dst = &DX;
5800
5801         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
5802
5803         FLAG_N = NFLAG_8(res);
5804         FLAG_Z = res;
5805         FLAG_V = VFLAG_CLEAR;
5806         FLAG_C = CFLAG_CLEAR;
5807 }
5808
5809
5810 M68KMAKE_OP(move, 8, ai, d)
5811 {
5812         uint res = MASK_OUT_ABOVE_8(DY);
5813         uint ea = EA_AX_AI_8();
5814
5815         m68ki_write_8(state, ea, res);
5816
5817         FLAG_N = NFLAG_8(res);
5818         FLAG_Z = res;
5819         FLAG_V = VFLAG_CLEAR;
5820         FLAG_C = CFLAG_CLEAR;
5821 }
5822
5823
5824 M68KMAKE_OP(move, 8, ai, .)
5825 {
5826         uint res = M68KMAKE_GET_OPER_AY_8;
5827         uint ea = EA_AX_AI_8();
5828
5829         m68ki_write_8(state, ea, res);
5830
5831         FLAG_N = NFLAG_8(res);
5832         FLAG_Z = res;
5833         FLAG_V = VFLAG_CLEAR;
5834         FLAG_C = CFLAG_CLEAR;
5835 }
5836
5837
5838 M68KMAKE_OP(move, 8, pi7, d)
5839 {
5840         uint res = MASK_OUT_ABOVE_8(DY);
5841         uint ea = EA_A7_PI_8();
5842
5843         m68ki_write_8(state, ea, res);
5844
5845         FLAG_N = NFLAG_8(res);
5846         FLAG_Z = res;
5847         FLAG_V = VFLAG_CLEAR;
5848         FLAG_C = CFLAG_CLEAR;
5849 }
5850
5851
5852 M68KMAKE_OP(move, 8, pi, d)
5853 {
5854         uint res = MASK_OUT_ABOVE_8(DY);
5855         uint ea = EA_AX_PI_8();
5856
5857         m68ki_write_8(state, ea, res);
5858
5859         FLAG_N = NFLAG_8(res);
5860         FLAG_Z = res;
5861         FLAG_V = VFLAG_CLEAR;
5862         FLAG_C = CFLAG_CLEAR;
5863 }
5864
5865
5866 M68KMAKE_OP(move, 8, pi7, .)
5867 {
5868         uint res = M68KMAKE_GET_OPER_AY_8;
5869         uint ea = EA_A7_PI_8();
5870
5871         m68ki_write_8(state, ea, res);
5872
5873         FLAG_N = NFLAG_8(res);
5874         FLAG_Z = res;
5875         FLAG_V = VFLAG_CLEAR;
5876         FLAG_C = CFLAG_CLEAR;
5877 }
5878
5879
5880 M68KMAKE_OP(move, 8, pi, .)
5881 {
5882         uint res = M68KMAKE_GET_OPER_AY_8;
5883         uint ea = EA_AX_PI_8();
5884
5885         m68ki_write_8(state, ea, res);
5886
5887         FLAG_N = NFLAG_8(res);
5888         FLAG_Z = res;
5889         FLAG_V = VFLAG_CLEAR;
5890         FLAG_C = CFLAG_CLEAR;
5891 }
5892
5893
5894 M68KMAKE_OP(move, 8, pd7, d)
5895 {
5896         uint res = MASK_OUT_ABOVE_8(DY);
5897         uint ea = EA_A7_PD_8();
5898
5899         m68ki_write_8(state, ea, res);
5900
5901         FLAG_N = NFLAG_8(res);
5902         FLAG_Z = res;
5903         FLAG_V = VFLAG_CLEAR;
5904         FLAG_C = CFLAG_CLEAR;
5905 }
5906
5907
5908 M68KMAKE_OP(move, 8, pd, d)
5909 {
5910         uint res = MASK_OUT_ABOVE_8(DY);
5911         uint ea = EA_AX_PD_8();
5912
5913         m68ki_write_8(state, ea, res);
5914
5915         FLAG_N = NFLAG_8(res);
5916         FLAG_Z = res;
5917         FLAG_V = VFLAG_CLEAR;
5918         FLAG_C = CFLAG_CLEAR;
5919 }
5920
5921
5922 M68KMAKE_OP(move, 8, pd7, .)
5923 {
5924         uint res = M68KMAKE_GET_OPER_AY_8;
5925         uint ea = EA_A7_PD_8();
5926
5927         m68ki_write_8(state, ea, res);
5928
5929         FLAG_N = NFLAG_8(res);
5930         FLAG_Z = res;
5931         FLAG_V = VFLAG_CLEAR;
5932         FLAG_C = CFLAG_CLEAR;
5933 }
5934
5935
5936 M68KMAKE_OP(move, 8, pd, .)
5937 {
5938         uint res = M68KMAKE_GET_OPER_AY_8;
5939         uint ea = EA_AX_PD_8();
5940
5941         m68ki_write_8(state, ea, res);
5942
5943         FLAG_N = NFLAG_8(res);
5944         FLAG_Z = res;
5945         FLAG_V = VFLAG_CLEAR;
5946         FLAG_C = CFLAG_CLEAR;
5947 }
5948
5949
5950 M68KMAKE_OP(move, 8, di, d)
5951 {
5952         uint res = MASK_OUT_ABOVE_8(DY);
5953         uint ea = EA_AX_DI_8();
5954
5955         m68ki_write_8(state, ea, res);
5956
5957         FLAG_N = NFLAG_8(res);
5958         FLAG_Z = res;
5959         FLAG_V = VFLAG_CLEAR;
5960         FLAG_C = CFLAG_CLEAR;
5961 }
5962
5963
5964 M68KMAKE_OP(move, 8, di, .)
5965 {
5966         uint res = M68KMAKE_GET_OPER_AY_8;
5967         uint ea = EA_AX_DI_8();
5968
5969         m68ki_write_8(state, ea, res);
5970
5971         FLAG_N = NFLAG_8(res);
5972         FLAG_Z = res;
5973         FLAG_V = VFLAG_CLEAR;
5974         FLAG_C = CFLAG_CLEAR;
5975 }
5976
5977
5978 M68KMAKE_OP(move, 8, ix, d)
5979 {
5980         uint res = MASK_OUT_ABOVE_8(DY);
5981         uint ea = EA_AX_IX_8();
5982
5983         m68ki_write_8(state, ea, res);
5984
5985         FLAG_N = NFLAG_8(res);
5986         FLAG_Z = res;
5987         FLAG_V = VFLAG_CLEAR;
5988         FLAG_C = CFLAG_CLEAR;
5989 }
5990
5991
5992 M68KMAKE_OP(move, 8, ix, .)
5993 {
5994         uint res = M68KMAKE_GET_OPER_AY_8;
5995         uint ea = EA_AX_IX_8();
5996
5997         m68ki_write_8(state, ea, res);
5998
5999         FLAG_N = NFLAG_8(res);
6000         FLAG_Z = res;
6001         FLAG_V = VFLAG_CLEAR;
6002         FLAG_C = CFLAG_CLEAR;
6003 }
6004
6005
6006 M68KMAKE_OP(move, 8, aw, d)
6007 {
6008         uint res = MASK_OUT_ABOVE_8(DY);
6009         uint ea = EA_AW_8();
6010
6011         m68ki_write_8(state, ea, res);
6012
6013         FLAG_N = NFLAG_8(res);
6014         FLAG_Z = res;
6015         FLAG_V = VFLAG_CLEAR;
6016         FLAG_C = CFLAG_CLEAR;
6017 }
6018
6019
6020 M68KMAKE_OP(move, 8, aw, .)
6021 {
6022         uint res = M68KMAKE_GET_OPER_AY_8;
6023         uint ea = EA_AW_8();
6024
6025         m68ki_write_8(state, ea, res);
6026
6027         FLAG_N = NFLAG_8(res);
6028         FLAG_Z = res;
6029         FLAG_V = VFLAG_CLEAR;
6030         FLAG_C = CFLAG_CLEAR;
6031 }
6032
6033
6034 M68KMAKE_OP(move, 8, al, d)
6035 {
6036         uint res = MASK_OUT_ABOVE_8(DY);
6037         uint ea = EA_AL_8();
6038
6039         m68ki_write_8(state, ea, res);
6040
6041         FLAG_N = NFLAG_8(res);
6042         FLAG_Z = res;
6043         FLAG_V = VFLAG_CLEAR;
6044         FLAG_C = CFLAG_CLEAR;
6045 }
6046
6047
6048 M68KMAKE_OP(move, 8, al, .)
6049 {
6050         uint res = M68KMAKE_GET_OPER_AY_8;
6051         uint ea = EA_AL_8();
6052
6053         m68ki_write_8(state, ea, res);
6054
6055         FLAG_N = NFLAG_8(res);
6056         FLAG_Z = res;
6057         FLAG_V = VFLAG_CLEAR;
6058         FLAG_C = CFLAG_CLEAR;
6059 }
6060
6061
6062 M68KMAKE_OP(move, 16, d, d)
6063 {
6064         uint res = MASK_OUT_ABOVE_16(DY);
6065         uint* r_dst = &DX;
6066
6067         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
6068
6069         FLAG_N = NFLAG_16(res);
6070         FLAG_Z = res;
6071         FLAG_V = VFLAG_CLEAR;
6072         FLAG_C = CFLAG_CLEAR;
6073 }
6074
6075
6076 M68KMAKE_OP(move, 16, d, a)
6077 {
6078         uint res = MASK_OUT_ABOVE_16(AY);
6079         uint* r_dst = &DX;
6080
6081         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
6082
6083         FLAG_N = NFLAG_16(res);
6084         FLAG_Z = res;
6085         FLAG_V = VFLAG_CLEAR;
6086         FLAG_C = CFLAG_CLEAR;
6087 }
6088
6089
6090 M68KMAKE_OP(move, 16, d, .)
6091 {
6092         uint res = M68KMAKE_GET_OPER_AY_16;
6093         uint* r_dst = &DX;
6094
6095         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
6096
6097         FLAG_N = NFLAG_16(res);
6098         FLAG_Z = res;
6099         FLAG_V = VFLAG_CLEAR;
6100         FLAG_C = CFLAG_CLEAR;
6101 }
6102
6103
6104 M68KMAKE_OP(move, 16, ai, d)
6105 {
6106         uint res = MASK_OUT_ABOVE_16(DY);
6107         uint ea = EA_AX_AI_16();
6108
6109         m68ki_write_16(state, ea, res);
6110
6111         FLAG_N = NFLAG_16(res);
6112         FLAG_Z = res;
6113         FLAG_V = VFLAG_CLEAR;
6114         FLAG_C = CFLAG_CLEAR;
6115 }
6116
6117
6118 M68KMAKE_OP(move, 16, ai, a)
6119 {
6120         uint res = MASK_OUT_ABOVE_16(AY);
6121         uint ea = EA_AX_AI_16();
6122
6123         m68ki_write_16(state, ea, res);
6124
6125         FLAG_N = NFLAG_16(res);
6126         FLAG_Z = res;
6127         FLAG_V = VFLAG_CLEAR;
6128         FLAG_C = CFLAG_CLEAR;
6129 }
6130
6131
6132 M68KMAKE_OP(move, 16, ai, .)
6133 {
6134         uint res = M68KMAKE_GET_OPER_AY_16;
6135         uint ea = EA_AX_AI_16();
6136
6137         m68ki_write_16(state, ea, res);
6138
6139         FLAG_N = NFLAG_16(res);
6140         FLAG_Z = res;
6141         FLAG_V = VFLAG_CLEAR;
6142         FLAG_C = CFLAG_CLEAR;
6143 }
6144
6145
6146 M68KMAKE_OP(move, 16, pi, d)
6147 {
6148         uint res = MASK_OUT_ABOVE_16(DY);
6149         uint ea = EA_AX_PI_16();
6150
6151         m68ki_write_16(state, ea, res);
6152
6153         FLAG_N = NFLAG_16(res);
6154         FLAG_Z = res;
6155         FLAG_V = VFLAG_CLEAR;
6156         FLAG_C = CFLAG_CLEAR;
6157 }
6158
6159
6160 M68KMAKE_OP(move, 16, pi, a)
6161 {
6162         uint res = MASK_OUT_ABOVE_16(AY);
6163         uint ea = EA_AX_PI_16();
6164
6165         m68ki_write_16(state, ea, res);
6166
6167         FLAG_N = NFLAG_16(res);
6168         FLAG_Z = res;
6169         FLAG_V = VFLAG_CLEAR;
6170         FLAG_C = CFLAG_CLEAR;
6171 }
6172
6173
6174 M68KMAKE_OP(move, 16, pi, .)
6175 {
6176         uint res = M68KMAKE_GET_OPER_AY_16;
6177         uint ea = EA_AX_PI_16();
6178
6179         m68ki_write_16(state, ea, res);
6180
6181         FLAG_N = NFLAG_16(res);
6182         FLAG_Z = res;
6183         FLAG_V = VFLAG_CLEAR;
6184         FLAG_C = CFLAG_CLEAR;
6185 }
6186
6187
6188 M68KMAKE_OP(move, 16, pd, d)
6189 {
6190         uint res = MASK_OUT_ABOVE_16(DY);
6191         uint ea = EA_AX_PD_16();
6192
6193         m68ki_write_16(state, ea, res);
6194
6195         FLAG_N = NFLAG_16(res);
6196         FLAG_Z = res;
6197         FLAG_V = VFLAG_CLEAR;
6198         FLAG_C = CFLAG_CLEAR;
6199 }
6200
6201
6202 M68KMAKE_OP(move, 16, pd, a)
6203 {
6204         uint res = MASK_OUT_ABOVE_16(AY);
6205         uint ea = EA_AX_PD_16();
6206
6207         m68ki_write_16(state, ea, res);
6208
6209         FLAG_N = NFLAG_16(res);
6210         FLAG_Z = res;
6211         FLAG_V = VFLAG_CLEAR;
6212         FLAG_C = CFLAG_CLEAR;
6213 }
6214
6215
6216 M68KMAKE_OP(move, 16, pd, .)
6217 {
6218         uint res = M68KMAKE_GET_OPER_AY_16;
6219         uint ea = EA_AX_PD_16();
6220
6221         m68ki_write_16(state, ea, res);
6222
6223         FLAG_N = NFLAG_16(res);
6224         FLAG_Z = res;
6225         FLAG_V = VFLAG_CLEAR;
6226         FLAG_C = CFLAG_CLEAR;
6227 }
6228
6229
6230 M68KMAKE_OP(move, 16, di, d)
6231 {
6232         uint res = MASK_OUT_ABOVE_16(DY);
6233         uint ea = EA_AX_DI_16();
6234
6235         m68ki_write_16(state, ea, res);
6236
6237         FLAG_N = NFLAG_16(res);
6238         FLAG_Z = res;
6239         FLAG_V = VFLAG_CLEAR;
6240         FLAG_C = CFLAG_CLEAR;
6241 }
6242
6243
6244 M68KMAKE_OP(move, 16, di, a)
6245 {
6246         uint res = MASK_OUT_ABOVE_16(AY);
6247         uint ea = EA_AX_DI_16();
6248
6249         m68ki_write_16(state, ea, res);
6250
6251         FLAG_N = NFLAG_16(res);
6252         FLAG_Z = res;
6253         FLAG_V = VFLAG_CLEAR;
6254         FLAG_C = CFLAG_CLEAR;
6255 }
6256
6257
6258 M68KMAKE_OP(move, 16, di, .)
6259 {
6260         uint res = M68KMAKE_GET_OPER_AY_16;
6261         uint ea = EA_AX_DI_16();
6262
6263         m68ki_write_16(state, ea, res);
6264
6265         FLAG_N = NFLAG_16(res);
6266         FLAG_Z = res;
6267         FLAG_V = VFLAG_CLEAR;
6268         FLAG_C = CFLAG_CLEAR;
6269 }
6270
6271
6272 M68KMAKE_OP(move, 16, ix, d)
6273 {
6274         uint res = MASK_OUT_ABOVE_16(DY);
6275         uint ea = EA_AX_IX_16();
6276
6277         m68ki_write_16(state, ea, res);
6278
6279         FLAG_N = NFLAG_16(res);
6280         FLAG_Z = res;
6281         FLAG_V = VFLAG_CLEAR;
6282         FLAG_C = CFLAG_CLEAR;
6283 }
6284
6285
6286 M68KMAKE_OP(move, 16, ix, a)
6287 {
6288         uint res = MASK_OUT_ABOVE_16(AY);
6289         uint ea = EA_AX_IX_16();
6290
6291         m68ki_write_16(state, ea, res);
6292
6293         FLAG_N = NFLAG_16(res);
6294         FLAG_Z = res;
6295         FLAG_V = VFLAG_CLEAR;
6296         FLAG_C = CFLAG_CLEAR;
6297 }
6298
6299
6300 M68KMAKE_OP(move, 16, ix, .)
6301 {
6302         uint res = M68KMAKE_GET_OPER_AY_16;
6303         uint ea = EA_AX_IX_16();
6304
6305         m68ki_write_16(state, ea, res);
6306
6307         FLAG_N = NFLAG_16(res);
6308         FLAG_Z = res;
6309         FLAG_V = VFLAG_CLEAR;
6310         FLAG_C = CFLAG_CLEAR;
6311 }
6312
6313
6314 M68KMAKE_OP(move, 16, aw, d)
6315 {
6316         uint res = MASK_OUT_ABOVE_16(DY);
6317         uint ea = EA_AW_16();
6318
6319         m68ki_write_16(state, ea, res);
6320
6321         FLAG_N = NFLAG_16(res);
6322         FLAG_Z = res;
6323         FLAG_V = VFLAG_CLEAR;
6324         FLAG_C = CFLAG_CLEAR;
6325 }
6326
6327
6328 M68KMAKE_OP(move, 16, aw, a)
6329 {
6330         uint res = MASK_OUT_ABOVE_16(AY);
6331         uint ea = EA_AW_16();
6332
6333         m68ki_write_16(state, ea, res);
6334
6335         FLAG_N = NFLAG_16(res);
6336         FLAG_Z = res;
6337         FLAG_V = VFLAG_CLEAR;
6338         FLAG_C = CFLAG_CLEAR;
6339 }
6340
6341
6342 M68KMAKE_OP(move, 16, aw, .)
6343 {
6344         uint res = M68KMAKE_GET_OPER_AY_16;
6345         uint ea = EA_AW_16();
6346
6347         m68ki_write_16(state, ea, res);
6348
6349         FLAG_N = NFLAG_16(res);
6350         FLAG_Z = res;
6351         FLAG_V = VFLAG_CLEAR;
6352         FLAG_C = CFLAG_CLEAR;
6353 }
6354
6355
6356 M68KMAKE_OP(move, 16, al, d)
6357 {
6358         uint res = MASK_OUT_ABOVE_16(DY);
6359         uint ea = EA_AL_16();
6360
6361         m68ki_write_16(state, ea, res);
6362
6363         FLAG_N = NFLAG_16(res);
6364         FLAG_Z = res;
6365         FLAG_V = VFLAG_CLEAR;
6366         FLAG_C = CFLAG_CLEAR;
6367 }
6368
6369
6370 M68KMAKE_OP(move, 16, al, a)
6371 {
6372         uint res = MASK_OUT_ABOVE_16(AY);
6373         uint ea = EA_AL_16();
6374
6375         m68ki_write_16(state, ea, res);
6376
6377         FLAG_N = NFLAG_16(res);
6378         FLAG_Z = res;
6379         FLAG_V = VFLAG_CLEAR;
6380         FLAG_C = CFLAG_CLEAR;
6381 }
6382
6383
6384 M68KMAKE_OP(move, 16, al, .)
6385 {
6386         uint res = M68KMAKE_GET_OPER_AY_16;
6387         uint ea = EA_AL_16();
6388
6389         m68ki_write_16(state, ea, res);
6390
6391         FLAG_N = NFLAG_16(res);
6392         FLAG_Z = res;
6393         FLAG_V = VFLAG_CLEAR;
6394         FLAG_C = CFLAG_CLEAR;
6395 }
6396
6397
6398 M68KMAKE_OP(move, 32, d, d)
6399 {
6400         uint res = DY;
6401         uint* r_dst = &DX;
6402
6403         *r_dst = res;
6404
6405         FLAG_N = NFLAG_32(res);
6406         FLAG_Z = res;
6407         FLAG_V = VFLAG_CLEAR;
6408         FLAG_C = CFLAG_CLEAR;
6409 }
6410
6411
6412 M68KMAKE_OP(move, 32, d, a)
6413 {
6414         uint res = AY;
6415         uint* r_dst = &DX;
6416
6417         *r_dst = res;
6418
6419         FLAG_N = NFLAG_32(res);
6420         FLAG_Z = res;
6421         FLAG_V = VFLAG_CLEAR;
6422         FLAG_C = CFLAG_CLEAR;
6423 }
6424
6425
6426 M68KMAKE_OP(move, 32, d, .)
6427 {
6428         uint res = M68KMAKE_GET_OPER_AY_32;
6429         uint* r_dst = &DX;
6430
6431         *r_dst = res;
6432
6433         FLAG_N = NFLAG_32(res);
6434         FLAG_Z = res;
6435         FLAG_V = VFLAG_CLEAR;
6436         FLAG_C = CFLAG_CLEAR;
6437 }
6438
6439
6440 M68KMAKE_OP(move, 32, ai, d)
6441 {
6442         uint res = DY;
6443         uint ea = EA_AX_AI_32();
6444
6445         m68ki_write_32(state, ea, res);
6446
6447         FLAG_N = NFLAG_32(res);
6448         FLAG_Z = res;
6449         FLAG_V = VFLAG_CLEAR;
6450         FLAG_C = CFLAG_CLEAR;
6451 }
6452
6453
6454 M68KMAKE_OP(move, 32, ai, a)
6455 {
6456         uint res = AY;
6457         uint ea = EA_AX_AI_32();
6458
6459         m68ki_write_32(state, ea, res);
6460
6461         FLAG_N = NFLAG_32(res);
6462         FLAG_Z = res;
6463         FLAG_V = VFLAG_CLEAR;
6464         FLAG_C = CFLAG_CLEAR;
6465 }
6466
6467
6468 M68KMAKE_OP(move, 32, ai, .)
6469 {
6470         uint res = M68KMAKE_GET_OPER_AY_32;
6471         uint ea = EA_AX_AI_32();
6472
6473         m68ki_write_32(state, ea, res);
6474
6475         FLAG_N = NFLAG_32(res);
6476         FLAG_Z = res;
6477         FLAG_V = VFLAG_CLEAR;
6478         FLAG_C = CFLAG_CLEAR;
6479 }
6480
6481
6482 M68KMAKE_OP(move, 32, pi, d)
6483 {
6484         uint res = DY;
6485         uint ea = EA_AX_PI_32();
6486
6487         m68ki_write_32(state, ea, res);
6488
6489         FLAG_N = NFLAG_32(res);
6490         FLAG_Z = res;
6491         FLAG_V = VFLAG_CLEAR;
6492         FLAG_C = CFLAG_CLEAR;
6493 }
6494
6495
6496 M68KMAKE_OP(move, 32, pi, a)
6497 {
6498         uint res = AY;
6499         uint ea = EA_AX_PI_32();
6500
6501         m68ki_write_32(state, ea, res);
6502
6503         FLAG_N = NFLAG_32(res);
6504         FLAG_Z = res;
6505         FLAG_V = VFLAG_CLEAR;
6506         FLAG_C = CFLAG_CLEAR;
6507 }
6508
6509
6510 M68KMAKE_OP(move, 32, pi, .)
6511 {
6512         uint res = M68KMAKE_GET_OPER_AY_32;
6513         uint ea = EA_AX_PI_32();
6514
6515         m68ki_write_32(state, ea, res);
6516
6517         FLAG_N = NFLAG_32(res);
6518         FLAG_Z = res;
6519         FLAG_V = VFLAG_CLEAR;
6520         FLAG_C = CFLAG_CLEAR;
6521 }
6522
6523
6524 M68KMAKE_OP(move, 32, pd, d)
6525 {
6526         uint res = DY;
6527         uint ea = EA_AX_PD_32();
6528
6529         m68ki_write_16(state, ea+2, res & 0xFFFF );
6530         m68ki_write_16(state, ea, (res >> 16) & 0xFFFF );
6531
6532         FLAG_N = NFLAG_32(res);
6533         FLAG_Z = res;
6534         FLAG_V = VFLAG_CLEAR;
6535         FLAG_C = CFLAG_CLEAR;
6536 }
6537
6538
6539 M68KMAKE_OP(move, 32, pd, a)
6540 {
6541         uint res = AY;
6542         uint ea = EA_AX_PD_32();
6543
6544         m68ki_write_16(state, ea+2, res & 0xFFFF );
6545         m68ki_write_16(state, ea, (res >> 16) & 0xFFFF );
6546
6547         FLAG_N = NFLAG_32(res);
6548         FLAG_Z = res;
6549         FLAG_V = VFLAG_CLEAR;
6550         FLAG_C = CFLAG_CLEAR;
6551 }
6552
6553
6554 M68KMAKE_OP(move, 32, pd, .)
6555 {
6556         uint res = M68KMAKE_GET_OPER_AY_32;
6557         uint ea = EA_AX_PD_32();
6558
6559         m68ki_write_16(state, ea+2, res & 0xFFFF );
6560         m68ki_write_16(state, ea, (res >> 16) & 0xFFFF );
6561
6562         FLAG_N = NFLAG_32(res);
6563         FLAG_Z = res;
6564         FLAG_V = VFLAG_CLEAR;
6565         FLAG_C = CFLAG_CLEAR;
6566 }
6567
6568
6569 M68KMAKE_OP(move, 32, di, d)
6570 {
6571         uint res = DY;
6572         uint ea = EA_AX_DI_32();
6573
6574         m68ki_write_32(state, ea, res);
6575
6576         FLAG_N = NFLAG_32(res);
6577         FLAG_Z = res;
6578         FLAG_V = VFLAG_CLEAR;
6579         FLAG_C = CFLAG_CLEAR;
6580 }
6581
6582
6583 M68KMAKE_OP(move, 32, di, a)
6584 {
6585         uint res = AY;
6586         uint ea = EA_AX_DI_32();
6587
6588         m68ki_write_32(state, ea, res);
6589
6590         FLAG_N = NFLAG_32(res);
6591         FLAG_Z = res;
6592         FLAG_V = VFLAG_CLEAR;
6593         FLAG_C = CFLAG_CLEAR;
6594 }
6595
6596
6597 M68KMAKE_OP(move, 32, di, .)
6598 {
6599         uint res = M68KMAKE_GET_OPER_AY_32;
6600         uint ea = EA_AX_DI_32();
6601
6602         m68ki_write_32(state, ea, res);
6603
6604         FLAG_N = NFLAG_32(res);
6605         FLAG_Z = res;
6606         FLAG_V = VFLAG_CLEAR;
6607         FLAG_C = CFLAG_CLEAR;
6608 }
6609
6610
6611 M68KMAKE_OP(move, 32, ix, d)
6612 {
6613         uint res = DY;
6614         uint ea = EA_AX_IX_32();
6615
6616         m68ki_write_32(state, ea, res);
6617
6618         FLAG_N = NFLAG_32(res);
6619         FLAG_Z = res;
6620         FLAG_V = VFLAG_CLEAR;
6621         FLAG_C = CFLAG_CLEAR;
6622 }
6623
6624
6625 M68KMAKE_OP(move, 32, ix, a)
6626 {
6627         uint res = AY;
6628         uint ea = EA_AX_IX_32();
6629
6630         m68ki_write_32(state, ea, res);
6631
6632         FLAG_N = NFLAG_32(res);
6633         FLAG_Z = res;
6634         FLAG_V = VFLAG_CLEAR;
6635         FLAG_C = CFLAG_CLEAR;
6636 }
6637
6638
6639 M68KMAKE_OP(move, 32, ix, .)
6640 {
6641         uint res = M68KMAKE_GET_OPER_AY_32;
6642         uint ea = EA_AX_IX_32();
6643
6644         m68ki_write_32(state, ea, res);
6645
6646         FLAG_N = NFLAG_32(res);
6647         FLAG_Z = res;
6648         FLAG_V = VFLAG_CLEAR;
6649         FLAG_C = CFLAG_CLEAR;
6650 }
6651
6652
6653 M68KMAKE_OP(move, 32, aw, d)
6654 {
6655         uint res = DY;
6656         uint ea = EA_AW_32();
6657
6658         m68ki_write_32(state, ea, res);
6659
6660         FLAG_N = NFLAG_32(res);
6661         FLAG_Z = res;
6662         FLAG_V = VFLAG_CLEAR;
6663         FLAG_C = CFLAG_CLEAR;
6664 }
6665
6666
6667 M68KMAKE_OP(move, 32, aw, a)
6668 {
6669         uint res = AY;
6670         uint ea = EA_AW_32();
6671
6672         m68ki_write_32(state, ea, res);
6673
6674         FLAG_N = NFLAG_32(res);
6675         FLAG_Z = res;
6676         FLAG_V = VFLAG_CLEAR;
6677         FLAG_C = CFLAG_CLEAR;
6678 }
6679
6680
6681 M68KMAKE_OP(move, 32, aw, .)
6682 {
6683         uint res = M68KMAKE_GET_OPER_AY_32;
6684         uint ea = EA_AW_32();
6685
6686         m68ki_write_32(state, ea, res);
6687
6688         FLAG_N = NFLAG_32(res);
6689         FLAG_Z = res;
6690         FLAG_V = VFLAG_CLEAR;
6691         FLAG_C = CFLAG_CLEAR;
6692 }
6693
6694
6695 M68KMAKE_OP(move, 32, al, d)
6696 {
6697         uint res = DY;
6698         uint ea = EA_AL_32();
6699
6700         m68ki_write_32(state, ea, res);
6701
6702         FLAG_N = NFLAG_32(res);
6703         FLAG_Z = res;
6704         FLAG_V = VFLAG_CLEAR;
6705         FLAG_C = CFLAG_CLEAR;
6706 }
6707
6708
6709 M68KMAKE_OP(move, 32, al, a)
6710 {
6711         uint res = AY;
6712         uint ea = EA_AL_32();
6713
6714         m68ki_write_32(state, ea, res);
6715
6716         FLAG_N = NFLAG_32(res);
6717         FLAG_Z = res;
6718         FLAG_V = VFLAG_CLEAR;
6719         FLAG_C = CFLAG_CLEAR;
6720 }
6721
6722
6723 M68KMAKE_OP(move, 32, al, .)
6724 {
6725         uint res = M68KMAKE_GET_OPER_AY_32;
6726         uint ea = EA_AL_32();
6727
6728         m68ki_write_32(state, ea, res);
6729
6730         FLAG_N = NFLAG_32(res);
6731         FLAG_Z = res;
6732         FLAG_V = VFLAG_CLEAR;
6733         FLAG_C = CFLAG_CLEAR;
6734 }
6735
6736
6737 M68KMAKE_OP(movea, 16, ., d)
6738 {
6739         AX = MAKE_INT_16(DY);
6740 }
6741
6742
6743 M68KMAKE_OP(movea, 16, ., a)
6744 {
6745         AX = MAKE_INT_16(AY);
6746 }
6747
6748
6749 M68KMAKE_OP(movea, 16, ., .)
6750 {
6751         AX = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
6752 }
6753
6754
6755 M68KMAKE_OP(movea, 32, ., d)
6756 {
6757         AX = DY;
6758 }
6759
6760
6761 M68KMAKE_OP(movea, 32, ., a)
6762 {
6763         AX = AY;
6764 }
6765
6766
6767 M68KMAKE_OP(movea, 32, ., .)
6768 {
6769         AX = M68KMAKE_GET_OPER_AY_32;
6770 }
6771
6772
6773 M68KMAKE_OP(move, 16, frc, d)
6774 {
6775         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
6776         {
6777                 DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr(state);
6778                 return;
6779         }
6780         m68ki_exception_illegal(state);
6781 }
6782
6783
6784 M68KMAKE_OP(move, 16, frc, .)
6785 {
6786         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
6787         {
6788                 m68ki_write_16(state, M68KMAKE_GET_EA_AY_16, m68ki_get_ccr(state));
6789                 return;
6790         }
6791         m68ki_exception_illegal(state);
6792 }
6793
6794
6795 M68KMAKE_OP(move, 16, toc, d)
6796 {
6797         m68ki_set_ccr(state, DY);
6798 }
6799
6800
6801 M68KMAKE_OP(move, 16, toc, .)
6802 {
6803         m68ki_set_ccr(state, M68KMAKE_GET_OPER_AY_16);
6804 }
6805
6806
6807 M68KMAKE_OP(move, 16, frs, d)
6808 {
6809         if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
6810         {
6811                 DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr();
6812                 return;
6813         }
6814         m68ki_exception_privilege_violation(state);
6815 }
6816
6817
6818 M68KMAKE_OP(move, 16, frs, .)
6819 {
6820         if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
6821         {
6822                 uint ea = M68KMAKE_GET_EA_AY_16;
6823                 m68ki_write_16(state, ea, m68ki_get_sr());
6824                 return;
6825         }
6826         m68ki_exception_privilege_violation(state);
6827 }
6828
6829
6830 M68KMAKE_OP(move, 16, tos, d)
6831 {
6832         if(FLAG_S)
6833         {
6834                 m68ki_set_sr(state, DY);
6835                 return;
6836         }
6837         m68ki_exception_privilege_violation(state);
6838 }
6839
6840
6841 M68KMAKE_OP(move, 16, tos, .)
6842 {
6843         if(FLAG_S)
6844         {
6845                 uint new_sr = M68KMAKE_GET_OPER_AY_16;
6846                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
6847                 m68ki_set_sr(state, new_sr);
6848                 return;
6849         }
6850         m68ki_exception_privilege_violation(state);
6851 }
6852
6853
6854 M68KMAKE_OP(move, 32, fru, .)
6855 {
6856         if(FLAG_S)
6857         {
6858                 AY = REG_USP;
6859                 return;
6860         }
6861         m68ki_exception_privilege_violation(state);
6862 }
6863
6864
6865 M68KMAKE_OP(move, 32, tou, .)
6866 {
6867         if(FLAG_S)
6868         {
6869                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
6870                 REG_USP = AY;
6871                 return;
6872         }
6873         m68ki_exception_privilege_violation(state);
6874 }
6875
6876
6877 M68KMAKE_OP(movec, 32, cr, .)
6878 {
6879         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
6880         {
6881                 if(FLAG_S)
6882                 {
6883                         uint word2 = OPER_I_16(state);
6884
6885                         m68ki_trace_t0();                  /* auto-disable (see m68kcpu.h) */
6886                         switch (word2 & 0xfff)
6887                         {
6888                         case 0x000:                        /* SFC */
6889                                 REG_DA[(word2 >> 12) & 15] = REG_SFC;
6890                                 return;
6891                         case 0x001:                        /* DFC */
6892                                 REG_DA[(word2 >> 12) & 15] = REG_DFC;
6893                                 return;
6894                         case 0x002:                        /* CACR */
6895                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
6896                                 {
6897                                         REG_DA[(word2 >> 12) & 15] = REG_CACR;
6898                                         return;
6899                                 }
6900                                 return;
6901                         case 0x800:                        /* USP */
6902                                 REG_DA[(word2 >> 12) & 15] = REG_USP;
6903                                 return;
6904                         case 0x801:                        /* VBR */
6905                                 REG_DA[(word2 >> 12) & 15] = REG_VBR;
6906                                 return;
6907                         case 0x802:                        /* CAAR */
6908                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
6909                                 {
6910                                         REG_DA[(word2 >> 12) & 15] = REG_CAAR;
6911                                         return;
6912                                 }
6913                                 m68ki_exception_illegal(state);
6914                                 break;
6915                         case 0x803:                        /* MSP */
6916                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
6917                                 {
6918                                         REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP;
6919                                         return;
6920                                 }
6921                                 m68ki_exception_illegal(state);
6922                                 return;
6923                         case 0x804:                        /* ISP */
6924                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
6925                                 {
6926                                         REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP;
6927                                         return;
6928                                 }
6929                                 m68ki_exception_illegal(state);
6930                                 return;
6931                         case 0x003:                             /* TC */
6932                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6933                                 {
6934                                         REG_DA[(word2 >> 12) & 15] = state->mmu_tc;
6935                                         return;
6936                                 }
6937                                 m68ki_exception_illegal(state);
6938                                 return;
6939                         case 0x004:                             /* ITT0 */
6940                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6941                                 {
6942                                         REG_DA[(word2 >> 12) & 15] = state->mmu_itt0;
6943                                         return;
6944                                 }
6945                                 m68ki_exception_illegal(state);
6946                                 return;
6947                         case 0x005:                             /* ITT1 */
6948                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6949                                 {
6950                                         REG_DA[(word2 >> 12) & 15] = state->mmu_itt1;
6951                                         return;
6952                                 }
6953                                 m68ki_exception_illegal(state);
6954                                 return;
6955                         case 0x006:                             /* DTT0 */
6956                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6957                                 {
6958                                         REG_DA[(word2 >> 12) & 15] = state->mmu_dtt0;
6959                                         return;
6960                                 }
6961                                 m68ki_exception_illegal(state);
6962                                 return;
6963                         case 0x007:                             /* DTT1 */
6964                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6965                                 {
6966                                         REG_DA[(word2 >> 12) & 15] = state->mmu_dtt1;
6967                                         return;
6968                                 }
6969                                 m68ki_exception_illegal(state);
6970                                 return;
6971                         case 0x805:                             /* MMUSR */
6972                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6973                                 {
6974                                         REG_DA[(word2 >> 12) & 15] = state->mmu_sr_040;
6975                                         return;
6976                                 }
6977                                 m68ki_exception_illegal(state);
6978                                 return;
6979                         case 0x806:                             /* URP */
6980                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6981                                 {
6982                                         REG_DA[(word2 >> 12) & 15] = state->mmu_urp_aptr;
6983                                         return;
6984                                 }
6985                                 m68ki_exception_illegal(state);
6986                                 return;
6987                         case 0x807:                             /* SRP */
6988                                 if(CPU_TYPE_IS_040_PLUS(CPU_TYPE))
6989                                 {
6990                                         REG_DA[(word2 >> 12) & 15] = state->mmu_srp_aptr;
6991                                         return;
6992                                 }
6993                                 m68ki_exception_illegal(state);
6994                                 return;
6995                         default:
6996                                 m68ki_exception_illegal(state);
6997                                 return;
6998                         }
6999                 }
7000                 m68ki_exception_privilege_violation(state);
7001                 return;
7002         }
7003         m68ki_exception_illegal(state);
7004 }
7005
7006
7007 M68KMAKE_OP(movec, 32, rc, .)
7008 {
7009         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
7010         {
7011                 if(FLAG_S)
7012                 {
7013                         uint word2 = OPER_I_16(state);
7014
7015                         m68ki_trace_t0();                  /* auto-disable (see m68kcpu.h) */
7016                         switch (word2 & 0xfff)
7017                         {
7018                         case 0x000:                        /* SFC */
7019                                 REG_SFC = REG_DA[(word2 >> 12) & 15] & 7;
7020                                 return;
7021                         case 0x001:                        /* DFC */
7022                                 REG_DFC = REG_DA[(word2 >> 12) & 15] & 7;
7023                                 return;
7024                         case 0x002:                        /* CACR */
7025                                 /* Only EC020 and later have CACR */
7026                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7027                                 {
7028                                         /* 68030 can write all bits except 5-7, 040 can write all */
7029                                         if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7030                                         {
7031                                                 REG_CACR = REG_DA[(word2 >> 12) & 15] & 0xfffffffe;  // Old I cache bit not working on 040
7032                                         }
7033                                         else if (CPU_TYPE_IS_030_PLUS(CPU_TYPE))
7034                                         {
7035                                                 REG_CACR = REG_DA[(word2 >> 12) & 15] & 0xff1f;
7036                                         }
7037                                         else
7038                                         {
7039                                                 REG_CACR = REG_DA[(word2 >> 12) & 15] & 0x0f;
7040                                         }
7041
7042                                         if (REG_CACR & (M68K_CACR_CI | M68K_CACR_CEI)) {
7043                                                 m68ki_ic_clear(state);
7044                                         }
7045                                         return;
7046                                 }
7047                                 m68ki_exception_illegal(state);
7048                                 return;
7049                         case 0x800:                        /* USP */
7050                                 REG_USP = REG_DA[(word2 >> 12) & 15];
7051                                 return;
7052                         case 0x801:                        /* VBR */
7053                                 REG_VBR = REG_DA[(word2 >> 12) & 15];
7054                                 return;
7055                         case 0x802:                        /* CAAR */
7056                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7057                                 {
7058                                         REG_CAAR = REG_DA[(word2 >> 12) & 15];
7059                                         return;
7060                                 }
7061                                 m68ki_exception_illegal(state);
7062                                 return;
7063                         case 0x803:                        /* MSP */
7064                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7065                                 {
7066                                         /* we are in supervisor mode so just check for M flag */
7067                                         if(!FLAG_M)
7068                                         {
7069                                                 REG_MSP = REG_DA[(word2 >> 12) & 15];
7070                                                 return;
7071                                         }
7072                                         REG_SP = REG_DA[(word2 >> 12) & 15];
7073                                         return;
7074                                 }
7075                                 m68ki_exception_illegal(state);
7076                                 return;
7077                         case 0x804:                        /* ISP */
7078                                 if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7079                                 {
7080                                         if(!FLAG_M)
7081                                         {
7082                                                 REG_SP = REG_DA[(word2 >> 12) & 15];
7083                                                 return;
7084                                         }
7085                                         REG_ISP = REG_DA[(word2 >> 12) & 15];
7086                                         return;
7087                                 }
7088                                 m68ki_exception_illegal(state);
7089                                 return;
7090                         case 0x003:                     /* TC */
7091                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7092                                 {
7093                                         state->mmu_tc = REG_DA[(word2 >> 12) & 15];
7094
7095                                         if (state->mmu_tc & 0x8000)
7096                                         {
7097                                                 state->pmmu_enabled = 1;
7098                                         }
7099                                         else
7100                                         {
7101                                                 state->pmmu_enabled = 0;
7102                                         }
7103                                         return;
7104                                 }
7105                                 m68ki_exception_illegal(state);
7106                                 return;
7107                         case 0x004:                     /* ITT0 */
7108                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7109                                 {
7110                                         state->mmu_itt0 = REG_DA[(word2 >> 12) & 15];
7111                                         return;
7112                                 }
7113                                 m68ki_exception_illegal(state);
7114                                 return;
7115                         case 0x005:                     /* ITT1 */
7116                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7117                                 {
7118                                         state->mmu_itt1 = REG_DA[(word2 >> 12) & 15];
7119                                         return;
7120                                 }
7121                                 m68ki_exception_illegal(state);
7122                                 return;
7123                         case 0x006:                     /* DTT0 */
7124                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7125                                 {
7126                                         state->mmu_dtt0 = REG_DA[(word2 >> 12) & 15];
7127                                         return;
7128                                 }
7129                                 m68ki_exception_illegal(state);
7130                                 return;
7131                         case 0x007:                     /* DTT1 */
7132                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7133                                 {
7134                                         state->mmu_dtt1 = REG_DA[(word2 >> 12) & 15];
7135                                         return;
7136                                 }
7137                                 m68ki_exception_illegal(state);
7138                                 return;
7139                         case 0x805:                     /* MMUSR */
7140                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7141                                 {
7142                                         state->mmu_sr_040 = REG_DA[(word2 >> 12) & 15];
7143                                         return;
7144                                 }
7145                                 m68ki_exception_illegal(state);
7146                                 return;
7147                         case 0x806:                     /* URP */
7148                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7149                                 {
7150                                         state->mmu_urp_aptr = REG_DA[(word2 >> 12) & 15];
7151                                         return;
7152                                 }
7153                                 m68ki_exception_illegal(state);
7154                                 return;
7155                         case 0x807:                     /* SRP */
7156                                 if (CPU_TYPE_IS_040_PLUS(CPU_TYPE))
7157                                 {
7158                                         state->mmu_srp_aptr = REG_DA[(word2 >> 12) & 15];
7159                                         return;
7160                                 }
7161                                 m68ki_exception_illegal(state);
7162                                 return;
7163                         default:
7164                                 m68ki_exception_illegal(state);
7165                                 return;
7166                         }
7167                 }
7168                 m68ki_exception_privilege_violation(state);
7169                 return;
7170         }
7171         m68ki_exception_illegal(state);
7172 }
7173
7174
7175 M68KMAKE_OP(movem, 16, re, pd)
7176 {
7177         uint i = 0;
7178         uint register_list = OPER_I_16(state);
7179         uint ea = AY;
7180         uint count = 0;
7181
7182         for(; i < 16; i++)
7183                 if(register_list & (1 << i))
7184                 {
7185                         ea -= 2;
7186                         m68ki_write_16(state, ea, MASK_OUT_ABOVE_16(REG_DA[15-i]));
7187                         count++;
7188                 }
7189         AY = ea;
7190
7191         USE_CYCLES(count<<CYC_MOVEM_W);
7192 }
7193
7194
7195 M68KMAKE_OP(movem, 16, re, .)
7196 {
7197         uint i = 0;
7198         uint register_list = OPER_I_16(state);
7199         uint ea = M68KMAKE_GET_EA_AY_16;
7200         uint count = 0;
7201
7202         for(; i < 16; i++)
7203                 if(register_list & (1 << i))
7204                 {
7205                         m68ki_write_16(state, ea, MASK_OUT_ABOVE_16(REG_DA[i]));
7206                         ea += 2;
7207                         count++;
7208                 }
7209
7210         USE_CYCLES(count<<CYC_MOVEM_W);
7211 }
7212
7213
7214 M68KMAKE_OP(movem, 32, re, pd)
7215 {
7216         uint i = 0;
7217         uint register_list = OPER_I_16(state);
7218         uint ea = AY;
7219         uint count = 0;
7220
7221         for(; i < 16; i++)
7222                 if(register_list & (1 << i))
7223                 {
7224                         ea -= 4;
7225                         m68ki_write_16(state, ea+2, REG_DA[15-i] & 0xFFFF );
7226                         m68ki_write_16(state, ea, (REG_DA[15-i] >> 16) & 0xFFFF );
7227                         count++;
7228                 }
7229         AY = ea;
7230
7231         USE_CYCLES(count<<CYC_MOVEM_L);
7232 }
7233
7234
7235 M68KMAKE_OP(movem, 32, re, .)
7236 {
7237         uint i = 0;
7238         uint register_list = OPER_I_16(state);
7239         uint ea = M68KMAKE_GET_EA_AY_32;
7240         uint count = 0;
7241
7242         for(; i < 16; i++)
7243                 if(register_list & (1 << i))
7244                 {
7245                         m68ki_write_32(state, ea, REG_DA[i]);
7246                         ea += 4;
7247                         count++;
7248                 }
7249
7250         USE_CYCLES(count<<CYC_MOVEM_L);
7251 }
7252
7253
7254 M68KMAKE_OP(movem, 16, er, pi)
7255 {
7256         uint i = 0;
7257         uint register_list = OPER_I_16(state);
7258         uint ea = AY;
7259         uint count = 0;
7260
7261         for(; i < 16; i++)
7262                 if(register_list & (1 << i))
7263                 {
7264                         REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(state, ea)));
7265                         ea += 2;
7266                         count++;
7267                 }
7268         AY = ea;
7269
7270         USE_CYCLES(count<<CYC_MOVEM_W);
7271 }
7272
7273
7274 M68KMAKE_OP(movem, 16, er, pcdi)
7275 {
7276         uint i = 0;
7277         uint register_list = OPER_I_16(state);
7278         uint ea = EA_PCDI_16();
7279         uint count = 0;
7280
7281         for(; i < 16; i++)
7282                 if(register_list & (1 << i))
7283                 {
7284                         REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(state, ea)));
7285                         ea += 2;
7286                         count++;
7287                 }
7288
7289         USE_CYCLES(count<<CYC_MOVEM_W);
7290 }
7291
7292
7293 M68KMAKE_OP(movem, 16, er, pcix)
7294 {
7295         uint i = 0;
7296         uint register_list = OPER_I_16(state);
7297         uint ea = EA_PCIX_16();
7298         uint count = 0;
7299
7300         for(; i < 16; i++)
7301                 if(register_list & (1 << i))
7302                 {
7303                         REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(state, ea)));
7304                         ea += 2;
7305                         count++;
7306                 }
7307
7308         USE_CYCLES(count<<CYC_MOVEM_W);
7309 }
7310
7311
7312 M68KMAKE_OP(movem, 16, er, .)
7313 {
7314         uint i = 0;
7315         uint register_list = OPER_I_16(state);
7316         uint ea = M68KMAKE_GET_EA_AY_16;
7317         uint count = 0;
7318
7319         for(; i < 16; i++)
7320                 if(register_list & (1 << i))
7321                 {
7322                         REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(state, ea)));
7323                         ea += 2;
7324                         count++;
7325                 }
7326
7327         USE_CYCLES(count<<CYC_MOVEM_W);
7328 }
7329
7330
7331 M68KMAKE_OP(movem, 32, er, pi)
7332 {
7333         uint i = 0;
7334         uint register_list = OPER_I_16(state);
7335         uint ea = AY;
7336         uint count = 0;
7337
7338         for(; i < 16; i++)
7339                 if(register_list & (1 << i))
7340                 {
7341                         REG_DA[i] = m68ki_read_32(state, ea);
7342                         ea += 4;
7343                         count++;
7344                 }
7345         AY = ea;
7346
7347         USE_CYCLES(count<<CYC_MOVEM_L);
7348 }
7349
7350
7351 M68KMAKE_OP(movem, 32, er, pcdi)
7352 {
7353         uint i = 0;
7354         uint register_list = OPER_I_16(state);
7355         uint ea = EA_PCDI_32();
7356         uint count = 0;
7357
7358         for(; i < 16; i++)
7359                 if(register_list & (1 << i))
7360                 {
7361                         REG_DA[i] = m68ki_read_pcrel_32(state, ea);
7362                         ea += 4;
7363                         count++;
7364                 }
7365
7366         USE_CYCLES(count<<CYC_MOVEM_L);
7367 }
7368
7369
7370 M68KMAKE_OP(movem, 32, er, pcix)
7371 {
7372         uint i = 0;
7373         uint register_list = OPER_I_16(state);
7374         uint ea = EA_PCIX_32();
7375         uint count = 0;
7376
7377         for(; i < 16; i++)
7378                 if(register_list & (1 << i))
7379                 {
7380                         REG_DA[i] = m68ki_read_pcrel_32(state, ea);
7381                         ea += 4;
7382                         count++;
7383                 }
7384
7385         USE_CYCLES(count<<CYC_MOVEM_L);
7386 }
7387
7388
7389 M68KMAKE_OP(movem, 32, er, .)
7390 {
7391         uint i = 0;
7392         uint register_list = OPER_I_16(state);
7393         uint ea = M68KMAKE_GET_EA_AY_32;
7394         uint count = 0;
7395
7396         for(; i < 16; i++)
7397                 if(register_list & (1 << i))
7398                 {
7399                         REG_DA[i] = m68ki_read_32(state, ea);
7400                         ea += 4;
7401                         count++;
7402                 }
7403
7404         USE_CYCLES(count<<CYC_MOVEM_L);
7405 }
7406
7407
7408 M68KMAKE_OP(movep, 16, re, .)
7409 {
7410         uint ea = EA_AY_DI_16();
7411         uint src = DX;
7412
7413         m68ki_write_8(state, ea, MASK_OUT_ABOVE_8(src >> 8));
7414         m68ki_write_8(state, ea += 2, MASK_OUT_ABOVE_8(src));
7415 }
7416
7417
7418 M68KMAKE_OP(movep, 32, re, .)
7419 {
7420         uint ea = EA_AY_DI_32();
7421         uint src = DX;
7422
7423         m68ki_write_8(state, ea, MASK_OUT_ABOVE_8(src >> 24));
7424         m68ki_write_8(state, ea += 2, MASK_OUT_ABOVE_8(src >> 16));
7425         m68ki_write_8(state, ea += 2, MASK_OUT_ABOVE_8(src >> 8));
7426         m68ki_write_8(state, ea += 2, MASK_OUT_ABOVE_8(src));
7427 }
7428
7429
7430 M68KMAKE_OP(movep, 16, er, .)
7431 {
7432         uint ea = EA_AY_DI_16();
7433         uint* r_dst = &DX;
7434
7435         *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(state, ea) << 8) + m68ki_read_8(state, ea + 2));
7436 }
7437
7438
7439 M68KMAKE_OP(movep, 32, er, .)
7440 {
7441         uint ea = EA_AY_DI_32();
7442
7443         DX = (m68ki_read_8(state, ea) << 24) + (m68ki_read_8(state, ea + 2) << 16)
7444                 + (m68ki_read_8(state, ea + 4) << 8) + m68ki_read_8(state, ea + 6);
7445 }
7446
7447
7448 M68KMAKE_OP(moves, 8, ., .)
7449 {
7450         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
7451         {
7452                 if(FLAG_S)
7453                 {
7454                         uint word2 = OPER_I_16(state);
7455                         uint ea = M68KMAKE_GET_EA_AY_8;
7456
7457                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
7458                         if(BIT_B(word2))                   /* Register to memory */
7459                         {
7460                                 m68ki_write_8_fc(state, ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
7461                                 return;
7462                         }
7463                         if(BIT_F(word2))                   /* Memory to address register */
7464                         {
7465                                 REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(state, ea, REG_SFC));
7466                                 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7467                                         USE_CYCLES(2);
7468                                 return;
7469                         }
7470                         /* Memory to data register */
7471                         REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(state, ea, REG_SFC);
7472                         if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7473                                 USE_CYCLES(2);
7474                         return;
7475                 }
7476                 m68ki_exception_privilege_violation(state);
7477                 return;
7478         }
7479         m68ki_exception_illegal(state);
7480 }
7481
7482
7483 M68KMAKE_OP(moves, 16, ., .)
7484 {
7485         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
7486         {
7487                 if(FLAG_S)
7488                 {
7489                         uint word2 = OPER_I_16(state);
7490                         uint ea = M68KMAKE_GET_EA_AY_16;
7491
7492                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
7493                         if(BIT_B(word2))                   /* Register to memory */
7494                         {
7495                                 m68ki_write_16_fc(state, ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
7496                                 return;
7497                         }
7498                         if(BIT_F(word2))                   /* Memory to address register */
7499                         {
7500                                 REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(state, ea, REG_SFC));
7501                                 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7502                                         USE_CYCLES(2);
7503                                 return;
7504                         }
7505                         /* Memory to data register */
7506                         REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(state, ea, REG_SFC);
7507                         if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7508                                 USE_CYCLES(2);
7509                         return;
7510                 }
7511                 m68ki_exception_privilege_violation(state);
7512                 return;
7513         }
7514         m68ki_exception_illegal(state);
7515 }
7516
7517
7518 M68KMAKE_OP(moves, 32, ., .)
7519 {
7520         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
7521         {
7522                 if(FLAG_S)
7523                 {
7524                         uint word2 = OPER_I_16(state);
7525                         uint ea = M68KMAKE_GET_EA_AY_32;
7526
7527                         m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
7528                         if(BIT_B(word2))                   /* Register to memory */
7529                         {
7530                                 m68ki_write_32_fc(state, ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
7531                                 if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7532                                         USE_CYCLES(2);
7533                                 return;
7534                         }
7535                         /* Memory to register */
7536                         REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(state, ea, REG_SFC);
7537                         if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
7538                                 USE_CYCLES(2);
7539                         return;
7540                 }
7541                 m68ki_exception_privilege_violation(state);
7542                 return;
7543         }
7544         m68ki_exception_illegal(state);
7545 }
7546
7547
7548 M68KMAKE_OP(moveq, 32, ., .)
7549 {
7550         uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR));
7551
7552         FLAG_N = NFLAG_32(res);
7553         FLAG_Z = res;
7554         FLAG_V = VFLAG_CLEAR;
7555         FLAG_C = CFLAG_CLEAR;
7556 }
7557
7558
7559 M68KMAKE_OP(move16, 32, ., .)
7560 {
7561         uint16 w2 = OPER_I_16(state);
7562         int ax = REG_IR & 7;
7563         int ay = (w2 >> 12) & 7;
7564
7565         m68ki_write_32(state, REG_A[ay],    m68ki_read_32(state, REG_A[ax]));
7566         m68ki_write_32(state, REG_A[ay]+4,  m68ki_read_32(state, REG_A[ax]+4));
7567         m68ki_write_32(state, REG_A[ay]+8,  m68ki_read_32(state, REG_A[ax]+8));
7568         m68ki_write_32(state, REG_A[ay]+12, m68ki_read_32(state, REG_A[ax]+12));
7569
7570         REG_A[ax] += 16;
7571         REG_A[ay] += 16;
7572 }
7573
7574
7575 M68KMAKE_OP(muls, 16, ., d)
7576 {
7577         uint* r_dst = &DX;
7578         uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
7579
7580         *r_dst = res;
7581
7582         FLAG_Z = res;
7583         FLAG_N = NFLAG_32(res);
7584         FLAG_V = VFLAG_CLEAR;
7585         FLAG_C = CFLAG_CLEAR;
7586 }
7587
7588
7589 M68KMAKE_OP(muls, 16, ., .)
7590 {
7591         uint* r_dst = &DX;
7592         uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(M68KMAKE_GET_OPER_AY_16) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
7593
7594         *r_dst = res;
7595
7596         FLAG_Z = res;
7597         FLAG_N = NFLAG_32(res);
7598         FLAG_V = VFLAG_CLEAR;
7599         FLAG_C = CFLAG_CLEAR;
7600 }
7601
7602
7603 M68KMAKE_OP(mulu, 16, ., d)
7604 {
7605         uint* r_dst = &DX;
7606         uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst);
7607
7608         *r_dst = res;
7609
7610         FLAG_Z = res;
7611         FLAG_N = NFLAG_32(res);
7612         FLAG_V = VFLAG_CLEAR;
7613         FLAG_C = CFLAG_CLEAR;
7614 }
7615
7616
7617 M68KMAKE_OP(mulu, 16, ., .)
7618 {
7619         uint* r_dst = &DX;
7620         uint res = M68KMAKE_GET_OPER_AY_16 * MASK_OUT_ABOVE_16(*r_dst);
7621
7622         *r_dst = res;
7623
7624         FLAG_Z = res;
7625         FLAG_N = NFLAG_32(res);
7626         FLAG_V = VFLAG_CLEAR;
7627         FLAG_C = CFLAG_CLEAR;
7628 }
7629
7630
7631 M68KMAKE_OP(mull, 32, ., d)
7632 {
7633 #if M68K_USE_64_BIT
7634
7635         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7636         {
7637                 uint word2 = OPER_I_16(state);
7638                 uint64 src = DY;
7639                 uint64 dst = REG_D[(word2 >> 12) & 7];
7640                 uint64 res;
7641
7642                 FLAG_C = CFLAG_CLEAR;
7643
7644                 if(BIT_B(word2))                           /* signed */
7645                 {
7646                         res = (sint64)((sint32)src) * (sint64)((sint32)dst);
7647                         if(!BIT_A(word2))
7648                         {
7649                                 FLAG_Z = MASK_OUT_ABOVE_32(res);
7650                                 FLAG_N = NFLAG_32(res);
7651                                 FLAG_V = ((sint64)res != (sint32)res)<<7;
7652                                 REG_D[(word2 >> 12) & 7] = FLAG_Z;
7653                                 return;
7654                         }
7655                         FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
7656                         FLAG_N = NFLAG_64(res);
7657                         FLAG_V = VFLAG_CLEAR;
7658                         REG_D[word2 & 7] = (res >> 32);
7659                         REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
7660                         return;
7661                 }
7662
7663                 res = src * dst;
7664                 if(!BIT_A(word2))
7665                 {
7666                         FLAG_Z = MASK_OUT_ABOVE_32(res);
7667                         FLAG_N = NFLAG_32(res);
7668                         FLAG_V = (res > 0xffffffff)<<7;
7669                         REG_D[(word2 >> 12) & 7] = FLAG_Z;
7670                         return;
7671                 }
7672                 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
7673                 FLAG_N = NFLAG_64(res);
7674                 FLAG_V = VFLAG_CLEAR;
7675                 REG_D[word2 & 7] = (res >> 32);
7676                 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
7677                 return;
7678         }
7679         m68ki_exception_illegal(state);
7680
7681 #else
7682
7683         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7684         {
7685                 uint word2 = OPER_I_16(state);
7686                 uint src = DY;
7687                 uint dst = REG_D[(word2 >> 12) & 7];
7688                 uint neg = GET_MSB_32(src ^ dst);
7689                 uint src1;
7690                 uint src2;
7691                 uint dst1;
7692                 uint dst2;
7693                 uint r1;
7694                 uint r2;
7695                 uint r3;
7696                 uint r4;
7697                 uint lo;
7698                 uint hi;
7699
7700                 FLAG_C = CFLAG_CLEAR;
7701
7702                 if(BIT_B(word2))                           /* signed */
7703                 {
7704                         if(GET_MSB_32(src))
7705                                 src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
7706                         if(GET_MSB_32(dst))
7707                                 dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
7708                 }
7709
7710                 src1 = MASK_OUT_ABOVE_16(src);
7711                 src2 = src>>16;
7712                 dst1 = MASK_OUT_ABOVE_16(dst);
7713                 dst2 = dst>>16;
7714
7715
7716                 r1 = src1 * dst1;
7717                 r2 = src1 * dst2;
7718                 r3 = src2 * dst1;
7719                 r4 = src2 * dst2;
7720
7721                 lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
7722                 hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
7723
7724                 if(BIT_B(word2) && neg)
7725                 {
7726                         hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
7727                         lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
7728                 }
7729
7730                 if(BIT_A(word2))
7731                 {
7732                         REG_D[word2 & 7] = hi;
7733                         REG_D[(word2 >> 12) & 7] = lo;
7734                         FLAG_N = NFLAG_32(hi);
7735                         FLAG_Z = hi | lo;
7736                         FLAG_V = VFLAG_CLEAR;
7737                         return;
7738                 }
7739
7740                 REG_D[(word2 >> 12) & 7] = lo;
7741                 FLAG_N = NFLAG_32(lo);
7742                 FLAG_Z = lo;
7743                 if(BIT_B(word2))
7744                         FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
7745                 else
7746                         FLAG_V = (hi != 0) << 7;
7747                 return;
7748         }
7749         m68ki_exception_illegal(state);
7750
7751 #endif
7752 }
7753
7754
7755 M68KMAKE_OP(mull, 32, ., .)
7756 {
7757 #if M68K_USE_64_BIT
7758
7759         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7760         {
7761                 uint word2 = OPER_I_16(state);
7762                 uint64 src = M68KMAKE_GET_OPER_AY_32;
7763                 uint64 dst = REG_D[(word2 >> 12) & 7];
7764                 uint64 res;
7765
7766                 FLAG_C = CFLAG_CLEAR;
7767
7768                 if(BIT_B(word2))                           /* signed */
7769                 {
7770                         res = (sint64)((sint32)src) * (sint64)((sint32)dst);
7771                         if(!BIT_A(word2))
7772                         {
7773                                 FLAG_Z = MASK_OUT_ABOVE_32(res);
7774                                 FLAG_N = NFLAG_32(res);
7775                                 FLAG_V = ((sint64)res != (sint32)res)<<7;
7776                                 REG_D[(word2 >> 12) & 7] = FLAG_Z;
7777                                 return;
7778                         }
7779                         FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
7780                         FLAG_N = NFLAG_64(res);
7781                         FLAG_V = VFLAG_CLEAR;
7782                         REG_D[word2 & 7] = (res >> 32);
7783                         REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
7784                         return;
7785                 }
7786
7787                 res = src * dst;
7788                 if(!BIT_A(word2))
7789                 {
7790                         FLAG_Z = MASK_OUT_ABOVE_32(res);
7791                         FLAG_N = NFLAG_32(res);
7792                         FLAG_V = (res > 0xffffffff)<<7;
7793                         REG_D[(word2 >> 12) & 7] = FLAG_Z;
7794                         return;
7795                 }
7796                 FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
7797                 FLAG_N = NFLAG_64(res);
7798                 FLAG_V = VFLAG_CLEAR;
7799                 REG_D[word2 & 7] = (res >> 32);
7800                 REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
7801                 return;
7802         }
7803         m68ki_exception_illegal(state);
7804
7805 #else
7806
7807         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
7808         {
7809                 uint word2 = OPER_I_16(state);
7810                 uint src = M68KMAKE_GET_OPER_AY_32;
7811                 uint dst = REG_D[(word2 >> 12) & 7];
7812                 uint neg = GET_MSB_32(src ^ dst);
7813                 uint src1;
7814                 uint src2;
7815                 uint dst1;
7816                 uint dst2;
7817                 uint r1;
7818                 uint r2;
7819                 uint r3;
7820                 uint r4;
7821                 uint lo;
7822                 uint hi;
7823
7824                 FLAG_C = CFLAG_CLEAR;
7825
7826                 if(BIT_B(word2))                           /* signed */
7827                 {
7828                         if(GET_MSB_32(src))
7829                                 src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
7830                         if(GET_MSB_32(dst))
7831                                 dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
7832                 }
7833
7834                 src1 = MASK_OUT_ABOVE_16(src);
7835                 src2 = src>>16;
7836                 dst1 = MASK_OUT_ABOVE_16(dst);
7837                 dst2 = dst>>16;
7838
7839
7840                 r1 = src1 * dst1;
7841                 r2 = src1 * dst2;
7842                 r3 = src2 * dst1;
7843                 r4 = src2 * dst2;
7844
7845                 lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
7846                 hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
7847
7848                 if(BIT_B(word2) && neg)
7849                 {
7850                         hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
7851                         lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
7852                 }
7853
7854                 if(BIT_A(word2))
7855                 {
7856                         REG_D[word2 & 7] = hi;
7857                         REG_D[(word2 >> 12) & 7] = lo;
7858                         FLAG_N = NFLAG_32(hi);
7859                         FLAG_Z = hi | lo;
7860                         FLAG_V = VFLAG_CLEAR;
7861                         return;
7862                 }
7863
7864                 REG_D[(word2 >> 12) & 7] = lo;
7865                 FLAG_N = NFLAG_32(lo);
7866                 FLAG_Z = lo;
7867                 if(BIT_B(word2))
7868                         FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
7869                 else
7870                         FLAG_V = (hi != 0) << 7;
7871                 return;
7872         }
7873         m68ki_exception_illegal(state);
7874
7875 #endif
7876 }
7877
7878
7879 M68KMAKE_OP(nbcd, 8, ., d)
7880 {
7881         uint* r_dst = &DY;
7882         uint dst = MASK_OUT_ABOVE_8(*r_dst);
7883         uint res = - dst - XFLAG_AS_1();
7884
7885         if(res != 0)
7886         {
7887                 FLAG_V = res; /* Undefined V behavior */
7888
7889                 if(((res|dst) & 0x0f) == 0)
7890                         res = (res & 0xf0) + 6;
7891
7892                 res = MASK_OUT_ABOVE_8(res + 0x9a);
7893
7894                 FLAG_V &= ~res; /* Undefined V behavior part II */
7895
7896                 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
7897
7898                 FLAG_Z |= res;
7899                 FLAG_C = CFLAG_SET;
7900                 FLAG_X = XFLAG_SET;
7901         }
7902         else
7903         {
7904                 FLAG_V = VFLAG_CLEAR;
7905                 FLAG_C = CFLAG_CLEAR;
7906                 FLAG_X = XFLAG_CLEAR;
7907         }
7908         FLAG_N = NFLAG_8(res);  /* Undefined N behavior */
7909 }
7910
7911
7912 M68KMAKE_OP(nbcd, 8, ., .)
7913 {
7914         uint ea = M68KMAKE_GET_EA_AY_8;
7915         uint dst = m68ki_read_8(state, ea);
7916         uint res = - dst - XFLAG_AS_1();
7917
7918         if(res != 0)
7919         {
7920                 FLAG_V = res; /* Undefined V behavior */
7921
7922                 if(((res|dst) & 0x0f) == 0)
7923                         res = (res & 0xf0) + 6;
7924
7925                 res = MASK_OUT_ABOVE_8(res + 0x9a);
7926
7927                 FLAG_V &= ~res; /* Undefined V behavior part II */
7928
7929                 m68ki_write_8(state, ea, MASK_OUT_ABOVE_8(res));
7930
7931                 FLAG_Z |= res;
7932                 FLAG_C = CFLAG_SET;
7933                 FLAG_X = XFLAG_SET;
7934         }
7935         else
7936         {
7937                 FLAG_V = VFLAG_CLEAR;
7938                 FLAG_C = CFLAG_CLEAR;
7939                 FLAG_X = XFLAG_CLEAR;
7940         }
7941         FLAG_N = NFLAG_8(res);  /* Undefined N behavior */
7942 }
7943
7944
7945 M68KMAKE_OP(neg, 8, ., d)
7946 {
7947         uint* r_dst = &DY;
7948         uint res = 0 - MASK_OUT_ABOVE_8(*r_dst);
7949
7950         FLAG_N = NFLAG_8(res);
7951         FLAG_C = FLAG_X = CFLAG_8(res);
7952         FLAG_V = *r_dst & res;
7953         FLAG_Z = MASK_OUT_ABOVE_8(res);
7954
7955         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
7956 }
7957
7958
7959 M68KMAKE_OP(neg, 8, ., .)
7960 {
7961         uint ea = M68KMAKE_GET_EA_AY_8;
7962         uint src = m68ki_read_8(state, ea);
7963         uint res = 0 - src;
7964
7965         FLAG_N = NFLAG_8(res);
7966         FLAG_C = FLAG_X = CFLAG_8(res);
7967         FLAG_V = src & res;
7968         FLAG_Z = MASK_OUT_ABOVE_8(res);
7969
7970         m68ki_write_8(state, ea, FLAG_Z);
7971 }
7972
7973
7974 M68KMAKE_OP(neg, 16, ., d)
7975 {
7976         uint* r_dst = &DY;
7977         uint res = 0 - MASK_OUT_ABOVE_16(*r_dst);
7978
7979         FLAG_N = NFLAG_16(res);
7980         FLAG_C = FLAG_X = CFLAG_16(res);
7981         FLAG_V = (*r_dst & res)>>8;
7982         FLAG_Z = MASK_OUT_ABOVE_16(res);
7983
7984         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
7985 }
7986
7987
7988 M68KMAKE_OP(neg, 16, ., .)
7989 {
7990         uint ea = M68KMAKE_GET_EA_AY_16;
7991         uint src = m68ki_read_16(state, ea);
7992         uint res = 0 - src;
7993
7994         FLAG_N = NFLAG_16(res);
7995         FLAG_C = FLAG_X = CFLAG_16(res);
7996         FLAG_V = (src & res)>>8;
7997         FLAG_Z = MASK_OUT_ABOVE_16(res);
7998
7999         m68ki_write_16(state, ea, FLAG_Z);
8000 }
8001
8002
8003 M68KMAKE_OP(neg, 32, ., d)
8004 {
8005         uint* r_dst = &DY;
8006         uint res = 0 - *r_dst;
8007
8008         FLAG_N = NFLAG_32(res);
8009         FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res);
8010         FLAG_V = (*r_dst & res)>>24;
8011         FLAG_Z = MASK_OUT_ABOVE_32(res);
8012
8013         *r_dst = FLAG_Z;
8014 }
8015
8016
8017 M68KMAKE_OP(neg, 32, ., .)
8018 {
8019         uint ea = M68KMAKE_GET_EA_AY_32;
8020         uint src = m68ki_read_32(state, ea);
8021         uint res = 0 - src;
8022
8023         FLAG_N = NFLAG_32(res);
8024         FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
8025         FLAG_V = (src & res)>>24;
8026         FLAG_Z = MASK_OUT_ABOVE_32(res);
8027
8028         m68ki_write_32(state, ea, FLAG_Z);
8029 }
8030
8031
8032 M68KMAKE_OP(negx, 8, ., d)
8033 {
8034         uint* r_dst = &DY;
8035         uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1();
8036
8037         FLAG_N = NFLAG_8(res);
8038         FLAG_X = FLAG_C = CFLAG_8(res);
8039         FLAG_V = *r_dst & res;
8040
8041         res = MASK_OUT_ABOVE_8(res);
8042         FLAG_Z |= res;
8043
8044         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8045 }
8046
8047
8048 M68KMAKE_OP(negx, 8, ., .)
8049 {
8050         uint ea = M68KMAKE_GET_EA_AY_8;
8051         uint src = m68ki_read_8(state, ea);
8052         uint res = 0 - src - XFLAG_AS_1();
8053
8054         FLAG_N = NFLAG_8(res);
8055         FLAG_X = FLAG_C = CFLAG_8(res);
8056         FLAG_V = src & res;
8057
8058         res = MASK_OUT_ABOVE_8(res);
8059         FLAG_Z |= res;
8060
8061         m68ki_write_8(state, ea, res);
8062 }
8063
8064
8065 M68KMAKE_OP(negx, 16, ., d)
8066 {
8067         uint* r_dst = &DY;
8068         uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1();
8069
8070         FLAG_N = NFLAG_16(res);
8071         FLAG_X = FLAG_C = CFLAG_16(res);
8072         FLAG_V = (*r_dst & res)>>8;
8073
8074         res = MASK_OUT_ABOVE_16(res);
8075         FLAG_Z |= res;
8076
8077         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8078 }
8079
8080
8081 M68KMAKE_OP(negx, 16, ., .)
8082 {
8083         uint ea  = M68KMAKE_GET_EA_AY_16;
8084         uint src = m68ki_read_16(state, ea);
8085         uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
8086
8087         FLAG_N = NFLAG_16(res);
8088         FLAG_X = FLAG_C = CFLAG_16(res);
8089         FLAG_V = (src & res)>>8;
8090
8091         res = MASK_OUT_ABOVE_16(res);
8092         FLAG_Z |= res;
8093
8094         m68ki_write_16(state, ea, res);
8095 }
8096
8097
8098 M68KMAKE_OP(negx, 32, ., d)
8099 {
8100         uint* r_dst = &DY;
8101         uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1();
8102
8103         FLAG_N = NFLAG_32(res);
8104         FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res);
8105         FLAG_V = (*r_dst & res)>>24;
8106
8107         res = MASK_OUT_ABOVE_32(res);
8108         FLAG_Z |= res;
8109
8110         *r_dst = res;
8111 }
8112
8113
8114 M68KMAKE_OP(negx, 32, ., .)
8115 {
8116         uint ea  = M68KMAKE_GET_EA_AY_32;
8117         uint src = m68ki_read_32(state, ea);
8118         uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
8119
8120         FLAG_N = NFLAG_32(res);
8121         FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
8122         FLAG_V = (src & res)>>24;
8123
8124         res = MASK_OUT_ABOVE_32(res);
8125         FLAG_Z |= res;
8126
8127         m68ki_write_32(state, ea, res);
8128 }
8129
8130
8131 M68KMAKE_OP(nop, 0, ., .)
8132 {
8133         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
8134 }
8135
8136
8137 M68KMAKE_OP(not, 8, ., d)
8138 {
8139         uint* r_dst = &DY;
8140         uint res = MASK_OUT_ABOVE_8(~*r_dst);
8141
8142         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8143
8144         FLAG_N = NFLAG_8(res);
8145         FLAG_Z = res;
8146         FLAG_C = CFLAG_CLEAR;
8147         FLAG_V = VFLAG_CLEAR;
8148 }
8149
8150
8151 M68KMAKE_OP(not, 8, ., .)
8152 {
8153         uint ea = M68KMAKE_GET_EA_AY_8;
8154         uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(state, ea));
8155
8156         m68ki_write_8(state, ea, res);
8157
8158         FLAG_N = NFLAG_8(res);
8159         FLAG_Z = res;
8160         FLAG_C = CFLAG_CLEAR;
8161         FLAG_V = VFLAG_CLEAR;
8162 }
8163
8164
8165 M68KMAKE_OP(not, 16, ., d)
8166 {
8167         uint* r_dst = &DY;
8168         uint res = MASK_OUT_ABOVE_16(~*r_dst);
8169
8170         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8171
8172         FLAG_N = NFLAG_16(res);
8173         FLAG_Z = res;
8174         FLAG_C = CFLAG_CLEAR;
8175         FLAG_V = VFLAG_CLEAR;
8176 }
8177
8178
8179 M68KMAKE_OP(not, 16, ., .)
8180 {
8181         uint ea = M68KMAKE_GET_EA_AY_16;
8182         uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(state, ea));
8183
8184         m68ki_write_16(state, ea, res);
8185
8186         FLAG_N = NFLAG_16(res);
8187         FLAG_Z = res;
8188         FLAG_C = CFLAG_CLEAR;
8189         FLAG_V = VFLAG_CLEAR;
8190 }
8191
8192
8193 M68KMAKE_OP(not, 32, ., d)
8194 {
8195         uint* r_dst = &DY;
8196         uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst);
8197
8198         FLAG_N = NFLAG_32(res);
8199         FLAG_Z = res;
8200         FLAG_C = CFLAG_CLEAR;
8201         FLAG_V = VFLAG_CLEAR;
8202 }
8203
8204
8205 M68KMAKE_OP(not, 32, ., .)
8206 {
8207         uint ea = M68KMAKE_GET_EA_AY_32;
8208         uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(state, ea));
8209
8210         m68ki_write_32(state, ea, res);
8211
8212         FLAG_N = NFLAG_32(res);
8213         FLAG_Z = res;
8214         FLAG_C = CFLAG_CLEAR;
8215         FLAG_V = VFLAG_CLEAR;
8216 }
8217
8218
8219 M68KMAKE_OP(or, 8, er, d)
8220 {
8221         uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY)));
8222
8223         FLAG_N = NFLAG_8(res);
8224         FLAG_Z = res;
8225         FLAG_C = CFLAG_CLEAR;
8226         FLAG_V = VFLAG_CLEAR;
8227 }
8228
8229
8230 M68KMAKE_OP(or, 8, er, .)
8231 {
8232         uint res = MASK_OUT_ABOVE_8((DX |= M68KMAKE_GET_OPER_AY_8));
8233
8234         FLAG_N = NFLAG_8(res);
8235         FLAG_Z = res;
8236         FLAG_C = CFLAG_CLEAR;
8237         FLAG_V = VFLAG_CLEAR;
8238 }
8239
8240
8241 M68KMAKE_OP(or, 16, er, d)
8242 {
8243         uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY)));
8244
8245         FLAG_N = NFLAG_16(res);
8246         FLAG_Z = res;
8247         FLAG_C = CFLAG_CLEAR;
8248         FLAG_V = VFLAG_CLEAR;
8249 }
8250
8251
8252 M68KMAKE_OP(or, 16, er, .)
8253 {
8254         uint res = MASK_OUT_ABOVE_16((DX |= M68KMAKE_GET_OPER_AY_16));
8255
8256         FLAG_N = NFLAG_16(res);
8257         FLAG_Z = res;
8258         FLAG_C = CFLAG_CLEAR;
8259         FLAG_V = VFLAG_CLEAR;
8260 }
8261
8262
8263 M68KMAKE_OP(or, 32, er, d)
8264 {
8265         uint res = DX |= DY;
8266
8267         FLAG_N = NFLAG_32(res);
8268         FLAG_Z = res;
8269         FLAG_C = CFLAG_CLEAR;
8270         FLAG_V = VFLAG_CLEAR;
8271 }
8272
8273
8274 M68KMAKE_OP(or, 32, er, .)
8275 {
8276         uint res = DX |= M68KMAKE_GET_OPER_AY_32;
8277
8278         FLAG_N = NFLAG_32(res);
8279         FLAG_Z = res;
8280         FLAG_C = CFLAG_CLEAR;
8281         FLAG_V = VFLAG_CLEAR;
8282 }
8283
8284
8285 M68KMAKE_OP(or, 8, re, .)
8286 {
8287         uint ea = M68KMAKE_GET_EA_AY_8;
8288         uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(state, ea));
8289
8290         m68ki_write_8(state, ea, res);
8291
8292         FLAG_N = NFLAG_8(res);
8293         FLAG_Z = res;
8294         FLAG_C = CFLAG_CLEAR;
8295         FLAG_V = VFLAG_CLEAR;
8296 }
8297
8298
8299 M68KMAKE_OP(or, 16, re, .)
8300 {
8301         uint ea = M68KMAKE_GET_EA_AY_16;
8302         uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(state, ea));
8303
8304         m68ki_write_16(state, ea, res);
8305
8306         FLAG_N = NFLAG_16(res);
8307         FLAG_Z = res;
8308         FLAG_C = CFLAG_CLEAR;
8309         FLAG_V = VFLAG_CLEAR;
8310 }
8311
8312
8313 M68KMAKE_OP(or, 32, re, .)
8314 {
8315         uint ea = M68KMAKE_GET_EA_AY_32;
8316         uint res = DX | m68ki_read_32(state, ea);
8317
8318         m68ki_write_32(state, ea, res);
8319
8320         FLAG_N = NFLAG_32(res);
8321         FLAG_Z = res;
8322         FLAG_C = CFLAG_CLEAR;
8323         FLAG_V = VFLAG_CLEAR;
8324 }
8325
8326
8327 M68KMAKE_OP(ori, 8, ., d)
8328 {
8329         uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8(state)));
8330
8331         FLAG_N = NFLAG_8(res);
8332         FLAG_Z = res;
8333         FLAG_C = CFLAG_CLEAR;
8334         FLAG_V = VFLAG_CLEAR;
8335 }
8336
8337
8338 M68KMAKE_OP(ori, 8, ., .)
8339 {
8340         uint src = OPER_I_8(state);
8341         uint ea = M68KMAKE_GET_EA_AY_8;
8342         uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(state, ea));
8343
8344         m68ki_write_8(state, ea, res);
8345
8346         FLAG_N = NFLAG_8(res);
8347         FLAG_Z = res;
8348         FLAG_C = CFLAG_CLEAR;
8349         FLAG_V = VFLAG_CLEAR;
8350 }
8351
8352
8353 M68KMAKE_OP(ori, 16, ., d)
8354 {
8355         uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16(state));
8356
8357         FLAG_N = NFLAG_16(res);
8358         FLAG_Z = res;
8359         FLAG_C = CFLAG_CLEAR;
8360         FLAG_V = VFLAG_CLEAR;
8361 }
8362
8363
8364 M68KMAKE_OP(ori, 16, ., .)
8365 {
8366         uint src = OPER_I_16(state);
8367         uint ea = M68KMAKE_GET_EA_AY_16;
8368         uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(state, ea));
8369
8370         m68ki_write_16(state, ea, res);
8371
8372         FLAG_N = NFLAG_16(res);
8373         FLAG_Z = res;
8374         FLAG_C = CFLAG_CLEAR;
8375         FLAG_V = VFLAG_CLEAR;
8376 }
8377
8378
8379 M68KMAKE_OP(ori, 32, ., d)
8380 {
8381         uint res = DY |= OPER_I_32(state);
8382
8383         FLAG_N = NFLAG_32(res);
8384         FLAG_Z = res;
8385         FLAG_C = CFLAG_CLEAR;
8386         FLAG_V = VFLAG_CLEAR;
8387 }
8388
8389
8390 M68KMAKE_OP(ori, 32, ., .)
8391 {
8392         uint src = OPER_I_32(state);
8393         uint ea = M68KMAKE_GET_EA_AY_32;
8394         uint res = src | m68ki_read_32(state, ea);
8395
8396         m68ki_write_32(state, ea, res);
8397
8398         FLAG_N = NFLAG_32(res);
8399         FLAG_Z = res;
8400         FLAG_C = CFLAG_CLEAR;
8401         FLAG_V = VFLAG_CLEAR;
8402 }
8403
8404
8405 M68KMAKE_OP(ori, 16, toc, .)
8406 {
8407         m68ki_set_ccr(state, m68ki_get_ccr(state) | OPER_I_8(state));
8408 }
8409
8410
8411 M68KMAKE_OP(ori, 16, tos, .)
8412 {
8413         if(FLAG_S)
8414         {
8415                 uint src = OPER_I_16(state);
8416                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
8417                 m68ki_set_sr(state, m68ki_get_sr() | src);
8418                 return;
8419         }
8420         m68ki_exception_privilege_violation(state);
8421 }
8422
8423
8424 M68KMAKE_OP(pack, 16, rr, .)
8425 {
8426         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
8427         {
8428                 /* Note: DX and DY are reversed in Motorola's docs */
8429                 uint src = DY + OPER_I_16(state);
8430                 uint* r_dst = &DX;
8431
8432                 *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f);
8433                 return;
8434         }
8435         m68ki_exception_illegal(state);
8436 }
8437
8438
8439 M68KMAKE_OP(pack, 16, mm, ax7)
8440 {
8441         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
8442         {
8443                 /* Note: AX and AY are reversed in Motorola's docs */
8444                 uint ea_src = EA_AY_PD_8();
8445                 uint src = m68ki_read_8(state, ea_src);
8446                 ea_src = EA_AY_PD_8();
8447                 src = ((src << 8) | m68ki_read_8(state, ea_src)) + OPER_I_16(state);
8448
8449                 m68ki_write_8(state, EA_A7_PD_8(), ((src >> 8) & 0x000f) | ((src<<4) & 0x00f0));
8450                 return;
8451         }
8452         m68ki_exception_illegal(state);
8453 }
8454
8455
8456 M68KMAKE_OP(pack, 16, mm, ay7)
8457 {
8458         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
8459         {
8460                 /* Note: AX and AY are reversed in Motorola's docs */
8461                 uint ea_src = EA_A7_PD_8();
8462                 uint src = m68ki_read_8(state, ea_src);
8463                 ea_src = EA_A7_PD_8();
8464                 src = (src | (m68ki_read_8(state, ea_src) << 8)) + OPER_I_16(state);
8465
8466                 m68ki_write_8(state, EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
8467                 return;
8468         }
8469         m68ki_exception_illegal(state);
8470 }
8471
8472
8473 M68KMAKE_OP(pack, 16, mm, axy7)
8474 {
8475         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
8476         {
8477                 uint ea_src = EA_A7_PD_8();
8478                 uint src = m68ki_read_8(state, ea_src);
8479                 ea_src = EA_A7_PD_8();
8480                 src = (src | (m68ki_read_8(state, ea_src) << 8)) + OPER_I_16(state);
8481
8482                 m68ki_write_8(state, EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
8483                 return;
8484         }
8485         m68ki_exception_illegal(state);
8486 }
8487
8488
8489 M68KMAKE_OP(pack, 16, mm, .)
8490 {
8491         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
8492         {
8493                 /* Note: AX and AY are reversed in Motorola's docs */
8494                 uint ea_src = EA_AY_PD_8();
8495                 uint src = m68ki_read_8(state, ea_src);
8496                 ea_src = EA_AY_PD_8();
8497                 src = (src | (m68ki_read_8(state, ea_src) << 8)) + OPER_I_16(state);
8498
8499                 m68ki_write_8(state, EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
8500                 return;
8501         }
8502         m68ki_exception_illegal(state);
8503 }
8504
8505
8506 M68KMAKE_OP(pea, 32, ., .)
8507 {
8508         uint ea = M68KMAKE_GET_EA_AY_32;
8509
8510         m68ki_push_32(state, ea);
8511 }
8512
8513 M68KMAKE_OP(pflusha, 32, ., .)
8514 {
8515         if (HAS_PMMU)
8516         {
8517                 fprintf(stderr,"68040: unhandled PFLUSHA (ir=%04x)\n", REG_IR);
8518                 return;
8519         }
8520         m68ki_exception_1111(state);
8521 }
8522
8523 M68KMAKE_OP(pflushan, 32, ., .)
8524 {
8525         if (HAS_PMMU)
8526         {
8527                 fprintf(stderr,"68040: unhandled PFLUSHAN (ir=%04x)\n", REG_IR);
8528                 return;
8529         }
8530         m68ki_exception_1111(state);
8531 }
8532
8533 M68KMAKE_OP(pmmu, 32, ., .)
8534 {
8535         if ((CPU_TYPE_IS_EC020_PLUS(CPU_TYPE)) && (HAS_PMMU))
8536         {
8537                 m68851_mmu_ops(state);
8538         }
8539         else
8540         {
8541                 m68ki_exception_1111(state);
8542         }
8543 }
8544
8545 M68KMAKE_OP(reset, 0, ., .)
8546 {
8547         if(FLAG_S)
8548         {
8549                 m68ki_output_reset();              /* auto-disable (see m68kcpu.h) */
8550                 USE_CYCLES(CYC_RESET);
8551                 return;
8552         }
8553         m68ki_exception_privilege_violation(state);
8554 }
8555
8556
8557 M68KMAKE_OP(ror, 8, s, .)
8558 {
8559         uint* r_dst = &DY;
8560         uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
8561         uint shift = orig_shift & 7;
8562         uint src = MASK_OUT_ABOVE_8(*r_dst);
8563         uint res = ROR_8(src, shift);
8564
8565         if(orig_shift != 0)
8566                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8567
8568         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8569
8570         FLAG_N = NFLAG_8(res);
8571         FLAG_Z = res;
8572         FLAG_C = src << (9-orig_shift);
8573         FLAG_V = VFLAG_CLEAR;
8574 }
8575
8576
8577 M68KMAKE_OP(ror, 16, s, .)
8578 {
8579         uint* r_dst = &DY;
8580         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8581         uint src = MASK_OUT_ABOVE_16(*r_dst);
8582         uint res = ROR_16(src, shift);
8583
8584         if(shift != 0)
8585                 USE_CYCLES(shift<<CYC_SHIFT);
8586
8587         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8588
8589         FLAG_N = NFLAG_16(res);
8590         FLAG_Z = res;
8591         FLAG_C = src << (9-shift);
8592         FLAG_V = VFLAG_CLEAR;
8593 }
8594
8595
8596 M68KMAKE_OP(ror, 32, s, .)
8597 {
8598         uint* r_dst = &DY;
8599         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8600         uint64 src = *r_dst;
8601         uint res = ROR_32(src, shift);
8602
8603         if(shift != 0)
8604                 USE_CYCLES(shift<<CYC_SHIFT);
8605
8606         *r_dst = res;
8607
8608         FLAG_N = NFLAG_32(res);
8609         FLAG_Z = res;
8610         FLAG_C = src << (9-shift);
8611         FLAG_V = VFLAG_CLEAR;
8612 }
8613
8614
8615 M68KMAKE_OP(ror, 8, r, .)
8616 {
8617         uint* r_dst = &DY;
8618         uint orig_shift = DX & 0x3f;
8619         uint shift = orig_shift & 7;
8620         uint src = MASK_OUT_ABOVE_8(*r_dst);
8621         uint res = ROR_8(src, shift);
8622
8623         if(orig_shift != 0)
8624         {
8625                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8626
8627                 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8628                 FLAG_C = src << (8-((shift-1)&7));
8629                 FLAG_N = NFLAG_8(res);
8630                 FLAG_Z = res;
8631                 FLAG_V = VFLAG_CLEAR;
8632                 return;
8633         }
8634
8635         FLAG_C = CFLAG_CLEAR;
8636         FLAG_N = NFLAG_8(src);
8637         FLAG_Z = src;
8638         FLAG_V = VFLAG_CLEAR;
8639 }
8640
8641
8642 M68KMAKE_OP(ror, 16, r, .)
8643 {
8644         uint* r_dst = &DY;
8645         uint orig_shift = DX & 0x3f;
8646         uint shift = orig_shift & 15;
8647         uint src = MASK_OUT_ABOVE_16(*r_dst);
8648         uint res = ROR_16(src, shift);
8649
8650         if(orig_shift != 0)
8651         {
8652                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8653
8654                 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8655                 FLAG_C = (src >> ((shift - 1) & 15)) << 8;
8656                 FLAG_N = NFLAG_16(res);
8657                 FLAG_Z = res;
8658                 FLAG_V = VFLAG_CLEAR;
8659                 return;
8660         }
8661
8662         FLAG_C = CFLAG_CLEAR;
8663         FLAG_N = NFLAG_16(src);
8664         FLAG_Z = src;
8665         FLAG_V = VFLAG_CLEAR;
8666 }
8667
8668
8669 M68KMAKE_OP(ror, 32, r, .)
8670 {
8671         uint* r_dst = &DY;
8672         uint orig_shift = DX & 0x3f;
8673         uint shift = orig_shift & 31;
8674         uint64 src = *r_dst;
8675         uint res = ROR_32(src, shift);
8676
8677         if(orig_shift != 0)
8678         {
8679                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8680
8681                 *r_dst = res;
8682                 FLAG_C = (src >> ((shift - 1) & 31)) << 8;
8683                 FLAG_N = NFLAG_32(res);
8684                 FLAG_Z = res;
8685                 FLAG_V = VFLAG_CLEAR;
8686                 return;
8687         }
8688
8689         FLAG_C = CFLAG_CLEAR;
8690         FLAG_N = NFLAG_32(src);
8691         FLAG_Z = src;
8692         FLAG_V = VFLAG_CLEAR;
8693 }
8694
8695
8696 M68KMAKE_OP(ror, 16, ., .)
8697 {
8698         uint ea = M68KMAKE_GET_EA_AY_16;
8699         uint src = m68ki_read_16(state, ea);
8700         uint res = ROR_16(src, 1);
8701
8702         m68ki_write_16(state, ea, res);
8703
8704         FLAG_N = NFLAG_16(res);
8705         FLAG_Z = res;
8706         FLAG_C = src << 8;
8707         FLAG_V = VFLAG_CLEAR;
8708 }
8709
8710
8711 M68KMAKE_OP(rol, 8, s, .)
8712 {
8713         uint* r_dst = &DY;
8714         uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
8715         uint shift = orig_shift & 7;
8716         uint src = MASK_OUT_ABOVE_8(*r_dst);
8717         uint res = ROL_8(src, shift);
8718
8719         if(orig_shift != 0)
8720                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8721
8722         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8723
8724         FLAG_N = NFLAG_8(res);
8725         FLAG_Z = res;
8726         FLAG_C = src << orig_shift;
8727         FLAG_V = VFLAG_CLEAR;
8728 }
8729
8730
8731 M68KMAKE_OP(rol, 16, s, .)
8732 {
8733         uint* r_dst = &DY;
8734         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8735         uint src = MASK_OUT_ABOVE_16(*r_dst);
8736         uint res = ROL_16(src, shift);
8737
8738         if(shift != 0)
8739                 USE_CYCLES(shift<<CYC_SHIFT);
8740
8741         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8742
8743         FLAG_N = NFLAG_16(res);
8744         FLAG_Z = res;
8745         FLAG_C = src >> (8-shift);
8746         FLAG_V = VFLAG_CLEAR;
8747 }
8748
8749
8750 M68KMAKE_OP(rol, 32, s, .)
8751 {
8752         uint* r_dst = &DY;
8753         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8754         uint64 src = *r_dst;
8755         uint res = ROL_32(src, shift);
8756
8757         if(shift != 0)
8758                 USE_CYCLES(shift<<CYC_SHIFT);
8759
8760         *r_dst = res;
8761
8762         FLAG_N = NFLAG_32(res);
8763         FLAG_Z = res;
8764         FLAG_C = src >> (24-shift);
8765         FLAG_V = VFLAG_CLEAR;
8766 }
8767
8768
8769 M68KMAKE_OP(rol, 8, r, .)
8770 {
8771         uint* r_dst = &DY;
8772         uint orig_shift = DX & 0x3f;
8773         uint shift = orig_shift & 7;
8774         uint src = MASK_OUT_ABOVE_8(*r_dst);
8775         uint res = ROL_8(src, shift);
8776
8777         if(orig_shift != 0)
8778         {
8779                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8780
8781                 if(shift != 0)
8782                 {
8783                         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8784                         FLAG_C = src << shift;
8785                         FLAG_N = NFLAG_8(res);
8786                         FLAG_Z = res;
8787                         FLAG_V = VFLAG_CLEAR;
8788                         return;
8789                 }
8790                 FLAG_C = (src & 1)<<8;
8791                 FLAG_N = NFLAG_8(src);
8792                 FLAG_Z = src;
8793                 FLAG_V = VFLAG_CLEAR;
8794                 return;
8795         }
8796
8797         FLAG_C = CFLAG_CLEAR;
8798         FLAG_N = NFLAG_8(src);
8799         FLAG_Z = src;
8800         FLAG_V = VFLAG_CLEAR;
8801 }
8802
8803
8804 M68KMAKE_OP(rol, 16, r, .)
8805 {
8806         uint* r_dst = &DY;
8807         uint orig_shift = DX & 0x3f;
8808         uint shift = orig_shift & 15;
8809         uint src = MASK_OUT_ABOVE_16(*r_dst);
8810         uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift));
8811
8812         if(orig_shift != 0)
8813         {
8814                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8815
8816                 if(shift != 0)
8817                 {
8818                         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8819                         FLAG_C = (src << shift) >> 8;
8820                         FLAG_N = NFLAG_16(res);
8821                         FLAG_Z = res;
8822                         FLAG_V = VFLAG_CLEAR;
8823                         return;
8824                 }
8825                 FLAG_C = (src & 1)<<8;
8826                 FLAG_N = NFLAG_16(src);
8827                 FLAG_Z = src;
8828                 FLAG_V = VFLAG_CLEAR;
8829                 return;
8830         }
8831
8832         FLAG_C = CFLAG_CLEAR;
8833         FLAG_N = NFLAG_16(src);
8834         FLAG_Z = src;
8835         FLAG_V = VFLAG_CLEAR;
8836 }
8837
8838
8839 M68KMAKE_OP(rol, 32, r, .)
8840 {
8841         uint* r_dst = &DY;
8842         uint orig_shift = DX & 0x3f;
8843         uint shift = orig_shift & 31;
8844         uint64 src = *r_dst;
8845         uint res = ROL_32(src, shift);
8846
8847         if(orig_shift != 0)
8848         {
8849                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8850
8851                 *r_dst = res;
8852
8853                 FLAG_C = (src >> ((32 - shift) & 0x1f)) << 8;
8854                 FLAG_N = NFLAG_32(res);
8855                 FLAG_Z = res;
8856                 FLAG_V = VFLAG_CLEAR;
8857                 return;
8858         }
8859
8860         FLAG_C = CFLAG_CLEAR;
8861         FLAG_N = NFLAG_32(src);
8862         FLAG_Z = src;
8863         FLAG_V = VFLAG_CLEAR;
8864 }
8865
8866
8867 M68KMAKE_OP(rol, 16, ., .)
8868 {
8869         uint ea = M68KMAKE_GET_EA_AY_16;
8870         uint src = m68ki_read_16(state, ea);
8871         uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
8872
8873         m68ki_write_16(state, ea, res);
8874
8875         FLAG_N = NFLAG_16(res);
8876         FLAG_Z = res;
8877         FLAG_C = src >> 7;
8878         FLAG_V = VFLAG_CLEAR;
8879 }
8880
8881
8882 M68KMAKE_OP(roxr, 8, s, .)
8883 {
8884         uint* r_dst = &DY;
8885         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8886         uint src = MASK_OUT_ABOVE_8(*r_dst);
8887         uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
8888
8889         if(shift != 0)
8890                 USE_CYCLES(shift<<CYC_SHIFT);
8891
8892         FLAG_C = FLAG_X = res;
8893         res = MASK_OUT_ABOVE_8(res);
8894
8895         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8896
8897         FLAG_N = NFLAG_8(res);
8898         FLAG_Z = res;
8899         FLAG_V = VFLAG_CLEAR;
8900 }
8901
8902
8903 M68KMAKE_OP(roxr, 16, s, .)
8904 {
8905         uint* r_dst = &DY;
8906         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8907         uint src = MASK_OUT_ABOVE_16(*r_dst);
8908         uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
8909
8910         if(shift != 0)
8911                 USE_CYCLES(shift<<CYC_SHIFT);
8912
8913         FLAG_C = FLAG_X = res >> 8;
8914         res = MASK_OUT_ABOVE_16(res);
8915
8916         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
8917
8918         FLAG_N = NFLAG_16(res);
8919         FLAG_Z = res;
8920         FLAG_V = VFLAG_CLEAR;
8921 }
8922
8923
8924 M68KMAKE_OP(roxr, 32, s, .)
8925 {
8926 #if M68K_USE_64_BIT
8927
8928         uint*  r_dst = &DY;
8929         uint   shift = (((REG_IR >> 9) - 1) & 7) + 1;
8930         uint64 src   = *r_dst;
8931         uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);
8932
8933         if(shift != 0)
8934                 USE_CYCLES(shift<<CYC_SHIFT);
8935
8936         res = ROR_33_64(res, shift);
8937
8938         FLAG_C = FLAG_X = res >> 24;
8939         res = MASK_OUT_ABOVE_32(res);
8940
8941         *r_dst =  res;
8942
8943         FLAG_N = NFLAG_32(res);
8944         FLAG_Z = res;
8945         FLAG_V = VFLAG_CLEAR;
8946
8947 #else
8948
8949         uint* r_dst = &DY;
8950         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
8951         uint src = *r_dst;
8952         uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
8953         uint new_x_flag = src & (1 << (shift - 1));
8954
8955         if(shift != 0)
8956                 USE_CYCLES(shift<<CYC_SHIFT);
8957
8958         *r_dst = res;
8959
8960         FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
8961         FLAG_N = NFLAG_32(res);
8962         FLAG_Z = res;
8963         FLAG_V = VFLAG_CLEAR;
8964
8965 #endif
8966 }
8967
8968
8969 M68KMAKE_OP(roxr, 8, r, .)
8970 {
8971         uint* r_dst = &DY;
8972         uint orig_shift = DX & 0x3f;
8973
8974         if(orig_shift != 0)
8975         {
8976                 uint shift = orig_shift % 9;
8977                 uint src   = MASK_OUT_ABOVE_8(*r_dst);
8978                 uint res   = ROR_9(src | (XFLAG_AS_1() << 8), shift);
8979
8980                 USE_CYCLES(orig_shift<<CYC_SHIFT);
8981
8982                 FLAG_C = FLAG_X = res;
8983                 res = MASK_OUT_ABOVE_8(res);
8984
8985                 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
8986                 FLAG_N = NFLAG_8(res);
8987                 FLAG_Z = res;
8988                 FLAG_V = VFLAG_CLEAR;
8989                 return;
8990         }
8991
8992         FLAG_C = FLAG_X;
8993         FLAG_N = NFLAG_8(*r_dst);
8994         FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
8995         FLAG_V = VFLAG_CLEAR;
8996 }
8997
8998
8999 M68KMAKE_OP(roxr, 16, r, .)
9000 {
9001         uint* r_dst = &DY;
9002         uint orig_shift = DX & 0x3f;
9003
9004         if(orig_shift != 0)
9005         {
9006                 uint shift = orig_shift % 17;
9007                 uint src   = MASK_OUT_ABOVE_16(*r_dst);
9008                 uint res   = ROR_17(src | (XFLAG_AS_1() << 16), shift);
9009
9010                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9011
9012                 FLAG_C = FLAG_X = res >> 8;
9013                 res = MASK_OUT_ABOVE_16(res);
9014
9015                 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
9016                 FLAG_N = NFLAG_16(res);
9017                 FLAG_Z = res;
9018                 FLAG_V = VFLAG_CLEAR;
9019                 return;
9020         }
9021
9022         FLAG_C = FLAG_X;
9023         FLAG_N = NFLAG_16(*r_dst);
9024         FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
9025         FLAG_V = VFLAG_CLEAR;
9026 }
9027
9028
9029 M68KMAKE_OP(roxr, 32, r, .)
9030 {
9031 #if M68K_USE_64_BIT
9032
9033         uint*  r_dst = &DY;
9034         uint   orig_shift = DX & 0x3f;
9035
9036         if(orig_shift != 0)
9037         {
9038                 uint   shift = orig_shift % 33;
9039                 uint64 src   = *r_dst;
9040                 uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);
9041
9042                 res = ROR_33_64(res, shift);
9043
9044                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9045
9046                 FLAG_C = FLAG_X = res >> 24;
9047                 res = MASK_OUT_ABOVE_32(res);
9048
9049                 *r_dst = res;
9050                 FLAG_N = NFLAG_32(res);
9051                 FLAG_Z = res;
9052                 FLAG_V = VFLAG_CLEAR;
9053                 return;
9054         }
9055
9056         FLAG_C = FLAG_X;
9057         FLAG_N = NFLAG_32(*r_dst);
9058         FLAG_Z = *r_dst;
9059         FLAG_V = VFLAG_CLEAR;
9060
9061 #else
9062
9063         uint* r_dst = &DY;
9064         uint orig_shift = DX & 0x3f;
9065         uint shift = orig_shift % 33;
9066         uint src = *r_dst;
9067         uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
9068         uint new_x_flag = src & (1 << (shift - 1));
9069
9070         if(orig_shift != 0)
9071                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9072
9073         if(shift != 0)
9074         {
9075                 *r_dst = res;
9076                 FLAG_X = (new_x_flag != 0)<<8;
9077         }
9078         else
9079                 res = src;
9080         FLAG_C = FLAG_X;
9081         FLAG_N = NFLAG_32(res);
9082         FLAG_Z = res;
9083         FLAG_V = VFLAG_CLEAR;
9084
9085 #endif
9086 }
9087
9088
9089 M68KMAKE_OP(roxr, 16, ., .)
9090 {
9091         uint ea = M68KMAKE_GET_EA_AY_16;
9092         uint src = m68ki_read_16(state, ea);
9093         uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
9094
9095         FLAG_C = FLAG_X = res >> 8;
9096         res = MASK_OUT_ABOVE_16(res);
9097
9098         m68ki_write_16(state, ea, res);
9099
9100         FLAG_N = NFLAG_16(res);
9101         FLAG_Z = res;
9102         FLAG_V = VFLAG_CLEAR;
9103 }
9104
9105
9106 M68KMAKE_OP(roxl, 8, s, .)
9107 {
9108         uint* r_dst = &DY;
9109         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
9110         uint src = MASK_OUT_ABOVE_8(*r_dst);
9111         uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
9112
9113         if(shift != 0)
9114                 USE_CYCLES(shift<<CYC_SHIFT);
9115
9116         FLAG_C = FLAG_X = res;
9117         res = MASK_OUT_ABOVE_8(res);
9118
9119         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
9120
9121         FLAG_N = NFLAG_8(res);
9122         FLAG_Z = res;
9123         FLAG_V = VFLAG_CLEAR;
9124 }
9125
9126
9127 M68KMAKE_OP(roxl, 16, s, .)
9128 {
9129         uint* r_dst = &DY;
9130         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
9131         uint src = MASK_OUT_ABOVE_16(*r_dst);
9132         uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
9133
9134         if(shift != 0)
9135                 USE_CYCLES(shift<<CYC_SHIFT);
9136
9137         FLAG_C = FLAG_X = res >> 8;
9138         res = MASK_OUT_ABOVE_16(res);
9139
9140         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
9141
9142         FLAG_N = NFLAG_16(res);
9143         FLAG_Z = res;
9144         FLAG_V = VFLAG_CLEAR;
9145 }
9146
9147
9148 M68KMAKE_OP(roxl, 32, s, .)
9149 {
9150 #if M68K_USE_64_BIT
9151
9152         uint*  r_dst = &DY;
9153         uint   shift = (((REG_IR >> 9) - 1) & 7) + 1;
9154         uint64 src   = *r_dst;
9155         uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);
9156
9157         if(shift != 0)
9158                 USE_CYCLES(shift<<CYC_SHIFT);
9159
9160         res = ROL_33_64(res, shift);
9161
9162         FLAG_C = FLAG_X = res >> 24;
9163         res = MASK_OUT_ABOVE_32(res);
9164
9165         *r_dst = res;
9166
9167         FLAG_N = NFLAG_32(res);
9168         FLAG_Z = res;
9169         FLAG_V = VFLAG_CLEAR;
9170
9171 #else
9172
9173         uint* r_dst = &DY;
9174         uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
9175         uint src = *r_dst;
9176         uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
9177         uint new_x_flag = src & (1 << (32 - shift));
9178
9179         if(shift != 0)
9180                 USE_CYCLES(shift<<CYC_SHIFT);
9181
9182         *r_dst = res;
9183
9184         FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
9185         FLAG_N = NFLAG_32(res);
9186         FLAG_Z = res;
9187         FLAG_V = VFLAG_CLEAR;
9188
9189 #endif
9190 }
9191
9192
9193 M68KMAKE_OP(roxl, 8, r, .)
9194 {
9195         uint* r_dst = &DY;
9196         uint orig_shift = DX & 0x3f;
9197
9198
9199         if(orig_shift != 0)
9200         {
9201                 uint shift = orig_shift % 9;
9202                 uint src   = MASK_OUT_ABOVE_8(*r_dst);
9203                 uint res   = ROL_9(src | (XFLAG_AS_1() << 8), shift);
9204
9205                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9206
9207                 FLAG_C = FLAG_X = res;
9208                 res = MASK_OUT_ABOVE_8(res);
9209
9210                 *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
9211                 FLAG_N = NFLAG_8(res);
9212                 FLAG_Z = res;
9213                 FLAG_V = VFLAG_CLEAR;
9214                 return;
9215         }
9216
9217         FLAG_C = FLAG_X;
9218         FLAG_N = NFLAG_8(*r_dst);
9219         FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
9220         FLAG_V = VFLAG_CLEAR;
9221 }
9222
9223
9224 M68KMAKE_OP(roxl, 16, r, .)
9225 {
9226         uint* r_dst = &DY;
9227         uint orig_shift = DX & 0x3f;
9228
9229         if(orig_shift != 0)
9230         {
9231                 uint shift = orig_shift % 17;
9232                 uint src   = MASK_OUT_ABOVE_16(*r_dst);
9233                 uint res   = ROL_17(src | (XFLAG_AS_1() << 16), shift);
9234
9235                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9236
9237                 FLAG_C = FLAG_X = res >> 8;
9238                 res = MASK_OUT_ABOVE_16(res);
9239
9240                 *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
9241                 FLAG_N = NFLAG_16(res);
9242                 FLAG_Z = res;
9243                 FLAG_V = VFLAG_CLEAR;
9244                 return;
9245         }
9246
9247         FLAG_C = FLAG_X;
9248         FLAG_N = NFLAG_16(*r_dst);
9249         FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
9250         FLAG_V = VFLAG_CLEAR;
9251 }
9252
9253
9254 M68KMAKE_OP(roxl, 32, r, .)
9255 {
9256 #if M68K_USE_64_BIT
9257
9258         uint*  r_dst = &DY;
9259         uint   orig_shift = DX & 0x3f;
9260
9261         if(orig_shift != 0)
9262         {
9263                 uint   shift = orig_shift % 33;
9264                 uint64 src   = *r_dst;
9265                 uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);
9266
9267                 res = ROL_33_64(res, shift);
9268
9269                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9270
9271                 FLAG_C = FLAG_X = res >> 24;
9272                 res = MASK_OUT_ABOVE_32(res);
9273
9274                 *r_dst = res;
9275                 FLAG_N = NFLAG_32(res);
9276                 FLAG_Z = res;
9277                 FLAG_V = VFLAG_CLEAR;
9278                 return;
9279         }
9280
9281         FLAG_C = FLAG_X;
9282         FLAG_N = NFLAG_32(*r_dst);
9283         FLAG_Z = *r_dst;
9284         FLAG_V = VFLAG_CLEAR;
9285
9286 #else
9287
9288         uint* r_dst = &DY;
9289         uint orig_shift = DX & 0x3f;
9290         uint shift = orig_shift % 33;
9291         uint src = *r_dst;
9292         uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
9293         uint new_x_flag = src & (1 << (32 - shift));
9294
9295         if(orig_shift != 0)
9296                 USE_CYCLES(orig_shift<<CYC_SHIFT);
9297
9298         if(shift != 0)
9299         {
9300                 *r_dst = res;
9301                 FLAG_X = (new_x_flag != 0)<<8;
9302         }
9303         else
9304                 res = src;
9305         FLAG_C = FLAG_X;
9306         FLAG_N = NFLAG_32(res);
9307         FLAG_Z = res;
9308         FLAG_V = VFLAG_CLEAR;
9309
9310 #endif
9311 }
9312
9313
9314 M68KMAKE_OP(roxl, 16, ., .)
9315 {
9316         uint ea = M68KMAKE_GET_EA_AY_16;
9317         uint src = m68ki_read_16(state, ea);
9318         uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
9319
9320         FLAG_C = FLAG_X = res >> 8;
9321         res = MASK_OUT_ABOVE_16(res);
9322
9323         m68ki_write_16(state, ea, res);
9324
9325         FLAG_N = NFLAG_16(res);
9326         FLAG_Z = res;
9327         FLAG_V = VFLAG_CLEAR;
9328 }
9329
9330
9331 M68KMAKE_OP(rtd, 32, ., .)
9332 {
9333         if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
9334         {
9335                 uint new_pc = m68ki_pull_32(state);
9336
9337                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
9338                 REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16(state)));
9339                 m68ki_jump(state, new_pc);
9340                 return;
9341         }
9342         m68ki_exception_illegal(state);
9343 }
9344
9345
9346 M68KMAKE_OP(rte, 32, ., .)
9347 {
9348         if(FLAG_S)
9349         {
9350                 uint new_sr;
9351                 uint new_pc;
9352                 uint format_word;
9353
9354                 m68ki_rte_callback();              /* auto-disable (see m68kcpu.h) */
9355                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
9356
9357                 if(CPU_TYPE_IS_000(CPU_TYPE))
9358                 {
9359                         new_sr = m68ki_pull_16(state);
9360                         new_pc = m68ki_pull_32(state);
9361                         m68ki_jump(state, new_pc);
9362                         m68ki_set_sr(state, new_sr);
9363
9364                         CPU_INSTR_MODE = INSTRUCTION_YES;
9365                         CPU_RUN_MODE = RUN_MODE_NORMAL;
9366
9367                         return;
9368                 }
9369
9370                 if(CPU_TYPE_IS_010(CPU_TYPE))
9371                 {
9372                         format_word = m68ki_read_16(state, REG_A[7]+6) >> 12;
9373                         if(format_word == 0)
9374                         {
9375                                 new_sr = m68ki_pull_16(state);
9376                                 new_pc = m68ki_pull_32(state);
9377                                 m68ki_fake_pull_16(state);      /* format word */
9378                                 m68ki_jump(state, new_pc);
9379                                 m68ki_set_sr(state, new_sr);
9380                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9381                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9382                                 return;
9383                         } else if (format_word == 8) {
9384                                 /* Format 8 stack frame -- 68010 only. 29 word bus/address error */
9385                                 new_sr = m68ki_pull_16(state);
9386                                 new_pc = m68ki_pull_32(state);
9387                                 m68ki_fake_pull_16(state);      /* format word */
9388                                 m68ki_jump(state, new_pc);
9389                                 m68ki_set_sr(state, new_sr);
9390                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9391                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9392                                 m68ki_fake_pull_16(state);  /* special status */
9393                                 m68ki_fake_pull_32(state);      /* fault address */
9394                                 m68ki_fake_pull_32(state);  /* reserved and data output buffer */
9395                                 m68ki_fake_pull_32(state);  /* reserved and data input buffer */
9396                                 m68ki_fake_pull_32(state);  /* reserved and instruction input buffer */
9397                                 m68ki_fake_pull_32(state);  /* 8 dwords of CPU specific undocumented data */
9398                                 m68ki_fake_pull_32(state);
9399                                 m68ki_fake_pull_32(state);
9400                                 m68ki_fake_pull_32(state);
9401                                 m68ki_fake_pull_32(state);
9402                                 m68ki_fake_pull_32(state);
9403                                 m68ki_fake_pull_32(state);
9404                                 m68ki_fake_pull_32(state);
9405                                 return;
9406                         }
9407                         CPU_INSTR_MODE = INSTRUCTION_YES;
9408                         CPU_RUN_MODE = RUN_MODE_NORMAL;
9409                         /* Not handling other exception types (9) */
9410                         m68ki_exception_format_error(state);
9411                         return;
9412                 }
9413
9414                 /* Otherwise it's 020 */
9415 rte_loop:
9416                 format_word = m68ki_read_16(state, REG_A[7]+6) >> 12;
9417                 switch(format_word)
9418                 {
9419                         case 0: /* Normal */
9420                                 new_sr = m68ki_pull_16(state);
9421                                 new_pc = m68ki_pull_32(state);
9422                                 m68ki_fake_pull_16(state);      /* format word */
9423                                 m68ki_jump(state, new_pc);
9424                                 m68ki_set_sr(state, new_sr);
9425                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9426                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9427                                 return;
9428                         case 1: /* Throwaway */
9429                                 new_sr = m68ki_pull_16(state);
9430                                 m68ki_fake_pull_32(state);      /* program counter */
9431                                 m68ki_fake_pull_16(state);      /* format word */
9432                                 m68ki_set_sr_noint(state, new_sr);
9433                                 goto rte_loop;
9434                         case 2: /* Trap */
9435                                 new_sr = m68ki_pull_16(state);
9436                                 new_pc = m68ki_pull_32(state);
9437                                 m68ki_fake_pull_16(state);      /* format word */
9438                                 m68ki_fake_pull_32(state);      /* address */
9439                                 m68ki_jump(state, new_pc);
9440                                 m68ki_set_sr(state, new_sr);
9441                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9442                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9443                                 return;
9444                         case 7: /* 68040 access error */
9445                                 new_sr = m68ki_pull_16(state);
9446                                 new_pc = m68ki_pull_32(state);
9447                                 m68ki_fake_pull_16(state);   /* $06: format word */
9448                                 m68ki_fake_pull_32(state);   /* $08: effective address */
9449                                 m68ki_fake_pull_16(state);   /* $0c: special status word */
9450                                 m68ki_fake_pull_16(state);   /* $0e: wb3s */
9451                                 m68ki_fake_pull_16(state);   /* $10: wb2s */
9452                                 m68ki_fake_pull_16(state);   /* $12: wb1s */
9453                                 m68ki_fake_pull_32(state);   /* $14: data fault address */
9454                                 m68ki_fake_pull_32(state);   /* $18: wb3a */
9455                                 m68ki_fake_pull_32(state);   /* $1c: wb3d */
9456                                 m68ki_fake_pull_32(state);   /* $20: wb2a */
9457                                 m68ki_fake_pull_32(state);   /* $24: wb2d */
9458                                 m68ki_fake_pull_32(state);   /* $28: wb1a */
9459                                 m68ki_fake_pull_32(state);   /* $2c: wb1d/pd0 */
9460                                 m68ki_fake_pull_32(state);   /* $30: pd1 */
9461                                 m68ki_fake_pull_32(state);   /* $34: pd2 */
9462                                 m68ki_fake_pull_32(state);   /* $38: pd3 */
9463                                 m68ki_jump(state, new_pc);
9464                                 m68ki_set_sr(state, new_sr);
9465                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9466                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9467                                 return;
9468
9469                         case 0x0a: /* Bus Error at instruction boundary */
9470                                 new_sr = m68ki_pull_16(state);
9471                                 new_pc = m68ki_pull_32(state);
9472                                 m68ki_fake_pull_16(state);   /* $06: format word */
9473                                 m68ki_fake_pull_16(state);   /* $08: internal register */
9474                                 m68ki_fake_pull_16(state);   /* $0a: special status word */
9475                                 m68ki_fake_pull_16(state);   /* $0c: instruction pipe stage c */
9476                                 m68ki_fake_pull_16(state);   /* $0e: instruction pipe stage b */
9477                                 m68ki_fake_pull_32(state);   /* $10: data fault address */
9478                                 m68ki_fake_pull_32(state);   /* $14: internal registers */
9479                                 m68ki_fake_pull_32(state);   /* $18: data output buffer */
9480                                 m68ki_fake_pull_32(state);   /* $1c: internal registers */
9481
9482                                 m68ki_jump(state, new_pc);
9483                                 m68ki_set_sr(state, new_sr);
9484                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9485                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9486                                 return;
9487
9488                         case 0x0b: /* Bus Error - Instruction Execution in Progress */
9489                                 new_sr = m68ki_pull_16(state);
9490                                 new_pc = m68ki_pull_32(state);
9491                                 m68ki_fake_pull_16(state);   /* $06: format word */
9492                                 m68ki_fake_pull_16(state);   /* $08: internal register */
9493                                 m68ki_fake_pull_16(state);   /* $0a: special status word */
9494                                 m68ki_fake_pull_16(state);   /* $0c: instruction pipe stage c */
9495                                 m68ki_fake_pull_16(state);   /* $0e: instruction pipe stage b */
9496                                 m68ki_fake_pull_32(state);   /* $10: data fault address */
9497                                 m68ki_fake_pull_32(state);   /* $14: internal registers */
9498                                 m68ki_fake_pull_32(state);   /* $18: data output buffer */
9499                                 m68ki_fake_pull_32(state);   /* $1c: internal registers */
9500                                 m68ki_fake_pull_32(state);   /* $20:  */
9501                                 m68ki_fake_pull_32(state);   /* $24: stage B address */
9502                                 m68ki_fake_pull_32(state);   /* $28:  */
9503                                 m68ki_fake_pull_32(state);   /* $2c: data input buffer */
9504                                 m68ki_fake_pull_32(state);   /* $30:  */
9505                                 m68ki_fake_pull_16(state);   /* $34:  */
9506                                 m68ki_fake_pull_16(state);   /* $36: version #, internal information */
9507                                 m68ki_fake_pull_32(state);   /* $38:  */
9508                                 m68ki_fake_pull_32(state);   /* $3c:  */
9509                                 m68ki_fake_pull_32(state);   /* $40:  */
9510                                 m68ki_fake_pull_32(state);   /* $44:  */
9511                                 m68ki_fake_pull_32(state);   /* $48:  */
9512                                 m68ki_fake_pull_32(state);   /* $4c:  */
9513                                 m68ki_fake_pull_32(state);   /* $50:  */
9514                                 m68ki_fake_pull_32(state);   /* $54:  */
9515                                 m68ki_fake_pull_32(state);   /* $58:  */
9516
9517                                 m68ki_jump(state, new_pc);
9518                                 m68ki_set_sr(state, new_sr);
9519                                 CPU_INSTR_MODE = INSTRUCTION_YES;
9520                                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9521                                 return;
9522                 }
9523                 /* Not handling long or short bus fault */
9524                 CPU_INSTR_MODE = INSTRUCTION_YES;
9525                 CPU_RUN_MODE = RUN_MODE_NORMAL;
9526                 m68ki_exception_format_error(state);
9527                 return;
9528         }
9529         m68ki_exception_privilege_violation(state);
9530 }
9531
9532
9533 M68KMAKE_OP(rtm, 32, ., .)
9534 {
9535         if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
9536         {
9537                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
9538                 M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
9539                                          m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
9540                                          m68ki_disassemble_quick(ADDRESS_68K(REG_PC - 2),CPU_TYPE)));
9541                 return;
9542         }
9543         m68ki_exception_illegal(state);
9544 }
9545
9546
9547 M68KMAKE_OP(rtr, 32, ., .)
9548 {
9549         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
9550         m68ki_set_ccr(state, m68ki_pull_16(state));
9551         m68ki_jump(state, m68ki_pull_32(state));
9552 }
9553
9554
9555 M68KMAKE_OP(rts, 32, ., .)
9556 {
9557         m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */
9558         m68ki_jump(state, m68ki_pull_32(state));
9559 }
9560
9561
9562 M68KMAKE_OP(sbcd, 8, rr, .)
9563 {
9564         uint* r_dst = &DX;
9565         uint src = DY;
9566         uint dst = *r_dst;
9567         uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
9568         uint corf = 0;
9569
9570         if(res > 0xf)
9571                 corf = 6;
9572         res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
9573         FLAG_V = res; /* Undefined V behavior */
9574         if(res > 0xff) {
9575                 res += 0xa0;
9576                 FLAG_X = FLAG_C = CFLAG_SET;
9577         } else if(res < corf)
9578                 FLAG_X = FLAG_C = CFLAG_SET;
9579         else
9580                 FLAG_N = FLAG_X = FLAG_C = 0;
9581
9582         res = MASK_OUT_ABOVE_8(res - corf);
9583
9584         FLAG_V &= ~res; /* Undefined V behavior part II */
9585         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
9586         FLAG_Z |= res;
9587
9588         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
9589 }
9590
9591
9592 M68KMAKE_OP(sbcd, 8, mm, ax7)
9593 {
9594         uint src = OPER_AY_PD_8(state);
9595         uint ea  = EA_A7_PD_8();
9596         uint dst = m68ki_read_8(state, ea);
9597         uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
9598         uint corf = 0;
9599
9600         if(res > 0xf)
9601                 corf = 6;
9602         res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
9603         FLAG_V = res; /* Undefined V behavior */
9604         if(res > 0xff) {
9605                 res += 0xa0;
9606                 FLAG_X = FLAG_C = CFLAG_SET;
9607         } else if(res < corf)
9608                 FLAG_X = FLAG_C = CFLAG_SET;
9609         else
9610                 FLAG_N = FLAG_X = FLAG_C = 0;
9611
9612         res = MASK_OUT_ABOVE_8(res - corf);
9613
9614         FLAG_V &= ~res; /* Undefined V behavior part II */
9615         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
9616         FLAG_Z |= res;
9617
9618         m68ki_write_8(state, ea, res);
9619 }
9620
9621
9622 M68KMAKE_OP(sbcd, 8, mm, ay7)
9623 {
9624         uint src = OPER_A7_PD_8(state);
9625         uint ea  = EA_AX_PD_8();
9626         uint dst = m68ki_read_8(state, ea);
9627         uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
9628         uint corf = 0;
9629
9630         if(res > 0xf)
9631                 corf = 6;
9632         res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
9633         FLAG_V = res; /* Undefined V behavior */
9634         if(res > 0xff) {
9635                 res += 0xa0;
9636                 FLAG_X = FLAG_C = CFLAG_SET;
9637         } else if(res < corf)
9638                 FLAG_X = FLAG_C = CFLAG_SET;
9639         else
9640                 FLAG_N = FLAG_X = FLAG_C = 0;
9641
9642         res = MASK_OUT_ABOVE_8(res - corf);
9643
9644         FLAG_V &= ~res; /* Undefined V behavior part II */
9645         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
9646         FLAG_Z |= res;
9647
9648         m68ki_write_8(state, ea, res);
9649 }
9650
9651
9652 M68KMAKE_OP(sbcd, 8, mm, axy7)
9653 {
9654         uint src = OPER_A7_PD_8(state);
9655         uint ea  = EA_A7_PD_8();
9656         uint dst = m68ki_read_8(state, ea);
9657         uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
9658         uint corf = 0;
9659
9660         if(res > 0xf)
9661                 corf = 6;
9662         res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
9663         FLAG_V = res; /* Undefined V behavior */
9664         if(res > 0xff) {
9665                 res += 0xa0;
9666                 FLAG_X = FLAG_C = CFLAG_SET;
9667         } else if(res < corf)
9668                 FLAG_X = FLAG_C = CFLAG_SET;
9669         else
9670                 FLAG_N = FLAG_X = FLAG_C = 0;
9671
9672         res = MASK_OUT_ABOVE_8(res - corf);
9673
9674         FLAG_V &= ~res; /* Undefined V behavior part II */
9675         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
9676         FLAG_Z |= res;
9677
9678         m68ki_write_8(state, ea, res);
9679 }
9680
9681
9682 M68KMAKE_OP(sbcd, 8, mm, .)
9683 {
9684         uint src = OPER_AY_PD_8(state);
9685         uint ea  = EA_AX_PD_8();
9686         uint dst = m68ki_read_8(state, ea);
9687         uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
9688         uint corf = 0;
9689
9690         if(res > 0xf)
9691                 corf = 6;
9692         res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
9693         FLAG_V = res; /* Undefined V behavior */
9694         if(res > 0xff) {
9695                 res += 0xa0;
9696                 FLAG_X = FLAG_C = CFLAG_SET;
9697         } else if(res < corf)
9698                 FLAG_X = FLAG_C = CFLAG_SET;
9699         else
9700                 FLAG_N = FLAG_X = FLAG_C = 0;
9701
9702         res = MASK_OUT_ABOVE_8(res - corf);
9703
9704         FLAG_V &= ~res; /* Undefined V behavior part II */
9705         FLAG_N = NFLAG_8(res); /* Undefined N behavior */
9706         FLAG_Z |= res;
9707
9708         m68ki_write_8(state, ea, res);
9709 }
9710
9711
9712 M68KMAKE_OP(st, 8, ., d)
9713 {
9714         DY |= 0xff;
9715 }
9716
9717
9718 M68KMAKE_OP(st, 8, ., .)
9719 {
9720         m68ki_write_8(state, M68KMAKE_GET_EA_AY_8, 0xff);
9721 }
9722
9723
9724 M68KMAKE_OP(sf, 8, ., d)
9725 {
9726         DY &= 0xffffff00;
9727 }
9728
9729
9730 M68KMAKE_OP(sf, 8, ., .)
9731 {
9732         m68ki_write_8(state, M68KMAKE_GET_EA_AY_8, 0);
9733 }
9734
9735
9736 M68KMAKE_OP(scc, 8, ., d)
9737 {
9738         if(M68KMAKE_CC)
9739         {
9740                 DY |= 0xff;
9741                 USE_CYCLES(CYC_SCC_R_TRUE);
9742                 return;
9743         }
9744         DY &= 0xffffff00;
9745 }
9746
9747
9748 M68KMAKE_OP(scc, 8, ., .)
9749 {
9750         m68ki_write_8(state, M68KMAKE_GET_EA_AY_8, M68KMAKE_CC ? 0xff : 0);
9751 }
9752
9753
9754 M68KMAKE_OP(stop, 0, ., .)
9755 {
9756         if(FLAG_S)
9757         {
9758                 uint new_sr = OPER_I_16(state);
9759                 m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */
9760                 CPU_STOPPED |= STOP_LEVEL_STOP;
9761                 m68ki_set_sr(state, new_sr);
9762                 if(m68ki_remaining_cycles >= CYC_INSTRUCTION[REG_IR])
9763                         m68ki_remaining_cycles = CYC_INSTRUCTION[REG_IR];
9764                 else
9765                         USE_ALL_CYCLES();
9766                 return;
9767         }
9768         m68ki_exception_privilege_violation(state);
9769 }
9770
9771
9772 M68KMAKE_OP(sub, 8, er, d)
9773 {
9774         uint* r_dst = &DX;
9775         uint src = MASK_OUT_ABOVE_8(DY);
9776         uint dst = MASK_OUT_ABOVE_8(*r_dst);
9777         uint res = dst - src;
9778
9779         FLAG_N = NFLAG_8(res);
9780         FLAG_X = FLAG_C = CFLAG_8(res);
9781         FLAG_V = VFLAG_SUB_8(src, dst, res);
9782         FLAG_Z = MASK_OUT_ABOVE_8(res);
9783
9784         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
9785 }
9786
9787
9788 M68KMAKE_OP(sub, 8, er, .)
9789 {
9790         uint* r_dst = &DX;
9791         uint src = M68KMAKE_GET_OPER_AY_8;
9792         uint dst = MASK_OUT_ABOVE_8(*r_dst);
9793         uint res = dst - src;
9794
9795         FLAG_N = NFLAG_8(res);
9796         FLAG_X = FLAG_C = CFLAG_8(res);
9797         FLAG_V = VFLAG_SUB_8(src, dst, res);
9798         FLAG_Z = MASK_OUT_ABOVE_8(res);
9799
9800         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
9801 }
9802
9803
9804 M68KMAKE_OP(sub, 16, er, d)
9805 {
9806         uint* r_dst = &DX;
9807         uint src = MASK_OUT_ABOVE_16(DY);
9808         uint dst = MASK_OUT_ABOVE_16(*r_dst);
9809         uint res = dst - src;
9810
9811         FLAG_N = NFLAG_16(res);
9812         FLAG_X = FLAG_C = CFLAG_16(res);
9813         FLAG_V = VFLAG_SUB_16(src, dst, res);
9814         FLAG_Z = MASK_OUT_ABOVE_16(res);
9815
9816         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
9817 }
9818
9819
9820 M68KMAKE_OP(sub, 16, er, a)
9821 {
9822         uint* r_dst = &DX;
9823         uint src = MASK_OUT_ABOVE_16(AY);
9824         uint dst = MASK_OUT_ABOVE_16(*r_dst);
9825         uint res = dst - src;
9826
9827         FLAG_N = NFLAG_16(res);
9828         FLAG_X = FLAG_C = CFLAG_16(res);
9829         FLAG_V = VFLAG_SUB_16(src, dst, res);
9830         FLAG_Z = MASK_OUT_ABOVE_16(res);
9831
9832         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
9833 }
9834
9835
9836 M68KMAKE_OP(sub, 16, er, .)
9837 {
9838         uint* r_dst = &DX;
9839         uint src = M68KMAKE_GET_OPER_AY_16;
9840         uint dst = MASK_OUT_ABOVE_16(*r_dst);
9841         uint res = dst - src;
9842
9843         FLAG_N = NFLAG_16(res);
9844         FLAG_X = FLAG_C = CFLAG_16(res);
9845         FLAG_V = VFLAG_SUB_16(src, dst, res);
9846         FLAG_Z = MASK_OUT_ABOVE_16(res);
9847
9848         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
9849 }
9850
9851
9852 M68KMAKE_OP(sub, 32, er, d)
9853 {
9854         uint* r_dst = &DX;
9855         uint src = DY;
9856         uint dst = *r_dst;
9857         uint res = dst - src;
9858
9859         FLAG_N = NFLAG_32(res);
9860         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
9861         FLAG_V = VFLAG_SUB_32(src, dst, res);
9862         FLAG_Z = MASK_OUT_ABOVE_32(res);
9863
9864         *r_dst = FLAG_Z;
9865 }
9866
9867
9868 M68KMAKE_OP(sub, 32, er, a)
9869 {
9870         uint* r_dst = &DX;
9871         uint src = AY;
9872         uint dst = *r_dst;
9873         uint res = dst - src;
9874
9875         FLAG_N = NFLAG_32(res);
9876         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
9877         FLAG_V = VFLAG_SUB_32(src, dst, res);
9878         FLAG_Z = MASK_OUT_ABOVE_32(res);
9879
9880         *r_dst = FLAG_Z;
9881 }
9882
9883
9884 M68KMAKE_OP(sub, 32, er, .)
9885 {
9886         uint* r_dst = &DX;
9887         uint src = M68KMAKE_GET_OPER_AY_32;
9888         uint dst = *r_dst;
9889         uint res = dst - src;
9890
9891         FLAG_N = NFLAG_32(res);
9892         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
9893         FLAG_V = VFLAG_SUB_32(src, dst, res);
9894         FLAG_Z = MASK_OUT_ABOVE_32(res);
9895
9896         *r_dst = FLAG_Z;
9897 }
9898
9899
9900 M68KMAKE_OP(sub, 8, re, .)
9901 {
9902         uint ea = M68KMAKE_GET_EA_AY_8;
9903         uint src = MASK_OUT_ABOVE_8(DX);
9904         uint dst = m68ki_read_8(state, ea);
9905         uint res = dst - src;
9906
9907         FLAG_N = NFLAG_8(res);
9908         FLAG_Z = MASK_OUT_ABOVE_8(res);
9909         FLAG_X = FLAG_C = CFLAG_8(res);
9910         FLAG_V = VFLAG_SUB_8(src, dst, res);
9911
9912         m68ki_write_8(state, ea, FLAG_Z);
9913 }
9914
9915
9916 M68KMAKE_OP(sub, 16, re, .)
9917 {
9918         uint ea = M68KMAKE_GET_EA_AY_16;
9919         uint src = MASK_OUT_ABOVE_16(DX);
9920         uint dst = m68ki_read_16(state, ea);
9921         uint res = dst - src;
9922
9923         FLAG_N = NFLAG_16(res);
9924         FLAG_Z = MASK_OUT_ABOVE_16(res);
9925         FLAG_X = FLAG_C = CFLAG_16(res);
9926         FLAG_V = VFLAG_SUB_16(src, dst, res);
9927
9928         m68ki_write_16(state, ea, FLAG_Z);
9929 }
9930
9931
9932 M68KMAKE_OP(sub, 32, re, .)
9933 {
9934         uint ea = M68KMAKE_GET_EA_AY_32;
9935         uint src = DX;
9936         uint dst = m68ki_read_32(state, ea);
9937         uint res = dst - src;
9938
9939         FLAG_N = NFLAG_32(res);
9940         FLAG_Z = MASK_OUT_ABOVE_32(res);
9941         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
9942         FLAG_V = VFLAG_SUB_32(src, dst, res);
9943
9944         m68ki_write_32(state, ea, FLAG_Z);
9945 }
9946
9947
9948 M68KMAKE_OP(suba, 16, ., d)
9949 {
9950         uint* r_dst = &AX;
9951
9952         *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY));
9953 }
9954
9955
9956 M68KMAKE_OP(suba, 16, ., a)
9957 {
9958         uint* r_dst = &AX;
9959
9960         *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY));
9961 }
9962
9963
9964 M68KMAKE_OP(suba, 16, ., .)
9965 {
9966         uint* r_dst = &AX;
9967         uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
9968
9969         *r_dst = MASK_OUT_ABOVE_32(*r_dst - src);
9970 }
9971
9972
9973 M68KMAKE_OP(suba, 32, ., d)
9974 {
9975         uint* r_dst = &AX;
9976
9977         *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY);
9978 }
9979
9980
9981 M68KMAKE_OP(suba, 32, ., a)
9982 {
9983         uint* r_dst = &AX;
9984
9985         *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY);
9986 }
9987
9988
9989 M68KMAKE_OP(suba, 32, ., .)
9990 {
9991         uint src = M68KMAKE_GET_OPER_AY_32;
9992         uint* r_dst = &AX;
9993
9994         *r_dst = MASK_OUT_ABOVE_32(*r_dst - src);
9995 }
9996
9997
9998 M68KMAKE_OP(subi, 8, ., d)
9999 {
10000         uint* r_dst = &DY;
10001         uint src = OPER_I_8(state);
10002         uint dst = MASK_OUT_ABOVE_8(*r_dst);
10003         uint res = dst - src;
10004
10005         FLAG_N = NFLAG_8(res);
10006         FLAG_Z = MASK_OUT_ABOVE_8(res);
10007         FLAG_X = FLAG_C = CFLAG_8(res);
10008         FLAG_V = VFLAG_SUB_8(src, dst, res);
10009
10010         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
10011 }
10012
10013
10014 M68KMAKE_OP(subi, 8, ., .)
10015 {
10016         uint src = OPER_I_8(state);
10017         uint ea = M68KMAKE_GET_EA_AY_8;
10018         uint dst = m68ki_read_8(state, ea);
10019         uint res = dst - src;
10020
10021         FLAG_N = NFLAG_8(res);
10022         FLAG_Z = MASK_OUT_ABOVE_8(res);
10023         FLAG_X = FLAG_C = CFLAG_8(res);
10024         FLAG_V = VFLAG_SUB_8(src, dst, res);
10025
10026         m68ki_write_8(state, ea, FLAG_Z);
10027 }
10028
10029
10030 M68KMAKE_OP(subi, 16, ., d)
10031 {
10032         uint* r_dst = &DY;
10033         uint src = OPER_I_16(state);
10034         uint dst = MASK_OUT_ABOVE_16(*r_dst);
10035         uint res = dst - src;
10036
10037         FLAG_N = NFLAG_16(res);
10038         FLAG_Z = MASK_OUT_ABOVE_16(res);
10039         FLAG_X = FLAG_C = CFLAG_16(res);
10040         FLAG_V = VFLAG_SUB_16(src, dst, res);
10041
10042         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
10043 }
10044
10045
10046 M68KMAKE_OP(subi, 16, ., .)
10047 {
10048         uint src = OPER_I_16(state);
10049         uint ea = M68KMAKE_GET_EA_AY_16;
10050         uint dst = m68ki_read_16(state, ea);
10051         uint res = dst - src;
10052
10053         FLAG_N = NFLAG_16(res);
10054         FLAG_Z = MASK_OUT_ABOVE_16(res);
10055         FLAG_X = FLAG_C = CFLAG_16(res);
10056         FLAG_V = VFLAG_SUB_16(src, dst, res);
10057
10058         m68ki_write_16(state, ea, FLAG_Z);
10059 }
10060
10061
10062 M68KMAKE_OP(subi, 32, ., d)
10063 {
10064         uint* r_dst = &DY;
10065         uint src = OPER_I_32(state);
10066         uint dst = *r_dst;
10067         uint res = dst - src;
10068
10069         FLAG_N = NFLAG_32(res);
10070         FLAG_Z = MASK_OUT_ABOVE_32(res);
10071         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10072         FLAG_V = VFLAG_SUB_32(src, dst, res);
10073
10074         *r_dst = FLAG_Z;
10075 }
10076
10077
10078 M68KMAKE_OP(subi, 32, ., .)
10079 {
10080         uint src = OPER_I_32(state);
10081         uint ea = M68KMAKE_GET_EA_AY_32;
10082         uint dst = m68ki_read_32(state, ea);
10083         uint res = dst - src;
10084
10085         FLAG_N = NFLAG_32(res);
10086         FLAG_Z = MASK_OUT_ABOVE_32(res);
10087         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10088         FLAG_V = VFLAG_SUB_32(src, dst, res);
10089
10090         m68ki_write_32(state, ea, FLAG_Z);
10091 }
10092
10093
10094 M68KMAKE_OP(subq, 8, ., d)
10095 {
10096         uint* r_dst = &DY;
10097         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10098         uint dst = MASK_OUT_ABOVE_8(*r_dst);
10099         uint res = dst - src;
10100
10101         FLAG_N = NFLAG_8(res);
10102         FLAG_Z = MASK_OUT_ABOVE_8(res);
10103         FLAG_X = FLAG_C = CFLAG_8(res);
10104         FLAG_V = VFLAG_SUB_8(src, dst, res);
10105
10106         *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
10107 }
10108
10109
10110 M68KMAKE_OP(subq, 8, ., .)
10111 {
10112         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10113         uint ea = M68KMAKE_GET_EA_AY_8;
10114         uint dst = m68ki_read_8(state, ea);
10115         uint res = dst - src;
10116
10117         FLAG_N = NFLAG_8(res);
10118         FLAG_Z = MASK_OUT_ABOVE_8(res);
10119         FLAG_X = FLAG_C = CFLAG_8(res);
10120         FLAG_V = VFLAG_SUB_8(src, dst, res);
10121
10122         m68ki_write_8(state, ea, FLAG_Z);
10123 }
10124
10125
10126 M68KMAKE_OP(subq, 16, ., d)
10127 {
10128         uint* r_dst = &DY;
10129         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10130         uint dst = MASK_OUT_ABOVE_16(*r_dst);
10131         uint res = dst - src;
10132
10133         FLAG_N = NFLAG_16(res);
10134         FLAG_Z = MASK_OUT_ABOVE_16(res);
10135         FLAG_X = FLAG_C = CFLAG_16(res);
10136         FLAG_V = VFLAG_SUB_16(src, dst, res);
10137
10138         *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
10139 }
10140
10141
10142 M68KMAKE_OP(subq, 16, ., a)
10143 {
10144         uint* r_dst = &AY;
10145
10146         *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
10147 }
10148
10149
10150 M68KMAKE_OP(subq, 16, ., .)
10151 {
10152         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10153         uint ea = M68KMAKE_GET_EA_AY_16;
10154         uint dst = m68ki_read_16(state, ea);
10155         uint res = dst - src;
10156
10157         FLAG_N = NFLAG_16(res);
10158         FLAG_Z = MASK_OUT_ABOVE_16(res);
10159         FLAG_X = FLAG_C = CFLAG_16(res);
10160         FLAG_V = VFLAG_SUB_16(src, dst, res);
10161
10162         m68ki_write_16(state, ea, FLAG_Z);
10163 }
10164
10165
10166 M68KMAKE_OP(subq, 32, ., d)
10167 {
10168         uint* r_dst = &DY;
10169         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10170         uint dst = *r_dst;
10171         uint res = dst - src;
10172
10173         FLAG_N = NFLAG_32(res);
10174         FLAG_Z = MASK_OUT_ABOVE_32(res);
10175         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10176         FLAG_V = VFLAG_SUB_32(src, dst, res);
10177
10178         *r_dst = FLAG_Z;
10179 }
10180
10181
10182 M68KMAKE_OP(subq, 32, ., a)
10183 {
10184         uint* r_dst = &AY;
10185
10186         *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
10187 }
10188
10189
10190 M68KMAKE_OP(subq, 32, ., .)
10191 {
10192         uint src = (((REG_IR >> 9) - 1) & 7) + 1;
10193         uint ea = M68KMAKE_GET_EA_AY_32;
10194         uint dst = m68ki_read_32(state, ea);
10195         uint res = dst - src;
10196
10197         FLAG_N = NFLAG_32(res);
10198         FLAG_Z = MASK_OUT_ABOVE_32(res);
10199         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10200         FLAG_V = VFLAG_SUB_32(src, dst, res);
10201
10202         m68ki_write_32(state, ea, FLAG_Z);
10203 }
10204
10205
10206 M68KMAKE_OP(subx, 8, rr, .)
10207 {
10208         uint* r_dst = &DX;
10209         uint src = MASK_OUT_ABOVE_8(DY);
10210         uint dst = MASK_OUT_ABOVE_8(*r_dst);
10211         uint res = dst - src - XFLAG_AS_1();
10212
10213         FLAG_N = NFLAG_8(res);
10214         FLAG_X = FLAG_C = CFLAG_8(res);
10215         FLAG_V = VFLAG_SUB_8(src, dst, res);
10216
10217         res = MASK_OUT_ABOVE_8(res);
10218         FLAG_Z |= res;
10219
10220         *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
10221 }
10222
10223
10224 M68KMAKE_OP(subx, 16, rr, .)
10225 {
10226         uint* r_dst = &DX;
10227         uint src = MASK_OUT_ABOVE_16(DY);
10228         uint dst = MASK_OUT_ABOVE_16(*r_dst);
10229         uint res = dst - src - XFLAG_AS_1();
10230
10231         FLAG_N = NFLAG_16(res);
10232         FLAG_X = FLAG_C = CFLAG_16(res);
10233         FLAG_V = VFLAG_SUB_16(src, dst, res);
10234
10235         res = MASK_OUT_ABOVE_16(res);
10236         FLAG_Z |= res;
10237
10238         *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
10239 }
10240
10241
10242 M68KMAKE_OP(subx, 32, rr, .)
10243 {
10244         uint* r_dst = &DX;
10245         uint src = DY;
10246         uint dst = *r_dst;
10247         uint res = dst - src - XFLAG_AS_1();
10248
10249         FLAG_N = NFLAG_32(res);
10250         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10251         FLAG_V = VFLAG_SUB_32(src, dst, res);
10252
10253         res = MASK_OUT_ABOVE_32(res);
10254         FLAG_Z |= res;
10255
10256         *r_dst = res;
10257 }
10258
10259
10260 M68KMAKE_OP(subx, 8, mm, ax7)
10261 {
10262         uint src = OPER_AY_PD_8(state);
10263         uint ea  = EA_A7_PD_8();
10264         uint dst = m68ki_read_8(state, ea);
10265         uint res = dst - src - XFLAG_AS_1();
10266
10267         FLAG_N = NFLAG_8(res);
10268         FLAG_X = FLAG_C = CFLAG_8(res);
10269         FLAG_V = VFLAG_SUB_8(src, dst, res);
10270
10271         res = MASK_OUT_ABOVE_8(res);
10272         FLAG_Z |= res;
10273
10274         m68ki_write_8(state, ea, res);
10275 }
10276
10277
10278 M68KMAKE_OP(subx, 8, mm, ay7)
10279 {
10280         uint src = OPER_A7_PD_8(state);
10281         uint ea  = EA_AX_PD_8();
10282         uint dst = m68ki_read_8(state, ea);
10283         uint res = dst - src - XFLAG_AS_1();
10284
10285         FLAG_N = NFLAG_8(res);
10286         FLAG_X = FLAG_C = CFLAG_8(res);
10287         FLAG_V = VFLAG_SUB_8(src, dst, res);
10288
10289         res = MASK_OUT_ABOVE_8(res);
10290         FLAG_Z |= res;
10291
10292         m68ki_write_8(state, ea, res);
10293 }
10294
10295
10296 M68KMAKE_OP(subx, 8, mm, axy7)
10297 {
10298         uint src = OPER_A7_PD_8(state);
10299         uint ea  = EA_A7_PD_8();
10300         uint dst = m68ki_read_8(state, ea);
10301         uint res = dst - src - XFLAG_AS_1();
10302
10303         FLAG_N = NFLAG_8(res);
10304         FLAG_X = FLAG_C = CFLAG_8(res);
10305         FLAG_V = VFLAG_SUB_8(src, dst, res);
10306
10307         res = MASK_OUT_ABOVE_8(res);
10308         FLAG_Z |= res;
10309
10310         m68ki_write_8(state, ea, res);
10311 }
10312
10313
10314 M68KMAKE_OP(subx, 8, mm, .)
10315 {
10316         uint src = OPER_AY_PD_8(state);
10317         uint ea  = EA_AX_PD_8();
10318         uint dst = m68ki_read_8(state, ea);
10319         uint res = dst - src - XFLAG_AS_1();
10320
10321         FLAG_N = NFLAG_8(res);
10322         FLAG_X = FLAG_C = CFLAG_8(res);
10323         FLAG_V = VFLAG_SUB_8(src, dst, res);
10324
10325         res = MASK_OUT_ABOVE_8(res);
10326         FLAG_Z |= res;
10327
10328         m68ki_write_8(state, ea, res);
10329 }
10330
10331
10332 M68KMAKE_OP(subx, 16, mm, .)
10333 {
10334         uint src = OPER_AY_PD_16(state);
10335         uint ea  = EA_AX_PD_16();
10336         uint dst = m68ki_read_16(state, ea);
10337         uint res = dst - src - XFLAG_AS_1();
10338
10339         FLAG_N = NFLAG_16(res);
10340         FLAG_X = FLAG_C = CFLAG_16(res);
10341         FLAG_V = VFLAG_SUB_16(src, dst, res);
10342
10343         res = MASK_OUT_ABOVE_16(res);
10344         FLAG_Z |= res;
10345
10346         m68ki_write_16(state, ea, res);
10347 }
10348
10349
10350 M68KMAKE_OP(subx, 32, mm, .)
10351 {
10352         uint src = OPER_AY_PD_32(state);
10353         uint ea  = EA_AX_PD_32();
10354         uint dst = m68ki_read_32(state, ea);
10355         uint res = dst - src - XFLAG_AS_1();
10356
10357         FLAG_N = NFLAG_32(res);
10358         FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
10359         FLAG_V = VFLAG_SUB_32(src, dst, res);
10360
10361         res = MASK_OUT_ABOVE_32(res);
10362         FLAG_Z |= res;
10363
10364         m68ki_write_32(state, ea, res);
10365 }
10366
10367
10368 M68KMAKE_OP(swap, 32, ., .)
10369 {
10370         uint* r_dst = &DY;
10371
10372         FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16);
10373         *r_dst = (*r_dst>>16) | FLAG_Z;
10374
10375         FLAG_Z = *r_dst;
10376         FLAG_N = NFLAG_32(*r_dst);
10377         FLAG_C = CFLAG_CLEAR;
10378         FLAG_V = VFLAG_CLEAR;
10379 }
10380
10381
10382 M68KMAKE_OP(tas, 8, ., d)
10383 {
10384         uint* r_dst = &DY;
10385
10386         FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
10387         FLAG_N = NFLAG_8(*r_dst);
10388         FLAG_V = VFLAG_CLEAR;
10389         FLAG_C = CFLAG_CLEAR;
10390         *r_dst |= 0x80;
10391 }
10392
10393
10394 M68KMAKE_OP(tas, 8, ., .)
10395 {
10396         uint ea = M68KMAKE_GET_EA_AY_8;
10397         uint dst = m68ki_read_8(state, ea);
10398         uint allow_writeback;
10399
10400         FLAG_Z = dst;
10401         FLAG_N = NFLAG_8(dst);
10402         FLAG_V = VFLAG_CLEAR;
10403         FLAG_C = CFLAG_CLEAR;
10404
10405         /* The Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS writeback
10406        disabled in order to function properly.  Some Amiga software may also rely
10407        on this, but only when accessing specific addresses so additional functionality
10408        will be needed. */
10409         allow_writeback = m68ki_tas_callback();
10410
10411         if (allow_writeback==1) m68ki_write_8(state, ea, dst | 0x80);
10412 }
10413
10414
10415 M68KMAKE_OP(trap, 0, ., .)
10416 {
10417         /* Trap#n stacks exception frame type 0 */
10418         m68ki_exception_trapN(state, EXCEPTION_TRAP_BASE + (REG_IR & 0xf));     /* HJB 990403 */
10419 }
10420
10421
10422 M68KMAKE_OP(trapt, 0, ., .)
10423 {
10424         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10425         {
10426                 m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10427                 return;
10428         }
10429         m68ki_exception_illegal(state);
10430 }
10431
10432
10433 M68KMAKE_OP(trapt, 16, ., .)
10434 {
10435         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10436         {
10437         // TODO: review this... as mame is not using it...
10438         REG_PC += 2; // JFF else stackframe & return addresses are incorrect
10439                 m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10440                 return;
10441         }
10442         m68ki_exception_illegal(state);
10443 }
10444
10445
10446 M68KMAKE_OP(trapt, 32, ., .)
10447 {
10448         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10449         {
10450         // TODO: review this... as mame is not using it...
10451         REG_PC += 4; // JFF else stackframe & return addresses are incorrect
10452                 m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10453                 return;
10454         }
10455         m68ki_exception_illegal(state);
10456 }
10457
10458
10459 M68KMAKE_OP(trapf, 0, ., .)
10460 {
10461         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10462         {
10463                 return;
10464         }
10465         m68ki_exception_illegal(state);
10466 }
10467
10468
10469 M68KMAKE_OP(trapf, 16, ., .)
10470 {
10471         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10472         {
10473                 REG_PC += 2;
10474                 return;
10475         }
10476         m68ki_exception_illegal(state);
10477 }
10478
10479
10480 M68KMAKE_OP(trapf, 32, ., .)
10481 {
10482         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10483         {
10484                 REG_PC += 4;
10485                 return;
10486         }
10487         m68ki_exception_illegal(state);
10488 }
10489
10490
10491 M68KMAKE_OP(trapcc, 0, ., .)
10492 {
10493         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10494         {
10495                 if(M68KMAKE_CC)
10496                         m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10497                 return;
10498         }
10499         m68ki_exception_illegal(state);
10500 }
10501
10502
10503 M68KMAKE_OP(trapcc, 16, ., .)
10504 {
10505         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10506         {
10507         // TODO: review this... as mame is not using it...
10508         REG_PC += 2;  /* JFF increase before or 1) stackframe is incorrect 2) RTE address is wrong if trap is taken */
10509                 if(M68KMAKE_CC)
10510                 {
10511                         m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10512                         return;
10513                 }
10514
10515                 return;
10516         }
10517         m68ki_exception_illegal(state);
10518 }
10519
10520
10521 M68KMAKE_OP(trapcc, 32, ., .)
10522 {
10523         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10524         {
10525         // TODO: review this... as mame is not using it...
10526                 REG_PC += 4;  /* JFF increase before or 1) stackframe is incorrect 2) RTE address is wrong if trap is taken */
10527                 if(M68KMAKE_CC)
10528                 {
10529                         m68ki_exception_trap(state, EXCEPTION_TRAPV);   /* HJB 990403 */
10530                         return;
10531                 }
10532                 return;
10533         }
10534         m68ki_exception_illegal(state);
10535 }
10536
10537
10538 M68KMAKE_OP(trapv, 0, ., .)
10539 {
10540         if(COND_VC())
10541         {
10542                 return;
10543         }
10544         m68ki_exception_trap(state, EXCEPTION_TRAPV);  /* HJB 990403 */
10545 }
10546
10547
10548 M68KMAKE_OP(tst, 8, ., d)
10549 {
10550         uint res = MASK_OUT_ABOVE_8(DY);
10551
10552         FLAG_N = NFLAG_8(res);
10553         FLAG_Z = res;
10554         FLAG_V = VFLAG_CLEAR;
10555         FLAG_C = CFLAG_CLEAR;
10556 }
10557
10558
10559 M68KMAKE_OP(tst, 8, ., .)
10560 {
10561         uint res = M68KMAKE_GET_OPER_AY_8;
10562
10563         FLAG_N = NFLAG_8(res);
10564         FLAG_Z = res;
10565         FLAG_V = VFLAG_CLEAR;
10566         FLAG_C = CFLAG_CLEAR;
10567 }
10568
10569
10570 M68KMAKE_OP(tst, 8, ., pcdi)
10571 {
10572         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10573         {
10574                 uint res = OPER_PCDI_8(state);
10575
10576                 FLAG_N = NFLAG_8(res);
10577                 FLAG_Z = res;
10578                 FLAG_V = VFLAG_CLEAR;
10579                 FLAG_C = CFLAG_CLEAR;
10580                 return;
10581         }
10582         m68ki_exception_illegal(state);
10583 }
10584
10585
10586 M68KMAKE_OP(tst, 8, ., pcix)
10587 {
10588         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10589         {
10590                 uint res = OPER_PCIX_8(state);
10591
10592                 FLAG_N = NFLAG_8(res);
10593                 FLAG_Z = res;
10594                 FLAG_V = VFLAG_CLEAR;
10595                 FLAG_C = CFLAG_CLEAR;
10596                 return;
10597         }
10598         m68ki_exception_illegal(state);
10599 }
10600
10601
10602 M68KMAKE_OP(tst, 8, ., i)
10603 {
10604         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10605         {
10606                 uint res = OPER_I_8(state);
10607
10608                 FLAG_N = NFLAG_8(res);
10609                 FLAG_Z = res;
10610                 FLAG_V = VFLAG_CLEAR;
10611                 FLAG_C = CFLAG_CLEAR;
10612                 return;
10613         }
10614         m68ki_exception_illegal(state);
10615 }
10616
10617
10618 M68KMAKE_OP(tst, 16, ., d)
10619 {
10620         uint res = MASK_OUT_ABOVE_16(DY);
10621
10622         FLAG_N = NFLAG_16(res);
10623         FLAG_Z = res;
10624         FLAG_V = VFLAG_CLEAR;
10625         FLAG_C = CFLAG_CLEAR;
10626 }
10627
10628
10629 M68KMAKE_OP(tst, 16, ., a)
10630 {
10631         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10632         {
10633                 uint res = MAKE_INT_16(AY);
10634
10635                 FLAG_N = NFLAG_16(res);
10636                 FLAG_Z = res;
10637                 FLAG_V = VFLAG_CLEAR;
10638                 FLAG_C = CFLAG_CLEAR;
10639                 return;
10640         }
10641         m68ki_exception_illegal(state);
10642 }
10643
10644
10645 M68KMAKE_OP(tst, 16, ., .)
10646 {
10647         uint res = M68KMAKE_GET_OPER_AY_16;
10648
10649         FLAG_N = NFLAG_16(res);
10650         FLAG_Z = res;
10651         FLAG_V = VFLAG_CLEAR;
10652         FLAG_C = CFLAG_CLEAR;
10653 }
10654
10655
10656 M68KMAKE_OP(tst, 16, ., pcdi)
10657 {
10658         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10659         {
10660                 uint res = OPER_PCDI_16(state);
10661
10662                 FLAG_N = NFLAG_16(res);
10663                 FLAG_Z = res;
10664                 FLAG_V = VFLAG_CLEAR;
10665                 FLAG_C = CFLAG_CLEAR;
10666                 return;
10667         }
10668         m68ki_exception_illegal(state);
10669 }
10670
10671
10672 M68KMAKE_OP(tst, 16, ., pcix)
10673 {
10674         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10675         {
10676                 uint res = OPER_PCIX_16(state);
10677
10678                 FLAG_N = NFLAG_16(res);
10679                 FLAG_Z = res;
10680                 FLAG_V = VFLAG_CLEAR;
10681                 FLAG_C = CFLAG_CLEAR;
10682                 return;
10683         }
10684         m68ki_exception_illegal(state);
10685 }
10686
10687
10688 M68KMAKE_OP(tst, 16, ., i)
10689 {
10690         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10691         {
10692                 uint res = OPER_I_16(state);
10693
10694                 FLAG_N = NFLAG_16(res);
10695                 FLAG_Z = res;
10696                 FLAG_V = VFLAG_CLEAR;
10697                 FLAG_C = CFLAG_CLEAR;
10698                 return;
10699         }
10700         m68ki_exception_illegal(state);
10701 }
10702
10703
10704 M68KMAKE_OP(tst, 32, ., d)
10705 {
10706         uint res = DY;
10707
10708         FLAG_N = NFLAG_32(res);
10709         FLAG_Z = res;
10710         FLAG_V = VFLAG_CLEAR;
10711         FLAG_C = CFLAG_CLEAR;
10712 }
10713
10714
10715 M68KMAKE_OP(tst, 32, ., a)
10716 {
10717         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10718         {
10719                 uint res = AY;
10720
10721                 FLAG_N = NFLAG_32(res);
10722                 FLAG_Z = res;
10723                 FLAG_V = VFLAG_CLEAR;
10724                 FLAG_C = CFLAG_CLEAR;
10725                 return;
10726         }
10727         m68ki_exception_illegal(state);
10728 }
10729
10730
10731 M68KMAKE_OP(tst, 32, ., .)
10732 {
10733         uint res = M68KMAKE_GET_OPER_AY_32;
10734
10735         FLAG_N = NFLAG_32(res);
10736         FLAG_Z = res;
10737         FLAG_V = VFLAG_CLEAR;
10738         FLAG_C = CFLAG_CLEAR;
10739 }
10740
10741
10742 M68KMAKE_OP(tst, 32, ., pcdi)
10743 {
10744         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10745         {
10746                 uint res = OPER_PCDI_32(state);
10747
10748                 FLAG_N = NFLAG_32(res);
10749                 FLAG_Z = res;
10750                 FLAG_V = VFLAG_CLEAR;
10751                 FLAG_C = CFLAG_CLEAR;
10752                 return;
10753         }
10754         m68ki_exception_illegal(state);
10755 }
10756
10757
10758 M68KMAKE_OP(tst, 32, ., pcix)
10759 {
10760         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10761         {
10762                 uint res = OPER_PCIX_32(state);
10763
10764                 FLAG_N = NFLAG_32(res);
10765                 FLAG_Z = res;
10766                 FLAG_V = VFLAG_CLEAR;
10767                 FLAG_C = CFLAG_CLEAR;
10768                 return;
10769         }
10770         m68ki_exception_illegal(state);
10771 }
10772
10773
10774 M68KMAKE_OP(tst, 32, ., i)
10775 {
10776         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10777         {
10778                 uint res = OPER_I_32(state);
10779
10780                 FLAG_N = NFLAG_32(res);
10781                 FLAG_Z = res;
10782                 FLAG_V = VFLAG_CLEAR;
10783                 FLAG_C = CFLAG_CLEAR;
10784                 return;
10785         }
10786         m68ki_exception_illegal(state);
10787 }
10788
10789
10790 M68KMAKE_OP(unlk, 32, ., a7)
10791 {
10792         REG_A[7] = m68ki_read_32(state, REG_A[7]);
10793 }
10794
10795
10796 M68KMAKE_OP(unlk, 32, ., .)
10797 {
10798         uint* r_dst = &AY;
10799
10800         REG_A[7] = *r_dst;
10801         *r_dst = m68ki_pull_32(state);
10802 }
10803
10804
10805 M68KMAKE_OP(unpk, 16, rr, .)
10806 {
10807         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10808         {
10809                 /* Note: DX and DY are reversed in Motorola's docs */
10810                 uint src = DY;
10811                 uint* r_dst = &DX;
10812
10813                 *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(state)) & 0xffff);
10814                 return;
10815         }
10816         m68ki_exception_illegal(state);
10817 }
10818
10819
10820 M68KMAKE_OP(unpk, 16, mm, ax7)
10821 {
10822         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10823         {
10824                 /* Note: AX and AY are reversed in Motorola's docs */
10825                 uint src = OPER_AY_PD_8(state);
10826                 uint ea_dst;
10827
10828                 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(state);
10829                 ea_dst = EA_A7_PD_8();
10830                 m68ki_write_8(state, ea_dst, src & 0xff);
10831                 ea_dst = EA_A7_PD_8();
10832                 m68ki_write_8(state, ea_dst, (src >> 8) & 0xff);
10833                 return;
10834         }
10835         m68ki_exception_illegal(state);
10836 }
10837
10838
10839 M68KMAKE_OP(unpk, 16, mm, ay7)
10840 {
10841         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10842         {
10843                 /* Note: AX and AY are reversed in Motorola's docs */
10844                 uint src = OPER_A7_PD_8(state);
10845                 uint ea_dst;
10846
10847                 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(state);
10848                 ea_dst = EA_AX_PD_8();
10849                 m68ki_write_8(state, ea_dst, src & 0xff);
10850                 ea_dst = EA_AX_PD_8();
10851                 m68ki_write_8(state, ea_dst, (src >> 8) & 0xff);
10852                 return;
10853         }
10854         m68ki_exception_illegal(state);
10855 }
10856
10857
10858 M68KMAKE_OP(unpk, 16, mm, axy7)
10859 {
10860         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10861         {
10862                 uint src = OPER_A7_PD_8(state);
10863                 uint ea_dst;
10864
10865                 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(state);
10866                 ea_dst = EA_A7_PD_8();
10867                 m68ki_write_8(state, ea_dst, src & 0xff);
10868                 ea_dst = EA_A7_PD_8();
10869                 m68ki_write_8(state, ea_dst, (src >> 8) & 0xff);
10870                 return;
10871         }
10872         m68ki_exception_illegal(state);
10873 }
10874
10875
10876 M68KMAKE_OP(unpk, 16, mm, .)
10877 {
10878         if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
10879         {
10880                 /* Note: AX and AY are reversed in Motorola's docs */
10881                 uint src = OPER_AY_PD_8(state);
10882                 uint ea_dst;
10883
10884                 src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(state);
10885                 ea_dst = EA_AX_PD_8();
10886                 m68ki_write_8(state, ea_dst, src & 0xff);
10887                 ea_dst = EA_AX_PD_8();
10888                 m68ki_write_8(state, ea_dst, (src >> 8) & 0xff);
10889                 return;
10890         }
10891         m68ki_exception_illegal(state);
10892 }
10893
10894
10895
10896 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
10897 M68KMAKE_END