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