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