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