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