Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

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