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