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