summaryrefslogtreecommitdiff
path: root/plugins/ao/eng_ssf
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-06-22 22:26:45 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-06-22 22:26:45 +0200
commit20575a338e9640eca924958484a5fee800e09971 (patch)
treeefaeac41a8a21bea1c90494b3b0968169d4f8732 /plugins/ao/eng_ssf
parentc901a7cbf52ee234220f21b85c2e77667264d16c (diff)
audio overload plugin - highly experimental; no seeking; crashes
Diffstat (limited to 'plugins/ao/eng_ssf')
-rw-r--r--plugins/ao/eng_ssf/eng_ssf.c316
-rw-r--r--plugins/ao/eng_ssf/m68k.h343
-rw-r--r--plugins/ao/eng_ssf/m68k_in.c10336
-rw-r--r--plugins/ao/eng_ssf/m68kconf.h181
-rw-r--r--plugins/ao/eng_ssf/m68kcpu.c879
-rw-r--r--plugins/ao/eng_ssf/m68kcpu.h1973
-rw-r--r--plugins/ao/eng_ssf/m68kmake.c1421
-rw-r--r--plugins/ao/eng_ssf/m68kmame.h172
-rw-r--r--plugins/ao/eng_ssf/m68kopac.c12042
-rw-r--r--plugins/ao/eng_ssf/m68kopdm.c13221
-rw-r--r--plugins/ao/eng_ssf/m68kopnz.c8780
-rw-r--r--plugins/ao/eng_ssf/m68kops.c2093
-rw-r--r--plugins/ao/eng_ssf/m68kops.h1984
-rw-r--r--plugins/ao/eng_ssf/sat_hw.c170
-rw-r--r--plugins/ao/eng_ssf/sat_hw.h35
-rw-r--r--plugins/ao/eng_ssf/scsp.c1268
-rw-r--r--plugins/ao/eng_ssf/scsp.h43
-rw-r--r--plugins/ao/eng_ssf/scspdsp.c349
-rw-r--r--plugins/ao/eng_ssf/scspdsp.h37
-rw-r--r--plugins/ao/eng_ssf/scsplfo.c157
20 files changed, 55800 insertions, 0 deletions
diff --git a/plugins/ao/eng_ssf/eng_ssf.c b/plugins/ao/eng_ssf/eng_ssf.c
new file mode 100644
index 00000000..59988209
--- /dev/null
+++ b/plugins/ao/eng_ssf/eng_ssf.c
@@ -0,0 +1,316 @@
+/*
+ Audio Overload SDK - SSF file format engine
+
+ Copyright (c) 2007 R. Belmont and Richard Bannister.
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the names of R. Belmont and Richard Bannister nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+
+Sega driver commands:
+
+00 - NOP
+01 - SEQUENCE_START
+02 - SEQUENCE_STOP
+03 - SEQUENCE_PAUSE
+04 - SEQUENCE_CONTINUE
+05 - SEQUENCE_VOLUME
+06 - SEQUENCE_ALLSTOP
+07 - SEQUENCE_TEMPO
+08 - SEQUENCE_MAP
+09 - HOST_MIDI
+0A - VOLUME_ANALYZE_START
+0B - VOLUME_ANALYZE_STOP
+0C - DSP CLEAR
+0D - ALL OFF
+0E - SEQUENCE PAN
+0F - N/A
+10 - SOUND INITIALIZE
+11 - Yamaha 3D check (8C)
+12 - QSound check (8B)
+13 - Yamaha 3D init (8D)
+80 - CD level
+81 - CD pan
+82 - MASTER VOLUME
+83 - EFFECT_CHANGE
+84 - NOP
+85 - PCM stream play start
+86 - PCM stream play end
+87 - MIXER_CHANGE
+88 - Mixer parameter change
+89 - Hardware check
+8A - PCM parameter change
+8B - QSound check
+8C - Yamaha 3D check
+8D - Yamaha 3D init
+
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "ao.h"
+#include "eng_protos.h"
+#include "corlett.h"
+#include "sat_hw.h"
+#include "scsp.h"
+
+#define DEBUG_LOADER (0)
+
+static corlett_t *c = NULL;
+static char psfby[256];
+static uint32 decaybegin, decayend, total_samples;
+
+void *scsp_start(const void *config);
+void SCSP_Update(void *param, INT16 **inputs, INT16 **buf, int samples);
+
+int32 ssf_start(uint8 *buffer, uint32 length)
+{
+ uint8 *file, *lib_decoded, *lib_raw_file;
+ uint32 offset, plength, lengthMS, fadeMS;
+ uint64 file_len, lib_len, lib_raw_length;
+ corlett_t *lib;
+ char *libfile;
+ int i;
+
+ // clear Saturn work RAM before we start scribbling in it
+ memset(sat_ram, 0, 512*1024);
+
+ // Decode the current SSF
+ if (corlett_decode(buffer, length, &file, &file_len, &c) != AO_SUCCESS)
+ {
+ return AO_FAIL;
+ }
+
+ #if DEBUG_LOADER
+ printf("%d bytes decoded\n", file_len);
+ #endif
+
+ // Get the library file, if any
+ for (i=0; i<9; i++)
+ {
+ libfile = i ? c->libaux[i-1] : c->lib;
+ if (libfile[0] != 0)
+ {
+ uint64 tmp_length;
+
+ #if DEBUG_LOADER
+ printf("Loading library: %s\n", c->lib);
+ #endif
+ if (ao_get_lib(libfile, &lib_raw_file, &tmp_length) != AO_SUCCESS)
+ {
+ return AO_FAIL;
+ }
+ lib_raw_length = tmp_length;
+
+ if (corlett_decode(lib_raw_file, lib_raw_length, &lib_decoded, &lib_len, &lib) != AO_SUCCESS)
+ {
+ free(lib_raw_file);
+ return AO_FAIL;
+ }
+
+ // Free up raw file
+ free(lib_raw_file);
+
+ // patch the file into ram
+ offset = lib_decoded[0] | lib_decoded[1]<<8 | lib_decoded[2]<<16 | lib_decoded[3]<<24;
+
+ // guard against invalid data
+ if ((offset + (lib_len-4)) > 0x7ffff)
+ {
+ lib_len = 0x80000-offset+4;
+ }
+ memcpy(&sat_ram[offset], lib_decoded+4, lib_len-4);
+
+ // Dispose the corlett structure for the lib - we don't use it
+ free(lib);
+ }
+ }
+
+ // now patch the file into RAM over the libraries
+ offset = file[3]<<24 | file[2]<<16 | file[1]<<8 | file[0];
+
+ // guard against invalid data
+ if ((offset + (file_len-4)) > 0x7ffff)
+ {
+ file_len = 0x80000-offset+4;
+ }
+
+ memcpy(&sat_ram[offset], file+4, file_len-4);
+
+ free(file);
+
+ // Finally, set psfby tag
+ strcpy(psfby, "n/a");
+ if (c)
+ {
+ for (i = 0; i < MAX_UNKNOWN_TAGS; i++)
+ {
+ if (!strcasecmp(c->tag_name[i], "psfby"))
+ strcpy(psfby, c->tag_data[i]);
+ }
+ }
+
+ #if DEBUG_LOADER && 1
+ {
+ FILE *f;
+
+ f = fopen("satram.bin", "wb");
+ fwrite(sat_ram, 512*1024, 1, f);
+ fclose(f);
+ }
+ #endif
+
+ // now flip everything (this makes sense because he's using starscream)
+ for (i = 0; i < 512*1024; i+=2)
+ {
+ uint8 temp;
+
+ temp = sat_ram[i];
+ sat_ram[i] = sat_ram[i+1];
+ sat_ram[i+1] = temp;
+ }
+
+ sat_hw_init();
+
+ // now figure out the time in samples for the length/fade
+ lengthMS = psfTimeToMS(c->inf_length);
+ fadeMS = psfTimeToMS(c->inf_fade);
+ total_samples = 0;
+
+ if (lengthMS == 0)
+ {
+ lengthMS = ~0;
+ }
+
+ if (lengthMS == ~0)
+ {
+ decaybegin = lengthMS;
+ }
+ else
+ {
+ lengthMS = (lengthMS * 441) / 10;
+ fadeMS = (fadeMS * 441) / 10;
+
+ decaybegin = lengthMS;
+ decayend = lengthMS + fadeMS;
+ }
+
+ return AO_SUCCESS;
+}
+
+int32 ssf_gen(int16 *buffer, uint32 samples)
+{
+ int i;
+ int16 output[samples], output2[samples];
+ int16 *stereo[2];
+ int16 *outp = buffer;
+
+ for (i = 0; i < samples; i++)
+ {
+ m68k_execute((11300000/60)/735);
+ stereo[0] = &output[i];
+ stereo[1] = &output2[i];
+ SCSP_Update(NULL, NULL, stereo, 1);
+ }
+
+ for (i = 0; i < samples; i++)
+ {
+ // process the fade tags
+ if (total_samples >= decaybegin)
+ {
+ if (total_samples >= decayend)
+ {
+ // song is done here, call out as necessary to make your player stop
+ output[i] = 0;
+ output2[i] = 0;
+ }
+ else
+ {
+ int32 fader = 256 - (256*(total_samples - decaybegin)/(decayend-decaybegin));
+ output[i] = (output[i] * fader)>>8;
+ output2[i] = (output2[i] * fader)>>8;
+
+ total_samples++;
+ }
+ }
+ else
+ {
+ total_samples++;
+ }
+
+ *outp++ = output[i];
+ *outp++ = output2[i];
+ }
+
+ return AO_SUCCESS;
+}
+
+int32 ssf_stop(void)
+{
+ return AO_SUCCESS;
+}
+
+int32 ssf_command(int32 command, int32 parameter)
+
+{
+ switch (command)
+ {
+ case COMMAND_RESTART:
+ return AO_SUCCESS;
+
+ }
+ return AO_FAIL;
+}
+
+int32 ssf_fill_info(ao_display_info *info)
+{
+ if (c == NULL)
+ return AO_FAIL;
+
+ strcpy(info->title[1], "Name: ");
+ sprintf(info->info[1], "%s", c->inf_title);
+
+ strcpy(info->title[2], "Game: ");
+ sprintf(info->info[2], "%s", c->inf_game);
+
+ strcpy(info->title[3], "Artist: ");
+ sprintf(info->info[3], "%s", c->inf_artist);
+
+ strcpy(info->title[4], "Copyright: ");
+ sprintf(info->info[4], "%s", c->inf_copy);
+
+ strcpy(info->title[5], "Year: ");
+ sprintf(info->info[5], "%s", c->inf_year);
+
+ strcpy(info->title[6], "Length: ");
+ sprintf(info->info[6], "%s", c->inf_length);
+
+ strcpy(info->title[7], "Fade: ");
+ sprintf(info->info[7], "%s", c->inf_fade);
+
+ strcpy(info->title[8], "Ripper: ");
+ sprintf(info->info[8], "%s", psfby);
+
+ return AO_SUCCESS;
+}
diff --git a/plugins/ao/eng_ssf/m68k.h b/plugins/ao/eng_ssf/m68k.h
new file mode 100644
index 00000000..082ed4df
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68k.h
@@ -0,0 +1,343 @@
+#ifndef M68K__HEADER
+#define M68K__HEADER
+
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+/*
+ * MUSASHI
+ * Version 3.3
+ *
+ * A portable Motorola M680x0 processor emulation engine.
+ * Copyright 1998-2001 Karl Stenerud. All rights reserved.
+ *
+ * This code may be freely used for non-commercial purposes as long as this
+ * copyright notice remains unaltered in the source code and any binary files
+ * containing this code in compiled form.
+ *
+ * All other lisencing terms must be negotiated with the author
+ * (Karl Stenerud).
+ *
+ * The latest version of this code can be obtained at:
+ * http://kstenerud.cjb.net
+ */
+
+
+
+/* ======================================================================== */
+/* ============================ GENERAL DEFINES =========================== */
+
+/* ======================================================================== */
+
+/* There are 7 levels of interrupt to the 68K.
+ * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI).
+ */
+#define M68K_IRQ_NONE 0
+#define M68K_IRQ_1 1
+#define M68K_IRQ_2 2
+#define M68K_IRQ_3 3
+#define M68K_IRQ_4 4
+#define M68K_IRQ_5 5
+#define M68K_IRQ_6 6
+#define M68K_IRQ_7 7
+
+
+/* Special interrupt acknowledge values.
+ * Use these as special returns from the interrupt acknowledge callback
+ * (specified later in this header).
+ */
+
+/* Causes an interrupt autovector (0x18 + interrupt level) to be taken.
+ * This happens in a real 68K if VPA or AVEC is asserted during an interrupt
+ * acknowledge cycle instead of DTACK.
+ */
+#define M68K_INT_ACK_AUTOVECTOR 0xffffffff
+
+/* Causes the spurious interrupt vector (0x18) to be taken
+ * This happens in a real 68K if BERR is asserted during the interrupt
+ * acknowledge cycle (i.e. no devices responded to the acknowledge).
+ */
+#define M68K_INT_ACK_SPURIOUS 0xfffffffe
+
+
+/* CPU types for use in m68k_set_cpu_type() */
+enum
+{
+ M68K_CPU_TYPE_INVALID,
+ M68K_CPU_TYPE_68000,
+ M68K_CPU_TYPE_68010,
+ M68K_CPU_TYPE_68EC020,
+ M68K_CPU_TYPE_68020,
+ M68K_CPU_TYPE_68030, /* Supported by disassembler ONLY */
+ M68K_CPU_TYPE_68040 /* Supported by disassembler ONLY */
+};
+
+/* Registers used by m68k_get_reg() and m68k_set_reg() */
+typedef enum
+{
+ /* Real registers */
+ M68K_REG_D0, /* Data registers */
+ M68K_REG_D1,
+ M68K_REG_D2,
+ M68K_REG_D3,
+ M68K_REG_D4,
+ M68K_REG_D5,
+ M68K_REG_D6,
+ M68K_REG_D7,
+ M68K_REG_A0, /* Address registers */
+ M68K_REG_A1,
+ M68K_REG_A2,
+ M68K_REG_A3,
+ M68K_REG_A4,
+ M68K_REG_A5,
+ M68K_REG_A6,
+ M68K_REG_A7,
+ M68K_REG_PC, /* Program Counter */
+ M68K_REG_SR, /* Status Register */
+ M68K_REG_SP, /* The current Stack Pointer (located in A7) */
+ M68K_REG_USP, /* User Stack Pointer */
+ M68K_REG_ISP, /* Interrupt Stack Pointer */
+ M68K_REG_MSP, /* Master Stack Pointer */
+ M68K_REG_SFC, /* Source Function Code */
+ M68K_REG_DFC, /* Destination Function Code */
+ M68K_REG_VBR, /* Vector Base Register */
+ M68K_REG_CACR, /* Cache Control Register */
+ M68K_REG_CAAR, /* Cache Address Register */
+
+ /* Assumed registers */
+ /* These are cheat registers which emulate the 1-longword prefetch
+ * present in the 68000 and 68010.
+ */
+ M68K_REG_PREF_ADDR, /* Last prefetch address */
+ M68K_REG_PREF_DATA, /* Last prefetch data */
+
+ /* Convenience registers */
+ M68K_REG_PPC, /* Previous value in the program counter */
+ M68K_REG_IR, /* Instruction register */
+ M68K_REG_CPU_TYPE /* Type of CPU being run */
+} m68k_register_t;
+
+/* ======================================================================== */
+/* ====================== FUNCTIONS CALLED BY THE CPU ===================== */
+/* ======================================================================== */
+
+/* You will have to implement these functions */
+
+/* read/write functions called by the CPU to access memory.
+ * while values used are 32 bits, only the appropriate number
+ * of bits are relevant (i.e. in write_memory_8, only the lower 8 bits
+ * of value should be written to memory).
+ *
+ * NOTE: I have separated the immediate and PC-relative memory fetches
+ * from the other memory fetches because some systems require
+ * differentiation between PROGRAM and DATA fetches (usually
+ * for security setups such as encryption).
+ * This separation can either be achieved by setting
+ * M68K_SEPARATE_READS in m68kconf.h and defining
+ * the read functions, or by setting M68K_EMULATE_FC and
+ * making a function code callback function.
+ * Using the callback offers better emulation coverage
+ * because you can also monitor whether the CPU is in SYSTEM or
+ * USER mode, but it is also slower.
+ */
+
+/* Read from anywhere */
+unsigned int m68k_read_memory_8(unsigned int address);
+unsigned int m68k_read_memory_16(unsigned int address);
+unsigned int m68k_read_memory_32(unsigned int address);
+
+/* Read data immediately following the PC */
+//INLINE unsigned int m68k_read_immediate_16(unsigned int address);
+//INLINE unsigned int m68k_read_immediate_32(unsigned int address);
+
+/* Read data relative to the PC */
+//INLINE unsigned int m68k_read_pcrelative_8(unsigned int address);
+//INLINE unsigned int m68k_read_pcrelative_16(unsigned int address);
+//INLINE unsigned int m68k_read_pcrelative_32(unsigned int address);
+
+/* Memory access for the disassembler */
+unsigned int m68k_read_disassembler_8 (unsigned int address);
+unsigned int m68k_read_disassembler_16 (unsigned int address);
+unsigned int m68k_read_disassembler_32 (unsigned int address);
+
+/* Write to anywhere */
+void m68k_write_memory_8(unsigned int address, unsigned int value);
+void m68k_write_memory_16(unsigned int address, unsigned int value);
+void m68k_write_memory_32(unsigned int address, unsigned int value);
+
+/* Special call to simulate undocumented 68k behavior when move.l with a
+ * predecrement destination mode is executed.
+ * To simulate real 68k behavior, first write the high word to
+ * [address+2], and then write the low word to [address].
+ *
+ * Enable this functionality with M68K_SIMULATE_PD_WRITES in m68kconf.h.
+ */
+//INLINE void m68k_write_memory_32_pd(unsigned int address, unsigned int value);
+
+
+
+/* ======================================================================== */
+/* ============================== CALLBACKS =============================== */
+/* ======================================================================== */
+
+/* These functions allow you to set callbacks to the host when specific events
+ * occur. Note that you must enable the corresponding value in m68kconf.h
+ * in order for these to do anything useful.
+ * Note: I have defined default callbacks which are used if you have enabled
+ * the corresponding #define in m68kconf.h but either haven't assigned a
+ * callback or have assigned a callback of NULL.
+ */
+
+/* Set the callback for an interrupt acknowledge.
+ * You must enable M68K_EMULATE_INT_ACK in m68kconf.h.
+ * The CPU will call the callback with the interrupt level being acknowledged.
+ * The host program must return either a vector from 0x02-0xff, or one of the
+ * special interrupt acknowledge values specified earlier in this header.
+ * If this is not implemented, the CPU will always assume an autovectored
+ * interrupt, and will automatically clear the interrupt request when it
+ * services the interrupt.
+ * Default behavior: return M68K_INT_ACK_AUTOVECTOR.
+ */
+void m68k_set_int_ack_callback(int (*callback)(int int_level));
+
+
+/* Set the callback for a breakpoint acknowledge (68010+).
+ * You must enable M68K_EMULATE_BKPT_ACK in m68kconf.h.
+ * The CPU will call the callback with whatever was in the data field of the
+ * BKPT instruction for 68020+, or 0 for 68010.
+ * Default behavior: do nothing.
+ */
+void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data));
+
+
+/* Set the callback for the RESET instruction.
+ * You must enable M68K_EMULATE_RESET in m68kconf.h.
+ * The CPU calls this callback every time it encounters a RESET instruction.
+ * Default behavior: do nothing.
+ */
+void m68k_set_reset_instr_callback(void (*callback)(void));
+
+
+/* Set the callback for informing of a large PC change.
+ * You must enable M68K_MONITOR_PC in m68kconf.h.
+ * The CPU calls this callback with the new PC value every time the PC changes
+ * by a large value (currently set for changes by longwords).
+ * Default behavior: do nothing.
+ */
+void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc));
+
+
+/* Set the callback for CPU function code changes.
+ * You must enable M68K_EMULATE_FC in m68kconf.h.
+ * The CPU calls this callback with the function code before every memory
+ * access to set the CPU's function code according to what kind of memory
+ * access it is (supervisor/user, program/data and such).
+ * Default behavior: do nothing.
+ */
+void m68k_set_fc_callback(void (*callback)(unsigned int new_fc));
+
+
+/* Set a callback for the instruction cycle of the CPU.
+ * You must enable M68K_INSTRUCTION_HOOK in m68kconf.h.
+ * The CPU calls this callback just before fetching the opcode in the
+ * instruction cycle.
+ * Default behavior: do nothing.
+ */
+void m68k_set_instr_hook_callback(void (*callback)(void));
+
+
+
+/* ======================================================================== */
+/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */
+/* ======================================================================== */
+
+/* Use this function to set the CPU type you want to emulate.
+ * Currently supported types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68010,
+ * M68K_CPU_TYPE_EC020, and M68K_CPU_TYPE_68020.
+ */
+void m68k_set_cpu_type(unsigned int cpu_type);
+
+/* Do whatever initialisations the core requires. Should be called
+ * at least once at init time.
+ */
+void m68k_init(void);
+
+/* Pulse the RESET pin on the CPU.
+ * You *MUST* reset the CPU at least once to initialize the emulation
+ * Note: If you didn't call m68k_set_cpu_type() before resetting
+ * the CPU for the first time, the CPU will be set to
+ * M68K_CPU_TYPE_68000.
+ */
+void m68k_pulse_reset(void);
+
+/* execute num_cycles worth of instructions. returns number of cycles used */
+int m68k_execute(int num_cycles);
+
+/* These functions let you read/write/modify the number of cycles left to run
+ * while m68k_execute() is running.
+ * These are useful if the 68k accesses a memory-mapped port on another device
+ * that requires immediate processing by another CPU.
+ */
+int m68k_cycles_run(void); /* Number of cycles run so far */
+int m68k_cycles_remaining(void); /* Number of cycles left */
+void m68k_modify_timeslice(int cycles); /* Modify cycles left */
+void m68k_end_timeslice(void); /* End timeslice now */
+
+/* Set the IPL0-IPL2 pins on the CPU (IRQ).
+ * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI).
+ * Setting IRQ to 0 will clear an interrupt request.
+ */
+void m68k_set_irq(unsigned int int_level);
+
+
+/* Halt the CPU as if you pulsed the HALT pin. */
+void m68k_pulse_halt(void);
+
+
+/* Context switching to allow multiple CPUs */
+
+/* Get the size of the cpu context in bytes */
+unsigned int m68k_context_size(void);
+
+/* Get a cpu context */
+unsigned int m68k_get_context(void* dst);
+
+/* set the current cpu context */
+void m68k_set_context(void* dst);
+
+/* Register the CPU state information */
+void m68k_state_register(const char *type);
+
+
+/* Peek at the internals of a CPU context. This can either be a context
+ * retrieved using m68k_get_context() or the currently running context.
+ * If context is NULL, the currently running CPU context will be used.
+ */
+unsigned int m68k_get_reg(void* context, m68k_register_t reg);
+
+/* Poke values into the internals of the currently running CPU context */
+void m68k_set_reg(m68k_register_t reg, unsigned int value);
+
+/* Check if an instruction is valid for the specified CPU type */
+unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type);
+
+/* Disassemble 1 instruction using the epecified CPU type at pc. Stores
+ * disassembly in str_buff and returns the size of the instruction in bytes.
+ */
+unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type);
+
+
+/* ======================================================================== */
+/* ============================= CONFIGURATION ============================ */
+/* ======================================================================== */
+
+/* Import the configuration for this build */
+#include "m68kconf.h"
+
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68K__HEADER */
diff --git a/plugins/ao/eng_ssf/m68k_in.c b/plugins/ao/eng_ssf/m68k_in.c
new file mode 100644
index 00000000..65e317ef
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68k_in.c
@@ -0,0 +1,10336 @@
+/*
+must fix:
+ callm
+ chk
+*/
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+/*
+ * MUSASHI
+ * Version 3.3
+ *
+ * A portable Motorola M680x0 processor emulation engine.
+ * Copyright 1998-2001 Karl Stenerud. All rights reserved.
+ *
+ * This code may be freely used for non-commercial purposes as long as this
+ * copyright notice remains unaltered in the source code and any binary files
+ * containing this code in compiled form.
+ *
+ * All other lisencing terms must be negotiated with the author
+ * (Karl Stenerud).
+ *
+ * The latest version of this code can be obtained at:
+ * http://kstenerud.cjb.net
+ */
+
+/* Special thanks to Bart Trzynadlowski for his insight into the
+ * undocumented features of this chip:
+ *
+ * http://dynarec.com/~bart/files/68knotes.txt
+ */
+
+
+/* Input file for m68kmake
+ * -----------------------
+ *
+ * All sections begin with 80 X's in a row followed by an end-of-line
+ * sequence.
+ * After this, m68kmake will expect to find one of the following section
+ * identifiers:
+ * M68KMAKE_PROTOTYPE_HEADER - header for opcode handler prototypes
+ * M68KMAKE_PROTOTYPE_FOOTER - footer for opcode handler prototypes
+ * M68KMAKE_TABLE_HEADER - header for opcode handler jumptable
+ * M68KMAKE_TABLE_FOOTER - footer for opcode handler jumptable
+ * M68KMAKE_TABLE_BODY - the table itself
+ * M68KMAKE_OPCODE_HANDLER_HEADER - header for opcode handler implementation
+ * M68KMAKE_OPCODE_HANDLER_FOOTER - footer for opcode handler implementation
+ * M68KMAKE_OPCODE_HANDLER_BODY - body section for opcode handler implementation
+ *
+ * NOTE: M68KMAKE_OPCODE_HANDLER_BODY must be last in the file and
+ * M68KMAKE_TABLE_BODY must be second last in the file.
+ *
+ * The M68KMAKE_OPHANDLER_BODY section contains the opcode handler
+ * primitives themselves. Each opcode handler begins with:
+ * M68KMAKE_OP(A, B, C, D)
+ *
+ * where A is the opcode handler name, B is the size of the operation,
+ * C denotes any special processing mode, and D denotes a specific
+ * addressing mode.
+ * For C and D where nothing is specified, use "."
+ *
+ * Example:
+ * M68KMAKE_OP(abcd, 8, rr, .) abcd, size 8, register to register, default EA
+ * M68KMAKE_OP(abcd, 8, mm, ax7) abcd, size 8, memory to memory, register X is A7
+ * M68KMAKE_OP(tst, 16, ., pcix) tst, size 16, PCIX addressing
+ *
+ * All opcode handler primitives end with a closing curly brace "}" at column 1
+ *
+ * NOTE: Do not place a M68KMAKE_OP() directive inside the opcode handler,
+ * and do not put a closing curly brace at column 1 unless it is
+ * marking the end of the handler!
+ *
+ * Inside the handler, m68kmake will recognize M68KMAKE_GET_OPER_xx_xx,
+ * M68KMAKE_GET_EA_xx_xx, and M68KMAKE_CC directives, and create multiple
+ * opcode handlers to handle variations in the opcode handler.
+ * Note: M68KMAKE_CC will only be interpreted in condition code opcodes.
+ * As well, M68KMAKE_GET_EA_xx_xx and M68KMAKE_GET_OPER_xx_xx will only
+ * be interpreted on instructions where the corresponding table entry
+ * specifies multiple effective addressing modes.
+ * Example:
+ * clr 32 . . 0100001010...... A+-DXWL... U U U 12 6 4
+ *
+ * This table entry says that the clr.l opcde has 7 variations (A+-DXWL).
+ * It is run in user or supervisor mode for all CPUs, and uses 12 cycles for
+ * 68000, 6 cycles for 68010, and 4 cycles for 68020.
+ */
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_PROTOTYPE_HEADER
+
+#ifndef M68KOPS__HEADER
+#define M68KOPS__HEADER
+
+/* ======================================================================== */
+/* ============================ OPCODE HANDLERS =========================== */
+/* ======================================================================== */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_PROTOTYPE_FOOTER
+
+
+/* Build the opcode handler table */
+void m68ki_build_opcode_table(void);
+
+extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
+extern unsigned char m68ki_cycles[][0x10000];
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68KOPS__HEADER */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_TABLE_HEADER
+
+/* ======================================================================== */
+/* ========================= OPCODE TABLE BUILDER ========================= */
+/* ======================================================================== */
+
+#include "m68kops.h"
+
+#define NUM_CPU_TYPES 3
+
+void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
+unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */
+
+/* This is used to generate the opcode handler jump table */
+typedef struct
+{
+ void (*opcode_handler)(void); /* handler function */
+ unsigned int mask; /* mask on opcode */
+ unsigned int match; /* what to match after masking */
+ unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */
+} opcode_handler_struct;
+
+
+/* Opcode handler table */
+static opcode_handler_struct m68k_opcode_handler_table[] =
+{
+/* function mask match 000 010 020 */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_TABLE_FOOTER
+
+ {0, 0, 0, {0, 0, 0}}
+};
+
+
+/* Build the opcode handler jump table */
+void m68ki_build_opcode_table(void)
+{
+ opcode_handler_struct *ostruct;
+ int instr;
+ int i;
+ int j;
+ int k;
+
+ for(i = 0; i < 0x10000; i++)
+ {
+ /* default to illegal */
+ m68ki_instruction_jump_table[i] = m68k_op_illegal;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][i] = 0;
+ }
+
+ ostruct = m68k_opcode_handler_table;
+ while(ostruct->mask != 0xff00)
+ {
+ for(i = 0;i < 0x10000;i++)
+ {
+ if((i & ostruct->mask) == ostruct->match)
+ {
+ m68ki_instruction_jump_table[i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][i] = ostruct->cycles[k];
+ }
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xff00)
+ {
+ for(i = 0;i <= 0xff;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xf1f8)
+ {
+ for(i = 0;i < 8;i++)
+ {
+ for(j = 0;j < 8;j++)
+ {
+ instr = ostruct->match | (i << 9) | j;
+ m68ki_instruction_jump_table[instr] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][instr] = ostruct->cycles[k];
+ if((instr & 0xf000) == 0xe000 && (!(instr & 0x20)))
+ m68ki_cycles[0][instr] = m68ki_cycles[1][instr] = ostruct->cycles[k] + ((((j-1)&7)+1)<<1);
+ }
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xfff0)
+ {
+ for(i = 0;i <= 0x0f;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xf1ff)
+ {
+ for(i = 0;i <= 0x07;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | (i << 9)] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xfff8)
+ {
+ for(i = 0;i <= 0x07;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xffff)
+ {
+ m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match] = ostruct->cycles[k];
+ ostruct++;
+ }
+}
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_OPCODE_HANDLER_HEADER
+
+#include "m68kcpu.h"
+
+/* ======================================================================== */
+/* ========================= INSTRUCTION HANDLERS ========================= */
+/* ======================================================================== */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_OPCODE_HANDLER_FOOTER
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_TABLE_BODY
+
+The following table is arranged as follows:
+
+name: Opcode mnemonic
+
+size: Operation size
+
+spec proc: Special processing mode:
+ .: normal
+ s: static operand
+ r: register operand
+ rr: register to register
+ mm: memory to memory
+ er: effective address to register
+ re: register to effective address
+ dd: data register to data register
+ da: data register to address register
+ aa: address register to address register
+ cr: control register to register
+ rc: register to control register
+ toc: to condition code register
+ tos: to status register
+ tou: to user stack pointer
+ frc: from condition code register
+ frs: from status register
+ fru: from user stack pointer
+ * for move.x, the special processing mode is a specific
+ destination effective addressing mode.
+
+spec ea: Specific effective addressing mode:
+ .: normal
+ i: immediate
+ d: data register
+ a: address register
+ ai: address register indirect
+ pi: address register indirect with postincrement
+ pd: address register indirect with predecrement
+ di: address register indirect with displacement
+ ix: address register indirect with index
+ aw: absolute word address
+ al: absolute long address
+ pcdi: program counter relative with displacement
+ pcix: program counter relative with index
+ a7: register specified in instruction is A7
+ ax7: register field X of instruction is A7
+ ay7: register field Y of instruction is A7
+ axy7: register fields X and Y of instruction are A7
+
+bit pattern: Pattern to recognize this opcode. "." means don't care.
+
+allowed ea: List of allowed addressing modes:
+ .: not present
+ A: address register indirect
+ +: ARI (address register indirect) with postincrement
+ -: ARI with predecrement
+ D: ARI with displacement
+ X: ARI with index
+ W: absolute word address
+ L: absolute long address
+ d: program counter indirect with displacement
+ x: program counter indirect with index
+ I: immediate
+mode: CPU operating mode for each cpu type. U = user or supervisor,
+ S = supervisor only, "." = opcode not present.
+
+cpu cycles: Base number of cycles required to execute this opcode on the
+ specified CPU type.
+ Use "." if CPU does not have this opcode.
+
+
+
+ spec spec allowed ea mode cpu cycles
+name size proc ea bit pattern A+-DXWLdxI 0 1 2 000 010 020 comments
+====== ==== ==== ==== ================ ========== = = = === === === =============
+M68KMAKE_TABLE_START
+1010 0 . . 1010............ .......... U U U 4 4 4
+1111 0 . . 1111............ .......... U U U 4 4 4
+abcd 8 rr . 1100...100000... .......... U U U 6 6 4
+abcd 8 mm ax7 1100111100001... .......... U U U 18 18 16
+abcd 8 mm ay7 1100...100001111 .......... U U U 18 18 16
+abcd 8 mm axy7 1100111100001111 .......... U U U 18 18 16
+abcd 8 mm . 1100...100001... .......... U U U 18 18 16
+add 8 er d 1101...000000... .......... U U U 4 4 2
+add 8 er . 1101...000...... A+-DXWLdxI U U U 4 4 2
+add 16 er d 1101...001000... .......... U U U 4 4 2
+add 16 er a 1101...001001... .......... U U U 4 4 2
+add 16 er . 1101...001...... A+-DXWLdxI U U U 4 4 2
+add 32 er d 1101...010000... .......... U U U 6 6 2
+add 32 er a 1101...010001... .......... U U U 6 6 2
+add 32 er . 1101...010...... A+-DXWLdxI U U U 6 6 2
+add 8 re . 1101...100...... A+-DXWL... U U U 8 8 4
+add 16 re . 1101...101...... A+-DXWL... U U U 8 8 4
+add 32 re . 1101...110...... A+-DXWL... U U U 12 12 4
+adda 16 . d 1101...011000... .......... U U U 8 8 2
+adda 16 . a 1101...011001... .......... U U U 8 8 2
+adda 16 . . 1101...011...... A+-DXWLdxI U U U 8 8 2
+adda 32 . d 1101...111000... .......... U U U 6 6 2
+adda 32 . a 1101...111001... .......... U U U 6 6 2
+adda 32 . . 1101...111...... A+-DXWLdxI U U U 6 6 2
+addi 8 . d 0000011000000... .......... U U U 8 8 2
+addi 8 . . 0000011000...... A+-DXWL... U U U 12 12 4
+addi 16 . d 0000011001000... .......... U U U 8 8 2
+addi 16 . . 0000011001...... A+-DXWL... U U U 12 12 4
+addi 32 . d 0000011010000... .......... U U U 16 14 2
+addi 32 . . 0000011010...... A+-DXWL... U U U 20 20 4
+addq 8 . d 0101...000000... .......... U U U 4 4 2
+addq 8 . . 0101...000...... A+-DXWL... U U U 8 8 4
+addq 16 . d 0101...001000... .......... U U U 4 4 2
+addq 16 . a 0101...001001... .......... U U U 4 4 2
+addq 16 . . 0101...001...... A+-DXWL... U U U 8 8 4
+addq 32 . d 0101...010000... .......... U U U 8 8 2
+addq 32 . a 0101...010001... .......... U U U 8 8 2
+addq 32 . . 0101...010...... A+-DXWL... U U U 12 12 4
+addx 8 rr . 1101...100000... .......... U U U 4 4 2
+addx 16 rr . 1101...101000... .......... U U U 4 4 2
+addx 32 rr . 1101...110000... .......... U U U 8 6 2
+addx 8 mm ax7 1101111100001... .......... U U U 18 18 12
+addx 8 mm ay7 1101...100001111 .......... U U U 18 18 12
+addx 8 mm axy7 1101111100001111 .......... U U U 18 18 12
+addx 8 mm . 1101...100001... .......... U U U 18 18 12
+addx 16 mm . 1101...101001... .......... U U U 18 18 12
+addx 32 mm . 1101...110001... .......... U U U 30 30 12
+and 8 er d 1100...000000... .......... U U U 4 4 2
+and 8 er . 1100...000...... A+-DXWLdxI U U U 4 4 2
+and 16 er d 1100...001000... .......... U U U 4 4 2
+and 16 er . 1100...001...... A+-DXWLdxI U U U 4 4 2
+and 32 er d 1100...010000... .......... U U U 6 6 2
+and 32 er . 1100...010...... A+-DXWLdxI U U U 6 6 2
+and 8 re . 1100...100...... A+-DXWL... U U U 8 8 4
+and 16 re . 1100...101...... A+-DXWL... U U U 8 8 4
+and 32 re . 1100...110...... A+-DXWL... U U U 12 12 4
+andi 16 toc . 0000001000111100 .......... U U U 20 16 12
+andi 16 tos . 0000001001111100 .......... S S S 20 16 12
+andi 8 . d 0000001000000... .......... U U U 8 8 2
+andi 8 . . 0000001000...... A+-DXWL... U U U 12 12 4
+andi 16 . d 0000001001000... .......... U U U 8 8 2
+andi 16 . . 0000001001...... A+-DXWL... U U U 12 12 4
+andi 32 . d 0000001010000... .......... U U U 14 14 2
+andi 32 . . 0000001010...... A+-DXWL... U U U 20 20 4
+asr 8 s . 1110...000000... .......... U U U 6 6 6
+asr 16 s . 1110...001000... .......... U U U 6 6 6
+asr 32 s . 1110...010000... .......... U U U 8 8 6
+asr 8 r . 1110...000100... .......... U U U 6 6 6
+asr 16 r . 1110...001100... .......... U U U 6 6 6
+asr 32 r . 1110...010100... .......... U U U 8 8 6
+asr 16 . . 1110000011...... A+-DXWL... U U U 8 8 5
+asl 8 s . 1110...100000... .......... U U U 6 6 8
+asl 16 s . 1110...101000... .......... U U U 6 6 8
+asl 32 s . 1110...110000... .......... U U U 8 8 8
+asl 8 r . 1110...100100... .......... U U U 6 6 8
+asl 16 r . 1110...101100... .......... U U U 6 6 8
+asl 32 r . 1110...110100... .......... U U U 8 8 8
+asl 16 . . 1110000111...... A+-DXWL... U U U 8 8 6
+bcc 8 . . 0110............ .......... U U U 8 8 6
+bcc 16 . . 0110....00000000 .......... U U U 10 10 6
+bcc 32 . . 0110....11111111 .......... . . U . . 6
+bchg 8 r . 0000...101...... A+-DXWL... U U U 8 8 4
+bchg 32 r d 0000...101000... .......... U U U 8 8 4
+bchg 8 s . 0000100001...... A+-DXWL... U U U 12 12 4
+bchg 32 s d 0000100001000... .......... U U U 12 12 4
+bclr 8 r . 0000...110...... A+-DXWL... U U U 8 10 4
+bclr 32 r d 0000...110000... .......... U U U 10 10 4
+bclr 8 s . 0000100010...... A+-DXWL... U U U 12 12 4
+bclr 32 s d 0000100010000... .......... U U U 14 14 4
+bfchg 32 . d 1110101011000... .......... . . U . . 12 timing not quite correct
+bfchg 32 . . 1110101011...... A..DXWL... . . U . . 20
+bfclr 32 . d 1110110011000... .......... . . U . . 12
+bfclr 32 . . 1110110011...... A..DXWL... . . U . . 20
+bfexts 32 . d 1110101111000... .......... . . U . . 8
+bfexts 32 . . 1110101111...... A..DXWLdx. . . U . . 15
+bfextu 32 . d 1110100111000... .......... . . U . . 8
+bfextu 32 . . 1110100111...... A..DXWLdx. . . U . . 15
+bfffo 32 . d 1110110111000... .......... . . U . . 18
+bfffo 32 . . 1110110111...... A..DXWLdx. . . U . . 28
+bfins 32 . d 1110111111000... .......... . . U . . 10
+bfins 32 . . 1110111111...... A..DXWL... . . U . . 17
+bfset 32 . d 1110111011000... .......... . . U . . 12
+bfset 32 . . 1110111011...... A..DXWL... . . U . . 20
+bftst 32 . d 1110100011000... .......... . . U . . 6
+bftst 32 . . 1110100011...... A..DXWLdx. . . U . . 13
+bkpt 0 . . 0100100001001... .......... . U U . 10 10
+bra 8 . . 01100000........ .......... U U U 10 10 10
+bra 16 . . 0110000000000000 .......... U U U 10 10 10
+bra 32 . . 0110000011111111 .......... U U U . . 10
+bset 32 r d 0000...111000... .......... U U U 8 8 4
+bset 8 r . 0000...111...... A+-DXWL... U U U 8 8 4
+bset 8 s . 0000100011...... A+-DXWL... U U U 12 12 4
+bset 32 s d 0000100011000... .......... U U U 12 12 4
+bsr 8 . . 01100001........ .......... U U U 18 18 7
+bsr 16 . . 0110000100000000 .......... U U U 18 18 7
+bsr 32 . . 0110000111111111 .......... . . U . . 7
+btst 8 r . 0000...100...... A+-DXWLdxI U U U 4 4 4
+btst 32 r d 0000...100000... .......... U U U 6 6 4
+btst 8 s . 0000100000...... A+-DXWLdx. U U U 8 8 4
+btst 32 s d 0000100000000... .......... U U U 10 10 4
+callm 32 . . 0000011011...... A..DXWLdx. . . U . . 60 not properly emulated
+cas 8 . . 0000101011...... A+-DXWL... . . U . . 12
+cas 16 . . 0000110011...... A+-DXWL... . . U . . 12
+cas 32 . . 0000111011...... A+-DXWL... . . U . . 12
+cas2 16 . . 0000110011111100 .......... . . U . . 12
+cas2 32 . . 0000111011111100 .......... . . U . . 12
+chk 16 . d 0100...110000... .......... U U U 10 8 8
+chk 16 . . 0100...110...... A+-DXWLdxI U U U 10 8 8
+chk 32 . d 0100...100000... .......... . . U . . 8
+chk 32 . . 0100...100...... A+-DXWLdxI . . U . . 8
+chk2cmp2 8 . pcdi 0000000011111010 .......... . . U . . 23
+chk2cmp2 8 . pcix 0000000011111011 .......... . . U . . 23
+chk2cmp2 8 . . 0000000011...... A..DXWL... . . U . . 18
+chk2cmp2 16 . pcdi 0000001011111010 .......... . . U . . 23
+chk2cmp2 16 . pcix 0000001011111011 .......... . . U . . 23
+chk2cmp2 16 . . 0000001011...... A..DXWL... . . U . . 18
+chk2cmp2 32 . pcdi 0000010011111010 .......... . . U . . 23
+chk2cmp2 32 . pcix 0000010011111011 .......... . . U . . 23
+chk2cmp2 32 . . 0000010011...... A..DXWL... . . U . . 18
+clr 8 . d 0100001000000... .......... U U U 4 4 2
+clr 8 . . 0100001000...... A+-DXWL... U U U 8 4 4
+clr 16 . d 0100001001000... .......... U U U 4 4 2
+clr 16 . . 0100001001...... A+-DXWL... U U U 8 4 4
+clr 32 . d 0100001010000... .......... U U U 6 6 2
+clr 32 . . 0100001010...... A+-DXWL... U U U 12 6 4
+cmp 8 . d 1011...000000... .......... U U U 4 4 2
+cmp 8 . . 1011...000...... A+-DXWLdxI U U U 4 4 2
+cmp 16 . d 1011...001000... .......... U U U 4 4 2
+cmp 16 . a 1011...001001... .......... U U U 4 4 2
+cmp 16 . . 1011...001...... A+-DXWLdxI U U U 4 4 2
+cmp 32 . d 1011...010000... .......... U U U 6 6 2
+cmp 32 . a 1011...010001... .......... U U U 6 6 2
+cmp 32 . . 1011...010...... A+-DXWLdxI U U U 6 6 2
+cmpa 16 . d 1011...011000... .......... U U U 6 6 4
+cmpa 16 . a 1011...011001... .......... U U U 6 6 4
+cmpa 16 . . 1011...011...... A+-DXWLdxI U U U 6 6 4
+cmpa 32 . d 1011...111000... .......... U U U 6 6 4
+cmpa 32 . a 1011...111001... .......... U U U 6 6 4
+cmpa 32 . . 1011...111...... A+-DXWLdxI U U U 6 6 4
+cmpi 8 . d 0000110000000... .......... U U U 8 8 2
+cmpi 8 . . 0000110000...... A+-DXWL... U U U 8 8 2
+cmpi 8 . pcdi 0000110000111010 .......... . . U . . 7
+cmpi 8 . pcix 0000110000111011 .......... . . U . . 9
+cmpi 16 . d 0000110001000... .......... U U U 8 8 2
+cmpi 16 . . 0000110001...... A+-DXWL... U U U 8 8 2
+cmpi 16 . pcdi 0000110001111010 .......... . . U . . 7
+cmpi 16 . pcix 0000110001111011 .......... . . U . . 9
+cmpi 32 . d 0000110010000... .......... U U U 14 12 2
+cmpi 32 . . 0000110010...... A+-DXWL... U U U 12 12 2
+cmpi 32 . pcdi 0000110010111010 .......... . . U . . 7
+cmpi 32 . pcix 0000110010111011 .......... . . U . . 9
+cmpm 8 . ax7 1011111100001... .......... U U U 12 12 9
+cmpm 8 . ay7 1011...100001111 .......... U U U 12 12 9
+cmpm 8 . axy7 1011111100001111 .......... U U U 12 12 9
+cmpm 8 . . 1011...100001... .......... U U U 12 12 9
+cmpm 16 . . 1011...101001... .......... U U U 12 12 9
+cmpm 32 . . 1011...110001... .......... U U U 20 20 9
+cpbcc 32 . . 1111...01....... .......... . . U . . 4 unemulated
+cpdbcc 32 . . 1111...001001... .......... . . U . . 4 unemulated
+cpgen 32 . . 1111...000...... .......... . . U . . 4 unemulated
+cpscc 32 . . 1111...001...... .......... . . U . . 4 unemulated
+cptrapcc 32 . . 1111...001111... .......... . . U . . 4 unemulated
+dbt 16 . . 0101000011001... .......... U U U 12 12 6
+dbf 16 . . 0101000111001... .......... U U U 14 14 6
+dbcc 16 . . 0101....11001... .......... U U U 12 12 6
+divs 16 . d 1000...111000... .......... U U U 158 122 56
+divs 16 . . 1000...111...... A+-DXWLdxI U U U 158 122 56
+divu 16 . d 1000...011000... .......... U U U 140 108 44
+divu 16 . . 1000...011...... A+-DXWLdxI U U U 140 108 44
+divl 32 . d 0100110001000... .......... . . U . . 84
+divl 32 . . 0100110001...... A+-DXWLdxI . . U . . 84
+eor 8 . d 1011...100000... .......... U U U 4 4 2
+eor 8 . . 1011...100...... A+-DXWL... U U U 8 8 4
+eor 16 . d 1011...101000... .......... U U U 4 4 2
+eor 16 . . 1011...101...... A+-DXWL... U U U 8 8 4
+eor 32 . d 1011...110000... .......... U U U 8 6 2
+eor 32 . . 1011...110...... A+-DXWL... U U U 12 12 4
+eori 16 toc . 0000101000111100 .......... U U U 20 16 12
+eori 16 tos . 0000101001111100 .......... S S S 20 16 12
+eori 8 . d 0000101000000... .......... U U U 8 8 2
+eori 8 . . 0000101000...... A+-DXWL... U U U 12 12 4
+eori 16 . d 0000101001000... .......... U U U 8 8 2
+eori 16 . . 0000101001...... A+-DXWL... U U U 12 12 4
+eori 32 . d 0000101010000... .......... U U U 16 14 2
+eori 32 . . 0000101010...... A+-DXWL... U U U 20 20 4
+exg 32 dd . 1100...101000... .......... U U U 6 6 2
+exg 32 aa . 1100...101001... .......... U U U 6 6 2
+exg 32 da . 1100...110001... .......... U U U 6 6 2
+ext 16 . . 0100100010000... .......... U U U 4 4 4
+ext 32 . . 0100100011000... .......... U U U 4 4 4
+extb 32 . . 0100100111000... .......... . . U . . 4
+illegal 0 . . 0100101011111100 .......... U U U 4 4 4
+jmp 32 . . 0100111011...... A..DXWLdx. U U U 4 4 0
+jsr 32 . . 0100111010...... A..DXWLdx. U U U 12 12 0
+lea 32 . . 0100...111...... A..DXWLdx. U U U 0 0 2
+link 16 . a7 0100111001010111 .......... U U U 16 16 5
+link 16 . . 0100111001010... .......... U U U 16 16 5
+link 32 . a7 0100100000001111 .......... . . U . . 6
+link 32 . . 0100100000001... .......... . . U . . 6
+lsr 8 s . 1110...000001... .......... U U U 6 6 4
+lsr 16 s . 1110...001001... .......... U U U 6 6 4
+lsr 32 s . 1110...010001... .......... U U U 8 8 4
+lsr 8 r . 1110...000101... .......... U U U 6 6 6
+lsr 16 r . 1110...001101... .......... U U U 6 6 6
+lsr 32 r . 1110...010101... .......... U U U 8 8 6
+lsr 16 . . 1110001011...... A+-DXWL... U U U 8 8 5
+lsl 8 s . 1110...100001... .......... U U U 6 6 4
+lsl 16 s . 1110...101001... .......... U U U 6 6 4
+lsl 32 s . 1110...110001... .......... U U U 8 8 4
+lsl 8 r . 1110...100101... .......... U U U 6 6 6
+lsl 16 r . 1110...101101... .......... U U U 6 6 6
+lsl 32 r . 1110...110101... .......... U U U 8 8 6
+lsl 16 . . 1110001111...... A+-DXWL... U U U 8 8 5
+move 8 d d 0001...000000... .......... U U U 4 4 2
+move 8 d . 0001...000...... A+-DXWLdxI U U U 4 4 2
+move 8 ai d 0001...010000... .......... U U U 8 8 4
+move 8 ai . 0001...010...... A+-DXWLdxI U U U 8 8 4
+move 8 pi d 0001...011000... .......... U U U 8 8 4
+move 8 pi . 0001...011...... A+-DXWLdxI U U U 8 8 4
+move 8 pi7 d 0001111011000... .......... U U U 8 8 4
+move 8 pi7 . 0001111011...... A+-DXWLdxI U U U 8 8 4
+move 8 pd d 0001...100000... .......... U U U 8 8 5
+move 8 pd . 0001...100...... A+-DXWLdxI U U U 8 8 5
+move 8 pd7 d 0001111100000... .......... U U U 8 8 5
+move 8 pd7 . 0001111100...... A+-DXWLdxI U U U 8 8 5
+move 8 di d 0001...101000... .......... U U U 12 12 5
+move 8 di . 0001...101...... A+-DXWLdxI U U U 12 12 5
+move 8 ix d 0001...110000... .......... U U U 14 14 7
+move 8 ix . 0001...110...... A+-DXWLdxI U U U 14 14 7
+move 8 aw d 0001000111000... .......... U U U 12 12 4
+move 8 aw . 0001000111...... A+-DXWLdxI U U U 12 12 4
+move 8 al d 0001001111000... .......... U U U 16 16 6
+move 8 al . 0001001111...... A+-DXWLdxI U U U 16 16 6
+move 16 d d 0011...000000... .......... U U U 4 4 2
+move 16 d a 0011...000001... .......... U U U 4 4 2
+move 16 d . 0011...000...... A+-DXWLdxI U U U 4 4 2
+move 16 ai d 0011...010000... .......... U U U 8 8 4
+move 16 ai a 0011...010001... .......... U U U 8 8 4
+move 16 ai . 0011...010...... A+-DXWLdxI U U U 8 8 4
+move 16 pi d 0011...011000... .......... U U U 8 8 4
+move 16 pi a 0011...011001... .......... U U U 8 8 4
+move 16 pi . 0011...011...... A+-DXWLdxI U U U 8 8 4
+move 16 pd d 0011...100000... .......... U U U 8 8 5
+move 16 pd a 0011...100001... .......... U U U 8 8 5
+move 16 pd . 0011...100...... A+-DXWLdxI U U U 8 8 5
+move 16 di d 0011...101000... .......... U U U 12 12 5
+move 16 di a 0011...101001... .......... U U U 12 12 5
+move 16 di . 0011...101...... A+-DXWLdxI U U U 12 12 5
+move 16 ix d 0011...110000... .......... U U U 14 14 7
+move 16 ix a 0011...110001... .......... U U U 14 14 7
+move 16 ix . 0011...110...... A+-DXWLdxI U U U 14 14 7
+move 16 aw d 0011000111000... .......... U U U 12 12 4
+move 16 aw a 0011000111001... .......... U U U 12 12 4
+move 16 aw . 0011000111...... A+-DXWLdxI U U U 12 12 4
+move 16 al d 0011001111000... .......... U U U 16 16 6
+move 16 al a 0011001111001... .......... U U U 16 16 6
+move 16 al . 0011001111...... A+-DXWLdxI U U U 16 16 6
+move 32 d d 0010...000000... .......... U U U 4 4 2
+move 32 d a 0010...000001... .......... U U U 4 4 2
+move 32 d . 0010...000...... A+-DXWLdxI U U U 4 4 2
+move 32 ai d 0010...010000... .......... U U U 12 12 4
+move 32 ai a 0010...010001... .......... U U U 12 12 4
+move 32 ai . 0010...010...... A+-DXWLdxI U U U 12 12 4
+move 32 pi d 0010...011000... .......... U U U 12 12 4
+move 32 pi a 0010...011001... .......... U U U 12 12 4
+move 32 pi . 0010...011...... A+-DXWLdxI U U U 12 12 4
+move 32 pd d 0010...100000... .......... U U U 12 14 5
+move 32 pd a 0010...100001... .......... U U U 12 14 5
+move 32 pd . 0010...100...... A+-DXWLdxI U U U 12 14 5
+move 32 di d 0010...101000... .......... U U U 16 16 5
+move 32 di a 0010...101001... .......... U U U 16 16 5
+move 32 di . 0010...101...... A+-DXWLdxI U U U 16 16 5
+move 32 ix d 0010...110000... .......... U U U 18 18 7
+move 32 ix a 0010...110001... .......... U U U 18 18 7
+move 32 ix . 0010...110...... A+-DXWLdxI U U U 18 18 7
+move 32 aw d 0010000111000... .......... U U U 16 16 4
+move 32 aw a 0010000111001... .......... U U U 16 16 4
+move 32 aw . 0010000111...... A+-DXWLdxI U U U 16 16 4
+move 32 al d 0010001111000... .......... U U U 20 20 6
+move 32 al a 0010001111001... .......... U U U 20 20 6
+move 32 al . 0010001111...... A+-DXWLdxI U U U 20 20 6
+movea 16 . d 0011...001000... .......... U U U 4 4 2
+movea 16 . a 0011...001001... .......... U U U 4 4 2
+movea 16 . . 0011...001...... A+-DXWLdxI U U U 4 4 2
+movea 32 . d 0010...001000... .......... U U U 4 4 2
+movea 32 . a 0010...001001... .......... U U U 4 4 2
+movea 32 . . 0010...001...... A+-DXWLdxI U U U 4 4 2
+move 16 frc d 0100001011000... .......... . U U . 4 4
+move 16 frc . 0100001011...... A+-DXWL... . U U . 8 4
+move 16 toc d 0100010011000... .......... U U U 12 12 4
+move 16 toc . 0100010011...... A+-DXWLdxI U U U 12 12 4
+move 16 frs d 0100000011000... .......... U S S 6 4 8 U only for 000
+move 16 frs . 0100000011...... A+-DXWL... U S S 8 8 8 U only for 000
+move 16 tos d 0100011011000... .......... S S S 12 12 8
+move 16 tos . 0100011011...... A+-DXWLdxI S S S 12 12 8
+move 32 fru . 0100111001101... .......... S S S 4 6 2
+move 32 tou . 0100111001100... .......... S S S 4 6 2
+movec 32 cr . 0100111001111010 .......... . S S . 12 6
+movec 32 rc . 0100111001111011 .......... . S S . 10 12
+movem 16 re pd 0100100010100... .......... U U U 8 8 4
+movem 16 re . 0100100010...... A..DXWL... U U U 8 8 4
+movem 32 re pd 0100100011100... .......... U U U 8 8 4
+movem 32 re . 0100100011...... A..DXWL... U U U 8 8 4
+movem 16 er pi 0100110010011... .......... U U U 12 12 8
+movem 16 er pcdi 0100110010111010 .......... U U U 16 16 9
+movem 16 er pcix 0100110010111011 .......... U U U 18 18 11
+movem 16 er . 0100110010...... A..DXWL... U U U 12 12 8
+movem 32 er pi 0100110011011... .......... U U U 12 12 8
+movem 32 er pcdi 0100110011111010 .......... U U U 20 20 9
+movem 32 er pcix 0100110011111011 .......... U U U 22 22 11
+movem 32 er . 0100110011...... A..DXWL... U U U 12 12 8
+movep 16 er . 0000...100001... .......... U U U 16 16 12
+movep 32 er . 0000...101001... .......... U U U 24 24 18
+movep 16 re . 0000...110001... .......... U U U 16 16 11
+movep 32 re . 0000...111001... .......... U U U 24 24 17
+moveq 32 . . 0111...0........ .......... U U U 4 4 2
+moves 8 . . 0000111000...... A+-DXWL... . S S . 14 5
+moves 16 . . 0000111001...... A+-DXWL... . S S . 14 5
+moves 32 . . 0000111010...... A+-DXWL... . S S . 16 5
+muls 16 . d 1100...111000... .......... U U U 54 32 27
+muls 16 . . 1100...111...... A+-DXWLdxI U U U 54 32 27
+mulu 16 . d 1100...011000... .......... U U U 54 30 27
+mulu 16 . . 1100...011...... A+-DXWLdxI U U U 54 30 27
+mull 32 . d 0100110000000... .......... . . U . . 43
+mull 32 . . 0100110000...... A+-DXWLdxI . . U . . 43
+nbcd 8 . d 0100100000000... .......... U U U 6 6 6
+nbcd 8 . . 0100100000...... A+-DXWL... U U U 8 8 6
+neg 8 . d 0100010000000... .......... U U U 4 4 2
+neg 8 . . 0100010000...... A+-DXWL... U U U 8 8 4
+neg 16 . d 0100010001000... .......... U U U 4 4 2
+neg 16 . . 0100010001...... A+-DXWL... U U U 8 8 4
+neg 32 . d 0100010010000... .......... U U U 6 6 2
+neg 32 . . 0100010010...... A+-DXWL... U U U 12 12 4
+negx 8 . d 0100000000000... .......... U U U 4 4 2
+negx 8 . . 0100000000...... A+-DXWL... U U U 8 8 4
+negx 16 . d 0100000001000... .......... U U U 4 4 2
+negx 16 . . 0100000001...... A+-DXWL... U U U 8 8 4
+negx 32 . d 0100000010000... .......... U U U 6 6 2
+negx 32 . . 0100000010...... A+-DXWL... U U U 12 12 4
+nop 0 . . 0100111001110001 .......... U U U 4 4 2
+not 8 . d 0100011000000... .......... U U U 4 4 2
+not 8 . . 0100011000...... A+-DXWL... U U U 8 8 4
+not 16 . d 0100011001000... .......... U U U 4 4 2
+not 16 . . 0100011001...... A+-DXWL... U U U 8 8 4
+not 32 . d 0100011010000... .......... U U U 6 6 2
+not 32 . . 0100011010...... A+-DXWL... U U U 12 12 4
+or 8 er d 1000...000000... .......... U U U 4 4 2
+or 8 er . 1000...000...... A+-DXWLdxI U U U 4 4 2
+or 16 er d 1000...001000... .......... U U U 4 4 2
+or 16 er . 1000...001...... A+-DXWLdxI U U U 4 4 2
+or 32 er d 1000...010000... .......... U U U 6 6 2
+or 32 er . 1000...010...... A+-DXWLdxI U U U 6 6 2
+or 8 re . 1000...100...... A+-DXWL... U U U 8 8 4
+or 16 re . 1000...101...... A+-DXWL... U U U 8 8 4
+or 32 re . 1000...110...... A+-DXWL... U U U 12 12 4
+ori 16 toc . 0000000000111100 .......... U U U 20 16 12
+ori 16 tos . 0000000001111100 .......... S S S 20 16 12
+ori 8 . d 0000000000000... .......... U U U 8 8 2
+ori 8 . . 0000000000...... A+-DXWL... U U U 12 12 4
+ori 16 . d 0000000001000... .......... U U U 8 8 2
+ori 16 . . 0000000001...... A+-DXWL... U U U 12 12 4
+ori 32 . d 0000000010000... .......... U U U 16 14 2
+ori 32 . . 0000000010...... A+-DXWL... U U U 20 20 4
+pack 16 rr . 1000...101000... .......... . . U . . 6
+pack 16 mm ax7 1000111101001... .......... . . U . . 13
+pack 16 mm ay7 1000...101001111 .......... . . U . . 13
+pack 16 mm axy7 1000111101001111 .......... . . U . . 13
+pack 16 mm . 1000...101001... .......... . . U . . 13
+pea 32 . . 0100100001...... A..DXWLdx. U U U 6 6 5
+reset 0 . . 0100111001110000 .......... S S S 0 0 0
+ror 8 s . 1110...000011... .......... U U U 6 6 8
+ror 16 s . 1110...001011... .......... U U U 6 6 8
+ror 32 s . 1110...010011... .......... U U U 8 8 8
+ror 8 r . 1110...000111... .......... U U U 6 6 8
+ror 16 r . 1110...001111... .......... U U U 6 6 8
+ror 32 r . 1110...010111... .......... U U U 8 8 8
+ror 16 . . 1110011011...... A+-DXWL... U U U 8 8 7
+rol 8 s . 1110...100011... .......... U U U 6 6 8
+rol 16 s . 1110...101011... .......... U U U 6 6 8
+rol 32 s . 1110...110011... .......... U U U 8 8 8
+rol 8 r . 1110...100111... .......... U U U 6 6 8
+rol 16 r . 1110...101111... .......... U U U 6 6 8
+rol 32 r . 1110...110111... .......... U U U 8 8 8
+rol 16 . . 1110011111...... A+-DXWL... U U U 8 8 7
+roxr 8 s . 1110...000010... .......... U U U 6 6 12
+roxr 16 s . 1110...001010... .......... U U U 6 6 12
+roxr 32 s . 1110...010010... .......... U U U 8 8 12
+roxr 8 r . 1110...000110... .......... U U U 6 6 12
+roxr 16 r . 1110...001110... .......... U U U 6 6 12
+roxr 32 r . 1110...010110... .......... U U U 8 8 12
+roxr 16 . . 1110010011...... A+-DXWL... U U U 8 8 5
+roxl 8 s . 1110...100010... .......... U U U 6 6 12
+roxl 16 s . 1110...101010... .......... U U U 6 6 12
+roxl 32 s . 1110...110010... .......... U U U 8 8 12
+roxl 8 r . 1110...100110... .......... U U U 6 6 12
+roxl 16 r . 1110...101110... .......... U U U 6 6 12
+roxl 32 r . 1110...110110... .......... U U U 8 8 12
+roxl 16 . . 1110010111...... A+-DXWL... U U U 8 8 5
+rtd 32 . . 0100111001110100 .......... . U U . 16 10
+rte 32 . . 0100111001110011 .......... S S S 20 24 20 bus fault not emulated
+rtm 32 . . 000001101100.... .......... . . U . . 19 not properly emulated
+rtr 32 . . 0100111001110111 .......... U U U 20 20 14
+rts 32 . . 0100111001110101 .......... U U U 16 16 10
+sbcd 8 rr . 1000...100000... .......... U U U 6 6 4
+sbcd 8 mm ax7 1000111100001... .......... U U U 18 18 16
+sbcd 8 mm ay7 1000...100001111 .......... U U U 18 18 16
+sbcd 8 mm axy7 1000111100001111 .......... U U U 18 18 16
+sbcd 8 mm . 1000...100001... .......... U U U 18 18 16
+st 8 . d 0101000011000... .......... U U U 6 4 4
+st 8 . . 0101000011...... A+-DXWL... U U U 8 8 6
+sf 8 . d 0101000111000... .......... U U U 4 4 4
+sf 8 . . 0101000111...... A+-DXWL... U U U 8 8 6
+scc 8 . d 0101....11000... .......... U U U 4 4 4
+scc 8 . . 0101....11...... A+-DXWL... U U U 8 8 6
+stop 0 . . 0100111001110010 .......... S S S 4 4 8
+sub 8 er d 1001...000000... .......... U U U 4 4 2
+sub 8 er . 1001...000...... A+-DXWLdxI U U U 4 4 2
+sub 16 er d 1001...001000... .......... U U U 4 4 2
+sub 16 er a 1001...001001... .......... U U U 4 4 2
+sub 16 er . 1001...001...... A+-DXWLdxI U U U 4 4 2
+sub 32 er d 1001...010000... .......... U U U 6 6 2
+sub 32 er a 1001...010001... .......... U U U 6 6 2
+sub 32 er . 1001...010...... A+-DXWLdxI U U U 6 6 2
+sub 8 re . 1001...100...... A+-DXWL... U U U 8 8 4
+sub 16 re . 1001...101...... A+-DXWL... U U U 8 8 4
+sub 32 re . 1001...110...... A+-DXWL... U U U 12 12 4
+suba 16 . d 1001...011000... .......... U U U 8 8 2
+suba 16 . a 1001...011001... .......... U U U 8 8 2
+suba 16 . . 1001...011...... A+-DXWLdxI U U U 8 8 2
+suba 32 . d 1001...111000... .......... U U U 6 6 2
+suba 32 . a 1001...111001... .......... U U U 6 6 2
+suba 32 . . 1001...111...... A+-DXWLdxI U U U 6 6 2
+subi 8 . d 0000010000000... .......... U U U 8 8 2
+subi 8 . . 0000010000...... A+-DXWL... U U U 12 12 4
+subi 16 . d 0000010001000... .......... U U U 8 8 2
+subi 16 . . 0000010001...... A+-DXWL... U U U 12 12 4
+subi 32 . d 0000010010000... .......... U U U 16 14 2
+subi 32 . . 0000010010...... A+-DXWL... U U U 20 20 4
+subq 8 . d 0101...100000... .......... U U U 4 4 2
+subq 8 . . 0101...100...... A+-DXWL... U U U 8 8 4
+subq 16 . d 0101...101000... .......... U U U 4 4 2
+subq 16 . a 0101...101001... .......... U U U 8 4 2
+subq 16 . . 0101...101...... A+-DXWL... U U U 8 8 4
+subq 32 . d 0101...110000... .......... U U U 8 8 2
+subq 32 . a 0101...110001... .......... U U U 8 8 2
+subq 32 . . 0101...110...... A+-DXWL... U U U 12 12 4
+subx 8 rr . 1001...100000... .......... U U U 4 4 2
+subx 16 rr . 1001...101000... .......... U U U 4 4 2
+subx 32 rr . 1001...110000... .......... U U U 8 6 2
+subx 8 mm ax7 1001111100001... .......... U U U 18 18 12
+subx 8 mm ay7 1001...100001111 .......... U U U 18 18 12
+subx 8 mm axy7 1001111100001111 .......... U U U 18 18 12
+subx 8 mm . 1001...100001... .......... U U U 18 18 12
+subx 16 mm . 1001...101001... .......... U U U 18 18 12
+subx 32 mm . 1001...110001... .......... U U U 30 30 12
+swap 32 . . 0100100001000... .......... U U U 4 4 4
+tas 8 . d 0100101011000... .......... U U U 4 4 4
+tas 8 . . 0100101011...... A+-DXWL... U U U 14 14 12
+trap 0 . . 010011100100.... .......... U U U 4 4 4
+trapt 0 . . 0101000011111100 .......... . . U . . 4
+trapt 16 . . 0101000011111010 .......... . . U . . 6
+trapt 32 . . 0101000011111011 .......... . . U . . 8
+trapf 0 . . 0101000111111100 .......... . . U . . 4
+trapf 16 . . 0101000111111010 .......... . . U . . 6
+trapf 32 . . 0101000111111011 .......... . . U . . 8
+trapcc 0 . . 0101....11111100 .......... . . U . . 4
+trapcc 16 . . 0101....11111010 .......... . . U . . 6
+trapcc 32 . . 0101....11111011 .......... . . U . . 8
+trapv 0 . . 0100111001110110 .......... U U U 4 4 4
+tst 8 . d 0100101000000... .......... U U U 4 4 2
+tst 8 . . 0100101000...... A+-DXWL... U U U 4 4 2
+tst 8 . pcdi 0100101000111010 .......... . . U . . 7
+tst 8 . pcix 0100101000111011 .......... . . U . . 9
+tst 8 . i 0100101000111100 .......... . . U . . 6
+tst 16 . d 0100101001000... .......... U U U 4 4 2
+tst 16 . a 0100101001001... .......... . . U . . 2
+tst 16 . . 0100101001...... A+-DXWL... U U U 4 4 2
+tst 16 . pcdi 0100101001111010 .......... . . U . . 7
+tst 16 . pcix 0100101001111011 .......... . . U . . 9
+tst 16 . i 0100101001111100 .......... . . U . . 6
+tst 32 . d 0100101010000... .......... U U U 4 4 2
+tst 32 . a 0100101010001... .......... . . U . . 2
+tst 32 . . 0100101010...... A+-DXWL... U U U 4 4 2
+tst 32 . pcdi 0100101010111010 .......... . . U . . 7
+tst 32 . pcix 0100101010111011 .......... . . U . . 9
+tst 32 . i 0100101010111100 .......... . . U . . 6
+unlk 32 . a7 0100111001011111 .......... U U U 12 12 6
+unlk 32 . . 0100111001011... .......... U U U 12 12 6
+unpk 16 rr . 1000...110000... .......... . . U . . 8
+unpk 16 mm ax7 1000111110001... .......... . . U . . 13
+unpk 16 mm ay7 1000...110001111 .......... . . U . . 13
+unpk 16 mm axy7 1000111110001111 .......... . . U . . 13
+unpk 16 mm . 1000...110001... .......... . . U . . 13
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_OPCODE_HANDLER_BODY
+
+M68KMAKE_OP(1010, 0, ., .)
+{
+ m68ki_exception_1010();
+}
+
+
+M68KMAKE_OP(1111, 0, ., .)
+{
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(abcd, 8, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(abcd, 8, mm, ax7)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(abcd, 8, mm, ay7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(abcd, 8, mm, axy7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(abcd, 8, mm, .)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(add, 8, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 8, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_8;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 16, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 16, er, a)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 16, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_16;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 32, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 32, er, a)
+{
+ uint* r_dst = &DX;
+ uint src = AY;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 32, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_32;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(add, 8, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(add, 16, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(add, 32, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(adda, 16, ., d)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY));
+}
+
+
+M68KMAKE_OP(adda, 16, ., a)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY));
+}
+
+
+M68KMAKE_OP(adda, 16, ., .)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));
+}
+
+
+M68KMAKE_OP(adda, 32, ., d)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY);
+}
+
+
+M68KMAKE_OP(adda, 32, ., a)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY);
+}
+
+
+M68KMAKE_OP(adda, 32, ., .)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + M68KMAKE_GET_OPER_AY_32);
+}
+
+
+M68KMAKE_OP(addi, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(addi, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addi, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(addi, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addi, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(addi, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addq, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(addq, 8, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addq, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(addq, 16, ., a)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
+}
+
+
+M68KMAKE_OP(addq, 16, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addq, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(addq, 32, ., a)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
+}
+
+
+M68KMAKE_OP(addq, 32, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(addx, 8, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(addx, 16, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(addx, 32, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+M68KMAKE_OP(addx, 8, mm, ax7)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(addx, 8, mm, ay7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(addx, 8, mm, axy7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(addx, 8, mm, .)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(addx, 16, mm, .)
+{
+ uint src = OPER_AY_PD_16();
+ uint ea = EA_AX_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+M68KMAKE_OP(addx, 32, mm, .)
+{
+ uint src = OPER_AY_PD_32();
+ uint ea = EA_AX_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+M68KMAKE_OP(and, 8, er, d)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 8, er, .)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (M68KMAKE_GET_OPER_AY_8 | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 16, er, d)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 16, er, .)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (M68KMAKE_GET_OPER_AY_16 | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 32, er, d)
+{
+ FLAG_Z = DX &= DY;
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 32, er, .)
+{
+ FLAG_Z = DX &= M68KMAKE_GET_OPER_AY_32;
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(and, 8, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(and, 16, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(and, 32, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+M68KMAKE_OP(andi, 8, ., d)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(andi, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(andi, 16, ., d)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(andi, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+M68KMAKE_OP(andi, 32, ., d)
+{
+ FLAG_Z = DY &= (OPER_I_32());
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(andi, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+M68KMAKE_OP(andi, 16, toc, .)
+{
+ m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16());
+}
+
+
+M68KMAKE_OP(andi, 16, tos, .)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() & src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(asr, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(GET_MSB_8(src))
+ res |= m68ki_shift_8_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+M68KMAKE_OP(asr, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(GET_MSB_16(src))
+ res |= m68ki_shift_16_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+M68KMAKE_OP(asr, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(GET_MSB_32(src))
+ res |= m68ki_shift_32_table[shift];
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+M68KMAKE_OP(asr, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 8)
+ {
+ if(GET_MSB_8(src))
+ res |= m68ki_shift_8_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_8(src))
+ {
+ *r_dst |= 0xff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asr, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 16)
+ {
+ if(GET_MSB_16(src))
+ res |= m68ki_shift_16_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_16(src))
+ {
+ *r_dst |= 0xffff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asr, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ if(GET_MSB_32(src))
+ res |= m68ki_shift_32_table[shift];
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_32(src))
+ {
+ *r_dst = 0xffffffff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asr, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+M68KMAKE_OP(asl, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_8_table[shift + 1];
+ FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7;
+}
+
+
+M68KMAKE_OP(asl, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (8-shift);
+ src &= m68ki_shift_16_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
+}
+
+
+M68KMAKE_OP(asl, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (24-shift);
+ src &= m68ki_shift_32_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
+}
+
+
+M68KMAKE_OP(asl, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_8_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asl, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_X = FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_16_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asl, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_32_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(asl, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+M68KMAKE_OP(bcc, 8, ., .)
+{
+ if(M68KMAKE_CC)
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+M68KMAKE_OP(bcc, 16, ., .)
+{
+ if(M68KMAKE_CC)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+M68KMAKE_OP(bcc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(M68KMAKE_CC)
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bchg, 32, r, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst ^= mask;
+}
+
+
+M68KMAKE_OP(bchg, 8, r, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+M68KMAKE_OP(bchg, 32, s, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst ^= mask;
+}
+
+
+M68KMAKE_OP(bchg, 8, s, .)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+M68KMAKE_OP(bclr, 32, r, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst &= ~mask;
+}
+
+
+M68KMAKE_OP(bclr, 8, r, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+M68KMAKE_OP(bclr, 32, s, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst &= ~mask;
+}
+
+
+M68KMAKE_OP(bclr, 8, s, .)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+M68KMAKE_OP(bfchg, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data ^= mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfchg, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfclr, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data &= ~mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfclr, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfexts, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2>>12)&7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfexts, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfextu, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data >>= 32 - width;
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2>>12)&7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfextu, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfffo, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+ uint bit;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data >>= 32 - width;
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfffo, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfins, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+ uint64 insert = REG_D[(word2>>12)&7];
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ insert = MASK_OUT_ABOVE_32(insert << (32 - width));
+ FLAG_N = NFLAG_32(insert);
+ FLAG_Z = insert;
+ insert = ROR_32(insert, offset);
+
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data &= ~mask;
+ *data |= insert;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfins, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfset, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data |= mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bfset, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bftst, 32, ., d)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bftst, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bkpt, 0, ., .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0); /* auto-disable (see m68kcpu.h) */
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bra, 8, ., .)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+M68KMAKE_OP(bra, 16, ., .)
+{
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+M68KMAKE_OP(bra, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(bset, 32, r, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst |= mask;
+}
+
+
+M68KMAKE_OP(bset, 8, r, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+M68KMAKE_OP(bset, 32, s, d)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst |= mask;
+}
+
+
+M68KMAKE_OP(bset, 8, s, .)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+M68KMAKE_OP(bsr, 8, ., .)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+}
+
+
+M68KMAKE_OP(bsr, 16, ., .)
+{
+ uint offset = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ REG_PC -= 2;
+ m68ki_branch_16(offset);
+}
+
+
+M68KMAKE_OP(bsr, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint offset = OPER_I_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ REG_PC -= 4;
+ m68ki_branch_32(offset);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(btst, 32, r, d)
+{
+ FLAG_Z = DY & (1 << (DX & 0x1f));
+}
+
+
+M68KMAKE_OP(btst, 8, r, .)
+{
+ FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << (DX & 7));
+}
+
+
+M68KMAKE_OP(btst, 32, s, d)
+{
+ FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f));
+}
+
+
+M68KMAKE_OP(btst, 8, s, .)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << bit);
+}
+
+
+M68KMAKE_OP(callm, 32, ., .)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = M68KMAKE_GET_EA_AY_32;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cas, 8, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cas, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cas, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cas2, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_32();
+ uint* compare1 = &REG_D[(word2 >> 16) & 7];
+ uint ea1 = REG_DA[(word2 >> 28) & 15];
+ uint dest1 = m68ki_read_16(ea1);
+ uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1);
+ uint* compare2 = &REG_D[word2 & 7];
+ uint ea2 = REG_DA[(word2 >> 12) & 15];
+ uint dest2 = m68ki_read_16(ea2);
+ uint res2;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res1);
+ FLAG_Z = MASK_OUT_ABOVE_16(res1);
+ FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1);
+ FLAG_C = CFLAG_16(res1);
+
+ if(COND_EQ())
+ {
+ res2 = dest2 - MASK_OUT_ABOVE_16(*compare2);
+
+ FLAG_N = NFLAG_16(res2);
+ FLAG_Z = MASK_OUT_ABOVE_16(res2);
+ FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2);
+ FLAG_C = CFLAG_16(res2);
+
+ if(COND_EQ())
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]);
+ m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]);
+ return;
+ }
+ }
+ *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1;
+ *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cas2, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_32();
+ uint* compare1 = &REG_D[(word2 >> 16) & 7];
+ uint ea1 = REG_DA[(word2 >> 28) & 15];
+ uint dest1 = m68ki_read_32(ea1);
+ uint res1 = dest1 - *compare1;
+ uint* compare2 = &REG_D[word2 & 7];
+ uint ea2 = REG_DA[(word2 >> 12) & 15];
+ uint dest2 = m68ki_read_32(ea2);
+ uint res2;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res1);
+ FLAG_Z = MASK_OUT_ABOVE_32(res1);
+ FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1);
+ FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1);
+
+ if(COND_EQ())
+ {
+ res2 = dest2 - *compare2;
+
+ FLAG_N = NFLAG_32(res2);
+ FLAG_Z = MASK_OUT_ABOVE_32(res2);
+ FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2);
+ FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2);
+
+ if(COND_EQ())
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]);
+ m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]);
+ return;
+ }
+ }
+ *compare1 = dest1;
+ *compare2 = dest2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk, 16, ., d)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(DY);
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+M68KMAKE_OP(chk, 16, ., .)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+M68KMAKE_OP(chk, 32, ., d)
+{
+ logerror("%08x: Chk 32d\n",activecpu_get_pc());
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(DY);
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk, 32, ., .)
+{
+ logerror("%08x: Chk 32\n",activecpu_get_pc());
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(M68KMAKE_GET_OPER_AY_32);
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 8, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_PCDI_8();
+ uint lower_bound = m68ki_read_pcrel_8(ea);
+ uint upper_bound = m68ki_read_pcrel_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 8, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_PCIX_8();
+ uint lower_bound = m68ki_read_pcrel_8(ea);
+ uint upper_bound = m68ki_read_pcrel_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 8, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 16, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_PCDI_16();
+ uint lower_bound = m68ki_read_pcrel_16(ea);
+ uint upper_bound = m68ki_read_pcrel_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 16, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_PCIX_16();
+ uint lower_bound = m68ki_read_pcrel_16(ea);
+ uint upper_bound = m68ki_read_pcrel_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 32, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_PCDI_32();
+ uint lower_bound = m68ki_read_pcrel_32(ea);
+ uint upper_bound = m68ki_read_pcrel_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 32, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_PCIX_32();
+ uint lower_bound = m68ki_read_pcrel_32(ea);
+ uint upper_bound = m68ki_read_pcrel_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(chk2cmp2, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(clr, 8, ., d)
+{
+ DY &= 0xffffff00;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(clr, 8, ., .)
+{
+ m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(clr, 16, ., d)
+{
+ DY &= 0xffff0000;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(clr, 16, ., .)
+{
+ m68ki_write_16(M68KMAKE_GET_EA_AY_16, 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(clr, 32, ., d)
+{
+ DY = 0;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(clr, 32, ., .)
+{
+ m68ki_write_32(M68KMAKE_GET_EA_AY_32, 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+M68KMAKE_OP(cmp, 8, ., d)
+{
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmp, 8, ., .)
+{
+ uint src = M68KMAKE_GET_OPER_AY_8;
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmp, 16, ., d)
+{
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmp, 16, ., a)
+{
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmp, 16, ., .)
+{
+ uint src = M68KMAKE_GET_OPER_AY_16;
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmp, 32, ., d)
+{
+ uint src = DY;
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmp, 32, ., a)
+{
+ uint src = AY;
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmp, 32, ., .)
+{
+ uint src = M68KMAKE_GET_OPER_AY_32;
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 16, ., d)
+{
+ uint src = MAKE_INT_16(DY);
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 16, ., a)
+{
+ uint src = MAKE_INT_16(AY);
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 16, ., .)
+{
+ uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 32, ., d)
+{
+ uint src = DY;
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 32, ., a)
+{
+ uint src = AY;
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpa, 32, ., .)
+{
+ uint src = M68KMAKE_GET_OPER_AY_32;
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpi, 8, ., d)
+{
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(DY);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpi, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint dst = M68KMAKE_GET_OPER_AY_8;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpi, 8, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_8();
+ uint dst = OPER_PCDI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpi, 8, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_8();
+ uint dst = OPER_PCIX_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpi, 16, ., d)
+{
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(DY);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmpi, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint dst = M68KMAKE_GET_OPER_AY_16;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmpi, 16, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_16();
+ uint dst = OPER_PCDI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpi, 16, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_16();
+ uint dst = OPER_PCIX_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpi, 32, ., d)
+{
+ uint src = OPER_I_32();
+ uint dst = DY;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpi, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint dst = M68KMAKE_GET_OPER_AY_32;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cmpi, 32, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_32();
+ uint dst = OPER_PCDI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpi, 32, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_32();
+ uint dst = OPER_PCIX_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(cmpm, 8, ., ax7)
+{
+ uint src = OPER_AY_PI_8();
+ uint dst = OPER_A7_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpm, 8, ., ay7)
+{
+ uint src = OPER_A7_PI_8();
+ uint dst = OPER_AX_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpm, 8, ., axy7)
+{
+ uint src = OPER_A7_PI_8();
+ uint dst = OPER_A7_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpm, 8, ., .)
+{
+ uint src = OPER_AY_PI_8();
+ uint dst = OPER_AX_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+M68KMAKE_OP(cmpm, 16, ., .)
+{
+ uint src = OPER_AY_PI_16();
+ uint dst = OPER_AX_PI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+M68KMAKE_OP(cmpm, 32, ., .)
+{
+ uint src = OPER_AY_PI_32();
+ uint dst = OPER_AX_PI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+M68KMAKE_OP(cpbcc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(cpdbcc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(cpgen, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(cpscc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(cptrapcc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+M68KMAKE_OP(dbt, 16, ., .)
+{
+ REG_PC += 2;
+}
+
+
+M68KMAKE_OP(dbf, 16, ., .)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+M68KMAKE_OP(dbcc, 16, ., .)
+{
+ if(M68KMAKE_NOT_CC)
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+M68KMAKE_OP(divs, 16, ., d)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(DY);
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+M68KMAKE_OP(divs, 16, ., .)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+M68KMAKE_OP(divu, 16, ., d)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+M68KMAKE_OP(divu, 16, ., .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_16;
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+M68KMAKE_OP(divl, 32, ., d)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = DY;
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = DY;
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+M68KMAKE_OP(divl, 32, ., .)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = M68KMAKE_GET_OPER_AY_32;
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = M68KMAKE_GET_OPER_AY_32;
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+M68KMAKE_OP(eor, 8, ., d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eor, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eor, 16, ., d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eor, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eor, 32, ., d)
+{
+ uint res = DY ^= DX;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eor, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 8, ., d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8());
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 16, ., d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16());
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 32, ., d)
+{
+ uint res = DY ^= OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(eori, 16, toc, .)
+{
+ m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16());
+}
+
+
+M68KMAKE_OP(eori, 16, tos, .)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() ^ src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(exg, 32, dd, .)
+{
+ uint* reg_a = &DX;
+ uint* reg_b = &DY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+M68KMAKE_OP(exg, 32, aa, .)
+{
+ uint* reg_a = &AX;
+ uint* reg_b = &AY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+M68KMAKE_OP(exg, 32, da, .)
+{
+ uint* reg_a = &DX;
+ uint* reg_b = &AY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+M68KMAKE_OP(ext, 16, ., .)
+{
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0);
+
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ext, 32, ., .)
+{
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0);
+
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(extb, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0);
+
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(illegal, 0, ., .)
+{
+ m68ki_exception_illegal();
+}
+
+M68KMAKE_OP(jmp, 32, ., .)
+{
+ m68ki_jump(M68KMAKE_GET_EA_AY_32);
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+M68KMAKE_OP(jsr, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+M68KMAKE_OP(lea, 32, ., .)
+{
+ AX = M68KMAKE_GET_EA_AY_32;
+}
+
+
+M68KMAKE_OP(link, 16, ., a7)
+{
+ REG_A[7] -= 4;
+ m68ki_write_32(REG_A[7], REG_A[7]);
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+}
+
+
+M68KMAKE_OP(link, 16, ., .)
+{
+ uint* r_dst = &AY;
+
+ m68ki_push_32(*r_dst);
+ *r_dst = REG_A[7];
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+}
+
+
+M68KMAKE_OP(link, 32, ., a7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_A[7] -= 4;
+ m68ki_write_32(REG_A[7], REG_A[7]);
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(link, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint* r_dst = &AY;
+
+ m68ki_push_32(*r_dst);
+ *r_dst = REG_A[7];
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(lsr, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0);
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsr, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (8-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (24-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_X = FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(lsl, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, d, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, d, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, ai, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, ai, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pi7, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pi, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pi7, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pi, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pd7, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pd, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pd7, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, pd, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, di, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, di, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, ix, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, ix, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, aw, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, aw, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, al, d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 8, al, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, d, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, d, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, d, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ai, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ai, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ai, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pi, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pi, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pi, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pd, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pd, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, pd, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, di, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, di, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, di, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ix, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ix, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, ix, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, aw, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, aw, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, aw, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, al, d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, al, a)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 16, al, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, d, d)
+{
+ uint res = DY;
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, d, a)
+{
+ uint res = AY;
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, d, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ai, d)
+{
+ uint res = DY;
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ai, a)
+{
+ uint res = AY;
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ai, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pi, d)
+{
+ uint res = DY;
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pi, a)
+{
+ uint res = AY;
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pi, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pd, d)
+{
+ uint res = DY;
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pd, a)
+{
+ uint res = AY;
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, pd, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, di, d)
+{
+ uint res = DY;
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, di, a)
+{
+ uint res = AY;
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, di, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ix, d)
+{
+ uint res = DY;
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ix, a)
+{
+ uint res = AY;
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, ix, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, aw, d)
+{
+ uint res = DY;
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, aw, a)
+{
+ uint res = AY;
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, aw, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, al, d)
+{
+ uint res = DY;
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, al, a)
+{
+ uint res = AY;
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(move, 32, al, .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(movea, 16, ., d)
+{
+ AX = MAKE_INT_16(DY);
+}
+
+
+M68KMAKE_OP(movea, 16, ., a)
+{
+ AX = MAKE_INT_16(AY);
+}
+
+
+M68KMAKE_OP(movea, 16, ., .)
+{
+ AX = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);
+}
+
+
+M68KMAKE_OP(movea, 32, ., d)
+{
+ AX = DY;
+}
+
+
+M68KMAKE_OP(movea, 32, ., a)
+{
+ AX = AY;
+}
+
+
+M68KMAKE_OP(movea, 32, ., .)
+{
+ AX = M68KMAKE_GET_OPER_AY_32;
+}
+
+
+M68KMAKE_OP(move, 16, frc, d)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(move, 16, frc, .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(M68KMAKE_GET_EA_AY_16, m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(move, 16, toc, d)
+{
+ m68ki_set_ccr(DY);
+}
+
+
+M68KMAKE_OP(move, 16, toc, .)
+{
+ m68ki_set_ccr(M68KMAKE_GET_OPER_AY_16);
+}
+
+
+M68KMAKE_OP(move, 16, frs, d)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr();
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(move, 16, frs, .)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(move, 16, tos, d)
+{
+ if(FLAG_S)
+ {
+ m68ki_set_sr(DY);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(move, 16, tos, .)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = M68KMAKE_GET_OPER_AY_16;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(move, 32, fru, .)
+{
+ if(FLAG_S)
+ {
+ AY = REG_USP;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(move, 32, tou, .)
+{
+ if(FLAG_S)
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_USP = AY;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(movec, 32, cr, .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ switch (word2 & 0xfff)
+ {
+ case 0x000: /* SFC */
+ REG_DA[(word2 >> 12) & 15] = REG_SFC;
+ return;
+ case 0x001: /* DFC */
+ REG_DA[(word2 >> 12) & 15] = REG_DFC;
+ return;
+ case 0x002: /* CACR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = REG_CACR;
+ return;
+ }
+ return;
+ case 0x800: /* USP */
+ REG_DA[(word2 >> 12) & 15] = REG_USP;
+ return;
+ case 0x801: /* VBR */
+ REG_DA[(word2 >> 12) & 15] = REG_VBR;
+ return;
+ case 0x802: /* CAAR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = REG_CAAR;
+ return;
+ }
+ m68ki_exception_illegal();
+ break;
+ case 0x803: /* MSP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP;
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x804: /* ISP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP;
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ default:
+ m68ki_exception_illegal();
+ return;
+ }
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(movec, 32, rc, .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ switch (word2 & 0xfff)
+ {
+ case 0x000: /* SFC */
+ REG_SFC = REG_DA[(word2 >> 12) & 15] & 7;
+ return;
+ case 0x001: /* DFC */
+ REG_DFC = REG_DA[(word2 >> 12) & 15] & 7;
+ return;
+ case 0x002: /* CACR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_CACR = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x800: /* USP */
+ REG_USP = REG_DA[(word2 >> 12) & 15];
+ return;
+ case 0x801: /* VBR */
+ REG_VBR = REG_DA[(word2 >> 12) & 15];
+ return;
+ case 0x802: /* CAAR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_CAAR = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x803: /* MSP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* we are in supervisor mode so just check for M flag */
+ if(!FLAG_M)
+ {
+ REG_MSP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ REG_SP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x804: /* ISP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(!FLAG_M)
+ {
+ REG_SP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ REG_ISP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ default:
+ m68ki_exception_illegal();
+ return;
+ }
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(movem, 16, re, pd)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ ea -= 2;
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i]));
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 16, re, .)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 32, re, pd)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ ea -= 4;
+ m68ki_write_32(ea, REG_DA[15-i]);
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movem, 32, re, .)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movem, 16, er, pi)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 16, er, pcdi)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCDI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 16, er, pcix)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCIX_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 16, er, .)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+M68KMAKE_OP(movem, 32, er, pi)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movem, 32, er, pcdi)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCDI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_pcrel_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movem, 32, er, pcix)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCIX_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_pcrel_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movem, 32, er, .)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+M68KMAKE_OP(movep, 16, re, .)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = DX;
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 8));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
+}
+
+
+M68KMAKE_OP(movep, 32, re, .)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = DX;
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
+}
+
+
+M68KMAKE_OP(movep, 16, er, .)
+{
+ uint ea = EA_AY_DI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2));
+}
+
+
+M68KMAKE_OP(movep, 32, er, .)
+{
+ uint ea = EA_AY_DI_32();
+
+ DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16)
+ + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6);
+}
+
+
+M68KMAKE_OP(moves, 8, ., .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(moves, 16, ., .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(moves, 32, ., .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(moveq, 32, ., .)
+{
+ uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR));
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(muls, 16, ., d)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(muls, 16, ., .)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(M68KMAKE_GET_OPER_AY_16) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(mulu, 16, ., d)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(mulu, 16, ., .)
+{
+ uint* r_dst = &DX;
+ uint res = M68KMAKE_GET_OPER_AY_16 * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(mull, 32, ., d)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = DY;
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = DY;
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+M68KMAKE_OP(mull, 32, ., .)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = M68KMAKE_GET_OPER_AY_32;
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = M68KMAKE_GET_OPER_AY_32;
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+M68KMAKE_OP(nbcd, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint dst = *r_dst;
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+M68KMAKE_OP(nbcd, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+M68KMAKE_OP(neg, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_8(*r_dst);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = *r_dst & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(neg, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(neg, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_16(*r_dst);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (*r_dst & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(neg, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(neg, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - *r_dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res);
+ FLAG_V = (*r_dst & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(neg, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(negx, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = *r_dst & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(negx, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(negx, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (*r_dst & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(negx, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+M68KMAKE_OP(negx, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res);
+ FLAG_V = (*r_dst & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+M68KMAKE_OP(negx, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+M68KMAKE_OP(nop, 0, ., .)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+}
+
+
+M68KMAKE_OP(not, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_8(~*r_dst);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(not, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(not, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(~*r_dst);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(not, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(not, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(not, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 8, er, d)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY)));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 8, er, .)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= M68KMAKE_GET_OPER_AY_8));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 16, er, d)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY)));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 16, er, .)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= M68KMAKE_GET_OPER_AY_16));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 32, er, d)
+{
+ uint res = DX |= DY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 32, er, .)
+{
+ uint res = DX |= M68KMAKE_GET_OPER_AY_32;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 8, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 16, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(or, 32, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 8, ., d)
+{
+ uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 16, ., d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16());
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 32, ., d)
+{
+ uint res = DY |= OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ori, 16, toc, .)
+{
+ m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16());
+}
+
+
+M68KMAKE_OP(ori, 16, tos, .)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() | src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(pack, 16, rr, .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: DX and DY are reversed in Motorola's docs */
+ uint src = DY + OPER_I_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(pack, 16, mm, ax7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_AY_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(pack, 16, mm, ay7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_A7_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(pack, 16, mm, axy7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint ea_src = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_A7_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(pack, 16, mm, .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_AY_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(pea, 32, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+
+ m68ki_push_32(ea);
+}
+
+
+M68KMAKE_OP(reset, 0, ., .)
+{
+ if(FLAG_S)
+ {
+ m68ki_output_reset(); /* auto-disable (see m68kcpu.h) */
+ USE_CYCLES(CYC_RESET);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(ror, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_8(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-orig_shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_16(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint res = ROR_32(src, shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_8(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_C = src << (8-((shift-1)&7));
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 15;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_16(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = (src >> ((shift - 1) & 15)) << 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 31;
+ uint64 src = *r_dst;
+ uint res = ROR_32(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = res;
+ FLAG_C = (src >> ((shift - 1) & 31)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(ror, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_8(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = src << orig_shift;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_16(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> (8-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 32, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint res = ROL_32(src, shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = src >> (24-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_8(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+ FLAG_C = (src & 1)<<8;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 15;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift));
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+ FLAG_C = (src & 1)<<8;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 32, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 31;
+ uint64 src = *r_dst;
+ uint res = ROL_32(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = res;
+
+ FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rol, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxr, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxr, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxr, 32, s, .)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROR_33_64(res, shift);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
+ uint new_x_flag = src & (1 << (shift - 1));
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+M68KMAKE_OP(roxr, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 9;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxr, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 17;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxr, 32, r, .)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 33;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROR_33_64(res, shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift % 33;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
+ uint new_x_flag = src & (1 << (shift - 1));
+
+ if(orig_shift != 0)
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = res;
+ FLAG_X = (new_x_flag != 0)<<8;
+ }
+ else
+ res = src;
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+M68KMAKE_OP(roxr, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxl, 8, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxl, 16, s, .)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxl, 32, s, .)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROL_33_64(res, shift);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
+ uint new_x_flag = src & (1 << (32 - shift));
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+M68KMAKE_OP(roxl, 8, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 9;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxl, 16, r, .)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 17;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(roxl, 32, r, .)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 33;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROL_33_64(res, shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift % 33;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
+ uint new_x_flag = src & (1 << (32 - shift));
+
+ if(orig_shift != 0)
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = res;
+ FLAG_X = (new_x_flag != 0)<<8;
+ }
+ else
+ res = src;
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+M68KMAKE_OP(roxl, 16, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(rtd, 32, ., .)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ uint new_pc = m68ki_pull_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+ m68ki_jump(new_pc);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(rte, 32, ., .)
+{
+ if(FLAG_S)
+ {
+ uint new_sr;
+ uint new_pc;
+ uint format_word;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ return;
+ }
+
+ if(CPU_TYPE_IS_010(CPU_TYPE))
+ {
+ format_word = m68ki_read_16(REG_A[7]+6) >> 12;
+ if(format_word == 0)
+ {
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ /* Not handling bus fault (9) */
+ m68ki_exception_format_error();
+ return;
+ }
+
+ /* Otherwise it's 020 */
+rte_loop:
+ format_word = m68ki_read_16(REG_A[7]+6) >> 12;
+ switch(format_word)
+ {
+ case 0: /* Normal */
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ return;
+ case 1: /* Throwaway */
+ new_sr = m68ki_pull_16();
+ m68ki_fake_pull_32(); /* program counter */
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_set_sr_noint(new_sr);
+ goto rte_loop;
+ case 2: /* Trap */
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_fake_pull_32(); /* address */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ /* Not handling long or short bus fault */
+ m68ki_exception_format_error();
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(rtm, 32, ., .)
+{
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(rtr, 32, ., .)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_ccr(m68ki_pull_16());
+ m68ki_jump(m68ki_pull_32());
+}
+
+
+M68KMAKE_OP(rts, 32, ., .)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_jump(m68ki_pull_32());
+}
+
+
+M68KMAKE_OP(sbcd, 8, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(sbcd, 8, mm, ax7)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(sbcd, 8, mm, ay7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(sbcd, 8, mm, axy7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(sbcd, 8, mm, .)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(st, 8, ., d)
+{
+ DY |= 0xff;
+}
+
+
+M68KMAKE_OP(st, 8, ., .)
+{
+ m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0xff);
+}
+
+
+M68KMAKE_OP(sf, 8, ., d)
+{
+ DY &= 0xffffff00;
+}
+
+
+M68KMAKE_OP(sf, 8, ., .)
+{
+ m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);
+}
+
+
+M68KMAKE_OP(scc, 8, ., d)
+{
+ if(M68KMAKE_CC)
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+M68KMAKE_OP(scc, 8, ., .)
+{
+ m68ki_write_8(M68KMAKE_GET_EA_AY_8, M68KMAKE_CC ? 0xff : 0);
+}
+
+
+M68KMAKE_OP(stop, 0, ., .)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ CPU_STOPPED |= STOP_LEVEL_STOP;
+ m68ki_set_sr(new_sr);
+ m68ki_remaining_cycles = 0;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+M68KMAKE_OP(sub, 8, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 8, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_8;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 16, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 16, er, a)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 16, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_16;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 32, er, d)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 32, er, a)
+{
+ uint* r_dst = &DX;
+ uint src = AY;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 32, er, .)
+{
+ uint* r_dst = &DX;
+ uint src = M68KMAKE_GET_OPER_AY_32;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(sub, 8, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(sub, 16, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(sub, 32, re, .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(suba, 16, ., d)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY));
+}
+
+
+M68KMAKE_OP(suba, 16, ., a)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY));
+}
+
+
+M68KMAKE_OP(suba, 16, ., .)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));
+}
+
+
+M68KMAKE_OP(suba, 32, ., d)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY);
+}
+
+
+M68KMAKE_OP(suba, 32, ., a)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY);
+}
+
+
+M68KMAKE_OP(suba, 32, ., .)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - M68KMAKE_GET_OPER_AY_32);
+}
+
+
+M68KMAKE_OP(subi, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(subi, 8, ., .)
+{
+ uint src = OPER_I_8();
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subi, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(subi, 16, ., .)
+{
+ uint src = OPER_I_16();
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subi, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(subi, 32, ., .)
+{
+ uint src = OPER_I_32();
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subq, 8, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(subq, 8, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subq, 16, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+M68KMAKE_OP(subq, 16, ., a)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
+}
+
+
+M68KMAKE_OP(subq, 16, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_16;
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subq, 32, ., d)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+M68KMAKE_OP(subq, 32, ., a)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
+}
+
+
+M68KMAKE_OP(subq, 32, ., .)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = M68KMAKE_GET_EA_AY_32;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+M68KMAKE_OP(subx, 8, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(subx, 16, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+M68KMAKE_OP(subx, 32, rr, .)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+M68KMAKE_OP(subx, 8, mm, ax7)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(subx, 8, mm, ay7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(subx, 8, mm, axy7)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(subx, 8, mm, .)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+M68KMAKE_OP(subx, 16, mm, .)
+{
+ uint src = OPER_AY_PD_16();
+ uint ea = EA_AX_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+M68KMAKE_OP(subx, 32, mm, .)
+{
+ uint src = OPER_AY_PD_32();
+ uint ea = EA_AX_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+M68KMAKE_OP(swap, 32, ., .)
+{
+ uint* r_dst = &DY;
+
+ FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16);
+ *r_dst = (*r_dst>>16) | FLAG_Z;
+
+ FLAG_Z = *r_dst;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tas, 8, ., d)
+{
+ uint* r_dst = &DY;
+
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst |= 0x80;
+}
+
+
+M68KMAKE_OP(tas, 8, ., .)
+{
+ uint ea = M68KMAKE_GET_EA_AY_8;
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+M68KMAKE_OP(trap, 0, ., .)
+{
+ /* Trap#n stacks exception frame type 0 */
+ m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */
+}
+
+
+M68KMAKE_OP(trapt, 0, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapt, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapt, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapf, 0, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapf, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapf, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapcc, 0, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(M68KMAKE_CC)
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapcc, 16, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(M68KMAKE_CC)
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapcc, 32, ., .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(M68KMAKE_CC)
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(trapv, 0, ., .)
+{
+ if(COND_VC())
+ {
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+}
+
+
+M68KMAKE_OP(tst, 8, ., d)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 8, ., .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_8;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 8, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 8, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 8, ., i)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 16, ., d)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 16, ., a)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = MAKE_INT_16(AY);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 16, ., .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_16;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 16, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 16, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 16, ., i)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 32, ., d)
+{
+ uint res = DY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 32, ., a)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = AY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 32, ., .)
+{
+ uint res = M68KMAKE_GET_OPER_AY_32;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+M68KMAKE_OP(tst, 32, ., pcdi)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 32, ., pcix)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(tst, 32, ., i)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(unlk, 32, ., a7)
+{
+ REG_A[7] = m68ki_read_32(REG_A[7]);
+}
+
+
+M68KMAKE_OP(unlk, 32, ., .)
+{
+ uint* r_dst = &AY;
+
+ REG_A[7] = *r_dst;
+ *r_dst = m68ki_pull_32();
+}
+
+
+M68KMAKE_OP(unpk, 16, rr, .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: DX and DY are reversed in Motorola's docs */
+ uint src = DY;
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(unpk, 16, mm, ax7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_AY_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(unpk, 16, mm, ay7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_A7_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(unpk, 16, mm, axy7)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_A7_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+M68KMAKE_OP(unpk, 16, mm, .)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_AY_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
+M68KMAKE_END
diff --git a/plugins/ao/eng_ssf/m68kconf.h b/plugins/ao/eng_ssf/m68kconf.h
new file mode 100644
index 00000000..74c2dd22
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kconf.h
@@ -0,0 +1,181 @@
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+/*
+ * MUSASHI
+ * Version 3.3
+ *
+ * A portable Motorola M680x0 processor emulation engine.
+ * Copyright 1998-2001 Karl Stenerud. All rights reserved.
+ *
+ * This code may be freely used for non-commercial purposes as long as this
+ * copyright notice remains unaltered in the source code and any binary files
+ * containing this code in compiled form.
+ *
+ * All other lisencing terms must be negotiated with the author
+ * (Karl Stenerud).
+ *
+ * The latest version of this code can be obtained at:
+ * http://kstenerud.cjb.net
+ */
+
+
+
+#ifndef M68KCONF__HEADER
+#define M68KCONF__HEADER
+
+
+/* Configuration switches.
+ * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks.
+ * OPT_SPECIFY_HANDLER causes the core to link directly to the function
+ * or macro you specify, rather than using callback functions whose pointer
+ * must be passed in using m68k_set_xxx_callback().
+ */
+#define OPT_OFF 0
+#define OPT_ON 1
+#define OPT_SPECIFY_HANDLER 2
+
+
+/* ======================================================================== */
+/* ============================== MAME STUFF ============================== */
+/* ======================================================================== */
+
+/* If you're compiling this for MAME, only change M68K_COMPILE_FOR_MAME
+ * to OPT_ON and use m68kmame.h to configure the 68k core.
+ */
+#ifndef M68K_COMPILE_FOR_MAME
+#define M68K_COMPILE_FOR_MAME OPT_OFF
+#endif /* M68K_COMPILE_FOR_MAME */
+
+#if M68K_COMPILE_FOR_MAME == OPT_ON
+#include "m68kmame.h"
+#else
+
+
+
+/* ======================================================================== */
+/* ============================= CONFIGURATION ============================ */
+/* ======================================================================== */
+
+/* Turn ON if you want to use the following M68K variants */
+#define M68K_EMULATE_010 OPT_OFF
+#define M68K_EMULATE_EC020 OPT_OFF
+#define M68K_EMULATE_020 OPT_OFF
+
+
+/* If ON, the CPU will call m68k_read_immediate_xx() for immediate addressing
+ * and m68k_read_pcrelative_xx() for PC-relative addressing.
+ * If off, all read requests from the CPU will be redirected to m68k_read_xx()
+ */
+#define M68K_SEPARATE_READS OPT_OFF
+
+/* If ON, the CPU will call m68k_write_32_pd() when it executes move.l with a
+ * predecrement destination EA mode instead of m68k_write_32().
+ * To simulate real 68k behavior, m68k_write_32_pd() must first write the high
+ * word to [address+2], and then write the low word to [address].
+ */
+#define M68K_SIMULATE_PD_WRITES OPT_OFF
+
+/* If ON, CPU will call the interrupt acknowledge callback when it services an
+ * interrupt.
+ * If off, all interrupts will be autovectored and all interrupt requests will
+ * auto-clear when the interrupt is serviced.
+ */
+#define M68K_EMULATE_INT_ACK OPT_ON
+#define M68K_INT_ACK_CALLBACK(A) your_int_ack_handler_function(A)
+
+
+/* If ON, CPU will call the breakpoint acknowledge callback when it encounters
+ * a breakpoint instruction and it is running a 68010+.
+ */
+#define M68K_EMULATE_BKPT_ACK OPT_OFF
+#define M68K_BKPT_ACK_CALLBACK() your_bkpt_ack_handler_function()
+
+
+/* If ON, the CPU will monitor the trace flags and take trace exceptions
+ */
+#define M68K_EMULATE_TRACE OPT_OFF
+
+
+/* If ON, CPU will call the output reset callback when it encounters a reset
+ * instruction.
+ */
+#define M68K_EMULATE_RESET OPT_OFF
+#define M68K_RESET_CALLBACK() your_reset_handler_function()
+
+
+/* If ON, CPU will call the set fc callback on every memory access to
+ * differentiate between user/supervisor, program/data access like a real
+ * 68000 would. This should be enabled and the callback should be set if you
+ * want to properly emulate the m68010 or higher. (moves uses function codes
+ * to read/write data from different address spaces)
+ */
+#define M68K_EMULATE_FC OPT_OFF
+#define M68K_SET_FC_CALLBACK(A) your_set_fc_handler_function(A)
+
+
+/* If ON, CPU will call the pc changed callback when it changes the PC by a
+ * large value. This allows host programs to be nicer when it comes to
+ * fetching immediate data and instructions on a banked memory system.
+ */
+#define M68K_MONITOR_PC OPT_OFF
+#define M68K_SET_PC_CALLBACK(A) your_pc_changed_handler_function(A)
+
+
+/* If ON, CPU will call the instruction hook callback before every
+ * instruction.
+ */
+#define M68K_INSTRUCTION_HOOK OPT_OFF
+#define M68K_INSTRUCTION_CALLBACK() your_instruction_hook_function()
+
+
+/* If ON, the CPU will emulate the 4-byte prefetch queue of a real 68000 */
+#define M68K_EMULATE_PREFETCH OPT_ON
+
+
+/* If ON, the CPU will generate address error exceptions if it tries to
+ * access a word or longword at an odd address.
+ * NOTE: Do not enable this! It is not working!
+ */
+#define M68K_EMULATE_ADDRESS_ERROR OPT_OFF
+
+
+/* Turn ON to enable logging of illegal instruction calls.
+ * M68K_LOG_FILEHANDLE must be #defined to a stdio file stream.
+ * Turn on M68K_LOG_1010_1111 to log all 1010 and 1111 calls.
+ */
+#define M68K_LOG_ENABLE OPT_OFF
+#define M68K_LOG_1010_1111 OPT_OFF
+#define M68K_LOG_FILEHANDLE some_file_handle
+
+
+/* ----------------------------- COMPATIBILITY ---------------------------- */
+
+/* The following options set optimizations that violate the current ANSI
+ * standard, but will be compliant under the forthcoming C9X standard.
+ */
+
+
+/* If ON, the enulation core will use 64-bit integers to speed up some
+ * operations.
+*/
+#define M68K_USE_64_BIT OPT_OFF
+
+
+/* Set to your compiler's static inline keyword to enable it, or
+ * set it to blank to disable it.
+ * If you define INLINE in the makefile, it will override this value.
+ * NOTE: not enabling inline functions will SEVERELY slow down emulation.
+ */
+#ifndef INLINE
+#define INLINE static __inline__
+#endif /* INLINE */
+
+#endif /* M68K_COMPILE_FOR_MAME */
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68KCONF__HEADER */
diff --git a/plugins/ao/eng_ssf/m68kcpu.c b/plugins/ao/eng_ssf/m68kcpu.c
new file mode 100644
index 00000000..94e3635f
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kcpu.c
@@ -0,0 +1,879 @@
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+
+#if 0
+static const char* copyright_notice =
+"MUSASHI\n"
+"Version 3.3 (2001-01-29)\n"
+"A portable Motorola M680x0 processor emulation engine.\n"
+"Copyright 1998-2001 Karl Stenerud. All rights reserved.\n"
+"\n"
+"This code may be freely used for non-commercial purpooses as long as this\n"
+"copyright notice remains unaltered in the source code and any binary files\n"
+"containing this code in compiled form.\n"
+"\n"
+"All other lisencing terms must be negotiated with the author\n"
+"(Karl Stenerud).\n"
+"\n"
+"The latest version of this code can be obtained at:\n"
+"http://kstenerud.cjb.net\n"
+;
+#endif
+
+
+/* ======================================================================== */
+/* ================================= NOTES ================================ */
+/* ======================================================================== */
+
+
+
+/* ======================================================================== */
+/* ================================ INCLUDES ============================== */
+/* ======================================================================== */
+
+#include "m68kops.h"
+#include "m68kcpu.h"
+
+/* ======================================================================== */
+/* ================================= DATA ================================= */
+/* ======================================================================== */
+
+int m68ki_initial_cycles;
+int m68ki_remaining_cycles = 0; /* Number of clocks remaining */
+uint m68ki_tracing = 0;
+uint m68ki_address_space;
+
+#ifdef M68K_LOG_ENABLE
+char* m68ki_cpu_names[9] =
+{
+ "Invalid CPU",
+ "M68000",
+ "M68010",
+ "Invalid CPU",
+ "M68EC020"
+ "Invalid CPU",
+ "Invalid CPU",
+ "Invalid CPU",
+ "M68020"
+};
+#endif /* M68K_LOG_ENABLE */
+
+/* The CPU core */
+m68ki_cpu_core m68ki_cpu = {0};
+
+#if M68K_EMULATE_ADDRESS_ERROR
+jmp_buf m68ki_aerr_trap;
+#endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+uint m68ki_aerr_address;
+uint m68ki_aerr_write_mode;
+uint m68ki_aerr_fc;
+
+/* Used by shift & rotate instructions */
+uint8 m68ki_shift_8_table[65] =
+{
+ 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff
+};
+uint16 m68ki_shift_16_table[65] =
+{
+ 0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00,
+ 0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff
+};
+uint m68ki_shift_32_table[65] =
+{
+ 0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000,
+ 0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000,
+ 0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000,
+ 0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00,
+ 0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8,
+ 0xfffffffc, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
+ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
+};
+
+
+/* Number of clock cycles to use for exception processing.
+ * I used 4 for any vectors that are undocumented for processing times.
+ */
+uint8 m68ki_exception_cycle_table[3][256] =
+{
+ { /* 000 */
+ 4, /* 0: Reset - Initial Stack Pointer */
+ 4, /* 1: Reset - Initial Program Counter */
+ 50, /* 2: Bus Error (unemulated) */
+ 50, /* 3: Address Error (unemulated) */
+ 34, /* 4: Illegal Instruction */
+ 38, /* 5: Divide by Zero -- ASG: changed from 42 */
+ 40, /* 6: CHK -- ASG: chanaged from 44 */
+ 34, /* 7: TRAPV */
+ 34, /* 8: Privilege Violation */
+ 34, /* 9: Trace */
+ 4, /* 10: 1010 */
+ 4, /* 11: 1111 */
+ 4, /* 12: RESERVED */
+ 4, /* 13: Coprocessor Protocol Violation (unemulated) */
+ 4, /* 14: Format Error */
+ 44, /* 15: Uninitialized Interrupt */
+ 4, /* 16: RESERVED */
+ 4, /* 17: RESERVED */
+ 4, /* 18: RESERVED */
+ 4, /* 19: RESERVED */
+ 4, /* 20: RESERVED */
+ 4, /* 21: RESERVED */
+ 4, /* 22: RESERVED */
+ 4, /* 23: RESERVED */
+ 44, /* 24: Spurious Interrupt */
+ 44, /* 25: Level 1 Interrupt Autovector */
+ 44, /* 26: Level 2 Interrupt Autovector */
+ 44, /* 27: Level 3 Interrupt Autovector */
+ 44, /* 28: Level 4 Interrupt Autovector */
+ 44, /* 29: Level 5 Interrupt Autovector */
+ 44, /* 30: Level 6 Interrupt Autovector */
+ 44, /* 31: Level 7 Interrupt Autovector */
+ 34, /* 32: TRAP #0 -- ASG: chanaged from 38 */
+ 34, /* 33: TRAP #1 */
+ 34, /* 34: TRAP #2 */
+ 34, /* 35: TRAP #3 */
+ 34, /* 36: TRAP #4 */
+ 34, /* 37: TRAP #5 */
+ 34, /* 38: TRAP #6 */
+ 34, /* 39: TRAP #7 */
+ 34, /* 40: TRAP #8 */
+ 34, /* 41: TRAP #9 */
+ 34, /* 42: TRAP #10 */
+ 34, /* 43: TRAP #11 */
+ 34, /* 44: TRAP #12 */
+ 34, /* 45: TRAP #13 */
+ 34, /* 46: TRAP #14 */
+ 34, /* 47: TRAP #15 */
+ 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */
+ 4, /* 49: FP Inexact Result (unemulated) */
+ 4, /* 50: FP Divide by Zero (unemulated) */
+ 4, /* 51: FP Underflow (unemulated) */
+ 4, /* 52: FP Operand Error (unemulated) */
+ 4, /* 53: FP Overflow (unemulated) */
+ 4, /* 54: FP Signaling NAN (unemulated) */
+ 4, /* 55: FP Unimplemented Data Type (unemulated) */
+ 4, /* 56: MMU Configuration Error (unemulated) */
+ 4, /* 57: MMU Illegal Operation Error (unemulated) */
+ 4, /* 58: MMU Access Level Violation Error (unemulated) */
+ 4, /* 59: RESERVED */
+ 4, /* 60: RESERVED */
+ 4, /* 61: RESERVED */
+ 4, /* 62: RESERVED */
+ 4, /* 63: RESERVED */
+ /* 64-255: User Defined */
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
+ },
+ { /* 010 */
+ 4, /* 0: Reset - Initial Stack Pointer */
+ 4, /* 1: Reset - Initial Program Counter */
+ 126, /* 2: Bus Error (unemulated) */
+ 126, /* 3: Address Error (unemulated) */
+ 38, /* 4: Illegal Instruction */
+ 44, /* 5: Divide by Zero */
+ 44, /* 6: CHK */
+ 34, /* 7: TRAPV */
+ 38, /* 8: Privilege Violation */
+ 38, /* 9: Trace */
+ 4, /* 10: 1010 */
+ 4, /* 11: 1111 */
+ 4, /* 12: RESERVED */
+ 4, /* 13: Coprocessor Protocol Violation (unemulated) */
+ 4, /* 14: Format Error */
+ 44, /* 15: Uninitialized Interrupt */
+ 4, /* 16: RESERVED */
+ 4, /* 17: RESERVED */
+ 4, /* 18: RESERVED */
+ 4, /* 19: RESERVED */
+ 4, /* 20: RESERVED */
+ 4, /* 21: RESERVED */
+ 4, /* 22: RESERVED */
+ 4, /* 23: RESERVED */
+ 46, /* 24: Spurious Interrupt */
+ 46, /* 25: Level 1 Interrupt Autovector */
+ 46, /* 26: Level 2 Interrupt Autovector */
+ 46, /* 27: Level 3 Interrupt Autovector */
+ 46, /* 28: Level 4 Interrupt Autovector */
+ 46, /* 29: Level 5 Interrupt Autovector */
+ 46, /* 30: Level 6 Interrupt Autovector */
+ 46, /* 31: Level 7 Interrupt Autovector */
+ 38, /* 32: TRAP #0 */
+ 38, /* 33: TRAP #1 */
+ 38, /* 34: TRAP #2 */
+ 38, /* 35: TRAP #3 */
+ 38, /* 36: TRAP #4 */
+ 38, /* 37: TRAP #5 */
+ 38, /* 38: TRAP #6 */
+ 38, /* 39: TRAP #7 */
+ 38, /* 40: TRAP #8 */
+ 38, /* 41: TRAP #9 */
+ 38, /* 42: TRAP #10 */
+ 38, /* 43: TRAP #11 */
+ 38, /* 44: TRAP #12 */
+ 38, /* 45: TRAP #13 */
+ 38, /* 46: TRAP #14 */
+ 38, /* 47: TRAP #15 */
+ 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */
+ 4, /* 49: FP Inexact Result (unemulated) */
+ 4, /* 50: FP Divide by Zero (unemulated) */
+ 4, /* 51: FP Underflow (unemulated) */
+ 4, /* 52: FP Operand Error (unemulated) */
+ 4, /* 53: FP Overflow (unemulated) */
+ 4, /* 54: FP Signaling NAN (unemulated) */
+ 4, /* 55: FP Unimplemented Data Type (unemulated) */
+ 4, /* 56: MMU Configuration Error (unemulated) */
+ 4, /* 57: MMU Illegal Operation Error (unemulated) */
+ 4, /* 58: MMU Access Level Violation Error (unemulated) */
+ 4, /* 59: RESERVED */
+ 4, /* 60: RESERVED */
+ 4, /* 61: RESERVED */
+ 4, /* 62: RESERVED */
+ 4, /* 63: RESERVED */
+ /* 64-255: User Defined */
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
+ },
+ { /* 020 */
+ 4, /* 0: Reset - Initial Stack Pointer */
+ 4, /* 1: Reset - Initial Program Counter */
+ 50, /* 2: Bus Error (unemulated) */
+ 50, /* 3: Address Error (unemulated) */
+ 20, /* 4: Illegal Instruction */
+ 38, /* 5: Divide by Zero */
+ 40, /* 6: CHK */
+ 20, /* 7: TRAPV */
+ 34, /* 8: Privilege Violation */
+ 25, /* 9: Trace */
+ 20, /* 10: 1010 */
+ 20, /* 11: 1111 */
+ 4, /* 12: RESERVED */
+ 4, /* 13: Coprocessor Protocol Violation (unemulated) */
+ 4, /* 14: Format Error */
+ 30, /* 15: Uninitialized Interrupt */
+ 4, /* 16: RESERVED */
+ 4, /* 17: RESERVED */
+ 4, /* 18: RESERVED */
+ 4, /* 19: RESERVED */
+ 4, /* 20: RESERVED */
+ 4, /* 21: RESERVED */
+ 4, /* 22: RESERVED */
+ 4, /* 23: RESERVED */
+ 30, /* 24: Spurious Interrupt */
+ 30, /* 25: Level 1 Interrupt Autovector */
+ 30, /* 26: Level 2 Interrupt Autovector */
+ 30, /* 27: Level 3 Interrupt Autovector */
+ 30, /* 28: Level 4 Interrupt Autovector */
+ 30, /* 29: Level 5 Interrupt Autovector */
+ 30, /* 30: Level 6 Interrupt Autovector */
+ 30, /* 31: Level 7 Interrupt Autovector */
+ 20, /* 32: TRAP #0 */
+ 20, /* 33: TRAP #1 */
+ 20, /* 34: TRAP #2 */
+ 20, /* 35: TRAP #3 */
+ 20, /* 36: TRAP #4 */
+ 20, /* 37: TRAP #5 */
+ 20, /* 38: TRAP #6 */
+ 20, /* 39: TRAP #7 */
+ 20, /* 40: TRAP #8 */
+ 20, /* 41: TRAP #9 */
+ 20, /* 42: TRAP #10 */
+ 20, /* 43: TRAP #11 */
+ 20, /* 44: TRAP #12 */
+ 20, /* 45: TRAP #13 */
+ 20, /* 46: TRAP #14 */
+ 20, /* 47: TRAP #15 */
+ 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */
+ 4, /* 49: FP Inexact Result (unemulated) */
+ 4, /* 50: FP Divide by Zero (unemulated) */
+ 4, /* 51: FP Underflow (unemulated) */
+ 4, /* 52: FP Operand Error (unemulated) */
+ 4, /* 53: FP Overflow (unemulated) */
+ 4, /* 54: FP Signaling NAN (unemulated) */
+ 4, /* 55: FP Unimplemented Data Type (unemulated) */
+ 4, /* 56: MMU Configuration Error (unemulated) */
+ 4, /* 57: MMU Illegal Operation Error (unemulated) */
+ 4, /* 58: MMU Access Level Violation Error (unemulated) */
+ 4, /* 59: RESERVED */
+ 4, /* 60: RESERVED */
+ 4, /* 61: RESERVED */
+ 4, /* 62: RESERVED */
+ 4, /* 63: RESERVED */
+ /* 64-255: User Defined */
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
+ 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
+ }
+};
+
+uint8 m68ki_ea_idx_cycle_table[64] =
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, /* ..01.000 no memory indirect, base NULL */
+ 5, /* ..01..01 memory indirect, base NULL, outer NULL */
+ 7, /* ..01..10 memory indirect, base NULL, outer 16 */
+ 7, /* ..01..11 memory indirect, base NULL, outer 32 */
+ 0, 5, 7, 7, 0, 5, 7, 7, 0, 5, 7, 7,
+ 2, /* ..10.000 no memory indirect, base 16 */
+ 7, /* ..10..01 memory indirect, base 16, outer NULL */
+ 9, /* ..10..10 memory indirect, base 16, outer 16 */
+ 9, /* ..10..11 memory indirect, base 16, outer 32 */
+ 0, 7, 9, 9, 0, 7, 9, 9, 0, 7, 9, 9,
+ 6, /* ..11.000 no memory indirect, base 32 */
+ 11, /* ..11..01 memory indirect, base 32, outer NULL */
+ 13, /* ..11..10 memory indirect, base 32, outer 16 */
+ 13, /* ..11..11 memory indirect, base 32, outer 32 */
+ 0, 11, 13, 13, 0, 11, 13, 13, 0, 11, 13, 13
+};
+
+
+
+/* ======================================================================== */
+/* =============================== CALLBACKS ============================== */
+/* ======================================================================== */
+
+/* Default callbacks used if the callback hasn't been set yet, or if the
+ * callback is set to NULL
+ */
+
+/* Interrupt acknowledge */
+static int default_int_ack_callback_data;
+static int default_int_ack_callback(int int_level)
+{
+ default_int_ack_callback_data = int_level;
+ CPU_INT_LEVEL = 0;
+ return M68K_INT_ACK_AUTOVECTOR;
+}
+
+/* Breakpoint acknowledge */
+static unsigned int default_bkpt_ack_callback_data;
+static void default_bkpt_ack_callback(unsigned int data)
+{
+ default_bkpt_ack_callback_data = data;
+}
+
+/* Called when a reset instruction is executed */
+static void default_reset_instr_callback(void)
+{
+}
+
+/* Called when the program counter changed by a large value */
+static unsigned int default_pc_changed_callback_data;
+static void default_pc_changed_callback(unsigned int new_pc)
+{
+ default_pc_changed_callback_data = new_pc;
+}
+
+/* Called every time there's bus activity (read/write to/from memory */
+static unsigned int default_set_fc_callback_data;
+static void default_set_fc_callback(unsigned int new_fc)
+{
+ default_set_fc_callback_data = new_fc;
+}
+
+/* Called every instruction cycle prior to execution */
+static void default_instr_hook_callback(void)
+{
+}
+
+
+#if M68K_EMULATE_ADDRESS_ERROR
+ #include <setjmp.h>
+ jmp_buf m68ki_aerr_trap;
+#endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+
+/* ======================================================================== */
+/* ================================= API ================================== */
+/* ======================================================================== */
+
+/* Access the internals of the CPU */
+unsigned int m68k_get_reg(void* context, m68k_register_t regnum)
+{
+ m68ki_cpu_core* cpu = context != NULL ?(m68ki_cpu_core*)context : &m68ki_cpu;
+
+ switch(regnum)
+ {
+ case M68K_REG_D0: return cpu->dar[0];
+ case M68K_REG_D1: return cpu->dar[1];
+ case M68K_REG_D2: return cpu->dar[2];
+ case M68K_REG_D3: return cpu->dar[3];
+ case M68K_REG_D4: return cpu->dar[4];
+ case M68K_REG_D5: return cpu->dar[5];
+ case M68K_REG_D6: return cpu->dar[6];
+ case M68K_REG_D7: return cpu->dar[7];
+ case M68K_REG_A0: return cpu->dar[8];
+ case M68K_REG_A1: return cpu->dar[9];
+ case M68K_REG_A2: return cpu->dar[10];
+ case M68K_REG_A3: return cpu->dar[11];
+ case M68K_REG_A4: return cpu->dar[12];
+ case M68K_REG_A5: return cpu->dar[13];
+ case M68K_REG_A6: return cpu->dar[14];
+ case M68K_REG_A7: return cpu->dar[15];
+ case M68K_REG_PC: return MASK_OUT_ABOVE_32(cpu->pc);
+ case M68K_REG_SR: return cpu->t1_flag |
+ cpu->t0_flag |
+ (cpu->s_flag << 11) |
+ (cpu->m_flag << 11) |
+ cpu->int_mask |
+ ((cpu->x_flag & XFLAG_SET) >> 4) |
+ ((cpu->n_flag & NFLAG_SET) >> 4) |
+ ((!cpu->not_z_flag) << 2) |
+ ((cpu->v_flag & VFLAG_SET) >> 6) |
+ ((cpu->c_flag & CFLAG_SET) >> 8);
+ case M68K_REG_SP: return cpu->dar[15];
+ case M68K_REG_USP: return cpu->s_flag ? cpu->sp[0] : cpu->dar[15];
+ case M68K_REG_ISP: return cpu->s_flag && !cpu->m_flag ? cpu->dar[15] : cpu->sp[4];
+ case M68K_REG_MSP: return cpu->s_flag && cpu->m_flag ? cpu->dar[15] : cpu->sp[6];
+ case M68K_REG_SFC: return cpu->sfc;
+ case M68K_REG_DFC: return cpu->dfc;
+ case M68K_REG_VBR: return cpu->vbr;
+ case M68K_REG_CACR: return cpu->cacr;
+ case M68K_REG_CAAR: return cpu->caar;
+ case M68K_REG_PREF_ADDR: return cpu->pref_addr;
+ case M68K_REG_PREF_DATA: return cpu->pref_data;
+ case M68K_REG_PPC: return MASK_OUT_ABOVE_32(cpu->ppc);
+ case M68K_REG_IR: return cpu->ir;
+ case M68K_REG_CPU_TYPE:
+ switch(cpu->cpu_type)
+ {
+ case CPU_TYPE_000: return (unsigned int)M68K_CPU_TYPE_68000;
+ case CPU_TYPE_010: return (unsigned int)M68K_CPU_TYPE_68010;
+ case CPU_TYPE_EC020: return (unsigned int)M68K_CPU_TYPE_68EC020;
+ case CPU_TYPE_020: return (unsigned int)M68K_CPU_TYPE_68020;
+ }
+ return M68K_CPU_TYPE_INVALID;
+ default: return 0;
+ }
+ return 0;
+}
+
+void m68k_set_reg(m68k_register_t regnum, unsigned int value)
+{
+ switch(regnum)
+ {
+ case M68K_REG_D0: REG_D[0] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D1: REG_D[1] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D2: REG_D[2] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D3: REG_D[3] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D4: REG_D[4] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D5: REG_D[5] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D6: REG_D[6] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_D7: REG_D[7] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A0: REG_A[0] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A1: REG_A[1] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A2: REG_A[2] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A3: REG_A[3] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A4: REG_A[4] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A5: REG_A[5] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A6: REG_A[6] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_A7: REG_A[7] = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_PC: m68ki_jump(MASK_OUT_ABOVE_32(value)); return;
+ case M68K_REG_SR: m68ki_set_sr(value); return;
+ case M68K_REG_SP: REG_SP = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_USP: if(FLAG_S)
+ REG_USP = MASK_OUT_ABOVE_32(value);
+ else
+ REG_SP = MASK_OUT_ABOVE_32(value);
+ return;
+ case M68K_REG_ISP: if(FLAG_S && !FLAG_M)
+ REG_SP = MASK_OUT_ABOVE_32(value);
+ else
+ REG_ISP = MASK_OUT_ABOVE_32(value);
+ return;
+ case M68K_REG_MSP: if(FLAG_S && FLAG_M)
+ REG_SP = MASK_OUT_ABOVE_32(value);
+ else
+ REG_MSP = MASK_OUT_ABOVE_32(value);
+ return;
+ case M68K_REG_VBR: REG_VBR = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_SFC: REG_SFC = value & 7; return;
+ case M68K_REG_DFC: REG_DFC = value & 7; return;
+ case M68K_REG_CACR: REG_CACR = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_CAAR: REG_CAAR = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_PPC: REG_PPC = MASK_OUT_ABOVE_32(value); return;
+ case M68K_REG_IR: REG_IR = MASK_OUT_ABOVE_16(value); return;
+ case M68K_REG_CPU_TYPE: m68k_set_cpu_type(value); return;
+ default: return;
+ }
+}
+
+/* Set the callbacks */
+void m68k_set_int_ack_callback(int (*callback)(int int_level))
+{
+ CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback;
+}
+
+void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data))
+{
+ CALLBACK_BKPT_ACK = callback ? callback : default_bkpt_ack_callback;
+}
+
+void m68k_set_reset_instr_callback(void (*callback)(void))
+{
+ CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback;
+}
+
+void m68k_set_pc_changed_callback(void (*callback)(unsigned int new_pc))
+{
+ CALLBACK_PC_CHANGED = callback ? callback : default_pc_changed_callback;
+}
+
+void m68k_set_fc_callback(void (*callback)(unsigned int new_fc))
+{
+ CALLBACK_SET_FC = callback ? callback : default_set_fc_callback;
+}
+
+void m68k_set_instr_hook_callback(void (*callback)(void))
+{
+ CALLBACK_INSTR_HOOK = callback ? callback : default_instr_hook_callback;
+}
+
+#include <stdio.h>
+/* Set the CPU type. */
+void m68k_set_cpu_type(unsigned int cpu_type)
+{
+ switch(cpu_type)
+ {
+ case M68K_CPU_TYPE_68000:
+ CPU_TYPE = CPU_TYPE_000;
+ CPU_ADDRESS_MASK = 0x00ffffff;
+ CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */
+ CYC_INSTRUCTION = m68ki_cycles[0];
+ CYC_EXCEPTION = m68ki_exception_cycle_table[0];
+ CYC_BCC_NOTAKE_B = -2;
+ CYC_BCC_NOTAKE_W = 2;
+ CYC_DBCC_F_NOEXP = -2;
+ CYC_DBCC_F_EXP = 2;
+ CYC_SCC_R_FALSE = 2;
+ CYC_MOVEM_W = 2;
+ CYC_MOVEM_L = 3;
+ CYC_SHIFT = 1;
+ CYC_RESET = 132;
+ return;
+ case M68K_CPU_TYPE_68010:
+ CPU_TYPE = CPU_TYPE_010;
+ CPU_ADDRESS_MASK = 0x00ffffff;
+ CPU_SR_MASK = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */
+ CYC_INSTRUCTION = m68ki_cycles[1];
+ CYC_EXCEPTION = m68ki_exception_cycle_table[1];
+ CYC_BCC_NOTAKE_B = -4;
+ CYC_BCC_NOTAKE_W = 0;
+ CYC_DBCC_F_NOEXP = 0;
+ CYC_DBCC_F_EXP = 6;
+ CYC_SCC_R_FALSE = 0;
+ CYC_MOVEM_W = 2;
+ CYC_MOVEM_L = 3;
+ CYC_SHIFT = 1;
+ CYC_RESET = 130;
+ return;
+ case M68K_CPU_TYPE_68EC020:
+ CPU_TYPE = CPU_TYPE_EC020;
+ CPU_ADDRESS_MASK = 0x00ffffff;
+ CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */
+ CYC_INSTRUCTION = m68ki_cycles[2];
+ CYC_EXCEPTION = m68ki_exception_cycle_table[2];
+ CYC_BCC_NOTAKE_B = -2;
+ CYC_BCC_NOTAKE_W = 0;
+ CYC_DBCC_F_NOEXP = 0;
+ CYC_DBCC_F_EXP = 4;
+ CYC_SCC_R_FALSE = 0;
+ CYC_MOVEM_W = 2;
+ CYC_MOVEM_L = 2;
+ CYC_SHIFT = 0;
+ CYC_RESET = 518;
+ return;
+ case M68K_CPU_TYPE_68020:
+ CPU_TYPE = CPU_TYPE_020;
+ CPU_ADDRESS_MASK = 0xffffffff;
+ CPU_SR_MASK = 0xf71f; /* T1 T0 S M -- I2 I1 I0 -- -- -- X N Z V C */
+ CYC_INSTRUCTION = m68ki_cycles[2];
+ CYC_EXCEPTION = m68ki_exception_cycle_table[2];
+ CYC_BCC_NOTAKE_B = -2;
+ CYC_BCC_NOTAKE_W = 0;
+ CYC_DBCC_F_NOEXP = 0;
+ CYC_DBCC_F_EXP = 4;
+ CYC_SCC_R_FALSE = 0;
+ CYC_MOVEM_W = 2;
+ CYC_MOVEM_L = 2;
+ CYC_SHIFT = 0;
+ CYC_RESET = 518;
+ return;
+ }
+}
+
+int m68k_trap0;
+
+/* Execute some instructions until we use up num_cycles clock cycles */
+/* ASG: removed per-instruction interrupt checks */
+int m68k_execute(int num_cycles)
+{
+ /* Make sure we're not stopped */
+ if(!CPU_STOPPED)
+ {
+ /* Set our pool of clock cycles available */
+ SET_CYCLES(num_cycles);
+ m68ki_initial_cycles = num_cycles;
+
+ /* ASG: update cycles */
+ USE_CYCLES(CPU_INT_CYCLES);
+ CPU_INT_CYCLES = 0;
+
+ /* Return point if we had an address error */
+ m68ki_set_address_error_trap(); /* auto-disable (see m68kcpu.h) */
+
+ /* Main loop. Keep going until we run out of clock cycles */
+ do
+ {
+ /* Set tracing accodring to T1. (T0 is done inside instruction) */
+ m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */
+
+ /* Set the address space for reads */
+ m68ki_use_data_space(); /* auto-disable (see m68kcpu.h) */
+
+ /* Call external hook to peek at CPU */
+ m68ki_instr_hook(); /* auto-disable (see m68kcpu.h) */
+
+// if (REG_PC == m68k_trap0) printf("at trap0 (crash), prev_pc = %x\n", REG_PPC);
+
+ /* Record previous program counter */
+ REG_PPC = REG_PC;
+
+ /* Read an instruction and call its handler */
+ REG_IR = m68ki_read_imm_16();
+ m68ki_instruction_jump_table[REG_IR]();
+ USE_CYCLES(CYC_INSTRUCTION[REG_IR]);
+
+ /* Trace m68k_exception, if necessary */
+ m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */
+ } while(GET_CYCLES() > 0);
+
+ /* set previous PC to current PC for the next entry into the loop */
+ REG_PPC = REG_PC;
+
+ /* ASG: update cycles */
+ USE_CYCLES(CPU_INT_CYCLES);
+ CPU_INT_CYCLES = 0;
+
+ /* return how many clocks we used */
+ return m68ki_initial_cycles - GET_CYCLES();
+ }
+
+ /* We get here if the CPU is stopped or halted */
+ SET_CYCLES(0);
+ CPU_INT_CYCLES = 0;
+
+ return num_cycles;
+}
+
+
+int m68k_cycles_run(void)
+{
+ return m68ki_initial_cycles - GET_CYCLES();
+}
+
+int m68k_cycles_remaining(void)
+{
+ return GET_CYCLES();
+}
+
+/* Change the timeslice */
+void m68k_modify_timeslice(int cycles)
+{
+ m68ki_initial_cycles += cycles;
+ ADD_CYCLES(cycles);
+}
+
+
+void m68k_end_timeslice(void)
+{
+ m68ki_initial_cycles = GET_CYCLES();
+ SET_CYCLES(0);
+}
+
+
+/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */
+/* KS: Modified so that IPL* bits match with mask positions in the SR
+ * and cleaned out remenants of the interrupt controller.
+ */
+void m68k_set_irq(unsigned int int_level)
+{
+ uint old_level = CPU_INT_LEVEL;
+ CPU_INT_LEVEL = int_level << 8;
+
+ /* A transition from < 7 to 7 always interrupts (NMI) */
+ /* Note: Level 7 can also level trigger like a normal IRQ */
+ if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700)
+ m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */
+ else
+ m68ki_check_interrupts(); /* Level triggered (IRQ) */
+}
+
+void m68k_init(void)
+{
+ static uint emulation_initialized = 0;
+
+ /* The first call to this function initializes the opcode handler jump table */
+ if(!emulation_initialized)
+ {
+ m68ki_build_opcode_table();
+ emulation_initialized = 1;
+ }
+
+ m68k_set_int_ack_callback(NULL);
+ m68k_set_bkpt_ack_callback(NULL);
+ m68k_set_reset_instr_callback(NULL);
+ m68k_set_pc_changed_callback(NULL);
+ m68k_set_fc_callback(NULL);
+ m68k_set_instr_hook_callback(NULL);
+}
+
+/* Pulse the RESET line on the CPU */
+void m68k_pulse_reset(void)
+{
+ /* Clear all stop levels and eat up all remaining cycles */
+ CPU_STOPPED = 0;
+ SET_CYCLES(0);
+
+ CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET;
+
+ /* Turn off tracing */
+ FLAG_T1 = FLAG_T0 = 0;
+ m68ki_clear_trace();
+ /* Interrupt mask to level 7 */
+ FLAG_INT_MASK = 0x0700;
+ /* Reset VBR */
+ REG_VBR = 0;
+ /* Go to supervisor mode */
+ m68ki_set_sm_flag(SFLAG_SET | MFLAG_CLEAR);
+
+ /* Invalidate the prefetch queue */
+#if M68K_EMULATE_PREFETCH
+ /* Set to arbitrary number since our first fetch is from 0 */
+ CPU_PREF_ADDR = 0x1000;
+#endif /* M68K_EMULATE_PREFETCH */
+
+ /* Read the initial stack pointer and program counter */
+ m68ki_jump(0);
+ REG_SP = m68ki_read_imm_32();
+ REG_PC = m68ki_read_imm_32();
+ m68ki_jump(REG_PC);
+
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+}
+
+/* Pulse the HALT line on the CPU */
+void m68k_pulse_halt(void)
+{
+ CPU_STOPPED |= STOP_LEVEL_HALT;
+}
+
+
+/* Get and set the current CPU context */
+/* This is to allow for multiple CPUs */
+unsigned int m68k_context_size()
+{
+ return sizeof(m68ki_cpu_core);
+}
+
+unsigned int m68k_get_context(void* dst)
+{
+ if(dst) *(m68ki_cpu_core*)dst = m68ki_cpu;
+ return sizeof(m68ki_cpu_core);
+}
+
+void m68k_set_context(void* src)
+{
+ if(src) m68ki_cpu = *(m68ki_cpu_core*)src;
+}
+
+
+
+/* ======================================================================== */
+/* ============================== MAME STUFF ============================== */
+/* ======================================================================== */
+
+#if M68K_COMPILE_FOR_MAME == OPT_ON
+
+#include "state.h"
+
+static struct {
+ UINT16 sr;
+ int stopped;
+ int halted;
+} m68k_substate;
+
+static void m68k_prepare_substate(void)
+{
+ m68k_substate.sr = m68ki_get_sr();
+ m68k_substate.stopped = (CPU_STOPPED & STOP_LEVEL_STOP) != 0;
+ m68k_substate.halted = (CPU_STOPPED & STOP_LEVEL_HALT) != 0;
+}
+
+static void m68k_post_load(void)
+{
+ m68ki_set_sr_noint_nosp(m68k_substate.sr);
+ CPU_STOPPED = m68k_substate.stopped ? STOP_LEVEL_STOP : 0
+ | m68k_substate.halted ? STOP_LEVEL_HALT : 0;
+ m68ki_jump(REG_PC);
+}
+
+void m68k_state_register(const char *type)
+{
+ int cpu = cpu_getactivecpu();
+
+ state_save_register_UINT32(type, cpu, "D" , REG_D, 8);
+ state_save_register_UINT32(type, cpu, "A" , REG_A, 8);
+ state_save_register_UINT32(type, cpu, "PPC" , &REG_PPC, 1);
+ state_save_register_UINT32(type, cpu, "PC" , &REG_PC, 1);
+ state_save_register_UINT32(type, cpu, "USP" , &REG_USP, 1);
+ state_save_register_UINT32(type, cpu, "ISP" , &REG_ISP, 1);
+ state_save_register_UINT32(type, cpu, "MSP" , &REG_MSP, 1);
+ state_save_register_UINT32(type, cpu, "VBR" , &REG_VBR, 1);
+ state_save_register_UINT32(type, cpu, "SFC" , &REG_SFC, 1);
+ state_save_register_UINT32(type, cpu, "DFC" , &REG_DFC, 1);
+ state_save_register_UINT32(type, cpu, "CACR" , &REG_CACR, 1);
+ state_save_register_UINT32(type, cpu, "CAAR" , &REG_CAAR, 1);
+ state_save_register_UINT16(type, cpu, "SR" , &m68k_substate.sr, 1);
+ state_save_register_UINT32(type, cpu, "INT_LEVEL" , &CPU_INT_LEVEL, 1);
+ state_save_register_UINT32(type, cpu, "INT_CYCLES", &CPU_INT_CYCLES, 1);
+ state_save_register_int (type, cpu, "STOPPED" , &m68k_substate.stopped);
+ state_save_register_int (type, cpu, "HALTED" , &m68k_substate.halted);
+ state_save_register_UINT32(type, cpu, "PREF_ADDR" , &CPU_PREF_ADDR, 1);
+ state_save_register_UINT32(type, cpu, "PREF_DATA" , &CPU_PREF_DATA, 1);
+ state_save_register_func_presave(m68k_prepare_substate);
+ state_save_register_func_postload(m68k_post_load);
+}
+
+#endif /* M68K_COMPILE_FOR_MAME */
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
diff --git a/plugins/ao/eng_ssf/m68kcpu.h b/plugins/ao/eng_ssf/m68kcpu.h
new file mode 100644
index 00000000..80d4e19a
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kcpu.h
@@ -0,0 +1,1973 @@
+#include <stdio.h>
+#ifdef _MSC_VER
+#include "ao.h"
+#else
+#define INLINE static inline
+#endif
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+/*
+ * MUSASHI
+ * Version 3.3
+ *
+ * A portable Motorola M680x0 processor emulation engine.
+ * Copyright 1998-2001 Karl Stenerud. All rights reserved.
+ *
+ * This code may be freely used for non-commercial purposes as long as this
+ * copyright notice remains unaltered in the source code and any binary files
+ * containing this code in compiled form.
+ *
+ * All other lisencing terms must be negotiated with the author
+ * (Karl Stenerud).
+ *
+ * The latest version of this code can be obtained at:
+ * http://kstenerud.cjb.net
+ */
+
+
+
+
+#ifndef M68KCPU__HEADER
+#define M68KCPU__HEADER
+
+#include "m68k.h"
+#include <limits.h>
+
+#if M68K_EMULATE_ADDRESS_ERROR
+#include <setjmp.h>
+#endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+/* ======================================================================== */
+/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */
+/* ======================================================================== */
+
+/* Check for > 32bit sizes */
+#if UINT_MAX > 0xffffffff
+ #define M68K_INT_GT_32_BIT 1
+#else
+ #define M68K_INT_GT_32_BIT 0
+#endif
+
+/* Data types used in this emulation core */
+#undef sint8
+#undef sint16
+#undef sint32
+#undef sint64
+#undef uint8
+#undef uint16
+#undef uint32
+#undef uint64
+#undef sint
+#undef uint
+
+#define sint8 signed char /* ASG: changed from char to signed char */
+#define sint16 signed short
+#define sint32 signed long
+#define uint8 unsigned char
+#define uint16 unsigned short
+#define uint32 unsigned long
+
+/* signed and unsigned int must be at least 32 bits wide */
+#define sint signed int
+#define uint unsigned int
+
+
+#if M68K_USE_64_BIT
+#define sint64 signed long long
+#define uint64 unsigned long long
+#else
+#define sint64 sint32
+#define uint64 uint32
+#endif /* M68K_USE_64_BIT */
+
+
+
+/* Allow for architectures that don't have 8-bit sizes */
+#if UCHAR_MAX == 0xff
+ #define MAKE_INT_8(A) (sint8)(A)
+#else
+ #undef sint8
+ #define sint8 signed int
+ #undef uint8
+ #define uint8 unsigned int
+ INLINE sint MAKE_INT_8(uint value)
+ {
+ return (value & 0x80) ? value | ~0xff : value & 0xff;
+ }
+#endif /* UCHAR_MAX == 0xff */
+
+
+/* Allow for architectures that don't have 16-bit sizes */
+#if USHRT_MAX == 0xffff
+ #define MAKE_INT_16(A) (sint16)(A)
+#else
+ #undef sint16
+ #define sint16 signed int
+ #undef uint16
+ #define uint16 unsigned int
+ INLINE sint MAKE_INT_16(uint value)
+ {
+ return (value & 0x8000) ? value | ~0xffff : value & 0xffff;
+ }
+#endif /* USHRT_MAX == 0xffff */
+
+
+/* Allow for architectures that don't have 32-bit sizes */
+#if ULONG_MAX == 0xffffffff
+ #define MAKE_INT_32(A) (sint32)(A)
+#else
+ #undef sint32
+ #define sint32 signed int
+ #undef uint32
+ #define uint32 unsigned int
+ INLINE sint MAKE_INT_32(uint value)
+ {
+ return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff;
+ }
+#endif /* ULONG_MAX == 0xffffffff */
+
+
+
+
+/* ======================================================================== */
+/* ============================ GENERAL DEFINES =========================== */
+/* ======================================================================== */
+
+/* Exception Vectors handled by emulation */
+#define EXCEPTION_BUS_ERROR 2 /* This one is not emulated! */
+#define EXCEPTION_ADDRESS_ERROR 3 /* This one is partially emulated (doesn't stack a proper frame yet) */
+#define EXCEPTION_ILLEGAL_INSTRUCTION 4
+#define EXCEPTION_ZERO_DIVIDE 5
+#define EXCEPTION_CHK 6
+#define EXCEPTION_TRAPV 7
+#define EXCEPTION_PRIVILEGE_VIOLATION 8
+#define EXCEPTION_TRACE 9
+#define EXCEPTION_1010 10
+#define EXCEPTION_1111 11
+#define EXCEPTION_FORMAT_ERROR 14
+#define EXCEPTION_UNINITIALIZED_INTERRUPT 15
+#define EXCEPTION_SPURIOUS_INTERRUPT 24
+#define EXCEPTION_INTERRUPT_AUTOVECTOR 24
+#define EXCEPTION_TRAP_BASE 32
+
+/* Function codes set by CPU during data/address bus activity */
+#define FUNCTION_CODE_USER_DATA 1
+#define FUNCTION_CODE_USER_PROGRAM 2
+#define FUNCTION_CODE_SUPERVISOR_DATA 5
+#define FUNCTION_CODE_SUPERVISOR_PROGRAM 6
+#define FUNCTION_CODE_CPU_SPACE 7
+
+/* CPU types for deciding what to emulate */
+#define CPU_TYPE_000 1
+#define CPU_TYPE_010 2
+#define CPU_TYPE_EC020 4
+#define CPU_TYPE_020 8
+
+/* Different ways to stop the CPU */
+#define STOP_LEVEL_STOP 1
+#define STOP_LEVEL_HALT 2
+
+/* Used for 68000 address error processing */
+#define INSTRUCTION_YES 0
+#define INSTRUCTION_NO 0x08
+#define MODE_READ 0x10
+#define MODE_WRITE 0
+
+#define RUN_MODE_NORMAL 0
+#define RUN_MODE_BERR_AERR_RESET 1
+
+#ifndef NULL
+#define NULL ((void*)0)
+#endif
+
+/* ======================================================================== */
+/* ================================ MACROS ================================ */
+/* ======================================================================== */
+
+
+/* ---------------------------- General Macros ---------------------------- */
+
+/* Bit Isolation Macros */
+#define BIT_0(A) ((A) & 0x00000001)
+#define BIT_1(A) ((A) & 0x00000002)
+#define BIT_2(A) ((A) & 0x00000004)
+#define BIT_3(A) ((A) & 0x00000008)
+#define BIT_4(A) ((A) & 0x00000010)
+#define BIT_5(A) ((A) & 0x00000020)
+#define BIT_6(A) ((A) & 0x00000040)
+#define BIT_7(A) ((A) & 0x00000080)
+#define BIT_8(A) ((A) & 0x00000100)
+#define BIT_9(A) ((A) & 0x00000200)
+#define BIT_A(A) ((A) & 0x00000400)
+#define BIT_B(A) ((A) & 0x00000800)
+#define BIT_C(A) ((A) & 0x00001000)
+#define BIT_D(A) ((A) & 0x00002000)
+#define BIT_E(A) ((A) & 0x00004000)
+#define BIT_F(A) ((A) & 0x00008000)
+#define BIT_10(A) ((A) & 0x00010000)
+#define BIT_11(A) ((A) & 0x00020000)
+#define BIT_12(A) ((A) & 0x00040000)
+#define BIT_13(A) ((A) & 0x00080000)
+#define BIT_14(A) ((A) & 0x00100000)
+#define BIT_15(A) ((A) & 0x00200000)
+#define BIT_16(A) ((A) & 0x00400000)
+#define BIT_17(A) ((A) & 0x00800000)
+#define BIT_18(A) ((A) & 0x01000000)
+#define BIT_19(A) ((A) & 0x02000000)
+#define BIT_1A(A) ((A) & 0x04000000)
+#define BIT_1B(A) ((A) & 0x08000000)
+#define BIT_1C(A) ((A) & 0x10000000)
+#define BIT_1D(A) ((A) & 0x20000000)
+#define BIT_1E(A) ((A) & 0x40000000)
+#define BIT_1F(A) ((A) & 0x80000000)
+
+/* Get the most significant bit for specific sizes */
+#define GET_MSB_8(A) ((A) & 0x80)
+#define GET_MSB_9(A) ((A) & 0x100)
+#define GET_MSB_16(A) ((A) & 0x8000)
+#define GET_MSB_17(A) ((A) & 0x10000)
+#define GET_MSB_32(A) ((A) & 0x80000000)
+#if M68K_USE_64_BIT
+#define GET_MSB_33(A) ((A) & 0x100000000)
+#endif /* M68K_USE_64_BIT */
+
+/* Isolate nibbles */
+#define LOW_NIBBLE(A) ((A) & 0x0f)
+#define HIGH_NIBBLE(A) ((A) & 0xf0)
+
+/* These are used to isolate 8, 16, and 32 bit sizes */
+#define MASK_OUT_ABOVE_2(A) ((A) & 3)
+#define MASK_OUT_ABOVE_8(A) ((A) & 0xff)
+#define MASK_OUT_ABOVE_16(A) ((A) & 0xffff)
+#define MASK_OUT_BELOW_2(A) ((A) & ~3)
+#define MASK_OUT_BELOW_8(A) ((A) & ~0xff)
+#define MASK_OUT_BELOW_16(A) ((A) & ~0xffff)
+
+/* No need to mask if we are 32 bit */
+#if M68K_INT_GT_32_BIT || M68K_USE_64_BIT
+ #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff)
+ #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff)
+#else
+ #define MASK_OUT_ABOVE_32(A) (A)
+ #define MASK_OUT_BELOW_32(A) 0
+#endif /* M68K_INT_GT_32_BIT || M68K_USE_64_BIT */
+
+/* Simulate address lines of 68k family */
+#define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK)
+
+
+/* Shift & Rotate Macros. */
+#define LSL(A, C) ((A) << (C))
+#define LSR(A, C) ((A) >> (C))
+
+/* Some > 32-bit optimizations */
+#if M68K_INT_GT_32_BIT
+ /* Shift left and right */
+ #define LSR_32(A, C) ((A) >> (C))
+ #define LSL_32(A, C) ((A) << (C))
+#else
+ /* We have to do this because the morons at ANSI decided that shifts
+ * by >= data size are undefined.
+ */
+ #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0)
+ #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0)
+#endif /* M68K_INT_GT_32_BIT */
+
+#if M68K_USE_64_BIT
+ #define LSL_32_64(A, C) ((A) << (C))
+ #define LSR_32_64(A, C) ((A) >> (C))
+ #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C)))
+ #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C)))
+#endif /* M68K_USE_64_BIT */
+
+#define ROL_8(A, C) MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C)))
+#define ROL_9(A, C) (LSL(A, C) | LSR(A, 9-(C)))
+#define ROL_16(A, C) MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C)))
+#define ROL_17(A, C) (LSL(A, C) | LSR(A, 17-(C)))
+#define ROL_32(A, C) MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C)))
+#define ROL_33(A, C) (LSL_32(A, C) | LSR_32(A, 33-(C)))
+
+#define ROR_8(A, C) MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C)))
+#define ROR_9(A, C) (LSR(A, C) | LSL(A, 9-(C)))
+#define ROR_16(A, C) MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C)))
+#define ROR_17(A, C) (LSR(A, C) | LSL(A, 17-(C)))
+#define ROR_32(A, C) MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C)))
+#define ROR_33(A, C) (LSR_32(A, C) | LSL_32(A, 33-(C)))
+
+
+
+/* ------------------------------ CPU Access ------------------------------ */
+
+/* Access the CPU registers */
+#define CPU_TYPE m68ki_cpu.cpu_type
+
+#define REG_DA m68ki_cpu.dar /* easy access to data and address regs */
+#define REG_D m68ki_cpu.dar
+#define REG_A (m68ki_cpu.dar+8)
+#define REG_PPC m68ki_cpu.ppc
+#define REG_PC m68ki_cpu.pc
+#define REG_SP_BASE m68ki_cpu.sp
+#define REG_USP m68ki_cpu.sp[0]
+#define REG_ISP m68ki_cpu.sp[4]
+#define REG_MSP m68ki_cpu.sp[6]
+#define REG_SP m68ki_cpu.dar[15]
+#define REG_VBR m68ki_cpu.vbr
+#define REG_SFC m68ki_cpu.sfc
+#define REG_DFC m68ki_cpu.dfc
+#define REG_CACR m68ki_cpu.cacr
+#define REG_CAAR m68ki_cpu.caar
+#define REG_IR m68ki_cpu.ir
+
+#define FLAG_T1 m68ki_cpu.t1_flag
+#define FLAG_T0 m68ki_cpu.t0_flag
+#define FLAG_S m68ki_cpu.s_flag
+#define FLAG_M m68ki_cpu.m_flag
+#define FLAG_X m68ki_cpu.x_flag
+#define FLAG_N m68ki_cpu.n_flag
+#define FLAG_Z m68ki_cpu.not_z_flag
+#define FLAG_V m68ki_cpu.v_flag
+#define FLAG_C m68ki_cpu.c_flag
+#define FLAG_INT_MASK m68ki_cpu.int_mask
+
+#define CPU_INT_LEVEL m68ki_cpu.int_level /* ASG: changed from CPU_INTS_PENDING */
+#define CPU_INT_CYCLES m68ki_cpu.int_cycles /* ASG */
+#define CPU_STOPPED m68ki_cpu.stopped
+#define CPU_PREF_ADDR m68ki_cpu.pref_addr
+#define CPU_PREF_DATA m68ki_cpu.pref_data
+#define CPU_ADDRESS_MASK m68ki_cpu.address_mask
+#define CPU_SR_MASK m68ki_cpu.sr_mask
+#define CPU_INSTR_MODE m68ki_cpu.instr_mode
+#define CPU_RUN_MODE m68ki_cpu.run_mode
+
+#define CYC_INSTRUCTION m68ki_cpu.cyc_instruction
+#define CYC_EXCEPTION m68ki_cpu.cyc_exception
+#define CYC_BCC_NOTAKE_B m68ki_cpu.cyc_bcc_notake_b
+#define CYC_BCC_NOTAKE_W m68ki_cpu.cyc_bcc_notake_w
+#define CYC_DBCC_F_NOEXP m68ki_cpu.cyc_dbcc_f_noexp
+#define CYC_DBCC_F_EXP m68ki_cpu.cyc_dbcc_f_exp
+#define CYC_SCC_R_FALSE m68ki_cpu.cyc_scc_r_false
+#define CYC_MOVEM_W m68ki_cpu.cyc_movem_w
+#define CYC_MOVEM_L m68ki_cpu.cyc_movem_l
+#define CYC_SHIFT m68ki_cpu.cyc_shift
+#define CYC_RESET m68ki_cpu.cyc_reset
+
+
+#define CALLBACK_INT_ACK m68ki_cpu.int_ack_callback
+#define CALLBACK_BKPT_ACK m68ki_cpu.bkpt_ack_callback
+#define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback
+#define CALLBACK_PC_CHANGED m68ki_cpu.pc_changed_callback
+#define CALLBACK_SET_FC m68ki_cpu.set_fc_callback
+#define CALLBACK_INSTR_HOOK m68ki_cpu.instr_hook_callback
+
+
+
+/* ----------------------------- Configuration ---------------------------- */
+
+/* These defines are dependant on the configuration defines in m68kconf.h */
+
+/* Disable certain comparisons if we're not using all CPU types */
+#if M68K_EMULATE_020
+ #define CPU_TYPE_IS_020_PLUS(A) ((A) & CPU_TYPE_020)
+ #define CPU_TYPE_IS_020_LESS(A) 1
+#else
+ #define CPU_TYPE_IS_020_PLUS(A) 0
+ #define CPU_TYPE_IS_020_LESS(A) 1
+#endif
+
+#if M68K_EMULATE_EC020
+ #define CPU_TYPE_IS_EC020_PLUS(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))
+ #define CPU_TYPE_IS_EC020_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_010 | CPU_TYPE_EC020))
+#else
+ #define CPU_TYPE_IS_EC020_PLUS(A) CPU_TYPE_IS_020_PLUS(A)
+ #define CPU_TYPE_IS_EC020_LESS(A) CPU_TYPE_IS_020_LESS(A)
+#endif
+
+#if M68K_EMULATE_010
+ #define CPU_TYPE_IS_010(A) ((A) == CPU_TYPE_010)
+ #define CPU_TYPE_IS_010_PLUS(A) ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020))
+ #define CPU_TYPE_IS_010_LESS(A) ((A) & (CPU_TYPE_000 | CPU_TYPE_010))
+#else
+ #define CPU_TYPE_IS_010(A) 0
+ #define CPU_TYPE_IS_010_PLUS(A) CPU_TYPE_IS_EC020_PLUS(A)
+ #define CPU_TYPE_IS_010_LESS(A) CPU_TYPE_IS_EC020_LESS(A)
+#endif
+
+#if M68K_EMULATE_020 || M68K_EMULATE_EC020
+ #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))
+#else
+ #define CPU_TYPE_IS_020_VARIANT(A) 0
+#endif
+
+#if M68K_EMULATE_020 || M68K_EMULATE_EC020 || M68K_EMULATE_010
+ #define CPU_TYPE_IS_000(A) ((A) == CPU_TYPE_000)
+#else
+ #define CPU_TYPE_IS_000(A) 1
+#endif
+
+
+#if !M68K_SEPARATE_READS
+#define m68k_read_immediate_16(A) m68ki_read_program_16(A)
+#define m68k_read_immediate_32(A) m68ki_read_program_32(A)
+
+#define m68k_read_pcrelative_8(A) m68ki_read_program_8(A)
+#define m68k_read_pcrelative_16(A) m68ki_read_program_16(A)
+#define m68k_read_pcrelative_32(A) m68ki_read_program_32(A)
+#endif /* M68K_SEPARATE_READS */
+
+
+/* Enable or disable callback functions */
+#if M68K_EMULATE_INT_ACK
+ #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER
+ #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A)
+ #else
+ #define m68ki_int_ack(A) CALLBACK_INT_ACK(A)
+ #endif
+#else
+ /* Default action is to used autovector mode, which is most common */
+ #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR
+#endif /* M68K_EMULATE_INT_ACK */
+
+#if M68K_EMULATE_BKPT_ACK
+ #if M68K_EMULATE_BKPT_ACK == OPT_SPECIFY_HANDLER
+ #define m68ki_bkpt_ack(A) M68K_BKPT_ACK_CALLBACK(A)
+ #else
+ #define m68ki_bkpt_ack(A) CALLBACK_BKPT_ACK(A)
+ #endif
+#else
+ #define m68ki_bkpt_ack(A)
+#endif /* M68K_EMULATE_BKPT_ACK */
+
+#if M68K_EMULATE_RESET
+ #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER
+ #define m68ki_output_reset() M68K_RESET_CALLBACK()
+ #else
+ #define m68ki_output_reset() CALLBACK_RESET_INSTR()
+ #endif
+#else
+ #define m68ki_output_reset()
+#endif /* M68K_EMULATE_RESET */
+
+#if M68K_INSTRUCTION_HOOK
+ #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER
+ #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK()
+ #else
+ #define m68ki_instr_hook() CALLBACK_INSTR_HOOK()
+ #endif
+#else
+ #define m68ki_instr_hook()
+#endif /* M68K_INSTRUCTION_HOOK */
+
+#if M68K_MONITOR_PC
+ #if M68K_MONITOR_PC == OPT_SPECIFY_HANDLER
+ #define m68ki_pc_changed(A) M68K_SET_PC_CALLBACK(ADDRESS_68K(A))
+ #else
+ #define m68ki_pc_changed(A) CALLBACK_PC_CHANGED(ADDRESS_68K(A))
+ #endif
+#else
+ #define m68ki_pc_changed(A)
+#endif /* M68K_MONITOR_PC */
+
+
+/* Enable or disable function code emulation */
+#if M68K_EMULATE_FC
+ #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER
+ #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A)
+ #else
+ #define m68ki_set_fc(A) CALLBACK_SET_FC(A)
+ #endif
+ #define m68ki_use_data_space() m68ki_address_space = FUNCTION_CODE_USER_DATA
+ #define m68ki_use_program_space() m68ki_address_space = FUNCTION_CODE_USER_PROGRAM
+ #define m68ki_get_address_space() m68ki_address_space
+#else
+ #define m68ki_set_fc(A)
+ #define m68ki_use_data_space()
+ #define m68ki_use_program_space()
+ #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA
+#endif /* M68K_EMULATE_FC */
+
+
+/* Enable or disable trace emulation */
+#if M68K_EMULATE_TRACE
+ /* Initiates trace checking before each instruction (t1) */
+ #define m68ki_trace_t1() m68ki_tracing = FLAG_T1
+ /* adds t0 to trace checking if we encounter change of flow */
+ #define m68ki_trace_t0() m68ki_tracing |= FLAG_T0
+ /* Clear all tracing */
+ #define m68ki_clear_trace() m68ki_tracing = 0
+ /* Cause a trace exception if we are tracing */
+ #define m68ki_exception_if_trace() if(m68ki_tracing) m68ki_exception_trace()
+#else
+ #define m68ki_trace_t1()
+ #define m68ki_trace_t0()
+ #define m68ki_clear_trace()
+ #define m68ki_exception_if_trace()
+#endif /* M68K_EMULATE_TRACE */
+
+
+
+/* Address error */
+#if M68K_EMULATE_ADDRESS_ERROR
+ #include <setjmp.h>
+ extern jmp_buf m68ki_aerr_trap;
+
+ #define m68ki_set_address_error_trap() \
+ if(setjmp(m68ki_aerr_trap) != 0) \
+ { \
+ m68ki_exception_address_error(); \
+ if(CPU_STOPPED) \
+ { \
+ SET_CYCLES(0); \
+ CPU_INT_CYCLES = 0; \
+ return m68ki_initial_cycles; \
+ } \
+ }
+
+ #define m68ki_check_address_error(ADDR, WRITE_MODE, FC) \
+ if((ADDR)&1) \
+ { \
+ m68ki_aerr_address = ADDR; \
+ m68ki_aerr_write_mode = WRITE_MODE; \
+ m68ki_aerr_fc = FC; \
+ longjmp(m68ki_aerr_trap, 1); \
+ }
+#else
+ #define m68ki_set_address_error_trap()
+ #define m68ki_check_address_error(ADDR, WRITE_MODE, FC)
+#endif /* M68K_ADDRESS_ERROR */
+
+/* Logging */
+#if M68K_LOG_ENABLE
+ #include <stdio.h>
+ extern FILE* M68K_LOG_FILEHANDLE
+ extern char* m68ki_cpu_names[];
+
+ #define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A
+ #if M68K_LOG_1010_1111
+ #define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A
+ #else
+ #define M68K_DO_LOG_EMU(A)
+ #endif
+#else
+ #define M68K_DO_LOG(A)
+ #define M68K_DO_LOG_EMU(A)
+#endif
+
+
+
+/* -------------------------- EA / Operand Access ------------------------- */
+
+/*
+ * The general instruction format follows this pattern:
+ * .... XXX. .... .YYY
+ * where XXX is register X and YYY is register Y
+ */
+/* Data Register Isolation */
+#define DX (REG_D[(REG_IR >> 9) & 7])
+#define DY (REG_D[REG_IR & 7])
+/* Address Register Isolation */
+#define AX (REG_A[(REG_IR >> 9) & 7])
+#define AY (REG_A[REG_IR & 7])
+
+
+/* Effective Address Calculations */
+#define EA_AY_AI_8() AY /* address register indirect */
+#define EA_AY_AI_16() EA_AY_AI_8()
+#define EA_AY_AI_32() EA_AY_AI_8()
+#define EA_AY_PI_8() (AY++) /* postincrement (size = byte) */
+#define EA_AY_PI_16() ((AY+=2)-2) /* postincrement (size = word) */
+#define EA_AY_PI_32() ((AY+=4)-4) /* postincrement (size = long) */
+#define EA_AY_PD_8() (--AY) /* predecrement (size = byte) */
+#define EA_AY_PD_16() (AY-=2) /* predecrement (size = word) */
+#define EA_AY_PD_32() (AY-=4) /* predecrement (size = long) */
+#define EA_AY_DI_8() (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */
+#define EA_AY_DI_16() EA_AY_DI_8()
+#define EA_AY_DI_32() EA_AY_DI_8()
+#define EA_AY_IX_8() m68ki_get_ea_ix(AY) /* indirect + index */
+#define EA_AY_IX_16() EA_AY_IX_8()
+#define EA_AY_IX_32() EA_AY_IX_8()
+
+#define EA_AX_AI_8() AX
+#define EA_AX_AI_16() EA_AX_AI_8()
+#define EA_AX_AI_32() EA_AX_AI_8()
+#define EA_AX_PI_8() (AX++)
+#define EA_AX_PI_16() ((AX+=2)-2)
+#define EA_AX_PI_32() ((AX+=4)-4)
+#define EA_AX_PD_8() (--AX)
+#define EA_AX_PD_16() (AX-=2)
+#define EA_AX_PD_32() (AX-=4)
+#define EA_AX_DI_8() (AX+MAKE_INT_16(m68ki_read_imm_16()))
+#define EA_AX_DI_16() EA_AX_DI_8()
+#define EA_AX_DI_32() EA_AX_DI_8()
+#define EA_AX_IX_8() m68ki_get_ea_ix(AX)
+#define EA_AX_IX_16() EA_AX_IX_8()
+#define EA_AX_IX_32() EA_AX_IX_8()
+
+#define EA_A7_PI_8() ((REG_A[7]+=2)-2)
+#define EA_A7_PD_8() (REG_A[7]-=2)
+
+#define EA_AW_8() MAKE_INT_16(m68ki_read_imm_16()) /* absolute word */
+#define EA_AW_16() EA_AW_8()
+#define EA_AW_32() EA_AW_8()
+#define EA_AL_8() m68ki_read_imm_32() /* absolute long */
+#define EA_AL_16() EA_AL_8()
+#define EA_AL_32() EA_AL_8()
+#define EA_PCDI_8() m68ki_get_ea_pcdi() /* pc indirect + displacement */
+#define EA_PCDI_16() EA_PCDI_8()
+#define EA_PCDI_32() EA_PCDI_8()
+#define EA_PCIX_8() m68ki_get_ea_pcix() /* pc indirect + index */
+#define EA_PCIX_16() EA_PCIX_8()
+#define EA_PCIX_32() EA_PCIX_8()
+
+
+#define OPER_I_8() m68ki_read_imm_8()
+#define OPER_I_16() m68ki_read_imm_16()
+#define OPER_I_32() m68ki_read_imm_32()
+
+
+
+/* --------------------------- Status Register ---------------------------- */
+
+/* Flag Calculation Macros */
+#define CFLAG_8(A) (A)
+#define CFLAG_16(A) ((A)>>8)
+
+#if M68K_INT_GT_32_BIT
+ #define CFLAG_ADD_32(S, D, R) ((R)>>24)
+ #define CFLAG_SUB_32(S, D, R) ((R)>>24)
+#else
+ #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23)
+ #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23)
+#endif /* M68K_INT_GT_32_BIT */
+
+#define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R))
+#define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8)
+#define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24)
+
+#define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D))
+#define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8)
+#define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24)
+
+#define NFLAG_8(A) (A)
+#define NFLAG_16(A) ((A)>>8)
+#define NFLAG_32(A) ((A)>>24)
+#define NFLAG_64(A) ((A)>>56)
+
+#define ZFLAG_8(A) MASK_OUT_ABOVE_8(A)
+#define ZFLAG_16(A) MASK_OUT_ABOVE_16(A)
+#define ZFLAG_32(A) MASK_OUT_ABOVE_32(A)
+
+
+/* Flag values */
+#define NFLAG_SET 0x80
+#define NFLAG_CLEAR 0
+#define CFLAG_SET 0x100
+#define CFLAG_CLEAR 0
+#define XFLAG_SET 0x100
+#define XFLAG_CLEAR 0
+#define VFLAG_SET 0x80
+#define VFLAG_CLEAR 0
+#define ZFLAG_SET 0
+#define ZFLAG_CLEAR 0xffffffff
+
+#define SFLAG_SET 4
+#define SFLAG_CLEAR 0
+#define MFLAG_SET 2
+#define MFLAG_CLEAR 0
+
+/* Turn flag values into 1 or 0 */
+#define XFLAG_AS_1() ((FLAG_X>>8)&1)
+#define NFLAG_AS_1() ((FLAG_N>>7)&1)
+#define VFLAG_AS_1() ((FLAG_V>>7)&1)
+#define ZFLAG_AS_1() (!FLAG_Z)
+#define CFLAG_AS_1() ((FLAG_C>>8)&1)
+
+
+/* Conditions */
+#define COND_CS() (FLAG_C&0x100)
+#define COND_CC() (!COND_CS())
+#define COND_VS() (FLAG_V&0x80)
+#define COND_VC() (!COND_VS())
+#define COND_NE() FLAG_Z
+#define COND_EQ() (!COND_NE())
+#define COND_MI() (FLAG_N&0x80)
+#define COND_PL() (!COND_MI())
+#define COND_LT() ((FLAG_N^FLAG_V)&0x80)
+#define COND_GE() (!COND_LT())
+#define COND_HI() (COND_CC() && COND_NE())
+#define COND_LS() (COND_CS() || COND_EQ())
+#define COND_GT() (COND_GE() && COND_NE())
+#define COND_LE() (COND_LT() || COND_EQ())
+
+/* Reversed conditions */
+#define COND_NOT_CS() COND_CC()
+#define COND_NOT_CC() COND_CS()
+#define COND_NOT_VS() COND_VC()
+#define COND_NOT_VC() COND_VS()
+#define COND_NOT_NE() COND_EQ()
+#define COND_NOT_EQ() COND_NE()
+#define COND_NOT_MI() COND_PL()
+#define COND_NOT_PL() COND_MI()
+#define COND_NOT_LT() COND_GE()
+#define COND_NOT_GE() COND_LT()
+#define COND_NOT_HI() COND_LS()
+#define COND_NOT_LS() COND_HI()
+#define COND_NOT_GT() COND_LE()
+#define COND_NOT_LE() COND_GT()
+
+/* Not real conditions, but here for convenience */
+#define COND_XS() (FLAG_X&0x100)
+#define COND_XC() (!COND_XS)
+
+
+/* Get the condition code register */
+#define m68ki_get_ccr() ((COND_XS() >> 4) | \
+ (COND_MI() >> 4) | \
+ (COND_EQ() << 2) | \
+ (COND_VS() >> 6) | \
+ (COND_CS() >> 8))
+
+/* Get the status register */
+#define m68ki_get_sr() ( FLAG_T1 | \
+ FLAG_T0 | \
+ (FLAG_S << 11) | \
+ (FLAG_M << 11) | \
+ FLAG_INT_MASK | \
+ m68ki_get_ccr())
+
+
+
+/* ---------------------------- Cycle Counting ---------------------------- */
+
+#define ADD_CYCLES(A) m68ki_remaining_cycles += (A)
+#define USE_CYCLES(A) m68ki_remaining_cycles -= (A)
+#define SET_CYCLES(A) m68ki_remaining_cycles = A
+#define GET_CYCLES() m68ki_remaining_cycles
+#define USE_ALL_CYCLES() m68ki_remaining_cycles = 0
+
+
+
+/* ----------------------------- Read / Write ----------------------------- */
+
+/* Read from the current address space */
+#define m68ki_read_8(A) m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space())
+#define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space())
+#define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space())
+
+/* Write to the current data space */
+#define m68ki_write_8(A, V) m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
+#define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
+#define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
+
+#if M68K_SIMULATE_PD_WRITES
+#define m68ki_write_32_pd(A, V) m68ki_write_32_pd_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
+#else
+#define m68ki_write_32_pd(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)
+#endif
+
+/* map read immediate 8 to read immediate 16 */
+#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16())
+
+/* Map PC-relative reads */
+#define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A)
+#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A)
+#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A)
+
+/* Read from the program space */
+#define m68ki_read_program_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
+#define m68ki_read_program_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
+#define m68ki_read_program_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)
+
+/* Read from the data space */
+#define m68ki_read_data_8(A) m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
+#define m68ki_read_data_16(A) m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
+#define m68ki_read_data_32(A) m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)
+
+
+
+/* ======================================================================== */
+/* =============================== PROTOTYPES ============================= */
+/* ======================================================================== */
+
+typedef struct
+{
+ uint cpu_type; /* CPU Type: 68000, 68010, 68EC020, or 68020 */
+ uint dar[16]; /* Data and Address Registers */
+ uint ppc; /* Previous program counter */
+ uint pc; /* Program Counter */
+ uint sp[7]; /* User, Interrupt, and Master Stack Pointers */
+ uint vbr; /* Vector Base Register (m68010+) */
+ uint sfc; /* Source Function Code Register (m68010+) */
+ uint dfc; /* Destination Function Code Register (m68010+) */
+ uint cacr; /* Cache Control Register (m68020, unemulated) */
+ uint caar; /* Cache Address Register (m68020, unemulated) */
+ uint ir; /* Instruction Register */
+ uint t1_flag; /* Trace 1 */
+ uint t0_flag; /* Trace 0 */
+ uint s_flag; /* Supervisor */
+ uint m_flag; /* Master/Interrupt state */
+ uint x_flag; /* Extend */
+ uint n_flag; /* Negative */
+ uint not_z_flag; /* Zero, inverted for speedups */
+ uint v_flag; /* Overflow */
+ uint c_flag; /* Carry */
+ uint int_mask; /* I0-I2 */
+ uint int_level; /* State of interrupt pins IPL0-IPL2 -- ASG: changed from ints_pending */
+ uint int_cycles; /* ASG: extra cycles from generated interrupts */
+ uint stopped; /* Stopped state */
+ uint pref_addr; /* Last prefetch address */
+ uint pref_data; /* Data in the prefetch queue */
+ uint address_mask; /* Available address pins */
+ uint sr_mask; /* Implemented status register bits */
+ uint instr_mode; /* Stores whether we are in instruction mode or group 0/1 exception mode */
+ uint run_mode; /* Stores whether we are processing a reset, bus error, address error, or something else */
+
+ /* Clocks required for instructions / exceptions */
+ uint cyc_bcc_notake_b;
+ uint cyc_bcc_notake_w;
+ uint cyc_dbcc_f_noexp;
+ uint cyc_dbcc_f_exp;
+ uint cyc_scc_r_false;
+ uint cyc_movem_w;
+ uint cyc_movem_l;
+ uint cyc_shift;
+ uint cyc_reset;
+ uint8* cyc_instruction;
+ uint8* cyc_exception;
+
+ /* Callbacks to host */
+ int (*int_ack_callback)(int int_line); /* Interrupt Acknowledge */
+ void (*bkpt_ack_callback)(unsigned int data); /* Breakpoint Acknowledge */
+ void (*reset_instr_callback)(void); /* Called when a RESET instruction is encountered */
+ void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */
+ void (*set_fc_callback)(unsigned int new_fc); /* Called when the CPU function code changes */
+ void (*instr_hook_callback)(void); /* Called every instruction cycle prior to execution */
+
+} m68ki_cpu_core;
+
+
+extern m68ki_cpu_core m68ki_cpu;
+extern sint m68ki_remaining_cycles;
+extern uint m68ki_tracing;
+extern uint8 m68ki_shift_8_table[];
+extern uint16 m68ki_shift_16_table[];
+extern uint m68ki_shift_32_table[];
+extern uint8 m68ki_exception_cycle_table[][256];
+extern uint m68ki_address_space;
+extern uint8 m68ki_ea_idx_cycle_table[];
+
+extern uint m68ki_aerr_address;
+extern uint m68ki_aerr_write_mode;
+extern uint m68ki_aerr_fc;
+
+/* Read data immediately after the program counter */
+INLINE uint m68ki_read_imm_16(void);
+INLINE uint m68ki_read_imm_32(void);
+
+/* Read data with specific function code */
+INLINE uint m68ki_read_8_fc (uint address, uint fc);
+INLINE uint m68ki_read_16_fc (uint address, uint fc);
+INLINE uint m68ki_read_32_fc (uint address, uint fc);
+
+/* Write data with specific function code */
+INLINE void m68ki_write_8_fc (uint address, uint fc, uint value);
+INLINE void m68ki_write_16_fc(uint address, uint fc, uint value);
+INLINE void m68ki_write_32_fc(uint address, uint fc, uint value);
+#if M68K_SIMULATE_PD_WRITES
+INLINE void m68ki_write_32_pd_fc(uint address, uint fc, uint value);
+#endif /* M68K_SIMULATE_PD_WRITES */
+
+/* Indexed and PC-relative ea fetching */
+INLINE uint m68ki_get_ea_pcdi(void);
+INLINE uint m68ki_get_ea_pcix(void);
+INLINE uint m68ki_get_ea_ix(uint An);
+
+/* Operand fetching */
+INLINE uint OPER_AY_AI_8(void);
+INLINE uint OPER_AY_AI_16(void);
+INLINE uint OPER_AY_AI_32(void);
+INLINE uint OPER_AY_PI_8(void);
+INLINE uint OPER_AY_PI_16(void);
+INLINE uint OPER_AY_PI_32(void);
+INLINE uint OPER_AY_PD_8(void);
+INLINE uint OPER_AY_PD_16(void);
+INLINE uint OPER_AY_PD_32(void);
+INLINE uint OPER_AY_DI_8(void);
+INLINE uint OPER_AY_DI_16(void);
+INLINE uint OPER_AY_DI_32(void);
+INLINE uint OPER_AY_IX_8(void);
+INLINE uint OPER_AY_IX_16(void);
+INLINE uint OPER_AY_IX_32(void);
+
+INLINE uint OPER_AX_AI_8(void);
+INLINE uint OPER_AX_AI_16(void);
+INLINE uint OPER_AX_AI_32(void);
+INLINE uint OPER_AX_PI_8(void);
+INLINE uint OPER_AX_PI_16(void);
+INLINE uint OPER_AX_PI_32(void);
+INLINE uint OPER_AX_PD_8(void);
+INLINE uint OPER_AX_PD_16(void);
+INLINE uint OPER_AX_PD_32(void);
+INLINE uint OPER_AX_DI_8(void);
+INLINE uint OPER_AX_DI_16(void);
+INLINE uint OPER_AX_DI_32(void);
+INLINE uint OPER_AX_IX_8(void);
+INLINE uint OPER_AX_IX_16(void);
+INLINE uint OPER_AX_IX_32(void);
+
+INLINE uint OPER_A7_PI_8(void);
+INLINE uint OPER_A7_PD_8(void);
+
+INLINE uint OPER_AW_8(void);
+INLINE uint OPER_AW_16(void);
+INLINE uint OPER_AW_32(void);
+INLINE uint OPER_AL_8(void);
+INLINE uint OPER_AL_16(void);
+INLINE uint OPER_AL_32(void);
+INLINE uint OPER_PCDI_8(void);
+INLINE uint OPER_PCDI_16(void);
+INLINE uint OPER_PCDI_32(void);
+INLINE uint OPER_PCIX_8(void);
+INLINE uint OPER_PCIX_16(void);
+INLINE uint OPER_PCIX_32(void);
+
+/* Stack operations */
+INLINE void m68ki_push_16(uint value);
+INLINE void m68ki_push_32(uint value);
+INLINE uint m68ki_pull_16(void);
+INLINE uint m68ki_pull_32(void);
+
+/* Program flow operations */
+INLINE void m68ki_jump(uint new_pc);
+INLINE void m68ki_jump_vector(uint vector);
+INLINE void m68ki_branch_8(uint offset);
+INLINE void m68ki_branch_16(uint offset);
+INLINE void m68ki_branch_32(uint offset);
+
+/* Status register operations. */
+INLINE void m68ki_set_s_flag(uint value); /* Only bit 2 of value should be set (i.e. 4 or 0) */
+INLINE void m68ki_set_sm_flag(uint value); /* only bits 1 and 2 of value should be set */
+INLINE void m68ki_set_ccr(uint value); /* set the condition code register */
+INLINE void m68ki_set_sr(uint value); /* set the status register */
+INLINE void m68ki_set_sr_noint(uint value); /* set the status register */
+
+/* Exception processing */
+INLINE uint m68ki_init_exception(void); /* Initial exception processing */
+
+INLINE void m68ki_stack_frame_3word(uint pc, uint sr); /* Stack various frame types */
+INLINE void m68ki_stack_frame_buserr(uint sr);
+
+INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector);
+INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector);
+INLINE void m68ki_stack_frame_0010(uint sr, uint vector);
+INLINE void m68ki_stack_frame_1000(uint pc, uint sr, uint vector);
+INLINE void m68ki_stack_frame_1010(uint sr, uint vector, uint pc);
+INLINE void m68ki_stack_frame_1011(uint sr, uint vector, uint pc);
+
+INLINE void m68ki_exception_trap(uint vector);
+INLINE void m68ki_exception_trapN(uint vector);
+INLINE void m68ki_exception_trace(void);
+INLINE void m68ki_exception_privilege_violation(void);
+INLINE void m68ki_exception_1010(void);
+INLINE void m68ki_exception_1111(void);
+INLINE void m68ki_exception_illegal(void);
+INLINE void m68ki_exception_format_error(void);
+INLINE void m68ki_exception_address_error(void);
+INLINE void m68ki_exception_interrupt(uint int_level);
+INLINE void m68ki_check_interrupts(void); /* ASG: check for interrupts */
+
+/* quick disassembly (used for logging) */
+char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type);
+
+
+/* ======================================================================== */
+/* =========================== UTILITY FUNCTIONS ========================== */
+/* ======================================================================== */
+
+
+/* ---------------------------- Read Immediate ---------------------------- */
+
+/* Handles all immediate reads, does address error check, function code setting,
+ * and prefetching if they are enabled in m68kconf.h
+ */
+INLINE uint m68ki_read_imm_16(void)
+{
+ m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+#if M68K_EMULATE_PREFETCH
+ if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)
+ {
+ CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);
+ CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));
+ }
+ REG_PC += 2;
+ return MASK_OUT_ABOVE_16(CPU_PREF_DATA >> ((2-((REG_PC-2)&2))<<3));
+#else
+ REG_PC += 2;
+ return m68k_read_immediate_16(ADDRESS_68K(REG_PC-2));
+#endif /* M68K_EMULATE_PREFETCH */
+}
+INLINE uint m68ki_read_imm_32(void)
+{
+#if M68K_EMULATE_PREFETCH
+ uint temp_val;
+
+ m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+ if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)
+ {
+ CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);
+ CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));
+ }
+ temp_val = CPU_PREF_DATA;
+ REG_PC += 2;
+ if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)
+ {
+ CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);
+ CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));
+ temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | (CPU_PREF_DATA >> 16));
+ }
+ REG_PC += 2;
+
+ return temp_val;
+#else
+ m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(REG_PC, MODE_READ, FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 4;
+ return m68k_read_immediate_32(ADDRESS_68K(REG_PC-4));
+#endif /* M68K_EMULATE_PREFETCH */
+}
+
+
+
+/* ------------------------- Top level read/write ------------------------- */
+
+/* Handles all memory accesses (except for immediate reads if they are
+ * configured to use separate functions in m68kconf.h).
+ * All memory accesses must go through these top level functions.
+ * These functions will also check for address error and set the function
+ * code if they are enabled in m68kconf.h.
+ */
+INLINE uint m68ki_read_8_fc(uint address, uint fc)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ return m68k_read_memory_8(ADDRESS_68K(address));
+}
+INLINE uint m68ki_read_16_fc(uint address, uint fc)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(address, MODE_READ, fc); /* auto-disable (see m68kcpu.h) */
+ return m68k_read_memory_16(ADDRESS_68K(address));
+}
+INLINE uint m68ki_read_32_fc(uint address, uint fc)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(address, MODE_READ, fc); /* auto-disable (see m68kcpu.h) */
+ return m68k_read_memory_32(ADDRESS_68K(address));
+}
+
+INLINE void m68ki_write_8_fc(uint address, uint fc, uint value)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68k_write_memory_8(ADDRESS_68K(address), value);
+}
+INLINE void m68ki_write_16_fc(uint address, uint fc, uint value)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */
+ m68k_write_memory_16(ADDRESS_68K(address), value);
+}
+INLINE void m68ki_write_32_fc(uint address, uint fc, uint value)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */
+ m68k_write_memory_32(ADDRESS_68K(address), value);
+}
+
+#if M68K_SIMULATE_PD_WRITES
+INLINE void m68ki_write_32_pd_fc(uint address, uint fc, uint value)
+{
+ m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */
+ m68ki_check_address_error(address, MODE_WRITE, fc); /* auto-disable (see m68kcpu.h) */
+ m68k_write_memory_32_pd(ADDRESS_68K(address), value);
+}
+#endif
+
+
+/* --------------------- Effective Address Calculation -------------------- */
+
+/* The program counter relative addressing modes cause operands to be
+ * retrieved from program space, not data space.
+ */
+INLINE uint m68ki_get_ea_pcdi(void)
+{
+ uint old_pc = REG_PC;
+ m68ki_use_program_space(); /* auto-disable */
+ return old_pc + MAKE_INT_16(m68ki_read_imm_16());
+}
+
+
+INLINE uint m68ki_get_ea_pcix(void)
+{
+ m68ki_use_program_space(); /* auto-disable */
+ return m68ki_get_ea_ix(REG_PC);
+}
+
+/* Indexed addressing modes are encoded as follows:
+ *
+ * Base instruction format:
+ * F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0
+ * x x x x x x x x x x | 1 1 0 | BASE REGISTER (An)
+ *
+ * Base instruction format for destination EA in move instructions:
+ * F E D C | B A 9 | 8 7 6 | 5 4 3 2 1 0
+ * x x x x | BASE REG | 1 1 0 | X X X X X X (An)
+ *
+ * Brief extension format:
+ * F | E D C | B | A 9 | 8 | 7 6 5 4 3 2 1 0
+ * D/A | REGISTER | W/L | SCALE | 0 | DISPLACEMENT
+ *
+ * Full extension format:
+ * F E D C B A 9 8 7 6 5 4 3 2 1 0
+ * D/A | REGISTER | W/L | SCALE | 1 | BS | IS | BD SIZE | 0 | I/IS
+ * BASE DISPLACEMENT (0, 16, 32 bit) (bd)
+ * OUTER DISPLACEMENT (0, 16, 32 bit) (od)
+ *
+ * D/A: 0 = Dn, 1 = An (Xn)
+ * W/L: 0 = W (sign extend), 1 = L (.SIZE)
+ * SCALE: 00=1, 01=2, 10=4, 11=8 (*SCALE)
+ * BS: 0=add base reg, 1=suppress base reg (An suppressed)
+ * IS: 0=add index, 1=suppress index (Xn suppressed)
+ * BD SIZE: 00=reserved, 01=NULL, 10=Word, 11=Long (size of bd)
+ *
+ * IS I/IS Operation
+ * 0 000 No Memory Indirect
+ * 0 001 indir prex with null outer
+ * 0 010 indir prex with word outer
+ * 0 011 indir prex with long outer
+ * 0 100 reserved
+ * 0 101 indir postx with null outer
+ * 0 110 indir postx with word outer
+ * 0 111 indir postx with long outer
+ * 1 000 no memory indirect
+ * 1 001 mem indir with null outer
+ * 1 010 mem indir with word outer
+ * 1 011 mem indir with long outer
+ * 1 100-111 reserved
+ */
+INLINE uint m68ki_get_ea_ix(uint An)
+{
+ /* An = base register */
+ uint extension = m68ki_read_imm_16();
+ uint Xn = 0; /* Index register */
+ uint bd = 0; /* Base Displacement */
+ uint od = 0; /* Outer Displacement */
+
+ if(CPU_TYPE_IS_010_LESS(CPU_TYPE))
+ {
+ /* Calculate index */
+ Xn = REG_DA[extension>>12]; /* Xn */
+ if(!BIT_B(extension)) /* W/L */
+ Xn = MAKE_INT_16(Xn);
+
+ /* Add base register and displacement and return */
+ return An + Xn + MAKE_INT_8(extension);
+ }
+
+ /* Brief extension format */
+ if(!BIT_8(extension))
+ {
+ /* Calculate index */
+ Xn = REG_DA[extension>>12]; /* Xn */
+ if(!BIT_B(extension)) /* W/L */
+ Xn = MAKE_INT_16(Xn);
+ /* Add scale if proper CPU type */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ Xn <<= (extension>>9) & 3; /* SCALE */
+
+ /* Add base register and displacement and return */
+ return An + Xn + MAKE_INT_8(extension);
+ }
+
+ /* Full extension format */
+
+ USE_CYCLES(m68ki_ea_idx_cycle_table[extension&0x3f]);
+
+ /* Check if base register is present */
+ if(BIT_7(extension)) /* BS */
+ An = 0; /* An */
+
+ /* Check if index is present */
+ if(!BIT_6(extension)) /* IS */
+ {
+ Xn = REG_DA[extension>>12]; /* Xn */
+ if(!BIT_B(extension)) /* W/L */
+ Xn = MAKE_INT_16(Xn);
+ Xn <<= (extension>>9) & 3; /* SCALE */
+ }
+
+ /* Check if base displacement is present */
+ if(BIT_5(extension)) /* BD SIZE */
+ bd = BIT_4(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16());
+
+ /* If no indirect action, we are done */
+ if(!(extension&7)) /* No Memory Indirect */
+ return An + bd + Xn;
+
+ /* Check if outer displacement is present */
+ if(BIT_1(extension)) /* I/IS: od */
+ od = BIT_0(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16());
+
+ /* Postindex */
+ if(BIT_2(extension)) /* I/IS: 0 = preindex, 1 = postindex */
+ return m68ki_read_32(An + bd) + Xn + od;
+
+ /* Preindex */
+ return m68ki_read_32(An + bd + Xn) + od;
+}
+
+
+/* Fetch operands */
+INLINE uint OPER_AY_AI_8(void) {uint ea = EA_AY_AI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AY_PI_8(void) {uint ea = EA_AY_PI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AY_PD_8(void) {uint ea = EA_AY_PD_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AY_DI_8(void) {uint ea = EA_AY_DI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AY_IX_8(void) {uint ea = EA_AY_IX_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);}
+
+INLINE uint OPER_AX_AI_8(void) {uint ea = EA_AX_AI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AX_PI_8(void) {uint ea = EA_AX_PI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AX_PD_8(void) {uint ea = EA_AX_PD_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AX_DI_8(void) {uint ea = EA_AX_DI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AX_IX_8(void) {uint ea = EA_AX_IX_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);}
+
+INLINE uint OPER_A7_PI_8(void) {uint ea = EA_A7_PI_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_A7_PD_8(void) {uint ea = EA_A7_PD_8(); return m68ki_read_8(ea); }
+
+INLINE uint OPER_AW_8(void) {uint ea = EA_AW_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AW_16(void) {uint ea = EA_AW_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AW_32(void) {uint ea = EA_AW_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_AL_8(void) {uint ea = EA_AL_8(); return m68ki_read_8(ea); }
+INLINE uint OPER_AL_16(void) {uint ea = EA_AL_16(); return m68ki_read_16(ea);}
+INLINE uint OPER_AL_32(void) {uint ea = EA_AL_32(); return m68ki_read_32(ea);}
+INLINE uint OPER_PCDI_8(void) {uint ea = EA_PCDI_8(); return m68ki_read_pcrel_8(ea); }
+INLINE uint OPER_PCDI_16(void) {uint ea = EA_PCDI_16(); return m68ki_read_pcrel_16(ea);}
+INLINE uint OPER_PCDI_32(void) {uint ea = EA_PCDI_32(); return m68ki_read_pcrel_32(ea);}
+INLINE uint OPER_PCIX_8(void) {uint ea = EA_PCIX_8(); return m68ki_read_pcrel_8(ea); }
+INLINE uint OPER_PCIX_16(void) {uint ea = EA_PCIX_16(); return m68ki_read_pcrel_16(ea);}
+INLINE uint OPER_PCIX_32(void) {uint ea = EA_PCIX_32(); return m68ki_read_pcrel_32(ea);}
+
+
+
+/* ---------------------------- Stack Functions --------------------------- */
+
+/* Push/pull data from the stack */
+INLINE void m68ki_push_16(uint value)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2);
+ m68ki_write_16(REG_SP, value);
+}
+
+INLINE void m68ki_push_32(uint value)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4);
+ m68ki_write_32(REG_SP, value);
+}
+
+INLINE uint m68ki_pull_16(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2);
+ return m68ki_read_16(REG_SP-2);
+}
+
+INLINE uint m68ki_pull_32(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4);
+ return m68ki_read_32(REG_SP-4);
+}
+
+
+/* Increment/decrement the stack as if doing a push/pull but
+ * don't do any memory access.
+ */
+INLINE void m68ki_fake_push_16(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2);
+}
+
+INLINE void m68ki_fake_push_32(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4);
+}
+
+INLINE void m68ki_fake_pull_16(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2);
+}
+
+INLINE void m68ki_fake_pull_32(void)
+{
+ REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4);
+}
+
+
+/* ----------------------------- Program Flow ----------------------------- */
+
+/* Jump to a new program location or vector.
+ * These functions will also call the pc_changed callback if it was enabled
+ * in m68kconf.h.
+ */
+INLINE void m68ki_jump(uint new_pc)
+{
+ REG_PC = new_pc;
+ m68ki_pc_changed(REG_PC);
+}
+
+INLINE void m68ki_jump_vector(uint vector)
+{
+ REG_PC = (vector<<2) + REG_VBR;
+ REG_PC = m68ki_read_data_32(REG_PC);
+ m68ki_pc_changed(REG_PC);
+}
+
+
+/* Branch to a new memory location.
+ * The 32-bit branch will call pc_changed if it was enabled in m68kconf.h.
+ * So far I've found no problems with not calling pc_changed for 8 or 16
+ * bit branches.
+ */
+INLINE void m68ki_branch_8(uint offset)
+{
+ REG_PC += MAKE_INT_8(offset);
+}
+
+INLINE void m68ki_branch_16(uint offset)
+{
+ REG_PC += MAKE_INT_16(offset);
+}
+
+INLINE void m68ki_branch_32(uint offset)
+{
+ REG_PC += offset;
+ m68ki_pc_changed(REG_PC);
+}
+
+
+
+/* ---------------------------- Status Register --------------------------- */
+
+/* Set the S flag and change the active stack pointer.
+ * Note that value MUST be 4 or 0.
+ */
+INLINE void m68ki_set_s_flag(uint value)
+{
+ /* Backup the old stack pointer */
+ REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP;
+ /* Set the S flag */
+ FLAG_S = value;
+ /* Set the new stack pointer */
+ REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)];
+}
+
+/* Set the S and M flags and change the active stack pointer.
+ * Note that value MUST be 0, 2, 4, or 6 (bit2 = S, bit1 = M).
+ */
+INLINE void m68ki_set_sm_flag(uint value)
+{
+ /* Backup the old stack pointer */
+ REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP;
+ /* Set the S and M flags */
+ FLAG_S = value & SFLAG_SET;
+ FLAG_M = value & MFLAG_SET;
+ /* Set the new stack pointer */
+ REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)];
+}
+
+/* Set the S and M flags. Don't touch the stack pointer. */
+INLINE void m68ki_set_sm_flag_nosp(uint value)
+{
+ /* Set the S and M flags */
+ FLAG_S = value & SFLAG_SET;
+ FLAG_M = value & MFLAG_SET;
+}
+
+
+/* Set the condition code register */
+INLINE void m68ki_set_ccr(uint value)
+{
+ FLAG_X = BIT_4(value) << 4;
+ FLAG_N = BIT_3(value) << 4;
+ FLAG_Z = !BIT_2(value);
+ FLAG_V = BIT_1(value) << 6;
+ FLAG_C = BIT_0(value) << 8;
+}
+
+/* Set the status register but don't check for interrupts */
+INLINE void m68ki_set_sr_noint(uint value)
+{
+ /* Mask out the "unimplemented" bits */
+ value &= CPU_SR_MASK;
+
+ /* Now set the status register */
+ FLAG_T1 = BIT_F(value);
+ FLAG_T0 = BIT_E(value);
+ FLAG_INT_MASK = value & 0x0700;
+ m68ki_set_ccr(value);
+ m68ki_set_sm_flag((value >> 11) & 6);
+}
+
+/* Set the status register but don't check for interrupts nor
+ * change the stack pointer
+ */
+INLINE void m68ki_set_sr_noint_nosp(uint value)
+{
+ /* Mask out the "unimplemented" bits */
+ value &= CPU_SR_MASK;
+
+ /* Now set the status register */
+ FLAG_T1 = BIT_F(value);
+ FLAG_T0 = BIT_E(value);
+ FLAG_INT_MASK = value & 0x0700;
+ m68ki_set_ccr(value);
+ m68ki_set_sm_flag_nosp((value >> 11) & 6);
+}
+
+/* Set the status register and check for interrupts */
+INLINE void m68ki_set_sr(uint value)
+{
+ m68ki_set_sr_noint(value);
+ m68ki_check_interrupts();
+}
+
+
+/* ------------------------- Exception Processing ------------------------- */
+
+/* Initiate exception processing */
+INLINE uint m68ki_init_exception(void)
+{
+ /* Save the old status register */
+ uint sr = m68ki_get_sr();
+
+ /* Turn off trace flag, clear pending traces */
+ FLAG_T1 = FLAG_T0 = 0;
+ m68ki_clear_trace();
+ /* Enter supervisor mode */
+ m68ki_set_s_flag(SFLAG_SET);
+
+ return sr;
+}
+
+/* 3 word stack frame (68000 only) */
+INLINE void m68ki_stack_frame_3word(uint pc, uint sr)
+{
+ m68ki_push_32(pc);
+ m68ki_push_16(sr);
+}
+
+/* Format 0 stack frame.
+ * This is the standard stack frame for 68010+.
+ */
+INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector)
+{
+ /* Stack a 3-word frame if we are 68000 */
+ if(CPU_TYPE == CPU_TYPE_000)
+ {
+ m68ki_stack_frame_3word(pc, sr);
+ return;
+ }
+ m68ki_push_16(vector<<2);
+ m68ki_push_32(pc);
+ m68ki_push_16(sr);
+}
+
+/* Format 1 stack frame (68020).
+ * For 68020, this is the 4 word throwaway frame.
+ */
+INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector)
+{
+ m68ki_push_16(0x1000 | (vector<<2));
+ m68ki_push_32(pc);
+ m68ki_push_16(sr);
+}
+
+/* Format 2 stack frame.
+ * This is used only by 68020 for trap exceptions.
+ */
+INLINE void m68ki_stack_frame_0010(uint sr, uint vector)
+{
+ m68ki_push_32(REG_PPC);
+ m68ki_push_16(0x2000 | (vector<<2));
+ m68ki_push_32(REG_PC);
+ m68ki_push_16(sr);
+}
+
+
+/* Bus error stack frame (68000 only).
+ */
+INLINE void m68ki_stack_frame_buserr(uint sr)
+{
+ m68ki_push_32(REG_PC);
+ m68ki_push_16(sr);
+ m68ki_push_16(REG_IR);
+ m68ki_push_32(m68ki_aerr_address); /* access address */
+ /* 0 0 0 0 0 0 0 0 0 0 0 R/W I/N FC
+ * R/W 0 = write, 1 = read
+ * I/N 0 = instruction, 1 = not
+ * FC 3-bit function code
+ */
+ m68ki_push_16(m68ki_aerr_write_mode | CPU_INSTR_MODE | m68ki_aerr_fc);
+}
+
+/* Format 8 stack frame (68010).
+ * 68010 only. This is the 29 word bus/address error frame.
+ */
+void m68ki_stack_frame_1000(uint pc, uint sr, uint vector)
+{
+ /* VERSION
+ * NUMBER
+ * INTERNAL INFORMATION, 16 WORDS
+ */
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+ m68ki_fake_push_32();
+
+ /* INSTRUCTION INPUT BUFFER */
+ m68ki_push_16(0);
+
+ /* UNUSED, RESERVED (not written) */
+ m68ki_fake_push_16();
+
+ /* DATA INPUT BUFFER */
+ m68ki_push_16(0);
+
+ /* UNUSED, RESERVED (not written) */
+ m68ki_fake_push_16();
+
+ /* DATA OUTPUT BUFFER */
+ m68ki_push_16(0);
+
+ /* UNUSED, RESERVED (not written) */
+ m68ki_fake_push_16();
+
+ /* FAULT ADDRESS */
+ m68ki_push_32(0);
+
+ /* SPECIAL STATUS WORD */
+ m68ki_push_16(0);
+
+ /* 1000, VECTOR OFFSET */
+ m68ki_push_16(0x8000 | (vector<<2));
+
+ /* PROGRAM COUNTER */
+ m68ki_push_32(pc);
+
+ /* STATUS REGISTER */
+ m68ki_push_16(sr);
+}
+
+/* Format A stack frame (short bus fault).
+ * This is used only by 68020 for bus fault and address error
+ * if the error happens at an instruction boundary.
+ * PC stacked is address of next instruction.
+ */
+void m68ki_stack_frame_1010(uint sr, uint vector, uint pc)
+{
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* DATA OUTPUT BUFFER (2 words) */
+ m68ki_push_32(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* DATA CYCLE FAULT ADDRESS (2 words) */
+ m68ki_push_32(0);
+
+ /* INSTRUCTION PIPE STAGE B */
+ m68ki_push_16(0);
+
+ /* INSTRUCTION PIPE STAGE C */
+ m68ki_push_16(0);
+
+ /* SPECIAL STATUS REGISTER */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* 1010, VECTOR OFFSET */
+ m68ki_push_16(0xa000 | (vector<<2));
+
+ /* PROGRAM COUNTER */
+ m68ki_push_32(pc);
+
+ /* STATUS REGISTER */
+ m68ki_push_16(sr);
+}
+
+/* Format B stack frame (long bus fault).
+ * This is used only by 68020 for bus fault and address error
+ * if the error happens during instruction execution.
+ * PC stacked is address of instruction in progress.
+ */
+void m68ki_stack_frame_1011(uint sr, uint vector, uint pc)
+{
+ /* INTERNAL REGISTERS (18 words) */
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+
+ /* VERSION# (4 bits), INTERNAL INFORMATION */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTERS (3 words) */
+ m68ki_push_32(0);
+ m68ki_push_16(0);
+
+ /* DATA INTPUT BUFFER (2 words) */
+ m68ki_push_32(0);
+
+ /* INTERNAL REGISTERS (2 words) */
+ m68ki_push_32(0);
+
+ /* STAGE B ADDRESS (2 words) */
+ m68ki_push_32(0);
+
+ /* INTERNAL REGISTER (4 words) */
+ m68ki_push_32(0);
+ m68ki_push_32(0);
+
+ /* DATA OUTPUT BUFFER (2 words) */
+ m68ki_push_32(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* DATA CYCLE FAULT ADDRESS (2 words) */
+ m68ki_push_32(0);
+
+ /* INSTRUCTION PIPE STAGE B */
+ m68ki_push_16(0);
+
+ /* INSTRUCTION PIPE STAGE C */
+ m68ki_push_16(0);
+
+ /* SPECIAL STATUS REGISTER */
+ m68ki_push_16(0);
+
+ /* INTERNAL REGISTER */
+ m68ki_push_16(0);
+
+ /* 1011, VECTOR OFFSET */
+ m68ki_push_16(0xb000 | (vector<<2));
+
+ /* PROGRAM COUNTER */
+ m68ki_push_32(pc);
+
+ /* STATUS REGISTER */
+ m68ki_push_16(sr);
+}
+
+
+/* Used for Group 2 exceptions.
+ * These stack a type 2 frame on the 020.
+ */
+INLINE void m68ki_exception_trap(uint vector)
+{
+ uint sr = m68ki_init_exception();
+
+ if(CPU_TYPE_IS_010_LESS(CPU_TYPE))
+ m68ki_stack_frame_0000(REG_PC, sr, vector);
+ else
+ m68ki_stack_frame_0010(sr, vector);
+
+ m68ki_jump_vector(vector);
+
+ /* Use up some clock cycles */
+ USE_CYCLES(CYC_EXCEPTION[vector]);
+}
+
+/* Trap#n stacks a 0 frame but behaves like group2 otherwise */
+INLINE void m68ki_exception_trapN(uint vector)
+{
+ uint sr = m68ki_init_exception();
+ m68ki_stack_frame_0000(REG_PC, sr, vector);
+ m68ki_jump_vector(vector);
+
+ /* Use up some clock cycles */
+ USE_CYCLES(CYC_EXCEPTION[vector]);
+}
+
+/* Exception for trace mode */
+INLINE void m68ki_exception_trace(void)
+{
+ uint sr = m68ki_init_exception();
+
+ if(CPU_TYPE_IS_010_LESS(CPU_TYPE))
+ {
+ #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ CPU_INSTR_MODE = INSTRUCTION_NO;
+ }
+ #endif /* M68K_EMULATE_ADDRESS_ERROR */
+ m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_TRACE);
+ }
+ else
+ m68ki_stack_frame_0010(sr, EXCEPTION_TRACE);
+
+ m68ki_jump_vector(EXCEPTION_TRACE);
+
+ /* Trace nullifies a STOP instruction */
+ CPU_STOPPED &= ~STOP_LEVEL_STOP;
+
+ /* Use up some clock cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_TRACE]);
+}
+
+/* Exception for privilege violation */
+INLINE void m68ki_exception_privilege_violation(void)
+{
+ uint sr = m68ki_init_exception();
+
+ #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ CPU_INSTR_MODE = INSTRUCTION_NO;
+ }
+ #endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+ m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_PRIVILEGE_VIOLATION);
+ m68ki_jump_vector(EXCEPTION_PRIVILEGE_VIOLATION);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_PRIVILEGE_VIOLATION] - CYC_INSTRUCTION[REG_IR]);
+}
+
+/* Exception for A-Line instructions */
+INLINE void m68ki_exception_1010(void)
+{
+ uint sr;
+#if M68K_LOG_1010_1111 == OPT_ON
+ M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1010 instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,
+ m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));
+#endif
+
+ sr = m68ki_init_exception();
+ m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_1010);
+ m68ki_jump_vector(EXCEPTION_1010);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1010] - CYC_INSTRUCTION[REG_IR]);
+}
+
+/* Exception for F-Line instructions */
+INLINE void m68ki_exception_1111(void)
+{
+ uint sr;
+
+#if M68K_LOG_1010_1111 == OPT_ON
+ M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1111 instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,
+ m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));
+#endif
+
+ sr = m68ki_init_exception();
+ m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_1111);
+ m68ki_jump_vector(EXCEPTION_1111);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1111] - CYC_INSTRUCTION[REG_IR]);
+}
+
+/* Exception for illegal instructions */
+INLINE void m68ki_exception_illegal(void)
+{
+ uint sr;
+
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: illegal instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,
+ m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));
+
+ sr = m68ki_init_exception();
+
+ #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ CPU_INSTR_MODE = INSTRUCTION_NO;
+ }
+ #endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+ m68ki_stack_frame_0000(REG_PPC, sr, EXCEPTION_ILLEGAL_INSTRUCTION);
+ m68ki_jump_vector(EXCEPTION_ILLEGAL_INSTRUCTION);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ILLEGAL_INSTRUCTION] - CYC_INSTRUCTION[REG_IR]);
+}
+
+/* Exception for format errror in RTE */
+INLINE void m68ki_exception_format_error(void)
+{
+ uint sr = m68ki_init_exception();
+ m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_FORMAT_ERROR);
+ m68ki_jump_vector(EXCEPTION_FORMAT_ERROR);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_FORMAT_ERROR] - CYC_INSTRUCTION[REG_IR]);
+}
+
+/* Exception for address error */
+INLINE void m68ki_exception_address_error(void)
+{
+ uint sr = m68ki_init_exception();
+
+ /* If we were processing a bus error, address error, or reset,
+ * this is a catastrophic failure.
+ * Halt the CPU
+ */
+ if(CPU_RUN_MODE == RUN_MODE_BERR_AERR_RESET)
+ {
+m68k_read_memory_8(0x00ffff01);
+ CPU_STOPPED = STOP_LEVEL_HALT;
+ return;
+ }
+ CPU_RUN_MODE = RUN_MODE_BERR_AERR_RESET;
+
+ /* Note: This is implemented for 68000 only! */
+ m68ki_stack_frame_buserr(sr);
+
+ m68ki_jump_vector(EXCEPTION_ADDRESS_ERROR);
+
+ /* Use up some clock cycles and undo the instruction's cycles */
+ USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ADDRESS_ERROR] - CYC_INSTRUCTION[REG_IR]);
+}
+
+
+/* Service an interrupt request and start exception processing */
+void m68ki_exception_interrupt(uint int_level)
+{
+ uint vector;
+ uint sr;
+ uint new_pc;
+
+ #if M68K_EMULATE_ADDRESS_ERROR == OPT_ON
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ CPU_INSTR_MODE = INSTRUCTION_NO;
+ }
+ #endif /* M68K_EMULATE_ADDRESS_ERROR */
+
+ /* Turn off the stopped state */
+ CPU_STOPPED &= ~STOP_LEVEL_STOP;
+
+ /* If we are halted, don't do anything */
+ if(CPU_STOPPED)
+ return;
+
+ /* Acknowledge the interrupt */
+ vector = m68ki_int_ack(int_level);
+
+ /* Get the interrupt vector */
+ if(vector == M68K_INT_ACK_AUTOVECTOR)
+ /* Use the autovectors. This is the most commonly used implementation */
+ vector = EXCEPTION_INTERRUPT_AUTOVECTOR+int_level;
+ else if(vector == M68K_INT_ACK_SPURIOUS)
+ /* Called if no devices respond to the interrupt acknowledge */
+ vector = EXCEPTION_SPURIOUS_INTERRUPT;
+ else if(vector > 255)
+ {
+ M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: Interrupt acknowledge returned invalid vector $%x\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC), vector));
+ return;
+ }
+
+ /* Start exception processing */
+ sr = m68ki_init_exception();
+
+ /* Set the interrupt mask to the level of the one being serviced */
+ FLAG_INT_MASK = int_level<<8;
+
+ /* Get the new PC */
+ new_pc = m68ki_read_data_32((vector<<2) + REG_VBR);
+
+ /* If vector is uninitialized, call the uninitialized interrupt vector */
+ if(new_pc == 0)
+ new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2) + REG_VBR);
+
+ /* Generate a stack frame */
+ m68ki_stack_frame_0000(REG_PC, sr, vector);
+ if(FLAG_M && CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Create throwaway frame */
+ m68ki_set_sm_flag(FLAG_S); /* clear M */
+ sr |= 0x2000; /* Same as SR in master stack frame except S is forced high */
+ m68ki_stack_frame_0001(REG_PC, sr, vector);
+ }
+
+ m68ki_jump(new_pc);
+
+ /* Defer cycle counting until later */
+ CPU_INT_CYCLES += CYC_EXCEPTION[vector];
+
+#if !M68K_EMULATE_INT_ACK
+ /* Automatically clear IRQ if we are not using an acknowledge scheme */
+ CPU_INT_LEVEL = 0;
+#endif /* M68K_EMULATE_INT_ACK */
+}
+
+
+/* ASG: Check for interrupts */
+INLINE void m68ki_check_interrupts(void)
+{
+ if(CPU_INT_LEVEL > FLAG_INT_MASK)
+ m68ki_exception_interrupt(CPU_INT_LEVEL>>8);
+}
+
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68KCPU__HEADER */
diff --git a/plugins/ao/eng_ssf/m68kmake.c b/plugins/ao/eng_ssf/m68kmake.c
new file mode 100644
index 00000000..00e244b9
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kmake.c
@@ -0,0 +1,1421 @@
+/* ======================================================================== */
+/* ========================= LICENSING & COPYRIGHT ======================== */
+/* ======================================================================== */
+/*
+ * MUSASHI
+ * Version 3.3
+ *
+ * A portable Motorola M680x0 processor emulation engine.
+ * Copyright 1998-2001 Karl Stenerud. All rights reserved.
+ *
+ * This code may be freely used for non-commercial purposes as long as this
+ * copyright notice remains unaltered in the source code and any binary files
+ * containing this code in compiled form.
+ *
+ * All other lisencing terms must be negotiated with the author
+ * (Karl Stenerud).
+ *
+ * The latest version of this code can be obtained at:
+ * http://kstenerud.cjb.net
+ */
+
+
+
+/* ======================================================================== */
+/* ============================ CODE GENERATOR ============================ */
+/* ======================================================================== */
+/*
+ * This is the code generator program which will generate the opcode table
+ * and the final opcode handlers.
+ *
+ * It requires an input file to function (default m68k_in.c), but you can
+ * specify your own like so:
+ *
+ * m68kmake <output path> <input file>
+ *
+ * where output path is the path where the output files should be placed, and
+ * input file is the file to use for input.
+ *
+ * If you modify the input file greatly from its released form, you may have
+ * to tweak the configuration section a bit since I'm using static allocation
+ * to keep things simple.
+ *
+ *
+ * TODO: - build a better code generator for the move instruction.
+ * - Add callm and rtm instructions
+ * - Fix RTE to handle other format words
+ * - Add address error (and bus error?) handling
+ */
+
+
+char* g_version = "3.3";
+
+/* ======================================================================== */
+/* =============================== INCLUDES =============================== */
+/* ======================================================================== */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+
+
+/* ======================================================================== */
+/* ============================= CONFIGURATION ============================ */
+/* ======================================================================== */
+
+#define M68K_MAX_PATH 1024
+#define M68K_MAX_DIR 1024
+
+#define NUM_CPUS 3 /* 000, 010, 020 */
+#define MAX_LINE_LENGTH 200 /* length of 1 line */
+#define MAX_BODY_LENGTH 300 /* Number of lines in 1 function */
+#define MAX_REPLACE_LENGTH 30 /* Max number of replace strings */
+#define MAX_INSERT_LENGTH 5000 /* Max size of insert piece */
+#define MAX_NAME_LENGTH 30 /* Max length of ophandler name */
+#define MAX_SPEC_PROC_LENGTH 4 /* Max length of special processing str */
+#define MAX_SPEC_EA_LENGTH 5 /* Max length of specified EA str */
+#define EA_ALLOWED_LENGTH 11 /* Max length of ea allowed str */
+#define MAX_OPCODE_INPUT_TABLE_LENGTH 1000 /* Max length of opcode handler tbl */
+#define MAX_OPCODE_OUTPUT_TABLE_LENGTH 3000 /* Max length of opcode handler tbl */
+
+/* Default filenames */
+#define FILENAME_INPUT "m68k_in.c"
+#define FILENAME_PROTOTYPE "m68kops.h"
+#define FILENAME_TABLE "m68kops.c"
+#define FILENAME_OPS_AC "m68kopac.c"
+#define FILENAME_OPS_DM "m68kopdm.c"
+#define FILENAME_OPS_NZ "m68kopnz.c"
+
+
+/* Identifier sequences recognized by this program */
+
+#define ID_INPUT_SEPARATOR "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
+
+#define ID_BASE "M68KMAKE"
+#define ID_PROTOTYPE_HEADER ID_BASE "_PROTOTYPE_HEADER"
+#define ID_PROTOTYPE_FOOTER ID_BASE "_PROTOTYPE_FOOTER"
+#define ID_TABLE_HEADER ID_BASE "_TABLE_HEADER"
+#define ID_TABLE_FOOTER ID_BASE "_TABLE_FOOTER"
+#define ID_TABLE_BODY ID_BASE "_TABLE_BODY"
+#define ID_TABLE_START ID_BASE "_TABLE_START"
+#define ID_OPHANDLER_HEADER ID_BASE "_OPCODE_HANDLER_HEADER"
+#define ID_OPHANDLER_FOOTER ID_BASE "_OPCODE_HANDLER_FOOTER"
+#define ID_OPHANDLER_BODY ID_BASE "_OPCODE_HANDLER_BODY"
+#define ID_END ID_BASE "_END"
+
+#define ID_OPHANDLER_NAME ID_BASE "_OP"
+#define ID_OPHANDLER_EA_AY_8 ID_BASE "_GET_EA_AY_8"
+#define ID_OPHANDLER_EA_AY_16 ID_BASE "_GET_EA_AY_16"
+#define ID_OPHANDLER_EA_AY_32 ID_BASE "_GET_EA_AY_32"
+#define ID_OPHANDLER_OPER_AY_8 ID_BASE "_GET_OPER_AY_8"
+#define ID_OPHANDLER_OPER_AY_16 ID_BASE "_GET_OPER_AY_16"
+#define ID_OPHANDLER_OPER_AY_32 ID_BASE "_GET_OPER_AY_32"
+#define ID_OPHANDLER_CC ID_BASE "_CC"
+#define ID_OPHANDLER_NOT_CC ID_BASE "_NOT_CC"
+
+
+#ifndef DECL_SPEC
+#define DECL_SPEC
+#endif /* DECL_SPEC */
+
+
+
+/* ======================================================================== */
+/* ============================== PROTOTYPES ============================== */
+/* ======================================================================== */
+
+#define CPU_TYPE_000 0
+#define CPU_TYPE_010 1
+#define CPU_TYPE_020 2
+
+#define UNSPECIFIED "."
+#define UNSPECIFIED_CH '.'
+
+#define HAS_NO_EA_MODE(A) (strcmp(A, "..........") == 0)
+#define HAS_EA_AI(A) ((A)[0] == 'A')
+#define HAS_EA_PI(A) ((A)[1] == '+')
+#define HAS_EA_PD(A) ((A)[2] == '-')
+#define HAS_EA_DI(A) ((A)[3] == 'D')
+#define HAS_EA_IX(A) ((A)[4] == 'X')
+#define HAS_EA_AW(A) ((A)[5] == 'W')
+#define HAS_EA_AL(A) ((A)[6] == 'L')
+#define HAS_EA_PCDI(A) ((A)[7] == 'd')
+#define HAS_EA_PCIX(A) ((A)[8] == 'x')
+#define HAS_EA_I(A) ((A)[9] == 'I')
+
+enum
+{
+ EA_MODE_NONE, /* No special addressing mode */
+ EA_MODE_AI, /* Address register indirect */
+ EA_MODE_PI, /* Address register indirect with postincrement */
+ EA_MODE_PI7, /* Address register 7 indirect with postincrement */
+ EA_MODE_PD, /* Address register indirect with predecrement */
+ EA_MODE_PD7, /* Address register 7 indirect with predecrement */
+ EA_MODE_DI, /* Address register indirect with displacement */
+ EA_MODE_IX, /* Address register indirect with index */
+ EA_MODE_AW, /* Absolute word */
+ EA_MODE_AL, /* Absolute long */
+ EA_MODE_PCDI, /* Program counter indirect with displacement */
+ EA_MODE_PCIX, /* Program counter indirect with index */
+ EA_MODE_I /* Immediate */
+};
+
+
+/* Everything we need to know about an opcode */
+typedef struct
+{
+ char name[MAX_NAME_LENGTH]; /* opcode handler name */
+ unsigned char size; /* Size of operation */
+ char spec_proc[MAX_SPEC_PROC_LENGTH]; /* Special processing mode */
+ char spec_ea[MAX_SPEC_EA_LENGTH]; /* Specified effective addressing mode */
+ unsigned char bits; /* Number of significant bits (used for sorting the table) */
+ unsigned short op_mask; /* Mask to apply for matching an opcode to a handler */
+ unsigned short op_match; /* Value to match after masking */
+ char ea_allowed[EA_ALLOWED_LENGTH]; /* Effective addressing modes allowed */
+ char cpu_mode[NUM_CPUS]; /* User or supervisor mode */
+ char cpus[NUM_CPUS+1]; /* Allowed CPUs */
+ unsigned char cycles[NUM_CPUS]; /* cycles for 000, 010, 020 */
+} opcode_struct;
+
+
+/* All modifications necessary for a specific EA mode of an instruction */
+typedef struct
+{
+ char* fname_add;
+ char* ea_add;
+ unsigned int mask_add;
+ unsigned int match_add;
+} ea_info_struct;
+
+
+/* Holds the body of a function */
+typedef struct
+{
+ char body[MAX_BODY_LENGTH][MAX_LINE_LENGTH+1];
+ int length;
+} body_struct;
+
+
+/* Holds a sequence of search / replace strings */
+typedef struct
+{
+ char replace[MAX_REPLACE_LENGTH][2][MAX_LINE_LENGTH+1];
+ int length;
+} replace_struct;
+
+
+/* Function Prototypes */
+void error_exit(char* fmt, ...);
+void perror_exit(char* fmt, ...);
+int check_strsncpy(char* dst, char* src, int maxlength);
+int check_atoi(char* str, int *result);
+int skip_spaces(char* str);
+int num_bits(int value);
+int atoh(char* buff);
+int fgetline(char* buff, int nchars, FILE* file);
+int get_oper_cycles(opcode_struct* op, int ea_mode, int cpu_type);
+opcode_struct* find_opcode(char* name, int size, char* spec_proc, char* spec_ea);
+opcode_struct* find_illegal_opcode(void);
+int extract_opcode_info(char* src, char* name, int* size, char* spec_proc, char* spec_ea);
+void add_replace_string(replace_struct* replace, char* search_str, char* replace_str);
+void write_body(FILE* filep, body_struct* body, replace_struct* replace);
+void get_base_name(char* base_name, opcode_struct* op);
+void write_prototype(FILE* filep, char* base_name);
+void write_function_name(FILE* filep, char* base_name);
+void add_opcode_output_table_entry(opcode_struct* op, char* name);
+static int DECL_SPEC compare_nof_true_bits(const void* aptr, const void* bptr);
+void print_opcode_output_table(FILE* filep);
+void write_table_entry(FILE* filep, opcode_struct* op);
+void set_opcode_struct(opcode_struct* src, opcode_struct* dst, int ea_mode);
+void generate_opcode_handler(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* opinfo, int ea_mode);
+void generate_opcode_ea_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op);
+void generate_opcode_cc_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op_in, int offset);
+void process_opcode_handlers(void);
+void populate_table(void);
+void read_insert(char* insert);
+
+
+
+/* ======================================================================== */
+/* ================================= DATA ================================= */
+/* ======================================================================== */
+
+/* Name of the input file */
+char g_input_filename[M68K_MAX_PATH] = FILENAME_INPUT;
+
+/* File handles */
+FILE* g_input_file = NULL;
+FILE* g_prototype_file = NULL;
+FILE* g_table_file = NULL;
+FILE* g_ops_ac_file = NULL;
+FILE* g_ops_dm_file = NULL;
+FILE* g_ops_nz_file = NULL;
+
+int g_num_functions = 0; /* Number of functions processed */
+int g_num_primitives = 0; /* Number of function primitives read */
+int g_line_number = 1; /* Current line number */
+
+/* Opcode handler table */
+opcode_struct g_opcode_input_table[MAX_OPCODE_INPUT_TABLE_LENGTH];
+
+opcode_struct g_opcode_output_table[MAX_OPCODE_OUTPUT_TABLE_LENGTH];
+int g_opcode_output_table_length = 0;
+
+ea_info_struct g_ea_info_table[13] =
+{/* fname ea mask match */
+ {"", "", 0x00, 0x00}, /* EA_MODE_NONE */
+ {"ai", "AY_AI", 0x38, 0x10}, /* EA_MODE_AI */
+ {"pi", "AY_PI", 0x38, 0x18}, /* EA_MODE_PI */
+ {"pi7", "A7_PI", 0x3f, 0x1f}, /* EA_MODE_PI7 */
+ {"pd", "AY_PD", 0x38, 0x20}, /* EA_MODE_PD */
+ {"pd7", "A7_PD", 0x3f, 0x27}, /* EA_MODE_PD7 */
+ {"di", "AY_DI", 0x38, 0x28}, /* EA_MODE_DI */
+ {"ix", "AY_IX", 0x38, 0x30}, /* EA_MODE_IX */
+ {"aw", "AW", 0x3f, 0x38}, /* EA_MODE_AW */
+ {"al", "AL", 0x3f, 0x39}, /* EA_MODE_AL */
+ {"pcdi", "PCDI", 0x3f, 0x3a}, /* EA_MODE_PCDI */
+ {"pcix", "PCIX", 0x3f, 0x3b}, /* EA_MODE_PCIX */
+ {"i", "I", 0x3f, 0x3c}, /* EA_MODE_I */
+};
+
+
+char* g_cc_table[16][2] =
+{
+ { "t", "T"}, /* 0000 */
+ { "f", "F"}, /* 0001 */
+ {"hi", "HI"}, /* 0010 */
+ {"ls", "LS"}, /* 0011 */
+ {"cc", "CC"}, /* 0100 */
+ {"cs", "CS"}, /* 0101 */
+ {"ne", "NE"}, /* 0110 */
+ {"eq", "EQ"}, /* 0111 */
+ {"vc", "VC"}, /* 1000 */
+ {"vs", "VS"}, /* 1001 */
+ {"pl", "PL"}, /* 1010 */
+ {"mi", "MI"}, /* 1011 */
+ {"ge", "GE"}, /* 1100 */
+ {"lt", "LT"}, /* 1101 */
+ {"gt", "GT"}, /* 1110 */
+ {"le", "LE"}, /* 1111 */
+};
+
+/* size to index translator (0 -> 0, 8 and 16 -> 1, 32 -> 2) */
+int g_size_select_table[33] =
+{
+ 0, /* unsized */
+ 0, 0, 0, 0, 0, 0, 0, 1, /* 8 */
+ 0, 0, 0, 0, 0, 0, 0, 1, /* 16 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2 /* 32 */
+};
+
+/* Extra cycles required for certain EA modes */
+int g_ea_cycle_table[13][NUM_CPUS][3] =
+{/* 000 010 020 */
+ {{ 0, 0, 0}, { 0, 0, 0}, { 0, 0, 0}}, /* EA_MODE_NONE */
+ {{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}}, /* EA_MODE_AI */
+ {{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}}, /* EA_MODE_PI */
+ {{ 0, 4, 8}, { 0, 4, 8}, { 0, 4, 4}}, /* EA_MODE_PI7 */
+ {{ 0, 6, 10}, { 0, 6, 10}, { 0, 5, 5}}, /* EA_MODE_PD */
+ {{ 0, 6, 10}, { 0, 6, 10}, { 0, 5, 5}}, /* EA_MODE_PD7 */
+ {{ 0, 8, 12}, { 0, 8, 12}, { 0, 5, 5}}, /* EA_MODE_DI */
+ {{ 0, 10, 14}, { 0, 10, 14}, { 0, 7, 7}}, /* EA_MODE_IX */
+ {{ 0, 8, 12}, { 0, 8, 12}, { 0, 4, 4}}, /* EA_MODE_AW */
+ {{ 0, 12, 16}, { 0, 12, 16}, { 0, 4, 4}}, /* EA_MODE_AL */
+ {{ 0, 8, 12}, { 0, 8, 12}, { 0, 5, 5}}, /* EA_MODE_PCDI */
+ {{ 0, 10, 14}, { 0, 10, 14}, { 0, 7, 7}}, /* EA_MODE_PCIX */
+ {{ 0, 4, 8}, { 0, 4, 8}, { 0, 2, 4}}, /* EA_MODE_I */
+};
+
+/* Extra cycles for JMP instruction (000, 010) */
+int g_jmp_cycle_table[13] =
+{
+ 0, /* EA_MODE_NONE */
+ 4, /* EA_MODE_AI */
+ 0, /* EA_MODE_PI */
+ 0, /* EA_MODE_PI7 */
+ 0, /* EA_MODE_PD */
+ 0, /* EA_MODE_PD7 */
+ 6, /* EA_MODE_DI */
+ 8, /* EA_MODE_IX */
+ 6, /* EA_MODE_AW */
+ 8, /* EA_MODE_AL */
+ 6, /* EA_MODE_PCDI */
+ 10, /* EA_MODE_PCIX */
+ 0, /* EA_MODE_I */
+};
+
+/* Extra cycles for JSR instruction (000, 010) */
+int g_jsr_cycle_table[13] =
+{
+ 0, /* EA_MODE_NONE */
+ 4, /* EA_MODE_AI */
+ 0, /* EA_MODE_PI */
+ 0, /* EA_MODE_PI7 */
+ 0, /* EA_MODE_PD */
+ 0, /* EA_MODE_PD7 */
+ 6, /* EA_MODE_DI */
+ 10, /* EA_MODE_IX */
+ 6, /* EA_MODE_AW */
+ 8, /* EA_MODE_AL */
+ 6, /* EA_MODE_PCDI */
+ 10, /* EA_MODE_PCIX */
+ 0, /* EA_MODE_I */
+};
+
+/* Extra cycles for LEA instruction (000, 010) */
+int g_lea_cycle_table[13] =
+{
+ 0, /* EA_MODE_NONE */
+ 4, /* EA_MODE_AI */
+ 0, /* EA_MODE_PI */
+ 0, /* EA_MODE_PI7 */
+ 0, /* EA_MODE_PD */
+ 0, /* EA_MODE_PD7 */
+ 8, /* EA_MODE_DI */
+ 12, /* EA_MODE_IX */
+ 8, /* EA_MODE_AW */
+ 12, /* EA_MODE_AL */
+ 8, /* EA_MODE_PCDI */
+ 12, /* EA_MODE_PCIX */
+ 0, /* EA_MODE_I */
+};
+
+/* Extra cycles for PEA instruction (000, 010) */
+int g_pea_cycle_table[13] =
+{
+ 0, /* EA_MODE_NONE */
+ 4, /* EA_MODE_AI */
+ 0, /* EA_MODE_PI */
+ 0, /* EA_MODE_PI7 */
+ 0, /* EA_MODE_PD */
+ 0, /* EA_MODE_PD7 */
+ 10, /* EA_MODE_DI */
+ 14, /* EA_MODE_IX */
+ 10, /* EA_MODE_AW */
+ 14, /* EA_MODE_AL */
+ 10, /* EA_MODE_PCDI */
+ 14, /* EA_MODE_PCIX */
+ 0, /* EA_MODE_I */
+};
+
+/* Extra cycles for MOVES instruction (010) */
+int g_moves_cycle_table[13][3] =
+{
+ { 0, 0, 0}, /* EA_MODE_NONE */
+ { 0, 4, 6}, /* EA_MODE_AI */
+ { 0, 4, 6}, /* EA_MODE_PI */
+ { 0, 4, 6}, /* EA_MODE_PI7 */
+ { 0, 6, 12}, /* EA_MODE_PD */
+ { 0, 6, 12}, /* EA_MODE_PD7 */
+ { 0, 12, 16}, /* EA_MODE_DI */
+ { 0, 16, 20}, /* EA_MODE_IX */
+ { 0, 12, 16}, /* EA_MODE_AW */
+ { 0, 16, 20}, /* EA_MODE_AL */
+ { 0, 0, 0}, /* EA_MODE_PCDI */
+ { 0, 0, 0}, /* EA_MODE_PCIX */
+ { 0, 0, 0}, /* EA_MODE_I */
+};
+
+/* Extra cycles for CLR instruction (010) */
+int g_clr_cycle_table[13][3] =
+{
+ { 0, 0, 0}, /* EA_MODE_NONE */
+ { 0, 4, 6}, /* EA_MODE_AI */
+ { 0, 4, 6}, /* EA_MODE_PI */
+ { 0, 4, 6}, /* EA_MODE_PI7 */
+ { 0, 6, 8}, /* EA_MODE_PD */
+ { 0, 6, 8}, /* EA_MODE_PD7 */
+ { 0, 8, 10}, /* EA_MODE_DI */
+ { 0, 10, 14}, /* EA_MODE_IX */
+ { 0, 8, 10}, /* EA_MODE_AW */
+ { 0, 10, 14}, /* EA_MODE_AL */
+ { 0, 0, 0}, /* EA_MODE_PCDI */
+ { 0, 0, 0}, /* EA_MODE_PCIX */
+ { 0, 0, 0}, /* EA_MODE_I */
+};
+
+
+
+/* ======================================================================== */
+/* =========================== UTILITY FUNCTIONS ========================== */
+/* ======================================================================== */
+
+/* Print an error message and exit with status error */
+void error_exit(char* fmt, ...)
+{
+ va_list args;
+ fprintf(stderr, "In %s, near or on line %d:\n\t", g_input_filename, g_line_number);
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+ fprintf(stderr, "\n");
+
+ if(g_prototype_file) fclose(g_prototype_file);
+ if(g_table_file) fclose(g_table_file);
+ if(g_ops_ac_file) fclose(g_ops_ac_file);
+ if(g_ops_dm_file) fclose(g_ops_dm_file);
+ if(g_ops_nz_file) fclose(g_ops_nz_file);
+ if(g_input_file) fclose(g_input_file);
+
+ exit(EXIT_FAILURE);
+}
+
+/* Print an error message, call perror(), and exit with status error */
+void perror_exit(char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+ perror("");
+
+ if(g_prototype_file) fclose(g_prototype_file);
+ if(g_table_file) fclose(g_table_file);
+ if(g_ops_ac_file) fclose(g_ops_ac_file);
+ if(g_ops_dm_file) fclose(g_ops_dm_file);
+ if(g_ops_nz_file) fclose(g_ops_nz_file);
+ if(g_input_file) fclose(g_input_file);
+
+ exit(EXIT_FAILURE);
+}
+
+
+/* copy until 0 or space and exit with error if we read too far */
+int check_strsncpy(char* dst, char* src, int maxlength)
+{
+ char* p = dst;
+ while(*src && *src != ' ')
+ {
+ *p++ = *src++;
+ if(p - dst > maxlength)
+ error_exit("Field too long");
+ }
+ *p = 0;
+ return p - dst;
+}
+
+/* copy until 0 or specified character and exit with error if we read too far */
+int check_strcncpy(char* dst, char* src, char delim, int maxlength)
+{
+ char* p = dst;
+ while(*src && *src != delim)
+ {
+ *p++ = *src++;
+ if(p - dst > maxlength)
+ error_exit("Field too long");
+ }
+ *p = 0;
+ return p - dst;
+}
+
+/* convert ascii to integer and exit with error if we find invalid data */
+int check_atoi(char* str, int *result)
+{
+ int accum = 0;
+ char* p = str;
+ while(*p >= '0' && *p <= '9')
+ {
+ accum *= 10;
+ accum += *p++ - '0';
+ }
+ if(*p != ' ' && *p != 0)
+ error_exit("Malformed integer value (%c)", *p);
+ *result = accum;
+ return p - str;
+}
+
+/* Skip past spaces in a string */
+int skip_spaces(char* str)
+{
+ char* p = str;
+
+ while(*p == ' ')
+ p++;
+
+ return p - str;
+}
+
+/* Count the number of set bits in a value */
+int num_bits(int value)
+{
+ value = ((value & 0xaaaa) >> 1) + (value & 0x5555);
+ value = ((value & 0xcccc) >> 2) + (value & 0x3333);
+ value = ((value & 0xf0f0) >> 4) + (value & 0x0f0f);
+ value = ((value & 0xff00) >> 8) + (value & 0x00ff);
+ return value;
+}
+
+/* Convert a hex value written in ASCII */
+int atoh(char* buff)
+{
+ int accum = 0;
+
+ for(;;buff++)
+ {
+ if(*buff >= '0' && *buff <= '9')
+ {
+ accum <<= 4;
+ accum += *buff - '0';
+ }
+ else if(*buff >= 'a' && *buff <= 'f')
+ {
+ accum <<= 4;
+ accum += *buff - 'a' + 10;
+ }
+ else break;
+ }
+ return accum;
+}
+
+/* Get a line of text from a file, discarding any end-of-line characters */
+int fgetline(char* buff, int nchars, FILE* file)
+{
+ int length;
+
+ if(fgets(buff, nchars, file) == NULL)
+ return -1;
+ if(buff[0] == '\r')
+ memcpy(buff, buff + 1, nchars - 1);
+
+ length = strlen(buff);
+ while(length && (buff[length-1] == '\r' || buff[length-1] == '\n'))
+ length--;
+ buff[length] = 0;
+ g_line_number++;
+
+ return length;
+}
+
+
+
+/* ======================================================================== */
+/* =========================== HELPER FUNCTIONS =========================== */
+/* ======================================================================== */
+
+/* Calculate the number of cycles an opcode requires */
+int get_oper_cycles(opcode_struct* op, int ea_mode, int cpu_type)
+{
+ int size = g_size_select_table[op->size];
+
+ if(op->cpus[cpu_type] == '.')
+ return 0;
+
+ if(cpu_type < CPU_TYPE_020)
+ {
+ if(cpu_type == CPU_TYPE_010)
+ {
+ if(strcmp(op->name, "moves") == 0)
+ return op->cycles[cpu_type] + g_moves_cycle_table[ea_mode][size];
+ if(strcmp(op->name, "clr") == 0)
+ return op->cycles[cpu_type] + g_clr_cycle_table[ea_mode][size];
+ }
+
+ /* ASG: added these cases -- immediate modes take 2 extra cycles here */
+ if(cpu_type == CPU_TYPE_000 && ea_mode == EA_MODE_I &&
+ ((strcmp(op->name, "add") == 0 && strcmp(op->spec_proc, "er") == 0) ||
+ strcmp(op->name, "adda") == 0 ||
+ (strcmp(op->name, "and") == 0 && strcmp(op->spec_proc, "er") == 0) ||
+ (strcmp(op->name, "or") == 0 && strcmp(op->spec_proc, "er") == 0) ||
+ (strcmp(op->name, "sub") == 0 && strcmp(op->spec_proc, "er") == 0) ||
+ strcmp(op->name, "suba") == 0))
+ return op->cycles[cpu_type] + g_ea_cycle_table[ea_mode][cpu_type][size] + 2;
+
+ if(strcmp(op->name, "jmp") == 0)
+ return op->cycles[cpu_type] + g_jmp_cycle_table[ea_mode];
+ if(strcmp(op->name, "jsr") == 0)
+ return op->cycles[cpu_type] + g_jsr_cycle_table[ea_mode];
+ if(strcmp(op->name, "lea") == 0)
+ return op->cycles[cpu_type] + g_lea_cycle_table[ea_mode];
+ if(strcmp(op->name, "pea") == 0)
+ return op->cycles[cpu_type] + g_pea_cycle_table[ea_mode];
+ }
+ return op->cycles[cpu_type] + g_ea_cycle_table[ea_mode][cpu_type][size];
+}
+
+/* Find an opcode in the opcode handler list */
+opcode_struct* find_opcode(char* name, int size, char* spec_proc, char* spec_ea)
+{
+ opcode_struct* op;
+
+
+ for(op = g_opcode_input_table;op->name != NULL;op++)
+ {
+ if( strcmp(name, op->name) == 0 &&
+ (size == op->size) &&
+ strcmp(spec_proc, op->spec_proc) == 0 &&
+ strcmp(spec_ea, op->spec_ea) == 0)
+ return op;
+ }
+ return NULL;
+}
+
+/* Specifically find the illegal opcode in the list */
+opcode_struct* find_illegal_opcode(void)
+{
+ opcode_struct* op;
+
+ for(op = g_opcode_input_table;op->name != NULL;op++)
+ {
+ if(strcmp(op->name, "illegal") == 0)
+ return op;
+ }
+ return NULL;
+}
+
+/* Parse an opcode handler name */
+int extract_opcode_info(char* src, char* name, int* size, char* spec_proc, char* spec_ea)
+{
+ char* ptr = strstr(src, ID_OPHANDLER_NAME);
+
+ if(ptr == NULL)
+ return 0;
+
+ ptr += strlen(ID_OPHANDLER_NAME) + 1;
+
+ ptr += check_strcncpy(name, ptr, ',', MAX_NAME_LENGTH);
+ if(*ptr != ',') return 0;
+ ptr++;
+ ptr += skip_spaces(ptr);
+
+ *size = atoi(ptr);
+ ptr = strstr(ptr, ",");
+ if(ptr == NULL) return 0;
+ ptr++;
+ ptr += skip_spaces(ptr);
+
+ ptr += check_strcncpy(spec_proc, ptr, ',', MAX_SPEC_PROC_LENGTH);
+ if(*ptr != ',') return 0;
+ ptr++;
+ ptr += skip_spaces(ptr);
+
+ ptr += check_strcncpy(spec_ea, ptr, ')', MAX_SPEC_EA_LENGTH);
+ if(*ptr != ')') return 0;
+ ptr++;
+ ptr += skip_spaces(ptr);
+
+ return 1;
+}
+
+
+/* Add a search/replace pair to a replace structure */
+void add_replace_string(replace_struct* replace, char* search_str, char* replace_str)
+{
+ if(replace->length >= MAX_REPLACE_LENGTH)
+ error_exit("overflow in replace structure");
+
+ strcpy(replace->replace[replace->length][0], search_str);
+ strcpy(replace->replace[replace->length++][1], replace_str);
+}
+
+/* Write a function body while replacing any selected strings */
+void write_body(FILE* filep, body_struct* body, replace_struct* replace)
+{
+ int i;
+ int j;
+ char* ptr;
+ char output[MAX_LINE_LENGTH+1];
+ char temp_buff[MAX_LINE_LENGTH+1];
+ int found;
+
+ for(i=0;i<body->length;i++)
+ {
+ strcpy(output, body->body[i]);
+ /* Check for the base directive header */
+ if(strstr(output, ID_BASE) != NULL)
+ {
+ /* Search for any text we need to replace */
+ found = 0;
+ for(j=0;j<replace->length;j++)
+ {
+ ptr = strstr(output, replace->replace[j][0]);
+ if(ptr)
+ {
+ /* We found something to replace */
+ found = 1;
+ strcpy(temp_buff, ptr+strlen(replace->replace[j][0]));
+ strcpy(ptr, replace->replace[j][1]);
+ strcat(ptr, temp_buff);
+ }
+ }
+ /* Found a directive with no matching replace string */
+ if(!found)
+ error_exit("Unknown " ID_BASE " directive");
+ }
+ fprintf(filep, "%s\n", output);
+ }
+ fprintf(filep, "\n\n");
+}
+
+/* Generate a base function name from an opcode struct */
+void get_base_name(char* base_name, opcode_struct* op)
+{
+ sprintf(base_name, "m68k_op_%s", op->name);
+ if(op->size > 0)
+ sprintf(base_name+strlen(base_name), "_%d", op->size);
+ if(strcmp(op->spec_proc, UNSPECIFIED) != 0)
+ sprintf(base_name+strlen(base_name), "_%s", op->spec_proc);
+ if(strcmp(op->spec_ea, UNSPECIFIED) != 0)
+ sprintf(base_name+strlen(base_name), "_%s", op->spec_ea);
+}
+
+/* Write the prototype of an opcode handler function */
+void write_prototype(FILE* filep, char* base_name)
+{
+ fprintf(filep, "void %s(void);\n", base_name);
+}
+
+/* Write the name of an opcode handler function */
+void write_function_name(FILE* filep, char* base_name)
+{
+ fprintf(filep, "void %s(void)\n", base_name);
+}
+
+void add_opcode_output_table_entry(opcode_struct* op, char* name)
+{
+ opcode_struct* ptr;
+ if(g_opcode_output_table_length > MAX_OPCODE_OUTPUT_TABLE_LENGTH)
+ error_exit("Opcode output table overflow");
+
+ ptr = g_opcode_output_table + g_opcode_output_table_length++;
+
+ *ptr = *op;
+ strcpy(ptr->name, name);
+ ptr->bits = num_bits(ptr->op_mask);
+}
+
+/*
+ * Comparison function for qsort()
+ * For entries with an equal number of set bits in
+ * the mask compare the match values
+ */
+static int DECL_SPEC compare_nof_true_bits(const void* aptr, const void* bptr)
+{
+ const opcode_struct *a = aptr, *b = bptr;
+ if(a->bits != b->bits)
+ return a->bits - b->bits;
+ if(a->op_mask != b->op_mask)
+ return a->op_mask - b->op_mask;
+ return a->op_match - b->op_match;
+}
+
+void print_opcode_output_table(FILE* filep)
+{
+ int i;
+ qsort((void *)g_opcode_output_table, g_opcode_output_table_length, sizeof(g_opcode_output_table[0]), compare_nof_true_bits);
+
+ for(i=0;i<g_opcode_output_table_length;i++)
+ write_table_entry(filep, g_opcode_output_table+i);
+}
+
+/* Write an entry in the opcode handler table */
+void write_table_entry(FILE* filep, opcode_struct* op)
+{
+ int i;
+
+ fprintf(filep, "\t{%-28s, 0x%04x, 0x%04x, {",
+ op->name, op->op_mask, op->op_match);
+
+ for(i=0;i<NUM_CPUS;i++)
+ {
+ fprintf(filep, "%3d", op->cycles[i]);
+ if(i < NUM_CPUS-1)
+ fprintf(filep, ", ");
+ }
+
+ fprintf(filep, "}},\n");
+}
+
+/* Fill out an opcode struct with a specific addressing mode of the source opcode struct */
+void set_opcode_struct(opcode_struct* src, opcode_struct* dst, int ea_mode)
+{
+ int i;
+
+ *dst = *src;
+
+ for(i=0;i<NUM_CPUS;i++)
+ dst->cycles[i] = get_oper_cycles(dst, ea_mode, i);
+ if(strcmp(dst->spec_ea, UNSPECIFIED) == 0 && ea_mode != EA_MODE_NONE)
+ sprintf(dst->spec_ea, "%s", g_ea_info_table[ea_mode].fname_add);
+ dst->op_mask |= g_ea_info_table[ea_mode].mask_add;
+ dst->op_match |= g_ea_info_table[ea_mode].match_add;
+}
+
+
+/* Generate a final opcode handler from the provided data */
+void generate_opcode_handler(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* opinfo, int ea_mode)
+{
+ char str[MAX_LINE_LENGTH+1];
+ opcode_struct* op = malloc(sizeof(opcode_struct));
+
+ /* Set the opcode structure and write the tables, prototypes, etc */
+ set_opcode_struct(opinfo, op, ea_mode);
+ get_base_name(str, op);
+ write_prototype(g_prototype_file, str);
+ add_opcode_output_table_entry(op, str);
+ write_function_name(filep, str);
+
+ /* Add any replace strings needed */
+ if(ea_mode != EA_MODE_NONE)
+ {
+ sprintf(str, "EA_%s_8()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_EA_AY_8, str);
+ sprintf(str, "EA_%s_16()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_EA_AY_16, str);
+ sprintf(str, "EA_%s_32()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_EA_AY_32, str);
+ sprintf(str, "OPER_%s_8()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_OPER_AY_8, str);
+ sprintf(str, "OPER_%s_16()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_OPER_AY_16, str);
+ sprintf(str, "OPER_%s_32()", g_ea_info_table[ea_mode].ea_add);
+ add_replace_string(replace, ID_OPHANDLER_OPER_AY_32, str);
+ }
+
+ /* Now write the function body with the selected replace strings */
+ write_body(filep, body, replace);
+ g_num_functions++;
+ free(op);
+}
+
+/* Generate opcode variants based on available addressing modes */
+void generate_opcode_ea_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op)
+{
+ int old_length = replace->length;
+
+ /* No ea modes available for this opcode */
+ if(HAS_NO_EA_MODE(op->ea_allowed))
+ {
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_NONE);
+ return;
+ }
+
+ /* Check for and create specific opcodes for each available addressing mode */
+ if(HAS_EA_AI(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_AI);
+ replace->length = old_length;
+ if(HAS_EA_PI(op->ea_allowed))
+ {
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PI);
+ replace->length = old_length;
+ if(op->size == 8)
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PI7);
+ }
+ replace->length = old_length;
+ if(HAS_EA_PD(op->ea_allowed))
+ {
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PD);
+ replace->length = old_length;
+ if(op->size == 8)
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PD7);
+ }
+ replace->length = old_length;
+ if(HAS_EA_DI(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_DI);
+ replace->length = old_length;
+ if(HAS_EA_IX(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_IX);
+ replace->length = old_length;
+ if(HAS_EA_AW(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_AW);
+ replace->length = old_length;
+ if(HAS_EA_AL(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_AL);
+ replace->length = old_length;
+ if(HAS_EA_PCDI(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PCDI);
+ replace->length = old_length;
+ if(HAS_EA_PCIX(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_PCIX);
+ replace->length = old_length;
+ if(HAS_EA_I(op->ea_allowed))
+ generate_opcode_handler(filep, body, replace, op, EA_MODE_I);
+ replace->length = old_length;
+}
+
+/* Generate variants of condition code opcodes */
+void generate_opcode_cc_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op_in, int offset)
+{
+ char repl[20];
+ char replnot[20];
+ int i;
+ int old_length = replace->length;
+ opcode_struct* op = malloc(sizeof(opcode_struct));
+
+ *op = *op_in;
+
+ op->op_mask |= 0x0f00;
+
+ /* Do all condition codes except t and f */
+ for(i=2;i<16;i++)
+ {
+ /* Add replace strings for this condition code */
+ sprintf(repl, "COND_%s()", g_cc_table[i][1]);
+ sprintf(replnot, "COND_NOT_%s()", g_cc_table[i][1]);
+
+ add_replace_string(replace, ID_OPHANDLER_CC, repl);
+ add_replace_string(replace, ID_OPHANDLER_NOT_CC, replnot);
+
+ /* Set the new opcode info */
+ strcpy(op->name+offset, g_cc_table[i][0]);
+
+ op->op_match = (op->op_match & 0xf0ff) | (i<<8);
+
+ /* Generate all opcode variants for this modified opcode */
+ generate_opcode_ea_variants(filep, body, replace, op);
+ /* Remove the above replace strings */
+ replace->length = old_length;
+ }
+ free(op);
+}
+
+/* Process the opcode handlers section of the input file */
+void process_opcode_handlers(void)
+{
+ FILE* input_file = g_input_file;
+ FILE* output_file;
+ char func_name[MAX_LINE_LENGTH+1];
+ char oper_name[MAX_LINE_LENGTH+1];
+ int oper_size;
+ char oper_spec_proc[MAX_LINE_LENGTH+1];
+ char oper_spec_ea[MAX_LINE_LENGTH+1];
+ opcode_struct* opinfo;
+ replace_struct* replace = malloc(sizeof(replace_struct));
+ body_struct* body = malloc(sizeof(body_struct));
+
+
+ output_file = g_ops_ac_file;
+
+ for(;;)
+ {
+ /* Find the first line of the function */
+ func_name[0] = 0;
+ while(strstr(func_name, ID_OPHANDLER_NAME) == NULL)
+ {
+ if(strcmp(func_name, ID_INPUT_SEPARATOR) == 0)
+ {
+ free(replace);
+ free(body);
+ return; /* all done */
+ }
+ if(fgetline(func_name, MAX_LINE_LENGTH, input_file) < 0)
+ error_exit("Premature end of file when getting function name");
+ }
+ /* Get the rest of the function */
+ for(body->length=0;;body->length++)
+ {
+ if(body->length > MAX_BODY_LENGTH)
+ error_exit("Function too long");
+
+ if(fgetline(body->body[body->length], MAX_LINE_LENGTH, input_file) < 0)
+ error_exit("Premature end of file when getting function body");
+
+ if(body->body[body->length][0] == '}')
+ {
+ body->length++;
+ break;
+ }
+ }
+
+ g_num_primitives++;
+
+ /* Extract the function name information */
+ if(!extract_opcode_info(func_name, oper_name, &oper_size, oper_spec_proc, oper_spec_ea))
+ error_exit("Invalid " ID_OPHANDLER_NAME " format");
+
+ /* Find the corresponding table entry */
+ opinfo = find_opcode(oper_name, oper_size, oper_spec_proc, oper_spec_ea);
+ if(opinfo == NULL)
+ error_exit("Unable to find matching table entry for %s", func_name);
+
+ /* Change output files if we pass 'c' or 'n' */
+ if(output_file == g_ops_ac_file && oper_name[0] > 'c')
+ output_file = g_ops_dm_file;
+ else if(output_file == g_ops_dm_file && oper_name[0] > 'm')
+ output_file = g_ops_nz_file;
+
+ replace->length = 0;
+
+ /* Generate opcode variants */
+ if(strcmp(opinfo->name, "bcc") == 0 || strcmp(opinfo->name, "scc") == 0)
+ generate_opcode_cc_variants(output_file, body, replace, opinfo, 1);
+ else if(strcmp(opinfo->name, "dbcc") == 0)
+ generate_opcode_cc_variants(output_file, body, replace, opinfo, 2);
+ else if(strcmp(opinfo->name, "trapcc") == 0)
+ generate_opcode_cc_variants(output_file, body, replace, opinfo, 4);
+ else
+ generate_opcode_ea_variants(output_file, body, replace, opinfo);
+ }
+
+ free(replace);
+ free(body);
+}
+
+
+/* Populate the opcode handler table from the input file */
+void populate_table(void)
+{
+ char* ptr;
+ char bitpattern[17];
+ opcode_struct* op;
+ char buff[MAX_LINE_LENGTH];
+ int i;
+ int temp;
+
+ buff[0] = 0;
+
+ /* Find the start of the table */
+ while(strcmp(buff, ID_TABLE_START) != 0)
+ if(fgetline(buff, MAX_LINE_LENGTH, g_input_file) < 0)
+ error_exit("Premature EOF while reading table");
+
+ /* Process the entire table */
+ for(op = g_opcode_input_table;;op++)
+ {
+ if(fgetline(buff, MAX_LINE_LENGTH, g_input_file) < 0)
+ error_exit("Premature EOF while reading table");
+ if(strlen(buff) == 0)
+ continue;
+ /* We finish when we find an input separator */
+ if(strcmp(buff, ID_INPUT_SEPARATOR) == 0)
+ break;
+
+ /* Extract the info from the table */
+ ptr = buff;
+
+ /* Name */
+ ptr += skip_spaces(ptr);
+ ptr += check_strsncpy(op->name, ptr, MAX_NAME_LENGTH);
+
+ /* Size */
+ ptr += skip_spaces(ptr);
+ ptr += check_atoi(ptr, &temp);
+ op->size = (unsigned char)temp;
+
+ /* Special processing */
+ ptr += skip_spaces(ptr);
+ ptr += check_strsncpy(op->spec_proc, ptr, MAX_SPEC_PROC_LENGTH);
+
+ /* Specified EA Mode */
+ ptr += skip_spaces(ptr);
+ ptr += check_strsncpy(op->spec_ea, ptr, MAX_SPEC_EA_LENGTH);
+
+ /* Bit Pattern (more processing later) */
+ ptr += skip_spaces(ptr);
+ ptr += check_strsncpy(bitpattern, ptr, 17);
+
+ /* Allowed Addressing Mode List */
+ ptr += skip_spaces(ptr);
+ ptr += check_strsncpy(op->ea_allowed, ptr, EA_ALLOWED_LENGTH);
+
+ /* CPU operating mode (U = user or supervisor, S = supervisor only */
+ ptr += skip_spaces(ptr);
+ for(i=0;i<NUM_CPUS;i++)
+ {
+ op->cpu_mode[i] = *ptr++;
+ ptr += skip_spaces(ptr);
+ }
+
+ /* Allowed CPUs for this instruction */
+ for(i=0;i<NUM_CPUS;i++)
+ {
+ ptr += skip_spaces(ptr);
+ if(*ptr == UNSPECIFIED_CH)
+ {
+ op->cpus[i] = UNSPECIFIED_CH;
+ op->cycles[i] = 0;
+ ptr++;
+ }
+ else
+ {
+ op->cpus[i] = '0' + i;
+ ptr += check_atoi(ptr, &temp);
+ op->cycles[i] = (unsigned char)temp;
+ }
+ }
+
+ /* generate mask and match from bitpattern */
+ op->op_mask = 0;
+ op->op_match = 0;
+ for(i=0;i<16;i++)
+ {
+ op->op_mask |= (bitpattern[i] != '.') << (15-i);
+ op->op_match |= (bitpattern[i] == '1') << (15-i);
+ }
+ }
+ /* Terminate the list */
+ op->name[0] = 0;
+}
+
+/* Read a header or footer insert from the input file */
+void read_insert(char* insert)
+{
+ char* ptr = insert;
+ char* overflow = insert + MAX_INSERT_LENGTH - MAX_LINE_LENGTH;
+ int length;
+ char* first_blank = NULL;
+
+ first_blank = NULL;
+
+ /* Skip any leading blank lines */
+ for(length = 0;length == 0;length = fgetline(ptr, MAX_LINE_LENGTH, g_input_file))
+ if(ptr >= overflow)
+ error_exit("Buffer overflow reading inserts");
+ if(length < 0)
+ error_exit("Premature EOF while reading inserts");
+
+ /* Advance and append newline */
+ ptr += length;
+ strcpy(ptr++, "\n");
+
+ /* Read until next separator */
+ for(;;)
+ {
+ /* Read a new line */
+ if(ptr >= overflow)
+ error_exit("Buffer overflow reading inserts");
+ if((length = fgetline(ptr, MAX_LINE_LENGTH, g_input_file)) < 0)
+ error_exit("Premature EOF while reading inserts");
+
+ /* Stop if we read a separator */
+ if(strcmp(ptr, ID_INPUT_SEPARATOR) == 0)
+ break;
+
+ /* keep track in case there are trailing blanks */
+ if(length == 0)
+ {
+ if(first_blank == NULL)
+ first_blank = ptr;
+ }
+ else
+ first_blank = NULL;
+
+ /* Advance and append newline */
+ ptr += length;
+ strcpy(ptr++, "\n");
+ }
+
+ /* kill any trailing blank lines */
+ if(first_blank)
+ ptr = first_blank;
+ *ptr++ = 0;
+}
+
+
+
+/* ======================================================================== */
+/* ============================= MAIN FUNCTION ============================ */
+/* ======================================================================== */
+
+int main(int argc, char **argv)
+{
+ /* File stuff */
+ char output_path[M68K_MAX_DIR] = "";
+ char filename[M68K_MAX_PATH];
+ /* Section identifier */
+ char section_id[MAX_LINE_LENGTH+1];
+ /* Inserts */
+ char temp_insert[MAX_INSERT_LENGTH+1];
+ char prototype_footer_insert[MAX_INSERT_LENGTH+1];
+ char table_footer_insert[MAX_INSERT_LENGTH+1];
+ char ophandler_footer_insert[MAX_INSERT_LENGTH+1];
+ /* Flags if we've processed certain parts already */
+ int prototype_header_read = 0;
+ int prototype_footer_read = 0;
+ int table_header_read = 0;
+ int table_footer_read = 0;
+ int ophandler_header_read = 0;
+ int ophandler_footer_read = 0;
+ int table_body_read = 0;
+ int ophandler_body_read = 0;
+
+ printf("\n\t\tMusashi v%s 68000, 68010, 68EC020, 68020 emulator\n", g_version);
+ printf("\t\tCopyright 1998-2000 Karl Stenerud (karl@mame.net)\n\n");
+
+ /* Check if output path and source for the input file are given */
+ if(argc > 1)
+ {
+ char *ptr;
+ strcpy(output_path, argv[1]);
+
+ for(ptr = strchr(output_path, '\\'); ptr; ptr = strchr(ptr, '\\'))
+ *ptr = '/';
+ if(output_path[strlen(output_path)-1] != '/')
+ strcat(output_path, "/");
+ if(argc > 2)
+ strcpy(g_input_filename, argv[2]);
+ }
+
+
+ /* Open the files we need */
+ sprintf(filename, "%s%s", output_path, FILENAME_PROTOTYPE);
+ if((g_prototype_file = fopen(filename, "wt")) == NULL)
+ perror_exit("Unable to create prototype file (%s)\n", filename);
+
+ sprintf(filename, "%s%s", output_path, FILENAME_TABLE);
+ if((g_table_file = fopen(filename, "wt")) == NULL)
+ perror_exit("Unable to create table file (%s)\n", filename);
+
+ sprintf(filename, "%s%s", output_path, FILENAME_OPS_AC);
+ if((g_ops_ac_file = fopen(filename, "wt")) == NULL)
+ perror_exit("Unable to create ops ac file (%s)\n", filename);
+
+ sprintf(filename, "%s%s", output_path, FILENAME_OPS_DM);
+ if((g_ops_dm_file = fopen(filename, "wt")) == NULL)
+ perror_exit("Unable to create ops dm file (%s)\n", filename);
+
+ sprintf(filename, "%s%s", output_path, FILENAME_OPS_NZ);
+ if((g_ops_nz_file = fopen(filename, "wt")) == NULL)
+ perror_exit("Unable to create ops nz file (%s)\n", filename);
+
+ if((g_input_file=fopen(g_input_filename, "rt")) == NULL)
+ perror_exit("can't open %s for input", g_input_filename);
+
+
+ /* Get to the first section of the input file */
+ section_id[0] = 0;
+ while(strcmp(section_id, ID_INPUT_SEPARATOR) != 0)
+ if(fgetline(section_id, MAX_LINE_LENGTH, g_input_file) < 0)
+ error_exit("Premature EOF while reading input file");
+
+ /* Now process all sections */
+ for(;;)
+ {
+ if(fgetline(section_id, MAX_LINE_LENGTH, g_input_file) < 0)
+ error_exit("Premature EOF while reading input file");
+ if(strcmp(section_id, ID_PROTOTYPE_HEADER) == 0)
+ {
+ if(prototype_header_read)
+ error_exit("Duplicate prototype header");
+ read_insert(temp_insert);
+ fprintf(g_prototype_file, "%s\n\n", temp_insert);
+ prototype_header_read = 1;
+ }
+ else if(strcmp(section_id, ID_TABLE_HEADER) == 0)
+ {
+ if(table_header_read)
+ error_exit("Duplicate table header");
+ read_insert(temp_insert);
+ fprintf(g_table_file, "%s", temp_insert);
+ table_header_read = 1;
+ }
+ else if(strcmp(section_id, ID_OPHANDLER_HEADER) == 0)
+ {
+ if(ophandler_header_read)
+ error_exit("Duplicate opcode handler header");
+ read_insert(temp_insert);
+ fprintf(g_ops_ac_file, "%s\n\n", temp_insert);
+ fprintf(g_ops_dm_file, "%s\n\n", temp_insert);
+ fprintf(g_ops_nz_file, "%s\n\n", temp_insert);
+ ophandler_header_read = 1;
+ }
+ else if(strcmp(section_id, ID_PROTOTYPE_FOOTER) == 0)
+ {
+ if(prototype_footer_read)
+ error_exit("Duplicate prototype footer");
+ read_insert(prototype_footer_insert);
+ prototype_footer_read = 1;
+ }
+ else if(strcmp(section_id, ID_TABLE_FOOTER) == 0)
+ {
+ if(table_footer_read)
+ error_exit("Duplicate table footer");
+ read_insert(table_footer_insert);
+ table_footer_read = 1;
+ }
+ else if(strcmp(section_id, ID_OPHANDLER_FOOTER) == 0)
+ {
+ if(ophandler_footer_read)
+ error_exit("Duplicate opcode handler footer");
+ read_insert(ophandler_footer_insert);
+ ophandler_footer_read = 1;
+ }
+ else if(strcmp(section_id, ID_TABLE_BODY) == 0)
+ {
+ if(!prototype_header_read)
+ error_exit("Table body encountered before prototype header");
+ if(!table_header_read)
+ error_exit("Table body encountered before table header");
+ if(!ophandler_header_read)
+ error_exit("Table body encountered before opcode handler header");
+
+ if(table_body_read)
+ error_exit("Duplicate table body");
+
+ populate_table();
+ table_body_read = 1;
+ }
+ else if(strcmp(section_id, ID_OPHANDLER_BODY) == 0)
+ {
+ if(!prototype_header_read)
+ error_exit("Opcode handlers encountered before prototype header");
+ if(!table_header_read)
+ error_exit("Opcode handlers encountered before table header");
+ if(!ophandler_header_read)
+ error_exit("Opcode handlers encountered before opcode handler header");
+ if(!table_body_read)
+ error_exit("Opcode handlers encountered before table body");
+
+ if(ophandler_body_read)
+ error_exit("Duplicate opcode handler section");
+
+ process_opcode_handlers();
+
+ ophandler_body_read = 1;
+ }
+ else if(strcmp(section_id, ID_END) == 0)
+ {
+ /* End of input file. Do a sanity check and then write footers */
+ if(!prototype_header_read)
+ error_exit("Missing prototype header");
+ if(!prototype_footer_read)
+ error_exit("Missing prototype footer");
+ if(!table_header_read)
+ error_exit("Missing table header");
+ if(!table_footer_read)
+ error_exit("Missing table footer");
+ if(!table_body_read)
+ error_exit("Missing table body");
+ if(!ophandler_header_read)
+ error_exit("Missing opcode handler header");
+ if(!ophandler_footer_read)
+ error_exit("Missing opcode handler footer");
+ if(!ophandler_body_read)
+ error_exit("Missing opcode handler body");
+
+ print_opcode_output_table(g_table_file);
+
+ fprintf(g_prototype_file, "%s\n\n", prototype_footer_insert);
+ fprintf(g_table_file, "%s\n\n", table_footer_insert);
+ fprintf(g_ops_ac_file, "%s\n\n", ophandler_footer_insert);
+ fprintf(g_ops_dm_file, "%s\n\n", ophandler_footer_insert);
+ fprintf(g_ops_nz_file, "%s\n\n", ophandler_footer_insert);
+
+ break;
+ }
+ else
+ {
+ error_exit("Unknown section identifier: %s", section_id);
+ }
+ }
+
+ /* Close all files and exit */
+ fclose(g_prototype_file);
+ fclose(g_table_file);
+ fclose(g_ops_ac_file);
+ fclose(g_ops_dm_file);
+ fclose(g_ops_nz_file);
+ fclose(g_input_file);
+
+ printf("Generated %d opcode handlers from %d primitives\n", g_num_functions, g_num_primitives);
+
+ return 0;
+}
+
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
diff --git a/plugins/ao/eng_ssf/m68kmame.h b/plugins/ao/eng_ssf/m68kmame.h
new file mode 100644
index 00000000..6ac0ec59
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kmame.h
@@ -0,0 +1,172 @@
+#ifndef M68KMAME__HEADER
+#define M68KMAME__HEADER
+
+/* ======================================================================== */
+/* ============================== MAME STUFF ============================== */
+/* ======================================================================== */
+
+#include "cpuintrf.h"
+#include "memory.h"
+#include "mamedbg.h"
+#include "m68000.h"
+
+extern int m68ki_remaining_cycles;
+
+/* Configuration switches (see m68kconf.h for explanation) */
+#define M68K_SEPARATE_READS OPT_ON
+
+#define M68K_SIMULATE_PD_WRITES OPT_ON
+
+#define M68K_EMULATE_INT_ACK OPT_ON
+#define M68K_INT_ACK_CALLBACK(A)
+
+#define M68K_EMULATE_BKPT_ACK OPT_OFF
+#define M68K_BKPT_ACK_CALLBACK()
+
+#define M68K_EMULATE_TRACE OPT_OFF
+
+#define M68K_EMULATE_RESET OPT_ON
+#define M68K_RESET_CALLBACK()
+
+#define M68K_EMULATE_FC OPT_OFF
+#define M68K_SET_FC_CALLBACK(A)
+
+#define M68K_MONITOR_PC OPT_SPECIFY_HANDLER
+#define M68K_SET_PC_CALLBACK(A) (*m68k_memory_intf.changepc)(A)
+
+#define M68K_INSTRUCTION_HOOK OPT_SPECIFY_HANDLER
+#define M68K_INSTRUCTION_CALLBACK() CALL_MAME_DEBUG
+
+#define M68K_EMULATE_PREFETCH OPT_ON
+
+#define M68K_LOG_ENABLE OPT_OFF
+#define M68K_LOG_1010_1111 OPT_OFF
+#define M68K_LOG_FILEHANDLE errorlog
+
+#define M68K_EMULATE_ADDRESS_ERROR OPT_OFF
+
+#define M68K_USE_64_BIT OPT_OFF
+
+extern struct m68k_memory_interface m68k_memory_intf;
+
+#define m68k_read_memory_8(address) (*m68k_memory_intf.read8)(address)
+#define m68k_read_memory_16(address) (*m68k_memory_intf.read16)(address)
+#define m68k_read_memory_32(address) (*m68k_memory_intf.read32)(address)
+
+INLINE unsigned int m68k_read_immediate_16(unsigned int address)
+{
+ return cpu_readop16((address) ^ m68k_memory_intf.opcode_xor);
+}
+
+INLINE unsigned int m68k_read_immediate_32(unsigned int address)
+{
+ return ((m68k_read_immediate_16(address) << 16) | m68k_read_immediate_16((address)+2));
+}
+
+INLINE unsigned int m68k_read_pcrelative_8(unsigned int address)
+{
+ if (address >= encrypted_opcode_start[cpu_getactivecpu()] &&
+ address < encrypted_opcode_end[cpu_getactivecpu()])
+ return ((m68k_read_immediate_16(address&~1)>>(8*(1-(address & 1))))&0xff);
+ else
+ return m68k_read_memory_8(address);
+}
+
+INLINE unsigned int m68k_read_pcrelative_16(unsigned int address)
+{
+ if (address >= encrypted_opcode_start[cpu_getactivecpu()] &&
+ address < encrypted_opcode_end[cpu_getactivecpu()])
+ return m68k_read_immediate_16(address);
+ else
+ return m68k_read_memory_16(address);
+}
+
+INLINE unsigned int m68k_read_pcrelative_32(unsigned int address)
+{
+ if (address >= encrypted_opcode_start[cpu_getactivecpu()] &&
+ address < encrypted_opcode_end[cpu_getactivecpu()])
+ return m68k_read_immediate_32(address);
+ else
+ return m68k_read_memory_32(address);
+}
+
+#define m68k_read_disassembler_16(address) m68k_read_immediate_16(address)
+#define m68k_read_disassembler_32(address) m68k_read_immediate_32(address)
+
+
+#define m68k_write_memory_8(address, value) (*m68k_memory_intf.write8)(address, value)
+#define m68k_write_memory_16(address, value) (*m68k_memory_intf.write16)(address, value)
+#define m68k_write_memory_32(address, value) (*m68k_memory_intf.write32)(address, value)
+
+/* Special call to simulate undocumented 68k behavior when move.l with a
+ * predecrement destination mode is executed.
+ * A real 68k first writes the high word to [address+2], and then writes the
+ * low word to [address].
+ */
+INLINE void m68k_write_memory_32_pd(unsigned int address, unsigned int value)
+{
+ (*m68k_memory_intf.write16)(address+2, value>>16);
+ (*m68k_memory_intf.write16)(address, value&0xffff);
+}
+
+
+#ifdef A68K0
+#define M68K_EMULATE_010 OPT_OFF
+#else
+
+// The PPC 68k core defines A68K0 internal to itself to avoid recompiling
+// all of MAME when you want to disable it. The downside is that the C and x86
+// cores can't agree on the same name for the icount variable, so we force the
+// issue with a Mac-specific hack.
+#ifdef macintosh
+extern int m68k_ICount;
+#else
+#define m68ki_remaining_cycles m68k_ICount
+#endif
+
+/* M68K Variants */
+#if HAS_M68010
+#define M68K_EMULATE_010 OPT_ON
+#else
+#define M68K_EMULATE_010 OPT_OFF
+#endif
+
+#endif // A68K0
+
+#ifdef A68K2
+#define M68K_EMULATE_EC020 OPT_OFF
+#define M68K_EMULATE_020 OPT_OFF
+#else
+
+// The PPC 68k core defines A68K2 internal to itself to avoid recompiling
+// all of MAME when you want to disable it. The downside is that the C and x86
+// cores can't agree on the same name for the icount variable, so we force the
+// issue with a Mac-specific hack.
+#ifdef macintosh
+extern int M68020_ICount;
+#else
+#define m68ki_remaining_cycles m68k_ICount
+#endif
+
+#undef M68K_EMULATE_010
+#define M68K_EMULATE_010 OPT_ON
+
+#if HAS_M68EC020
+#define M68K_EMULATE_EC020 OPT_ON
+#else
+#define M68K_EMULATE_EC020 OPT_OFF
+#endif
+
+#if HAS_M68020
+#define M68K_EMULATE_020 OPT_ON
+#else
+#define M68K_EMULATE_020 OPT_OFF
+#endif
+
+#endif // A68K2
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68KMAME__HEADER */
diff --git a/plugins/ao/eng_ssf/m68kopac.c b/plugins/ao/eng_ssf/m68kopac.c
new file mode 100644
index 00000000..535eb888
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kopac.c
@@ -0,0 +1,12042 @@
+#include "m68kcpu.h"
+
+/* ======================================================================== */
+/* ========================= INSTRUCTION HANDLERS ========================= */
+/* ======================================================================== */
+
+
+void m68k_op_1010(void)
+{
+ m68ki_exception_1010();
+}
+
+
+void m68k_op_1111(void)
+{
+ m68ki_exception_1111();
+}
+
+
+void m68k_op_abcd_8_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+void m68k_op_abcd_8_mm_ax7(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_abcd_8_mm_ay7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_abcd_8_mm_axy7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_abcd_8_mm(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res += 6;
+ res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res -= 0xa0;
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_add_8_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pi7(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_A7_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pd7(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_A7_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_8_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_a(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_16_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_a(void)
+{
+ uint* r_dst = &DX;
+ uint src = AY;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_32_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_add_8_re_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_8_re_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_16_re_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_add_32_re_al(void)
+{
+ uint ea = EA_AL_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_adda_16_d(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY));
+}
+
+
+void m68k_op_adda_16_a(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY));
+}
+
+
+void m68k_op_adda_16_ai(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_AI_16()));
+}
+
+
+void m68k_op_adda_16_pi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_PI_16()));
+}
+
+
+void m68k_op_adda_16_pd(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_PD_16()));
+}
+
+
+void m68k_op_adda_16_di(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_DI_16()));
+}
+
+
+void m68k_op_adda_16_ix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AY_IX_16()));
+}
+
+
+void m68k_op_adda_16_aw(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AW_16()));
+}
+
+
+void m68k_op_adda_16_al(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_AL_16()));
+}
+
+
+void m68k_op_adda_16_pcdi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_PCDI_16()));
+}
+
+
+void m68k_op_adda_16_pcix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_PCIX_16()));
+}
+
+
+void m68k_op_adda_16_i(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(OPER_I_16()));
+}
+
+
+void m68k_op_adda_32_d(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY);
+}
+
+
+void m68k_op_adda_32_a(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY);
+}
+
+
+void m68k_op_adda_32_ai(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_AI_32());
+}
+
+
+void m68k_op_adda_32_pi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_PI_32());
+}
+
+
+void m68k_op_adda_32_pd(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_PD_32());
+}
+
+
+void m68k_op_adda_32_di(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_DI_32());
+}
+
+
+void m68k_op_adda_32_ix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AY_IX_32());
+}
+
+
+void m68k_op_adda_32_aw(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AW_32());
+}
+
+
+void m68k_op_adda_32_al(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_AL_32());
+}
+
+
+void m68k_op_adda_32_pcdi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_PCDI_32());
+}
+
+
+void m68k_op_adda_32_pcix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_PCIX_32());
+}
+
+
+void m68k_op_adda_32_i(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + OPER_I_32());
+}
+
+
+void m68k_op_addi_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_addi_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_addi_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_addi_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_AI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_DI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_IX_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AW_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addi_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AL_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_addq_8_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_pi7(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_pd7(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_8_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_addq_16_a(void)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
+}
+
+
+void m68k_op_addq_16_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_16_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = *r_dst;
+ uint res = src + dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_addq_32_a(void)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);
+}
+
+
+void m68k_op_addq_32_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addq_32_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst;
+
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_addx_8_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+void m68k_op_addx_16_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+void m68k_op_addx_32_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+void m68k_op_addx_8_mm_ax7(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_addx_8_mm_ay7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_addx_8_mm_axy7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_addx_8_mm(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_V = VFLAG_ADD_8(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_addx_16_mm(void)
+{
+ uint src = OPER_AY_PD_16();
+ uint ea = EA_AX_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_V = VFLAG_ADD_16(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_addx_32_mm(void)
+{
+ uint src = OPER_AY_PD_32();
+ uint ea = EA_AX_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = src + dst + XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_ADD_32(src, dst, res);
+ FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_8_er_d(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_ai(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_AI_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pi(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PI_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pi7(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PI_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pd(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_PD_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pd7(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_A7_PD_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_di(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_DI_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_ix(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AY_IX_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_aw(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AW_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_al(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_AL_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pcdi(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCDI_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_pcix(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_PCIX_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_er_i(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DX &= (OPER_I_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_d(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_ai(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_AI_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_pi(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PI_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_pd(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_PD_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_di(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_DI_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_ix(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AY_IX_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_aw(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AW_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_al(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_AL_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_pcdi(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCDI_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_pcix(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_PCIX_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_16_er_i(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DX &= (OPER_I_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_d(void)
+{
+ FLAG_Z = DX &= DY;
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_ai(void)
+{
+ FLAG_Z = DX &= OPER_AY_AI_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_pi(void)
+{
+ FLAG_Z = DX &= OPER_AY_PI_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_pd(void)
+{
+ FLAG_Z = DX &= OPER_AY_PD_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_di(void)
+{
+ FLAG_Z = DX &= OPER_AY_DI_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_ix(void)
+{
+ FLAG_Z = DX &= OPER_AY_IX_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_aw(void)
+{
+ FLAG_Z = DX &= OPER_AW_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_al(void)
+{
+ FLAG_Z = DX &= OPER_AL_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_pcdi(void)
+{
+ FLAG_Z = DX &= OPER_PCDI_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_pcix(void)
+{
+ FLAG_Z = DX &= OPER_PCIX_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_32_er_i(void)
+{
+ FLAG_Z = DX &= OPER_I_32();
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_and_8_re_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_8_re_al(void)
+{
+ uint ea = EA_AL_8();
+ uint res = DX & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_16_re_al(void)
+{
+ uint ea = EA_AL_16();
+ uint res = DX & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_and_32_re_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_and_32_re_al(void)
+{
+ uint ea = EA_AL_32();
+ uint res = DX & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_8_d(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00));
+
+ FLAG_N = NFLAG_8(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_andi_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_AI_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PI_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PD_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_DI_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_IX_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AW_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AL_8();
+ uint res = src & m68ki_read_8(ea);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_andi_16_d(void)
+{
+ FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000));
+
+ FLAG_N = NFLAG_16(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_andi_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint res = src & m68ki_read_16(ea);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_andi_32_d(void)
+{
+ FLAG_Z = DY &= (OPER_I_32());
+
+ FLAG_N = NFLAG_32(FLAG_Z);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_andi_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_AI_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PI_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PD_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_DI_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_IX_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AW_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AL_32();
+ uint res = src & m68ki_read_32(ea);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_andi_16_toc(void)
+{
+ m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16());
+}
+
+
+void m68k_op_andi_16_tos(void)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() & src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_asr_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(GET_MSB_8(src))
+ res |= m68ki_shift_8_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+void m68k_op_asr_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(GET_MSB_16(src))
+ res |= m68ki_shift_16_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+void m68k_op_asr_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(GET_MSB_32(src))
+ res |= m68ki_shift_32_table[shift];
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_X = FLAG_C = src << (9-shift);
+}
+
+
+void m68k_op_asr_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 8)
+ {
+ if(GET_MSB_8(src))
+ res |= m68ki_shift_8_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_8(src))
+ {
+ *r_dst |= 0xff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asr_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 16)
+ {
+ if(GET_MSB_16(src))
+ res |= m68ki_shift_16_table[shift];
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_16(src))
+ {
+ *r_dst |= 0xffff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asr_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ if(GET_MSB_32(src))
+ res |= m68ki_shift_32_table[shift];
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ if(GET_MSB_32(src))
+ {
+ *r_dst = 0xffffffff;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asr_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asr_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ if(GET_MSB_16(src))
+ res |= 0x8000;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = FLAG_X = src << 8;
+}
+
+
+void m68k_op_asl_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_8_table[shift + 1];
+ FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7;
+}
+
+
+void m68k_op_asl_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (8-shift);
+ src &= m68ki_shift_16_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
+}
+
+
+void m68k_op_asl_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (24-shift);
+ src &= m68ki_shift_32_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
+}
+
+
+void m68k_op_asl_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_8_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asl_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_X = FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_16_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asl_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ src &= m68ki_shift_32_table[shift + 1];
+ FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = (!(src == 0))<<7;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_asl_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_asl_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ src &= 0xc000;
+ FLAG_V = (!(src == 0 || src == 0xc000))<<7;
+}
+
+
+void m68k_op_bhi_8(void)
+{
+ if(COND_HI())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bls_8(void)
+{
+ if(COND_LS())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bcc_8(void)
+{
+ if(COND_CC())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bcs_8(void)
+{
+ if(COND_CS())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bne_8(void)
+{
+ if(COND_NE())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_beq_8(void)
+{
+ if(COND_EQ())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bvc_8(void)
+{
+ if(COND_VC())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bvs_8(void)
+{
+ if(COND_VS())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bpl_8(void)
+{
+ if(COND_PL())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bmi_8(void)
+{
+ if(COND_MI())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bge_8(void)
+{
+ if(COND_GE())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_blt_8(void)
+{
+ if(COND_LT())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bgt_8(void)
+{
+ if(COND_GT())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_ble_8(void)
+{
+ if(COND_LE())
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ return;
+ }
+ USE_CYCLES(CYC_BCC_NOTAKE_B);
+}
+
+
+void m68k_op_bhi_16(void)
+{
+ if(COND_HI())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bls_16(void)
+{
+ if(COND_LS())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bcc_16(void)
+{
+ if(COND_CC())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bcs_16(void)
+{
+ if(COND_CS())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bne_16(void)
+{
+ if(COND_NE())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_beq_16(void)
+{
+ if(COND_EQ())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bvc_16(void)
+{
+ if(COND_VC())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bvs_16(void)
+{
+ if(COND_VS())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bpl_16(void)
+{
+ if(COND_PL())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bmi_16(void)
+{
+ if(COND_MI())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bge_16(void)
+{
+ if(COND_GE())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_blt_16(void)
+{
+ if(COND_LT())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bgt_16(void)
+{
+ if(COND_GT())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_ble_16(void)
+{
+ if(COND_LE())
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_BCC_NOTAKE_W);
+}
+
+
+void m68k_op_bhi_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_HI())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bls_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LS())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bcc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CC())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bcs_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CS())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bne_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_NE())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_beq_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_EQ())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bvc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VC())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bvs_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VS())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bpl_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_PL())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bmi_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_MI())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bge_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GE())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_blt_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LT())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bgt_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GT())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_ble_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LE())
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bchg_32_r_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst ^= mask;
+}
+
+
+void m68k_op_bchg_8_r_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_r_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_32_s_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst ^= mask;
+}
+
+
+void m68k_op_bchg_8_s_ai(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_pi(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_pi7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_pd(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_pd7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_di(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_ix(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_aw(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bchg_8_s_al(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src ^ mask);
+}
+
+
+void m68k_op_bclr_32_r_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst &= ~mask;
+}
+
+
+void m68k_op_bclr_8_r_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_r_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_32_s_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst &= ~mask;
+}
+
+
+void m68k_op_bclr_8_s_ai(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_pi(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_pi7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_pd(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_pd7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_di(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_ix(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_aw(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bclr_8_s_al(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src & ~mask);
+}
+
+
+void m68k_op_bfchg_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data ^= mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfchg_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfchg_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfchg_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfchg_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfchg_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long ^ mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte ^ mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data &= ~mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfclr_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long & ~mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte & ~mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2>>12)&7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_PCDI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfexts_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_PCIX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data = MAKE_INT_32(data) >> (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data >>= 32 - width;
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2>>12)&7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_PCDI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfextu_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint data;
+ uint ea = EA_PCIX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<offset);
+
+ if((offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ REG_D[(word2 >> 12) & 7] = data;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint64 data = DY;
+ uint bit;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+ data = ROL_32(data, offset);
+ FLAG_N = NFLAG_32(data);
+ data >>= 32 - width;
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_PCDI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfffo_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ sint local_offset;
+ uint width = word2;
+ uint data;
+ uint bit;
+ uint ea = EA_PCIX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ local_offset = offset % 8;
+ if(local_offset < 0)
+ {
+ local_offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ data = m68ki_read_32(ea);
+ data = MASK_OUT_ABOVE_32(data<<local_offset);
+
+ if((local_offset+width) > 32)
+ data |= (m68ki_read_8(ea+4) << local_offset) >> 8;
+
+ FLAG_N = NFLAG_32(data);
+ data >>= (32 - width);
+
+ FLAG_Z = data;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)
+ offset++;
+
+ REG_D[(word2>>12)&7] = offset;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+ uint64 insert = REG_D[(word2>>12)&7];
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ insert = MASK_OUT_ABOVE_32(insert << (32 - width));
+ FLAG_N = NFLAG_32(insert);
+ FLAG_Z = insert;
+ insert = ROR_32(insert, offset);
+
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data &= ~mask;
+ *data |= insert;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfins_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint insert_base = REG_D[(word2>>12)&7];
+ uint insert_long;
+ uint insert_byte;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));
+ FLAG_N = NFLAG_32(insert_base);
+ FLAG_Z = insert_base;
+ insert_long = insert_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ insert_byte = MASK_OUT_ABOVE_8(insert_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ *data |= mask;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_AI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_DI_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_IX_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AW_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bfset_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AL_8();
+
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = NFLAG_32(data_long << offset);
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ m68ki_write_32(ea, data_long | mask_long);
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ m68ki_write_8(ea+4, data_byte | mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint offset = (word2>>6)&31;
+ uint width = word2;
+ uint* data = &DY;
+ uint64 mask;
+
+
+ if(BIT_B(word2))
+ offset = REG_D[offset&7];
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+
+ offset &= 31;
+ width = ((width-1) & 31) + 1;
+
+
+ mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask = ROR_32(mask, offset);
+
+ FLAG_N = NFLAG_32(*data<<offset);
+ FLAG_Z = *data & mask;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_AI_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_DI_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AY_IX_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AW_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_AL_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_PCDI_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bftst_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ sint offset = (word2>>6)&31;
+ uint width = word2;
+ uint mask_base;
+ uint data_long;
+ uint mask_long;
+ uint data_byte = 0;
+ uint mask_byte = 0;
+ uint ea = EA_PCIX_8();
+
+ if(BIT_B(word2))
+ offset = MAKE_INT_32(REG_D[offset&7]);
+ if(BIT_5(word2))
+ width = REG_D[width&7];
+
+ /* Offset is signed so we have to use ugly math =( */
+ ea += offset / 8;
+ offset %= 8;
+ if(offset < 0)
+ {
+ offset += 8;
+ ea--;
+ }
+ width = ((width-1) & 31) + 1;
+
+
+ mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
+ mask_long = mask_base >> offset;
+
+ data_long = m68ki_read_32(ea);
+ FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;
+ FLAG_Z = data_long & mask_long;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+
+ if((width + offset) > 32)
+ {
+ mask_byte = MASK_OUT_ABOVE_8(mask_base);
+ data_byte = m68ki_read_8(ea+4);
+ FLAG_Z |= (data_byte & mask_byte);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bkpt(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0); /* auto-disable (see m68kcpu.h) */
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bra_8(void)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_bra_16(void)
+{
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_bra_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint offset = OPER_I_32();
+ REG_PC -= 4;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_32(offset);
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_bset_32_r_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (DX & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst |= mask;
+}
+
+
+void m68k_op_bset_8_r_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_r_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+ uint mask = 1 << (DX & 7);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_32_s_d(void)
+{
+ uint* r_dst = &DY;
+ uint mask = 1 << (OPER_I_8() & 0x1f);
+
+ FLAG_Z = *r_dst & mask;
+ *r_dst |= mask;
+}
+
+
+void m68k_op_bset_8_s_ai(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_pi(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_pi7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_pd(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_pd7(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_di(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_ix(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_aw(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bset_8_s_al(void)
+{
+ uint mask = 1 << (OPER_I_8() & 7);
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+
+ FLAG_Z = src & mask;
+ m68ki_write_8(ea, src | mask);
+}
+
+
+void m68k_op_bsr_8(void)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));
+}
+
+
+void m68k_op_bsr_16(void)
+{
+ uint offset = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ REG_PC -= 2;
+ m68ki_branch_16(offset);
+}
+
+
+void m68k_op_bsr_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint offset = OPER_I_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ REG_PC -= 4;
+ m68ki_branch_32(offset);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_btst_32_r_d(void)
+{
+ FLAG_Z = DY & (1 << (DX & 0x1f));
+}
+
+
+void m68k_op_btst_8_r_ai(void)
+{
+ FLAG_Z = OPER_AY_AI_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pi(void)
+{
+ FLAG_Z = OPER_AY_PI_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pi7(void)
+{
+ FLAG_Z = OPER_A7_PI_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pd(void)
+{
+ FLAG_Z = OPER_AY_PD_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pd7(void)
+{
+ FLAG_Z = OPER_A7_PD_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_di(void)
+{
+ FLAG_Z = OPER_AY_DI_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_ix(void)
+{
+ FLAG_Z = OPER_AY_IX_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_aw(void)
+{
+ FLAG_Z = OPER_AW_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_al(void)
+{
+ FLAG_Z = OPER_AL_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pcdi(void)
+{
+ FLAG_Z = OPER_PCDI_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_pcix(void)
+{
+ FLAG_Z = OPER_PCIX_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_8_r_i(void)
+{
+ FLAG_Z = OPER_I_8() & (1 << (DX & 7));
+}
+
+
+void m68k_op_btst_32_s_d(void)
+{
+ FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f));
+}
+
+
+void m68k_op_btst_8_s_ai(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AY_AI_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pi(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AY_PI_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pi7(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_A7_PI_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pd(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AY_PD_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pd7(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_A7_PD_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_di(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AY_DI_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_ix(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AY_IX_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_aw(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AW_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_al(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_AL_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pcdi(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_PCDI_8() & (1 << bit);
+}
+
+
+void m68k_op_btst_8_s_pcix(void)
+{
+ uint bit = OPER_I_8() & 7;
+
+ FLAG_Z = OPER_PCIX_8() & (1 << bit);
+}
+
+
+void m68k_op_callm_32_ai(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_AY_AI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_di(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_AY_DI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_ix(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_AY_IX_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_aw(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_AW_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_al(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_AL_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_pcdi(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_PCDI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_callm_32_pcix(void)
+{
+ /* note: watch out for pcrelative modes */
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ uint ea = EA_PCIX_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_PC += 2;
+(void)ea; /* just to avoid an 'unused variable' warning */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_pi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_pi7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_A7_PI_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_pd(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_pd7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_A7_PD_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_8_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_8();
+ uint dest = m68ki_read_8(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_8(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(*compare, dest, res);
+ FLAG_C = CFLAG_8(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_8(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_pi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_pd(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_16_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint dest = m68ki_read_16(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - MASK_OUT_ABOVE_16(*compare);
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(*compare, dest, res);
+ FLAG_C = CFLAG_16(res);
+
+ if(COND_NE())
+ *compare = MASK_OUT_BELOW_16(*compare) | dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_pi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_pd(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_32();
+ uint dest = m68ki_read_32(ea);
+ uint* compare = &REG_D[word2 & 7];
+ uint res = dest - *compare;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(*compare, dest, res);
+ FLAG_C = CFLAG_SUB_32(*compare, dest, res);
+
+ if(COND_NE())
+ *compare = dest;
+ else
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);
+ }
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas2_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_32();
+ uint* compare1 = &REG_D[(word2 >> 16) & 7];
+ uint ea1 = REG_DA[(word2 >> 28) & 15];
+ uint dest1 = m68ki_read_16(ea1);
+ uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1);
+ uint* compare2 = &REG_D[word2 & 7];
+ uint ea2 = REG_DA[(word2 >> 12) & 15];
+ uint dest2 = m68ki_read_16(ea2);
+ uint res2;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_16(res1);
+ FLAG_Z = MASK_OUT_ABOVE_16(res1);
+ FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1);
+ FLAG_C = CFLAG_16(res1);
+
+ if(COND_EQ())
+ {
+ res2 = dest2 - MASK_OUT_ABOVE_16(*compare2);
+
+ FLAG_N = NFLAG_16(res2);
+ FLAG_Z = MASK_OUT_ABOVE_16(res2);
+ FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2);
+ FLAG_C = CFLAG_16(res2);
+
+ if(COND_EQ())
+ {
+ USE_CYCLES(3);
+ m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]);
+ m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]);
+ return;
+ }
+ }
+ *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1;
+ *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cas2_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_32();
+ uint* compare1 = &REG_D[(word2 >> 16) & 7];
+ uint ea1 = REG_DA[(word2 >> 28) & 15];
+ uint dest1 = m68ki_read_32(ea1);
+ uint res1 = dest1 - *compare1;
+ uint* compare2 = &REG_D[word2 & 7];
+ uint ea2 = REG_DA[(word2 >> 12) & 15];
+ uint dest2 = m68ki_read_32(ea2);
+ uint res2;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ FLAG_N = NFLAG_32(res1);
+ FLAG_Z = MASK_OUT_ABOVE_32(res1);
+ FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1);
+ FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1);
+
+ if(COND_EQ())
+ {
+ res2 = dest2 - *compare2;
+
+ FLAG_N = NFLAG_32(res2);
+ FLAG_Z = MASK_OUT_ABOVE_32(res2);
+ FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2);
+ FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2);
+
+ if(COND_EQ())
+ {
+ USE_CYCLES(3);
+ m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]);
+ m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]);
+ return;
+ }
+ }
+ *compare1 = dest1;
+ *compare2 = dest2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_16_d(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(DY);
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_ai(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AY_AI_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_pi(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AY_PI_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_pd(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AY_PD_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_di(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AY_DI_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_ix(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AY_IX_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_aw(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AW_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_al(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_AL_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_pcdi(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_PCDI_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_pcix(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_PCIX_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_16_i(void)
+{
+ sint src = MAKE_INT_16(DX);
+ sint bound = MAKE_INT_16(OPER_I_16());
+
+ FLAG_Z = ZFLAG_16(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+}
+
+
+void m68k_op_chk_32_d(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(DY);
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AY_AI_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_pi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AY_PI_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_pd(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AY_PD_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AY_DI_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AY_IX_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AW_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_AL_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_PCDI_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_PCIX_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk_32_i(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ sint src = MAKE_INT_32(DX);
+ sint bound = MAKE_INT_32(OPER_I_32());
+
+ FLAG_Z = ZFLAG_32(src); /* Undocumented */
+ FLAG_V = VFLAG_CLEAR; /* Undocumented */
+ FLAG_C = CFLAG_CLEAR; /* Undocumented */
+
+ if(src >= 0 && src <= bound)
+ {
+ return;
+ }
+ FLAG_N = (src < 0)<<7;
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_PCDI_8();
+ uint lower_bound = m68ki_read_pcrel_8(ea);
+ uint upper_bound = m68ki_read_pcrel_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_PCIX_8();
+ uint lower_bound = m68ki_read_pcrel_8(ea);
+ uint upper_bound = m68ki_read_pcrel_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_AY_AI_8();
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_AY_DI_8();
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_AY_IX_8();
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_AW_8();
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_8_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xff;
+ uint ea = EA_AL_8();
+ uint lower_bound = m68ki_read_8(ea);
+ uint upper_bound = m68ki_read_8(ea + 1);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_PCDI_16();
+ uint lower_bound = m68ki_read_pcrel_16(ea);
+ uint upper_bound = m68ki_read_pcrel_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_PCIX_16();
+ uint lower_bound = m68ki_read_pcrel_16(ea);
+ uint upper_bound = m68ki_read_pcrel_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_AY_AI_16();
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_AY_DI_16();
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_AY_IX_16();
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_AW_16();
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_16_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15]&0xffff;
+ uint ea = EA_AL_16();
+ uint lower_bound = m68ki_read_16(ea);
+ uint upper_bound = m68ki_read_16(ea + 2);
+
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound);
+ else
+ FLAG_C = compare - lower_bound;
+
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ if(!BIT_F(word2))
+ FLAG_C = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare);
+ else
+ FLAG_C = upper_bound - compare;
+
+ FLAG_C = CFLAG_16(FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_PCDI_32();
+ uint lower_bound = m68ki_read_pcrel_32(ea);
+ uint upper_bound = m68ki_read_pcrel_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_PCIX_32();
+ uint lower_bound = m68ki_read_pcrel_32(ea);
+ uint upper_bound = m68ki_read_pcrel_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_ai(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_AY_AI_32();
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_di(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_AY_DI_32();
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_ix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_AY_IX_32();
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_aw(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_AW_32();
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_chk2cmp2_32_al(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint compare = REG_DA[(word2 >> 12) & 15];
+ uint ea = EA_AL_32();
+ uint lower_bound = m68ki_read_32(ea);
+ uint upper_bound = m68ki_read_32(ea + 4);
+
+ FLAG_C = compare - lower_bound;
+ FLAG_Z = !((upper_bound==compare) | (lower_bound==compare));
+ FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);
+ if(COND_CS())
+ {
+ if(BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+
+ FLAG_C = upper_bound - compare;
+ FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);
+ if(COND_CS() && BIT_B(word2))
+ m68ki_exception_trap(EXCEPTION_CHK);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_clr_8_d(void)
+{
+ DY &= 0xffffff00;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_d(void)
+{
+ DY &= 0xffff0000;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_ai(void)
+{
+ m68ki_write_16(EA_AY_AI_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_pi(void)
+{
+ m68ki_write_16(EA_AY_PI_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_pd(void)
+{
+ m68ki_write_16(EA_AY_PD_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_di(void)
+{
+ m68ki_write_16(EA_AY_DI_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_ix(void)
+{
+ m68ki_write_16(EA_AY_IX_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_aw(void)
+{
+ m68ki_write_16(EA_AW_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_16_al(void)
+{
+ m68ki_write_16(EA_AL_16(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_d(void)
+{
+ DY = 0;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_ai(void)
+{
+ m68ki_write_32(EA_AY_AI_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_pi(void)
+{
+ m68ki_write_32(EA_AY_PI_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_pd(void)
+{
+ m68ki_write_32(EA_AY_PD_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_di(void)
+{
+ m68ki_write_32(EA_AY_DI_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_ix(void)
+{
+ m68ki_write_32(EA_AY_IX_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_aw(void)
+{
+ m68ki_write_32(EA_AW_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_clr_32_al(void)
+{
+ m68ki_write_32(EA_AL_32(), 0);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+}
+
+
+void m68k_op_cmp_8_d(void)
+{
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_ai(void)
+{
+ uint src = OPER_AY_AI_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pi(void)
+{
+ uint src = OPER_AY_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pi7(void)
+{
+ uint src = OPER_A7_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pd(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pd7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_di(void)
+{
+ uint src = OPER_AY_DI_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_ix(void)
+{
+ uint src = OPER_AY_IX_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_aw(void)
+{
+ uint src = OPER_AW_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_al(void)
+{
+ uint src = OPER_AL_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pcdi(void)
+{
+ uint src = OPER_PCDI_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_pcix(void)
+{
+ uint src = OPER_PCIX_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_8_i(void)
+{
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmp_16_d(void)
+{
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_a(void)
+{
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_ai(void)
+{
+ uint src = OPER_AY_AI_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_pi(void)
+{
+ uint src = OPER_AY_PI_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_pd(void)
+{
+ uint src = OPER_AY_PD_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_di(void)
+{
+ uint src = OPER_AY_DI_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_ix(void)
+{
+ uint src = OPER_AY_IX_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_aw(void)
+{
+ uint src = OPER_AW_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_al(void)
+{
+ uint src = OPER_AL_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_pcdi(void)
+{
+ uint src = OPER_PCDI_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_pcix(void)
+{
+ uint src = OPER_PCIX_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_16_i(void)
+{
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(DX);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmp_32_d(void)
+{
+ uint src = DY;
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_a(void)
+{
+ uint src = AY;
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_ai(void)
+{
+ uint src = OPER_AY_AI_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_pi(void)
+{
+ uint src = OPER_AY_PI_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_pd(void)
+{
+ uint src = OPER_AY_PD_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_di(void)
+{
+ uint src = OPER_AY_DI_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_ix(void)
+{
+ uint src = OPER_AY_IX_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_aw(void)
+{
+ uint src = OPER_AW_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_al(void)
+{
+ uint src = OPER_AL_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_pcdi(void)
+{
+ uint src = OPER_PCDI_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_pcix(void)
+{
+ uint src = OPER_PCIX_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmp_32_i(void)
+{
+ uint src = OPER_I_32();
+ uint dst = DX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_d(void)
+{
+ uint src = MAKE_INT_16(DY);
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_a(void)
+{
+ uint src = MAKE_INT_16(AY);
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_ai(void)
+{
+ uint src = MAKE_INT_16(OPER_AY_AI_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_pi(void)
+{
+ uint src = MAKE_INT_16(OPER_AY_PI_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_pd(void)
+{
+ uint src = MAKE_INT_16(OPER_AY_PD_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_di(void)
+{
+ uint src = MAKE_INT_16(OPER_AY_DI_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_ix(void)
+{
+ uint src = MAKE_INT_16(OPER_AY_IX_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_aw(void)
+{
+ uint src = MAKE_INT_16(OPER_AW_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_al(void)
+{
+ uint src = MAKE_INT_16(OPER_AL_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_pcdi(void)
+{
+ uint src = MAKE_INT_16(OPER_PCDI_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_pcix(void)
+{
+ uint src = MAKE_INT_16(OPER_PCIX_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_16_i(void)
+{
+ uint src = MAKE_INT_16(OPER_I_16());
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_d(void)
+{
+ uint src = DY;
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_a(void)
+{
+ uint src = AY;
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_ai(void)
+{
+ uint src = OPER_AY_AI_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_pi(void)
+{
+ uint src = OPER_AY_PI_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_pd(void)
+{
+ uint src = OPER_AY_PD_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_di(void)
+{
+ uint src = OPER_AY_DI_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_ix(void)
+{
+ uint src = OPER_AY_IX_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_aw(void)
+{
+ uint src = OPER_AW_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_al(void)
+{
+ uint src = OPER_AL_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_pcdi(void)
+{
+ uint src = OPER_PCDI_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_pcix(void)
+{
+ uint src = OPER_PCIX_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpa_32_i(void)
+{
+ uint src = OPER_I_32();
+ uint dst = AX;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_8_d(void)
+{
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(DY);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AY_AI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AY_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_A7_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AY_PD_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_A7_PD_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AY_DI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AY_IX_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AW_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint dst = OPER_AL_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpi_8_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_8();
+ uint dst = OPER_PCDI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpi_8_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_8();
+ uint dst = OPER_PCIX_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpi_16_d(void)
+{
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(DY);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AY_AI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AY_PI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AY_PD_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AY_DI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AY_IX_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AW_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint dst = OPER_AL_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpi_16_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_16();
+ uint dst = OPER_PCDI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpi_16_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_16();
+ uint dst = OPER_PCIX_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpi_32_d(void)
+{
+ uint src = OPER_I_32();
+ uint dst = DY;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AY_AI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AY_PI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AY_PD_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AY_DI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AY_IX_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AW_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint dst = OPER_AL_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cmpi_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_32();
+ uint dst = OPER_PCDI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpi_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_I_32();
+ uint dst = OPER_PCIX_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_cmpm_8_ax7(void)
+{
+ uint src = OPER_AY_PI_8();
+ uint dst = OPER_A7_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpm_8_ay7(void)
+{
+ uint src = OPER_A7_PI_8();
+ uint dst = OPER_AX_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpm_8_axy7(void)
+{
+ uint src = OPER_A7_PI_8();
+ uint dst = OPER_A7_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpm_8(void)
+{
+ uint src = OPER_AY_PI_8();
+ uint dst = OPER_AX_PI_8();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_C = CFLAG_8(res);
+}
+
+
+void m68k_op_cmpm_16(void)
+{
+ uint src = OPER_AY_PI_16();
+ uint dst = OPER_AX_PI_16();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_C = CFLAG_16(res);
+}
+
+
+void m68k_op_cmpm_32(void)
+{
+ uint src = OPER_AY_PI_32();
+ uint dst = OPER_AX_PI_32();
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_C = CFLAG_SUB_32(src, dst, res);
+}
+
+
+void m68k_op_cpbcc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+void m68k_op_cpdbcc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+void m68k_op_cpgen_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+void m68k_op_cpscc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+void m68k_op_cptrapcc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_1111();
+}
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
diff --git a/plugins/ao/eng_ssf/m68kopdm.c b/plugins/ao/eng_ssf/m68kopdm.c
new file mode 100644
index 00000000..deb3586b
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kopdm.c
@@ -0,0 +1,13221 @@
+#include "m68kcpu.h"
+
+/* ======================================================================== */
+/* ========================= INSTRUCTION HANDLERS ========================= */
+/* ======================================================================== */
+
+
+void m68k_op_dbt_16(void)
+{
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbf_16(void)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbhi_16(void)
+{
+ if(COND_NOT_HI())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbls_16(void)
+{
+ if(COND_NOT_LS())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbcc_16(void)
+{
+ if(COND_NOT_CC())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbcs_16(void)
+{
+ if(COND_NOT_CS())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbne_16(void)
+{
+ if(COND_NOT_NE())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbeq_16(void)
+{
+ if(COND_NOT_EQ())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbvc_16(void)
+{
+ if(COND_NOT_VC())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbvs_16(void)
+{
+ if(COND_NOT_VS())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbpl_16(void)
+{
+ if(COND_NOT_PL())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbmi_16(void)
+{
+ if(COND_NOT_MI())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbge_16(void)
+{
+ if(COND_NOT_GE())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dblt_16(void)
+{
+ if(COND_NOT_LT())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dbgt_16(void)
+{
+ if(COND_NOT_GT())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_dble_16(void)
+{
+ if(COND_NOT_LE())
+ {
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(*r_dst - 1);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ if(res != 0xffff)
+ {
+ uint offset = OPER_I_16();
+ REG_PC -= 2;
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_branch_16(offset);
+ USE_CYCLES(CYC_DBCC_F_NOEXP);
+ return;
+ }
+ REG_PC += 2;
+ USE_CYCLES(CYC_DBCC_F_EXP);
+ return;
+ }
+ REG_PC += 2;
+}
+
+
+void m68k_op_divs_16_d(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(DY);
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_ai(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AY_AI_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_pi(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AY_PI_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_pd(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AY_PD_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_di(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AY_DI_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_ix(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AY_IX_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_aw(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AW_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_al(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_AL_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_pcdi(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_PCDI_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_pcix(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_PCIX_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divs_16_i(void)
+{
+ uint* r_dst = &DX;
+ sint src = MAKE_INT_16(OPER_I_16());
+ sint quotient;
+ sint remainder;
+
+ if(src != 0)
+ {
+ if((uint32)*r_dst == 0x80000000 && src == -1)
+ {
+ FLAG_Z = 0;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = 0;
+ return;
+ }
+
+ quotient = MAKE_INT_32(*r_dst) / src;
+ remainder = MAKE_INT_32(*r_dst) % src;
+
+ if(quotient == MAKE_INT_16(quotient))
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divu_16_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_16();
+
+ if(src != 0)
+ {
+ uint quotient = *r_dst / src;
+ uint remainder = *r_dst % src;
+
+ if(quotient < 0x10000)
+ {
+ FLAG_Z = quotient;
+ FLAG_N = NFLAG_16(quotient);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));
+ return;
+ }
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+}
+
+
+void m68k_op_divl_32_d(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = DY;
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = DY;
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_ai(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AY_AI_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AY_AI_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_pi(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AY_PI_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AY_PI_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_pd(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AY_PD_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AY_PD_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_di(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AY_DI_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AY_DI_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_ix(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AY_IX_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AY_IX_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_aw(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AW_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AW_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_al(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_AL_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_AL_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_pcdi(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_PCDI_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_PCDI_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_pcix(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_PCIX_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_PCIX_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_divl_32_i(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 divisor = OPER_I_32();
+ uint64 dividend = 0;
+ uint64 quotient = 0;
+ uint64 remainder = 0;
+
+ if(divisor != 0)
+ {
+ if(BIT_A(word2)) /* 64 bit */
+ {
+ dividend = REG_D[word2 & 7];
+ dividend <<= 32;
+ dividend |= REG_D[(word2 >> 12) & 7];
+
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)dividend / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));
+ if((sint64)quotient != (sint64)((sint32)quotient))
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ if(quotient > 0xffffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ remainder = dividend % divisor;
+ }
+ }
+ else /* 32 bit */
+ {
+ dividend = REG_D[(word2 >> 12) & 7];
+ if(BIT_B(word2)) /* signed */
+ {
+ quotient = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));
+ remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));
+ }
+ else /* unsigned */
+ {
+ quotient = dividend / divisor;
+ remainder = dividend % divisor;
+ }
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint divisor = OPER_I_32();
+ uint dividend_hi = REG_D[word2 & 7];
+ uint dividend_lo = REG_D[(word2 >> 12) & 7];
+ uint quotient = 0;
+ uint remainder = 0;
+ uint dividend_neg = 0;
+ uint divisor_neg = 0;
+ sint i;
+ uint overflow;
+
+ if(divisor != 0)
+ {
+ /* quad / long : long quotient, long remainder */
+ if(BIT_A(word2))
+ {
+ if(BIT_B(word2)) /* signed */
+ {
+ /* special case in signed divide */
+ if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ REG_D[word2 & 7] = 0;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ if(GET_MSB_32(dividend_hi))
+ {
+ dividend_neg = 1;
+ dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));
+ dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);
+ }
+ if(GET_MSB_32(divisor))
+ {
+ divisor_neg = 1;
+ divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);
+
+ }
+ }
+
+ /* if the upper long is greater than the divisor, we're overflowing. */
+ if(dividend_hi >= divisor)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ remainder = (remainder << 1) + ((dividend_hi >> i) & 1);
+ if(remainder >= divisor)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+ for(i = 31; i >= 0; i--)
+ {
+ quotient <<= 1;
+ overflow = GET_MSB_32(remainder);
+ remainder = (remainder << 1) + ((dividend_lo >> i) & 1);
+ if(remainder >= divisor || overflow)
+ {
+ remainder -= divisor;
+ quotient++;
+ }
+ }
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(quotient > 0x7fffffff)
+ {
+ FLAG_V = VFLAG_SET;
+ return;
+ }
+ if(dividend_neg)
+ {
+ remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+ if(divisor_neg)
+ quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);
+ }
+
+ REG_D[word2 & 7] = remainder;
+ REG_D[(word2 >> 12) & 7] = quotient;
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+
+ /* long / long: long quotient, maybe long remainder */
+ if(BIT_B(word2)) /* signed */
+ {
+ /* Special case in divide */
+ if(dividend_lo == 0x80000000 && divisor == 0xffffffff)
+ {
+ FLAG_N = NFLAG_SET;
+ FLAG_Z = ZFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ REG_D[(word2 >> 12) & 7] = 0x80000000;
+ REG_D[word2 & 7] = 0;
+ return;
+ }
+ REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);
+ }
+ else
+ {
+ REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);
+ quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);
+ }
+
+ FLAG_N = NFLAG_32(quotient);
+ FLAG_Z = quotient;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_eor_8_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_d(void)
+{
+ uint res = DY ^= DX;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eor_32_al(void)
+{
+ uint ea = EA_AL_32();
+ uint res = DX ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8());
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_AI_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PI_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PD_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_DI_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_IX_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AW_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AL_8();
+ uint res = src ^ m68ki_read_8(ea);
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16());
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint res = src ^ m68ki_read_16(ea);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_d(void)
+{
+ uint res = DY ^= OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_AI_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PI_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PD_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_DI_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_IX_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AW_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AL_32();
+ uint res = src ^ m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_eori_16_toc(void)
+{
+ m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16());
+}
+
+
+void m68k_op_eori_16_tos(void)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() ^ src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_exg_32_dd(void)
+{
+ uint* reg_a = &DX;
+ uint* reg_b = &DY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+void m68k_op_exg_32_aa(void)
+{
+ uint* reg_a = &AX;
+ uint* reg_b = &AY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+void m68k_op_exg_32_da(void)
+{
+ uint* reg_a = &DX;
+ uint* reg_b = &AY;
+ uint tmp = *reg_a;
+ *reg_a = *reg_b;
+ *reg_b = tmp;
+}
+
+
+void m68k_op_ext_16(void)
+{
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0);
+
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_ext_32(void)
+{
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0);
+
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_extb_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint* r_dst = &DY;
+
+ *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0);
+
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_illegal(void)
+{
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_jmp_32_ai(void)
+{
+ m68ki_jump(EA_AY_AI_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_di(void)
+{
+ m68ki_jump(EA_AY_DI_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_ix(void)
+{
+ m68ki_jump(EA_AY_IX_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_aw(void)
+{
+ m68ki_jump(EA_AW_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_al(void)
+{
+ m68ki_jump(EA_AL_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_pcdi(void)
+{
+ m68ki_jump(EA_PCDI_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jmp_32_pcix(void)
+{
+ m68ki_jump(EA_PCIX_32());
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(REG_PC == REG_PPC)
+ USE_ALL_CYCLES();
+}
+
+
+void m68k_op_jsr_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_aw(void)
+{
+ uint ea = EA_AW_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_al(void)
+{
+ uint ea = EA_AL_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_pcdi(void)
+{
+ uint ea = EA_PCDI_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_jsr_32_pcix(void)
+{
+ uint ea = EA_PCIX_32();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_push_32(REG_PC);
+ m68ki_jump(ea);
+}
+
+
+void m68k_op_lea_32_ai(void)
+{
+ AX = EA_AY_AI_32();
+}
+
+
+void m68k_op_lea_32_di(void)
+{
+ AX = EA_AY_DI_32();
+}
+
+
+void m68k_op_lea_32_ix(void)
+{
+ AX = EA_AY_IX_32();
+}
+
+
+void m68k_op_lea_32_aw(void)
+{
+ AX = EA_AW_32();
+}
+
+
+void m68k_op_lea_32_al(void)
+{
+ AX = EA_AL_32();
+}
+
+
+void m68k_op_lea_32_pcdi(void)
+{
+ AX = EA_PCDI_32();
+}
+
+
+void m68k_op_lea_32_pcix(void)
+{
+ AX = EA_PCIX_32();
+}
+
+
+void m68k_op_link_16_a7(void)
+{
+ REG_A[7] -= 4;
+ m68ki_write_32(REG_A[7], REG_A[7]);
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+}
+
+
+void m68k_op_link_16(void)
+{
+ uint* r_dst = &AY;
+
+ m68ki_push_32(*r_dst);
+ *r_dst = REG_A[7];
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+}
+
+
+void m68k_op_link_32_a7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_A[7] -= 4;
+ m68ki_write_32(REG_A[7], REG_A[7]);
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_link_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint* r_dst = &AY;
+
+ m68ki_push_32(*r_dst);
+ *r_dst = REG_A[7];
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_lsr_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << (9-shift);
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = src >> shift;
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_C = FLAG_X = (src >> (shift - 1))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0);
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsr_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = src >> 1;
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = res;
+ FLAG_C = FLAG_X = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (8-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> (24-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = MASK_OUT_ABOVE_8(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 8)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_X = FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffffff00;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift <= 16)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_X = FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst &= 0xffff0000;
+ FLAG_X = XFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint shift = DX & 0x3f;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32(src << shift);
+
+ if(shift != 0)
+ {
+ USE_CYCLES(shift<<CYC_SHIFT);
+
+ if(shift < 32)
+ {
+ *r_dst = res;
+ FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ *r_dst = 0;
+ FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;
+ FLAG_N = NFLAG_CLEAR;
+ FLAG_Z = ZFLAG_SET;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_lsl_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(src << 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_X = FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_al(void)
+{
+ uint res = OPER_AL_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_d_i(void)
+{
+ uint res = OPER_I_8();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ai_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AX_AI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi7_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pi_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AX_PI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd7_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_pd_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AX_PD_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_di_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AX_DI_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_ix_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AX_IX_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_aw_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AW_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_di(void)
+{
+ uint res = OPER_AY_DI_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_aw(void)
+{
+ uint res = OPER_AW_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_al(void)
+{
+ uint res = OPER_AL_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pcdi(void)
+{
+ uint res = OPER_PCDI_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_pcix(void)
+{
+ uint res = OPER_PCIX_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_8_al_i(void)
+{
+ uint res = OPER_I_8();
+ uint ea = EA_AL_8();
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_al(void)
+{
+ uint res = OPER_AL_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_d_i(void)
+{
+ uint res = OPER_I_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ai_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AX_AI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pi_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AX_PI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_pd_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AX_PD_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_di_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AX_DI_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_ix_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AX_IX_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_aw_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AW_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_a(void)
+{
+ uint res = MASK_OUT_ABOVE_16(AY);
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_di(void)
+{
+ uint res = OPER_AY_DI_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_aw(void)
+{
+ uint res = OPER_AW_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_al(void)
+{
+ uint res = OPER_AL_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_pcdi(void)
+{
+ uint res = OPER_PCDI_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_pcix(void)
+{
+ uint res = OPER_PCIX_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_16_al_i(void)
+{
+ uint res = OPER_I_16();
+ uint ea = EA_AL_16();
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_d(void)
+{
+ uint res = DY;
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_a(void)
+{
+ uint res = AY;
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_al(void)
+{
+ uint res = OPER_AL_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_d_i(void)
+{
+ uint res = OPER_I_32();
+ uint* r_dst = &DX;
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ai_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AX_AI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pi_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AX_PI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_pd_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AX_PD_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_di_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AX_DI_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_ix_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AX_IX_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_aw_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AW_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_d(void)
+{
+ uint res = DY;
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_a(void)
+{
+ uint res = AY;
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_di(void)
+{
+ uint res = OPER_AY_DI_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_aw(void)
+{
+ uint res = OPER_AW_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_al(void)
+{
+ uint res = OPER_AL_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_pcdi(void)
+{
+ uint res = OPER_PCDI_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_pcix(void)
+{
+ uint res = OPER_PCIX_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_move_32_al_i(void)
+{
+ uint res = OPER_I_32();
+ uint ea = EA_AL_32();
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_movea_16_d(void)
+{
+ AX = MAKE_INT_16(DY);
+}
+
+
+void m68k_op_movea_16_a(void)
+{
+ AX = MAKE_INT_16(AY);
+}
+
+
+void m68k_op_movea_16_ai(void)
+{
+ AX = MAKE_INT_16(OPER_AY_AI_16());
+}
+
+
+void m68k_op_movea_16_pi(void)
+{
+ AX = MAKE_INT_16(OPER_AY_PI_16());
+}
+
+
+void m68k_op_movea_16_pd(void)
+{
+ AX = MAKE_INT_16(OPER_AY_PD_16());
+}
+
+
+void m68k_op_movea_16_di(void)
+{
+ AX = MAKE_INT_16(OPER_AY_DI_16());
+}
+
+
+void m68k_op_movea_16_ix(void)
+{
+ AX = MAKE_INT_16(OPER_AY_IX_16());
+}
+
+
+void m68k_op_movea_16_aw(void)
+{
+ AX = MAKE_INT_16(OPER_AW_16());
+}
+
+
+void m68k_op_movea_16_al(void)
+{
+ AX = MAKE_INT_16(OPER_AL_16());
+}
+
+
+void m68k_op_movea_16_pcdi(void)
+{
+ AX = MAKE_INT_16(OPER_PCDI_16());
+}
+
+
+void m68k_op_movea_16_pcix(void)
+{
+ AX = MAKE_INT_16(OPER_PCIX_16());
+}
+
+
+void m68k_op_movea_16_i(void)
+{
+ AX = MAKE_INT_16(OPER_I_16());
+}
+
+
+void m68k_op_movea_32_d(void)
+{
+ AX = DY;
+}
+
+
+void m68k_op_movea_32_a(void)
+{
+ AX = AY;
+}
+
+
+void m68k_op_movea_32_ai(void)
+{
+ AX = OPER_AY_AI_32();
+}
+
+
+void m68k_op_movea_32_pi(void)
+{
+ AX = OPER_AY_PI_32();
+}
+
+
+void m68k_op_movea_32_pd(void)
+{
+ AX = OPER_AY_PD_32();
+}
+
+
+void m68k_op_movea_32_di(void)
+{
+ AX = OPER_AY_DI_32();
+}
+
+
+void m68k_op_movea_32_ix(void)
+{
+ AX = OPER_AY_IX_32();
+}
+
+
+void m68k_op_movea_32_aw(void)
+{
+ AX = OPER_AW_32();
+}
+
+
+void m68k_op_movea_32_al(void)
+{
+ AX = OPER_AL_32();
+}
+
+
+void m68k_op_movea_32_pcdi(void)
+{
+ AX = OPER_PCDI_32();
+}
+
+
+void m68k_op_movea_32_pcix(void)
+{
+ AX = OPER_PCIX_32();
+}
+
+
+void m68k_op_movea_32_i(void)
+{
+ AX = OPER_I_32();
+}
+
+
+void m68k_op_move_16_frc_d(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_ai(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AY_AI_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_pi(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AY_PI_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_pd(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AY_PD_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_di(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AY_DI_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_ix(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AY_IX_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_aw(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AW_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_frc_al(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ m68ki_write_16(EA_AL_16(), m68ki_get_ccr());
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_move_16_toc_d(void)
+{
+ m68ki_set_ccr(DY);
+}
+
+
+void m68k_op_move_16_toc_ai(void)
+{
+ m68ki_set_ccr(OPER_AY_AI_16());
+}
+
+
+void m68k_op_move_16_toc_pi(void)
+{
+ m68ki_set_ccr(OPER_AY_PI_16());
+}
+
+
+void m68k_op_move_16_toc_pd(void)
+{
+ m68ki_set_ccr(OPER_AY_PD_16());
+}
+
+
+void m68k_op_move_16_toc_di(void)
+{
+ m68ki_set_ccr(OPER_AY_DI_16());
+}
+
+
+void m68k_op_move_16_toc_ix(void)
+{
+ m68ki_set_ccr(OPER_AY_IX_16());
+}
+
+
+void m68k_op_move_16_toc_aw(void)
+{
+ m68ki_set_ccr(OPER_AW_16());
+}
+
+
+void m68k_op_move_16_toc_al(void)
+{
+ m68ki_set_ccr(OPER_AL_16());
+}
+
+
+void m68k_op_move_16_toc_pcdi(void)
+{
+ m68ki_set_ccr(OPER_PCDI_16());
+}
+
+
+void m68k_op_move_16_toc_pcix(void)
+{
+ m68ki_set_ccr(OPER_PCIX_16());
+}
+
+
+void m68k_op_move_16_toc_i(void)
+{
+ m68ki_set_ccr(OPER_I_16());
+}
+
+
+void m68k_op_move_16_frs_d(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr();
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_ai(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AY_AI_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_pi(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AY_PI_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_pd(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AY_PD_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_di(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AY_DI_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_ix(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AY_IX_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_aw(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AW_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_frs_al(void)
+{
+ if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */
+ {
+ uint ea = EA_AL_16();
+ m68ki_write_16(ea, m68ki_get_sr());
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_d(void)
+{
+ if(FLAG_S)
+ {
+ m68ki_set_sr(DY);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_ai(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AY_AI_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_pi(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AY_PI_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_pd(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AY_PD_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_di(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AY_DI_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_ix(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AY_IX_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_aw(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AW_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_al(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_AL_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_pcdi(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_PCDI_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_pcix(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_PCIX_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_16_tos_i(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(new_sr);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_32_fru(void)
+{
+ if(FLAG_S)
+ {
+ AY = REG_USP;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_move_32_tou(void)
+{
+ if(FLAG_S)
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_USP = AY;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_movec_32_cr(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ switch (word2 & 0xfff)
+ {
+ case 0x000: /* SFC */
+ REG_DA[(word2 >> 12) & 15] = REG_SFC;
+ return;
+ case 0x001: /* DFC */
+ REG_DA[(word2 >> 12) & 15] = REG_DFC;
+ return;
+ case 0x002: /* CACR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = REG_CACR;
+ return;
+ }
+ return;
+ case 0x800: /* USP */
+ REG_DA[(word2 >> 12) & 15] = REG_USP;
+ return;
+ case 0x801: /* VBR */
+ REG_DA[(word2 >> 12) & 15] = REG_VBR;
+ return;
+ case 0x802: /* CAAR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = REG_CAAR;
+ return;
+ }
+ m68ki_exception_illegal();
+ break;
+ case 0x803: /* MSP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP;
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x804: /* ISP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP;
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ default:
+ m68ki_exception_illegal();
+ return;
+ }
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_movec_32_rc(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ switch (word2 & 0xfff)
+ {
+ case 0x000: /* SFC */
+ REG_SFC = REG_DA[(word2 >> 12) & 15] & 7;
+ return;
+ case 0x001: /* DFC */
+ REG_DFC = REG_DA[(word2 >> 12) & 15] & 7;
+ return;
+ case 0x002: /* CACR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_CACR = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x800: /* USP */
+ REG_USP = REG_DA[(word2 >> 12) & 15];
+ return;
+ case 0x801: /* VBR */
+ REG_VBR = REG_DA[(word2 >> 12) & 15];
+ return;
+ case 0x802: /* CAAR */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_CAAR = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x803: /* MSP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* we are in supervisor mode so just check for M flag */
+ if(!FLAG_M)
+ {
+ REG_MSP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ REG_SP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ case 0x804: /* ISP */
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(!FLAG_M)
+ {
+ REG_SP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ REG_ISP = REG_DA[(word2 >> 12) & 15];
+ return;
+ }
+ m68ki_exception_illegal();
+ return;
+ default:
+ m68ki_exception_illegal();
+ return;
+ }
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_movem_16_re_pd(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ ea -= 2;
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i]));
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_re_ai(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_re_di(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_re_ix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_re_aw(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_re_al(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_32_re_pd(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ ea -= 4;
+ m68ki_write_32(ea, REG_DA[15-i]);
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_re_ai(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_AI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_re_di(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_DI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_re_ix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_IX_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_re_aw(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AW_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_re_al(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AL_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ m68ki_write_32(ea, REG_DA[i]);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_16_er_pi(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_pcdi(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCDI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_pcix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCIX_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_ai(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_di(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_ix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_aw(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_16_er_al(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));
+ ea += 2;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_W);
+}
+
+
+void m68k_op_movem_32_er_pi(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = AY;
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+ AY = ea;
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_pcdi(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCDI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_pcrel_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_pcix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_PCIX_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_pcrel_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_ai(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_AI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_di(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_DI_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_ix(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AY_IX_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_aw(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AW_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movem_32_er_al(void)
+{
+ uint i = 0;
+ uint register_list = OPER_I_16();
+ uint ea = EA_AL_32();
+ uint count = 0;
+
+ for(; i < 16; i++)
+ if(register_list & (1 << i))
+ {
+ REG_DA[i] = m68ki_read_32(ea);
+ ea += 4;
+ count++;
+ }
+
+ USE_CYCLES(count<<CYC_MOVEM_L);
+}
+
+
+void m68k_op_movep_16_re(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = DX;
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 8));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
+}
+
+
+void m68k_op_movep_32_re(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = DX;
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8));
+ m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));
+}
+
+
+void m68k_op_movep_16_er(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2));
+}
+
+
+void m68k_op_movep_32_er(void)
+{
+ uint ea = EA_AY_DI_32();
+
+ DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16)
+ + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6);
+}
+
+
+void m68k_op_moves_8_ai(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_pi(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_pi7(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_A7_PI_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_pd(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_pd7(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_A7_PD_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_di(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_ix(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_aw(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_8_al(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_8();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_ai(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_pi(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_pd(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_di(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_ix(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_aw(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_16_al(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_16();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));
+ return;
+ }
+ if(BIT_F(word2)) /* Memory to address register */
+ {
+ REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to data register */
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_ai(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_AI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_pi(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_pd(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_PD_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_di(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_DI_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_ix(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AY_IX_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_aw(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AW_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moves_32_al(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ if(FLAG_S)
+ {
+ uint word2 = OPER_I_16();
+ uint ea = EA_AL_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ if(BIT_B(word2)) /* Register to memory */
+ {
+ m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ /* Memory to register */
+ REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ USE_CYCLES(2);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_moveq_32(void)
+{
+ uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR));
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_d(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_ai(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_AI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_pi(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_pd(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PD_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_di(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_DI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_ix(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_IX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_aw(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AW_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_al(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AL_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCDI_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCIX_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_muls_16_i(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_I_16()) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_d(void)
+{
+ uint* r_dst = &DX;
+ uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_ai(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AY_AI_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_pi(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AY_PI_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_pd(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AY_PD_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_di(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AY_DI_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_ix(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AY_IX_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_aw(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AW_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_al(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_AL_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_PCDI_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_PCIX_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mulu_16_i(void)
+{
+ uint* r_dst = &DX;
+ uint res = OPER_I_16() * MASK_OUT_ABOVE_16(*r_dst);
+
+ *r_dst = res;
+
+ FLAG_Z = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_mull_32_d(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = DY;
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = DY;
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_ai(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AY_AI_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AY_AI_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_pi(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AY_PI_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AY_PI_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_pd(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AY_PD_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AY_PD_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_di(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AY_DI_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AY_DI_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_ix(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AY_IX_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AY_IX_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_aw(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AW_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AW_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_al(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_AL_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_AL_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_pcdi(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_PCDI_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_PCDI_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_pcix(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_PCIX_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_PCIX_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+void m68k_op_mull_32_i(void)
+{
+#if M68K_USE_64_BIT
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint64 src = OPER_I_32();
+ uint64 dst = REG_D[(word2 >> 12) & 7];
+ uint64 res;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ res = (sint64)((sint32)src) * (sint64)((sint32)dst);
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = ((sint64)res != (sint32)res)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+
+ res = src * dst;
+ if(!BIT_A(word2))
+ {
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_N = NFLAG_32(res);
+ FLAG_V = (res > 0xffffffff)<<7;
+ REG_D[(word2 >> 12) & 7] = FLAG_Z;
+ return;
+ }
+ FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);
+ FLAG_N = NFLAG_64(res);
+ FLAG_V = VFLAG_CLEAR;
+ REG_D[word2 & 7] = (res >> 32);
+ REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);
+ return;
+ }
+ m68ki_exception_illegal();
+
+#else
+
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint word2 = OPER_I_16();
+ uint src = OPER_I_32();
+ uint dst = REG_D[(word2 >> 12) & 7];
+ uint neg = GET_MSB_32(src ^ dst);
+ uint src1;
+ uint src2;
+ uint dst1;
+ uint dst2;
+ uint r1;
+ uint r2;
+ uint r3;
+ uint r4;
+ uint lo;
+ uint hi;
+
+ FLAG_C = CFLAG_CLEAR;
+
+ if(BIT_B(word2)) /* signed */
+ {
+ if(GET_MSB_32(src))
+ src = (uint)MASK_OUT_ABOVE_32(-(sint)src);
+ if(GET_MSB_32(dst))
+ dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);
+ }
+
+ src1 = MASK_OUT_ABOVE_16(src);
+ src2 = src>>16;
+ dst1 = MASK_OUT_ABOVE_16(dst);
+ dst2 = dst>>16;
+
+
+ r1 = src1 * dst1;
+ r2 = src1 * dst2;
+ r3 = src2 * dst1;
+ r4 = src2 * dst2;
+
+ lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);
+ hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);
+
+ if(BIT_B(word2) && neg)
+ {
+ hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));
+ lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);
+ }
+
+ if(BIT_A(word2))
+ {
+ REG_D[word2 & 7] = hi;
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(hi);
+ FLAG_Z = hi | lo;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ REG_D[(word2 >> 12) & 7] = lo;
+ FLAG_N = NFLAG_32(lo);
+ FLAG_Z = lo;
+ if(BIT_B(word2))
+ FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;
+ else
+ FLAG_V = (hi != 0) << 7;
+ return;
+ }
+ m68ki_exception_illegal();
+
+#endif
+}
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
diff --git a/plugins/ao/eng_ssf/m68kopnz.c b/plugins/ao/eng_ssf/m68kopnz.c
new file mode 100644
index 00000000..2c26ce3d
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kopnz.c
@@ -0,0 +1,8780 @@
+#include "m68kcpu.h"
+
+/* ======================================================================== */
+/* ========================= INSTRUCTION HANDLERS ========================= */
+/* ======================================================================== */
+
+
+void m68k_op_nbcd_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint dst = *r_dst;
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_nbcd_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());
+
+ if(res != 0x9a)
+ {
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if((res & 0x0f) == 0xa)
+ res = (res & 0xf0) + 0x10;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+
+ m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));
+
+ FLAG_Z |= res;
+ FLAG_C = CFLAG_SET;
+ FLAG_X = XFLAG_SET;
+ }
+ else
+ {
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_X = XFLAG_CLEAR;
+ }
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+}
+
+
+void m68k_op_neg_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_8(*r_dst);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = *r_dst & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_neg_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_C = FLAG_X = CFLAG_8(res);
+ FLAG_V = src & res;
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_16(*r_dst);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (*r_dst & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_neg_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_C = FLAG_X = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - *r_dst;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res);
+ FLAG_V = (*r_dst & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_neg_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_neg_32_al(void)
+{
+ uint ea = EA_AL_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_negx_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = *r_dst & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+void m68k_op_negx_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = m68ki_read_8(ea);
+ uint res = 0 - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = src & res;
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_negx_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (*r_dst & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+void m68k_op_negx_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = (src & res)>>8;
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_negx_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res);
+ FLAG_V = (*r_dst & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+void m68k_op_negx_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_negx_32_al(void)
+{
+ uint ea = EA_AL_32();
+ uint src = m68ki_read_32(ea);
+ uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);
+ FLAG_V = (src & res)>>24;
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_nop(void)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+}
+
+
+void m68k_op_not_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_8(~*r_dst);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = MASK_OUT_ABOVE_16(~*r_dst);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_not_32_al(void)
+{
+ uint ea = EA_AL_32();
+ uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY)));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_ai(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_AI_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pi(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PI_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pi7(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PI_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pd(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_PD_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pd7(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_A7_PD_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_di(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_DI_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_ix(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AY_IX_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_aw(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AW_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_al(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_AL_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pcdi(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCDI_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_pcix(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_PCIX_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_er_i(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DX |= OPER_I_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY)));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_ai(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_AI_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_pi(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PI_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_pd(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_PD_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_di(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_DI_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_ix(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AY_IX_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_aw(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AW_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_al(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_AL_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_pcdi(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCDI_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_pcix(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_PCIX_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_er_i(void)
+{
+ uint res = MASK_OUT_ABOVE_16((DX |= OPER_I_16()));
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_d(void)
+{
+ uint res = DX |= DY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_ai(void)
+{
+ uint res = DX |= OPER_AY_AI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_pi(void)
+{
+ uint res = DX |= OPER_AY_PI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_pd(void)
+{
+ uint res = DX |= OPER_AY_PD_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_di(void)
+{
+ uint res = DX |= OPER_AY_DI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_ix(void)
+{
+ uint res = DX |= OPER_AY_IX_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_aw(void)
+{
+ uint res = DX |= OPER_AW_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_al(void)
+{
+ uint res = DX |= OPER_AL_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_pcdi(void)
+{
+ uint res = DX |= OPER_PCDI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_pcix(void)
+{
+ uint res = DX |= OPER_PCIX_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_er_i(void)
+{
+ uint res = DX |= OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_8_re_al(void)
+{
+ uint ea = EA_AL_8();
+ uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_16_re_al(void)
+{
+ uint ea = EA_AL_16();
+ uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_or_32_re_al(void)
+{
+ uint ea = EA_AL_32();
+ uint res = DX | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8()));
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_AI_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PI_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PD_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_DI_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_IX_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AW_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AL_8();
+ uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));
+
+ m68ki_write_8(ea, res);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16());
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_d(void)
+{
+ uint res = DY |= OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_AI_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PI_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PD_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_DI_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_IX_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AW_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AL_32();
+ uint res = src | m68ki_read_32(ea);
+
+ m68ki_write_32(ea, res);
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ori_16_toc(void)
+{
+ m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16());
+}
+
+
+void m68k_op_ori_16_tos(void)
+{
+ if(FLAG_S)
+ {
+ uint src = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_sr(m68ki_get_sr() | src);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_pack_16_rr(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: DX and DY are reversed in Motorola's docs */
+ uint src = DY + OPER_I_16();
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_pack_16_mm_ax7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_AY_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_pack_16_mm_ay7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_A7_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_pack_16_mm_axy7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint ea_src = EA_A7_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_A7_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_pack_16_mm(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint ea_src = EA_AY_PD_8();
+ uint src = m68ki_read_8(ea_src);
+ ea_src = EA_AY_PD_8();
+ src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();
+
+ m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_pea_32_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_di(void)
+{
+ uint ea = EA_AY_DI_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_aw(void)
+{
+ uint ea = EA_AW_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_al(void)
+{
+ uint ea = EA_AL_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_pcdi(void)
+{
+ uint ea = EA_PCDI_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_pea_32_pcix(void)
+{
+ uint ea = EA_PCIX_32();
+
+ m68ki_push_32(ea);
+}
+
+
+void m68k_op_reset(void)
+{
+ if(FLAG_S)
+ {
+ m68ki_output_reset(); /* auto-disable (see m68kcpu.h) */
+ USE_CYCLES(CYC_RESET);
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_ror_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_8(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-orig_shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_16(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint res = ROR_32(src, shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = src << (9-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_8(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_C = src << (8-((shift-1)&7));
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 15;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_16(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = (src >> ((shift - 1) & 15)) << 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 31;
+ uint64 src = *r_dst;
+ uint res = ROR_32(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = res;
+ FLAG_C = (src >> ((shift - 1) & 31)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_ror_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_16(src, 1);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src << 8;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_8(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_C = src << orig_shift;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_16(src, shift);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> (8-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_32_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint res = ROL_32(src, shift);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_C = src >> (24-shift);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 7;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_8(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_C = src << shift;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+ FLAG_C = (src & 1)<<8;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_8(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 15;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift));
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_C = (src << shift) >> 8;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+ FLAG_C = (src & 1)<<8;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_16(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_32_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift & 31;
+ uint64 src = *r_dst;
+ uint res = ROL_32(src, shift);
+
+ if(orig_shift != 0)
+ {
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ *r_dst = res;
+
+ FLAG_C = (src >> (32 - shift)) << 8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_N = NFLAG_32(src);
+ FLAG_Z = src;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rol_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_C = src >> 7;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_32_s(void)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROR_33_64(res, shift);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
+ uint new_x_flag = src & (1 << (shift - 1));
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+void m68k_op_roxr_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 9;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 17;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_32_r(void)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 33;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROR_33_64(res, shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift % 33;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));
+ uint new_x_flag = src & (1 << (shift - 1));
+
+ if(orig_shift != 0)
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = res;
+ FLAG_X = (new_x_flag != 0)<<8;
+ }
+ else
+ res = src;
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+void m68k_op_roxr_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxr_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_8_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_s(void)
+{
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_32_s(void)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROL_33_64(res, shift);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint shift = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
+ uint new_x_flag = src & (1 << (32 - shift));
+
+ *r_dst = res;
+
+ FLAG_C = FLAG_X = (new_x_flag != 0)<<8;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+void m68k_op_roxl_8_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 9;
+ uint src = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res;
+ res = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_r(void)
+{
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 17;
+ uint src = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_16(*r_dst);
+ FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_32_r(void)
+{
+#if M68K_USE_64_BIT
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+
+ if(orig_shift != 0)
+ {
+ uint shift = orig_shift % 33;
+ uint64 src = *r_dst;
+ uint64 res = src | (((uint64)XFLAG_AS_1()) << 32);
+
+ res = ROL_33_64(res, shift);
+
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ FLAG_C = FLAG_X = res >> 24;
+ res = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = res;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ return;
+ }
+
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_Z = *r_dst;
+ FLAG_V = VFLAG_CLEAR;
+
+#else
+
+ uint* r_dst = &DY;
+ uint orig_shift = DX & 0x3f;
+ uint shift = orig_shift % 33;
+ uint src = *r_dst;
+ uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));
+ uint new_x_flag = src & (1 << (32 - shift));
+
+ if(orig_shift != 0)
+ USE_CYCLES(orig_shift<<CYC_SHIFT);
+
+ if(shift != 0)
+ {
+ *r_dst = res;
+ FLAG_X = (new_x_flag != 0)<<8;
+ }
+ else
+ res = src;
+ FLAG_C = FLAG_X;
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+
+#endif
+}
+
+
+void m68k_op_roxl_16_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_roxl_16_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = m68ki_read_16(ea);
+ uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);
+
+ FLAG_C = FLAG_X = res >> 8;
+ res = MASK_OUT_ABOVE_16(res);
+
+ m68ki_write_16(ea, res);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_rtd_32(void)
+{
+ if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))
+ {
+ uint new_pc = m68ki_pull_32();
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));
+ m68ki_jump(new_pc);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_rte_32(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr;
+ uint new_pc;
+ uint format_word;
+
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+
+ if(CPU_TYPE_IS_000(CPU_TYPE))
+ {
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+
+ return;
+ }
+
+ if(CPU_TYPE_IS_010(CPU_TYPE))
+ {
+ format_word = m68ki_read_16(REG_A[7]+6) >> 12;
+ if(format_word == 0)
+ {
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+ return;
+ }
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+ /* Not handling bus fault (9) */
+ m68ki_exception_format_error();
+ return;
+ }
+
+ /* Otherwise it's 020 */
+rte_loop:
+ format_word = m68ki_read_16(REG_A[7]+6) >> 12;
+ switch(format_word)
+ {
+ case 0: /* Normal */
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+ return;
+ case 1: /* Throwaway */
+ new_sr = m68ki_pull_16();
+ m68ki_fake_pull_32(); /* program counter */
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_set_sr_noint(new_sr);
+ goto rte_loop;
+ case 2: /* Trap */
+ new_sr = m68ki_pull_16();
+ new_pc = m68ki_pull_32();
+ m68ki_fake_pull_16(); /* format word */
+ m68ki_fake_pull_32(); /* address */
+ m68ki_jump(new_pc);
+ m68ki_set_sr(new_sr);
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+ return;
+ }
+ /* Not handling long or short bus fault */
+ CPU_INSTR_MODE = INSTRUCTION_YES;
+ CPU_RUN_MODE = RUN_MODE_NORMAL;
+ m68ki_exception_format_error();
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_rtm_32(void)
+{
+ if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))
+ {
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",
+ m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,
+ m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_rtr_32(void)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_set_ccr(m68ki_pull_16());
+ m68ki_jump(m68ki_pull_32());
+}
+
+
+void m68k_op_rts_32(void)
+{
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ m68ki_jump(m68ki_pull_32());
+}
+
+
+void m68k_op_sbcd_8_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+void m68k_op_sbcd_8_mm_ax7(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_sbcd_8_mm_ay7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_sbcd_8_mm_axy7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_sbcd_8_mm(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();
+
+ FLAG_V = ~res; /* Undefined V behavior */
+
+ if(res > 9)
+ res -= 6;
+ res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);
+ FLAG_X = FLAG_C = (res > 0x99) << 8;
+ if(FLAG_C)
+ res += 0xa0;
+
+ res = MASK_OUT_ABOVE_8(res);
+
+ FLAG_V &= res; /* Undefined V behavior part II */
+ FLAG_N = NFLAG_8(res); /* Undefined N behavior */
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_st_8_d(void)
+{
+ DY |= 0xff;
+}
+
+
+void m68k_op_st_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), 0xff);
+}
+
+
+void m68k_op_st_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), 0xff);
+}
+
+
+void m68k_op_st_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), 0xff);
+}
+
+
+void m68k_op_st_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), 0xff);
+}
+
+
+void m68k_op_st_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), 0xff);
+}
+
+
+void m68k_op_st_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), 0xff);
+}
+
+
+void m68k_op_st_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), 0xff);
+}
+
+
+void m68k_op_st_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), 0xff);
+}
+
+
+void m68k_op_st_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), 0xff);
+}
+
+
+void m68k_op_sf_8_d(void)
+{
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sf_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), 0);
+}
+
+
+void m68k_op_sf_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), 0);
+}
+
+
+void m68k_op_sf_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), 0);
+}
+
+
+void m68k_op_sf_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), 0);
+}
+
+
+void m68k_op_sf_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), 0);
+}
+
+
+void m68k_op_sf_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), 0);
+}
+
+
+void m68k_op_sf_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), 0);
+}
+
+
+void m68k_op_sf_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), 0);
+}
+
+
+void m68k_op_sf_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), 0);
+}
+
+
+void m68k_op_shi_8_d(void)
+{
+ if(COND_HI())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sls_8_d(void)
+{
+ if(COND_LS())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_scc_8_d(void)
+{
+ if(COND_CC())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_scs_8_d(void)
+{
+ if(COND_CS())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sne_8_d(void)
+{
+ if(COND_NE())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_seq_8_d(void)
+{
+ if(COND_EQ())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_svc_8_d(void)
+{
+ if(COND_VC())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_svs_8_d(void)
+{
+ if(COND_VS())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_spl_8_d(void)
+{
+ if(COND_PL())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_smi_8_d(void)
+{
+ if(COND_MI())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sge_8_d(void)
+{
+ if(COND_GE())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_slt_8_d(void)
+{
+ if(COND_LT())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sgt_8_d(void)
+{
+ if(COND_GT())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_sle_8_d(void)
+{
+ if(COND_LE())
+ {
+ DY |= 0xff;
+ return;
+ }
+ DY &= 0xffffff00;
+}
+
+
+void m68k_op_shi_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_shi_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_HI() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_sls_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_LS() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scc_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_CC() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_scs_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_CS() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_sne_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_NE() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_seq_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_EQ() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svc_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_VC() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_svs_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_VS() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_spl_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_PL() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_smi_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_MI() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_sge_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_GE() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_slt_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_LT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sgt_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_GT() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_ai(void)
+{
+ m68ki_write_8(EA_AY_AI_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_pi(void)
+{
+ m68ki_write_8(EA_AY_PI_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_pi7(void)
+{
+ m68ki_write_8(EA_A7_PI_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_pd(void)
+{
+ m68ki_write_8(EA_AY_PD_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_pd7(void)
+{
+ m68ki_write_8(EA_A7_PD_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_di(void)
+{
+ m68ki_write_8(EA_AY_DI_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_ix(void)
+{
+ m68ki_write_8(EA_AY_IX_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_aw(void)
+{
+ m68ki_write_8(EA_AW_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_sle_8_al(void)
+{
+ m68ki_write_8(EA_AL_8(), COND_LE() ? 0xff : 0);
+}
+
+
+void m68k_op_stop(void)
+{
+ if(FLAG_S)
+ {
+ uint new_sr = OPER_I_16();
+ m68ki_trace_t0(); /* auto-disable (see m68kcpu.h) */
+ CPU_STOPPED |= STOP_LEVEL_STOP;
+ m68ki_set_sr(new_sr);
+ m68ki_remaining_cycles = 0;
+ return;
+ }
+ m68ki_exception_privilege_violation();
+}
+
+
+void m68k_op_sub_8_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pi7(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_A7_PI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pd7(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_A7_PD_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_8_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_a(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(AY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_16_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_d(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_a(void)
+{
+ uint* r_dst = &DX;
+ uint src = AY;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_ai(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_AI_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_pi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PI_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_pd(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_PD_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_di(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_DI_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_ix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AY_IX_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_aw(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AW_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_al(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_AL_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_pcdi(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCDI_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_pcix(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_PCIX_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_32_er_i(void)
+{
+ uint* r_dst = &DX;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_sub_8_re_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_8_re_al(void)
+{
+ uint ea = EA_AL_8();
+ uint src = MASK_OUT_ABOVE_8(DX);
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_ai(void)
+{
+ uint ea = EA_AY_AI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_pi(void)
+{
+ uint ea = EA_AY_PI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_pd(void)
+{
+ uint ea = EA_AY_PD_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_di(void)
+{
+ uint ea = EA_AY_DI_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_ix(void)
+{
+ uint ea = EA_AY_IX_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_aw(void)
+{
+ uint ea = EA_AW_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_16_re_al(void)
+{
+ uint ea = EA_AL_16();
+ uint src = MASK_OUT_ABOVE_16(DX);
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_ai(void)
+{
+ uint ea = EA_AY_AI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_pi(void)
+{
+ uint ea = EA_AY_PI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_pd(void)
+{
+ uint ea = EA_AY_PD_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_di(void)
+{
+ uint ea = EA_AY_DI_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_ix(void)
+{
+ uint ea = EA_AY_IX_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_aw(void)
+{
+ uint ea = EA_AW_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_sub_32_re_al(void)
+{
+ uint ea = EA_AL_32();
+ uint src = DX;
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_suba_16_d(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY));
+}
+
+
+void m68k_op_suba_16_a(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY));
+}
+
+
+void m68k_op_suba_16_ai(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_AI_16()));
+}
+
+
+void m68k_op_suba_16_pi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_PI_16()));
+}
+
+
+void m68k_op_suba_16_pd(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_PD_16()));
+}
+
+
+void m68k_op_suba_16_di(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_DI_16()));
+}
+
+
+void m68k_op_suba_16_ix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AY_IX_16()));
+}
+
+
+void m68k_op_suba_16_aw(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AW_16()));
+}
+
+
+void m68k_op_suba_16_al(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_AL_16()));
+}
+
+
+void m68k_op_suba_16_pcdi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_PCDI_16()));
+}
+
+
+void m68k_op_suba_16_pcix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_PCIX_16()));
+}
+
+
+void m68k_op_suba_16_i(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(OPER_I_16()));
+}
+
+
+void m68k_op_suba_32_d(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY);
+}
+
+
+void m68k_op_suba_32_a(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY);
+}
+
+
+void m68k_op_suba_32_ai(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_AI_32());
+}
+
+
+void m68k_op_suba_32_pi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_PI_32());
+}
+
+
+void m68k_op_suba_32_pd(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_PD_32());
+}
+
+
+void m68k_op_suba_32_di(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_DI_32());
+}
+
+
+void m68k_op_suba_32_ix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AY_IX_32());
+}
+
+
+void m68k_op_suba_32_aw(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AW_32());
+}
+
+
+void m68k_op_suba_32_al(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_AL_32());
+}
+
+
+void m68k_op_suba_32_pcdi(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_PCDI_32());
+}
+
+
+void m68k_op_suba_32_pcix(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_PCIX_32());
+}
+
+
+void m68k_op_suba_32_i(void)
+{
+ uint* r_dst = &AX;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - OPER_I_32());
+}
+
+
+void m68k_op_subi_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_8();
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_subi_8_ai(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_pi(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_pi7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_pd(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_pd7(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_di(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_ix(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_aw(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_8_al(void)
+{
+ uint src = OPER_I_8();
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_16();
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_subi_16_ai(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_AI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_pi(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_pd(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_di(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_DI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_ix(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AY_IX_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_aw(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AW_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_16_al(void)
+{
+ uint src = OPER_I_16();
+ uint ea = EA_AL_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = OPER_I_32();
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_subi_32_ai(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_AI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_pi(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_pd(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_di(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_DI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_ix(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AY_IX_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_aw(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AW_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subi_32_al(void)
+{
+ uint src = OPER_I_32();
+ uint ea = EA_AL_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_subq_8_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_pi7(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_pd7(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_8_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = MASK_OUT_ABOVE_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ m68ki_write_8(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;
+}
+
+
+void m68k_op_subq_16_a(void)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
+}
+
+
+void m68k_op_subq_16_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_16_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = MASK_OUT_ABOVE_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ m68ki_write_16(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_d(void)
+{
+ uint* r_dst = &DY;
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint dst = *r_dst;
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ *r_dst = FLAG_Z;
+}
+
+
+void m68k_op_subq_32_a(void)
+{
+ uint* r_dst = &AY;
+
+ *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));
+}
+
+
+void m68k_op_subq_32_ai(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_AI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_pi(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_pd(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_di(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_DI_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_ix(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AY_IX_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_aw(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AW_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subq_32_al(void)
+{
+ uint src = (((REG_IR >> 9) - 1) & 7) + 1;
+ uint ea = EA_AL_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = MASK_OUT_ABOVE_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ m68ki_write_32(ea, FLAG_Z);
+}
+
+
+void m68k_op_subx_8_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_8(DY);
+ uint dst = MASK_OUT_ABOVE_8(*r_dst);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;
+}
+
+
+void m68k_op_subx_16_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = MASK_OUT_ABOVE_16(DY);
+ uint dst = MASK_OUT_ABOVE_16(*r_dst);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;
+}
+
+
+void m68k_op_subx_32_rr(void)
+{
+ uint* r_dst = &DX;
+ uint src = DY;
+ uint dst = *r_dst;
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ *r_dst = res;
+}
+
+
+void m68k_op_subx_8_mm_ax7(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_subx_8_mm_ay7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_subx_8_mm_axy7(void)
+{
+ uint src = OPER_A7_PD_8();
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_subx_8_mm(void)
+{
+ uint src = OPER_AY_PD_8();
+ uint ea = EA_AX_PD_8();
+ uint dst = m68ki_read_8(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_X = FLAG_C = CFLAG_8(res);
+ FLAG_V = VFLAG_SUB_8(src, dst, res);
+
+ res = MASK_OUT_ABOVE_8(res);
+ FLAG_Z |= res;
+
+ m68ki_write_8(ea, res);
+}
+
+
+void m68k_op_subx_16_mm(void)
+{
+ uint src = OPER_AY_PD_16();
+ uint ea = EA_AX_PD_16();
+ uint dst = m68ki_read_16(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_X = FLAG_C = CFLAG_16(res);
+ FLAG_V = VFLAG_SUB_16(src, dst, res);
+
+ res = MASK_OUT_ABOVE_16(res);
+ FLAG_Z |= res;
+
+ m68ki_write_16(ea, res);
+}
+
+
+void m68k_op_subx_32_mm(void)
+{
+ uint src = OPER_AY_PD_32();
+ uint ea = EA_AX_PD_32();
+ uint dst = m68ki_read_32(ea);
+ uint res = dst - src - XFLAG_AS_1();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);
+ FLAG_V = VFLAG_SUB_32(src, dst, res);
+
+ res = MASK_OUT_ABOVE_32(res);
+ FLAG_Z |= res;
+
+ m68ki_write_32(ea, res);
+}
+
+
+void m68k_op_swap_32(void)
+{
+ uint* r_dst = &DY;
+
+ FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16);
+ *r_dst = (*r_dst>>16) | FLAG_Z;
+
+ FLAG_Z = *r_dst;
+ FLAG_N = NFLAG_32(*r_dst);
+ FLAG_C = CFLAG_CLEAR;
+ FLAG_V = VFLAG_CLEAR;
+}
+
+
+void m68k_op_tas_8_d(void)
+{
+ uint* r_dst = &DY;
+
+ FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);
+ FLAG_N = NFLAG_8(*r_dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ *r_dst |= 0x80;
+}
+
+
+void m68k_op_tas_8_ai(void)
+{
+ uint ea = EA_AY_AI_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_pi(void)
+{
+ uint ea = EA_AY_PI_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_pi7(void)
+{
+ uint ea = EA_A7_PI_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_pd(void)
+{
+ uint ea = EA_AY_PD_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_pd7(void)
+{
+ uint ea = EA_A7_PD_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_di(void)
+{
+ uint ea = EA_AY_DI_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_ix(void)
+{
+ uint ea = EA_AY_IX_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_aw(void)
+{
+ uint ea = EA_AW_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_tas_8_al(void)
+{
+ uint ea = EA_AL_8();
+ uint dst = m68ki_read_8(ea);
+
+ FLAG_Z = dst;
+ FLAG_N = NFLAG_8(dst);
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ m68ki_write_8(ea, dst | 0x80);
+}
+
+
+void m68k_op_trap(void)
+{
+ /* Trap#n stacks exception frame type 0 */
+ m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf)); /* HJB 990403 */
+}
+
+
+void m68k_op_trapt(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapt_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapt_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapf(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapf_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapf_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traphi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_HI())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapls(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LS())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcc(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CC())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcs(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CS())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapne(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_NE())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapeq(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_EQ())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvc(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VC())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvs(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VS())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trappl(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_PL())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapmi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_MI())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapge(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GE())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traplt(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LT())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapgt(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GT())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traple(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LE())
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traphi_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_HI())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapls_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcc_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CC())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcs_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapne_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_NE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapeq_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_EQ())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvc_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VC())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvs_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trappl_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_PL())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapmi_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_MI())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapge_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traplt_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LT())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapgt_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GT())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traple_16(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 2;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traphi_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_HI())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapls_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CC())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapcs_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_CS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapne_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_NE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapeq_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_EQ())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvc_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VC())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapvs_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_VS())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trappl_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_PL())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapmi_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_MI())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapge_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traplt_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LT())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapgt_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_GT())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_traple_32(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ if(COND_LE())
+ {
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+ return;
+ }
+ REG_PC += 4;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_trapv(void)
+{
+ if(COND_VC())
+ {
+ return;
+ }
+ m68ki_exception_trap(EXCEPTION_TRAPV); /* HJB 990403 */
+}
+
+
+void m68k_op_tst_8_d(void)
+{
+ uint res = MASK_OUT_ABOVE_8(DY);
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_ai(void)
+{
+ uint res = OPER_AY_AI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_pi(void)
+{
+ uint res = OPER_AY_PI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_pi7(void)
+{
+ uint res = OPER_A7_PI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_pd(void)
+{
+ uint res = OPER_AY_PD_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_pd7(void)
+{
+ uint res = OPER_A7_PD_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_di(void)
+{
+ uint res = OPER_AY_DI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_ix(void)
+{
+ uint res = OPER_AY_IX_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_aw(void)
+{
+ uint res = OPER_AW_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_al(void)
+{
+ uint res = OPER_AL_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_8_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_8_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_8_i(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_8();
+
+ FLAG_N = NFLAG_8(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_16_d(void)
+{
+ uint res = MASK_OUT_ABOVE_16(DY);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_a(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = MAKE_INT_16(AY);
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_16_ai(void)
+{
+ uint res = OPER_AY_AI_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_pi(void)
+{
+ uint res = OPER_AY_PI_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_pd(void)
+{
+ uint res = OPER_AY_PD_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_di(void)
+{
+ uint res = OPER_AY_DI_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_ix(void)
+{
+ uint res = OPER_AY_IX_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_aw(void)
+{
+ uint res = OPER_AW_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_al(void)
+{
+ uint res = OPER_AL_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_16_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_16_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_16_i(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_16();
+
+ FLAG_N = NFLAG_16(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_32_d(void)
+{
+ uint res = DY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_a(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = AY;
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_32_ai(void)
+{
+ uint res = OPER_AY_AI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_pi(void)
+{
+ uint res = OPER_AY_PI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_pd(void)
+{
+ uint res = OPER_AY_PD_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_di(void)
+{
+ uint res = OPER_AY_DI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_ix(void)
+{
+ uint res = OPER_AY_IX_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_aw(void)
+{
+ uint res = OPER_AW_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_al(void)
+{
+ uint res = OPER_AL_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+}
+
+
+void m68k_op_tst_32_pcdi(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCDI_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_32_pcix(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_PCIX_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_tst_32_i(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint res = OPER_I_32();
+
+ FLAG_N = NFLAG_32(res);
+ FLAG_Z = res;
+ FLAG_V = VFLAG_CLEAR;
+ FLAG_C = CFLAG_CLEAR;
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_unlk_32_a7(void)
+{
+ REG_A[7] = m68ki_read_32(REG_A[7]);
+}
+
+
+void m68k_op_unlk_32(void)
+{
+ uint* r_dst = &AY;
+
+ REG_A[7] = *r_dst;
+ *r_dst = m68ki_pull_32();
+}
+
+
+void m68k_op_unpk_16_rr(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: DX and DY are reversed in Motorola's docs */
+ uint src = DY;
+ uint* r_dst = &DX;
+
+ *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_unpk_16_mm_ax7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_AY_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_unpk_16_mm_ay7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_A7_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_unpk_16_mm_axy7(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ uint src = OPER_A7_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_A7_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+void m68k_op_unpk_16_mm(void)
+{
+ if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))
+ {
+ /* Note: AX and AY are reversed in Motorola's docs */
+ uint src = OPER_AY_PD_8();
+ uint ea_dst;
+
+ src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, (src >> 8) & 0xff);
+ ea_dst = EA_AX_PD_8();
+ m68ki_write_8(ea_dst, src & 0xff);
+ return;
+ }
+ m68ki_exception_illegal();
+}
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
diff --git a/plugins/ao/eng_ssf/m68kops.c b/plugins/ao/eng_ssf/m68kops.c
new file mode 100644
index 00000000..23613c73
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kops.c
@@ -0,0 +1,2093 @@
+/* ======================================================================== */
+/* ========================= OPCODE TABLE BUILDER ========================= */
+/* ======================================================================== */
+
+#include "m68kops.h"
+
+#define NUM_CPU_TYPES 3
+
+void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
+unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */
+
+/* This is used to generate the opcode handler jump table */
+typedef struct
+{
+ void (*opcode_handler)(void); /* handler function */
+ unsigned int mask; /* mask on opcode */
+ unsigned int match; /* what to match after masking */
+ unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */
+} opcode_handler_struct;
+
+
+/* Opcode handler table */
+static opcode_handler_struct m68k_opcode_handler_table[] =
+{
+/* function mask match 000 010 020 */
+ {m68k_op_1010 , 0xf000, 0xa000, { 4, 4, 4}},
+ {m68k_op_1111 , 0xf000, 0xf000, { 4, 4, 4}},
+ {m68k_op_moveq_32 , 0xf100, 0x7000, { 4, 4, 2}},
+ {m68k_op_cpbcc_32 , 0xf180, 0xf080, { 0, 0, 4}},
+ {m68k_op_cpgen_32 , 0xf1c0, 0xf000, { 0, 0, 4}},
+ {m68k_op_cpscc_32 , 0xf1c0, 0xf040, { 0, 0, 4}},
+ {m68k_op_bra_8 , 0xff00, 0x6000, { 10, 10, 10}},
+ {m68k_op_bsr_8 , 0xff00, 0x6100, { 18, 18, 7}},
+ {m68k_op_bhi_8 , 0xff00, 0x6200, { 8, 8, 6}},
+ {m68k_op_bls_8 , 0xff00, 0x6300, { 8, 8, 6}},
+ {m68k_op_bcc_8 , 0xff00, 0x6400, { 8, 8, 6}},
+ {m68k_op_bcs_8 , 0xff00, 0x6500, { 8, 8, 6}},
+ {m68k_op_bne_8 , 0xff00, 0x6600, { 8, 8, 6}},
+ {m68k_op_beq_8 , 0xff00, 0x6700, { 8, 8, 6}},
+ {m68k_op_bvc_8 , 0xff00, 0x6800, { 8, 8, 6}},
+ {m68k_op_bvs_8 , 0xff00, 0x6900, { 8, 8, 6}},
+ {m68k_op_bpl_8 , 0xff00, 0x6a00, { 8, 8, 6}},
+ {m68k_op_bmi_8 , 0xff00, 0x6b00, { 8, 8, 6}},
+ {m68k_op_bge_8 , 0xff00, 0x6c00, { 8, 8, 6}},
+ {m68k_op_blt_8 , 0xff00, 0x6d00, { 8, 8, 6}},
+ {m68k_op_bgt_8 , 0xff00, 0x6e00, { 8, 8, 6}},
+ {m68k_op_ble_8 , 0xff00, 0x6f00, { 8, 8, 6}},
+ {m68k_op_btst_32_r_d , 0xf1f8, 0x0100, { 6, 6, 4}},
+ {m68k_op_movep_16_er , 0xf1f8, 0x0108, { 16, 16, 12}},
+ {m68k_op_btst_8_r_ai , 0xf1f8, 0x0110, { 8, 8, 8}},
+ {m68k_op_btst_8_r_pi , 0xf1f8, 0x0118, { 8, 8, 8}},
+ {m68k_op_btst_8_r_pd , 0xf1f8, 0x0120, { 10, 10, 9}},
+ {m68k_op_btst_8_r_di , 0xf1f8, 0x0128, { 12, 12, 9}},
+ {m68k_op_btst_8_r_ix , 0xf1f8, 0x0130, { 14, 14, 11}},
+ {m68k_op_bchg_32_r_d , 0xf1f8, 0x0140, { 8, 8, 4}},
+ {m68k_op_movep_32_er , 0xf1f8, 0x0148, { 24, 24, 18}},
+ {m68k_op_bchg_8_r_ai , 0xf1f8, 0x0150, { 12, 12, 8}},
+ {m68k_op_bchg_8_r_pi , 0xf1f8, 0x0158, { 12, 12, 8}},
+ {m68k_op_bchg_8_r_pd , 0xf1f8, 0x0160, { 14, 14, 9}},
+ {m68k_op_bchg_8_r_di , 0xf1f8, 0x0168, { 16, 16, 9}},
+ {m68k_op_bchg_8_r_ix , 0xf1f8, 0x0170, { 18, 18, 11}},
+ {m68k_op_bclr_32_r_d , 0xf1f8, 0x0180, { 10, 10, 4}},
+ {m68k_op_movep_16_re , 0xf1f8, 0x0188, { 16, 16, 11}},
+ {m68k_op_bclr_8_r_ai , 0xf1f8, 0x0190, { 12, 14, 8}},
+ {m68k_op_bclr_8_r_pi , 0xf1f8, 0x0198, { 12, 14, 8}},
+ {m68k_op_bclr_8_r_pd , 0xf1f8, 0x01a0, { 14, 16, 9}},
+ {m68k_op_bclr_8_r_di , 0xf1f8, 0x01a8, { 16, 18, 9}},
+ {m68k_op_bclr_8_r_ix , 0xf1f8, 0x01b0, { 18, 20, 11}},
+ {m68k_op_bset_32_r_d , 0xf1f8, 0x01c0, { 8, 8, 4}},
+ {m68k_op_movep_32_re , 0xf1f8, 0x01c8, { 24, 24, 17}},
+ {m68k_op_bset_8_r_ai , 0xf1f8, 0x01d0, { 12, 12, 8}},
+ {m68k_op_bset_8_r_pi , 0xf1f8, 0x01d8, { 12, 12, 8}},
+ {m68k_op_bset_8_r_pd , 0xf1f8, 0x01e0, { 14, 14, 9}},
+ {m68k_op_bset_8_r_di , 0xf1f8, 0x01e8, { 16, 16, 9}},
+ {m68k_op_bset_8_r_ix , 0xf1f8, 0x01f0, { 18, 18, 11}},
+ {m68k_op_move_8_d_d , 0xf1f8, 0x1000, { 4, 4, 2}},
+ {m68k_op_move_8_d_ai , 0xf1f8, 0x1010, { 8, 8, 6}},
+ {m68k_op_move_8_d_pi , 0xf1f8, 0x1018, { 8, 8, 6}},
+ {m68k_op_move_8_d_pd , 0xf1f8, 0x1020, { 10, 10, 7}},
+ {m68k_op_move_8_d_di , 0xf1f8, 0x1028, { 12, 12, 7}},
+ {m68k_op_move_8_d_ix , 0xf1f8, 0x1030, { 14, 14, 9}},
+ {m68k_op_move_8_ai_d , 0xf1f8, 0x1080, { 8, 8, 4}},
+ {m68k_op_move_8_ai_ai , 0xf1f8, 0x1090, { 12, 12, 8}},
+ {m68k_op_move_8_ai_pi , 0xf1f8, 0x1098, { 12, 12, 8}},
+ {m68k_op_move_8_ai_pd , 0xf1f8, 0x10a0, { 14, 14, 9}},
+ {m68k_op_move_8_ai_di , 0xf1f8, 0x10a8, { 16, 16, 9}},
+ {m68k_op_move_8_ai_ix , 0xf1f8, 0x10b0, { 18, 18, 11}},
+ {m68k_op_move_8_pi_d , 0xf1f8, 0x10c0, { 8, 8, 4}},
+ {m68k_op_move_8_pi_ai , 0xf1f8, 0x10d0, { 12, 12, 8}},
+ {m68k_op_move_8_pi_pi , 0xf1f8, 0x10d8, { 12, 12, 8}},
+ {m68k_op_move_8_pi_pd , 0xf1f8, 0x10e0, { 14, 14, 9}},
+ {m68k_op_move_8_pi_di , 0xf1f8, 0x10e8, { 16, 16, 9}},
+ {m68k_op_move_8_pi_ix , 0xf1f8, 0x10f0, { 18, 18, 11}},
+ {m68k_op_move_8_pd_d , 0xf1f8, 0x1100, { 8, 8, 5}},
+ {m68k_op_move_8_pd_ai , 0xf1f8, 0x1110, { 12, 12, 9}},
+ {m68k_op_move_8_pd_pi , 0xf1f8, 0x1118, { 12, 12, 9}},
+ {m68k_op_move_8_pd_pd , 0xf1f8, 0x1120, { 14, 14, 10}},
+ {m68k_op_move_8_pd_di , 0xf1f8, 0x1128, { 16, 16, 10}},
+ {m68k_op_move_8_pd_ix , 0xf1f8, 0x1130, { 18, 18, 12}},
+ {m68k_op_move_8_di_d , 0xf1f8, 0x1140, { 12, 12, 5}},
+ {m68k_op_move_8_di_ai , 0xf1f8, 0x1150, { 16, 16, 9}},
+ {m68k_op_move_8_di_pi , 0xf1f8, 0x1158, { 16, 16, 9}},
+ {m68k_op_move_8_di_pd , 0xf1f8, 0x1160, { 18, 18, 10}},
+ {m68k_op_move_8_di_di , 0xf1f8, 0x1168, { 20, 20, 10}},
+ {m68k_op_move_8_di_ix , 0xf1f8, 0x1170, { 22, 22, 12}},
+ {m68k_op_move_8_ix_d , 0xf1f8, 0x1180, { 14, 14, 7}},
+ {m68k_op_move_8_ix_ai , 0xf1f8, 0x1190, { 18, 18, 11}},
+ {m68k_op_move_8_ix_pi , 0xf1f8, 0x1198, { 18, 18, 11}},
+ {m68k_op_move_8_ix_pd , 0xf1f8, 0x11a0, { 20, 20, 12}},
+ {m68k_op_move_8_ix_di , 0xf1f8, 0x11a8, { 22, 22, 12}},
+ {m68k_op_move_8_ix_ix , 0xf1f8, 0x11b0, { 24, 24, 14}},
+ {m68k_op_move_32_d_d , 0xf1f8, 0x2000, { 4, 4, 2}},
+ {m68k_op_move_32_d_a , 0xf1f8, 0x2008, { 4, 4, 2}},
+ {m68k_op_move_32_d_ai , 0xf1f8, 0x2010, { 12, 12, 6}},
+ {m68k_op_move_32_d_pi , 0xf1f8, 0x2018, { 12, 12, 6}},
+ {m68k_op_move_32_d_pd , 0xf1f8, 0x2020, { 14, 14, 7}},
+ {m68k_op_move_32_d_di , 0xf1f8, 0x2028, { 16, 16, 7}},
+ {m68k_op_move_32_d_ix , 0xf1f8, 0x2030, { 18, 18, 9}},
+ {m68k_op_movea_32_d , 0xf1f8, 0x2040, { 4, 4, 2}},
+ {m68k_op_movea_32_a , 0xf1f8, 0x2048, { 4, 4, 2}},
+ {m68k_op_movea_32_ai , 0xf1f8, 0x2050, { 12, 12, 6}},
+ {m68k_op_movea_32_pi , 0xf1f8, 0x2058, { 12, 12, 6}},
+ {m68k_op_movea_32_pd , 0xf1f8, 0x2060, { 14, 14, 7}},
+ {m68k_op_movea_32_di , 0xf1f8, 0x2068, { 16, 16, 7}},
+ {m68k_op_movea_32_ix , 0xf1f8, 0x2070, { 18, 18, 9}},
+ {m68k_op_move_32_ai_d , 0xf1f8, 0x2080, { 12, 12, 4}},
+ {m68k_op_move_32_ai_a , 0xf1f8, 0x2088, { 12, 12, 4}},
+ {m68k_op_move_32_ai_ai , 0xf1f8, 0x2090, { 20, 20, 8}},
+ {m68k_op_move_32_ai_pi , 0xf1f8, 0x2098, { 20, 20, 8}},
+ {m68k_op_move_32_ai_pd , 0xf1f8, 0x20a0, { 22, 22, 9}},
+ {m68k_op_move_32_ai_di , 0xf1f8, 0x20a8, { 24, 24, 9}},
+ {m68k_op_move_32_ai_ix , 0xf1f8, 0x20b0, { 26, 26, 11}},
+ {m68k_op_move_32_pi_d , 0xf1f8, 0x20c0, { 12, 12, 4}},
+ {m68k_op_move_32_pi_a , 0xf1f8, 0x20c8, { 12, 12, 4}},
+ {m68k_op_move_32_pi_ai , 0xf1f8, 0x20d0, { 20, 20, 8}},
+ {m68k_op_move_32_pi_pi , 0xf1f8, 0x20d8, { 20, 20, 8}},
+ {m68k_op_move_32_pi_pd , 0xf1f8, 0x20e0, { 22, 22, 9}},
+ {m68k_op_move_32_pi_di , 0xf1f8, 0x20e8, { 24, 24, 9}},
+ {m68k_op_move_32_pi_ix , 0xf1f8, 0x20f0, { 26, 26, 11}},
+ {m68k_op_move_32_pd_d , 0xf1f8, 0x2100, { 12, 14, 5}},
+ {m68k_op_move_32_pd_a , 0xf1f8, 0x2108, { 12, 14, 5}},
+ {m68k_op_move_32_pd_ai , 0xf1f8, 0x2110, { 20, 22, 9}},
+ {m68k_op_move_32_pd_pi , 0xf1f8, 0x2118, { 20, 22, 9}},
+ {m68k_op_move_32_pd_pd , 0xf1f8, 0x2120, { 22, 24, 10}},
+ {m68k_op_move_32_pd_di , 0xf1f8, 0x2128, { 24, 26, 10}},
+ {m68k_op_move_32_pd_ix , 0xf1f8, 0x2130, { 26, 28, 12}},
+ {m68k_op_move_32_di_d , 0xf1f8, 0x2140, { 16, 16, 5}},
+ {m68k_op_move_32_di_a , 0xf1f8, 0x2148, { 16, 16, 5}},
+ {m68k_op_move_32_di_ai , 0xf1f8, 0x2150, { 24, 24, 9}},
+ {m68k_op_move_32_di_pi , 0xf1f8, 0x2158, { 24, 24, 9}},
+ {m68k_op_move_32_di_pd , 0xf1f8, 0x2160, { 26, 26, 10}},
+ {m68k_op_move_32_di_di , 0xf1f8, 0x2168, { 28, 28, 10}},
+ {m68k_op_move_32_di_ix , 0xf1f8, 0x2170, { 30, 30, 12}},
+ {m68k_op_move_32_ix_d , 0xf1f8, 0x2180, { 18, 18, 7}},
+ {m68k_op_move_32_ix_a , 0xf1f8, 0x2188, { 18, 18, 7}},
+ {m68k_op_move_32_ix_ai , 0xf1f8, 0x2190, { 26, 26, 11}},
+ {m68k_op_move_32_ix_pi , 0xf1f8, 0x2198, { 26, 26, 11}},
+ {m68k_op_move_32_ix_pd , 0xf1f8, 0x21a0, { 28, 28, 12}},
+ {m68k_op_move_32_ix_di , 0xf1f8, 0x21a8, { 30, 30, 12}},
+ {m68k_op_move_32_ix_ix , 0xf1f8, 0x21b0, { 32, 32, 14}},
+ {m68k_op_move_16_d_d , 0xf1f8, 0x3000, { 4, 4, 2}},
+ {m68k_op_move_16_d_a , 0xf1f8, 0x3008, { 4, 4, 2}},
+ {m68k_op_move_16_d_ai , 0xf1f8, 0x3010, { 8, 8, 6}},
+ {m68k_op_move_16_d_pi , 0xf1f8, 0x3018, { 8, 8, 6}},
+ {m68k_op_move_16_d_pd , 0xf1f8, 0x3020, { 10, 10, 7}},
+ {m68k_op_move_16_d_di , 0xf1f8, 0x3028, { 12, 12, 7}},
+ {m68k_op_move_16_d_ix , 0xf1f8, 0x3030, { 14, 14, 9}},
+ {m68k_op_movea_16_d , 0xf1f8, 0x3040, { 4, 4, 2}},
+ {m68k_op_movea_16_a , 0xf1f8, 0x3048, { 4, 4, 2}},
+ {m68k_op_movea_16_ai , 0xf1f8, 0x3050, { 8, 8, 6}},
+ {m68k_op_movea_16_pi , 0xf1f8, 0x3058, { 8, 8, 6}},
+ {m68k_op_movea_16_pd , 0xf1f8, 0x3060, { 10, 10, 7}},
+ {m68k_op_movea_16_di , 0xf1f8, 0x3068, { 12, 12, 7}},
+ {m68k_op_movea_16_ix , 0xf1f8, 0x3070, { 14, 14, 9}},
+ {m68k_op_move_16_ai_d , 0xf1f8, 0x3080, { 8, 8, 4}},
+ {m68k_op_move_16_ai_a , 0xf1f8, 0x3088, { 8, 8, 4}},
+ {m68k_op_move_16_ai_ai , 0xf1f8, 0x3090, { 12, 12, 8}},
+ {m68k_op_move_16_ai_pi , 0xf1f8, 0x3098, { 12, 12, 8}},
+ {m68k_op_move_16_ai_pd , 0xf1f8, 0x30a0, { 14, 14, 9}},
+ {m68k_op_move_16_ai_di , 0xf1f8, 0x30a8, { 16, 16, 9}},
+ {m68k_op_move_16_ai_ix , 0xf1f8, 0x30b0, { 18, 18, 11}},
+ {m68k_op_move_16_pi_d , 0xf1f8, 0x30c0, { 8, 8, 4}},
+ {m68k_op_move_16_pi_a , 0xf1f8, 0x30c8, { 8, 8, 4}},
+ {m68k_op_move_16_pi_ai , 0xf1f8, 0x30d0, { 12, 12, 8}},
+ {m68k_op_move_16_pi_pi , 0xf1f8, 0x30d8, { 12, 12, 8}},
+ {m68k_op_move_16_pi_pd , 0xf1f8, 0x30e0, { 14, 14, 9}},
+ {m68k_op_move_16_pi_di , 0xf1f8, 0x30e8, { 16, 16, 9}},
+ {m68k_op_move_16_pi_ix , 0xf1f8, 0x30f0, { 18, 18, 11}},
+ {m68k_op_move_16_pd_d , 0xf1f8, 0x3100, { 8, 8, 5}},
+ {m68k_op_move_16_pd_a , 0xf1f8, 0x3108, { 8, 8, 5}},
+ {m68k_op_move_16_pd_ai , 0xf1f8, 0x3110, { 12, 12, 9}},
+ {m68k_op_move_16_pd_pi , 0xf1f8, 0x3118, { 12, 12, 9}},
+ {m68k_op_move_16_pd_pd , 0xf1f8, 0x3120, { 14, 14, 10}},
+ {m68k_op_move_16_pd_di , 0xf1f8, 0x3128, { 16, 16, 10}},
+ {m68k_op_move_16_pd_ix , 0xf1f8, 0x3130, { 18, 18, 12}},
+ {m68k_op_move_16_di_d , 0xf1f8, 0x3140, { 12, 12, 5}},
+ {m68k_op_move_16_di_a , 0xf1f8, 0x3148, { 12, 12, 5}},
+ {m68k_op_move_16_di_ai , 0xf1f8, 0x3150, { 16, 16, 9}},
+ {m68k_op_move_16_di_pi , 0xf1f8, 0x3158, { 16, 16, 9}},
+ {m68k_op_move_16_di_pd , 0xf1f8, 0x3160, { 18, 18, 10}},
+ {m68k_op_move_16_di_di , 0xf1f8, 0x3168, { 20, 20, 10}},
+ {m68k_op_move_16_di_ix , 0xf1f8, 0x3170, { 22, 22, 12}},
+ {m68k_op_move_16_ix_d , 0xf1f8, 0x3180, { 14, 14, 7}},
+ {m68k_op_move_16_ix_a , 0xf1f8, 0x3188, { 14, 14, 7}},
+ {m68k_op_move_16_ix_ai , 0xf1f8, 0x3190, { 18, 18, 11}},
+ {m68k_op_move_16_ix_pi , 0xf1f8, 0x3198, { 18, 18, 11}},
+ {m68k_op_move_16_ix_pd , 0xf1f8, 0x31a0, { 20, 20, 12}},
+ {m68k_op_move_16_ix_di , 0xf1f8, 0x31a8, { 22, 22, 12}},
+ {m68k_op_move_16_ix_ix , 0xf1f8, 0x31b0, { 24, 24, 14}},
+ {m68k_op_chk_32_d , 0xf1f8, 0x4100, { 0, 0, 8}},
+ {m68k_op_chk_32_ai , 0xf1f8, 0x4110, { 0, 0, 12}},
+ {m68k_op_chk_32_pi , 0xf1f8, 0x4118, { 0, 0, 12}},
+ {m68k_op_chk_32_pd , 0xf1f8, 0x4120, { 0, 0, 13}},
+ {m68k_op_chk_32_di , 0xf1f8, 0x4128, { 0, 0, 13}},
+ {m68k_op_chk_32_ix , 0xf1f8, 0x4130, { 0, 0, 15}},
+ {m68k_op_chk_16_d , 0xf1f8, 0x4180, { 10, 8, 8}},
+ {m68k_op_chk_16_ai , 0xf1f8, 0x4190, { 14, 12, 12}},
+ {m68k_op_chk_16_pi , 0xf1f8, 0x4198, { 14, 12, 12}},
+ {m68k_op_chk_16_pd , 0xf1f8, 0x41a0, { 16, 14, 13}},
+ {m68k_op_chk_16_di , 0xf1f8, 0x41a8, { 18, 16, 13}},
+ {m68k_op_chk_16_ix , 0xf1f8, 0x41b0, { 20, 18, 15}},
+ {m68k_op_lea_32_ai , 0xf1f8, 0x41d0, { 4, 4, 6}},
+ {m68k_op_lea_32_di , 0xf1f8, 0x41e8, { 8, 8, 7}},
+ {m68k_op_lea_32_ix , 0xf1f8, 0x41f0, { 12, 12, 9}},
+ {m68k_op_addq_8_d , 0xf1f8, 0x5000, { 4, 4, 2}},
+ {m68k_op_addq_8_ai , 0xf1f8, 0x5010, { 12, 12, 8}},
+ {m68k_op_addq_8_pi , 0xf1f8, 0x5018, { 12, 12, 8}},
+ {m68k_op_addq_8_pd , 0xf1f8, 0x5020, { 14, 14, 9}},
+ {m68k_op_addq_8_di , 0xf1f8, 0x5028, { 16, 16, 9}},
+ {m68k_op_addq_8_ix , 0xf1f8, 0x5030, { 18, 18, 11}},
+ {m68k_op_addq_16_d , 0xf1f8, 0x5040, { 4, 4, 2}},
+ {m68k_op_addq_16_a , 0xf1f8, 0x5048, { 4, 4, 2}},
+ {m68k_op_addq_16_ai , 0xf1f8, 0x5050, { 12, 12, 8}},
+ {m68k_op_addq_16_pi , 0xf1f8, 0x5058, { 12, 12, 8}},
+ {m68k_op_addq_16_pd , 0xf1f8, 0x5060, { 14, 14, 9}},
+ {m68k_op_addq_16_di , 0xf1f8, 0x5068, { 16, 16, 9}},
+ {m68k_op_addq_16_ix , 0xf1f8, 0x5070, { 18, 18, 11}},
+ {m68k_op_addq_32_d , 0xf1f8, 0x5080, { 8, 8, 2}},
+ {m68k_op_addq_32_a , 0xf1f8, 0x5088, { 8, 8, 2}},
+ {m68k_op_addq_32_ai , 0xf1f8, 0x5090, { 20, 20, 8}},
+ {m68k_op_addq_32_pi , 0xf1f8, 0x5098, { 20, 20, 8}},
+ {m68k_op_addq_32_pd , 0xf1f8, 0x50a0, { 22, 22, 9}},
+ {m68k_op_addq_32_di , 0xf1f8, 0x50a8, { 24, 24, 9}},
+ {m68k_op_addq_32_ix , 0xf1f8, 0x50b0, { 26, 26, 11}},
+ {m68k_op_subq_8_d , 0xf1f8, 0x5100, { 4, 4, 2}},
+ {m68k_op_subq_8_ai , 0xf1f8, 0x5110, { 12, 12, 8}},
+ {m68k_op_subq_8_pi , 0xf1f8, 0x5118, { 12, 12, 8}},
+ {m68k_op_subq_8_pd , 0xf1f8, 0x5120, { 14, 14, 9}},
+ {m68k_op_subq_8_di , 0xf1f8, 0x5128, { 16, 16, 9}},
+ {m68k_op_subq_8_ix , 0xf1f8, 0x5130, { 18, 18, 11}},
+ {m68k_op_subq_16_d , 0xf1f8, 0x5140, { 4, 4, 2}},
+ {m68k_op_subq_16_a , 0xf1f8, 0x5148, { 8, 4, 2}},
+ {m68k_op_subq_16_ai , 0xf1f8, 0x5150, { 12, 12, 8}},
+ {m68k_op_subq_16_pi , 0xf1f8, 0x5158, { 12, 12, 8}},
+ {m68k_op_subq_16_pd , 0xf1f8, 0x5160, { 14, 14, 9}},
+ {m68k_op_subq_16_di , 0xf1f8, 0x5168, { 16, 16, 9}},
+ {m68k_op_subq_16_ix , 0xf1f8, 0x5170, { 18, 18, 11}},
+ {m68k_op_subq_32_d , 0xf1f8, 0x5180, { 8, 8, 2}},
+ {m68k_op_subq_32_a , 0xf1f8, 0x5188, { 8, 8, 2}},
+ {m68k_op_subq_32_ai , 0xf1f8, 0x5190, { 20, 20, 8}},
+ {m68k_op_subq_32_pi , 0xf1f8, 0x5198, { 20, 20, 8}},
+ {m68k_op_subq_32_pd , 0xf1f8, 0x51a0, { 22, 22, 9}},
+ {m68k_op_subq_32_di , 0xf1f8, 0x51a8, { 24, 24, 9}},
+ {m68k_op_subq_32_ix , 0xf1f8, 0x51b0, { 26, 26, 11}},
+ {m68k_op_or_8_er_d , 0xf1f8, 0x8000, { 4, 4, 2}},
+ {m68k_op_or_8_er_ai , 0xf1f8, 0x8010, { 8, 8, 6}},
+ {m68k_op_or_8_er_pi , 0xf1f8, 0x8018, { 8, 8, 6}},
+ {m68k_op_or_8_er_pd , 0xf1f8, 0x8020, { 10, 10, 7}},
+ {m68k_op_or_8_er_di , 0xf1f8, 0x8028, { 12, 12, 7}},
+ {m68k_op_or_8_er_ix , 0xf1f8, 0x8030, { 14, 14, 9}},
+ {m68k_op_or_16_er_d , 0xf1f8, 0x8040, { 4, 4, 2}},
+ {m68k_op_or_16_er_ai , 0xf1f8, 0x8050, { 8, 8, 6}},
+ {m68k_op_or_16_er_pi , 0xf1f8, 0x8058, { 8, 8, 6}},
+ {m68k_op_or_16_er_pd , 0xf1f8, 0x8060, { 10, 10, 7}},
+ {m68k_op_or_16_er_di , 0xf1f8, 0x8068, { 12, 12, 7}},
+ {m68k_op_or_16_er_ix , 0xf1f8, 0x8070, { 14, 14, 9}},
+ {m68k_op_or_32_er_d , 0xf1f8, 0x8080, { 6, 6, 2}},
+ {m68k_op_or_32_er_ai , 0xf1f8, 0x8090, { 14, 14, 6}},
+ {m68k_op_or_32_er_pi , 0xf1f8, 0x8098, { 14, 14, 6}},
+ {m68k_op_or_32_er_pd , 0xf1f8, 0x80a0, { 16, 16, 7}},
+ {m68k_op_or_32_er_di , 0xf1f8, 0x80a8, { 18, 18, 7}},
+ {m68k_op_or_32_er_ix , 0xf1f8, 0x80b0, { 20, 20, 9}},
+ {m68k_op_divu_16_d , 0xf1f8, 0x80c0, {140, 108, 44}},
+ {m68k_op_divu_16_ai , 0xf1f8, 0x80d0, {144, 112, 48}},
+ {m68k_op_divu_16_pi , 0xf1f8, 0x80d8, {144, 112, 48}},
+ {m68k_op_divu_16_pd , 0xf1f8, 0x80e0, {146, 114, 49}},
+ {m68k_op_divu_16_di , 0xf1f8, 0x80e8, {148, 116, 49}},
+ {m68k_op_divu_16_ix , 0xf1f8, 0x80f0, {150, 118, 51}},
+ {m68k_op_sbcd_8_rr , 0xf1f8, 0x8100, { 6, 6, 4}},
+ {m68k_op_sbcd_8_mm , 0xf1f8, 0x8108, { 18, 18, 16}},
+ {m68k_op_or_8_re_ai , 0xf1f8, 0x8110, { 12, 12, 8}},
+ {m68k_op_or_8_re_pi , 0xf1f8, 0x8118, { 12, 12, 8}},
+ {m68k_op_or_8_re_pd , 0xf1f8, 0x8120, { 14, 14, 9}},
+ {m68k_op_or_8_re_di , 0xf1f8, 0x8128, { 16, 16, 9}},
+ {m68k_op_or_8_re_ix , 0xf1f8, 0x8130, { 18, 18, 11}},
+ {m68k_op_pack_16_rr , 0xf1f8, 0x8140, { 0, 0, 6}},
+ {m68k_op_pack_16_mm , 0xf1f8, 0x8148, { 0, 0, 13}},
+ {m68k_op_or_16_re_ai , 0xf1f8, 0x8150, { 12, 12, 8}},
+ {m68k_op_or_16_re_pi , 0xf1f8, 0x8158, { 12, 12, 8}},
+ {m68k_op_or_16_re_pd , 0xf1f8, 0x8160, { 14, 14, 9}},
+ {m68k_op_or_16_re_di , 0xf1f8, 0x8168, { 16, 16, 9}},
+ {m68k_op_or_16_re_ix , 0xf1f8, 0x8170, { 18, 18, 11}},
+ {m68k_op_unpk_16_rr , 0xf1f8, 0x8180, { 0, 0, 8}},
+ {m68k_op_unpk_16_mm , 0xf1f8, 0x8188, { 0, 0, 13}},
+ {m68k_op_or_32_re_ai , 0xf1f8, 0x8190, { 20, 20, 8}},
+ {m68k_op_or_32_re_pi , 0xf1f8, 0x8198, { 20, 20, 8}},
+ {m68k_op_or_32_re_pd , 0xf1f8, 0x81a0, { 22, 22, 9}},
+ {m68k_op_or_32_re_di , 0xf1f8, 0x81a8, { 24, 24, 9}},
+ {m68k_op_or_32_re_ix , 0xf1f8, 0x81b0, { 26, 26, 11}},
+ {m68k_op_divs_16_d , 0xf1f8, 0x81c0, {158, 122, 56}},
+ {m68k_op_divs_16_ai , 0xf1f8, 0x81d0, {162, 126, 60}},
+ {m68k_op_divs_16_pi , 0xf1f8, 0x81d8, {162, 126, 60}},
+ {m68k_op_divs_16_pd , 0xf1f8, 0x81e0, {164, 128, 61}},
+ {m68k_op_divs_16_di , 0xf1f8, 0x81e8, {166, 130, 61}},
+ {m68k_op_divs_16_ix , 0xf1f8, 0x81f0, {168, 132, 63}},
+ {m68k_op_sub_8_er_d , 0xf1f8, 0x9000, { 4, 4, 2}},
+ {m68k_op_sub_8_er_ai , 0xf1f8, 0x9010, { 8, 8, 6}},
+ {m68k_op_sub_8_er_pi , 0xf1f8, 0x9018, { 8, 8, 6}},
+ {m68k_op_sub_8_er_pd , 0xf1f8, 0x9020, { 10, 10, 7}},
+ {m68k_op_sub_8_er_di , 0xf1f8, 0x9028, { 12, 12, 7}},
+ {m68k_op_sub_8_er_ix , 0xf1f8, 0x9030, { 14, 14, 9}},
+ {m68k_op_sub_16_er_d , 0xf1f8, 0x9040, { 4, 4, 2}},
+ {m68k_op_sub_16_er_a , 0xf1f8, 0x9048, { 4, 4, 2}},
+ {m68k_op_sub_16_er_ai , 0xf1f8, 0x9050, { 8, 8, 6}},
+ {m68k_op_sub_16_er_pi , 0xf1f8, 0x9058, { 8, 8, 6}},
+ {m68k_op_sub_16_er_pd , 0xf1f8, 0x9060, { 10, 10, 7}},
+ {m68k_op_sub_16_er_di , 0xf1f8, 0x9068, { 12, 12, 7}},
+ {m68k_op_sub_16_er_ix , 0xf1f8, 0x9070, { 14, 14, 9}},
+ {m68k_op_sub_32_er_d , 0xf1f8, 0x9080, { 6, 6, 2}},
+ {m68k_op_sub_32_er_a , 0xf1f8, 0x9088, { 6, 6, 2}},
+ {m68k_op_sub_32_er_ai , 0xf1f8, 0x9090, { 14, 14, 6}},
+ {m68k_op_sub_32_er_pi , 0xf1f8, 0x9098, { 14, 14, 6}},
+ {m68k_op_sub_32_er_pd , 0xf1f8, 0x90a0, { 16, 16, 7}},
+ {m68k_op_sub_32_er_di , 0xf1f8, 0x90a8, { 18, 18, 7}},
+ {m68k_op_sub_32_er_ix , 0xf1f8, 0x90b0, { 20, 20, 9}},
+ {m68k_op_suba_16_d , 0xf1f8, 0x90c0, { 8, 8, 2}},
+ {m68k_op_suba_16_a , 0xf1f8, 0x90c8, { 8, 8, 2}},
+ {m68k_op_suba_16_ai , 0xf1f8, 0x90d0, { 12, 12, 6}},
+ {m68k_op_suba_16_pi , 0xf1f8, 0x90d8, { 12, 12, 6}},
+ {m68k_op_suba_16_pd , 0xf1f8, 0x90e0, { 14, 14, 7}},
+ {m68k_op_suba_16_di , 0xf1f8, 0x90e8, { 16, 16, 7}},
+ {m68k_op_suba_16_ix , 0xf1f8, 0x90f0, { 18, 18, 9}},
+ {m68k_op_subx_8_rr , 0xf1f8, 0x9100, { 4, 4, 2}},
+ {m68k_op_subx_8_mm , 0xf1f8, 0x9108, { 18, 18, 12}},
+ {m68k_op_sub_8_re_ai , 0xf1f8, 0x9110, { 12, 12, 8}},
+ {m68k_op_sub_8_re_pi , 0xf1f8, 0x9118, { 12, 12, 8}},
+ {m68k_op_sub_8_re_pd , 0xf1f8, 0x9120, { 14, 14, 9}},
+ {m68k_op_sub_8_re_di , 0xf1f8, 0x9128, { 16, 16, 9}},
+ {m68k_op_sub_8_re_ix , 0xf1f8, 0x9130, { 18, 18, 11}},
+ {m68k_op_subx_16_rr , 0xf1f8, 0x9140, { 4, 4, 2}},
+ {m68k_op_subx_16_mm , 0xf1f8, 0x9148, { 18, 18, 12}},
+ {m68k_op_sub_16_re_ai , 0xf1f8, 0x9150, { 12, 12, 8}},
+ {m68k_op_sub_16_re_pi , 0xf1f8, 0x9158, { 12, 12, 8}},
+ {m68k_op_sub_16_re_pd , 0xf1f8, 0x9160, { 14, 14, 9}},
+ {m68k_op_sub_16_re_di , 0xf1f8, 0x9168, { 16, 16, 9}},
+ {m68k_op_sub_16_re_ix , 0xf1f8, 0x9170, { 18, 18, 11}},
+ {m68k_op_subx_32_rr , 0xf1f8, 0x9180, { 8, 6, 2}},
+ {m68k_op_subx_32_mm , 0xf1f8, 0x9188, { 30, 30, 12}},
+ {m68k_op_sub_32_re_ai , 0xf1f8, 0x9190, { 20, 20, 8}},
+ {m68k_op_sub_32_re_pi , 0xf1f8, 0x9198, { 20, 20, 8}},
+ {m68k_op_sub_32_re_pd , 0xf1f8, 0x91a0, { 22, 22, 9}},
+ {m68k_op_sub_32_re_di , 0xf1f8, 0x91a8, { 24, 24, 9}},
+ {m68k_op_sub_32_re_ix , 0xf1f8, 0x91b0, { 26, 26, 11}},
+ {m68k_op_suba_32_d , 0xf1f8, 0x91c0, { 6, 6, 2}},
+ {m68k_op_suba_32_a , 0xf1f8, 0x91c8, { 6, 6, 2}},
+ {m68k_op_suba_32_ai , 0xf1f8, 0x91d0, { 14, 14, 6}},
+ {m68k_op_suba_32_pi , 0xf1f8, 0x91d8, { 14, 14, 6}},
+ {m68k_op_suba_32_pd , 0xf1f8, 0x91e0, { 16, 16, 7}},
+ {m68k_op_suba_32_di , 0xf1f8, 0x91e8, { 18, 18, 7}},
+ {m68k_op_suba_32_ix , 0xf1f8, 0x91f0, { 20, 20, 9}},
+ {m68k_op_cmp_8_d , 0xf1f8, 0xb000, { 4, 4, 2}},
+ {m68k_op_cmp_8_ai , 0xf1f8, 0xb010, { 8, 8, 6}},
+ {m68k_op_cmp_8_pi , 0xf1f8, 0xb018, { 8, 8, 6}},
+ {m68k_op_cmp_8_pd , 0xf1f8, 0xb020, { 10, 10, 7}},
+ {m68k_op_cmp_8_di , 0xf1f8, 0xb028, { 12, 12, 7}},
+ {m68k_op_cmp_8_ix , 0xf1f8, 0xb030, { 14, 14, 9}},
+ {m68k_op_cmp_16_d , 0xf1f8, 0xb040, { 4, 4, 2}},
+ {m68k_op_cmp_16_a , 0xf1f8, 0xb048, { 4, 4, 2}},
+ {m68k_op_cmp_16_ai , 0xf1f8, 0xb050, { 8, 8, 6}},
+ {m68k_op_cmp_16_pi , 0xf1f8, 0xb058, { 8, 8, 6}},
+ {m68k_op_cmp_16_pd , 0xf1f8, 0xb060, { 10, 10, 7}},
+ {m68k_op_cmp_16_di , 0xf1f8, 0xb068, { 12, 12, 7}},
+ {m68k_op_cmp_16_ix , 0xf1f8, 0xb070, { 14, 14, 9}},
+ {m68k_op_cmp_32_d , 0xf1f8, 0xb080, { 6, 6, 2}},
+ {m68k_op_cmp_32_a , 0xf1f8, 0xb088, { 6, 6, 2}},
+ {m68k_op_cmp_32_ai , 0xf1f8, 0xb090, { 14, 14, 6}},
+ {m68k_op_cmp_32_pi , 0xf1f8, 0xb098, { 14, 14, 6}},
+ {m68k_op_cmp_32_pd , 0xf1f8, 0xb0a0, { 16, 16, 7}},
+ {m68k_op_cmp_32_di , 0xf1f8, 0xb0a8, { 18, 18, 7}},
+ {m68k_op_cmp_32_ix , 0xf1f8, 0xb0b0, { 20, 20, 9}},
+ {m68k_op_cmpa_16_d , 0xf1f8, 0xb0c0, { 6, 6, 4}},
+ {m68k_op_cmpa_16_a , 0xf1f8, 0xb0c8, { 6, 6, 4}},
+ {m68k_op_cmpa_16_ai , 0xf1f8, 0xb0d0, { 10, 10, 8}},
+ {m68k_op_cmpa_16_pi , 0xf1f8, 0xb0d8, { 10, 10, 8}},
+ {m68k_op_cmpa_16_pd , 0xf1f8, 0xb0e0, { 12, 12, 9}},
+ {m68k_op_cmpa_16_di , 0xf1f8, 0xb0e8, { 14, 14, 9}},
+ {m68k_op_cmpa_16_ix , 0xf1f8, 0xb0f0, { 16, 16, 11}},
+ {m68k_op_eor_8_d , 0xf1f8, 0xb100, { 4, 4, 2}},
+ {m68k_op_cmpm_8 , 0xf1f8, 0xb108, { 12, 12, 9}},
+ {m68k_op_eor_8_ai , 0xf1f8, 0xb110, { 12, 12, 8}},
+ {m68k_op_eor_8_pi , 0xf1f8, 0xb118, { 12, 12, 8}},
+ {m68k_op_eor_8_pd , 0xf1f8, 0xb120, { 14, 14, 9}},
+ {m68k_op_eor_8_di , 0xf1f8, 0xb128, { 16, 16, 9}},
+ {m68k_op_eor_8_ix , 0xf1f8, 0xb130, { 18, 18, 11}},
+ {m68k_op_eor_16_d , 0xf1f8, 0xb140, { 4, 4, 2}},
+ {m68k_op_cmpm_16 , 0xf1f8, 0xb148, { 12, 12, 9}},
+ {m68k_op_eor_16_ai , 0xf1f8, 0xb150, { 12, 12, 8}},
+ {m68k_op_eor_16_pi , 0xf1f8, 0xb158, { 12, 12, 8}},
+ {m68k_op_eor_16_pd , 0xf1f8, 0xb160, { 14, 14, 9}},
+ {m68k_op_eor_16_di , 0xf1f8, 0xb168, { 16, 16, 9}},
+ {m68k_op_eor_16_ix , 0xf1f8, 0xb170, { 18, 18, 11}},
+ {m68k_op_eor_32_d , 0xf1f8, 0xb180, { 8, 6, 2}},
+ {m68k_op_cmpm_32 , 0xf1f8, 0xb188, { 20, 20, 9}},
+ {m68k_op_eor_32_ai , 0xf1f8, 0xb190, { 20, 20, 8}},
+ {m68k_op_eor_32_pi , 0xf1f8, 0xb198, { 20, 20, 8}},
+ {m68k_op_eor_32_pd , 0xf1f8, 0xb1a0, { 22, 22, 9}},
+ {m68k_op_eor_32_di , 0xf1f8, 0xb1a8, { 24, 24, 9}},
+ {m68k_op_eor_32_ix , 0xf1f8, 0xb1b0, { 26, 26, 11}},
+ {m68k_op_cmpa_32_d , 0xf1f8, 0xb1c0, { 6, 6, 4}},
+ {m68k_op_cmpa_32_a , 0xf1f8, 0xb1c8, { 6, 6, 4}},
+ {m68k_op_cmpa_32_ai , 0xf1f8, 0xb1d0, { 14, 14, 8}},
+ {m68k_op_cmpa_32_pi , 0xf1f8, 0xb1d8, { 14, 14, 8}},
+ {m68k_op_cmpa_32_pd , 0xf1f8, 0xb1e0, { 16, 16, 9}},
+ {m68k_op_cmpa_32_di , 0xf1f8, 0xb1e8, { 18, 18, 9}},
+ {m68k_op_cmpa_32_ix , 0xf1f8, 0xb1f0, { 20, 20, 11}},
+ {m68k_op_and_8_er_d , 0xf1f8, 0xc000, { 4, 4, 2}},
+ {m68k_op_and_8_er_ai , 0xf1f8, 0xc010, { 8, 8, 6}},
+ {m68k_op_and_8_er_pi , 0xf1f8, 0xc018, { 8, 8, 6}},
+ {m68k_op_and_8_er_pd , 0xf1f8, 0xc020, { 10, 10, 7}},
+ {m68k_op_and_8_er_di , 0xf1f8, 0xc028, { 12, 12, 7}},
+ {m68k_op_and_8_er_ix , 0xf1f8, 0xc030, { 14, 14, 9}},
+ {m68k_op_and_16_er_d , 0xf1f8, 0xc040, { 4, 4, 2}},
+ {m68k_op_and_16_er_ai , 0xf1f8, 0xc050, { 8, 8, 6}},
+ {m68k_op_and_16_er_pi , 0xf1f8, 0xc058, { 8, 8, 6}},
+ {m68k_op_and_16_er_pd , 0xf1f8, 0xc060, { 10, 10, 7}},
+ {m68k_op_and_16_er_di , 0xf1f8, 0xc068, { 12, 12, 7}},
+ {m68k_op_and_16_er_ix , 0xf1f8, 0xc070, { 14, 14, 9}},
+ {m68k_op_and_32_er_d , 0xf1f8, 0xc080, { 6, 6, 2}},
+ {m68k_op_and_32_er_ai , 0xf1f8, 0xc090, { 14, 14, 6}},
+ {m68k_op_and_32_er_pi , 0xf1f8, 0xc098, { 14, 14, 6}},
+ {m68k_op_and_32_er_pd , 0xf1f8, 0xc0a0, { 16, 16, 7}},
+ {m68k_op_and_32_er_di , 0xf1f8, 0xc0a8, { 18, 18, 7}},
+ {m68k_op_and_32_er_ix , 0xf1f8, 0xc0b0, { 20, 20, 9}},
+ {m68k_op_mulu_16_d , 0xf1f8, 0xc0c0, { 54, 30, 27}},
+ {m68k_op_mulu_16_ai , 0xf1f8, 0xc0d0, { 58, 34, 31}},
+ {m68k_op_mulu_16_pi , 0xf1f8, 0xc0d8, { 58, 34, 31}},
+ {m68k_op_mulu_16_pd , 0xf1f8, 0xc0e0, { 60, 36, 32}},
+ {m68k_op_mulu_16_di , 0xf1f8, 0xc0e8, { 62, 38, 32}},
+ {m68k_op_mulu_16_ix , 0xf1f8, 0xc0f0, { 64, 40, 34}},
+ {m68k_op_abcd_8_rr , 0xf1f8, 0xc100, { 6, 6, 4}},
+ {m68k_op_abcd_8_mm , 0xf1f8, 0xc108, { 18, 18, 16}},
+ {m68k_op_and_8_re_ai , 0xf1f8, 0xc110, { 12, 12, 8}},
+ {m68k_op_and_8_re_pi , 0xf1f8, 0xc118, { 12, 12, 8}},
+ {m68k_op_and_8_re_pd , 0xf1f8, 0xc120, { 14, 14, 9}},
+ {m68k_op_and_8_re_di , 0xf1f8, 0xc128, { 16, 16, 9}},
+ {m68k_op_and_8_re_ix , 0xf1f8, 0xc130, { 18, 18, 11}},
+ {m68k_op_exg_32_dd , 0xf1f8, 0xc140, { 6, 6, 2}},
+ {m68k_op_exg_32_aa , 0xf1f8, 0xc148, { 6, 6, 2}},
+ {m68k_op_and_16_re_ai , 0xf1f8, 0xc150, { 12, 12, 8}},
+ {m68k_op_and_16_re_pi , 0xf1f8, 0xc158, { 12, 12, 8}},
+ {m68k_op_and_16_re_pd , 0xf1f8, 0xc160, { 14, 14, 9}},
+ {m68k_op_and_16_re_di , 0xf1f8, 0xc168, { 16, 16, 9}},
+ {m68k_op_and_16_re_ix , 0xf1f8, 0xc170, { 18, 18, 11}},
+ {m68k_op_exg_32_da , 0xf1f8, 0xc188, { 6, 6, 2}},
+ {m68k_op_and_32_re_ai , 0xf1f8, 0xc190, { 20, 20, 8}},
+ {m68k_op_and_32_re_pi , 0xf1f8, 0xc198, { 20, 20, 8}},
+ {m68k_op_and_32_re_pd , 0xf1f8, 0xc1a0, { 22, 22, 9}},
+ {m68k_op_and_32_re_di , 0xf1f8, 0xc1a8, { 24, 24, 9}},
+ {m68k_op_and_32_re_ix , 0xf1f8, 0xc1b0, { 26, 26, 11}},
+ {m68k_op_muls_16_d , 0xf1f8, 0xc1c0, { 54, 32, 27}},
+ {m68k_op_muls_16_ai , 0xf1f8, 0xc1d0, { 58, 36, 31}},
+ {m68k_op_muls_16_pi , 0xf1f8, 0xc1d8, { 58, 36, 31}},
+ {m68k_op_muls_16_pd , 0xf1f8, 0xc1e0, { 60, 38, 32}},
+ {m68k_op_muls_16_di , 0xf1f8, 0xc1e8, { 62, 40, 32}},
+ {m68k_op_muls_16_ix , 0xf1f8, 0xc1f0, { 64, 42, 34}},
+ {m68k_op_add_8_er_d , 0xf1f8, 0xd000, { 4, 4, 2}},
+ {m68k_op_add_8_er_ai , 0xf1f8, 0xd010, { 8, 8, 6}},
+ {m68k_op_add_8_er_pi , 0xf1f8, 0xd018, { 8, 8, 6}},
+ {m68k_op_add_8_er_pd , 0xf1f8, 0xd020, { 10, 10, 7}},
+ {m68k_op_add_8_er_di , 0xf1f8, 0xd028, { 12, 12, 7}},
+ {m68k_op_add_8_er_ix , 0xf1f8, 0xd030, { 14, 14, 9}},
+ {m68k_op_add_16_er_d , 0xf1f8, 0xd040, { 4, 4, 2}},
+ {m68k_op_add_16_er_a , 0xf1f8, 0xd048, { 4, 4, 2}},
+ {m68k_op_add_16_er_ai , 0xf1f8, 0xd050, { 8, 8, 6}},
+ {m68k_op_add_16_er_pi , 0xf1f8, 0xd058, { 8, 8, 6}},
+ {m68k_op_add_16_er_pd , 0xf1f8, 0xd060, { 10, 10, 7}},
+ {m68k_op_add_16_er_di , 0xf1f8, 0xd068, { 12, 12, 7}},
+ {m68k_op_add_16_er_ix , 0xf1f8, 0xd070, { 14, 14, 9}},
+ {m68k_op_add_32_er_d , 0xf1f8, 0xd080, { 6, 6, 2}},
+ {m68k_op_add_32_er_a , 0xf1f8, 0xd088, { 6, 6, 2}},
+ {m68k_op_add_32_er_ai , 0xf1f8, 0xd090, { 14, 14, 6}},
+ {m68k_op_add_32_er_pi , 0xf1f8, 0xd098, { 14, 14, 6}},
+ {m68k_op_add_32_er_pd , 0xf1f8, 0xd0a0, { 16, 16, 7}},
+ {m68k_op_add_32_er_di , 0xf1f8, 0xd0a8, { 18, 18, 7}},
+ {m68k_op_add_32_er_ix , 0xf1f8, 0xd0b0, { 20, 20, 9}},
+ {m68k_op_adda_16_d , 0xf1f8, 0xd0c0, { 8, 8, 2}},
+ {m68k_op_adda_16_a , 0xf1f8, 0xd0c8, { 8, 8, 2}},
+ {m68k_op_adda_16_ai , 0xf1f8, 0xd0d0, { 12, 12, 6}},
+ {m68k_op_adda_16_pi , 0xf1f8, 0xd0d8, { 12, 12, 6}},
+ {m68k_op_adda_16_pd , 0xf1f8, 0xd0e0, { 14, 14, 7}},
+ {m68k_op_adda_16_di , 0xf1f8, 0xd0e8, { 16, 16, 7}},
+ {m68k_op_adda_16_ix , 0xf1f8, 0xd0f0, { 18, 18, 9}},
+ {m68k_op_addx_8_rr , 0xf1f8, 0xd100, { 4, 4, 2}},
+ {m68k_op_addx_8_mm , 0xf1f8, 0xd108, { 18, 18, 12}},
+ {m68k_op_add_8_re_ai , 0xf1f8, 0xd110, { 12, 12, 8}},
+ {m68k_op_add_8_re_pi , 0xf1f8, 0xd118, { 12, 12, 8}},
+ {m68k_op_add_8_re_pd , 0xf1f8, 0xd120, { 14, 14, 9}},
+ {m68k_op_add_8_re_di , 0xf1f8, 0xd128, { 16, 16, 9}},
+ {m68k_op_add_8_re_ix , 0xf1f8, 0xd130, { 18, 18, 11}},
+ {m68k_op_addx_16_rr , 0xf1f8, 0xd140, { 4, 4, 2}},
+ {m68k_op_addx_16_mm , 0xf1f8, 0xd148, { 18, 18, 12}},
+ {m68k_op_add_16_re_ai , 0xf1f8, 0xd150, { 12, 12, 8}},
+ {m68k_op_add_16_re_pi , 0xf1f8, 0xd158, { 12, 12, 8}},
+ {m68k_op_add_16_re_pd , 0xf1f8, 0xd160, { 14, 14, 9}},
+ {m68k_op_add_16_re_di , 0xf1f8, 0xd168, { 16, 16, 9}},
+ {m68k_op_add_16_re_ix , 0xf1f8, 0xd170, { 18, 18, 11}},
+ {m68k_op_addx_32_rr , 0xf1f8, 0xd180, { 8, 6, 2}},
+ {m68k_op_addx_32_mm , 0xf1f8, 0xd188, { 30, 30, 12}},
+ {m68k_op_add_32_re_ai , 0xf1f8, 0xd190, { 20, 20, 8}},
+ {m68k_op_add_32_re_pi , 0xf1f8, 0xd198, { 20, 20, 8}},
+ {m68k_op_add_32_re_pd , 0xf1f8, 0xd1a0, { 22, 22, 9}},
+ {m68k_op_add_32_re_di , 0xf1f8, 0xd1a8, { 24, 24, 9}},
+ {m68k_op_add_32_re_ix , 0xf1f8, 0xd1b0, { 26, 26, 11}},
+ {m68k_op_adda_32_d , 0xf1f8, 0xd1c0, { 6, 6, 2}},
+ {m68k_op_adda_32_a , 0xf1f8, 0xd1c8, { 6, 6, 2}},
+ {m68k_op_adda_32_ai , 0xf1f8, 0xd1d0, { 14, 14, 6}},
+ {m68k_op_adda_32_pi , 0xf1f8, 0xd1d8, { 14, 14, 6}},
+ {m68k_op_adda_32_pd , 0xf1f8, 0xd1e0, { 16, 16, 7}},
+ {m68k_op_adda_32_di , 0xf1f8, 0xd1e8, { 18, 18, 7}},
+ {m68k_op_adda_32_ix , 0xf1f8, 0xd1f0, { 20, 20, 9}},
+ {m68k_op_asr_8_s , 0xf1f8, 0xe000, { 6, 6, 6}},
+ {m68k_op_lsr_8_s , 0xf1f8, 0xe008, { 6, 6, 4}},
+ {m68k_op_roxr_8_s , 0xf1f8, 0xe010, { 6, 6, 12}},
+ {m68k_op_ror_8_s , 0xf1f8, 0xe018, { 6, 6, 8}},
+ {m68k_op_asr_8_r , 0xf1f8, 0xe020, { 6, 6, 6}},
+ {m68k_op_lsr_8_r , 0xf1f8, 0xe028, { 6, 6, 6}},
+ {m68k_op_roxr_8_r , 0xf1f8, 0xe030, { 6, 6, 12}},
+ {m68k_op_ror_8_r , 0xf1f8, 0xe038, { 6, 6, 8}},
+ {m68k_op_asr_16_s , 0xf1f8, 0xe040, { 6, 6, 6}},
+ {m68k_op_lsr_16_s , 0xf1f8, 0xe048, { 6, 6, 4}},
+ {m68k_op_roxr_16_s , 0xf1f8, 0xe050, { 6, 6, 12}},
+ {m68k_op_ror_16_s , 0xf1f8, 0xe058, { 6, 6, 8}},
+ {m68k_op_asr_16_r , 0xf1f8, 0xe060, { 6, 6, 6}},
+ {m68k_op_lsr_16_r , 0xf1f8, 0xe068, { 6, 6, 6}},
+ {m68k_op_roxr_16_r , 0xf1f8, 0xe070, { 6, 6, 12}},
+ {m68k_op_ror_16_r , 0xf1f8, 0xe078, { 6, 6, 8}},
+ {m68k_op_asr_32_s , 0xf1f8, 0xe080, { 8, 8, 6}},
+ {m68k_op_lsr_32_s , 0xf1f8, 0xe088, { 8, 8, 4}},
+ {m68k_op_roxr_32_s , 0xf1f8, 0xe090, { 8, 8, 12}},
+ {m68k_op_ror_32_s , 0xf1f8, 0xe098, { 8, 8, 8}},
+ {m68k_op_asr_32_r , 0xf1f8, 0xe0a0, { 8, 8, 6}},
+ {m68k_op_lsr_32_r , 0xf1f8, 0xe0a8, { 8, 8, 6}},
+ {m68k_op_roxr_32_r , 0xf1f8, 0xe0b0, { 8, 8, 12}},
+ {m68k_op_ror_32_r , 0xf1f8, 0xe0b8, { 8, 8, 8}},
+ {m68k_op_asl_8_s , 0xf1f8, 0xe100, { 6, 6, 8}},
+ {m68k_op_lsl_8_s , 0xf1f8, 0xe108, { 6, 6, 4}},
+ {m68k_op_roxl_8_s , 0xf1f8, 0xe110, { 6, 6, 12}},
+ {m68k_op_rol_8_s , 0xf1f8, 0xe118, { 6, 6, 8}},
+ {m68k_op_asl_8_r , 0xf1f8, 0xe120, { 6, 6, 8}},
+ {m68k_op_lsl_8_r , 0xf1f8, 0xe128, { 6, 6, 6}},
+ {m68k_op_roxl_8_r , 0xf1f8, 0xe130, { 6, 6, 12}},
+ {m68k_op_rol_8_r , 0xf1f8, 0xe138, { 6, 6, 8}},
+ {m68k_op_asl_16_s , 0xf1f8, 0xe140, { 6, 6, 8}},
+ {m68k_op_lsl_16_s , 0xf1f8, 0xe148, { 6, 6, 4}},
+ {m68k_op_roxl_16_s , 0xf1f8, 0xe150, { 6, 6, 12}},
+ {m68k_op_rol_16_s , 0xf1f8, 0xe158, { 6, 6, 8}},
+ {m68k_op_asl_16_r , 0xf1f8, 0xe160, { 6, 6, 8}},
+ {m68k_op_lsl_16_r , 0xf1f8, 0xe168, { 6, 6, 6}},
+ {m68k_op_roxl_16_r , 0xf1f8, 0xe170, { 6, 6, 12}},
+ {m68k_op_rol_16_r , 0xf1f8, 0xe178, { 6, 6, 8}},
+ {m68k_op_asl_32_s , 0xf1f8, 0xe180, { 8, 8, 8}},
+ {m68k_op_lsl_32_s , 0xf1f8, 0xe188, { 8, 8, 4}},
+ {m68k_op_roxl_32_s , 0xf1f8, 0xe190, { 8, 8, 12}},
+ {m68k_op_rol_32_s , 0xf1f8, 0xe198, { 8, 8, 8}},
+ {m68k_op_asl_32_r , 0xf1f8, 0xe1a0, { 8, 8, 8}},
+ {m68k_op_lsl_32_r , 0xf1f8, 0xe1a8, { 8, 8, 6}},
+ {m68k_op_roxl_32_r , 0xf1f8, 0xe1b0, { 8, 8, 12}},
+ {m68k_op_rol_32_r , 0xf1f8, 0xe1b8, { 8, 8, 8}},
+ {m68k_op_cpdbcc_32 , 0xf1f8, 0xf048, { 0, 0, 4}},
+ {m68k_op_cptrapcc_32 , 0xf1f8, 0xf078, { 0, 0, 4}},
+ {m68k_op_rtm_32 , 0xfff0, 0x06c0, { 0, 0, 19}},
+ {m68k_op_trap , 0xfff0, 0x4e40, { 4, 4, 4}},
+ {m68k_op_btst_8_r_pi7 , 0xf1ff, 0x011f, { 8, 8, 8}},
+ {m68k_op_btst_8_r_pd7 , 0xf1ff, 0x0127, { 10, 10, 9}},
+ {m68k_op_btst_8_r_aw , 0xf1ff, 0x0138, { 12, 12, 8}},
+ {m68k_op_btst_8_r_al , 0xf1ff, 0x0139, { 16, 16, 8}},
+ {m68k_op_btst_8_r_pcdi , 0xf1ff, 0x013a, { 12, 12, 9}},
+ {m68k_op_btst_8_r_pcix , 0xf1ff, 0x013b, { 14, 14, 11}},
+ {m68k_op_btst_8_r_i , 0xf1ff, 0x013c, { 8, 8, 6}},
+ {m68k_op_bchg_8_r_pi7 , 0xf1ff, 0x015f, { 12, 12, 8}},
+ {m68k_op_bchg_8_r_pd7 , 0xf1ff, 0x0167, { 14, 14, 9}},
+ {m68k_op_bchg_8_r_aw , 0xf1ff, 0x0178, { 16, 16, 8}},
+ {m68k_op_bchg_8_r_al , 0xf1ff, 0x0179, { 20, 20, 8}},
+ {m68k_op_bclr_8_r_pi7 , 0xf1ff, 0x019f, { 12, 14, 8}},
+ {m68k_op_bclr_8_r_pd7 , 0xf1ff, 0x01a7, { 14, 16, 9}},
+ {m68k_op_bclr_8_r_aw , 0xf1ff, 0x01b8, { 16, 18, 8}},
+ {m68k_op_bclr_8_r_al , 0xf1ff, 0x01b9, { 20, 22, 8}},
+ {m68k_op_bset_8_r_pi7 , 0xf1ff, 0x01df, { 12, 12, 8}},
+ {m68k_op_bset_8_r_pd7 , 0xf1ff, 0x01e7, { 14, 14, 9}},
+ {m68k_op_bset_8_r_aw , 0xf1ff, 0x01f8, { 16, 16, 8}},
+ {m68k_op_bset_8_r_al , 0xf1ff, 0x01f9, { 20, 20, 8}},
+ {m68k_op_move_8_d_pi7 , 0xf1ff, 0x101f, { 8, 8, 6}},
+ {m68k_op_move_8_d_pd7 , 0xf1ff, 0x1027, { 10, 10, 7}},
+ {m68k_op_move_8_d_aw , 0xf1ff, 0x1038, { 12, 12, 6}},
+ {m68k_op_move_8_d_al , 0xf1ff, 0x1039, { 16, 16, 6}},
+ {m68k_op_move_8_d_pcdi , 0xf1ff, 0x103a, { 12, 12, 7}},
+ {m68k_op_move_8_d_pcix , 0xf1ff, 0x103b, { 14, 14, 9}},
+ {m68k_op_move_8_d_i , 0xf1ff, 0x103c, { 8, 8, 4}},
+ {m68k_op_move_8_ai_pi7 , 0xf1ff, 0x109f, { 12, 12, 8}},
+ {m68k_op_move_8_ai_pd7 , 0xf1ff, 0x10a7, { 14, 14, 9}},
+ {m68k_op_move_8_ai_aw , 0xf1ff, 0x10b8, { 16, 16, 8}},
+ {m68k_op_move_8_ai_al , 0xf1ff, 0x10b9, { 20, 20, 8}},
+ {m68k_op_move_8_ai_pcdi , 0xf1ff, 0x10ba, { 16, 16, 9}},
+ {m68k_op_move_8_ai_pcix , 0xf1ff, 0x10bb, { 18, 18, 11}},
+ {m68k_op_move_8_ai_i , 0xf1ff, 0x10bc, { 12, 12, 6}},
+ {m68k_op_move_8_pi_pi7 , 0xf1ff, 0x10df, { 12, 12, 8}},
+ {m68k_op_move_8_pi_pd7 , 0xf1ff, 0x10e7, { 14, 14, 9}},
+ {m68k_op_move_8_pi_aw , 0xf1ff, 0x10f8, { 16, 16, 8}},
+ {m68k_op_move_8_pi_al , 0xf1ff, 0x10f9, { 20, 20, 8}},
+ {m68k_op_move_8_pi_pcdi , 0xf1ff, 0x10fa, { 16, 16, 9}},
+ {m68k_op_move_8_pi_pcix , 0xf1ff, 0x10fb, { 18, 18, 11}},
+ {m68k_op_move_8_pi_i , 0xf1ff, 0x10fc, { 12, 12, 6}},
+ {m68k_op_move_8_pd_pi7 , 0xf1ff, 0x111f, { 12, 12, 9}},
+ {m68k_op_move_8_pd_pd7 , 0xf1ff, 0x1127, { 14, 14, 10}},
+ {m68k_op_move_8_pd_aw , 0xf1ff, 0x1138, { 16, 16, 9}},
+ {m68k_op_move_8_pd_al , 0xf1ff, 0x1139, { 20, 20, 9}},
+ {m68k_op_move_8_pd_pcdi , 0xf1ff, 0x113a, { 16, 16, 10}},
+ {m68k_op_move_8_pd_pcix , 0xf1ff, 0x113b, { 18, 18, 12}},
+ {m68k_op_move_8_pd_i , 0xf1ff, 0x113c, { 12, 12, 7}},
+ {m68k_op_move_8_di_pi7 , 0xf1ff, 0x115f, { 16, 16, 9}},
+ {m68k_op_move_8_di_pd7 , 0xf1ff, 0x1167, { 18, 18, 10}},
+ {m68k_op_move_8_di_aw , 0xf1ff, 0x1178, { 20, 20, 9}},
+ {m68k_op_move_8_di_al , 0xf1ff, 0x1179, { 24, 24, 9}},
+ {m68k_op_move_8_di_pcdi , 0xf1ff, 0x117a, { 20, 20, 10}},
+ {m68k_op_move_8_di_pcix , 0xf1ff, 0x117b, { 22, 22, 12}},
+ {m68k_op_move_8_di_i , 0xf1ff, 0x117c, { 16, 16, 7}},
+ {m68k_op_move_8_ix_pi7 , 0xf1ff, 0x119f, { 18, 18, 11}},
+ {m68k_op_move_8_ix_pd7 , 0xf1ff, 0x11a7, { 20, 20, 12}},
+ {m68k_op_move_8_ix_aw , 0xf1ff, 0x11b8, { 22, 22, 11}},
+ {m68k_op_move_8_ix_al , 0xf1ff, 0x11b9, { 26, 26, 11}},
+ {m68k_op_move_8_ix_pcdi , 0xf1ff, 0x11ba, { 22, 22, 12}},
+ {m68k_op_move_8_ix_pcix , 0xf1ff, 0x11bb, { 24, 24, 14}},
+ {m68k_op_move_8_ix_i , 0xf1ff, 0x11bc, { 18, 18, 9}},
+ {m68k_op_move_32_d_aw , 0xf1ff, 0x2038, { 16, 16, 6}},
+ {m68k_op_move_32_d_al , 0xf1ff, 0x2039, { 20, 20, 6}},
+ {m68k_op_move_32_d_pcdi , 0xf1ff, 0x203a, { 16, 16, 7}},
+ {m68k_op_move_32_d_pcix , 0xf1ff, 0x203b, { 18, 18, 9}},
+ {m68k_op_move_32_d_i , 0xf1ff, 0x203c, { 12, 12, 6}},
+ {m68k_op_movea_32_aw , 0xf1ff, 0x2078, { 16, 16, 6}},
+ {m68k_op_movea_32_al , 0xf1ff, 0x2079, { 20, 20, 6}},
+ {m68k_op_movea_32_pcdi , 0xf1ff, 0x207a, { 16, 16, 7}},
+ {m68k_op_movea_32_pcix , 0xf1ff, 0x207b, { 18, 18, 9}},
+ {m68k_op_movea_32_i , 0xf1ff, 0x207c, { 12, 12, 6}},
+ {m68k_op_move_32_ai_aw , 0xf1ff, 0x20b8, { 24, 24, 8}},
+ {m68k_op_move_32_ai_al , 0xf1ff, 0x20b9, { 28, 28, 8}},
+ {m68k_op_move_32_ai_pcdi , 0xf1ff, 0x20ba, { 24, 24, 9}},
+ {m68k_op_move_32_ai_pcix , 0xf1ff, 0x20bb, { 26, 26, 11}},
+ {m68k_op_move_32_ai_i , 0xf1ff, 0x20bc, { 20, 20, 8}},
+ {m68k_op_move_32_pi_aw , 0xf1ff, 0x20f8, { 24, 24, 8}},
+ {m68k_op_move_32_pi_al , 0xf1ff, 0x20f9, { 28, 28, 8}},
+ {m68k_op_move_32_pi_pcdi , 0xf1ff, 0x20fa, { 24, 24, 9}},
+ {m68k_op_move_32_pi_pcix , 0xf1ff, 0x20fb, { 26, 26, 11}},
+ {m68k_op_move_32_pi_i , 0xf1ff, 0x20fc, { 20, 20, 8}},
+ {m68k_op_move_32_pd_aw , 0xf1ff, 0x2138, { 24, 26, 9}},
+ {m68k_op_move_32_pd_al , 0xf1ff, 0x2139, { 28, 30, 9}},
+ {m68k_op_move_32_pd_pcdi , 0xf1ff, 0x213a, { 24, 26, 10}},
+ {m68k_op_move_32_pd_pcix , 0xf1ff, 0x213b, { 26, 28, 12}},
+ {m68k_op_move_32_pd_i , 0xf1ff, 0x213c, { 20, 22, 9}},
+ {m68k_op_move_32_di_aw , 0xf1ff, 0x2178, { 28, 28, 9}},
+ {m68k_op_move_32_di_al , 0xf1ff, 0x2179, { 32, 32, 9}},
+ {m68k_op_move_32_di_pcdi , 0xf1ff, 0x217a, { 28, 28, 10}},
+ {m68k_op_move_32_di_pcix , 0xf1ff, 0x217b, { 30, 30, 12}},
+ {m68k_op_move_32_di_i , 0xf1ff, 0x217c, { 24, 24, 9}},
+ {m68k_op_move_32_ix_aw , 0xf1ff, 0x21b8, { 30, 30, 11}},
+ {m68k_op_move_32_ix_al , 0xf1ff, 0x21b9, { 34, 34, 11}},
+ {m68k_op_move_32_ix_pcdi , 0xf1ff, 0x21ba, { 30, 30, 12}},
+ {m68k_op_move_32_ix_pcix , 0xf1ff, 0x21bb, { 32, 32, 14}},
+ {m68k_op_move_32_ix_i , 0xf1ff, 0x21bc, { 26, 26, 11}},
+ {m68k_op_move_16_d_aw , 0xf1ff, 0x3038, { 12, 12, 6}},
+ {m68k_op_move_16_d_al , 0xf1ff, 0x3039, { 16, 16, 6}},
+ {m68k_op_move_16_d_pcdi , 0xf1ff, 0x303a, { 12, 12, 7}},
+ {m68k_op_move_16_d_pcix , 0xf1ff, 0x303b, { 14, 14, 9}},
+ {m68k_op_move_16_d_i , 0xf1ff, 0x303c, { 8, 8, 4}},
+ {m68k_op_movea_16_aw , 0xf1ff, 0x3078, { 12, 12, 6}},
+ {m68k_op_movea_16_al , 0xf1ff, 0x3079, { 16, 16, 6}},
+ {m68k_op_movea_16_pcdi , 0xf1ff, 0x307a, { 12, 12, 7}},
+ {m68k_op_movea_16_pcix , 0xf1ff, 0x307b, { 14, 14, 9}},
+ {m68k_op_movea_16_i , 0xf1ff, 0x307c, { 8, 8, 4}},
+ {m68k_op_move_16_ai_aw , 0xf1ff, 0x30b8, { 16, 16, 8}},
+ {m68k_op_move_16_ai_al , 0xf1ff, 0x30b9, { 20, 20, 8}},
+ {m68k_op_move_16_ai_pcdi , 0xf1ff, 0x30ba, { 16, 16, 9}},
+ {m68k_op_move_16_ai_pcix , 0xf1ff, 0x30bb, { 18, 18, 11}},
+ {m68k_op_move_16_ai_i , 0xf1ff, 0x30bc, { 12, 12, 6}},
+ {m68k_op_move_16_pi_aw , 0xf1ff, 0x30f8, { 16, 16, 8}},
+ {m68k_op_move_16_pi_al , 0xf1ff, 0x30f9, { 20, 20, 8}},
+ {m68k_op_move_16_pi_pcdi , 0xf1ff, 0x30fa, { 16, 16, 9}},
+ {m68k_op_move_16_pi_pcix , 0xf1ff, 0x30fb, { 18, 18, 11}},
+ {m68k_op_move_16_pi_i , 0xf1ff, 0x30fc, { 12, 12, 6}},
+ {m68k_op_move_16_pd_aw , 0xf1ff, 0x3138, { 16, 16, 9}},
+ {m68k_op_move_16_pd_al , 0xf1ff, 0x3139, { 20, 20, 9}},
+ {m68k_op_move_16_pd_pcdi , 0xf1ff, 0x313a, { 16, 16, 10}},
+ {m68k_op_move_16_pd_pcix , 0xf1ff, 0x313b, { 18, 18, 12}},
+ {m68k_op_move_16_pd_i , 0xf1ff, 0x313c, { 12, 12, 7}},
+ {m68k_op_move_16_di_aw , 0xf1ff, 0x3178, { 20, 20, 9}},
+ {m68k_op_move_16_di_al , 0xf1ff, 0x3179, { 24, 24, 9}},
+ {m68k_op_move_16_di_pcdi , 0xf1ff, 0x317a, { 20, 20, 10}},
+ {m68k_op_move_16_di_pcix , 0xf1ff, 0x317b, { 22, 22, 12}},
+ {m68k_op_move_16_di_i , 0xf1ff, 0x317c, { 16, 16, 7}},
+ {m68k_op_move_16_ix_aw , 0xf1ff, 0x31b8, { 22, 22, 11}},
+ {m68k_op_move_16_ix_al , 0xf1ff, 0x31b9, { 26, 26, 11}},
+ {m68k_op_move_16_ix_pcdi , 0xf1ff, 0x31ba, { 22, 22, 12}},
+ {m68k_op_move_16_ix_pcix , 0xf1ff, 0x31bb, { 24, 24, 14}},
+ {m68k_op_move_16_ix_i , 0xf1ff, 0x31bc, { 18, 18, 9}},
+ {m68k_op_chk_32_aw , 0xf1ff, 0x4138, { 0, 0, 12}},
+ {m68k_op_chk_32_al , 0xf1ff, 0x4139, { 0, 0, 12}},
+ {m68k_op_chk_32_pcdi , 0xf1ff, 0x413a, { 0, 0, 13}},
+ {m68k_op_chk_32_pcix , 0xf1ff, 0x413b, { 0, 0, 15}},
+ {m68k_op_chk_32_i , 0xf1ff, 0x413c, { 0, 0, 12}},
+ {m68k_op_chk_16_aw , 0xf1ff, 0x41b8, { 18, 16, 12}},
+ {m68k_op_chk_16_al , 0xf1ff, 0x41b9, { 22, 20, 12}},
+ {m68k_op_chk_16_pcdi , 0xf1ff, 0x41ba, { 18, 16, 13}},
+ {m68k_op_chk_16_pcix , 0xf1ff, 0x41bb, { 20, 18, 15}},
+ {m68k_op_chk_16_i , 0xf1ff, 0x41bc, { 14, 12, 10}},
+ {m68k_op_lea_32_aw , 0xf1ff, 0x41f8, { 8, 8, 6}},
+ {m68k_op_lea_32_al , 0xf1ff, 0x41f9, { 12, 12, 6}},
+ {m68k_op_lea_32_pcdi , 0xf1ff, 0x41fa, { 8, 8, 7}},
+ {m68k_op_lea_32_pcix , 0xf1ff, 0x41fb, { 12, 12, 9}},
+ {m68k_op_addq_8_pi7 , 0xf1ff, 0x501f, { 12, 12, 8}},
+ {m68k_op_addq_8_pd7 , 0xf1ff, 0x5027, { 14, 14, 9}},
+ {m68k_op_addq_8_aw , 0xf1ff, 0x5038, { 16, 16, 8}},
+ {m68k_op_addq_8_al , 0xf1ff, 0x5039, { 20, 20, 8}},
+ {m68k_op_addq_16_aw , 0xf1ff, 0x5078, { 16, 16, 8}},
+ {m68k_op_addq_16_al , 0xf1ff, 0x5079, { 20, 20, 8}},
+ {m68k_op_addq_32_aw , 0xf1ff, 0x50b8, { 24, 24, 8}},
+ {m68k_op_addq_32_al , 0xf1ff, 0x50b9, { 28, 28, 8}},
+ {m68k_op_subq_8_pi7 , 0xf1ff, 0x511f, { 12, 12, 8}},
+ {m68k_op_subq_8_pd7 , 0xf1ff, 0x5127, { 14, 14, 9}},
+ {m68k_op_subq_8_aw , 0xf1ff, 0x5138, { 16, 16, 8}},
+ {m68k_op_subq_8_al , 0xf1ff, 0x5139, { 20, 20, 8}},
+ {m68k_op_subq_16_aw , 0xf1ff, 0x5178, { 16, 16, 8}},
+ {m68k_op_subq_16_al , 0xf1ff, 0x5179, { 20, 20, 8}},
+ {m68k_op_subq_32_aw , 0xf1ff, 0x51b8, { 24, 24, 8}},
+ {m68k_op_subq_32_al , 0xf1ff, 0x51b9, { 28, 28, 8}},
+ {m68k_op_or_8_er_pi7 , 0xf1ff, 0x801f, { 8, 8, 6}},
+ {m68k_op_or_8_er_pd7 , 0xf1ff, 0x8027, { 10, 10, 7}},
+ {m68k_op_or_8_er_aw , 0xf1ff, 0x8038, { 12, 12, 6}},
+ {m68k_op_or_8_er_al , 0xf1ff, 0x8039, { 16, 16, 6}},
+ {m68k_op_or_8_er_pcdi , 0xf1ff, 0x803a, { 12, 12, 7}},
+ {m68k_op_or_8_er_pcix , 0xf1ff, 0x803b, { 14, 14, 9}},
+ {m68k_op_or_8_er_i , 0xf1ff, 0x803c, { 10, 8, 4}},
+ {m68k_op_or_16_er_aw , 0xf1ff, 0x8078, { 12, 12, 6}},
+ {m68k_op_or_16_er_al , 0xf1ff, 0x8079, { 16, 16, 6}},
+ {m68k_op_or_16_er_pcdi , 0xf1ff, 0x807a, { 12, 12, 7}},
+ {m68k_op_or_16_er_pcix , 0xf1ff, 0x807b, { 14, 14, 9}},
+ {m68k_op_or_16_er_i , 0xf1ff, 0x807c, { 10, 8, 4}},
+ {m68k_op_or_32_er_aw , 0xf1ff, 0x80b8, { 18, 18, 6}},
+ {m68k_op_or_32_er_al , 0xf1ff, 0x80b9, { 22, 22, 6}},
+ {m68k_op_or_32_er_pcdi , 0xf1ff, 0x80ba, { 18, 18, 7}},
+ {m68k_op_or_32_er_pcix , 0xf1ff, 0x80bb, { 20, 20, 9}},
+ {m68k_op_or_32_er_i , 0xf1ff, 0x80bc, { 16, 14, 6}},
+ {m68k_op_divu_16_aw , 0xf1ff, 0x80f8, {148, 116, 48}},
+ {m68k_op_divu_16_al , 0xf1ff, 0x80f9, {152, 120, 48}},
+ {m68k_op_divu_16_pcdi , 0xf1ff, 0x80fa, {148, 116, 49}},
+ {m68k_op_divu_16_pcix , 0xf1ff, 0x80fb, {150, 118, 51}},
+ {m68k_op_divu_16_i , 0xf1ff, 0x80fc, {144, 112, 46}},
+ {m68k_op_sbcd_8_mm_ay7 , 0xf1ff, 0x810f, { 18, 18, 16}},
+ {m68k_op_or_8_re_pi7 , 0xf1ff, 0x811f, { 12, 12, 8}},
+ {m68k_op_or_8_re_pd7 , 0xf1ff, 0x8127, { 14, 14, 9}},
+ {m68k_op_or_8_re_aw , 0xf1ff, 0x8138, { 16, 16, 8}},
+ {m68k_op_or_8_re_al , 0xf1ff, 0x8139, { 20, 20, 8}},
+ {m68k_op_pack_16_mm_ay7 , 0xf1ff, 0x814f, { 0, 0, 13}},
+ {m68k_op_or_16_re_aw , 0xf1ff, 0x8178, { 16, 16, 8}},
+ {m68k_op_or_16_re_al , 0xf1ff, 0x8179, { 20, 20, 8}},
+ {m68k_op_unpk_16_mm_ay7 , 0xf1ff, 0x818f, { 0, 0, 13}},
+ {m68k_op_or_32_re_aw , 0xf1ff, 0x81b8, { 24, 24, 8}},
+ {m68k_op_or_32_re_al , 0xf1ff, 0x81b9, { 28, 28, 8}},
+ {m68k_op_divs_16_aw , 0xf1ff, 0x81f8, {166, 130, 60}},
+ {m68k_op_divs_16_al , 0xf1ff, 0x81f9, {170, 134, 60}},
+ {m68k_op_divs_16_pcdi , 0xf1ff, 0x81fa, {166, 130, 61}},
+ {m68k_op_divs_16_pcix , 0xf1ff, 0x81fb, {168, 132, 63}},
+ {m68k_op_divs_16_i , 0xf1ff, 0x81fc, {162, 126, 58}},
+ {m68k_op_sub_8_er_pi7 , 0xf1ff, 0x901f, { 8, 8, 6}},
+ {m68k_op_sub_8_er_pd7 , 0xf1ff, 0x9027, { 10, 10, 7}},
+ {m68k_op_sub_8_er_aw , 0xf1ff, 0x9038, { 12, 12, 6}},
+ {m68k_op_sub_8_er_al , 0xf1ff, 0x9039, { 16, 16, 6}},
+ {m68k_op_sub_8_er_pcdi , 0xf1ff, 0x903a, { 12, 12, 7}},
+ {m68k_op_sub_8_er_pcix , 0xf1ff, 0x903b, { 14, 14, 9}},
+ {m68k_op_sub_8_er_i , 0xf1ff, 0x903c, { 10, 8, 4}},
+ {m68k_op_sub_16_er_aw , 0xf1ff, 0x9078, { 12, 12, 6}},
+ {m68k_op_sub_16_er_al , 0xf1ff, 0x9079, { 16, 16, 6}},
+ {m68k_op_sub_16_er_pcdi , 0xf1ff, 0x907a, { 12, 12, 7}},
+ {m68k_op_sub_16_er_pcix , 0xf1ff, 0x907b, { 14, 14, 9}},
+ {m68k_op_sub_16_er_i , 0xf1ff, 0x907c, { 10, 8, 4}},
+ {m68k_op_sub_32_er_aw , 0xf1ff, 0x90b8, { 18, 18, 6}},
+ {m68k_op_sub_32_er_al , 0xf1ff, 0x90b9, { 22, 22, 6}},
+ {m68k_op_sub_32_er_pcdi , 0xf1ff, 0x90ba, { 18, 18, 7}},
+ {m68k_op_sub_32_er_pcix , 0xf1ff, 0x90bb, { 20, 20, 9}},
+ {m68k_op_sub_32_er_i , 0xf1ff, 0x90bc, { 16, 14, 6}},
+ {m68k_op_suba_16_aw , 0xf1ff, 0x90f8, { 16, 16, 6}},
+ {m68k_op_suba_16_al , 0xf1ff, 0x90f9, { 20, 20, 6}},
+ {m68k_op_suba_16_pcdi , 0xf1ff, 0x90fa, { 16, 16, 7}},
+ {m68k_op_suba_16_pcix , 0xf1ff, 0x90fb, { 18, 18, 9}},
+ {m68k_op_suba_16_i , 0xf1ff, 0x90fc, { 14, 12, 4}},
+ {m68k_op_subx_8_mm_ay7 , 0xf1ff, 0x910f, { 18, 18, 12}},
+ {m68k_op_sub_8_re_pi7 , 0xf1ff, 0x911f, { 12, 12, 8}},
+ {m68k_op_sub_8_re_pd7 , 0xf1ff, 0x9127, { 14, 14, 9}},
+ {m68k_op_sub_8_re_aw , 0xf1ff, 0x9138, { 16, 16, 8}},
+ {m68k_op_sub_8_re_al , 0xf1ff, 0x9139, { 20, 20, 8}},
+ {m68k_op_sub_16_re_aw , 0xf1ff, 0x9178, { 16, 16, 8}},
+ {m68k_op_sub_16_re_al , 0xf1ff, 0x9179, { 20, 20, 8}},
+ {m68k_op_sub_32_re_aw , 0xf1ff, 0x91b8, { 24, 24, 8}},
+ {m68k_op_sub_32_re_al , 0xf1ff, 0x91b9, { 28, 28, 8}},
+ {m68k_op_suba_32_aw , 0xf1ff, 0x91f8, { 18, 18, 6}},
+ {m68k_op_suba_32_al , 0xf1ff, 0x91f9, { 22, 22, 6}},
+ {m68k_op_suba_32_pcdi , 0xf1ff, 0x91fa, { 18, 18, 7}},
+ {m68k_op_suba_32_pcix , 0xf1ff, 0x91fb, { 20, 20, 9}},
+ {m68k_op_suba_32_i , 0xf1ff, 0x91fc, { 16, 14, 6}},
+ {m68k_op_cmp_8_pi7 , 0xf1ff, 0xb01f, { 8, 8, 6}},
+ {m68k_op_cmp_8_pd7 , 0xf1ff, 0xb027, { 10, 10, 7}},
+ {m68k_op_cmp_8_aw , 0xf1ff, 0xb038, { 12, 12, 6}},
+ {m68k_op_cmp_8_al , 0xf1ff, 0xb039, { 16, 16, 6}},
+ {m68k_op_cmp_8_pcdi , 0xf1ff, 0xb03a, { 12, 12, 7}},
+ {m68k_op_cmp_8_pcix , 0xf1ff, 0xb03b, { 14, 14, 9}},
+ {m68k_op_cmp_8_i , 0xf1ff, 0xb03c, { 8, 8, 4}},
+ {m68k_op_cmp_16_aw , 0xf1ff, 0xb078, { 12, 12, 6}},
+ {m68k_op_cmp_16_al , 0xf1ff, 0xb079, { 16, 16, 6}},
+ {m68k_op_cmp_16_pcdi , 0xf1ff, 0xb07a, { 12, 12, 7}},
+ {m68k_op_cmp_16_pcix , 0xf1ff, 0xb07b, { 14, 14, 9}},
+ {m68k_op_cmp_16_i , 0xf1ff, 0xb07c, { 8, 8, 4}},
+ {m68k_op_cmp_32_aw , 0xf1ff, 0xb0b8, { 18, 18, 6}},
+ {m68k_op_cmp_32_al , 0xf1ff, 0xb0b9, { 22, 22, 6}},
+ {m68k_op_cmp_32_pcdi , 0xf1ff, 0xb0ba, { 18, 18, 7}},
+ {m68k_op_cmp_32_pcix , 0xf1ff, 0xb0bb, { 20, 20, 9}},
+ {m68k_op_cmp_32_i , 0xf1ff, 0xb0bc, { 14, 14, 6}},
+ {m68k_op_cmpa_16_aw , 0xf1ff, 0xb0f8, { 14, 14, 8}},
+ {m68k_op_cmpa_16_al , 0xf1ff, 0xb0f9, { 18, 18, 8}},
+ {m68k_op_cmpa_16_pcdi , 0xf1ff, 0xb0fa, { 14, 14, 9}},
+ {m68k_op_cmpa_16_pcix , 0xf1ff, 0xb0fb, { 16, 16, 11}},
+ {m68k_op_cmpa_16_i , 0xf1ff, 0xb0fc, { 10, 10, 6}},
+ {m68k_op_cmpm_8_ay7 , 0xf1ff, 0xb10f, { 12, 12, 9}},
+ {m68k_op_eor_8_pi7 , 0xf1ff, 0xb11f, { 12, 12, 8}},
+ {m68k_op_eor_8_pd7 , 0xf1ff, 0xb127, { 14, 14, 9}},
+ {m68k_op_eor_8_aw , 0xf1ff, 0xb138, { 16, 16, 8}},
+ {m68k_op_eor_8_al , 0xf1ff, 0xb139, { 20, 20, 8}},
+ {m68k_op_eor_16_aw , 0xf1ff, 0xb178, { 16, 16, 8}},
+ {m68k_op_eor_16_al , 0xf1ff, 0xb179, { 20, 20, 8}},
+ {m68k_op_eor_32_aw , 0xf1ff, 0xb1b8, { 24, 24, 8}},
+ {m68k_op_eor_32_al , 0xf1ff, 0xb1b9, { 28, 28, 8}},
+ {m68k_op_cmpa_32_aw , 0xf1ff, 0xb1f8, { 18, 18, 8}},
+ {m68k_op_cmpa_32_al , 0xf1ff, 0xb1f9, { 22, 22, 8}},
+ {m68k_op_cmpa_32_pcdi , 0xf1ff, 0xb1fa, { 18, 18, 9}},
+ {m68k_op_cmpa_32_pcix , 0xf1ff, 0xb1fb, { 20, 20, 11}},
+ {m68k_op_cmpa_32_i , 0xf1ff, 0xb1fc, { 14, 14, 8}},
+ {m68k_op_and_8_er_pi7 , 0xf1ff, 0xc01f, { 8, 8, 6}},
+ {m68k_op_and_8_er_pd7 , 0xf1ff, 0xc027, { 10, 10, 7}},
+ {m68k_op_and_8_er_aw , 0xf1ff, 0xc038, { 12, 12, 6}},
+ {m68k_op_and_8_er_al , 0xf1ff, 0xc039, { 16, 16, 6}},
+ {m68k_op_and_8_er_pcdi , 0xf1ff, 0xc03a, { 12, 12, 7}},
+ {m68k_op_and_8_er_pcix , 0xf1ff, 0xc03b, { 14, 14, 9}},
+ {m68k_op_and_8_er_i , 0xf1ff, 0xc03c, { 10, 8, 4}},
+ {m68k_op_and_16_er_aw , 0xf1ff, 0xc078, { 12, 12, 6}},
+ {m68k_op_and_16_er_al , 0xf1ff, 0xc079, { 16, 16, 6}},
+ {m68k_op_and_16_er_pcdi , 0xf1ff, 0xc07a, { 12, 12, 7}},
+ {m68k_op_and_16_er_pcix , 0xf1ff, 0xc07b, { 14, 14, 9}},
+ {m68k_op_and_16_er_i , 0xf1ff, 0xc07c, { 10, 8, 4}},
+ {m68k_op_and_32_er_aw , 0xf1ff, 0xc0b8, { 18, 18, 6}},
+ {m68k_op_and_32_er_al , 0xf1ff, 0xc0b9, { 22, 22, 6}},
+ {m68k_op_and_32_er_pcdi , 0xf1ff, 0xc0ba, { 18, 18, 7}},
+ {m68k_op_and_32_er_pcix , 0xf1ff, 0xc0bb, { 20, 20, 9}},
+ {m68k_op_and_32_er_i , 0xf1ff, 0xc0bc, { 16, 14, 6}},
+ {m68k_op_mulu_16_aw , 0xf1ff, 0xc0f8, { 62, 38, 31}},
+ {m68k_op_mulu_16_al , 0xf1ff, 0xc0f9, { 66, 42, 31}},
+ {m68k_op_mulu_16_pcdi , 0xf1ff, 0xc0fa, { 62, 38, 32}},
+ {m68k_op_mulu_16_pcix , 0xf1ff, 0xc0fb, { 64, 40, 34}},
+ {m68k_op_mulu_16_i , 0xf1ff, 0xc0fc, { 58, 34, 29}},
+ {m68k_op_abcd_8_mm_ay7 , 0xf1ff, 0xc10f, { 18, 18, 16}},
+ {m68k_op_and_8_re_pi7 , 0xf1ff, 0xc11f, { 12, 12, 8}},
+ {m68k_op_and_8_re_pd7 , 0xf1ff, 0xc127, { 14, 14, 9}},
+ {m68k_op_and_8_re_aw , 0xf1ff, 0xc138, { 16, 16, 8}},
+ {m68k_op_and_8_re_al , 0xf1ff, 0xc139, { 20, 20, 8}},
+ {m68k_op_and_16_re_aw , 0xf1ff, 0xc178, { 16, 16, 8}},
+ {m68k_op_and_16_re_al , 0xf1ff, 0xc179, { 20, 20, 8}},
+ {m68k_op_and_32_re_aw , 0xf1ff, 0xc1b8, { 24, 24, 8}},
+ {m68k_op_and_32_re_al , 0xf1ff, 0xc1b9, { 28, 28, 8}},
+ {m68k_op_muls_16_aw , 0xf1ff, 0xc1f8, { 62, 40, 31}},
+ {m68k_op_muls_16_al , 0xf1ff, 0xc1f9, { 66, 44, 31}},
+ {m68k_op_muls_16_pcdi , 0xf1ff, 0xc1fa, { 62, 40, 32}},
+ {m68k_op_muls_16_pcix , 0xf1ff, 0xc1fb, { 64, 42, 34}},
+ {m68k_op_muls_16_i , 0xf1ff, 0xc1fc, { 58, 36, 29}},
+ {m68k_op_add_8_er_pi7 , 0xf1ff, 0xd01f, { 8, 8, 6}},
+ {m68k_op_add_8_er_pd7 , 0xf1ff, 0xd027, { 10, 10, 7}},
+ {m68k_op_add_8_er_aw , 0xf1ff, 0xd038, { 12, 12, 6}},
+ {m68k_op_add_8_er_al , 0xf1ff, 0xd039, { 16, 16, 6}},
+ {m68k_op_add_8_er_pcdi , 0xf1ff, 0xd03a, { 12, 12, 7}},
+ {m68k_op_add_8_er_pcix , 0xf1ff, 0xd03b, { 14, 14, 9}},
+ {m68k_op_add_8_er_i , 0xf1ff, 0xd03c, { 10, 8, 4}},
+ {m68k_op_add_16_er_aw , 0xf1ff, 0xd078, { 12, 12, 6}},
+ {m68k_op_add_16_er_al , 0xf1ff, 0xd079, { 16, 16, 6}},
+ {m68k_op_add_16_er_pcdi , 0xf1ff, 0xd07a, { 12, 12, 7}},
+ {m68k_op_add_16_er_pcix , 0xf1ff, 0xd07b, { 14, 14, 9}},
+ {m68k_op_add_16_er_i , 0xf1ff, 0xd07c, { 10, 8, 4}},
+ {m68k_op_add_32_er_aw , 0xf1ff, 0xd0b8, { 18, 18, 6}},
+ {m68k_op_add_32_er_al , 0xf1ff, 0xd0b9, { 22, 22, 6}},
+ {m68k_op_add_32_er_pcdi , 0xf1ff, 0xd0ba, { 18, 18, 7}},
+ {m68k_op_add_32_er_pcix , 0xf1ff, 0xd0bb, { 20, 20, 9}},
+ {m68k_op_add_32_er_i , 0xf1ff, 0xd0bc, { 16, 14, 6}},
+ {m68k_op_adda_16_aw , 0xf1ff, 0xd0f8, { 16, 16, 6}},
+ {m68k_op_adda_16_al , 0xf1ff, 0xd0f9, { 20, 20, 6}},
+ {m68k_op_adda_16_pcdi , 0xf1ff, 0xd0fa, { 16, 16, 7}},
+ {m68k_op_adda_16_pcix , 0xf1ff, 0xd0fb, { 18, 18, 9}},
+ {m68k_op_adda_16_i , 0xf1ff, 0xd0fc, { 14, 12, 4}},
+ {m68k_op_addx_8_mm_ay7 , 0xf1ff, 0xd10f, { 18, 18, 12}},
+ {m68k_op_add_8_re_pi7 , 0xf1ff, 0xd11f, { 12, 12, 8}},
+ {m68k_op_add_8_re_pd7 , 0xf1ff, 0xd127, { 14, 14, 9}},
+ {m68k_op_add_8_re_aw , 0xf1ff, 0xd138, { 16, 16, 8}},
+ {m68k_op_add_8_re_al , 0xf1ff, 0xd139, { 20, 20, 8}},
+ {m68k_op_add_16_re_aw , 0xf1ff, 0xd178, { 16, 16, 8}},
+ {m68k_op_add_16_re_al , 0xf1ff, 0xd179, { 20, 20, 8}},
+ {m68k_op_add_32_re_aw , 0xf1ff, 0xd1b8, { 24, 24, 8}},
+ {m68k_op_add_32_re_al , 0xf1ff, 0xd1b9, { 28, 28, 8}},
+ {m68k_op_adda_32_aw , 0xf1ff, 0xd1f8, { 18, 18, 6}},
+ {m68k_op_adda_32_al , 0xf1ff, 0xd1f9, { 22, 22, 6}},
+ {m68k_op_adda_32_pcdi , 0xf1ff, 0xd1fa, { 18, 18, 7}},
+ {m68k_op_adda_32_pcix , 0xf1ff, 0xd1fb, { 20, 20, 9}},
+ {m68k_op_adda_32_i , 0xf1ff, 0xd1fc, { 16, 14, 6}},
+ {m68k_op_ori_8_d , 0xfff8, 0x0000, { 8, 8, 2}},
+ {m68k_op_ori_8_ai , 0xfff8, 0x0010, { 16, 16, 8}},
+ {m68k_op_ori_8_pi , 0xfff8, 0x0018, { 16, 16, 8}},
+ {m68k_op_ori_8_pd , 0xfff8, 0x0020, { 18, 18, 9}},
+ {m68k_op_ori_8_di , 0xfff8, 0x0028, { 20, 20, 9}},
+ {m68k_op_ori_8_ix , 0xfff8, 0x0030, { 22, 22, 11}},
+ {m68k_op_ori_16_d , 0xfff8, 0x0040, { 8, 8, 2}},
+ {m68k_op_ori_16_ai , 0xfff8, 0x0050, { 16, 16, 8}},
+ {m68k_op_ori_16_pi , 0xfff8, 0x0058, { 16, 16, 8}},
+ {m68k_op_ori_16_pd , 0xfff8, 0x0060, { 18, 18, 9}},
+ {m68k_op_ori_16_di , 0xfff8, 0x0068, { 20, 20, 9}},
+ {m68k_op_ori_16_ix , 0xfff8, 0x0070, { 22, 22, 11}},
+ {m68k_op_ori_32_d , 0xfff8, 0x0080, { 16, 14, 2}},
+ {m68k_op_ori_32_ai , 0xfff8, 0x0090, { 28, 28, 8}},
+ {m68k_op_ori_32_pi , 0xfff8, 0x0098, { 28, 28, 8}},
+ {m68k_op_ori_32_pd , 0xfff8, 0x00a0, { 30, 30, 9}},
+ {m68k_op_ori_32_di , 0xfff8, 0x00a8, { 32, 32, 9}},
+ {m68k_op_ori_32_ix , 0xfff8, 0x00b0, { 34, 34, 11}},
+ {m68k_op_chk2cmp2_8_ai , 0xfff8, 0x00d0, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_8_di , 0xfff8, 0x00e8, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_8_ix , 0xfff8, 0x00f0, { 0, 0, 25}},
+ {m68k_op_andi_8_d , 0xfff8, 0x0200, { 8, 8, 2}},
+ {m68k_op_andi_8_ai , 0xfff8, 0x0210, { 16, 16, 8}},
+ {m68k_op_andi_8_pi , 0xfff8, 0x0218, { 16, 16, 8}},
+ {m68k_op_andi_8_pd , 0xfff8, 0x0220, { 18, 18, 9}},
+ {m68k_op_andi_8_di , 0xfff8, 0x0228, { 20, 20, 9}},
+ {m68k_op_andi_8_ix , 0xfff8, 0x0230, { 22, 22, 11}},
+ {m68k_op_andi_16_d , 0xfff8, 0x0240, { 8, 8, 2}},
+ {m68k_op_andi_16_ai , 0xfff8, 0x0250, { 16, 16, 8}},
+ {m68k_op_andi_16_pi , 0xfff8, 0x0258, { 16, 16, 8}},
+ {m68k_op_andi_16_pd , 0xfff8, 0x0260, { 18, 18, 9}},
+ {m68k_op_andi_16_di , 0xfff8, 0x0268, { 20, 20, 9}},
+ {m68k_op_andi_16_ix , 0xfff8, 0x0270, { 22, 22, 11}},
+ {m68k_op_andi_32_d , 0xfff8, 0x0280, { 14, 14, 2}},
+ {m68k_op_andi_32_ai , 0xfff8, 0x0290, { 28, 28, 8}},
+ {m68k_op_andi_32_pi , 0xfff8, 0x0298, { 28, 28, 8}},
+ {m68k_op_andi_32_pd , 0xfff8, 0x02a0, { 30, 30, 9}},
+ {m68k_op_andi_32_di , 0xfff8, 0x02a8, { 32, 32, 9}},
+ {m68k_op_andi_32_ix , 0xfff8, 0x02b0, { 34, 34, 11}},
+ {m68k_op_chk2cmp2_16_ai , 0xfff8, 0x02d0, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_16_di , 0xfff8, 0x02e8, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_16_ix , 0xfff8, 0x02f0, { 0, 0, 25}},
+ {m68k_op_subi_8_d , 0xfff8, 0x0400, { 8, 8, 2}},
+ {m68k_op_subi_8_ai , 0xfff8, 0x0410, { 16, 16, 8}},
+ {m68k_op_subi_8_pi , 0xfff8, 0x0418, { 16, 16, 8}},
+ {m68k_op_subi_8_pd , 0xfff8, 0x0420, { 18, 18, 9}},
+ {m68k_op_subi_8_di , 0xfff8, 0x0428, { 20, 20, 9}},
+ {m68k_op_subi_8_ix , 0xfff8, 0x0430, { 22, 22, 11}},
+ {m68k_op_subi_16_d , 0xfff8, 0x0440, { 8, 8, 2}},
+ {m68k_op_subi_16_ai , 0xfff8, 0x0450, { 16, 16, 8}},
+ {m68k_op_subi_16_pi , 0xfff8, 0x0458, { 16, 16, 8}},
+ {m68k_op_subi_16_pd , 0xfff8, 0x0460, { 18, 18, 9}},
+ {m68k_op_subi_16_di , 0xfff8, 0x0468, { 20, 20, 9}},
+ {m68k_op_subi_16_ix , 0xfff8, 0x0470, { 22, 22, 11}},
+ {m68k_op_subi_32_d , 0xfff8, 0x0480, { 16, 14, 2}},
+ {m68k_op_subi_32_ai , 0xfff8, 0x0490, { 28, 28, 8}},
+ {m68k_op_subi_32_pi , 0xfff8, 0x0498, { 28, 28, 8}},
+ {m68k_op_subi_32_pd , 0xfff8, 0x04a0, { 30, 30, 9}},
+ {m68k_op_subi_32_di , 0xfff8, 0x04a8, { 32, 32, 9}},
+ {m68k_op_subi_32_ix , 0xfff8, 0x04b0, { 34, 34, 11}},
+ {m68k_op_chk2cmp2_32_ai , 0xfff8, 0x04d0, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_32_di , 0xfff8, 0x04e8, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_32_ix , 0xfff8, 0x04f0, { 0, 0, 25}},
+ {m68k_op_addi_8_d , 0xfff8, 0x0600, { 8, 8, 2}},
+ {m68k_op_addi_8_ai , 0xfff8, 0x0610, { 16, 16, 8}},
+ {m68k_op_addi_8_pi , 0xfff8, 0x0618, { 16, 16, 8}},
+ {m68k_op_addi_8_pd , 0xfff8, 0x0620, { 18, 18, 9}},
+ {m68k_op_addi_8_di , 0xfff8, 0x0628, { 20, 20, 9}},
+ {m68k_op_addi_8_ix , 0xfff8, 0x0630, { 22, 22, 11}},
+ {m68k_op_addi_16_d , 0xfff8, 0x0640, { 8, 8, 2}},
+ {m68k_op_addi_16_ai , 0xfff8, 0x0650, { 16, 16, 8}},
+ {m68k_op_addi_16_pi , 0xfff8, 0x0658, { 16, 16, 8}},
+ {m68k_op_addi_16_pd , 0xfff8, 0x0660, { 18, 18, 9}},
+ {m68k_op_addi_16_di , 0xfff8, 0x0668, { 20, 20, 9}},
+ {m68k_op_addi_16_ix , 0xfff8, 0x0670, { 22, 22, 11}},
+ {m68k_op_addi_32_d , 0xfff8, 0x0680, { 16, 14, 2}},
+ {m68k_op_addi_32_ai , 0xfff8, 0x0690, { 28, 28, 8}},
+ {m68k_op_addi_32_pi , 0xfff8, 0x0698, { 28, 28, 8}},
+ {m68k_op_addi_32_pd , 0xfff8, 0x06a0, { 30, 30, 9}},
+ {m68k_op_addi_32_di , 0xfff8, 0x06a8, { 32, 32, 9}},
+ {m68k_op_addi_32_ix , 0xfff8, 0x06b0, { 34, 34, 11}},
+ {m68k_op_callm_32_ai , 0xfff8, 0x06d0, { 0, 0, 64}},
+ {m68k_op_callm_32_di , 0xfff8, 0x06e8, { 0, 0, 65}},
+ {m68k_op_callm_32_ix , 0xfff8, 0x06f0, { 0, 0, 67}},
+ {m68k_op_btst_32_s_d , 0xfff8, 0x0800, { 10, 10, 4}},
+ {m68k_op_btst_8_s_ai , 0xfff8, 0x0810, { 12, 12, 8}},
+ {m68k_op_btst_8_s_pi , 0xfff8, 0x0818, { 12, 12, 8}},
+ {m68k_op_btst_8_s_pd , 0xfff8, 0x0820, { 14, 14, 9}},
+ {m68k_op_btst_8_s_di , 0xfff8, 0x0828, { 16, 16, 9}},
+ {m68k_op_btst_8_s_ix , 0xfff8, 0x0830, { 18, 18, 11}},
+ {m68k_op_bchg_32_s_d , 0xfff8, 0x0840, { 12, 12, 4}},
+ {m68k_op_bchg_8_s_ai , 0xfff8, 0x0850, { 16, 16, 8}},
+ {m68k_op_bchg_8_s_pi , 0xfff8, 0x0858, { 16, 16, 8}},
+ {m68k_op_bchg_8_s_pd , 0xfff8, 0x0860, { 18, 18, 9}},
+ {m68k_op_bchg_8_s_di , 0xfff8, 0x0868, { 20, 20, 9}},
+ {m68k_op_bchg_8_s_ix , 0xfff8, 0x0870, { 22, 22, 11}},
+ {m68k_op_bclr_32_s_d , 0xfff8, 0x0880, { 14, 14, 4}},
+ {m68k_op_bclr_8_s_ai , 0xfff8, 0x0890, { 16, 16, 8}},
+ {m68k_op_bclr_8_s_pi , 0xfff8, 0x0898, { 16, 16, 8}},
+ {m68k_op_bclr_8_s_pd , 0xfff8, 0x08a0, { 18, 18, 9}},
+ {m68k_op_bclr_8_s_di , 0xfff8, 0x08a8, { 20, 20, 9}},
+ {m68k_op_bclr_8_s_ix , 0xfff8, 0x08b0, { 22, 22, 11}},
+ {m68k_op_bset_32_s_d , 0xfff8, 0x08c0, { 12, 12, 4}},
+ {m68k_op_bset_8_s_ai , 0xfff8, 0x08d0, { 16, 16, 8}},
+ {m68k_op_bset_8_s_pi , 0xfff8, 0x08d8, { 16, 16, 8}},
+ {m68k_op_bset_8_s_pd , 0xfff8, 0x08e0, { 18, 18, 9}},
+ {m68k_op_bset_8_s_di , 0xfff8, 0x08e8, { 20, 20, 9}},
+ {m68k_op_bset_8_s_ix , 0xfff8, 0x08f0, { 22, 22, 11}},
+ {m68k_op_eori_8_d , 0xfff8, 0x0a00, { 8, 8, 2}},
+ {m68k_op_eori_8_ai , 0xfff8, 0x0a10, { 16, 16, 8}},
+ {m68k_op_eori_8_pi , 0xfff8, 0x0a18, { 16, 16, 8}},
+ {m68k_op_eori_8_pd , 0xfff8, 0x0a20, { 18, 18, 9}},
+ {m68k_op_eori_8_di , 0xfff8, 0x0a28, { 20, 20, 9}},
+ {m68k_op_eori_8_ix , 0xfff8, 0x0a30, { 22, 22, 11}},
+ {m68k_op_eori_16_d , 0xfff8, 0x0a40, { 8, 8, 2}},
+ {m68k_op_eori_16_ai , 0xfff8, 0x0a50, { 16, 16, 8}},
+ {m68k_op_eori_16_pi , 0xfff8, 0x0a58, { 16, 16, 8}},
+ {m68k_op_eori_16_pd , 0xfff8, 0x0a60, { 18, 18, 9}},
+ {m68k_op_eori_16_di , 0xfff8, 0x0a68, { 20, 20, 9}},
+ {m68k_op_eori_16_ix , 0xfff8, 0x0a70, { 22, 22, 11}},
+ {m68k_op_eori_32_d , 0xfff8, 0x0a80, { 16, 14, 2}},
+ {m68k_op_eori_32_ai , 0xfff8, 0x0a90, { 28, 28, 8}},
+ {m68k_op_eori_32_pi , 0xfff8, 0x0a98, { 28, 28, 8}},
+ {m68k_op_eori_32_pd , 0xfff8, 0x0aa0, { 30, 30, 9}},
+ {m68k_op_eori_32_di , 0xfff8, 0x0aa8, { 32, 32, 9}},
+ {m68k_op_eori_32_ix , 0xfff8, 0x0ab0, { 34, 34, 11}},
+ {m68k_op_cas_8_ai , 0xfff8, 0x0ad0, { 0, 0, 16}},
+ {m68k_op_cas_8_pi , 0xfff8, 0x0ad8, { 0, 0, 16}},
+ {m68k_op_cas_8_pd , 0xfff8, 0x0ae0, { 0, 0, 17}},
+ {m68k_op_cas_8_di , 0xfff8, 0x0ae8, { 0, 0, 17}},
+ {m68k_op_cas_8_ix , 0xfff8, 0x0af0, { 0, 0, 19}},
+ {m68k_op_cmpi_8_d , 0xfff8, 0x0c00, { 8, 8, 2}},
+ {m68k_op_cmpi_8_ai , 0xfff8, 0x0c10, { 12, 12, 6}},
+ {m68k_op_cmpi_8_pi , 0xfff8, 0x0c18, { 12, 12, 6}},
+ {m68k_op_cmpi_8_pd , 0xfff8, 0x0c20, { 14, 14, 7}},
+ {m68k_op_cmpi_8_di , 0xfff8, 0x0c28, { 16, 16, 7}},
+ {m68k_op_cmpi_8_ix , 0xfff8, 0x0c30, { 18, 18, 9}},
+ {m68k_op_cmpi_16_d , 0xfff8, 0x0c40, { 8, 8, 2}},
+ {m68k_op_cmpi_16_ai , 0xfff8, 0x0c50, { 12, 12, 6}},
+ {m68k_op_cmpi_16_pi , 0xfff8, 0x0c58, { 12, 12, 6}},
+ {m68k_op_cmpi_16_pd , 0xfff8, 0x0c60, { 14, 14, 7}},
+ {m68k_op_cmpi_16_di , 0xfff8, 0x0c68, { 16, 16, 7}},
+ {m68k_op_cmpi_16_ix , 0xfff8, 0x0c70, { 18, 18, 9}},
+ {m68k_op_cmpi_32_d , 0xfff8, 0x0c80, { 14, 12, 2}},
+ {m68k_op_cmpi_32_ai , 0xfff8, 0x0c90, { 20, 20, 6}},
+ {m68k_op_cmpi_32_pi , 0xfff8, 0x0c98, { 20, 20, 6}},
+ {m68k_op_cmpi_32_pd , 0xfff8, 0x0ca0, { 22, 22, 7}},
+ {m68k_op_cmpi_32_di , 0xfff8, 0x0ca8, { 24, 24, 7}},
+ {m68k_op_cmpi_32_ix , 0xfff8, 0x0cb0, { 26, 26, 9}},
+ {m68k_op_cas_16_ai , 0xfff8, 0x0cd0, { 0, 0, 16}},
+ {m68k_op_cas_16_pi , 0xfff8, 0x0cd8, { 0, 0, 16}},
+ {m68k_op_cas_16_pd , 0xfff8, 0x0ce0, { 0, 0, 17}},
+ {m68k_op_cas_16_di , 0xfff8, 0x0ce8, { 0, 0, 17}},
+ {m68k_op_cas_16_ix , 0xfff8, 0x0cf0, { 0, 0, 19}},
+ {m68k_op_moves_8_ai , 0xfff8, 0x0e10, { 0, 18, 9}},
+ {m68k_op_moves_8_pi , 0xfff8, 0x0e18, { 0, 18, 9}},
+ {m68k_op_moves_8_pd , 0xfff8, 0x0e20, { 0, 20, 10}},
+ {m68k_op_moves_8_di , 0xfff8, 0x0e28, { 0, 26, 10}},
+ {m68k_op_moves_8_ix , 0xfff8, 0x0e30, { 0, 30, 12}},
+ {m68k_op_moves_16_ai , 0xfff8, 0x0e50, { 0, 18, 9}},
+ {m68k_op_moves_16_pi , 0xfff8, 0x0e58, { 0, 18, 9}},
+ {m68k_op_moves_16_pd , 0xfff8, 0x0e60, { 0, 20, 10}},
+ {m68k_op_moves_16_di , 0xfff8, 0x0e68, { 0, 26, 10}},
+ {m68k_op_moves_16_ix , 0xfff8, 0x0e70, { 0, 30, 12}},
+ {m68k_op_moves_32_ai , 0xfff8, 0x0e90, { 0, 22, 9}},
+ {m68k_op_moves_32_pi , 0xfff8, 0x0e98, { 0, 22, 9}},
+ {m68k_op_moves_32_pd , 0xfff8, 0x0ea0, { 0, 28, 10}},
+ {m68k_op_moves_32_di , 0xfff8, 0x0ea8, { 0, 32, 10}},
+ {m68k_op_moves_32_ix , 0xfff8, 0x0eb0, { 0, 36, 12}},
+ {m68k_op_cas_32_ai , 0xfff8, 0x0ed0, { 0, 0, 16}},
+ {m68k_op_cas_32_pi , 0xfff8, 0x0ed8, { 0, 0, 16}},
+ {m68k_op_cas_32_pd , 0xfff8, 0x0ee0, { 0, 0, 17}},
+ {m68k_op_cas_32_di , 0xfff8, 0x0ee8, { 0, 0, 17}},
+ {m68k_op_cas_32_ix , 0xfff8, 0x0ef0, { 0, 0, 19}},
+ {m68k_op_move_8_aw_d , 0xfff8, 0x11c0, { 12, 12, 4}},
+ {m68k_op_move_8_aw_ai , 0xfff8, 0x11d0, { 16, 16, 8}},
+ {m68k_op_move_8_aw_pi , 0xfff8, 0x11d8, { 16, 16, 8}},
+ {m68k_op_move_8_aw_pd , 0xfff8, 0x11e0, { 18, 18, 9}},
+ {m68k_op_move_8_aw_di , 0xfff8, 0x11e8, { 20, 20, 9}},
+ {m68k_op_move_8_aw_ix , 0xfff8, 0x11f0, { 22, 22, 11}},
+ {m68k_op_move_8_al_d , 0xfff8, 0x13c0, { 16, 16, 6}},
+ {m68k_op_move_8_al_ai , 0xfff8, 0x13d0, { 20, 20, 10}},
+ {m68k_op_move_8_al_pi , 0xfff8, 0x13d8, { 20, 20, 10}},
+ {m68k_op_move_8_al_pd , 0xfff8, 0x13e0, { 22, 22, 11}},
+ {m68k_op_move_8_al_di , 0xfff8, 0x13e8, { 24, 24, 11}},
+ {m68k_op_move_8_al_ix , 0xfff8, 0x13f0, { 26, 26, 13}},
+ {m68k_op_move_8_pi7_d , 0xfff8, 0x1ec0, { 8, 8, 4}},
+ {m68k_op_move_8_pi7_ai , 0xfff8, 0x1ed0, { 12, 12, 8}},
+ {m68k_op_move_8_pi7_pi , 0xfff8, 0x1ed8, { 12, 12, 8}},
+ {m68k_op_move_8_pi7_pd , 0xfff8, 0x1ee0, { 14, 14, 9}},
+ {m68k_op_move_8_pi7_di , 0xfff8, 0x1ee8, { 16, 16, 9}},
+ {m68k_op_move_8_pi7_ix , 0xfff8, 0x1ef0, { 18, 18, 11}},
+ {m68k_op_move_8_pd7_d , 0xfff8, 0x1f00, { 8, 8, 5}},
+ {m68k_op_move_8_pd7_ai , 0xfff8, 0x1f10, { 12, 12, 9}},
+ {m68k_op_move_8_pd7_pi , 0xfff8, 0x1f18, { 12, 12, 9}},
+ {m68k_op_move_8_pd7_pd , 0xfff8, 0x1f20, { 14, 14, 10}},
+ {m68k_op_move_8_pd7_di , 0xfff8, 0x1f28, { 16, 16, 10}},
+ {m68k_op_move_8_pd7_ix , 0xfff8, 0x1f30, { 18, 18, 12}},
+ {m68k_op_move_32_aw_d , 0xfff8, 0x21c0, { 16, 16, 4}},
+ {m68k_op_move_32_aw_a , 0xfff8, 0x21c8, { 16, 16, 4}},
+ {m68k_op_move_32_aw_ai , 0xfff8, 0x21d0, { 24, 24, 8}},
+ {m68k_op_move_32_aw_pi , 0xfff8, 0x21d8, { 24, 24, 8}},
+ {m68k_op_move_32_aw_pd , 0xfff8, 0x21e0, { 26, 26, 9}},
+ {m68k_op_move_32_aw_di , 0xfff8, 0x21e8, { 28, 28, 9}},
+ {m68k_op_move_32_aw_ix , 0xfff8, 0x21f0, { 30, 30, 11}},
+ {m68k_op_move_32_al_d , 0xfff8, 0x23c0, { 20, 20, 6}},
+ {m68k_op_move_32_al_a , 0xfff8, 0x23c8, { 20, 20, 6}},
+ {m68k_op_move_32_al_ai , 0xfff8, 0x23d0, { 28, 28, 10}},
+ {m68k_op_move_32_al_pi , 0xfff8, 0x23d8, { 28, 28, 10}},
+ {m68k_op_move_32_al_pd , 0xfff8, 0x23e0, { 30, 30, 11}},
+ {m68k_op_move_32_al_di , 0xfff8, 0x23e8, { 32, 32, 11}},
+ {m68k_op_move_32_al_ix , 0xfff8, 0x23f0, { 34, 34, 13}},
+ {m68k_op_move_16_aw_d , 0xfff8, 0x31c0, { 12, 12, 4}},
+ {m68k_op_move_16_aw_a , 0xfff8, 0x31c8, { 12, 12, 4}},
+ {m68k_op_move_16_aw_ai , 0xfff8, 0x31d0, { 16, 16, 8}},
+ {m68k_op_move_16_aw_pi , 0xfff8, 0x31d8, { 16, 16, 8}},
+ {m68k_op_move_16_aw_pd , 0xfff8, 0x31e0, { 18, 18, 9}},
+ {m68k_op_move_16_aw_di , 0xfff8, 0x31e8, { 20, 20, 9}},
+ {m68k_op_move_16_aw_ix , 0xfff8, 0x31f0, { 22, 22, 11}},
+ {m68k_op_move_16_al_d , 0xfff8, 0x33c0, { 16, 16, 6}},
+ {m68k_op_move_16_al_a , 0xfff8, 0x33c8, { 16, 16, 6}},
+ {m68k_op_move_16_al_ai , 0xfff8, 0x33d0, { 20, 20, 10}},
+ {m68k_op_move_16_al_pi , 0xfff8, 0x33d8, { 20, 20, 10}},
+ {m68k_op_move_16_al_pd , 0xfff8, 0x33e0, { 22, 22, 11}},
+ {m68k_op_move_16_al_di , 0xfff8, 0x33e8, { 24, 24, 11}},
+ {m68k_op_move_16_al_ix , 0xfff8, 0x33f0, { 26, 26, 13}},
+ {m68k_op_negx_8_d , 0xfff8, 0x4000, { 4, 4, 2}},
+ {m68k_op_negx_8_ai , 0xfff8, 0x4010, { 12, 12, 8}},
+ {m68k_op_negx_8_pi , 0xfff8, 0x4018, { 12, 12, 8}},
+ {m68k_op_negx_8_pd , 0xfff8, 0x4020, { 14, 14, 9}},
+ {m68k_op_negx_8_di , 0xfff8, 0x4028, { 16, 16, 9}},
+ {m68k_op_negx_8_ix , 0xfff8, 0x4030, { 18, 18, 11}},
+ {m68k_op_negx_16_d , 0xfff8, 0x4040, { 4, 4, 2}},
+ {m68k_op_negx_16_ai , 0xfff8, 0x4050, { 12, 12, 8}},
+ {m68k_op_negx_16_pi , 0xfff8, 0x4058, { 12, 12, 8}},
+ {m68k_op_negx_16_pd , 0xfff8, 0x4060, { 14, 14, 9}},
+ {m68k_op_negx_16_di , 0xfff8, 0x4068, { 16, 16, 9}},
+ {m68k_op_negx_16_ix , 0xfff8, 0x4070, { 18, 18, 11}},
+ {m68k_op_negx_32_d , 0xfff8, 0x4080, { 6, 6, 2}},
+ {m68k_op_negx_32_ai , 0xfff8, 0x4090, { 20, 20, 8}},
+ {m68k_op_negx_32_pi , 0xfff8, 0x4098, { 20, 20, 8}},
+ {m68k_op_negx_32_pd , 0xfff8, 0x40a0, { 22, 22, 9}},
+ {m68k_op_negx_32_di , 0xfff8, 0x40a8, { 24, 24, 9}},
+ {m68k_op_negx_32_ix , 0xfff8, 0x40b0, { 26, 26, 11}},
+ {m68k_op_move_16_frs_d , 0xfff8, 0x40c0, { 6, 4, 8}},
+ {m68k_op_move_16_frs_ai , 0xfff8, 0x40d0, { 12, 12, 12}},
+ {m68k_op_move_16_frs_pi , 0xfff8, 0x40d8, { 12, 12, 12}},
+ {m68k_op_move_16_frs_pd , 0xfff8, 0x40e0, { 14, 14, 13}},
+ {m68k_op_move_16_frs_di , 0xfff8, 0x40e8, { 16, 16, 13}},
+ {m68k_op_move_16_frs_ix , 0xfff8, 0x40f0, { 18, 18, 15}},
+ {m68k_op_clr_8_d , 0xfff8, 0x4200, { 4, 4, 2}},
+ {m68k_op_clr_8_ai , 0xfff8, 0x4210, { 12, 8, 8}},
+ {m68k_op_clr_8_pi , 0xfff8, 0x4218, { 12, 8, 8}},
+ {m68k_op_clr_8_pd , 0xfff8, 0x4220, { 14, 10, 9}},
+ {m68k_op_clr_8_di , 0xfff8, 0x4228, { 16, 12, 9}},
+ {m68k_op_clr_8_ix , 0xfff8, 0x4230, { 18, 14, 11}},
+ {m68k_op_clr_16_d , 0xfff8, 0x4240, { 4, 4, 2}},
+ {m68k_op_clr_16_ai , 0xfff8, 0x4250, { 12, 8, 8}},
+ {m68k_op_clr_16_pi , 0xfff8, 0x4258, { 12, 8, 8}},
+ {m68k_op_clr_16_pd , 0xfff8, 0x4260, { 14, 10, 9}},
+ {m68k_op_clr_16_di , 0xfff8, 0x4268, { 16, 12, 9}},
+ {m68k_op_clr_16_ix , 0xfff8, 0x4270, { 18, 14, 11}},
+ {m68k_op_clr_32_d , 0xfff8, 0x4280, { 6, 6, 2}},
+ {m68k_op_clr_32_ai , 0xfff8, 0x4290, { 20, 12, 8}},
+ {m68k_op_clr_32_pi , 0xfff8, 0x4298, { 20, 12, 8}},
+ {m68k_op_clr_32_pd , 0xfff8, 0x42a0, { 22, 14, 9}},
+ {m68k_op_clr_32_di , 0xfff8, 0x42a8, { 24, 16, 9}},
+ {m68k_op_clr_32_ix , 0xfff8, 0x42b0, { 26, 20, 11}},
+ {m68k_op_move_16_frc_d , 0xfff8, 0x42c0, { 0, 4, 4}},
+ {m68k_op_move_16_frc_ai , 0xfff8, 0x42d0, { 0, 12, 8}},
+ {m68k_op_move_16_frc_pi , 0xfff8, 0x42d8, { 0, 12, 8}},
+ {m68k_op_move_16_frc_pd , 0xfff8, 0x42e0, { 0, 14, 9}},
+ {m68k_op_move_16_frc_di , 0xfff8, 0x42e8, { 0, 16, 9}},
+ {m68k_op_move_16_frc_ix , 0xfff8, 0x42f0, { 0, 18, 11}},
+ {m68k_op_neg_8_d , 0xfff8, 0x4400, { 4, 4, 2}},
+ {m68k_op_neg_8_ai , 0xfff8, 0x4410, { 12, 12, 8}},
+ {m68k_op_neg_8_pi , 0xfff8, 0x4418, { 12, 12, 8}},
+ {m68k_op_neg_8_pd , 0xfff8, 0x4420, { 14, 14, 9}},
+ {m68k_op_neg_8_di , 0xfff8, 0x4428, { 16, 16, 9}},
+ {m68k_op_neg_8_ix , 0xfff8, 0x4430, { 18, 18, 11}},
+ {m68k_op_neg_16_d , 0xfff8, 0x4440, { 4, 4, 2}},
+ {m68k_op_neg_16_ai , 0xfff8, 0x4450, { 12, 12, 8}},
+ {m68k_op_neg_16_pi , 0xfff8, 0x4458, { 12, 12, 8}},
+ {m68k_op_neg_16_pd , 0xfff8, 0x4460, { 14, 14, 9}},
+ {m68k_op_neg_16_di , 0xfff8, 0x4468, { 16, 16, 9}},
+ {m68k_op_neg_16_ix , 0xfff8, 0x4470, { 18, 18, 11}},
+ {m68k_op_neg_32_d , 0xfff8, 0x4480, { 6, 6, 2}},
+ {m68k_op_neg_32_ai , 0xfff8, 0x4490, { 20, 20, 8}},
+ {m68k_op_neg_32_pi , 0xfff8, 0x4498, { 20, 20, 8}},
+ {m68k_op_neg_32_pd , 0xfff8, 0x44a0, { 22, 22, 9}},
+ {m68k_op_neg_32_di , 0xfff8, 0x44a8, { 24, 24, 9}},
+ {m68k_op_neg_32_ix , 0xfff8, 0x44b0, { 26, 26, 11}},
+ {m68k_op_move_16_toc_d , 0xfff8, 0x44c0, { 12, 12, 4}},
+ {m68k_op_move_16_toc_ai , 0xfff8, 0x44d0, { 16, 16, 8}},
+ {m68k_op_move_16_toc_pi , 0xfff8, 0x44d8, { 16, 16, 8}},
+ {m68k_op_move_16_toc_pd , 0xfff8, 0x44e0, { 18, 18, 9}},
+ {m68k_op_move_16_toc_di , 0xfff8, 0x44e8, { 20, 20, 9}},
+ {m68k_op_move_16_toc_ix , 0xfff8, 0x44f0, { 22, 22, 11}},
+ {m68k_op_not_8_d , 0xfff8, 0x4600, { 4, 4, 2}},
+ {m68k_op_not_8_ai , 0xfff8, 0x4610, { 12, 12, 8}},
+ {m68k_op_not_8_pi , 0xfff8, 0x4618, { 12, 12, 8}},
+ {m68k_op_not_8_pd , 0xfff8, 0x4620, { 14, 14, 9}},
+ {m68k_op_not_8_di , 0xfff8, 0x4628, { 16, 16, 9}},
+ {m68k_op_not_8_ix , 0xfff8, 0x4630, { 18, 18, 11}},
+ {m68k_op_not_16_d , 0xfff8, 0x4640, { 4, 4, 2}},
+ {m68k_op_not_16_ai , 0xfff8, 0x4650, { 12, 12, 8}},
+ {m68k_op_not_16_pi , 0xfff8, 0x4658, { 12, 12, 8}},
+ {m68k_op_not_16_pd , 0xfff8, 0x4660, { 14, 14, 9}},
+ {m68k_op_not_16_di , 0xfff8, 0x4668, { 16, 16, 9}},
+ {m68k_op_not_16_ix , 0xfff8, 0x4670, { 18, 18, 11}},
+ {m68k_op_not_32_d , 0xfff8, 0x4680, { 6, 6, 2}},
+ {m68k_op_not_32_ai , 0xfff8, 0x4690, { 20, 20, 8}},
+ {m68k_op_not_32_pi , 0xfff8, 0x4698, { 20, 20, 8}},
+ {m68k_op_not_32_pd , 0xfff8, 0x46a0, { 22, 22, 9}},
+ {m68k_op_not_32_di , 0xfff8, 0x46a8, { 24, 24, 9}},
+ {m68k_op_not_32_ix , 0xfff8, 0x46b0, { 26, 26, 11}},
+ {m68k_op_move_16_tos_d , 0xfff8, 0x46c0, { 12, 12, 8}},
+ {m68k_op_move_16_tos_ai , 0xfff8, 0x46d0, { 16, 16, 12}},
+ {m68k_op_move_16_tos_pi , 0xfff8, 0x46d8, { 16, 16, 12}},
+ {m68k_op_move_16_tos_pd , 0xfff8, 0x46e0, { 18, 18, 13}},
+ {m68k_op_move_16_tos_di , 0xfff8, 0x46e8, { 20, 20, 13}},
+ {m68k_op_move_16_tos_ix , 0xfff8, 0x46f0, { 22, 22, 15}},
+ {m68k_op_nbcd_8_d , 0xfff8, 0x4800, { 6, 6, 6}},
+ {m68k_op_link_32 , 0xfff8, 0x4808, { 0, 0, 6}},
+ {m68k_op_nbcd_8_ai , 0xfff8, 0x4810, { 12, 12, 10}},
+ {m68k_op_nbcd_8_pi , 0xfff8, 0x4818, { 12, 12, 10}},
+ {m68k_op_nbcd_8_pd , 0xfff8, 0x4820, { 14, 14, 11}},
+ {m68k_op_nbcd_8_di , 0xfff8, 0x4828, { 16, 16, 11}},
+ {m68k_op_nbcd_8_ix , 0xfff8, 0x4830, { 18, 18, 13}},
+ {m68k_op_swap_32 , 0xfff8, 0x4840, { 4, 4, 4}},
+ {m68k_op_bkpt , 0xfff8, 0x4848, { 0, 10, 10}},
+ {m68k_op_pea_32_ai , 0xfff8, 0x4850, { 10, 10, 9}},
+ {m68k_op_pea_32_di , 0xfff8, 0x4868, { 16, 16, 10}},
+ {m68k_op_pea_32_ix , 0xfff8, 0x4870, { 20, 20, 12}},
+ {m68k_op_ext_16 , 0xfff8, 0x4880, { 4, 4, 4}},
+ {m68k_op_movem_16_re_ai , 0xfff8, 0x4890, { 12, 12, 8}},
+ {m68k_op_movem_16_re_pd , 0xfff8, 0x48a0, { 8, 8, 4}},
+ {m68k_op_movem_16_re_di , 0xfff8, 0x48a8, { 16, 16, 9}},
+ {m68k_op_movem_16_re_ix , 0xfff8, 0x48b0, { 18, 18, 11}},
+ {m68k_op_ext_32 , 0xfff8, 0x48c0, { 4, 4, 4}},
+ {m68k_op_movem_32_re_ai , 0xfff8, 0x48d0, { 16, 16, 8}},
+ {m68k_op_movem_32_re_pd , 0xfff8, 0x48e0, { 8, 8, 4}},
+ {m68k_op_movem_32_re_di , 0xfff8, 0x48e8, { 20, 20, 9}},
+ {m68k_op_movem_32_re_ix , 0xfff8, 0x48f0, { 22, 22, 11}},
+ {m68k_op_extb_32 , 0xfff8, 0x49c0, { 0, 0, 4}},
+ {m68k_op_tst_8_d , 0xfff8, 0x4a00, { 4, 4, 2}},
+ {m68k_op_tst_8_ai , 0xfff8, 0x4a10, { 8, 8, 6}},
+ {m68k_op_tst_8_pi , 0xfff8, 0x4a18, { 8, 8, 6}},
+ {m68k_op_tst_8_pd , 0xfff8, 0x4a20, { 10, 10, 7}},
+ {m68k_op_tst_8_di , 0xfff8, 0x4a28, { 12, 12, 7}},
+ {m68k_op_tst_8_ix , 0xfff8, 0x4a30, { 14, 14, 9}},
+ {m68k_op_tst_16_d , 0xfff8, 0x4a40, { 4, 4, 2}},
+ {m68k_op_tst_16_a , 0xfff8, 0x4a48, { 0, 0, 2}},
+ {m68k_op_tst_16_ai , 0xfff8, 0x4a50, { 8, 8, 6}},
+ {m68k_op_tst_16_pi , 0xfff8, 0x4a58, { 8, 8, 6}},
+ {m68k_op_tst_16_pd , 0xfff8, 0x4a60, { 10, 10, 7}},
+ {m68k_op_tst_16_di , 0xfff8, 0x4a68, { 12, 12, 7}},
+ {m68k_op_tst_16_ix , 0xfff8, 0x4a70, { 14, 14, 9}},
+ {m68k_op_tst_32_d , 0xfff8, 0x4a80, { 4, 4, 2}},
+ {m68k_op_tst_32_a , 0xfff8, 0x4a88, { 0, 0, 2}},
+ {m68k_op_tst_32_ai , 0xfff8, 0x4a90, { 12, 12, 6}},
+ {m68k_op_tst_32_pi , 0xfff8, 0x4a98, { 12, 12, 6}},
+ {m68k_op_tst_32_pd , 0xfff8, 0x4aa0, { 14, 14, 7}},
+ {m68k_op_tst_32_di , 0xfff8, 0x4aa8, { 16, 16, 7}},
+ {m68k_op_tst_32_ix , 0xfff8, 0x4ab0, { 18, 18, 9}},
+ {m68k_op_tas_8_d , 0xfff8, 0x4ac0, { 4, 4, 4}},
+ {m68k_op_tas_8_ai , 0xfff8, 0x4ad0, { 18, 18, 16}},
+ {m68k_op_tas_8_pi , 0xfff8, 0x4ad8, { 18, 18, 16}},
+ {m68k_op_tas_8_pd , 0xfff8, 0x4ae0, { 20, 20, 17}},
+ {m68k_op_tas_8_di , 0xfff8, 0x4ae8, { 22, 22, 17}},
+ {m68k_op_tas_8_ix , 0xfff8, 0x4af0, { 24, 24, 19}},
+ {m68k_op_mull_32_d , 0xfff8, 0x4c00, { 0, 0, 43}},
+ {m68k_op_mull_32_ai , 0xfff8, 0x4c10, { 0, 0, 47}},
+ {m68k_op_mull_32_pi , 0xfff8, 0x4c18, { 0, 0, 47}},
+ {m68k_op_mull_32_pd , 0xfff8, 0x4c20, { 0, 0, 48}},
+ {m68k_op_mull_32_di , 0xfff8, 0x4c28, { 0, 0, 48}},
+ {m68k_op_mull_32_ix , 0xfff8, 0x4c30, { 0, 0, 50}},
+ {m68k_op_divl_32_d , 0xfff8, 0x4c40, { 0, 0, 84}},
+ {m68k_op_divl_32_ai , 0xfff8, 0x4c50, { 0, 0, 88}},
+ {m68k_op_divl_32_pi , 0xfff8, 0x4c58, { 0, 0, 88}},
+ {m68k_op_divl_32_pd , 0xfff8, 0x4c60, { 0, 0, 89}},
+ {m68k_op_divl_32_di , 0xfff8, 0x4c68, { 0, 0, 89}},
+ {m68k_op_divl_32_ix , 0xfff8, 0x4c70, { 0, 0, 91}},
+ {m68k_op_movem_16_er_ai , 0xfff8, 0x4c90, { 16, 16, 12}},
+ {m68k_op_movem_16_er_pi , 0xfff8, 0x4c98, { 12, 12, 8}},
+ {m68k_op_movem_16_er_di , 0xfff8, 0x4ca8, { 20, 20, 13}},
+ {m68k_op_movem_16_er_ix , 0xfff8, 0x4cb0, { 22, 22, 15}},
+ {m68k_op_movem_32_er_ai , 0xfff8, 0x4cd0, { 20, 20, 12}},
+ {m68k_op_movem_32_er_pi , 0xfff8, 0x4cd8, { 12, 12, 8}},
+ {m68k_op_movem_32_er_di , 0xfff8, 0x4ce8, { 24, 24, 13}},
+ {m68k_op_movem_32_er_ix , 0xfff8, 0x4cf0, { 26, 26, 15}},
+ {m68k_op_link_16 , 0xfff8, 0x4e50, { 16, 16, 5}},
+ {m68k_op_unlk_32 , 0xfff8, 0x4e58, { 12, 12, 6}},
+ {m68k_op_move_32_tou , 0xfff8, 0x4e60, { 4, 6, 2}},
+ {m68k_op_move_32_fru , 0xfff8, 0x4e68, { 4, 6, 2}},
+ {m68k_op_jsr_32_ai , 0xfff8, 0x4e90, { 16, 16, 4}},
+ {m68k_op_jsr_32_di , 0xfff8, 0x4ea8, { 18, 18, 5}},
+ {m68k_op_jsr_32_ix , 0xfff8, 0x4eb0, { 22, 22, 7}},
+ {m68k_op_jmp_32_ai , 0xfff8, 0x4ed0, { 8, 8, 4}},
+ {m68k_op_jmp_32_di , 0xfff8, 0x4ee8, { 10, 10, 5}},
+ {m68k_op_jmp_32_ix , 0xfff8, 0x4ef0, { 12, 12, 7}},
+ {m68k_op_st_8_d , 0xfff8, 0x50c0, { 6, 4, 4}},
+ {m68k_op_dbt_16 , 0xfff8, 0x50c8, { 12, 12, 6}},
+ {m68k_op_st_8_ai , 0xfff8, 0x50d0, { 12, 12, 10}},
+ {m68k_op_st_8_pi , 0xfff8, 0x50d8, { 12, 12, 10}},
+ {m68k_op_st_8_pd , 0xfff8, 0x50e0, { 14, 14, 11}},
+ {m68k_op_st_8_di , 0xfff8, 0x50e8, { 16, 16, 11}},
+ {m68k_op_st_8_ix , 0xfff8, 0x50f0, { 18, 18, 13}},
+ {m68k_op_sf_8_d , 0xfff8, 0x51c0, { 4, 4, 4}},
+ {m68k_op_dbf_16 , 0xfff8, 0x51c8, { 14, 14, 6}},
+ {m68k_op_sf_8_ai , 0xfff8, 0x51d0, { 12, 12, 10}},
+ {m68k_op_sf_8_pi , 0xfff8, 0x51d8, { 12, 12, 10}},
+ {m68k_op_sf_8_pd , 0xfff8, 0x51e0, { 14, 14, 11}},
+ {m68k_op_sf_8_di , 0xfff8, 0x51e8, { 16, 16, 11}},
+ {m68k_op_sf_8_ix , 0xfff8, 0x51f0, { 18, 18, 13}},
+ {m68k_op_shi_8_d , 0xfff8, 0x52c0, { 4, 4, 4}},
+ {m68k_op_dbhi_16 , 0xfff8, 0x52c8, { 12, 12, 6}},
+ {m68k_op_shi_8_ai , 0xfff8, 0x52d0, { 12, 12, 10}},
+ {m68k_op_shi_8_pi , 0xfff8, 0x52d8, { 12, 12, 10}},
+ {m68k_op_shi_8_pd , 0xfff8, 0x52e0, { 14, 14, 11}},
+ {m68k_op_shi_8_di , 0xfff8, 0x52e8, { 16, 16, 11}},
+ {m68k_op_shi_8_ix , 0xfff8, 0x52f0, { 18, 18, 13}},
+ {m68k_op_sls_8_d , 0xfff8, 0x53c0, { 4, 4, 4}},
+ {m68k_op_dbls_16 , 0xfff8, 0x53c8, { 12, 12, 6}},
+ {m68k_op_sls_8_ai , 0xfff8, 0x53d0, { 12, 12, 10}},
+ {m68k_op_sls_8_pi , 0xfff8, 0x53d8, { 12, 12, 10}},
+ {m68k_op_sls_8_pd , 0xfff8, 0x53e0, { 14, 14, 11}},
+ {m68k_op_sls_8_di , 0xfff8, 0x53e8, { 16, 16, 11}},
+ {m68k_op_sls_8_ix , 0xfff8, 0x53f0, { 18, 18, 13}},
+ {m68k_op_scc_8_d , 0xfff8, 0x54c0, { 4, 4, 4}},
+ {m68k_op_dbcc_16 , 0xfff8, 0x54c8, { 12, 12, 6}},
+ {m68k_op_scc_8_ai , 0xfff8, 0x54d0, { 12, 12, 10}},
+ {m68k_op_scc_8_pi , 0xfff8, 0x54d8, { 12, 12, 10}},
+ {m68k_op_scc_8_pd , 0xfff8, 0x54e0, { 14, 14, 11}},
+ {m68k_op_scc_8_di , 0xfff8, 0x54e8, { 16, 16, 11}},
+ {m68k_op_scc_8_ix , 0xfff8, 0x54f0, { 18, 18, 13}},
+ {m68k_op_scs_8_d , 0xfff8, 0x55c0, { 4, 4, 4}},
+ {m68k_op_dbcs_16 , 0xfff8, 0x55c8, { 12, 12, 6}},
+ {m68k_op_scs_8_ai , 0xfff8, 0x55d0, { 12, 12, 10}},
+ {m68k_op_scs_8_pi , 0xfff8, 0x55d8, { 12, 12, 10}},
+ {m68k_op_scs_8_pd , 0xfff8, 0x55e0, { 14, 14, 11}},
+ {m68k_op_scs_8_di , 0xfff8, 0x55e8, { 16, 16, 11}},
+ {m68k_op_scs_8_ix , 0xfff8, 0x55f0, { 18, 18, 13}},
+ {m68k_op_sne_8_d , 0xfff8, 0x56c0, { 4, 4, 4}},
+ {m68k_op_dbne_16 , 0xfff8, 0x56c8, { 12, 12, 6}},
+ {m68k_op_sne_8_ai , 0xfff8, 0x56d0, { 12, 12, 10}},
+ {m68k_op_sne_8_pi , 0xfff8, 0x56d8, { 12, 12, 10}},
+ {m68k_op_sne_8_pd , 0xfff8, 0x56e0, { 14, 14, 11}},
+ {m68k_op_sne_8_di , 0xfff8, 0x56e8, { 16, 16, 11}},
+ {m68k_op_sne_8_ix , 0xfff8, 0x56f0, { 18, 18, 13}},
+ {m68k_op_seq_8_d , 0xfff8, 0x57c0, { 4, 4, 4}},
+ {m68k_op_dbeq_16 , 0xfff8, 0x57c8, { 12, 12, 6}},
+ {m68k_op_seq_8_ai , 0xfff8, 0x57d0, { 12, 12, 10}},
+ {m68k_op_seq_8_pi , 0xfff8, 0x57d8, { 12, 12, 10}},
+ {m68k_op_seq_8_pd , 0xfff8, 0x57e0, { 14, 14, 11}},
+ {m68k_op_seq_8_di , 0xfff8, 0x57e8, { 16, 16, 11}},
+ {m68k_op_seq_8_ix , 0xfff8, 0x57f0, { 18, 18, 13}},
+ {m68k_op_svc_8_d , 0xfff8, 0x58c0, { 4, 4, 4}},
+ {m68k_op_dbvc_16 , 0xfff8, 0x58c8, { 12, 12, 6}},
+ {m68k_op_svc_8_ai , 0xfff8, 0x58d0, { 12, 12, 10}},
+ {m68k_op_svc_8_pi , 0xfff8, 0x58d8, { 12, 12, 10}},
+ {m68k_op_svc_8_pd , 0xfff8, 0x58e0, { 14, 14, 11}},
+ {m68k_op_svc_8_di , 0xfff8, 0x58e8, { 16, 16, 11}},
+ {m68k_op_svc_8_ix , 0xfff8, 0x58f0, { 18, 18, 13}},
+ {m68k_op_svs_8_d , 0xfff8, 0x59c0, { 4, 4, 4}},
+ {m68k_op_dbvs_16 , 0xfff8, 0x59c8, { 12, 12, 6}},
+ {m68k_op_svs_8_ai , 0xfff8, 0x59d0, { 12, 12, 10}},
+ {m68k_op_svs_8_pi , 0xfff8, 0x59d8, { 12, 12, 10}},
+ {m68k_op_svs_8_pd , 0xfff8, 0x59e0, { 14, 14, 11}},
+ {m68k_op_svs_8_di , 0xfff8, 0x59e8, { 16, 16, 11}},
+ {m68k_op_svs_8_ix , 0xfff8, 0x59f0, { 18, 18, 13}},
+ {m68k_op_spl_8_d , 0xfff8, 0x5ac0, { 4, 4, 4}},
+ {m68k_op_dbpl_16 , 0xfff8, 0x5ac8, { 12, 12, 6}},
+ {m68k_op_spl_8_ai , 0xfff8, 0x5ad0, { 12, 12, 10}},
+ {m68k_op_spl_8_pi , 0xfff8, 0x5ad8, { 12, 12, 10}},
+ {m68k_op_spl_8_pd , 0xfff8, 0x5ae0, { 14, 14, 11}},
+ {m68k_op_spl_8_di , 0xfff8, 0x5ae8, { 16, 16, 11}},
+ {m68k_op_spl_8_ix , 0xfff8, 0x5af0, { 18, 18, 13}},
+ {m68k_op_smi_8_d , 0xfff8, 0x5bc0, { 4, 4, 4}},
+ {m68k_op_dbmi_16 , 0xfff8, 0x5bc8, { 12, 12, 6}},
+ {m68k_op_smi_8_ai , 0xfff8, 0x5bd0, { 12, 12, 10}},
+ {m68k_op_smi_8_pi , 0xfff8, 0x5bd8, { 12, 12, 10}},
+ {m68k_op_smi_8_pd , 0xfff8, 0x5be0, { 14, 14, 11}},
+ {m68k_op_smi_8_di , 0xfff8, 0x5be8, { 16, 16, 11}},
+ {m68k_op_smi_8_ix , 0xfff8, 0x5bf0, { 18, 18, 13}},
+ {m68k_op_sge_8_d , 0xfff8, 0x5cc0, { 4, 4, 4}},
+ {m68k_op_dbge_16 , 0xfff8, 0x5cc8, { 12, 12, 6}},
+ {m68k_op_sge_8_ai , 0xfff8, 0x5cd0, { 12, 12, 10}},
+ {m68k_op_sge_8_pi , 0xfff8, 0x5cd8, { 12, 12, 10}},
+ {m68k_op_sge_8_pd , 0xfff8, 0x5ce0, { 14, 14, 11}},
+ {m68k_op_sge_8_di , 0xfff8, 0x5ce8, { 16, 16, 11}},
+ {m68k_op_sge_8_ix , 0xfff8, 0x5cf0, { 18, 18, 13}},
+ {m68k_op_slt_8_d , 0xfff8, 0x5dc0, { 4, 4, 4}},
+ {m68k_op_dblt_16 , 0xfff8, 0x5dc8, { 12, 12, 6}},
+ {m68k_op_slt_8_ai , 0xfff8, 0x5dd0, { 12, 12, 10}},
+ {m68k_op_slt_8_pi , 0xfff8, 0x5dd8, { 12, 12, 10}},
+ {m68k_op_slt_8_pd , 0xfff8, 0x5de0, { 14, 14, 11}},
+ {m68k_op_slt_8_di , 0xfff8, 0x5de8, { 16, 16, 11}},
+ {m68k_op_slt_8_ix , 0xfff8, 0x5df0, { 18, 18, 13}},
+ {m68k_op_sgt_8_d , 0xfff8, 0x5ec0, { 4, 4, 4}},
+ {m68k_op_dbgt_16 , 0xfff8, 0x5ec8, { 12, 12, 6}},
+ {m68k_op_sgt_8_ai , 0xfff8, 0x5ed0, { 12, 12, 10}},
+ {m68k_op_sgt_8_pi , 0xfff8, 0x5ed8, { 12, 12, 10}},
+ {m68k_op_sgt_8_pd , 0xfff8, 0x5ee0, { 14, 14, 11}},
+ {m68k_op_sgt_8_di , 0xfff8, 0x5ee8, { 16, 16, 11}},
+ {m68k_op_sgt_8_ix , 0xfff8, 0x5ef0, { 18, 18, 13}},
+ {m68k_op_sle_8_d , 0xfff8, 0x5fc0, { 4, 4, 4}},
+ {m68k_op_dble_16 , 0xfff8, 0x5fc8, { 12, 12, 6}},
+ {m68k_op_sle_8_ai , 0xfff8, 0x5fd0, { 12, 12, 10}},
+ {m68k_op_sle_8_pi , 0xfff8, 0x5fd8, { 12, 12, 10}},
+ {m68k_op_sle_8_pd , 0xfff8, 0x5fe0, { 14, 14, 11}},
+ {m68k_op_sle_8_di , 0xfff8, 0x5fe8, { 16, 16, 11}},
+ {m68k_op_sle_8_ix , 0xfff8, 0x5ff0, { 18, 18, 13}},
+ {m68k_op_sbcd_8_mm_ax7 , 0xfff8, 0x8f08, { 18, 18, 16}},
+ {m68k_op_pack_16_mm_ax7 , 0xfff8, 0x8f48, { 0, 0, 13}},
+ {m68k_op_unpk_16_mm_ax7 , 0xfff8, 0x8f88, { 0, 0, 13}},
+ {m68k_op_subx_8_mm_ax7 , 0xfff8, 0x9f08, { 18, 18, 12}},
+ {m68k_op_cmpm_8_ax7 , 0xfff8, 0xbf08, { 12, 12, 9}},
+ {m68k_op_abcd_8_mm_ax7 , 0xfff8, 0xcf08, { 18, 18, 16}},
+ {m68k_op_addx_8_mm_ax7 , 0xfff8, 0xdf08, { 18, 18, 12}},
+ {m68k_op_asr_16_ai , 0xfff8, 0xe0d0, { 12, 12, 9}},
+ {m68k_op_asr_16_pi , 0xfff8, 0xe0d8, { 12, 12, 9}},
+ {m68k_op_asr_16_pd , 0xfff8, 0xe0e0, { 14, 14, 10}},
+ {m68k_op_asr_16_di , 0xfff8, 0xe0e8, { 16, 16, 10}},
+ {m68k_op_asr_16_ix , 0xfff8, 0xe0f0, { 18, 18, 12}},
+ {m68k_op_asl_16_ai , 0xfff8, 0xe1d0, { 12, 12, 10}},
+ {m68k_op_asl_16_pi , 0xfff8, 0xe1d8, { 12, 12, 10}},
+ {m68k_op_asl_16_pd , 0xfff8, 0xe1e0, { 14, 14, 11}},
+ {m68k_op_asl_16_di , 0xfff8, 0xe1e8, { 16, 16, 11}},
+ {m68k_op_asl_16_ix , 0xfff8, 0xe1f0, { 18, 18, 13}},
+ {m68k_op_lsr_16_ai , 0xfff8, 0xe2d0, { 12, 12, 9}},
+ {m68k_op_lsr_16_pi , 0xfff8, 0xe2d8, { 12, 12, 9}},
+ {m68k_op_lsr_16_pd , 0xfff8, 0xe2e0, { 14, 14, 10}},
+ {m68k_op_lsr_16_di , 0xfff8, 0xe2e8, { 16, 16, 10}},
+ {m68k_op_lsr_16_ix , 0xfff8, 0xe2f0, { 18, 18, 12}},
+ {m68k_op_lsl_16_ai , 0xfff8, 0xe3d0, { 12, 12, 9}},
+ {m68k_op_lsl_16_pi , 0xfff8, 0xe3d8, { 12, 12, 9}},
+ {m68k_op_lsl_16_pd , 0xfff8, 0xe3e0, { 14, 14, 10}},
+ {m68k_op_lsl_16_di , 0xfff8, 0xe3e8, { 16, 16, 10}},
+ {m68k_op_lsl_16_ix , 0xfff8, 0xe3f0, { 18, 18, 12}},
+ {m68k_op_roxr_16_ai , 0xfff8, 0xe4d0, { 12, 12, 9}},
+ {m68k_op_roxr_16_pi , 0xfff8, 0xe4d8, { 12, 12, 9}},
+ {m68k_op_roxr_16_pd , 0xfff8, 0xe4e0, { 14, 14, 10}},
+ {m68k_op_roxr_16_di , 0xfff8, 0xe4e8, { 16, 16, 10}},
+ {m68k_op_roxr_16_ix , 0xfff8, 0xe4f0, { 18, 18, 12}},
+ {m68k_op_roxl_16_ai , 0xfff8, 0xe5d0, { 12, 12, 9}},
+ {m68k_op_roxl_16_pi , 0xfff8, 0xe5d8, { 12, 12, 9}},
+ {m68k_op_roxl_16_pd , 0xfff8, 0xe5e0, { 14, 14, 10}},
+ {m68k_op_roxl_16_di , 0xfff8, 0xe5e8, { 16, 16, 10}},
+ {m68k_op_roxl_16_ix , 0xfff8, 0xe5f0, { 18, 18, 12}},
+ {m68k_op_ror_16_ai , 0xfff8, 0xe6d0, { 12, 12, 11}},
+ {m68k_op_ror_16_pi , 0xfff8, 0xe6d8, { 12, 12, 11}},
+ {m68k_op_ror_16_pd , 0xfff8, 0xe6e0, { 14, 14, 12}},
+ {m68k_op_ror_16_di , 0xfff8, 0xe6e8, { 16, 16, 12}},
+ {m68k_op_ror_16_ix , 0xfff8, 0xe6f0, { 18, 18, 14}},
+ {m68k_op_rol_16_ai , 0xfff8, 0xe7d0, { 12, 12, 11}},
+ {m68k_op_rol_16_pi , 0xfff8, 0xe7d8, { 12, 12, 11}},
+ {m68k_op_rol_16_pd , 0xfff8, 0xe7e0, { 14, 14, 12}},
+ {m68k_op_rol_16_di , 0xfff8, 0xe7e8, { 16, 16, 12}},
+ {m68k_op_rol_16_ix , 0xfff8, 0xe7f0, { 18, 18, 14}},
+ {m68k_op_bftst_32_d , 0xfff8, 0xe8c0, { 0, 0, 6}},
+ {m68k_op_bftst_32_ai , 0xfff8, 0xe8d0, { 0, 0, 17}},
+ {m68k_op_bftst_32_di , 0xfff8, 0xe8e8, { 0, 0, 18}},
+ {m68k_op_bftst_32_ix , 0xfff8, 0xe8f0, { 0, 0, 20}},
+ {m68k_op_bfextu_32_d , 0xfff8, 0xe9c0, { 0, 0, 8}},
+ {m68k_op_bfextu_32_ai , 0xfff8, 0xe9d0, { 0, 0, 19}},
+ {m68k_op_bfextu_32_di , 0xfff8, 0xe9e8, { 0, 0, 20}},
+ {m68k_op_bfextu_32_ix , 0xfff8, 0xe9f0, { 0, 0, 22}},
+ {m68k_op_bfchg_32_d , 0xfff8, 0xeac0, { 0, 0, 12}},
+ {m68k_op_bfchg_32_ai , 0xfff8, 0xead0, { 0, 0, 24}},
+ {m68k_op_bfchg_32_di , 0xfff8, 0xeae8, { 0, 0, 25}},
+ {m68k_op_bfchg_32_ix , 0xfff8, 0xeaf0, { 0, 0, 27}},
+ {m68k_op_bfexts_32_d , 0xfff8, 0xebc0, { 0, 0, 8}},
+ {m68k_op_bfexts_32_ai , 0xfff8, 0xebd0, { 0, 0, 19}},
+ {m68k_op_bfexts_32_di , 0xfff8, 0xebe8, { 0, 0, 20}},
+ {m68k_op_bfexts_32_ix , 0xfff8, 0xebf0, { 0, 0, 22}},
+ {m68k_op_bfclr_32_d , 0xfff8, 0xecc0, { 0, 0, 12}},
+ {m68k_op_bfclr_32_ai , 0xfff8, 0xecd0, { 0, 0, 24}},
+ {m68k_op_bfclr_32_di , 0xfff8, 0xece8, { 0, 0, 25}},
+ {m68k_op_bfclr_32_ix , 0xfff8, 0xecf0, { 0, 0, 27}},
+ {m68k_op_bfffo_32_d , 0xfff8, 0xedc0, { 0, 0, 18}},
+ {m68k_op_bfffo_32_ai , 0xfff8, 0xedd0, { 0, 0, 32}},
+ {m68k_op_bfffo_32_di , 0xfff8, 0xede8, { 0, 0, 33}},
+ {m68k_op_bfffo_32_ix , 0xfff8, 0xedf0, { 0, 0, 35}},
+ {m68k_op_bfset_32_d , 0xfff8, 0xeec0, { 0, 0, 12}},
+ {m68k_op_bfset_32_ai , 0xfff8, 0xeed0, { 0, 0, 24}},
+ {m68k_op_bfset_32_di , 0xfff8, 0xeee8, { 0, 0, 25}},
+ {m68k_op_bfset_32_ix , 0xfff8, 0xeef0, { 0, 0, 27}},
+ {m68k_op_bfins_32_d , 0xfff8, 0xefc0, { 0, 0, 10}},
+ {m68k_op_bfins_32_ai , 0xfff8, 0xefd0, { 0, 0, 21}},
+ {m68k_op_bfins_32_di , 0xfff8, 0xefe8, { 0, 0, 22}},
+ {m68k_op_bfins_32_ix , 0xfff8, 0xeff0, { 0, 0, 24}},
+ {m68k_op_ori_8_pi7 , 0xffff, 0x001f, { 16, 16, 8}},
+ {m68k_op_ori_8_pd7 , 0xffff, 0x0027, { 18, 18, 9}},
+ {m68k_op_ori_8_aw , 0xffff, 0x0038, { 20, 20, 8}},
+ {m68k_op_ori_8_al , 0xffff, 0x0039, { 24, 24, 8}},
+ {m68k_op_ori_16_toc , 0xffff, 0x003c, { 20, 16, 12}},
+ {m68k_op_ori_16_aw , 0xffff, 0x0078, { 20, 20, 8}},
+ {m68k_op_ori_16_al , 0xffff, 0x0079, { 24, 24, 8}},
+ {m68k_op_ori_16_tos , 0xffff, 0x007c, { 20, 16, 12}},
+ {m68k_op_ori_32_aw , 0xffff, 0x00b8, { 32, 32, 8}},
+ {m68k_op_ori_32_al , 0xffff, 0x00b9, { 36, 36, 8}},
+ {m68k_op_chk2cmp2_8_aw , 0xffff, 0x00f8, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_8_al , 0xffff, 0x00f9, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_8_pcdi , 0xffff, 0x00fa, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_8_pcix , 0xffff, 0x00fb, { 0, 0, 23}},
+ {m68k_op_andi_8_pi7 , 0xffff, 0x021f, { 16, 16, 8}},
+ {m68k_op_andi_8_pd7 , 0xffff, 0x0227, { 18, 18, 9}},
+ {m68k_op_andi_8_aw , 0xffff, 0x0238, { 20, 20, 8}},
+ {m68k_op_andi_8_al , 0xffff, 0x0239, { 24, 24, 8}},
+ {m68k_op_andi_16_toc , 0xffff, 0x023c, { 20, 16, 12}},
+ {m68k_op_andi_16_aw , 0xffff, 0x0278, { 20, 20, 8}},
+ {m68k_op_andi_16_al , 0xffff, 0x0279, { 24, 24, 8}},
+ {m68k_op_andi_16_tos , 0xffff, 0x027c, { 20, 16, 12}},
+ {m68k_op_andi_32_aw , 0xffff, 0x02b8, { 32, 32, 8}},
+ {m68k_op_andi_32_al , 0xffff, 0x02b9, { 36, 36, 8}},
+ {m68k_op_chk2cmp2_16_aw , 0xffff, 0x02f8, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_16_al , 0xffff, 0x02f9, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_16_pcdi , 0xffff, 0x02fa, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_16_pcix , 0xffff, 0x02fb, { 0, 0, 23}},
+ {m68k_op_subi_8_pi7 , 0xffff, 0x041f, { 16, 16, 8}},
+ {m68k_op_subi_8_pd7 , 0xffff, 0x0427, { 18, 18, 9}},
+ {m68k_op_subi_8_aw , 0xffff, 0x0438, { 20, 20, 8}},
+ {m68k_op_subi_8_al , 0xffff, 0x0439, { 24, 24, 8}},
+ {m68k_op_subi_16_aw , 0xffff, 0x0478, { 20, 20, 8}},
+ {m68k_op_subi_16_al , 0xffff, 0x0479, { 24, 24, 8}},
+ {m68k_op_subi_32_aw , 0xffff, 0x04b8, { 32, 32, 8}},
+ {m68k_op_subi_32_al , 0xffff, 0x04b9, { 36, 36, 8}},
+ {m68k_op_chk2cmp2_32_aw , 0xffff, 0x04f8, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_32_al , 0xffff, 0x04f9, { 0, 0, 22}},
+ {m68k_op_chk2cmp2_32_pcdi , 0xffff, 0x04fa, { 0, 0, 23}},
+ {m68k_op_chk2cmp2_32_pcix , 0xffff, 0x04fb, { 0, 0, 23}},
+ {m68k_op_addi_8_pi7 , 0xffff, 0x061f, { 16, 16, 8}},
+ {m68k_op_addi_8_pd7 , 0xffff, 0x0627, { 18, 18, 9}},
+ {m68k_op_addi_8_aw , 0xffff, 0x0638, { 20, 20, 8}},
+ {m68k_op_addi_8_al , 0xffff, 0x0639, { 24, 24, 8}},
+ {m68k_op_addi_16_aw , 0xffff, 0x0678, { 20, 20, 8}},
+ {m68k_op_addi_16_al , 0xffff, 0x0679, { 24, 24, 8}},
+ {m68k_op_addi_32_aw , 0xffff, 0x06b8, { 32, 32, 8}},
+ {m68k_op_addi_32_al , 0xffff, 0x06b9, { 36, 36, 8}},
+ {m68k_op_callm_32_aw , 0xffff, 0x06f8, { 0, 0, 64}},
+ {m68k_op_callm_32_al , 0xffff, 0x06f9, { 0, 0, 64}},
+ {m68k_op_callm_32_pcdi , 0xffff, 0x06fa, { 0, 0, 65}},
+ {m68k_op_callm_32_pcix , 0xffff, 0x06fb, { 0, 0, 67}},
+ {m68k_op_btst_8_s_pi7 , 0xffff, 0x081f, { 12, 12, 8}},
+ {m68k_op_btst_8_s_pd7 , 0xffff, 0x0827, { 14, 14, 9}},
+ {m68k_op_btst_8_s_aw , 0xffff, 0x0838, { 16, 16, 8}},
+ {m68k_op_btst_8_s_al , 0xffff, 0x0839, { 20, 20, 8}},
+ {m68k_op_btst_8_s_pcdi , 0xffff, 0x083a, { 16, 16, 9}},
+ {m68k_op_btst_8_s_pcix , 0xffff, 0x083b, { 18, 18, 11}},
+ {m68k_op_bchg_8_s_pi7 , 0xffff, 0x085f, { 16, 16, 8}},
+ {m68k_op_bchg_8_s_pd7 , 0xffff, 0x0867, { 18, 18, 9}},
+ {m68k_op_bchg_8_s_aw , 0xffff, 0x0878, { 20, 20, 8}},
+ {m68k_op_bchg_8_s_al , 0xffff, 0x0879, { 24, 24, 8}},
+ {m68k_op_bclr_8_s_pi7 , 0xffff, 0x089f, { 16, 16, 8}},
+ {m68k_op_bclr_8_s_pd7 , 0xffff, 0x08a7, { 18, 18, 9}},
+ {m68k_op_bclr_8_s_aw , 0xffff, 0x08b8, { 20, 20, 8}},
+ {m68k_op_bclr_8_s_al , 0xffff, 0x08b9, { 24, 24, 8}},
+ {m68k_op_bset_8_s_pi7 , 0xffff, 0x08df, { 16, 16, 8}},
+ {m68k_op_bset_8_s_pd7 , 0xffff, 0x08e7, { 18, 18, 9}},
+ {m68k_op_bset_8_s_aw , 0xffff, 0x08f8, { 20, 20, 8}},
+ {m68k_op_bset_8_s_al , 0xffff, 0x08f9, { 24, 24, 8}},
+ {m68k_op_eori_8_pi7 , 0xffff, 0x0a1f, { 16, 16, 8}},
+ {m68k_op_eori_8_pd7 , 0xffff, 0x0a27, { 18, 18, 9}},
+ {m68k_op_eori_8_aw , 0xffff, 0x0a38, { 20, 20, 8}},
+ {m68k_op_eori_8_al , 0xffff, 0x0a39, { 24, 24, 8}},
+ {m68k_op_eori_16_toc , 0xffff, 0x0a3c, { 20, 16, 12}},
+ {m68k_op_eori_16_aw , 0xffff, 0x0a78, { 20, 20, 8}},
+ {m68k_op_eori_16_al , 0xffff, 0x0a79, { 24, 24, 8}},
+ {m68k_op_eori_16_tos , 0xffff, 0x0a7c, { 20, 16, 12}},
+ {m68k_op_eori_32_aw , 0xffff, 0x0ab8, { 32, 32, 8}},
+ {m68k_op_eori_32_al , 0xffff, 0x0ab9, { 36, 36, 8}},
+ {m68k_op_cas_8_pi7 , 0xffff, 0x0adf, { 0, 0, 16}},
+ {m68k_op_cas_8_pd7 , 0xffff, 0x0ae7, { 0, 0, 17}},
+ {m68k_op_cas_8_aw , 0xffff, 0x0af8, { 0, 0, 16}},
+ {m68k_op_cas_8_al , 0xffff, 0x0af9, { 0, 0, 16}},
+ {m68k_op_cmpi_8_pi7 , 0xffff, 0x0c1f, { 12, 12, 6}},
+ {m68k_op_cmpi_8_pd7 , 0xffff, 0x0c27, { 14, 14, 7}},
+ {m68k_op_cmpi_8_aw , 0xffff, 0x0c38, { 16, 16, 6}},
+ {m68k_op_cmpi_8_al , 0xffff, 0x0c39, { 20, 20, 6}},
+ {m68k_op_cmpi_8_pcdi , 0xffff, 0x0c3a, { 0, 0, 7}},
+ {m68k_op_cmpi_8_pcix , 0xffff, 0x0c3b, { 0, 0, 9}},
+ {m68k_op_cmpi_16_aw , 0xffff, 0x0c78, { 16, 16, 6}},
+ {m68k_op_cmpi_16_al , 0xffff, 0x0c79, { 20, 20, 6}},
+ {m68k_op_cmpi_16_pcdi , 0xffff, 0x0c7a, { 0, 0, 7}},
+ {m68k_op_cmpi_16_pcix , 0xffff, 0x0c7b, { 0, 0, 9}},
+ {m68k_op_cmpi_32_aw , 0xffff, 0x0cb8, { 24, 24, 6}},
+ {m68k_op_cmpi_32_al , 0xffff, 0x0cb9, { 28, 28, 6}},
+ {m68k_op_cmpi_32_pcdi , 0xffff, 0x0cba, { 0, 0, 7}},
+ {m68k_op_cmpi_32_pcix , 0xffff, 0x0cbb, { 0, 0, 9}},
+ {m68k_op_cas_16_aw , 0xffff, 0x0cf8, { 0, 0, 16}},
+ {m68k_op_cas_16_al , 0xffff, 0x0cf9, { 0, 0, 16}},
+ {m68k_op_cas2_16 , 0xffff, 0x0cfc, { 0, 0, 12}},
+ {m68k_op_moves_8_pi7 , 0xffff, 0x0e1f, { 0, 18, 9}},
+ {m68k_op_moves_8_pd7 , 0xffff, 0x0e27, { 0, 20, 10}},
+ {m68k_op_moves_8_aw , 0xffff, 0x0e38, { 0, 26, 9}},
+ {m68k_op_moves_8_al , 0xffff, 0x0e39, { 0, 30, 9}},
+ {m68k_op_moves_16_aw , 0xffff, 0x0e78, { 0, 26, 9}},
+ {m68k_op_moves_16_al , 0xffff, 0x0e79, { 0, 30, 9}},
+ {m68k_op_moves_32_aw , 0xffff, 0x0eb8, { 0, 32, 9}},
+ {m68k_op_moves_32_al , 0xffff, 0x0eb9, { 0, 36, 9}},
+ {m68k_op_cas_32_aw , 0xffff, 0x0ef8, { 0, 0, 16}},
+ {m68k_op_cas_32_al , 0xffff, 0x0ef9, { 0, 0, 16}},
+ {m68k_op_cas2_32 , 0xffff, 0x0efc, { 0, 0, 12}},
+ {m68k_op_move_8_aw_pi7 , 0xffff, 0x11df, { 16, 16, 8}},
+ {m68k_op_move_8_aw_pd7 , 0xffff, 0x11e7, { 18, 18, 9}},
+ {m68k_op_move_8_aw_aw , 0xffff, 0x11f8, { 20, 20, 8}},
+ {m68k_op_move_8_aw_al , 0xffff, 0x11f9, { 24, 24, 8}},
+ {m68k_op_move_8_aw_pcdi , 0xffff, 0x11fa, { 20, 20, 9}},
+ {m68k_op_move_8_aw_pcix , 0xffff, 0x11fb, { 22, 22, 11}},
+ {m68k_op_move_8_aw_i , 0xffff, 0x11fc, { 16, 16, 6}},
+ {m68k_op_move_8_al_pi7 , 0xffff, 0x13df, { 20, 20, 10}},
+ {m68k_op_move_8_al_pd7 , 0xffff, 0x13e7, { 22, 22, 11}},
+ {m68k_op_move_8_al_aw , 0xffff, 0x13f8, { 24, 24, 10}},
+ {m68k_op_move_8_al_al , 0xffff, 0x13f9, { 28, 28, 10}},
+ {m68k_op_move_8_al_pcdi , 0xffff, 0x13fa, { 24, 24, 11}},
+ {m68k_op_move_8_al_pcix , 0xffff, 0x13fb, { 26, 26, 13}},
+ {m68k_op_move_8_al_i , 0xffff, 0x13fc, { 20, 20, 8}},
+ {m68k_op_move_8_pi7_pi7 , 0xffff, 0x1edf, { 12, 12, 8}},
+ {m68k_op_move_8_pi7_pd7 , 0xffff, 0x1ee7, { 14, 14, 9}},
+ {m68k_op_move_8_pi7_aw , 0xffff, 0x1ef8, { 16, 16, 8}},
+ {m68k_op_move_8_pi7_al , 0xffff, 0x1ef9, { 20, 20, 8}},
+ {m68k_op_move_8_pi7_pcdi , 0xffff, 0x1efa, { 16, 16, 9}},
+ {m68k_op_move_8_pi7_pcix , 0xffff, 0x1efb, { 18, 18, 11}},
+ {m68k_op_move_8_pi7_i , 0xffff, 0x1efc, { 12, 12, 6}},
+ {m68k_op_move_8_pd7_pi7 , 0xffff, 0x1f1f, { 12, 12, 9}},
+ {m68k_op_move_8_pd7_pd7 , 0xffff, 0x1f27, { 14, 14, 10}},
+ {m68k_op_move_8_pd7_aw , 0xffff, 0x1f38, { 16, 16, 9}},
+ {m68k_op_move_8_pd7_al , 0xffff, 0x1f39, { 20, 20, 9}},
+ {m68k_op_move_8_pd7_pcdi , 0xffff, 0x1f3a, { 16, 16, 10}},
+ {m68k_op_move_8_pd7_pcix , 0xffff, 0x1f3b, { 18, 18, 12}},
+ {m68k_op_move_8_pd7_i , 0xffff, 0x1f3c, { 12, 12, 7}},
+ {m68k_op_move_32_aw_aw , 0xffff, 0x21f8, { 28, 28, 8}},
+ {m68k_op_move_32_aw_al , 0xffff, 0x21f9, { 32, 32, 8}},
+ {m68k_op_move_32_aw_pcdi , 0xffff, 0x21fa, { 28, 28, 9}},
+ {m68k_op_move_32_aw_pcix , 0xffff, 0x21fb, { 30, 30, 11}},
+ {m68k_op_move_32_aw_i , 0xffff, 0x21fc, { 24, 24, 8}},
+ {m68k_op_move_32_al_aw , 0xffff, 0x23f8, { 32, 32, 10}},
+ {m68k_op_move_32_al_al , 0xffff, 0x23f9, { 36, 36, 10}},
+ {m68k_op_move_32_al_pcdi , 0xffff, 0x23fa, { 32, 32, 11}},
+ {m68k_op_move_32_al_pcix , 0xffff, 0x23fb, { 34, 34, 13}},
+ {m68k_op_move_32_al_i , 0xffff, 0x23fc, { 28, 28, 10}},
+ {m68k_op_move_16_aw_aw , 0xffff, 0x31f8, { 20, 20, 8}},
+ {m68k_op_move_16_aw_al , 0xffff, 0x31f9, { 24, 24, 8}},
+ {m68k_op_move_16_aw_pcdi , 0xffff, 0x31fa, { 20, 20, 9}},
+ {m68k_op_move_16_aw_pcix , 0xffff, 0x31fb, { 22, 22, 11}},
+ {m68k_op_move_16_aw_i , 0xffff, 0x31fc, { 16, 16, 6}},
+ {m68k_op_move_16_al_aw , 0xffff, 0x33f8, { 24, 24, 10}},
+ {m68k_op_move_16_al_al , 0xffff, 0x33f9, { 28, 28, 10}},
+ {m68k_op_move_16_al_pcdi , 0xffff, 0x33fa, { 24, 24, 11}},
+ {m68k_op_move_16_al_pcix , 0xffff, 0x33fb, { 26, 26, 13}},
+ {m68k_op_move_16_al_i , 0xffff, 0x33fc, { 20, 20, 8}},
+ {m68k_op_negx_8_pi7 , 0xffff, 0x401f, { 12, 12, 8}},
+ {m68k_op_negx_8_pd7 , 0xffff, 0x4027, { 14, 14, 9}},
+ {m68k_op_negx_8_aw , 0xffff, 0x4038, { 16, 16, 8}},
+ {m68k_op_negx_8_al , 0xffff, 0x4039, { 20, 20, 8}},
+ {m68k_op_negx_16_aw , 0xffff, 0x4078, { 16, 16, 8}},
+ {m68k_op_negx_16_al , 0xffff, 0x4079, { 20, 20, 8}},
+ {m68k_op_negx_32_aw , 0xffff, 0x40b8, { 24, 24, 8}},
+ {m68k_op_negx_32_al , 0xffff, 0x40b9, { 28, 28, 8}},
+ {m68k_op_move_16_frs_aw , 0xffff, 0x40f8, { 16, 16, 12}},
+ {m68k_op_move_16_frs_al , 0xffff, 0x40f9, { 20, 20, 12}},
+ {m68k_op_clr_8_pi7 , 0xffff, 0x421f, { 12, 8, 8}},
+ {m68k_op_clr_8_pd7 , 0xffff, 0x4227, { 14, 10, 9}},
+ {m68k_op_clr_8_aw , 0xffff, 0x4238, { 16, 12, 8}},
+ {m68k_op_clr_8_al , 0xffff, 0x4239, { 20, 14, 8}},
+ {m68k_op_clr_16_aw , 0xffff, 0x4278, { 16, 12, 8}},
+ {m68k_op_clr_16_al , 0xffff, 0x4279, { 20, 14, 8}},
+ {m68k_op_clr_32_aw , 0xffff, 0x42b8, { 24, 16, 8}},
+ {m68k_op_clr_32_al , 0xffff, 0x42b9, { 28, 20, 8}},
+ {m68k_op_move_16_frc_aw , 0xffff, 0x42f8, { 0, 16, 8}},
+ {m68k_op_move_16_frc_al , 0xffff, 0x42f9, { 0, 20, 8}},
+ {m68k_op_neg_8_pi7 , 0xffff, 0x441f, { 12, 12, 8}},
+ {m68k_op_neg_8_pd7 , 0xffff, 0x4427, { 14, 14, 9}},
+ {m68k_op_neg_8_aw , 0xffff, 0x4438, { 16, 16, 8}},
+ {m68k_op_neg_8_al , 0xffff, 0x4439, { 20, 20, 8}},
+ {m68k_op_neg_16_aw , 0xffff, 0x4478, { 16, 16, 8}},
+ {m68k_op_neg_16_al , 0xffff, 0x4479, { 20, 20, 8}},
+ {m68k_op_neg_32_aw , 0xffff, 0x44b8, { 24, 24, 8}},
+ {m68k_op_neg_32_al , 0xffff, 0x44b9, { 28, 28, 8}},
+ {m68k_op_move_16_toc_aw , 0xffff, 0x44f8, { 20, 20, 8}},
+ {m68k_op_move_16_toc_al , 0xffff, 0x44f9, { 24, 24, 8}},
+ {m68k_op_move_16_toc_pcdi , 0xffff, 0x44fa, { 20, 20, 9}},
+ {m68k_op_move_16_toc_pcix , 0xffff, 0x44fb, { 22, 22, 11}},
+ {m68k_op_move_16_toc_i , 0xffff, 0x44fc, { 16, 16, 6}},
+ {m68k_op_not_8_pi7 , 0xffff, 0x461f, { 12, 12, 8}},
+ {m68k_op_not_8_pd7 , 0xffff, 0x4627, { 14, 14, 9}},
+ {m68k_op_not_8_aw , 0xffff, 0x4638, { 16, 16, 8}},
+ {m68k_op_not_8_al , 0xffff, 0x4639, { 20, 20, 8}},
+ {m68k_op_not_16_aw , 0xffff, 0x4678, { 16, 16, 8}},
+ {m68k_op_not_16_al , 0xffff, 0x4679, { 20, 20, 8}},
+ {m68k_op_not_32_aw , 0xffff, 0x46b8, { 24, 24, 8}},
+ {m68k_op_not_32_al , 0xffff, 0x46b9, { 28, 28, 8}},
+ {m68k_op_move_16_tos_aw , 0xffff, 0x46f8, { 20, 20, 12}},
+ {m68k_op_move_16_tos_al , 0xffff, 0x46f9, { 24, 24, 12}},
+ {m68k_op_move_16_tos_pcdi , 0xffff, 0x46fa, { 20, 20, 13}},
+ {m68k_op_move_16_tos_pcix , 0xffff, 0x46fb, { 22, 22, 15}},
+ {m68k_op_move_16_tos_i , 0xffff, 0x46fc, { 16, 16, 10}},
+ {m68k_op_link_32_a7 , 0xffff, 0x480f, { 0, 0, 6}},
+ {m68k_op_nbcd_8_pi7 , 0xffff, 0x481f, { 12, 12, 10}},
+ {m68k_op_nbcd_8_pd7 , 0xffff, 0x4827, { 14, 14, 11}},
+ {m68k_op_nbcd_8_aw , 0xffff, 0x4838, { 16, 16, 10}},
+ {m68k_op_nbcd_8_al , 0xffff, 0x4839, { 20, 20, 10}},
+ {m68k_op_pea_32_aw , 0xffff, 0x4878, { 16, 16, 9}},
+ {m68k_op_pea_32_al , 0xffff, 0x4879, { 20, 20, 9}},
+ {m68k_op_pea_32_pcdi , 0xffff, 0x487a, { 16, 16, 10}},
+ {m68k_op_pea_32_pcix , 0xffff, 0x487b, { 20, 20, 12}},
+ {m68k_op_movem_16_re_aw , 0xffff, 0x48b8, { 16, 16, 8}},
+ {m68k_op_movem_16_re_al , 0xffff, 0x48b9, { 20, 20, 8}},
+ {m68k_op_movem_32_re_aw , 0xffff, 0x48f8, { 20, 20, 8}},
+ {m68k_op_movem_32_re_al , 0xffff, 0x48f9, { 24, 24, 8}},
+ {m68k_op_tst_8_pi7 , 0xffff, 0x4a1f, { 8, 8, 6}},
+ {m68k_op_tst_8_pd7 , 0xffff, 0x4a27, { 10, 10, 7}},
+ {m68k_op_tst_8_aw , 0xffff, 0x4a38, { 12, 12, 6}},
+ {m68k_op_tst_8_al , 0xffff, 0x4a39, { 16, 16, 6}},
+ {m68k_op_tst_8_pcdi , 0xffff, 0x4a3a, { 0, 0, 7}},
+ {m68k_op_tst_8_pcix , 0xffff, 0x4a3b, { 0, 0, 9}},
+ {m68k_op_tst_8_i , 0xffff, 0x4a3c, { 0, 0, 6}},
+ {m68k_op_tst_16_aw , 0xffff, 0x4a78, { 12, 12, 6}},
+ {m68k_op_tst_16_al , 0xffff, 0x4a79, { 16, 16, 6}},
+ {m68k_op_tst_16_pcdi , 0xffff, 0x4a7a, { 0, 0, 7}},
+ {m68k_op_tst_16_pcix , 0xffff, 0x4a7b, { 0, 0, 9}},
+ {m68k_op_tst_16_i , 0xffff, 0x4a7c, { 0, 0, 6}},
+ {m68k_op_tst_32_aw , 0xffff, 0x4ab8, { 16, 16, 6}},
+ {m68k_op_tst_32_al , 0xffff, 0x4ab9, { 20, 20, 6}},
+ {m68k_op_tst_32_pcdi , 0xffff, 0x4aba, { 0, 0, 7}},
+ {m68k_op_tst_32_pcix , 0xffff, 0x4abb, { 0, 0, 9}},
+ {m68k_op_tst_32_i , 0xffff, 0x4abc, { 0, 0, 6}},
+ {m68k_op_tas_8_pi7 , 0xffff, 0x4adf, { 18, 18, 16}},
+ {m68k_op_tas_8_pd7 , 0xffff, 0x4ae7, { 20, 20, 17}},
+ {m68k_op_tas_8_aw , 0xffff, 0x4af8, { 22, 22, 16}},
+ {m68k_op_tas_8_al , 0xffff, 0x4af9, { 26, 26, 16}},
+ {m68k_op_illegal , 0xffff, 0x4afc, { 4, 4, 4}},
+ {m68k_op_mull_32_aw , 0xffff, 0x4c38, { 0, 0, 47}},
+ {m68k_op_mull_32_al , 0xffff, 0x4c39, { 0, 0, 47}},
+ {m68k_op_mull_32_pcdi , 0xffff, 0x4c3a, { 0, 0, 48}},
+ {m68k_op_mull_32_pcix , 0xffff, 0x4c3b, { 0, 0, 50}},
+ {m68k_op_mull_32_i , 0xffff, 0x4c3c, { 0, 0, 47}},
+ {m68k_op_divl_32_aw , 0xffff, 0x4c78, { 0, 0, 88}},
+ {m68k_op_divl_32_al , 0xffff, 0x4c79, { 0, 0, 88}},
+ {m68k_op_divl_32_pcdi , 0xffff, 0x4c7a, { 0, 0, 89}},
+ {m68k_op_divl_32_pcix , 0xffff, 0x4c7b, { 0, 0, 91}},
+ {m68k_op_divl_32_i , 0xffff, 0x4c7c, { 0, 0, 88}},
+ {m68k_op_movem_16_er_aw , 0xffff, 0x4cb8, { 20, 20, 12}},
+ {m68k_op_movem_16_er_al , 0xffff, 0x4cb9, { 24, 24, 12}},
+ {m68k_op_movem_16_er_pcdi , 0xffff, 0x4cba, { 16, 16, 9}},
+ {m68k_op_movem_16_er_pcix , 0xffff, 0x4cbb, { 18, 18, 11}},
+ {m68k_op_movem_32_er_aw , 0xffff, 0x4cf8, { 24, 24, 12}},
+ {m68k_op_movem_32_er_al , 0xffff, 0x4cf9, { 28, 28, 12}},
+ {m68k_op_movem_32_er_pcdi , 0xffff, 0x4cfa, { 20, 20, 9}},
+ {m68k_op_movem_32_er_pcix , 0xffff, 0x4cfb, { 22, 22, 11}},
+ {m68k_op_link_16_a7 , 0xffff, 0x4e57, { 16, 16, 5}},
+ {m68k_op_unlk_32_a7 , 0xffff, 0x4e5f, { 12, 12, 6}},
+ {m68k_op_reset , 0xffff, 0x4e70, { 0, 0, 0}},
+ {m68k_op_nop , 0xffff, 0x4e71, { 4, 4, 2}},
+ {m68k_op_stop , 0xffff, 0x4e72, { 4, 4, 8}},
+ {m68k_op_rte_32 , 0xffff, 0x4e73, { 20, 24, 20}},
+ {m68k_op_rtd_32 , 0xffff, 0x4e74, { 0, 16, 10}},
+ {m68k_op_rts_32 , 0xffff, 0x4e75, { 16, 16, 10}},
+ {m68k_op_trapv , 0xffff, 0x4e76, { 4, 4, 4}},
+ {m68k_op_rtr_32 , 0xffff, 0x4e77, { 20, 20, 14}},
+ {m68k_op_movec_32_cr , 0xffff, 0x4e7a, { 0, 12, 6}},
+ {m68k_op_movec_32_rc , 0xffff, 0x4e7b, { 0, 10, 12}},
+ {m68k_op_jsr_32_aw , 0xffff, 0x4eb8, { 18, 18, 4}},
+ {m68k_op_jsr_32_al , 0xffff, 0x4eb9, { 20, 20, 4}},
+ {m68k_op_jsr_32_pcdi , 0xffff, 0x4eba, { 18, 18, 5}},
+ {m68k_op_jsr_32_pcix , 0xffff, 0x4ebb, { 22, 22, 7}},
+ {m68k_op_jmp_32_aw , 0xffff, 0x4ef8, { 10, 10, 4}},
+ {m68k_op_jmp_32_al , 0xffff, 0x4ef9, { 12, 12, 4}},
+ {m68k_op_jmp_32_pcdi , 0xffff, 0x4efa, { 10, 10, 5}},
+ {m68k_op_jmp_32_pcix , 0xffff, 0x4efb, { 14, 14, 7}},
+ {m68k_op_st_8_pi7 , 0xffff, 0x50df, { 12, 12, 10}},
+ {m68k_op_st_8_pd7 , 0xffff, 0x50e7, { 14, 14, 11}},
+ {m68k_op_st_8_aw , 0xffff, 0x50f8, { 16, 16, 10}},
+ {m68k_op_st_8_al , 0xffff, 0x50f9, { 20, 20, 10}},
+ {m68k_op_trapt_16 , 0xffff, 0x50fa, { 0, 0, 6}},
+ {m68k_op_trapt_32 , 0xffff, 0x50fb, { 0, 0, 8}},
+ {m68k_op_trapt , 0xffff, 0x50fc, { 0, 0, 4}},
+ {m68k_op_sf_8_pi7 , 0xffff, 0x51df, { 12, 12, 10}},
+ {m68k_op_sf_8_pd7 , 0xffff, 0x51e7, { 14, 14, 11}},
+ {m68k_op_sf_8_aw , 0xffff, 0x51f8, { 16, 16, 10}},
+ {m68k_op_sf_8_al , 0xffff, 0x51f9, { 20, 20, 10}},
+ {m68k_op_trapf_16 , 0xffff, 0x51fa, { 0, 0, 6}},
+ {m68k_op_trapf_32 , 0xffff, 0x51fb, { 0, 0, 8}},
+ {m68k_op_trapf , 0xffff, 0x51fc, { 0, 0, 4}},
+ {m68k_op_shi_8_pi7 , 0xffff, 0x52df, { 12, 12, 10}},
+ {m68k_op_shi_8_pd7 , 0xffff, 0x52e7, { 14, 14, 11}},
+ {m68k_op_shi_8_aw , 0xffff, 0x52f8, { 16, 16, 10}},
+ {m68k_op_shi_8_al , 0xffff, 0x52f9, { 20, 20, 10}},
+ {m68k_op_traphi_16 , 0xffff, 0x52fa, { 0, 0, 6}},
+ {m68k_op_traphi_32 , 0xffff, 0x52fb, { 0, 0, 8}},
+ {m68k_op_traphi , 0xffff, 0x52fc, { 0, 0, 4}},
+ {m68k_op_sls_8_pi7 , 0xffff, 0x53df, { 12, 12, 10}},
+ {m68k_op_sls_8_pd7 , 0xffff, 0x53e7, { 14, 14, 11}},
+ {m68k_op_sls_8_aw , 0xffff, 0x53f8, { 16, 16, 10}},
+ {m68k_op_sls_8_al , 0xffff, 0x53f9, { 20, 20, 10}},
+ {m68k_op_trapls_16 , 0xffff, 0x53fa, { 0, 0, 6}},
+ {m68k_op_trapls_32 , 0xffff, 0x53fb, { 0, 0, 8}},
+ {m68k_op_trapls , 0xffff, 0x53fc, { 0, 0, 4}},
+ {m68k_op_scc_8_pi7 , 0xffff, 0x54df, { 12, 12, 10}},
+ {m68k_op_scc_8_pd7 , 0xffff, 0x54e7, { 14, 14, 11}},
+ {m68k_op_scc_8_aw , 0xffff, 0x54f8, { 16, 16, 10}},
+ {m68k_op_scc_8_al , 0xffff, 0x54f9, { 20, 20, 10}},
+ {m68k_op_trapcc_16 , 0xffff, 0x54fa, { 0, 0, 6}},
+ {m68k_op_trapcc_32 , 0xffff, 0x54fb, { 0, 0, 8}},
+ {m68k_op_trapcc , 0xffff, 0x54fc, { 0, 0, 4}},
+ {m68k_op_scs_8_pi7 , 0xffff, 0x55df, { 12, 12, 10}},
+ {m68k_op_scs_8_pd7 , 0xffff, 0x55e7, { 14, 14, 11}},
+ {m68k_op_scs_8_aw , 0xffff, 0x55f8, { 16, 16, 10}},
+ {m68k_op_scs_8_al , 0xffff, 0x55f9, { 20, 20, 10}},
+ {m68k_op_trapcs_16 , 0xffff, 0x55fa, { 0, 0, 6}},
+ {m68k_op_trapcs_32 , 0xffff, 0x55fb, { 0, 0, 8}},
+ {m68k_op_trapcs , 0xffff, 0x55fc, { 0, 0, 4}},
+ {m68k_op_sne_8_pi7 , 0xffff, 0x56df, { 12, 12, 10}},
+ {m68k_op_sne_8_pd7 , 0xffff, 0x56e7, { 14, 14, 11}},
+ {m68k_op_sne_8_aw , 0xffff, 0x56f8, { 16, 16, 10}},
+ {m68k_op_sne_8_al , 0xffff, 0x56f9, { 20, 20, 10}},
+ {m68k_op_trapne_16 , 0xffff, 0x56fa, { 0, 0, 6}},
+ {m68k_op_trapne_32 , 0xffff, 0x56fb, { 0, 0, 8}},
+ {m68k_op_trapne , 0xffff, 0x56fc, { 0, 0, 4}},
+ {m68k_op_seq_8_pi7 , 0xffff, 0x57df, { 12, 12, 10}},
+ {m68k_op_seq_8_pd7 , 0xffff, 0x57e7, { 14, 14, 11}},
+ {m68k_op_seq_8_aw , 0xffff, 0x57f8, { 16, 16, 10}},
+ {m68k_op_seq_8_al , 0xffff, 0x57f9, { 20, 20, 10}},
+ {m68k_op_trapeq_16 , 0xffff, 0x57fa, { 0, 0, 6}},
+ {m68k_op_trapeq_32 , 0xffff, 0x57fb, { 0, 0, 8}},
+ {m68k_op_trapeq , 0xffff, 0x57fc, { 0, 0, 4}},
+ {m68k_op_svc_8_pi7 , 0xffff, 0x58df, { 12, 12, 10}},
+ {m68k_op_svc_8_pd7 , 0xffff, 0x58e7, { 14, 14, 11}},
+ {m68k_op_svc_8_aw , 0xffff, 0x58f8, { 16, 16, 10}},
+ {m68k_op_svc_8_al , 0xffff, 0x58f9, { 20, 20, 10}},
+ {m68k_op_trapvc_16 , 0xffff, 0x58fa, { 0, 0, 6}},
+ {m68k_op_trapvc_32 , 0xffff, 0x58fb, { 0, 0, 8}},
+ {m68k_op_trapvc , 0xffff, 0x58fc, { 0, 0, 4}},
+ {m68k_op_svs_8_pi7 , 0xffff, 0x59df, { 12, 12, 10}},
+ {m68k_op_svs_8_pd7 , 0xffff, 0x59e7, { 14, 14, 11}},
+ {m68k_op_svs_8_aw , 0xffff, 0x59f8, { 16, 16, 10}},
+ {m68k_op_svs_8_al , 0xffff, 0x59f9, { 20, 20, 10}},
+ {m68k_op_trapvs_16 , 0xffff, 0x59fa, { 0, 0, 6}},
+ {m68k_op_trapvs_32 , 0xffff, 0x59fb, { 0, 0, 8}},
+ {m68k_op_trapvs , 0xffff, 0x59fc, { 0, 0, 4}},
+ {m68k_op_spl_8_pi7 , 0xffff, 0x5adf, { 12, 12, 10}},
+ {m68k_op_spl_8_pd7 , 0xffff, 0x5ae7, { 14, 14, 11}},
+ {m68k_op_spl_8_aw , 0xffff, 0x5af8, { 16, 16, 10}},
+ {m68k_op_spl_8_al , 0xffff, 0x5af9, { 20, 20, 10}},
+ {m68k_op_trappl_16 , 0xffff, 0x5afa, { 0, 0, 6}},
+ {m68k_op_trappl_32 , 0xffff, 0x5afb, { 0, 0, 8}},
+ {m68k_op_trappl , 0xffff, 0x5afc, { 0, 0, 4}},
+ {m68k_op_smi_8_pi7 , 0xffff, 0x5bdf, { 12, 12, 10}},
+ {m68k_op_smi_8_pd7 , 0xffff, 0x5be7, { 14, 14, 11}},
+ {m68k_op_smi_8_aw , 0xffff, 0x5bf8, { 16, 16, 10}},
+ {m68k_op_smi_8_al , 0xffff, 0x5bf9, { 20, 20, 10}},
+ {m68k_op_trapmi_16 , 0xffff, 0x5bfa, { 0, 0, 6}},
+ {m68k_op_trapmi_32 , 0xffff, 0x5bfb, { 0, 0, 8}},
+ {m68k_op_trapmi , 0xffff, 0x5bfc, { 0, 0, 4}},
+ {m68k_op_sge_8_pi7 , 0xffff, 0x5cdf, { 12, 12, 10}},
+ {m68k_op_sge_8_pd7 , 0xffff, 0x5ce7, { 14, 14, 11}},
+ {m68k_op_sge_8_aw , 0xffff, 0x5cf8, { 16, 16, 10}},
+ {m68k_op_sge_8_al , 0xffff, 0x5cf9, { 20, 20, 10}},
+ {m68k_op_trapge_16 , 0xffff, 0x5cfa, { 0, 0, 6}},
+ {m68k_op_trapge_32 , 0xffff, 0x5cfb, { 0, 0, 8}},
+ {m68k_op_trapge , 0xffff, 0x5cfc, { 0, 0, 4}},
+ {m68k_op_slt_8_pi7 , 0xffff, 0x5ddf, { 12, 12, 10}},
+ {m68k_op_slt_8_pd7 , 0xffff, 0x5de7, { 14, 14, 11}},
+ {m68k_op_slt_8_aw , 0xffff, 0x5df8, { 16, 16, 10}},
+ {m68k_op_slt_8_al , 0xffff, 0x5df9, { 20, 20, 10}},
+ {m68k_op_traplt_16 , 0xffff, 0x5dfa, { 0, 0, 6}},
+ {m68k_op_traplt_32 , 0xffff, 0x5dfb, { 0, 0, 8}},
+ {m68k_op_traplt , 0xffff, 0x5dfc, { 0, 0, 4}},
+ {m68k_op_sgt_8_pi7 , 0xffff, 0x5edf, { 12, 12, 10}},
+ {m68k_op_sgt_8_pd7 , 0xffff, 0x5ee7, { 14, 14, 11}},
+ {m68k_op_sgt_8_aw , 0xffff, 0x5ef8, { 16, 16, 10}},
+ {m68k_op_sgt_8_al , 0xffff, 0x5ef9, { 20, 20, 10}},
+ {m68k_op_trapgt_16 , 0xffff, 0x5efa, { 0, 0, 6}},
+ {m68k_op_trapgt_32 , 0xffff, 0x5efb, { 0, 0, 8}},
+ {m68k_op_trapgt , 0xffff, 0x5efc, { 0, 0, 4}},
+ {m68k_op_sle_8_pi7 , 0xffff, 0x5fdf, { 12, 12, 10}},
+ {m68k_op_sle_8_pd7 , 0xffff, 0x5fe7, { 14, 14, 11}},
+ {m68k_op_sle_8_aw , 0xffff, 0x5ff8, { 16, 16, 10}},
+ {m68k_op_sle_8_al , 0xffff, 0x5ff9, { 20, 20, 10}},
+ {m68k_op_traple_16 , 0xffff, 0x5ffa, { 0, 0, 6}},
+ {m68k_op_traple_32 , 0xffff, 0x5ffb, { 0, 0, 8}},
+ {m68k_op_traple , 0xffff, 0x5ffc, { 0, 0, 4}},
+ {m68k_op_bra_16 , 0xffff, 0x6000, { 10, 10, 10}},
+ {m68k_op_bra_32 , 0xffff, 0x60ff, { 0, 0, 10}},
+ {m68k_op_bsr_16 , 0xffff, 0x6100, { 18, 18, 7}},
+ {m68k_op_bsr_32 , 0xffff, 0x61ff, { 0, 0, 7}},
+ {m68k_op_bhi_16 , 0xffff, 0x6200, { 10, 10, 6}},
+ {m68k_op_bhi_32 , 0xffff, 0x62ff, { 0, 0, 6}},
+ {m68k_op_bls_16 , 0xffff, 0x6300, { 10, 10, 6}},
+ {m68k_op_bls_32 , 0xffff, 0x63ff, { 0, 0, 6}},
+ {m68k_op_bcc_16 , 0xffff, 0x6400, { 10, 10, 6}},
+ {m68k_op_bcc_32 , 0xffff, 0x64ff, { 0, 0, 6}},
+ {m68k_op_bcs_16 , 0xffff, 0x6500, { 10, 10, 6}},
+ {m68k_op_bcs_32 , 0xffff, 0x65ff, { 0, 0, 6}},
+ {m68k_op_bne_16 , 0xffff, 0x6600, { 10, 10, 6}},
+ {m68k_op_bne_32 , 0xffff, 0x66ff, { 0, 0, 6}},
+ {m68k_op_beq_16 , 0xffff, 0x6700, { 10, 10, 6}},
+ {m68k_op_beq_32 , 0xffff, 0x67ff, { 0, 0, 6}},
+ {m68k_op_bvc_16 , 0xffff, 0x6800, { 10, 10, 6}},
+ {m68k_op_bvc_32 , 0xffff, 0x68ff, { 0, 0, 6}},
+ {m68k_op_bvs_16 , 0xffff, 0x6900, { 10, 10, 6}},
+ {m68k_op_bvs_32 , 0xffff, 0x69ff, { 0, 0, 6}},
+ {m68k_op_bpl_16 , 0xffff, 0x6a00, { 10, 10, 6}},
+ {m68k_op_bpl_32 , 0xffff, 0x6aff, { 0, 0, 6}},
+ {m68k_op_bmi_16 , 0xffff, 0x6b00, { 10, 10, 6}},
+ {m68k_op_bmi_32 , 0xffff, 0x6bff, { 0, 0, 6}},
+ {m68k_op_bge_16 , 0xffff, 0x6c00, { 10, 10, 6}},
+ {m68k_op_bge_32 , 0xffff, 0x6cff, { 0, 0, 6}},
+ {m68k_op_blt_16 , 0xffff, 0x6d00, { 10, 10, 6}},
+ {m68k_op_blt_32 , 0xffff, 0x6dff, { 0, 0, 6}},
+ {m68k_op_bgt_16 , 0xffff, 0x6e00, { 10, 10, 6}},
+ {m68k_op_bgt_32 , 0xffff, 0x6eff, { 0, 0, 6}},
+ {m68k_op_ble_16 , 0xffff, 0x6f00, { 10, 10, 6}},
+ {m68k_op_ble_32 , 0xffff, 0x6fff, { 0, 0, 6}},
+ {m68k_op_sbcd_8_mm_axy7 , 0xffff, 0x8f0f, { 18, 18, 16}},
+ {m68k_op_pack_16_mm_axy7 , 0xffff, 0x8f4f, { 0, 0, 13}},
+ {m68k_op_unpk_16_mm_axy7 , 0xffff, 0x8f8f, { 0, 0, 13}},
+ {m68k_op_subx_8_mm_axy7 , 0xffff, 0x9f0f, { 18, 18, 12}},
+ {m68k_op_cmpm_8_axy7 , 0xffff, 0xbf0f, { 12, 12, 9}},
+ {m68k_op_abcd_8_mm_axy7 , 0xffff, 0xcf0f, { 18, 18, 16}},
+ {m68k_op_addx_8_mm_axy7 , 0xffff, 0xdf0f, { 18, 18, 12}},
+ {m68k_op_asr_16_aw , 0xffff, 0xe0f8, { 16, 16, 9}},
+ {m68k_op_asr_16_al , 0xffff, 0xe0f9, { 20, 20, 9}},
+ {m68k_op_asl_16_aw , 0xffff, 0xe1f8, { 16, 16, 10}},
+ {m68k_op_asl_16_al , 0xffff, 0xe1f9, { 20, 20, 10}},
+ {m68k_op_lsr_16_aw , 0xffff, 0xe2f8, { 16, 16, 9}},
+ {m68k_op_lsr_16_al , 0xffff, 0xe2f9, { 20, 20, 9}},
+ {m68k_op_lsl_16_aw , 0xffff, 0xe3f8, { 16, 16, 9}},
+ {m68k_op_lsl_16_al , 0xffff, 0xe3f9, { 20, 20, 9}},
+ {m68k_op_roxr_16_aw , 0xffff, 0xe4f8, { 16, 16, 9}},
+ {m68k_op_roxr_16_al , 0xffff, 0xe4f9, { 20, 20, 9}},
+ {m68k_op_roxl_16_aw , 0xffff, 0xe5f8, { 16, 16, 9}},
+ {m68k_op_roxl_16_al , 0xffff, 0xe5f9, { 20, 20, 9}},
+ {m68k_op_ror_16_aw , 0xffff, 0xe6f8, { 16, 16, 11}},
+ {m68k_op_ror_16_al , 0xffff, 0xe6f9, { 20, 20, 11}},
+ {m68k_op_rol_16_aw , 0xffff, 0xe7f8, { 16, 16, 11}},
+ {m68k_op_rol_16_al , 0xffff, 0xe7f9, { 20, 20, 11}},
+ {m68k_op_bftst_32_aw , 0xffff, 0xe8f8, { 0, 0, 17}},
+ {m68k_op_bftst_32_al , 0xffff, 0xe8f9, { 0, 0, 17}},
+ {m68k_op_bftst_32_pcdi , 0xffff, 0xe8fa, { 0, 0, 18}},
+ {m68k_op_bftst_32_pcix , 0xffff, 0xe8fb, { 0, 0, 20}},
+ {m68k_op_bfextu_32_aw , 0xffff, 0xe9f8, { 0, 0, 19}},
+ {m68k_op_bfextu_32_al , 0xffff, 0xe9f9, { 0, 0, 19}},
+ {m68k_op_bfextu_32_pcdi , 0xffff, 0xe9fa, { 0, 0, 20}},
+ {m68k_op_bfextu_32_pcix , 0xffff, 0xe9fb, { 0, 0, 22}},
+ {m68k_op_bfchg_32_aw , 0xffff, 0xeaf8, { 0, 0, 24}},
+ {m68k_op_bfchg_32_al , 0xffff, 0xeaf9, { 0, 0, 24}},
+ {m68k_op_bfexts_32_aw , 0xffff, 0xebf8, { 0, 0, 19}},
+ {m68k_op_bfexts_32_al , 0xffff, 0xebf9, { 0, 0, 19}},
+ {m68k_op_bfexts_32_pcdi , 0xffff, 0xebfa, { 0, 0, 20}},
+ {m68k_op_bfexts_32_pcix , 0xffff, 0xebfb, { 0, 0, 22}},
+ {m68k_op_bfclr_32_aw , 0xffff, 0xecf8, { 0, 0, 24}},
+ {m68k_op_bfclr_32_al , 0xffff, 0xecf9, { 0, 0, 24}},
+ {m68k_op_bfffo_32_aw , 0xffff, 0xedf8, { 0, 0, 32}},
+ {m68k_op_bfffo_32_al , 0xffff, 0xedf9, { 0, 0, 32}},
+ {m68k_op_bfffo_32_pcdi , 0xffff, 0xedfa, { 0, 0, 33}},
+ {m68k_op_bfffo_32_pcix , 0xffff, 0xedfb, { 0, 0, 35}},
+ {m68k_op_bfset_32_aw , 0xffff, 0xeef8, { 0, 0, 24}},
+ {m68k_op_bfset_32_al , 0xffff, 0xeef9, { 0, 0, 24}},
+ {m68k_op_bfins_32_aw , 0xffff, 0xeff8, { 0, 0, 21}},
+ {m68k_op_bfins_32_al , 0xffff, 0xeff9, { 0, 0, 21}},
+ {0, 0, 0, {0, 0, 0}}
+};
+
+
+/* Build the opcode handler jump table */
+void m68ki_build_opcode_table(void)
+{
+ opcode_handler_struct *ostruct;
+ int instr;
+ int i;
+ int j;
+ int k;
+
+ for(i = 0; i < 0x10000; i++)
+ {
+ /* default to illegal */
+ m68ki_instruction_jump_table[i] = m68k_op_illegal;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][i] = 0;
+ }
+
+ ostruct = m68k_opcode_handler_table;
+ while(ostruct->mask != 0xff00)
+ {
+ for(i = 0;i < 0x10000;i++)
+ {
+ if((i & ostruct->mask) == ostruct->match)
+ {
+ m68ki_instruction_jump_table[i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][i] = ostruct->cycles[k];
+ }
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xff00)
+ {
+ for(i = 0;i <= 0xff;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xf1f8)
+ {
+ for(i = 0;i < 8;i++)
+ {
+ for(j = 0;j < 8;j++)
+ {
+ instr = ostruct->match | (i << 9) | j;
+ m68ki_instruction_jump_table[instr] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][instr] = ostruct->cycles[k];
+ if((instr & 0xf000) == 0xe000 && (!(instr & 0x20)))
+ m68ki_cycles[0][instr] = m68ki_cycles[1][instr] = ostruct->cycles[k] + ((((j-1)&7)+1)<<1);
+ }
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xfff0)
+ {
+ for(i = 0;i <= 0x0f;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xf1ff)
+ {
+ for(i = 0;i <= 0x07;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | (i << 9)] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xfff8)
+ {
+ for(i = 0;i <= 0x07;i++)
+ {
+ m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];
+ }
+ ostruct++;
+ }
+ while(ostruct->mask == 0xffff)
+ {
+ m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler;
+ for(k=0;k<NUM_CPU_TYPES;k++)
+ m68ki_cycles[k][ostruct->match] = ostruct->cycles[k];
+ ostruct++;
+ }
+}
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+
diff --git a/plugins/ao/eng_ssf/m68kops.h b/plugins/ao/eng_ssf/m68kops.h
new file mode 100644
index 00000000..8524d2fe
--- /dev/null
+++ b/plugins/ao/eng_ssf/m68kops.h
@@ -0,0 +1,1984 @@
+#ifndef M68KOPS__HEADER
+#define M68KOPS__HEADER
+
+/* ======================================================================== */
+/* ============================ OPCODE HANDLERS =========================== */
+/* ======================================================================== */
+
+
+void m68k_op_1010(void);
+void m68k_op_1111(void);
+void m68k_op_abcd_8_rr(void);
+void m68k_op_abcd_8_mm_ax7(void);
+void m68k_op_abcd_8_mm_ay7(void);
+void m68k_op_abcd_8_mm_axy7(void);
+void m68k_op_abcd_8_mm(void);
+void m68k_op_add_8_er_d(void);
+void m68k_op_add_8_er_ai(void);
+void m68k_op_add_8_er_pi(void);
+void m68k_op_add_8_er_pi7(void);
+void m68k_op_add_8_er_pd(void);
+void m68k_op_add_8_er_pd7(void);
+void m68k_op_add_8_er_di(void);
+void m68k_op_add_8_er_ix(void);
+void m68k_op_add_8_er_aw(void);
+void m68k_op_add_8_er_al(void);
+void m68k_op_add_8_er_pcdi(void);
+void m68k_op_add_8_er_pcix(void);
+void m68k_op_add_8_er_i(void);
+void m68k_op_add_16_er_d(void);
+void m68k_op_add_16_er_a(void);
+void m68k_op_add_16_er_ai(void);
+void m68k_op_add_16_er_pi(void);
+void m68k_op_add_16_er_pd(void);
+void m68k_op_add_16_er_di(void);
+void m68k_op_add_16_er_ix(void);
+void m68k_op_add_16_er_aw(void);
+void m68k_op_add_16_er_al(void);
+void m68k_op_add_16_er_pcdi(void);
+void m68k_op_add_16_er_pcix(void);
+void m68k_op_add_16_er_i(void);
+void m68k_op_add_32_er_d(void);
+void m68k_op_add_32_er_a(void);
+void m68k_op_add_32_er_ai(void);
+void m68k_op_add_32_er_pi(void);
+void m68k_op_add_32_er_pd(void);
+void m68k_op_add_32_er_di(void);
+void m68k_op_add_32_er_ix(void);
+void m68k_op_add_32_er_aw(void);
+void m68k_op_add_32_er_al(void);
+void m68k_op_add_32_er_pcdi(void);
+void m68k_op_add_32_er_pcix(void);
+void m68k_op_add_32_er_i(void);
+void m68k_op_add_8_re_ai(void);
+void m68k_op_add_8_re_pi(void);
+void m68k_op_add_8_re_pi7(void);
+void m68k_op_add_8_re_pd(void);
+void m68k_op_add_8_re_pd7(void);
+void m68k_op_add_8_re_di(void);
+void m68k_op_add_8_re_ix(void);
+void m68k_op_add_8_re_aw(void);
+void m68k_op_add_8_re_al(void);
+void m68k_op_add_16_re_ai(void);
+void m68k_op_add_16_re_pi(void);
+void m68k_op_add_16_re_pd(void);
+void m68k_op_add_16_re_di(void);
+void m68k_op_add_16_re_ix(void);
+void m68k_op_add_16_re_aw(void);
+void m68k_op_add_16_re_al(void);
+void m68k_op_add_32_re_ai(void);
+void m68k_op_add_32_re_pi(void);
+void m68k_op_add_32_re_pd(void);
+void m68k_op_add_32_re_di(void);
+void m68k_op_add_32_re_ix(void);
+void m68k_op_add_32_re_aw(void);
+void m68k_op_add_32_re_al(void);
+void m68k_op_adda_16_d(void);
+void m68k_op_adda_16_a(void);
+void m68k_op_adda_16_ai(void);
+void m68k_op_adda_16_pi(void);
+void m68k_op_adda_16_pd(void);
+void m68k_op_adda_16_di(void);
+void m68k_op_adda_16_ix(void);
+void m68k_op_adda_16_aw(void);
+void m68k_op_adda_16_al(void);
+void m68k_op_adda_16_pcdi(void);
+void m68k_op_adda_16_pcix(void);
+void m68k_op_adda_16_i(void);
+void m68k_op_adda_32_d(void);
+void m68k_op_adda_32_a(void);
+void m68k_op_adda_32_ai(void);
+void m68k_op_adda_32_pi(void);
+void m68k_op_adda_32_pd(void);
+void m68k_op_adda_32_di(void);
+void m68k_op_adda_32_ix(void);
+void m68k_op_adda_32_aw(void);
+void m68k_op_adda_32_al(void);
+void m68k_op_adda_32_pcdi(void);
+void m68k_op_adda_32_pcix(void);
+void m68k_op_adda_32_i(void);
+void m68k_op_addi_8_d(void);
+void m68k_op_addi_8_ai(void);
+void m68k_op_addi_8_pi(void);
+void m68k_op_addi_8_pi7(void);
+void m68k_op_addi_8_pd(void);
+void m68k_op_addi_8_pd7(void);
+void m68k_op_addi_8_di(void);
+void m68k_op_addi_8_ix(void);
+void m68k_op_addi_8_aw(void);
+void m68k_op_addi_8_al(void);
+void m68k_op_addi_16_d(void);
+void m68k_op_addi_16_ai(void);
+void m68k_op_addi_16_pi(void);
+void m68k_op_addi_16_pd(void);
+void m68k_op_addi_16_di(void);
+void m68k_op_addi_16_ix(void);
+void m68k_op_addi_16_aw(void);
+void m68k_op_addi_16_al(void);
+void m68k_op_addi_32_d(void);
+void m68k_op_addi_32_ai(void);
+void m68k_op_addi_32_pi(void);
+void m68k_op_addi_32_pd(void);
+void m68k_op_addi_32_di(void);
+void m68k_op_addi_32_ix(void);
+void m68k_op_addi_32_aw(void);
+void m68k_op_addi_32_al(void);
+void m68k_op_addq_8_d(void);
+void m68k_op_addq_8_ai(void);
+void m68k_op_addq_8_pi(void);
+void m68k_op_addq_8_pi7(void);
+void m68k_op_addq_8_pd(void);
+void m68k_op_addq_8_pd7(void);
+void m68k_op_addq_8_di(void);
+void m68k_op_addq_8_ix(void);
+void m68k_op_addq_8_aw(void);
+void m68k_op_addq_8_al(void);
+void m68k_op_addq_16_d(void);
+void m68k_op_addq_16_a(void);
+void m68k_op_addq_16_ai(void);
+void m68k_op_addq_16_pi(void);
+void m68k_op_addq_16_pd(void);
+void m68k_op_addq_16_di(void);
+void m68k_op_addq_16_ix(void);
+void m68k_op_addq_16_aw(void);
+void m68k_op_addq_16_al(void);
+void m68k_op_addq_32_d(void);
+void m68k_op_addq_32_a(void);
+void m68k_op_addq_32_ai(void);
+void m68k_op_addq_32_pi(void);
+void m68k_op_addq_32_pd(void);
+void m68k_op_addq_32_di(void);
+void m68k_op_addq_32_ix(void);
+void m68k_op_addq_32_aw(void);
+void m68k_op_addq_32_al(void);
+void m68k_op_addx_8_rr(void);
+void m68k_op_addx_16_rr(void);
+void m68k_op_addx_32_rr(void);
+void m68k_op_addx_8_mm_ax7(void);
+void m68k_op_addx_8_mm_ay7(void);
+void m68k_op_addx_8_mm_axy7(void);
+void m68k_op_addx_8_mm(void);
+void m68k_op_addx_16_mm(void);
+void m68k_op_addx_32_mm(void);
+void m68k_op_and_8_er_d(void);
+void m68k_op_and_8_er_ai(void);
+void m68k_op_and_8_er_pi(void);
+void m68k_op_and_8_er_pi7(void);
+void m68k_op_and_8_er_pd(void);
+void m68k_op_and_8_er_pd7(void);
+void m68k_op_and_8_er_di(void);
+void m68k_op_and_8_er_ix(void);
+void m68k_op_and_8_er_aw(void);
+void m68k_op_and_8_er_al(void);
+void m68k_op_and_8_er_pcdi(void);
+void m68k_op_and_8_er_pcix(void);
+void m68k_op_and_8_er_i(void);
+void m68k_op_and_16_er_d(void);
+void m68k_op_and_16_er_ai(void);
+void m68k_op_and_16_er_pi(void);
+void m68k_op_and_16_er_pd(void);
+void m68k_op_and_16_er_di(void);
+void m68k_op_and_16_er_ix(void);
+void m68k_op_and_16_er_aw(void);
+void m68k_op_and_16_er_al(void);
+void m68k_op_and_16_er_pcdi(void);
+void m68k_op_and_16_er_pcix(void);
+void m68k_op_and_16_er_i(void);
+void m68k_op_and_32_er_d(void);
+void m68k_op_and_32_er_ai(void);
+void m68k_op_and_32_er_pi(void);
+void m68k_op_and_32_er_pd(void);
+void m68k_op_and_32_er_di(void);
+void m68k_op_and_32_er_ix(void);
+void m68k_op_and_32_er_aw(void);
+void m68k_op_and_32_er_al(void);
+void m68k_op_and_32_er_pcdi(void);
+void m68k_op_and_32_er_pcix(void);
+void m68k_op_and_32_er_i(void);
+void m68k_op_and_8_re_ai(void);
+void m68k_op_and_8_re_pi(void);
+void m68k_op_and_8_re_pi7(void);
+void m68k_op_and_8_re_pd(void);
+void m68k_op_and_8_re_pd7(void);
+void m68k_op_and_8_re_di(void);
+void m68k_op_and_8_re_ix(void);
+void m68k_op_and_8_re_aw(void);
+void m68k_op_and_8_re_al(void);
+void m68k_op_and_16_re_ai(void);
+void m68k_op_and_16_re_pi(void);
+void m68k_op_and_16_re_pd(void);
+void m68k_op_and_16_re_di(void);
+void m68k_op_and_16_re_ix(void);
+void m68k_op_and_16_re_aw(void);
+void m68k_op_and_16_re_al(void);
+void m68k_op_and_32_re_ai(void);
+void m68k_op_and_32_re_pi(void);
+void m68k_op_and_32_re_pd(void);
+void m68k_op_and_32_re_di(void);
+void m68k_op_and_32_re_ix(void);
+void m68k_op_and_32_re_aw(void);
+void m68k_op_and_32_re_al(void);
+void m68k_op_andi_8_d(void);
+void m68k_op_andi_8_ai(void);
+void m68k_op_andi_8_pi(void);
+void m68k_op_andi_8_pi7(void);
+void m68k_op_andi_8_pd(void);
+void m68k_op_andi_8_pd7(void);
+void m68k_op_andi_8_di(void);
+void m68k_op_andi_8_ix(void);
+void m68k_op_andi_8_aw(void);
+void m68k_op_andi_8_al(void);
+void m68k_op_andi_16_d(void);
+void m68k_op_andi_16_ai(void);
+void m68k_op_andi_16_pi(void);
+void m68k_op_andi_16_pd(void);
+void m68k_op_andi_16_di(void);
+void m68k_op_andi_16_ix(void);
+void m68k_op_andi_16_aw(void);
+void m68k_op_andi_16_al(void);
+void m68k_op_andi_32_d(void);
+void m68k_op_andi_32_ai(void);
+void m68k_op_andi_32_pi(void);
+void m68k_op_andi_32_pd(void);
+void m68k_op_andi_32_di(void);
+void m68k_op_andi_32_ix(void);
+void m68k_op_andi_32_aw(void);
+void m68k_op_andi_32_al(void);
+void m68k_op_andi_16_toc(void);
+void m68k_op_andi_16_tos(void);
+void m68k_op_asr_8_s(void);
+void m68k_op_asr_16_s(void);
+void m68k_op_asr_32_s(void);
+void m68k_op_asr_8_r(void);
+void m68k_op_asr_16_r(void);
+void m68k_op_asr_32_r(void);
+void m68k_op_asr_16_ai(void);
+void m68k_op_asr_16_pi(void);
+void m68k_op_asr_16_pd(void);
+void m68k_op_asr_16_di(void);
+void m68k_op_asr_16_ix(void);
+void m68k_op_asr_16_aw(void);
+void m68k_op_asr_16_al(void);
+void m68k_op_asl_8_s(void);
+void m68k_op_asl_16_s(void);
+void m68k_op_asl_32_s(void);
+void m68k_op_asl_8_r(void);
+void m68k_op_asl_16_r(void);
+void m68k_op_asl_32_r(void);
+void m68k_op_asl_16_ai(void);
+void m68k_op_asl_16_pi(void);
+void m68k_op_asl_16_pd(void);
+void m68k_op_asl_16_di(void);
+void m68k_op_asl_16_ix(void);
+void m68k_op_asl_16_aw(void);
+void m68k_op_asl_16_al(void);
+void m68k_op_bhi_8(void);
+void m68k_op_bls_8(void);
+void m68k_op_bcc_8(void);
+void m68k_op_bcs_8(void);
+void m68k_op_bne_8(void);
+void m68k_op_beq_8(void);
+void m68k_op_bvc_8(void);
+void m68k_op_bvs_8(void);
+void m68k_op_bpl_8(void);
+void m68k_op_bmi_8(void);
+void m68k_op_bge_8(void);
+void m68k_op_blt_8(void);
+void m68k_op_bgt_8(void);
+void m68k_op_ble_8(void);
+void m68k_op_bhi_16(void);
+void m68k_op_bls_16(void);
+void m68k_op_bcc_16(void);
+void m68k_op_bcs_16(void);
+void m68k_op_bne_16(void);
+void m68k_op_beq_16(void);
+void m68k_op_bvc_16(void);
+void m68k_op_bvs_16(void);
+void m68k_op_bpl_16(void);
+void m68k_op_bmi_16(void);
+void m68k_op_bge_16(void);
+void m68k_op_blt_16(void);
+void m68k_op_bgt_16(void);
+void m68k_op_ble_16(void);
+void m68k_op_bhi_32(void);
+void m68k_op_bls_32(void);
+void m68k_op_bcc_32(void);
+void m68k_op_bcs_32(void);
+void m68k_op_bne_32(void);
+void m68k_op_beq_32(void);
+void m68k_op_bvc_32(void);
+void m68k_op_bvs_32(void);
+void m68k_op_bpl_32(void);
+void m68k_op_bmi_32(void);
+void m68k_op_bge_32(void);
+void m68k_op_blt_32(void);
+void m68k_op_bgt_32(void);
+void m68k_op_ble_32(void);
+void m68k_op_bchg_32_r_d(void);
+void m68k_op_bchg_8_r_ai(void);
+void m68k_op_bchg_8_r_pi(void);
+void m68k_op_bchg_8_r_pi7(void);
+void m68k_op_bchg_8_r_pd(void);
+void m68k_op_bchg_8_r_pd7(void);
+void m68k_op_bchg_8_r_di(void);
+void m68k_op_bchg_8_r_ix(void);
+void m68k_op_bchg_8_r_aw(void);
+void m68k_op_bchg_8_r_al(void);
+void m68k_op_bchg_32_s_d(void);
+void m68k_op_bchg_8_s_ai(void);
+void m68k_op_bchg_8_s_pi(void);
+void m68k_op_bchg_8_s_pi7(void);
+void m68k_op_bchg_8_s_pd(void);
+void m68k_op_bchg_8_s_pd7(void);
+void m68k_op_bchg_8_s_di(void);
+void m68k_op_bchg_8_s_ix(void);
+void m68k_op_bchg_8_s_aw(void);
+void m68k_op_bchg_8_s_al(void);
+void m68k_op_bclr_32_r_d(void);
+void m68k_op_bclr_8_r_ai(void);
+void m68k_op_bclr_8_r_pi(void);
+void m68k_op_bclr_8_r_pi7(void);
+void m68k_op_bclr_8_r_pd(void);
+void m68k_op_bclr_8_r_pd7(void);
+void m68k_op_bclr_8_r_di(void);
+void m68k_op_bclr_8_r_ix(void);
+void m68k_op_bclr_8_r_aw(void);
+void m68k_op_bclr_8_r_al(void);
+void m68k_op_bclr_32_s_d(void);
+void m68k_op_bclr_8_s_ai(void);
+void m68k_op_bclr_8_s_pi(void);
+void m68k_op_bclr_8_s_pi7(void);
+void m68k_op_bclr_8_s_pd(void);
+void m68k_op_bclr_8_s_pd7(void);
+void m68k_op_bclr_8_s_di(void);
+void m68k_op_bclr_8_s_ix(void);
+void m68k_op_bclr_8_s_aw(void);
+void m68k_op_bclr_8_s_al(void);
+void m68k_op_bfchg_32_d(void);
+void m68k_op_bfchg_32_ai(void);
+void m68k_op_bfchg_32_di(void);
+void m68k_op_bfchg_32_ix(void);
+void m68k_op_bfchg_32_aw(void);
+void m68k_op_bfchg_32_al(void);
+void m68k_op_bfclr_32_d(void);
+void m68k_op_bfclr_32_ai(void);
+void m68k_op_bfclr_32_di(void);
+void m68k_op_bfclr_32_ix(void);
+void m68k_op_bfclr_32_aw(void);
+void m68k_op_bfclr_32_al(void);
+void m68k_op_bfexts_32_d(void);
+void m68k_op_bfexts_32_ai(void);
+void m68k_op_bfexts_32_di(void);
+void m68k_op_bfexts_32_ix(void);
+void m68k_op_bfexts_32_aw(void);
+void m68k_op_bfexts_32_al(void);
+void m68k_op_bfexts_32_pcdi(void);
+void m68k_op_bfexts_32_pcix(void);
+void m68k_op_bfextu_32_d(void);
+void m68k_op_bfextu_32_ai(void);
+void m68k_op_bfextu_32_di(void);
+void m68k_op_bfextu_32_ix(void);
+void m68k_op_bfextu_32_aw(void);
+void m68k_op_bfextu_32_al(void);
+void m68k_op_bfextu_32_pcdi(void);
+void m68k_op_bfextu_32_pcix(void);
+void m68k_op_bfffo_32_d(void);
+void m68k_op_bfffo_32_ai(void);
+void m68k_op_bfffo_32_di(void);
+void m68k_op_bfffo_32_ix(void);
+void m68k_op_bfffo_32_aw(void);
+void m68k_op_bfffo_32_al(void);
+void m68k_op_bfffo_32_pcdi(void);
+void m68k_op_bfffo_32_pcix(void);
+void m68k_op_bfins_32_d(void);
+void m68k_op_bfins_32_ai(void);
+void m68k_op_bfins_32_di(void);
+void m68k_op_bfins_32_ix(void);
+void m68k_op_bfins_32_aw(void);
+void m68k_op_bfins_32_al(void);
+void m68k_op_bfset_32_d(void);
+void m68k_op_bfset_32_ai(void);
+void m68k_op_bfset_32_di(void);
+void m68k_op_bfset_32_ix(void);
+void m68k_op_bfset_32_aw(void);
+void m68k_op_bfset_32_al(void);
+void m68k_op_bftst_32_d(void);
+void m68k_op_bftst_32_ai(void);
+void m68k_op_bftst_32_di(void);
+void m68k_op_bftst_32_ix(void);
+void m68k_op_bftst_32_aw(void);
+void m68k_op_bftst_32_al(void);
+void m68k_op_bftst_32_pcdi(void);
+void m68k_op_bftst_32_pcix(void);
+void m68k_op_bkpt(void);
+void m68k_op_bra_8(void);
+void m68k_op_bra_16(void);
+void m68k_op_bra_32(void);
+void m68k_op_bset_32_r_d(void);
+void m68k_op_bset_8_r_ai(void);
+void m68k_op_bset_8_r_pi(void);
+void m68k_op_bset_8_r_pi7(void);
+void m68k_op_bset_8_r_pd(void);
+void m68k_op_bset_8_r_pd7(void);
+void m68k_op_bset_8_r_di(void);
+void m68k_op_bset_8_r_ix(void);
+void m68k_op_bset_8_r_aw(void);
+void m68k_op_bset_8_r_al(void);
+void m68k_op_bset_32_s_d(void);
+void m68k_op_bset_8_s_ai(void);
+void m68k_op_bset_8_s_pi(void);
+void m68k_op_bset_8_s_pi7(void);
+void m68k_op_bset_8_s_pd(void);
+void m68k_op_bset_8_s_pd7(void);
+void m68k_op_bset_8_s_di(void);
+void m68k_op_bset_8_s_ix(void);
+void m68k_op_bset_8_s_aw(void);
+void m68k_op_bset_8_s_al(void);
+void m68k_op_bsr_8(void);
+void m68k_op_bsr_16(void);
+void m68k_op_bsr_32(void);
+void m68k_op_btst_32_r_d(void);
+void m68k_op_btst_8_r_ai(void);
+void m68k_op_btst_8_r_pi(void);
+void m68k_op_btst_8_r_pi7(void);
+void m68k_op_btst_8_r_pd(void);
+void m68k_op_btst_8_r_pd7(void);
+void m68k_op_btst_8_r_di(void);
+void m68k_op_btst_8_r_ix(void);
+void m68k_op_btst_8_r_aw(void);
+void m68k_op_btst_8_r_al(void);
+void m68k_op_btst_8_r_pcdi(void);
+void m68k_op_btst_8_r_pcix(void);
+void m68k_op_btst_8_r_i(void);
+void m68k_op_btst_32_s_d(void);
+void m68k_op_btst_8_s_ai(void);
+void m68k_op_btst_8_s_pi(void);
+void m68k_op_btst_8_s_pi7(void);
+void m68k_op_btst_8_s_pd(void);
+void m68k_op_btst_8_s_pd7(void);
+void m68k_op_btst_8_s_di(void);
+void m68k_op_btst_8_s_ix(void);
+void m68k_op_btst_8_s_aw(void);
+void m68k_op_btst_8_s_al(void);
+void m68k_op_btst_8_s_pcdi(void);
+void m68k_op_btst_8_s_pcix(void);
+void m68k_op_callm_32_ai(void);
+void m68k_op_callm_32_di(void);
+void m68k_op_callm_32_ix(void);
+void m68k_op_callm_32_aw(void);
+void m68k_op_callm_32_al(void);
+void m68k_op_callm_32_pcdi(void);
+void m68k_op_callm_32_pcix(void);
+void m68k_op_cas_8_ai(void);
+void m68k_op_cas_8_pi(void);
+void m68k_op_cas_8_pi7(void);
+void m68k_op_cas_8_pd(void);
+void m68k_op_cas_8_pd7(void);
+void m68k_op_cas_8_di(void);
+void m68k_op_cas_8_ix(void);
+void m68k_op_cas_8_aw(void);
+void m68k_op_cas_8_al(void);
+void m68k_op_cas_16_ai(void);
+void m68k_op_cas_16_pi(void);
+void m68k_op_cas_16_pd(void);
+void m68k_op_cas_16_di(void);
+void m68k_op_cas_16_ix(void);
+void m68k_op_cas_16_aw(void);
+void m68k_op_cas_16_al(void);
+void m68k_op_cas_32_ai(void);
+void m68k_op_cas_32_pi(void);
+void m68k_op_cas_32_pd(void);
+void m68k_op_cas_32_di(void);
+void m68k_op_cas_32_ix(void);
+void m68k_op_cas_32_aw(void);
+void m68k_op_cas_32_al(void);
+void m68k_op_cas2_16(void);
+void m68k_op_cas2_32(void);
+void m68k_op_chk_16_d(void);
+void m68k_op_chk_16_ai(void);
+void m68k_op_chk_16_pi(void);
+void m68k_op_chk_16_pd(void);
+void m68k_op_chk_16_di(void);
+void m68k_op_chk_16_ix(void);
+void m68k_op_chk_16_aw(void);
+void m68k_op_chk_16_al(void);
+void m68k_op_chk_16_pcdi(void);
+void m68k_op_chk_16_pcix(void);
+void m68k_op_chk_16_i(void);
+void m68k_op_chk_32_d(void);
+void m68k_op_chk_32_ai(void);
+void m68k_op_chk_32_pi(void);
+void m68k_op_chk_32_pd(void);
+void m68k_op_chk_32_di(void);
+void m68k_op_chk_32_ix(void);
+void m68k_op_chk_32_aw(void);
+void m68k_op_chk_32_al(void);
+void m68k_op_chk_32_pcdi(void);
+void m68k_op_chk_32_pcix(void);
+void m68k_op_chk_32_i(void);
+void m68k_op_chk2cmp2_8_pcdi(void);
+void m68k_op_chk2cmp2_8_pcix(void);
+void m68k_op_chk2cmp2_8_ai(void);
+void m68k_op_chk2cmp2_8_di(void);
+void m68k_op_chk2cmp2_8_ix(void);
+void m68k_op_chk2cmp2_8_aw(void);
+void m68k_op_chk2cmp2_8_al(void);
+void m68k_op_chk2cmp2_16_pcdi(void);
+void m68k_op_chk2cmp2_16_pcix(void);
+void m68k_op_chk2cmp2_16_ai(void);
+void m68k_op_chk2cmp2_16_di(void);
+void m68k_op_chk2cmp2_16_ix(void);
+void m68k_op_chk2cmp2_16_aw(void);
+void m68k_op_chk2cmp2_16_al(void);
+void m68k_op_chk2cmp2_32_pcdi(void);
+void m68k_op_chk2cmp2_32_pcix(void);
+void m68k_op_chk2cmp2_32_ai(void);
+void m68k_op_chk2cmp2_32_di(void);
+void m68k_op_chk2cmp2_32_ix(void);
+void m68k_op_chk2cmp2_32_aw(void);
+void m68k_op_chk2cmp2_32_al(void);
+void m68k_op_clr_8_d(void);
+void m68k_op_clr_8_ai(void);
+void m68k_op_clr_8_pi(void);
+void m68k_op_clr_8_pi7(void);
+void m68k_op_clr_8_pd(void);
+void m68k_op_clr_8_pd7(void);
+void m68k_op_clr_8_di(void);
+void m68k_op_clr_8_ix(void);
+void m68k_op_clr_8_aw(void);
+void m68k_op_clr_8_al(void);
+void m68k_op_clr_16_d(void);
+void m68k_op_clr_16_ai(void);
+void m68k_op_clr_16_pi(void);
+void m68k_op_clr_16_pd(void);
+void m68k_op_clr_16_di(void);
+void m68k_op_clr_16_ix(void);
+void m68k_op_clr_16_aw(void);
+void m68k_op_clr_16_al(void);
+void m68k_op_clr_32_d(void);
+void m68k_op_clr_32_ai(void);
+void m68k_op_clr_32_pi(void);
+void m68k_op_clr_32_pd(void);
+void m68k_op_clr_32_di(void);
+void m68k_op_clr_32_ix(void);
+void m68k_op_clr_32_aw(void);
+void m68k_op_clr_32_al(void);
+void m68k_op_cmp_8_d(void);
+void m68k_op_cmp_8_ai(void);
+void m68k_op_cmp_8_pi(void);
+void m68k_op_cmp_8_pi7(void);
+void m68k_op_cmp_8_pd(void);
+void m68k_op_cmp_8_pd7(void);
+void m68k_op_cmp_8_di(void);
+void m68k_op_cmp_8_ix(void);
+void m68k_op_cmp_8_aw(void);
+void m68k_op_cmp_8_al(void);
+void m68k_op_cmp_8_pcdi(void);
+void m68k_op_cmp_8_pcix(void);
+void m68k_op_cmp_8_i(void);
+void m68k_op_cmp_16_d(void);
+void m68k_op_cmp_16_a(void);
+void m68k_op_cmp_16_ai(void);
+void m68k_op_cmp_16_pi(void);
+void m68k_op_cmp_16_pd(void);
+void m68k_op_cmp_16_di(void);
+void m68k_op_cmp_16_ix(void);
+void m68k_op_cmp_16_aw(void);
+void m68k_op_cmp_16_al(void);
+void m68k_op_cmp_16_pcdi(void);
+void m68k_op_cmp_16_pcix(void);
+void m68k_op_cmp_16_i(void);
+void m68k_op_cmp_32_d(void);
+void m68k_op_cmp_32_a(void);
+void m68k_op_cmp_32_ai(void);
+void m68k_op_cmp_32_pi(void);
+void m68k_op_cmp_32_pd(void);
+void m68k_op_cmp_32_di(void);
+void m68k_op_cmp_32_ix(void);
+void m68k_op_cmp_32_aw(void);
+void m68k_op_cmp_32_al(void);
+void m68k_op_cmp_32_pcdi(void);
+void m68k_op_cmp_32_pcix(void);
+void m68k_op_cmp_32_i(void);
+void m68k_op_cmpa_16_d(void);
+void m68k_op_cmpa_16_a(void);
+void m68k_op_cmpa_16_ai(void);
+void m68k_op_cmpa_16_pi(void);
+void m68k_op_cmpa_16_pd(void);
+void m68k_op_cmpa_16_di(void);
+void m68k_op_cmpa_16_ix(void);
+void m68k_op_cmpa_16_aw(void);
+void m68k_op_cmpa_16_al(void);
+void m68k_op_cmpa_16_pcdi(void);
+void m68k_op_cmpa_16_pcix(void);
+void m68k_op_cmpa_16_i(void);
+void m68k_op_cmpa_32_d(void);
+void m68k_op_cmpa_32_a(void);
+void m68k_op_cmpa_32_ai(void);
+void m68k_op_cmpa_32_pi(void);
+void m68k_op_cmpa_32_pd(void);
+void m68k_op_cmpa_32_di(void);
+void m68k_op_cmpa_32_ix(void);
+void m68k_op_cmpa_32_aw(void);
+void m68k_op_cmpa_32_al(void);
+void m68k_op_cmpa_32_pcdi(void);
+void m68k_op_cmpa_32_pcix(void);
+void m68k_op_cmpa_32_i(void);
+void m68k_op_cmpi_8_d(void);
+void m68k_op_cmpi_8_ai(void);
+void m68k_op_cmpi_8_pi(void);
+void m68k_op_cmpi_8_pi7(void);
+void m68k_op_cmpi_8_pd(void);
+void m68k_op_cmpi_8_pd7(void);
+void m68k_op_cmpi_8_di(void);
+void m68k_op_cmpi_8_ix(void);
+void m68k_op_cmpi_8_aw(void);
+void m68k_op_cmpi_8_al(void);
+void m68k_op_cmpi_8_pcdi(void);
+void m68k_op_cmpi_8_pcix(void);
+void m68k_op_cmpi_16_d(void);
+void m68k_op_cmpi_16_ai(void);
+void m68k_op_cmpi_16_pi(void);
+void m68k_op_cmpi_16_pd(void);
+void m68k_op_cmpi_16_di(void);
+void m68k_op_cmpi_16_ix(void);
+void m68k_op_cmpi_16_aw(void);
+void m68k_op_cmpi_16_al(void);
+void m68k_op_cmpi_16_pcdi(void);
+void m68k_op_cmpi_16_pcix(void);
+void m68k_op_cmpi_32_d(void);
+void m68k_op_cmpi_32_ai(void);
+void m68k_op_cmpi_32_pi(void);
+void m68k_op_cmpi_32_pd(void);
+void m68k_op_cmpi_32_di(void);
+void m68k_op_cmpi_32_ix(void);
+void m68k_op_cmpi_32_aw(void);
+void m68k_op_cmpi_32_al(void);
+void m68k_op_cmpi_32_pcdi(void);
+void m68k_op_cmpi_32_pcix(void);
+void m68k_op_cmpm_8_ax7(void);
+void m68k_op_cmpm_8_ay7(void);
+void m68k_op_cmpm_8_axy7(void);
+void m68k_op_cmpm_8(void);
+void m68k_op_cmpm_16(void);
+void m68k_op_cmpm_32(void);
+void m68k_op_cpbcc_32(void);
+void m68k_op_cpdbcc_32(void);
+void m68k_op_cpgen_32(void);
+void m68k_op_cpscc_32(void);
+void m68k_op_cptrapcc_32(void);
+void m68k_op_dbt_16(void);
+void m68k_op_dbf_16(void);
+void m68k_op_dbhi_16(void);
+void m68k_op_dbls_16(void);
+void m68k_op_dbcc_16(void);
+void m68k_op_dbcs_16(void);
+void m68k_op_dbne_16(void);
+void m68k_op_dbeq_16(void);
+void m68k_op_dbvc_16(void);
+void m68k_op_dbvs_16(void);
+void m68k_op_dbpl_16(void);
+void m68k_op_dbmi_16(void);
+void m68k_op_dbge_16(void);
+void m68k_op_dblt_16(void);
+void m68k_op_dbgt_16(void);
+void m68k_op_dble_16(void);
+void m68k_op_divs_16_d(void);
+void m68k_op_divs_16_ai(void);
+void m68k_op_divs_16_pi(void);
+void m68k_op_divs_16_pd(void);
+void m68k_op_divs_16_di(void);
+void m68k_op_divs_16_ix(void);
+void m68k_op_divs_16_aw(void);
+void m68k_op_divs_16_al(void);
+void m68k_op_divs_16_pcdi(void);
+void m68k_op_divs_16_pcix(void);
+void m68k_op_divs_16_i(void);
+void m68k_op_divu_16_d(void);
+void m68k_op_divu_16_ai(void);
+void m68k_op_divu_16_pi(void);
+void m68k_op_divu_16_pd(void);
+void m68k_op_divu_16_di(void);
+void m68k_op_divu_16_ix(void);
+void m68k_op_divu_16_aw(void);
+void m68k_op_divu_16_al(void);
+void m68k_op_divu_16_pcdi(void);
+void m68k_op_divu_16_pcix(void);
+void m68k_op_divu_16_i(void);
+void m68k_op_divl_32_d(void);
+void m68k_op_divl_32_ai(void);
+void m68k_op_divl_32_pi(void);
+void m68k_op_divl_32_pd(void);
+void m68k_op_divl_32_di(void);
+void m68k_op_divl_32_ix(void);
+void m68k_op_divl_32_aw(void);
+void m68k_op_divl_32_al(void);
+void m68k_op_divl_32_pcdi(void);
+void m68k_op_divl_32_pcix(void);
+void m68k_op_divl_32_i(void);
+void m68k_op_eor_8_d(void);
+void m68k_op_eor_8_ai(void);
+void m68k_op_eor_8_pi(void);
+void m68k_op_eor_8_pi7(void);
+void m68k_op_eor_8_pd(void);
+void m68k_op_eor_8_pd7(void);
+void m68k_op_eor_8_di(void);
+void m68k_op_eor_8_ix(void);
+void m68k_op_eor_8_aw(void);
+void m68k_op_eor_8_al(void);
+void m68k_op_eor_16_d(void);
+void m68k_op_eor_16_ai(void);
+void m68k_op_eor_16_pi(void);
+void m68k_op_eor_16_pd(void);
+void m68k_op_eor_16_di(void);
+void m68k_op_eor_16_ix(void);
+void m68k_op_eor_16_aw(void);
+void m68k_op_eor_16_al(void);
+void m68k_op_eor_32_d(void);
+void m68k_op_eor_32_ai(void);
+void m68k_op_eor_32_pi(void);
+void m68k_op_eor_32_pd(void);
+void m68k_op_eor_32_di(void);
+void m68k_op_eor_32_ix(void);
+void m68k_op_eor_32_aw(void);
+void m68k_op_eor_32_al(void);
+void m68k_op_eori_8_d(void);
+void m68k_op_eori_8_ai(void);
+void m68k_op_eori_8_pi(void);
+void m68k_op_eori_8_pi7(void);
+void m68k_op_eori_8_pd(void);
+void m68k_op_eori_8_pd7(void);
+void m68k_op_eori_8_di(void);
+void m68k_op_eori_8_ix(void);
+void m68k_op_eori_8_aw(void);
+void m68k_op_eori_8_al(void);
+void m68k_op_eori_16_d(void);
+void m68k_op_eori_16_ai(void);
+void m68k_op_eori_16_pi(void);
+void m68k_op_eori_16_pd(void);
+void m68k_op_eori_16_di(void);
+void m68k_op_eori_16_ix(void);
+void m68k_op_eori_16_aw(void);
+void m68k_op_eori_16_al(void);
+void m68k_op_eori_32_d(void);
+void m68k_op_eori_32_ai(void);
+void m68k_op_eori_32_pi(void);
+void m68k_op_eori_32_pd(void);
+void m68k_op_eori_32_di(void);
+void m68k_op_eori_32_ix(void);
+void m68k_op_eori_32_aw(void);
+void m68k_op_eori_32_al(void);
+void m68k_op_eori_16_toc(void);
+void m68k_op_eori_16_tos(void);
+void m68k_op_exg_32_dd(void);
+void m68k_op_exg_32_aa(void);
+void m68k_op_exg_32_da(void);
+void m68k_op_ext_16(void);
+void m68k_op_ext_32(void);
+void m68k_op_extb_32(void);
+void m68k_op_illegal(void);
+void m68k_op_jmp_32_ai(void);
+void m68k_op_jmp_32_di(void);
+void m68k_op_jmp_32_ix(void);
+void m68k_op_jmp_32_aw(void);
+void m68k_op_jmp_32_al(void);
+void m68k_op_jmp_32_pcdi(void);
+void m68k_op_jmp_32_pcix(void);
+void m68k_op_jsr_32_ai(void);
+void m68k_op_jsr_32_di(void);
+void m68k_op_jsr_32_ix(void);
+void m68k_op_jsr_32_aw(void);
+void m68k_op_jsr_32_al(void);
+void m68k_op_jsr_32_pcdi(void);
+void m68k_op_jsr_32_pcix(void);
+void m68k_op_lea_32_ai(void);
+void m68k_op_lea_32_di(void);
+void m68k_op_lea_32_ix(void);
+void m68k_op_lea_32_aw(void);
+void m68k_op_lea_32_al(void);
+void m68k_op_lea_32_pcdi(void);
+void m68k_op_lea_32_pcix(void);
+void m68k_op_link_16_a7(void);
+void m68k_op_link_16(void);
+void m68k_op_link_32_a7(void);
+void m68k_op_link_32(void);
+void m68k_op_lsr_8_s(void);
+void m68k_op_lsr_16_s(void);
+void m68k_op_lsr_32_s(void);
+void m68k_op_lsr_8_r(void);
+void m68k_op_lsr_16_r(void);
+void m68k_op_lsr_32_r(void);
+void m68k_op_lsr_16_ai(void);
+void m68k_op_lsr_16_pi(void);
+void m68k_op_lsr_16_pd(void);
+void m68k_op_lsr_16_di(void);
+void m68k_op_lsr_16_ix(void);
+void m68k_op_lsr_16_aw(void);
+void m68k_op_lsr_16_al(void);
+void m68k_op_lsl_8_s(void);
+void m68k_op_lsl_16_s(void);
+void m68k_op_lsl_32_s(void);
+void m68k_op_lsl_8_r(void);
+void m68k_op_lsl_16_r(void);
+void m68k_op_lsl_32_r(void);
+void m68k_op_lsl_16_ai(void);
+void m68k_op_lsl_16_pi(void);
+void m68k_op_lsl_16_pd(void);
+void m68k_op_lsl_16_di(void);
+void m68k_op_lsl_16_ix(void);
+void m68k_op_lsl_16_aw(void);
+void m68k_op_lsl_16_al(void);
+void m68k_op_move_8_d_d(void);
+void m68k_op_move_8_d_ai(void);
+void m68k_op_move_8_d_pi(void);
+void m68k_op_move_8_d_pi7(void);
+void m68k_op_move_8_d_pd(void);
+void m68k_op_move_8_d_pd7(void);
+void m68k_op_move_8_d_di(void);
+void m68k_op_move_8_d_ix(void);
+void m68k_op_move_8_d_aw(void);
+void m68k_op_move_8_d_al(void);
+void m68k_op_move_8_d_pcdi(void);
+void m68k_op_move_8_d_pcix(void);
+void m68k_op_move_8_d_i(void);
+void m68k_op_move_8_ai_d(void);
+void m68k_op_move_8_ai_ai(void);
+void m68k_op_move_8_ai_pi(void);
+void m68k_op_move_8_ai_pi7(void);
+void m68k_op_move_8_ai_pd(void);
+void m68k_op_move_8_ai_pd7(void);
+void m68k_op_move_8_ai_di(void);
+void m68k_op_move_8_ai_ix(void);
+void m68k_op_move_8_ai_aw(void);
+void m68k_op_move_8_ai_al(void);
+void m68k_op_move_8_ai_pcdi(void);
+void m68k_op_move_8_ai_pcix(void);
+void m68k_op_move_8_ai_i(void);
+void m68k_op_move_8_pi7_d(void);
+void m68k_op_move_8_pi_d(void);
+void m68k_op_move_8_pi7_ai(void);
+void m68k_op_move_8_pi7_pi(void);
+void m68k_op_move_8_pi7_pi7(void);
+void m68k_op_move_8_pi7_pd(void);
+void m68k_op_move_8_pi7_pd7(void);
+void m68k_op_move_8_pi7_di(void);
+void m68k_op_move_8_pi7_ix(void);
+void m68k_op_move_8_pi7_aw(void);
+void m68k_op_move_8_pi7_al(void);
+void m68k_op_move_8_pi7_pcdi(void);
+void m68k_op_move_8_pi7_pcix(void);
+void m68k_op_move_8_pi7_i(void);
+void m68k_op_move_8_pi_ai(void);
+void m68k_op_move_8_pi_pi(void);
+void m68k_op_move_8_pi_pi7(void);
+void m68k_op_move_8_pi_pd(void);
+void m68k_op_move_8_pi_pd7(void);
+void m68k_op_move_8_pi_di(void);
+void m68k_op_move_8_pi_ix(void);
+void m68k_op_move_8_pi_aw(void);
+void m68k_op_move_8_pi_al(void);
+void m68k_op_move_8_pi_pcdi(void);
+void m68k_op_move_8_pi_pcix(void);
+void m68k_op_move_8_pi_i(void);
+void m68k_op_move_8_pd7_d(void);
+void m68k_op_move_8_pd_d(void);
+void m68k_op_move_8_pd7_ai(void);
+void m68k_op_move_8_pd7_pi(void);
+void m68k_op_move_8_pd7_pi7(void);
+void m68k_op_move_8_pd7_pd(void);
+void m68k_op_move_8_pd7_pd7(void);
+void m68k_op_move_8_pd7_di(void);
+void m68k_op_move_8_pd7_ix(void);
+void m68k_op_move_8_pd7_aw(void);
+void m68k_op_move_8_pd7_al(void);
+void m68k_op_move_8_pd7_pcdi(void);
+void m68k_op_move_8_pd7_pcix(void);
+void m68k_op_move_8_pd7_i(void);
+void m68k_op_move_8_pd_ai(void);
+void m68k_op_move_8_pd_pi(void);
+void m68k_op_move_8_pd_pi7(void);
+void m68k_op_move_8_pd_pd(void);
+void m68k_op_move_8_pd_pd7(void);
+void m68k_op_move_8_pd_di(void);
+void m68k_op_move_8_pd_ix(void);
+void m68k_op_move_8_pd_aw(void);
+void m68k_op_move_8_pd_al(void);
+void m68k_op_move_8_pd_pcdi(void);
+void m68k_op_move_8_pd_pcix(void);
+void m68k_op_move_8_pd_i(void);
+void m68k_op_move_8_di_d(void);
+void m68k_op_move_8_di_ai(void);
+void m68k_op_move_8_di_pi(void);
+void m68k_op_move_8_di_pi7(void);
+void m68k_op_move_8_di_pd(void);
+void m68k_op_move_8_di_pd7(void);
+void m68k_op_move_8_di_di(void);
+void m68k_op_move_8_di_ix(void);
+void m68k_op_move_8_di_aw(void);
+void m68k_op_move_8_di_al(void);
+void m68k_op_move_8_di_pcdi(void);
+void m68k_op_move_8_di_pcix(void);
+void m68k_op_move_8_di_i(void);
+void m68k_op_move_8_ix_d(void);
+void m68k_op_move_8_ix_ai(void);
+void m68k_op_move_8_ix_pi(void);
+void m68k_op_move_8_ix_pi7(void);
+void m68k_op_move_8_ix_pd(void);
+void m68k_op_move_8_ix_pd7(void);
+void m68k_op_move_8_ix_di(void);
+void m68k_op_move_8_ix_ix(void);
+void m68k_op_move_8_ix_aw(void);
+void m68k_op_move_8_ix_al(void);
+void m68k_op_move_8_ix_pcdi(void);
+void m68k_op_move_8_ix_pcix(void);
+void m68k_op_move_8_ix_i(void);
+void m68k_op_move_8_aw_d(void);
+void m68k_op_move_8_aw_ai(void);
+void m68k_op_move_8_aw_pi(void);
+void m68k_op_move_8_aw_pi7(void);
+void m68k_op_move_8_aw_pd(void);
+void m68k_op_move_8_aw_pd7(void);
+void m68k_op_move_8_aw_di(void);
+void m68k_op_move_8_aw_ix(void);
+void m68k_op_move_8_aw_aw(void);
+void m68k_op_move_8_aw_al(void);
+void m68k_op_move_8_aw_pcdi(void);
+void m68k_op_move_8_aw_pcix(void);
+void m68k_op_move_8_aw_i(void);
+void m68k_op_move_8_al_d(void);
+void m68k_op_move_8_al_ai(void);
+void m68k_op_move_8_al_pi(void);
+void m68k_op_move_8_al_pi7(void);
+void m68k_op_move_8_al_pd(void);
+void m68k_op_move_8_al_pd7(void);
+void m68k_op_move_8_al_di(void);
+void m68k_op_move_8_al_ix(void);
+void m68k_op_move_8_al_aw(void);
+void m68k_op_move_8_al_al(void);
+void m68k_op_move_8_al_pcdi(void);
+void m68k_op_move_8_al_pcix(void);
+void m68k_op_move_8_al_i(void);
+void m68k_op_move_16_d_d(void);
+void m68k_op_move_16_d_a(void);
+void m68k_op_move_16_d_ai(void);
+void m68k_op_move_16_d_pi(void);
+void m68k_op_move_16_d_pd(void);
+void m68k_op_move_16_d_di(void);
+void m68k_op_move_16_d_ix(void);
+void m68k_op_move_16_d_aw(void);
+void m68k_op_move_16_d_al(void);
+void m68k_op_move_16_d_pcdi(void);
+void m68k_op_move_16_d_pcix(void);
+void m68k_op_move_16_d_i(void);
+void m68k_op_move_16_ai_d(void);
+void m68k_op_move_16_ai_a(void);
+void m68k_op_move_16_ai_ai(void);
+void m68k_op_move_16_ai_pi(void);
+void m68k_op_move_16_ai_pd(void);
+void m68k_op_move_16_ai_di(void);
+void m68k_op_move_16_ai_ix(void);
+void m68k_op_move_16_ai_aw(void);
+void m68k_op_move_16_ai_al(void);
+void m68k_op_move_16_ai_pcdi(void);
+void m68k_op_move_16_ai_pcix(void);
+void m68k_op_move_16_ai_i(void);
+void m68k_op_move_16_pi_d(void);
+void m68k_op_move_16_pi_a(void);
+void m68k_op_move_16_pi_ai(void);
+void m68k_op_move_16_pi_pi(void);
+void m68k_op_move_16_pi_pd(void);
+void m68k_op_move_16_pi_di(void);
+void m68k_op_move_16_pi_ix(void);
+void m68k_op_move_16_pi_aw(void);
+void m68k_op_move_16_pi_al(void);
+void m68k_op_move_16_pi_pcdi(void);
+void m68k_op_move_16_pi_pcix(void);
+void m68k_op_move_16_pi_i(void);
+void m68k_op_move_16_pd_d(void);
+void m68k_op_move_16_pd_a(void);
+void m68k_op_move_16_pd_ai(void);
+void m68k_op_move_16_pd_pi(void);
+void m68k_op_move_16_pd_pd(void);
+void m68k_op_move_16_pd_di(void);
+void m68k_op_move_16_pd_ix(void);
+void m68k_op_move_16_pd_aw(void);
+void m68k_op_move_16_pd_al(void);
+void m68k_op_move_16_pd_pcdi(void);
+void m68k_op_move_16_pd_pcix(void);
+void m68k_op_move_16_pd_i(void);
+void m68k_op_move_16_di_d(void);
+void m68k_op_move_16_di_a(void);
+void m68k_op_move_16_di_ai(void);
+void m68k_op_move_16_di_pi(void);
+void m68k_op_move_16_di_pd(void);
+void m68k_op_move_16_di_di(void);
+void m68k_op_move_16_di_ix(void);
+void m68k_op_move_16_di_aw(void);
+void m68k_op_move_16_di_al(void);
+void m68k_op_move_16_di_pcdi(void);
+void m68k_op_move_16_di_pcix(void);
+void m68k_op_move_16_di_i(void);
+void m68k_op_move_16_ix_d(void);
+void m68k_op_move_16_ix_a(void);
+void m68k_op_move_16_ix_ai(void);
+void m68k_op_move_16_ix_pi(void);
+void m68k_op_move_16_ix_pd(void);
+void m68k_op_move_16_ix_di(void);
+void m68k_op_move_16_ix_ix(void);
+void m68k_op_move_16_ix_aw(void);
+void m68k_op_move_16_ix_al(void);
+void m68k_op_move_16_ix_pcdi(void);
+void m68k_op_move_16_ix_pcix(void);
+void m68k_op_move_16_ix_i(void);
+void m68k_op_move_16_aw_d(void);
+void m68k_op_move_16_aw_a(void);
+void m68k_op_move_16_aw_ai(void);
+void m68k_op_move_16_aw_pi(void);
+void m68k_op_move_16_aw_pd(void);
+void m68k_op_move_16_aw_di(void);
+void m68k_op_move_16_aw_ix(void);
+void m68k_op_move_16_aw_aw(void);
+void m68k_op_move_16_aw_al(void);
+void m68k_op_move_16_aw_pcdi(void);
+void m68k_op_move_16_aw_pcix(void);
+void m68k_op_move_16_aw_i(void);
+void m68k_op_move_16_al_d(void);
+void m68k_op_move_16_al_a(void);
+void m68k_op_move_16_al_ai(void);
+void m68k_op_move_16_al_pi(void);
+void m68k_op_move_16_al_pd(void);
+void m68k_op_move_16_al_di(void);
+void m68k_op_move_16_al_ix(void);
+void m68k_op_move_16_al_aw(void);
+void m68k_op_move_16_al_al(void);
+void m68k_op_move_16_al_pcdi(void);
+void m68k_op_move_16_al_pcix(void);
+void m68k_op_move_16_al_i(void);
+void m68k_op_move_32_d_d(void);
+void m68k_op_move_32_d_a(void);
+void m68k_op_move_32_d_ai(void);
+void m68k_op_move_32_d_pi(void);
+void m68k_op_move_32_d_pd(void);
+void m68k_op_move_32_d_di(void);
+void m68k_op_move_32_d_ix(void);
+void m68k_op_move_32_d_aw(void);
+void m68k_op_move_32_d_al(void);
+void m68k_op_move_32_d_pcdi(void);
+void m68k_op_move_32_d_pcix(void);
+void m68k_op_move_32_d_i(void);
+void m68k_op_move_32_ai_d(void);
+void m68k_op_move_32_ai_a(void);
+void m68k_op_move_32_ai_ai(void);
+void m68k_op_move_32_ai_pi(void);
+void m68k_op_move_32_ai_pd(void);
+void m68k_op_move_32_ai_di(void);
+void m68k_op_move_32_ai_ix(void);
+void m68k_op_move_32_ai_aw(void);
+void m68k_op_move_32_ai_al(void);
+void m68k_op_move_32_ai_pcdi(void);
+void m68k_op_move_32_ai_pcix(void);
+void m68k_op_move_32_ai_i(void);
+void m68k_op_move_32_pi_d(void);
+void m68k_op_move_32_pi_a(void);
+void m68k_op_move_32_pi_ai(void);
+void m68k_op_move_32_pi_pi(void);
+void m68k_op_move_32_pi_pd(void);
+void m68k_op_move_32_pi_di(void);
+void m68k_op_move_32_pi_ix(void);
+void m68k_op_move_32_pi_aw(void);
+void m68k_op_move_32_pi_al(void);
+void m68k_op_move_32_pi_pcdi(void);
+void m68k_op_move_32_pi_pcix(void);
+void m68k_op_move_32_pi_i(void);
+void m68k_op_move_32_pd_d(void);
+void m68k_op_move_32_pd_a(void);
+void m68k_op_move_32_pd_ai(void);
+void m68k_op_move_32_pd_pi(void);
+void m68k_op_move_32_pd_pd(void);
+void m68k_op_move_32_pd_di(void);
+void m68k_op_move_32_pd_ix(void);
+void m68k_op_move_32_pd_aw(void);
+void m68k_op_move_32_pd_al(void);
+void m68k_op_move_32_pd_pcdi(void);
+void m68k_op_move_32_pd_pcix(void);
+void m68k_op_move_32_pd_i(void);
+void m68k_op_move_32_di_d(void);
+void m68k_op_move_32_di_a(void);
+void m68k_op_move_32_di_ai(void);
+void m68k_op_move_32_di_pi(void);
+void m68k_op_move_32_di_pd(void);
+void m68k_op_move_32_di_di(void);
+void m68k_op_move_32_di_ix(void);
+void m68k_op_move_32_di_aw(void);
+void m68k_op_move_32_di_al(void);
+void m68k_op_move_32_di_pcdi(void);
+void m68k_op_move_32_di_pcix(void);
+void m68k_op_move_32_di_i(void);
+void m68k_op_move_32_ix_d(void);
+void m68k_op_move_32_ix_a(void);
+void m68k_op_move_32_ix_ai(void);
+void m68k_op_move_32_ix_pi(void);
+void m68k_op_move_32_ix_pd(void);
+void m68k_op_move_32_ix_di(void);
+void m68k_op_move_32_ix_ix(void);
+void m68k_op_move_32_ix_aw(void);
+void m68k_op_move_32_ix_al(void);
+void m68k_op_move_32_ix_pcdi(void);
+void m68k_op_move_32_ix_pcix(void);
+void m68k_op_move_32_ix_i(void);
+void m68k_op_move_32_aw_d(void);
+void m68k_op_move_32_aw_a(void);
+void m68k_op_move_32_aw_ai(void);
+void m68k_op_move_32_aw_pi(void);
+void m68k_op_move_32_aw_pd(void);
+void m68k_op_move_32_aw_di(void);
+void m68k_op_move_32_aw_ix(void);
+void m68k_op_move_32_aw_aw(void);
+void m68k_op_move_32_aw_al(void);
+void m68k_op_move_32_aw_pcdi(void);
+void m68k_op_move_32_aw_pcix(void);
+void m68k_op_move_32_aw_i(void);
+void m68k_op_move_32_al_d(void);
+void m68k_op_move_32_al_a(void);
+void m68k_op_move_32_al_ai(void);
+void m68k_op_move_32_al_pi(void);
+void m68k_op_move_32_al_pd(void);
+void m68k_op_move_32_al_di(void);
+void m68k_op_move_32_al_ix(void);
+void m68k_op_move_32_al_aw(void);
+void m68k_op_move_32_al_al(void);
+void m68k_op_move_32_al_pcdi(void);
+void m68k_op_move_32_al_pcix(void);
+void m68k_op_move_32_al_i(void);
+void m68k_op_movea_16_d(void);
+void m68k_op_movea_16_a(void);
+void m68k_op_movea_16_ai(void);
+void m68k_op_movea_16_pi(void);
+void m68k_op_movea_16_pd(void);
+void m68k_op_movea_16_di(void);
+void m68k_op_movea_16_ix(void);
+void m68k_op_movea_16_aw(void);
+void m68k_op_movea_16_al(void);
+void m68k_op_movea_16_pcdi(void);
+void m68k_op_movea_16_pcix(void);
+void m68k_op_movea_16_i(void);
+void m68k_op_movea_32_d(void);
+void m68k_op_movea_32_a(void);
+void m68k_op_movea_32_ai(void);
+void m68k_op_movea_32_pi(void);
+void m68k_op_movea_32_pd(void);
+void m68k_op_movea_32_di(void);
+void m68k_op_movea_32_ix(void);
+void m68k_op_movea_32_aw(void);
+void m68k_op_movea_32_al(void);
+void m68k_op_movea_32_pcdi(void);
+void m68k_op_movea_32_pcix(void);
+void m68k_op_movea_32_i(void);
+void m68k_op_move_16_frc_d(void);
+void m68k_op_move_16_frc_ai(void);
+void m68k_op_move_16_frc_pi(void);
+void m68k_op_move_16_frc_pd(void);
+void m68k_op_move_16_frc_di(void);
+void m68k_op_move_16_frc_ix(void);
+void m68k_op_move_16_frc_aw(void);
+void m68k_op_move_16_frc_al(void);
+void m68k_op_move_16_toc_d(void);
+void m68k_op_move_16_toc_ai(void);
+void m68k_op_move_16_toc_pi(void);
+void m68k_op_move_16_toc_pd(void);
+void m68k_op_move_16_toc_di(void);
+void m68k_op_move_16_toc_ix(void);
+void m68k_op_move_16_toc_aw(void);
+void m68k_op_move_16_toc_al(void);
+void m68k_op_move_16_toc_pcdi(void);
+void m68k_op_move_16_toc_pcix(void);
+void m68k_op_move_16_toc_i(void);
+void m68k_op_move_16_frs_d(void);
+void m68k_op_move_16_frs_ai(void);
+void m68k_op_move_16_frs_pi(void);
+void m68k_op_move_16_frs_pd(void);
+void m68k_op_move_16_frs_di(void);
+void m68k_op_move_16_frs_ix(void);
+void m68k_op_move_16_frs_aw(void);
+void m68k_op_move_16_frs_al(void);
+void m68k_op_move_16_tos_d(void);
+void m68k_op_move_16_tos_ai(void);
+void m68k_op_move_16_tos_pi(void);
+void m68k_op_move_16_tos_pd(void);
+void m68k_op_move_16_tos_di(void);
+void m68k_op_move_16_tos_ix(void);
+void m68k_op_move_16_tos_aw(void);
+void m68k_op_move_16_tos_al(void);
+void m68k_op_move_16_tos_pcdi(void);
+void m68k_op_move_16_tos_pcix(void);
+void m68k_op_move_16_tos_i(void);
+void m68k_op_move_32_fru(void);
+void m68k_op_move_32_tou(void);
+void m68k_op_movec_32_cr(void);
+void m68k_op_movec_32_rc(void);
+void m68k_op_movem_16_re_pd(void);
+void m68k_op_movem_16_re_ai(void);
+void m68k_op_movem_16_re_di(void);
+void m68k_op_movem_16_re_ix(void);
+void m68k_op_movem_16_re_aw(void);
+void m68k_op_movem_16_re_al(void);
+void m68k_op_movem_32_re_pd(void);
+void m68k_op_movem_32_re_ai(void);
+void m68k_op_movem_32_re_di(void);
+void m68k_op_movem_32_re_ix(void);
+void m68k_op_movem_32_re_aw(void);
+void m68k_op_movem_32_re_al(void);
+void m68k_op_movem_16_er_pi(void);
+void m68k_op_movem_16_er_pcdi(void);
+void m68k_op_movem_16_er_pcix(void);
+void m68k_op_movem_16_er_ai(void);
+void m68k_op_movem_16_er_di(void);
+void m68k_op_movem_16_er_ix(void);
+void m68k_op_movem_16_er_aw(void);
+void m68k_op_movem_16_er_al(void);
+void m68k_op_movem_32_er_pi(void);
+void m68k_op_movem_32_er_pcdi(void);
+void m68k_op_movem_32_er_pcix(void);
+void m68k_op_movem_32_er_ai(void);
+void m68k_op_movem_32_er_di(void);
+void m68k_op_movem_32_er_ix(void);
+void m68k_op_movem_32_er_aw(void);
+void m68k_op_movem_32_er_al(void);
+void m68k_op_movep_16_re(void);
+void m68k_op_movep_32_re(void);
+void m68k_op_movep_16_er(void);
+void m68k_op_movep_32_er(void);
+void m68k_op_moves_8_ai(void);
+void m68k_op_moves_8_pi(void);
+void m68k_op_moves_8_pi7(void);
+void m68k_op_moves_8_pd(void);
+void m68k_op_moves_8_pd7(void);
+void m68k_op_moves_8_di(void);
+void m68k_op_moves_8_ix(void);
+void m68k_op_moves_8_aw(void);
+void m68k_op_moves_8_al(void);
+void m68k_op_moves_16_ai(void);
+void m68k_op_moves_16_pi(void);
+void m68k_op_moves_16_pd(void);
+void m68k_op_moves_16_di(void);
+void m68k_op_moves_16_ix(void);
+void m68k_op_moves_16_aw(void);
+void m68k_op_moves_16_al(void);
+void m68k_op_moves_32_ai(void);
+void m68k_op_moves_32_pi(void);
+void m68k_op_moves_32_pd(void);
+void m68k_op_moves_32_di(void);
+void m68k_op_moves_32_ix(void);
+void m68k_op_moves_32_aw(void);
+void m68k_op_moves_32_al(void);
+void m68k_op_moveq_32(void);
+void m68k_op_muls_16_d(void);
+void m68k_op_muls_16_ai(void);
+void m68k_op_muls_16_pi(void);
+void m68k_op_muls_16_pd(void);
+void m68k_op_muls_16_di(void);
+void m68k_op_muls_16_ix(void);
+void m68k_op_muls_16_aw(void);
+void m68k_op_muls_16_al(void);
+void m68k_op_muls_16_pcdi(void);
+void m68k_op_muls_16_pcix(void);
+void m68k_op_muls_16_i(void);
+void m68k_op_mulu_16_d(void);
+void m68k_op_mulu_16_ai(void);
+void m68k_op_mulu_16_pi(void);
+void m68k_op_mulu_16_pd(void);
+void m68k_op_mulu_16_di(void);
+void m68k_op_mulu_16_ix(void);
+void m68k_op_mulu_16_aw(void);
+void m68k_op_mulu_16_al(void);
+void m68k_op_mulu_16_pcdi(void);
+void m68k_op_mulu_16_pcix(void);
+void m68k_op_mulu_16_i(void);
+void m68k_op_mull_32_d(void);
+void m68k_op_mull_32_ai(void);
+void m68k_op_mull_32_pi(void);
+void m68k_op_mull_32_pd(void);
+void m68k_op_mull_32_di(void);
+void m68k_op_mull_32_ix(void);
+void m68k_op_mull_32_aw(void);
+void m68k_op_mull_32_al(void);
+void m68k_op_mull_32_pcdi(void);
+void m68k_op_mull_32_pcix(void);
+void m68k_op_mull_32_i(void);
+void m68k_op_nbcd_8_d(void);
+void m68k_op_nbcd_8_ai(void);
+void m68k_op_nbcd_8_pi(void);
+void m68k_op_nbcd_8_pi7(void);
+void m68k_op_nbcd_8_pd(void);
+void m68k_op_nbcd_8_pd7(void);
+void m68k_op_nbcd_8_di(void);
+void m68k_op_nbcd_8_ix(void);
+void m68k_op_nbcd_8_aw(void);
+void m68k_op_nbcd_8_al(void);
+void m68k_op_neg_8_d(void);
+void m68k_op_neg_8_ai(void);
+void m68k_op_neg_8_pi(void);
+void m68k_op_neg_8_pi7(void);
+void m68k_op_neg_8_pd(void);
+void m68k_op_neg_8_pd7(void);
+void m68k_op_neg_8_di(void);
+void m68k_op_neg_8_ix(void);
+void m68k_op_neg_8_aw(void);
+void m68k_op_neg_8_al(void);
+void m68k_op_neg_16_d(void);
+void m68k_op_neg_16_ai(void);
+void m68k_op_neg_16_pi(void);
+void m68k_op_neg_16_pd(void);
+void m68k_op_neg_16_di(void);
+void m68k_op_neg_16_ix(void);
+void m68k_op_neg_16_aw(void);
+void m68k_op_neg_16_al(void);
+void m68k_op_neg_32_d(void);
+void m68k_op_neg_32_ai(void);
+void m68k_op_neg_32_pi(void);
+void m68k_op_neg_32_pd(void);
+void m68k_op_neg_32_di(void);
+void m68k_op_neg_32_ix(void);
+void m68k_op_neg_32_aw(void);
+void m68k_op_neg_32_al(void);
+void m68k_op_negx_8_d(void);
+void m68k_op_negx_8_ai(void);
+void m68k_op_negx_8_pi(void);
+void m68k_op_negx_8_pi7(void);
+void m68k_op_negx_8_pd(void);
+void m68k_op_negx_8_pd7(void);
+void m68k_op_negx_8_di(void);
+void m68k_op_negx_8_ix(void);
+void m68k_op_negx_8_aw(void);
+void m68k_op_negx_8_al(void);
+void m68k_op_negx_16_d(void);
+void m68k_op_negx_16_ai(void);
+void m68k_op_negx_16_pi(void);
+void m68k_op_negx_16_pd(void);
+void m68k_op_negx_16_di(void);
+void m68k_op_negx_16_ix(void);
+void m68k_op_negx_16_aw(void);
+void m68k_op_negx_16_al(void);
+void m68k_op_negx_32_d(void);
+void m68k_op_negx_32_ai(void);
+void m68k_op_negx_32_pi(void);
+void m68k_op_negx_32_pd(void);
+void m68k_op_negx_32_di(void);
+void m68k_op_negx_32_ix(void);
+void m68k_op_negx_32_aw(void);
+void m68k_op_negx_32_al(void);
+void m68k_op_nop(void);
+void m68k_op_not_8_d(void);
+void m68k_op_not_8_ai(void);
+void m68k_op_not_8_pi(void);
+void m68k_op_not_8_pi7(void);
+void m68k_op_not_8_pd(void);
+void m68k_op_not_8_pd7(void);
+void m68k_op_not_8_di(void);
+void m68k_op_not_8_ix(void);
+void m68k_op_not_8_aw(void);
+void m68k_op_not_8_al(void);
+void m68k_op_not_16_d(void);
+void m68k_op_not_16_ai(void);
+void m68k_op_not_16_pi(void);
+void m68k_op_not_16_pd(void);
+void m68k_op_not_16_di(void);
+void m68k_op_not_16_ix(void);
+void m68k_op_not_16_aw(void);
+void m68k_op_not_16_al(void);
+void m68k_op_not_32_d(void);
+void m68k_op_not_32_ai(void);
+void m68k_op_not_32_pi(void);
+void m68k_op_not_32_pd(void);
+void m68k_op_not_32_di(void);
+void m68k_op_not_32_ix(void);
+void m68k_op_not_32_aw(void);
+void m68k_op_not_32_al(void);
+void m68k_op_or_8_er_d(void);
+void m68k_op_or_8_er_ai(void);
+void m68k_op_or_8_er_pi(void);
+void m68k_op_or_8_er_pi7(void);
+void m68k_op_or_8_er_pd(void);
+void m68k_op_or_8_er_pd7(void);
+void m68k_op_or_8_er_di(void);
+void m68k_op_or_8_er_ix(void);
+void m68k_op_or_8_er_aw(void);
+void m68k_op_or_8_er_al(void);
+void m68k_op_or_8_er_pcdi(void);
+void m68k_op_or_8_er_pcix(void);
+void m68k_op_or_8_er_i(void);
+void m68k_op_or_16_er_d(void);
+void m68k_op_or_16_er_ai(void);
+void m68k_op_or_16_er_pi(void);
+void m68k_op_or_16_er_pd(void);
+void m68k_op_or_16_er_di(void);
+void m68k_op_or_16_er_ix(void);
+void m68k_op_or_16_er_aw(void);
+void m68k_op_or_16_er_al(void);
+void m68k_op_or_16_er_pcdi(void);
+void m68k_op_or_16_er_pcix(void);
+void m68k_op_or_16_er_i(void);
+void m68k_op_or_32_er_d(void);
+void m68k_op_or_32_er_ai(void);
+void m68k_op_or_32_er_pi(void);
+void m68k_op_or_32_er_pd(void);
+void m68k_op_or_32_er_di(void);
+void m68k_op_or_32_er_ix(void);
+void m68k_op_or_32_er_aw(void);
+void m68k_op_or_32_er_al(void);
+void m68k_op_or_32_er_pcdi(void);
+void m68k_op_or_32_er_pcix(void);
+void m68k_op_or_32_er_i(void);
+void m68k_op_or_8_re_ai(void);
+void m68k_op_or_8_re_pi(void);
+void m68k_op_or_8_re_pi7(void);
+void m68k_op_or_8_re_pd(void);
+void m68k_op_or_8_re_pd7(void);
+void m68k_op_or_8_re_di(void);
+void m68k_op_or_8_re_ix(void);
+void m68k_op_or_8_re_aw(void);
+void m68k_op_or_8_re_al(void);
+void m68k_op_or_16_re_ai(void);
+void m68k_op_or_16_re_pi(void);
+void m68k_op_or_16_re_pd(void);
+void m68k_op_or_16_re_di(void);
+void m68k_op_or_16_re_ix(void);
+void m68k_op_or_16_re_aw(void);
+void m68k_op_or_16_re_al(void);
+void m68k_op_or_32_re_ai(void);
+void m68k_op_or_32_re_pi(void);
+void m68k_op_or_32_re_pd(void);
+void m68k_op_or_32_re_di(void);
+void m68k_op_or_32_re_ix(void);
+void m68k_op_or_32_re_aw(void);
+void m68k_op_or_32_re_al(void);
+void m68k_op_ori_8_d(void);
+void m68k_op_ori_8_ai(void);
+void m68k_op_ori_8_pi(void);
+void m68k_op_ori_8_pi7(void);
+void m68k_op_ori_8_pd(void);
+void m68k_op_ori_8_pd7(void);
+void m68k_op_ori_8_di(void);
+void m68k_op_ori_8_ix(void);
+void m68k_op_ori_8_aw(void);
+void m68k_op_ori_8_al(void);
+void m68k_op_ori_16_d(void);
+void m68k_op_ori_16_ai(void);
+void m68k_op_ori_16_pi(void);
+void m68k_op_ori_16_pd(void);
+void m68k_op_ori_16_di(void);
+void m68k_op_ori_16_ix(void);
+void m68k_op_ori_16_aw(void);
+void m68k_op_ori_16_al(void);
+void m68k_op_ori_32_d(void);
+void m68k_op_ori_32_ai(void);
+void m68k_op_ori_32_pi(void);
+void m68k_op_ori_32_pd(void);
+void m68k_op_ori_32_di(void);
+void m68k_op_ori_32_ix(void);
+void m68k_op_ori_32_aw(void);
+void m68k_op_ori_32_al(void);
+void m68k_op_ori_16_toc(void);
+void m68k_op_ori_16_tos(void);
+void m68k_op_pack_16_rr(void);
+void m68k_op_pack_16_mm_ax7(void);
+void m68k_op_pack_16_mm_ay7(void);
+void m68k_op_pack_16_mm_axy7(void);
+void m68k_op_pack_16_mm(void);
+void m68k_op_pea_32_ai(void);
+void m68k_op_pea_32_di(void);
+void m68k_op_pea_32_ix(void);
+void m68k_op_pea_32_aw(void);
+void m68k_op_pea_32_al(void);
+void m68k_op_pea_32_pcdi(void);
+void m68k_op_pea_32_pcix(void);
+void m68k_op_reset(void);
+void m68k_op_ror_8_s(void);
+void m68k_op_ror_16_s(void);
+void m68k_op_ror_32_s(void);
+void m68k_op_ror_8_r(void);
+void m68k_op_ror_16_r(void);
+void m68k_op_ror_32_r(void);
+void m68k_op_ror_16_ai(void);
+void m68k_op_ror_16_pi(void);
+void m68k_op_ror_16_pd(void);
+void m68k_op_ror_16_di(void);
+void m68k_op_ror_16_ix(void);
+void m68k_op_ror_16_aw(void);
+void m68k_op_ror_16_al(void);
+void m68k_op_rol_8_s(void);
+void m68k_op_rol_16_s(void);
+void m68k_op_rol_32_s(void);
+void m68k_op_rol_8_r(void);
+void m68k_op_rol_16_r(void);
+void m68k_op_rol_32_r(void);
+void m68k_op_rol_16_ai(void);
+void m68k_op_rol_16_pi(void);
+void m68k_op_rol_16_pd(void);
+void m68k_op_rol_16_di(void);
+void m68k_op_rol_16_ix(void);
+void m68k_op_rol_16_aw(void);
+void m68k_op_rol_16_al(void);
+void m68k_op_roxr_8_s(void);
+void m68k_op_roxr_16_s(void);
+void m68k_op_roxr_32_s(void);
+void m68k_op_roxr_8_r(void);
+void m68k_op_roxr_16_r(void);
+void m68k_op_roxr_32_r(void);
+void m68k_op_roxr_16_ai(void);
+void m68k_op_roxr_16_pi(void);
+void m68k_op_roxr_16_pd(void);
+void m68k_op_roxr_16_di(void);
+void m68k_op_roxr_16_ix(void);
+void m68k_op_roxr_16_aw(void);
+void m68k_op_roxr_16_al(void);
+void m68k_op_roxl_8_s(void);
+void m68k_op_roxl_16_s(void);
+void m68k_op_roxl_32_s(void);
+void m68k_op_roxl_8_r(void);
+void m68k_op_roxl_16_r(void);
+void m68k_op_roxl_32_r(void);
+void m68k_op_roxl_16_ai(void);
+void m68k_op_roxl_16_pi(void);
+void m68k_op_roxl_16_pd(void);
+void m68k_op_roxl_16_di(void);
+void m68k_op_roxl_16_ix(void);
+void m68k_op_roxl_16_aw(void);
+void m68k_op_roxl_16_al(void);
+void m68k_op_rtd_32(void);
+void m68k_op_rte_32(void);
+void m68k_op_rtm_32(void);
+void m68k_op_rtr_32(void);
+void m68k_op_rts_32(void);
+void m68k_op_sbcd_8_rr(void);
+void m68k_op_sbcd_8_mm_ax7(void);
+void m68k_op_sbcd_8_mm_ay7(void);
+void m68k_op_sbcd_8_mm_axy7(void);
+void m68k_op_sbcd_8_mm(void);
+void m68k_op_st_8_d(void);
+void m68k_op_st_8_ai(void);
+void m68k_op_st_8_pi(void);
+void m68k_op_st_8_pi7(void);
+void m68k_op_st_8_pd(void);
+void m68k_op_st_8_pd7(void);
+void m68k_op_st_8_di(void);
+void m68k_op_st_8_ix(void);
+void m68k_op_st_8_aw(void);
+void m68k_op_st_8_al(void);
+void m68k_op_sf_8_d(void);
+void m68k_op_sf_8_ai(void);
+void m68k_op_sf_8_pi(void);
+void m68k_op_sf_8_pi7(void);
+void m68k_op_sf_8_pd(void);
+void m68k_op_sf_8_pd7(void);
+void m68k_op_sf_8_di(void);
+void m68k_op_sf_8_ix(void);
+void m68k_op_sf_8_aw(void);
+void m68k_op_sf_8_al(void);
+void m68k_op_shi_8_d(void);
+void m68k_op_sls_8_d(void);
+void m68k_op_scc_8_d(void);
+void m68k_op_scs_8_d(void);
+void m68k_op_sne_8_d(void);
+void m68k_op_seq_8_d(void);
+void m68k_op_svc_8_d(void);
+void m68k_op_svs_8_d(void);
+void m68k_op_spl_8_d(void);
+void m68k_op_smi_8_d(void);
+void m68k_op_sge_8_d(void);
+void m68k_op_slt_8_d(void);
+void m68k_op_sgt_8_d(void);
+void m68k_op_sle_8_d(void);
+void m68k_op_shi_8_ai(void);
+void m68k_op_shi_8_pi(void);
+void m68k_op_shi_8_pi7(void);
+void m68k_op_shi_8_pd(void);
+void m68k_op_shi_8_pd7(void);
+void m68k_op_shi_8_di(void);
+void m68k_op_shi_8_ix(void);
+void m68k_op_shi_8_aw(void);
+void m68k_op_shi_8_al(void);
+void m68k_op_sls_8_ai(void);
+void m68k_op_sls_8_pi(void);
+void m68k_op_sls_8_pi7(void);
+void m68k_op_sls_8_pd(void);
+void m68k_op_sls_8_pd7(void);
+void m68k_op_sls_8_di(void);
+void m68k_op_sls_8_ix(void);
+void m68k_op_sls_8_aw(void);
+void m68k_op_sls_8_al(void);
+void m68k_op_scc_8_ai(void);
+void m68k_op_scc_8_pi(void);
+void m68k_op_scc_8_pi7(void);
+void m68k_op_scc_8_pd(void);
+void m68k_op_scc_8_pd7(void);
+void m68k_op_scc_8_di(void);
+void m68k_op_scc_8_ix(void);
+void m68k_op_scc_8_aw(void);
+void m68k_op_scc_8_al(void);
+void m68k_op_scs_8_ai(void);
+void m68k_op_scs_8_pi(void);
+void m68k_op_scs_8_pi7(void);
+void m68k_op_scs_8_pd(void);
+void m68k_op_scs_8_pd7(void);
+void m68k_op_scs_8_di(void);
+void m68k_op_scs_8_ix(void);
+void m68k_op_scs_8_aw(void);
+void m68k_op_scs_8_al(void);
+void m68k_op_sne_8_ai(void);
+void m68k_op_sne_8_pi(void);
+void m68k_op_sne_8_pi7(void);
+void m68k_op_sne_8_pd(void);
+void m68k_op_sne_8_pd7(void);
+void m68k_op_sne_8_di(void);
+void m68k_op_sne_8_ix(void);
+void m68k_op_sne_8_aw(void);
+void m68k_op_sne_8_al(void);
+void m68k_op_seq_8_ai(void);
+void m68k_op_seq_8_pi(void);
+void m68k_op_seq_8_pi7(void);
+void m68k_op_seq_8_pd(void);
+void m68k_op_seq_8_pd7(void);
+void m68k_op_seq_8_di(void);
+void m68k_op_seq_8_ix(void);
+void m68k_op_seq_8_aw(void);
+void m68k_op_seq_8_al(void);
+void m68k_op_svc_8_ai(void);
+void m68k_op_svc_8_pi(void);
+void m68k_op_svc_8_pi7(void);
+void m68k_op_svc_8_pd(void);
+void m68k_op_svc_8_pd7(void);
+void m68k_op_svc_8_di(void);
+void m68k_op_svc_8_ix(void);
+void m68k_op_svc_8_aw(void);
+void m68k_op_svc_8_al(void);
+void m68k_op_svs_8_ai(void);
+void m68k_op_svs_8_pi(void);
+void m68k_op_svs_8_pi7(void);
+void m68k_op_svs_8_pd(void);
+void m68k_op_svs_8_pd7(void);
+void m68k_op_svs_8_di(void);
+void m68k_op_svs_8_ix(void);
+void m68k_op_svs_8_aw(void);
+void m68k_op_svs_8_al(void);
+void m68k_op_spl_8_ai(void);
+void m68k_op_spl_8_pi(void);
+void m68k_op_spl_8_pi7(void);
+void m68k_op_spl_8_pd(void);
+void m68k_op_spl_8_pd7(void);
+void m68k_op_spl_8_di(void);
+void m68k_op_spl_8_ix(void);
+void m68k_op_spl_8_aw(void);
+void m68k_op_spl_8_al(void);
+void m68k_op_smi_8_ai(void);
+void m68k_op_smi_8_pi(void);
+void m68k_op_smi_8_pi7(void);
+void m68k_op_smi_8_pd(void);
+void m68k_op_smi_8_pd7(void);
+void m68k_op_smi_8_di(void);
+void m68k_op_smi_8_ix(void);
+void m68k_op_smi_8_aw(void);
+void m68k_op_smi_8_al(void);
+void m68k_op_sge_8_ai(void);
+void m68k_op_sge_8_pi(void);
+void m68k_op_sge_8_pi7(void);
+void m68k_op_sge_8_pd(void);
+void m68k_op_sge_8_pd7(void);
+void m68k_op_sge_8_di(void);
+void m68k_op_sge_8_ix(void);
+void m68k_op_sge_8_aw(void);
+void m68k_op_sge_8_al(void);
+void m68k_op_slt_8_ai(void);
+void m68k_op_slt_8_pi(void);
+void m68k_op_slt_8_pi7(void);
+void m68k_op_slt_8_pd(void);
+void m68k_op_slt_8_pd7(void);
+void m68k_op_slt_8_di(void);
+void m68k_op_slt_8_ix(void);
+void m68k_op_slt_8_aw(void);
+void m68k_op_slt_8_al(void);
+void m68k_op_sgt_8_ai(void);
+void m68k_op_sgt_8_pi(void);
+void m68k_op_sgt_8_pi7(void);
+void m68k_op_sgt_8_pd(void);
+void m68k_op_sgt_8_pd7(void);
+void m68k_op_sgt_8_di(void);
+void m68k_op_sgt_8_ix(void);
+void m68k_op_sgt_8_aw(void);
+void m68k_op_sgt_8_al(void);
+void m68k_op_sle_8_ai(void);
+void m68k_op_sle_8_pi(void);
+void m68k_op_sle_8_pi7(void);
+void m68k_op_sle_8_pd(void);
+void m68k_op_sle_8_pd7(void);
+void m68k_op_sle_8_di(void);
+void m68k_op_sle_8_ix(void);
+void m68k_op_sle_8_aw(void);
+void m68k_op_sle_8_al(void);
+void m68k_op_stop(void);
+void m68k_op_sub_8_er_d(void);
+void m68k_op_sub_8_er_ai(void);
+void m68k_op_sub_8_er_pi(void);
+void m68k_op_sub_8_er_pi7(void);
+void m68k_op_sub_8_er_pd(void);
+void m68k_op_sub_8_er_pd7(void);
+void m68k_op_sub_8_er_di(void);
+void m68k_op_sub_8_er_ix(void);
+void m68k_op_sub_8_er_aw(void);
+void m68k_op_sub_8_er_al(void);
+void m68k_op_sub_8_er_pcdi(void);
+void m68k_op_sub_8_er_pcix(void);
+void m68k_op_sub_8_er_i(void);
+void m68k_op_sub_16_er_d(void);
+void m68k_op_sub_16_er_a(void);
+void m68k_op_sub_16_er_ai(void);
+void m68k_op_sub_16_er_pi(void);
+void m68k_op_sub_16_er_pd(void);
+void m68k_op_sub_16_er_di(void);
+void m68k_op_sub_16_er_ix(void);
+void m68k_op_sub_16_er_aw(void);
+void m68k_op_sub_16_er_al(void);
+void m68k_op_sub_16_er_pcdi(void);
+void m68k_op_sub_16_er_pcix(void);
+void m68k_op_sub_16_er_i(void);
+void m68k_op_sub_32_er_d(void);
+void m68k_op_sub_32_er_a(void);
+void m68k_op_sub_32_er_ai(void);
+void m68k_op_sub_32_er_pi(void);
+void m68k_op_sub_32_er_pd(void);
+void m68k_op_sub_32_er_di(void);
+void m68k_op_sub_32_er_ix(void);
+void m68k_op_sub_32_er_aw(void);
+void m68k_op_sub_32_er_al(void);
+void m68k_op_sub_32_er_pcdi(void);
+void m68k_op_sub_32_er_pcix(void);
+void m68k_op_sub_32_er_i(void);
+void m68k_op_sub_8_re_ai(void);
+void m68k_op_sub_8_re_pi(void);
+void m68k_op_sub_8_re_pi7(void);
+void m68k_op_sub_8_re_pd(void);
+void m68k_op_sub_8_re_pd7(void);
+void m68k_op_sub_8_re_di(void);
+void m68k_op_sub_8_re_ix(void);
+void m68k_op_sub_8_re_aw(void);
+void m68k_op_sub_8_re_al(void);
+void m68k_op_sub_16_re_ai(void);
+void m68k_op_sub_16_re_pi(void);
+void m68k_op_sub_16_re_pd(void);
+void m68k_op_sub_16_re_di(void);
+void m68k_op_sub_16_re_ix(void);
+void m68k_op_sub_16_re_aw(void);
+void m68k_op_sub_16_re_al(void);
+void m68k_op_sub_32_re_ai(void);
+void m68k_op_sub_32_re_pi(void);
+void m68k_op_sub_32_re_pd(void);
+void m68k_op_sub_32_re_di(void);
+void m68k_op_sub_32_re_ix(void);
+void m68k_op_sub_32_re_aw(void);
+void m68k_op_sub_32_re_al(void);
+void m68k_op_suba_16_d(void);
+void m68k_op_suba_16_a(void);
+void m68k_op_suba_16_ai(void);
+void m68k_op_suba_16_pi(void);
+void m68k_op_suba_16_pd(void);
+void m68k_op_suba_16_di(void);
+void m68k_op_suba_16_ix(void);
+void m68k_op_suba_16_aw(void);
+void m68k_op_suba_16_al(void);
+void m68k_op_suba_16_pcdi(void);
+void m68k_op_suba_16_pcix(void);
+void m68k_op_suba_16_i(void);
+void m68k_op_suba_32_d(void);
+void m68k_op_suba_32_a(void);
+void m68k_op_suba_32_ai(void);
+void m68k_op_suba_32_pi(void);
+void m68k_op_suba_32_pd(void);
+void m68k_op_suba_32_di(void);
+void m68k_op_suba_32_ix(void);
+void m68k_op_suba_32_aw(void);
+void m68k_op_suba_32_al(void);
+void m68k_op_suba_32_pcdi(void);
+void m68k_op_suba_32_pcix(void);
+void m68k_op_suba_32_i(void);
+void m68k_op_subi_8_d(void);
+void m68k_op_subi_8_ai(void);
+void m68k_op_subi_8_pi(void);
+void m68k_op_subi_8_pi7(void);
+void m68k_op_subi_8_pd(void);
+void m68k_op_subi_8_pd7(void);
+void m68k_op_subi_8_di(void);
+void m68k_op_subi_8_ix(void);
+void m68k_op_subi_8_aw(void);
+void m68k_op_subi_8_al(void);
+void m68k_op_subi_16_d(void);
+void m68k_op_subi_16_ai(void);
+void m68k_op_subi_16_pi(void);
+void m68k_op_subi_16_pd(void);
+void m68k_op_subi_16_di(void);
+void m68k_op_subi_16_ix(void);
+void m68k_op_subi_16_aw(void);
+void m68k_op_subi_16_al(void);
+void m68k_op_subi_32_d(void);
+void m68k_op_subi_32_ai(void);
+void m68k_op_subi_32_pi(void);
+void m68k_op_subi_32_pd(void);
+void m68k_op_subi_32_di(void);
+void m68k_op_subi_32_ix(void);
+void m68k_op_subi_32_aw(void);
+void m68k_op_subi_32_al(void);
+void m68k_op_subq_8_d(void);
+void m68k_op_subq_8_ai(void);
+void m68k_op_subq_8_pi(void);
+void m68k_op_subq_8_pi7(void);
+void m68k_op_subq_8_pd(void);
+void m68k_op_subq_8_pd7(void);
+void m68k_op_subq_8_di(void);
+void m68k_op_subq_8_ix(void);
+void m68k_op_subq_8_aw(void);
+void m68k_op_subq_8_al(void);
+void m68k_op_subq_16_d(void);
+void m68k_op_subq_16_a(void);
+void m68k_op_subq_16_ai(void);
+void m68k_op_subq_16_pi(void);
+void m68k_op_subq_16_pd(void);
+void m68k_op_subq_16_di(void);
+void m68k_op_subq_16_ix(void);
+void m68k_op_subq_16_aw(void);
+void m68k_op_subq_16_al(void);
+void m68k_op_subq_32_d(void);
+void m68k_op_subq_32_a(void);
+void m68k_op_subq_32_ai(void);
+void m68k_op_subq_32_pi(void);
+void m68k_op_subq_32_pd(void);
+void m68k_op_subq_32_di(void);
+void m68k_op_subq_32_ix(void);
+void m68k_op_subq_32_aw(void);
+void m68k_op_subq_32_al(void);
+void m68k_op_subx_8_rr(void);
+void m68k_op_subx_16_rr(void);
+void m68k_op_subx_32_rr(void);
+void m68k_op_subx_8_mm_ax7(void);
+void m68k_op_subx_8_mm_ay7(void);
+void m68k_op_subx_8_mm_axy7(void);
+void m68k_op_subx_8_mm(void);
+void m68k_op_subx_16_mm(void);
+void m68k_op_subx_32_mm(void);
+void m68k_op_swap_32(void);
+void m68k_op_tas_8_d(void);
+void m68k_op_tas_8_ai(void);
+void m68k_op_tas_8_pi(void);
+void m68k_op_tas_8_pi7(void);
+void m68k_op_tas_8_pd(void);
+void m68k_op_tas_8_pd7(void);
+void m68k_op_tas_8_di(void);
+void m68k_op_tas_8_ix(void);
+void m68k_op_tas_8_aw(void);
+void m68k_op_tas_8_al(void);
+void m68k_op_trap(void);
+void m68k_op_trapt(void);
+void m68k_op_trapt_16(void);
+void m68k_op_trapt_32(void);
+void m68k_op_trapf(void);
+void m68k_op_trapf_16(void);
+void m68k_op_trapf_32(void);
+void m68k_op_traphi(void);
+void m68k_op_trapls(void);
+void m68k_op_trapcc(void);
+void m68k_op_trapcs(void);
+void m68k_op_trapne(void);
+void m68k_op_trapeq(void);
+void m68k_op_trapvc(void);
+void m68k_op_trapvs(void);
+void m68k_op_trappl(void);
+void m68k_op_trapmi(void);
+void m68k_op_trapge(void);
+void m68k_op_traplt(void);
+void m68k_op_trapgt(void);
+void m68k_op_traple(void);
+void m68k_op_traphi_16(void);
+void m68k_op_trapls_16(void);
+void m68k_op_trapcc_16(void);
+void m68k_op_trapcs_16(void);
+void m68k_op_trapne_16(void);
+void m68k_op_trapeq_16(void);
+void m68k_op_trapvc_16(void);
+void m68k_op_trapvs_16(void);
+void m68k_op_trappl_16(void);
+void m68k_op_trapmi_16(void);
+void m68k_op_trapge_16(void);
+void m68k_op_traplt_16(void);
+void m68k_op_trapgt_16(void);
+void m68k_op_traple_16(void);
+void m68k_op_traphi_32(void);
+void m68k_op_trapls_32(void);
+void m68k_op_trapcc_32(void);
+void m68k_op_trapcs_32(void);
+void m68k_op_trapne_32(void);
+void m68k_op_trapeq_32(void);
+void m68k_op_trapvc_32(void);
+void m68k_op_trapvs_32(void);
+void m68k_op_trappl_32(void);
+void m68k_op_trapmi_32(void);
+void m68k_op_trapge_32(void);
+void m68k_op_traplt_32(void);
+void m68k_op_trapgt_32(void);
+void m68k_op_traple_32(void);
+void m68k_op_trapv(void);
+void m68k_op_tst_8_d(void);
+void m68k_op_tst_8_ai(void);
+void m68k_op_tst_8_pi(void);
+void m68k_op_tst_8_pi7(void);
+void m68k_op_tst_8_pd(void);
+void m68k_op_tst_8_pd7(void);
+void m68k_op_tst_8_di(void);
+void m68k_op_tst_8_ix(void);
+void m68k_op_tst_8_aw(void);
+void m68k_op_tst_8_al(void);
+void m68k_op_tst_8_pcdi(void);
+void m68k_op_tst_8_pcix(void);
+void m68k_op_tst_8_i(void);
+void m68k_op_tst_16_d(void);
+void m68k_op_tst_16_a(void);
+void m68k_op_tst_16_ai(void);
+void m68k_op_tst_16_pi(void);
+void m68k_op_tst_16_pd(void);
+void m68k_op_tst_16_di(void);
+void m68k_op_tst_16_ix(void);
+void m68k_op_tst_16_aw(void);
+void m68k_op_tst_16_al(void);
+void m68k_op_tst_16_pcdi(void);
+void m68k_op_tst_16_pcix(void);
+void m68k_op_tst_16_i(void);
+void m68k_op_tst_32_d(void);
+void m68k_op_tst_32_a(void);
+void m68k_op_tst_32_ai(void);
+void m68k_op_tst_32_pi(void);
+void m68k_op_tst_32_pd(void);
+void m68k_op_tst_32_di(void);
+void m68k_op_tst_32_ix(void);
+void m68k_op_tst_32_aw(void);
+void m68k_op_tst_32_al(void);
+void m68k_op_tst_32_pcdi(void);
+void m68k_op_tst_32_pcix(void);
+void m68k_op_tst_32_i(void);
+void m68k_op_unlk_32_a7(void);
+void m68k_op_unlk_32(void);
+void m68k_op_unpk_16_rr(void);
+void m68k_op_unpk_16_mm_ax7(void);
+void m68k_op_unpk_16_mm_ay7(void);
+void m68k_op_unpk_16_mm_axy7(void);
+void m68k_op_unpk_16_mm(void);
+/* Build the opcode handler table */
+void m68ki_build_opcode_table(void);
+
+extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */
+extern unsigned char m68ki_cycles[][0x10000];
+
+
+/* ======================================================================== */
+/* ============================== END OF FILE ============================= */
+/* ======================================================================== */
+
+#endif /* M68KOPS__HEADER */
+
+
diff --git a/plugins/ao/eng_ssf/sat_hw.c b/plugins/ao/eng_ssf/sat_hw.c
new file mode 100644
index 00000000..bc880549
--- /dev/null
+++ b/plugins/ao/eng_ssf/sat_hw.c
@@ -0,0 +1,170 @@
+/*
+ sat_hw.c - Saturn sound hardware glue/emulation/whatever
+
+ supported: main RAM (512 KB)
+ SCSP + timers
+ MC68000 CPU
+
+ Copyright (c) 2007, R. Belmont and Richard Bannister.
+
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ * Neither the names of R. Belmont and Richard Bannister nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#include <stdio.h>
+
+#include "ao.h"
+#include "scsp.h"
+#include "sat_hw.h"
+#include "m68k.h"
+
+uint8 sat_ram[512*1024];
+
+static void scsp_irq(int irq)
+{
+ if (irq > 0)
+ {
+ m68k_set_irq(irq);
+ }
+}
+
+#define MIXER_PAN_LEFT 1
+#define MIXER_PAN_RIGHT 2
+#define MIXER(level,pan) ((level & 0xff) | ((pan & 0x03) << 8))
+#define YM3012_VOL(LVol,LPan,RVol,RPan) (MIXER(LVol,LPan)|(MIXER(RVol,RPan) << 16))
+
+static struct SCSPinterface scsp_interface =
+{
+ 1,
+ { sat_ram, },
+ { YM3012_VOL(100, MIXER_PAN_LEFT, 100, MIXER_PAN_RIGHT) },
+ { scsp_irq, },
+};
+
+void sat_hw_init(void)
+{
+ m68k_init();
+ m68k_set_cpu_type(M68K_CPU_TYPE_68000);
+ m68k_pulse_reset();
+
+ scsp_interface.region[0] = sat_ram;
+ scsp_start(&scsp_interface);
+}
+
+/* M68k memory handlers */
+
+unsigned int m68k_read_memory_8(unsigned int address)
+{
+ if (address < (512*1024))
+ return sat_ram[address^1];
+
+ if (address >= 0x100000 && address < 0x100c00)
+ {
+ int foo = SCSP_0_r((address - 0x100000)/2, 0);
+
+ if (address & 1)
+ return foo & 0xff;
+ else
+ return foo>>8;
+ }
+
+ printf("R8 @ %x\n", address);
+ return 0;
+}
+
+unsigned int m68k_read_memory_16(unsigned int address)
+{
+ if (address < (512*1024))
+ {
+ return mem_readword_swap((unsigned short *)(sat_ram+address));
+ }
+
+ if (address >= 0x100000 && address < 0x100c00)
+ return SCSP_0_r((address-0x100000)/2, 0);
+
+ printf("R16 @ %x\n", address);
+ return 0;
+}
+
+unsigned int m68k_read_memory_32(unsigned int address)
+{
+ if (address < 0x80000)
+ {
+ return sat_ram[address+2] | sat_ram[address+3]<<8 | sat_ram[address]<<16 | sat_ram[address+1]<<24;
+ }
+
+ printf("R32 @ %x\n", address);
+ return 0;
+}
+
+void m68k_write_memory_8(unsigned int address, unsigned int data)
+{
+ if (address < 0x80000)
+ {
+ sat_ram[address^1] = data;
+ return;
+ }
+
+ if (address >= 0x100000 && address < 0x100c00)
+ {
+ address -= 0x100000;
+ if (address & 1)
+ SCSP_0_w(address>>1, data, 0xff00);
+ else
+ SCSP_0_w(address>>1, data<<8, 0x00ff);
+ return;
+ }
+}
+
+void m68k_write_memory_16(unsigned int address, unsigned int data)
+{
+ if (address < 0x80000)
+ {
+ sat_ram[address+1] = (data>>8)&0xff;
+ sat_ram[address] = data&0xff;
+ return;
+ }
+
+ if (address >= 0x100000 && address < 0x100c00)
+ {
+ SCSP_0_w((address-0x100000)>>1, data, 0x0000);
+ return;
+ }
+}
+
+void m68k_write_memory_32(unsigned int address, unsigned int data)
+{
+ if (address < 0x80000)
+ {
+ sat_ram[address+1] = (data>>24)&0xff;
+ sat_ram[address] = (data>>16)&0xff;
+ sat_ram[address+3] = (data>>8)&0xff;
+ sat_ram[address+2] = data&0xff;
+ return;
+ }
+
+ if (address >= 0x100000 && address < 0x100c00)
+ {
+ address -= 0x100000;
+ SCSP_0_w(address>>1, data>>16, 0x0000);
+ SCSP_0_w((address>>1)+1, data&0xffff, 0x0000);
+ return;
+ }
+}
diff --git a/plugins/ao/eng_ssf/sat_hw.h b/plugins/ao/eng_ssf/sat_hw.h
new file mode 100644
index 00000000..1f275842
--- /dev/null
+++ b/plugins/ao/eng_ssf/sat_hw.h
@@ -0,0 +1,35 @@
+#ifndef _SAT_HW_H_
+#define _SAT_HW_H_
+
+extern uint8 sat_ram[512*1024];
+
+void sat_hw_init(void);
+
+#if !LSB_FIRST
+static unsigned short INLINE mem_readword_swap(unsigned short *addr)
+{
+ return ((*addr&0x00ff)<<8)|((*addr&0xff00)>>8);
+}
+
+static void INLINE mem_writeword_swap(unsigned short *addr, unsigned short value)
+{
+ *addr = ((value&0x00ff)<<8)|((value&0xff00)>>8);
+}
+#else // big endian
+static unsigned short INLINE mem_readword_swap(unsigned short *addr)
+{
+ unsigned long retval;
+
+ retval = *addr;
+
+ return retval;
+}
+
+static void INLINE mem_writeword_swap(unsigned short *addr, unsigned short value)
+{
+ *addr = value;
+}
+#endif
+
+
+#endif
diff --git a/plugins/ao/eng_ssf/scsp.c b/plugins/ao/eng_ssf/scsp.c
new file mode 100644
index 00000000..a4ed2d6a
--- /dev/null
+++ b/plugins/ao/eng_ssf/scsp.c
@@ -0,0 +1,1268 @@
+/*
+ Sega/Yamaha YMF292-F (SCSP = Saturn Custom Sound Processor) emulation
+ By ElSemi
+ MAME/M1 conversion and cleanup by R. Belmont
+ Additional code and bugfixes by kingshriek
+
+ This chip has 32 voices. Each voice can play a sample or be part of
+ an FM construct. Unlike traditional Yamaha FM chips, the base waveform
+ for the FM still comes from the wavetable RAM.
+
+ ChangeLog:
+ * November 25, 2003 (ES) Fixed buggy timers and envelope overflows.
+ (RB) Improved sample rates other than 44100, multiple
+ chips now works properly.
+ * December 02, 2003 (ES) Added DISDL register support, improves mix.
+ * April 28, 2004 (ES) Corrected envelope rates, added key-rate scaling,
+ added ringbuffer support.
+ * January 8, 2005 (RB) Added ability to specify region offset for RAM.
+ * January 26, 2007 (ES) Added on-board DSP capability
+ * December 16, 2007 (kingshriek) Many EG bug fixes, implemented effects mixer,
+ implemented FM.
+*/
+
+#include <math.h>
+#include <string.h>
+#include "ao.h"
+#include "cpuintrf.h"
+#include "scsp.h"
+#include "scspdsp.h"
+#include "sat_hw.h"
+
+#define ICLIP16(x) (x<-32768)?-32768:((x>32767)?32767:x)
+
+#define SHIFT 12
+#define FIX(v) ((UINT32) ((float) (1<<SHIFT)*(v)))
+
+
+#define EG_SHIFT 16
+#define FM_DELAY 0 // delay in number of slots processed before samples are written to the FM ring buffer
+
+// include the LFO handling code
+#include "scsplfo.c"
+
+/*
+ SCSP features 32 programmable slots
+ that can generate FM and PCM (from ROM/RAM) sound
+*/
+
+//SLOT PARAMETERS
+#define KEYONEX(slot) ((slot->udata.data[0x0]>>0x0)&0x1000)
+#define KEYONB(slot) ((slot->udata.data[0x0]>>0x0)&0x0800)
+#define SBCTL(slot) ((slot->udata.data[0x0]>>0x9)&0x0003)
+#define SSCTL(slot) ((slot->udata.data[0x0]>>0x7)&0x0003)
+#define LPCTL(slot) ((slot->udata.data[0x0]>>0x5)&0x0003)
+#define PCM8B(slot) ((slot->udata.data[0x0]>>0x0)&0x0010)
+
+#define SA(slot) (((slot->udata.data[0x0]&0xF)<<16)|(slot->udata.data[0x1]))
+
+#define LSA(slot) (slot->udata.data[0x2])
+
+#define LEA(slot) (slot->udata.data[0x3])
+
+#define D2R(slot) ((slot->udata.data[0x4]>>0xB)&0x001F)
+#define D1R(slot) ((slot->udata.data[0x4]>>0x6)&0x001F)
+#define EGHOLD(slot) ((slot->udata.data[0x4]>>0x0)&0x0020)
+#define AR(slot) ((slot->udata.data[0x4]>>0x0)&0x001F)
+
+#define LPSLNK(slot) ((slot->udata.data[0x5]>>0x0)&0x4000)
+#define KRS(slot) ((slot->udata.data[0x5]>>0xA)&0x000F)
+#define DL(slot) ((slot->udata.data[0x5]>>0x5)&0x001F)
+#define RR(slot) ((slot->udata.data[0x5]>>0x0)&0x001F)
+
+#define STWINH(slot) ((slot->udata.data[0x6]>>0x0)&0x0200)
+#define SDIR(slot) ((slot->udata.data[0x6]>>0x0)&0x0100)
+#define TL(slot) ((slot->udata.data[0x6]>>0x0)&0x00FF)
+
+#define MDL(slot) ((slot->udata.data[0x7]>>0xC)&0x000F)
+#define MDXSL(slot) ((slot->udata.data[0x7]>>0x6)&0x003F)
+#define MDYSL(slot) ((slot->udata.data[0x7]>>0x0)&0x003F)
+
+#define OCT(slot) ((slot->udata.data[0x8]>>0xB)&0x000F)
+#define FNS(slot) ((slot->udata.data[0x8]>>0x0)&0x03FF)
+
+#define LFORE(slot) ((slot->udata.data[0x9]>>0x0)&0x8000)
+#define LFOF(slot) ((slot->udata.data[0x9]>>0xA)&0x001F)
+#define PLFOWS(slot) ((slot->udata.data[0x9]>>0x8)&0x0003)
+#define PLFOS(slot) ((slot->udata.data[0x9]>>0x5)&0x0007)
+#define ALFOWS(slot) ((slot->udata.data[0x9]>>0x3)&0x0003)
+#define ALFOS(slot) ((slot->udata.data[0x9]>>0x0)&0x0007)
+
+#define ISEL(slot) ((slot->udata.data[0xA]>>0x3)&0x000F)
+#define IMXL(slot) ((slot->udata.data[0xA]>>0x0)&0x0007)
+
+#define DISDL(slot) ((slot->udata.data[0xB]>>0xD)&0x0007)
+#define DIPAN(slot) ((slot->udata.data[0xB]>>0x8)&0x001F)
+#define EFSDL(slot) ((slot->udata.data[0xB]>>0x5)&0x0007)
+#define EFPAN(slot) ((slot->udata.data[0xB]>>0x0)&0x001F)
+
+//Envelope times in ms
+static const double ARTimes[64]={100000/*infinity*/,100000/*infinity*/,8100.0,6900.0,6000.0,4800.0,4000.0,3400.0,3000.0,2400.0,2000.0,1700.0,1500.0,
+ 1200.0,1000.0,860.0,760.0,600.0,500.0,430.0,380.0,300.0,250.0,220.0,190.0,150.0,130.0,110.0,95.0,
+ 76.0,63.0,55.0,47.0,38.0,31.0,27.0,24.0,19.0,15.0,13.0,12.0,9.4,7.9,6.8,6.0,4.7,3.8,3.4,3.0,2.4,
+ 2.0,1.8,1.6,1.3,1.1,0.93,0.85,0.65,0.53,0.44,0.40,0.35,0.0,0.0};
+static const double DRTimes[64]={100000/*infinity*/,100000/*infinity*/,118200.0,101300.0,88600.0,70900.0,59100.0,50700.0,44300.0,35500.0,29600.0,25300.0,22200.0,17700.0,
+ 14800.0,12700.0,11100.0,8900.0,7400.0,6300.0,5500.0,4400.0,3700.0,3200.0,2800.0,2200.0,1800.0,1600.0,1400.0,1100.0,
+ 920.0,790.0,690.0,550.0,460.0,390.0,340.0,270.0,230.0,200.0,170.0,140.0,110.0,98.0,85.0,68.0,57.0,49.0,43.0,34.0,
+ 28.0,25.0,22.0,18.0,14.0,12.0,11.0,8.5,7.1,6.1,5.4,4.3,3.6,3.1};
+static UINT32 FNS_Table[0x400];
+static INT32 EG_TABLE[0x400];
+
+typedef enum {ATTACK,DECAY1,DECAY2,RELEASE} _STATE;
+struct _EG
+{
+ int volume; //
+ _STATE state;
+ int step;
+ //step vals
+ int AR; //Attack
+ int D1R; //Decay1
+ int D2R; //Decay2
+ int RR; //Release
+
+ int DL; //Decay level
+ UINT8 EGHOLD;
+ UINT8 LPLINK;
+};
+
+struct _SLOT
+{
+ union
+ {
+ UINT16 data[0x10]; //only 0x1a bytes used
+ UINT8 datab[0x20];
+ } udata;
+ UINT8 active; //this slot is currently playing
+ UINT8 *base; //samples base address
+ UINT32 cur_addr; //current play address (24.8)
+ UINT32 nxt_addr; //next play address
+ UINT32 step; //pitch step (24.8)
+ UINT8 Backwards; //the wave is playing backwards
+ struct _EG EG; //Envelope
+ struct _LFO PLFO; //Phase LFO
+ struct _LFO ALFO; //Amplitude LFO
+ int slot;
+ signed short Prev; //Previous sample (for interpolation)
+};
+
+
+#define MEM4B(scsp) ((scsp->udata.data[0]>>0x0)&0x0200)
+#define DAC18B(scsp) ((scsp->udata.data[0]>>0x0)&0x0100)
+#define MVOL(scsp) ((scsp->udata.data[0]>>0x0)&0x000F)
+#define RBL(scsp) ((scsp->udata.data[1]>>0x7)&0x0003)
+#define RBP(scsp) ((scsp->udata.data[1]>>0x0)&0x003F)
+#define MOFULL(scsp) ((scsp->udata.data[2]>>0x0)&0x1000)
+#define MOEMPTY(scsp) ((scsp->udata.data[2]>>0x0)&0x0800)
+#define MIOVF(scsp) ((scsp->udata.data[2]>>0x0)&0x0400)
+#define MIFULL(scsp) ((scsp->udata.data[2]>>0x0)&0x0200)
+#define MIEMPTY(scsp) ((scsp->udata.data[2]>>0x0)&0x0100)
+
+#define SCILV0(scsp) ((scsp->udata.data[0x24/2]>>0x0)&0xff)
+#define SCILV1(scsp) ((scsp->udata.data[0x26/2]>>0x0)&0xff)
+#define SCILV2(scsp) ((scsp->udata.data[0x28/2]>>0x0)&0xff)
+
+#define SCIEX0 0
+#define SCIEX1 1
+#define SCIEX2 2
+#define SCIMID 3
+#define SCIDMA 4
+#define SCIIRQ 5
+#define SCITMA 6
+#define SCITMB 7
+
+#define USEDSP
+
+struct _SCSP
+{
+ union
+ {
+ UINT16 data[0x30/2];
+ UINT8 datab[0x30];
+ } udata;
+ struct _SLOT Slots[32];
+ signed short RINGBUF[64];
+ unsigned char BUFPTR;
+#if FM_DELAY
+ signed short DELAYBUF[FM_DELAY];
+ unsigned char DELAYPTR;
+#endif
+ unsigned char *SCSPRAM;
+ UINT32 SCSPRAM_LENGTH;
+ char Master;
+ void (*Int68kCB)(int irq);
+
+ INT32 *buffertmpl, *buffertmpr;
+
+ UINT32 IrqTimA;
+ UINT32 IrqTimBC;
+ UINT32 IrqMidi;
+
+ UINT8 MidiOutW,MidiOutR;
+ UINT8 MidiStack[16];
+ UINT8 MidiW,MidiR;
+
+ int LPANTABLE[0x10000];
+ int RPANTABLE[0x10000];
+
+ int TimPris[3];
+ int TimCnt[3];
+
+ // DMA stuff
+ UINT32 scsp_dmea;
+ UINT16 scsp_drga;
+ UINT16 scsp_dtlg;
+
+ int ARTABLE[64], DRTABLE[64];
+
+ struct _SCSPDSP DSP;
+};
+
+static struct _SCSP *AllocedSCSP;
+
+static void dma_scsp(struct _SCSP *SCSP); /*SCSP DMA transfer function*/
+#define scsp_dgate scsp_regs[0x16/2] & 0x4000
+#define scsp_ddir scsp_regs[0x16/2] & 0x2000
+#define scsp_dexe scsp_regs[0x16/2] & 0x1000
+#define dma_transfer_end ((scsp_regs[0x24/2] & 0x10)>>4)|(((scsp_regs[0x26/2] & 0x10)>>4)<<1)|(((scsp_regs[0x28/2] & 0x10)>>4)<<2)
+
+static const float SDLT[8]={-1000000.0,-36.0,-30.0,-24.0,-18.0,-12.0,-6.0,0.0};
+
+static INT16 *bufferl;
+static INT16 *bufferr;
+
+static int length;
+
+static signed short *RBUFDST; //this points to where the sample will be stored in the RingBuf
+
+static unsigned char DecodeSCI(struct _SCSP *SCSP,unsigned char irq)
+{
+ unsigned char SCI=0;
+ unsigned char v;
+ v=(SCILV0((SCSP))&(1<<irq))?1:0;
+ SCI|=v;
+ v=(SCILV1((SCSP))&(1<<irq))?1:0;
+ SCI|=v<<1;
+ v=(SCILV2((SCSP))&(1<<irq))?1:0;
+ SCI|=v<<2;
+ return SCI;
+}
+
+static void ResetInterrupts(struct _SCSP *SCSP)
+{
+ UINT32 reset = SCSP->udata.data[0x22/2];
+ if (reset & 0x40)
+ SCSP->Int68kCB(-SCSP->IrqTimA);
+ if (reset & 0x180)
+ SCSP->Int68kCB(-SCSP->IrqTimBC);
+}
+
+static void CheckPendingIRQ(struct _SCSP *SCSP)
+{
+ UINT32 pend=SCSP->udata.data[0x20/2];
+ UINT32 en=SCSP->udata.data[0x1e/2];
+ if(SCSP->MidiW!=SCSP->MidiR)
+ {
+ SCSP->Int68kCB(SCSP->IrqMidi);
+ return;
+ }
+ if(!pend)
+ return;
+ if(pend&0x40)
+ if(en&0x40)
+ {
+ SCSP->Int68kCB(SCSP->IrqTimA);
+ return;
+ }
+ if(pend&0x80)
+ if(en&0x80)
+ {
+ SCSP->Int68kCB(SCSP->IrqTimBC);
+ return;
+ }
+ if(pend&0x100)
+ if(en&0x100)
+ {
+ SCSP->Int68kCB(SCSP->IrqTimBC);
+ return;
+ }
+
+ SCSP->Int68kCB(0);
+}
+
+static int Get_AR(struct _SCSP *SCSP,int base,int R)
+{
+ int Rate=base+(R<<1);
+ if(Rate>63) Rate=63;
+ if(Rate<0) Rate=0;
+ return SCSP->ARTABLE[Rate];
+}
+
+static int Get_DR(struct _SCSP *SCSP,int base,int R)
+{
+ int Rate=base+(R<<1);
+ if(Rate>63) Rate=63;
+ if(Rate<0) Rate=0;
+ return SCSP->DRTABLE[Rate];
+}
+
+static int Get_RR(struct _SCSP *SCSP,int base,int R)
+{
+ int Rate=base+(R<<1);
+ if(Rate>63) Rate=63;
+ if(Rate<0) Rate=0;
+ return SCSP->DRTABLE[Rate];
+}
+
+static void Compute_EG(struct _SCSP *SCSP,struct _SLOT *slot)
+{
+ int octave=OCT(slot);
+ int rate;
+ if(octave&8) octave=octave-16;
+ if(KRS(slot)!=0xf)
+ rate=octave+2*KRS(slot)+((FNS(slot)>>9)&1);
+ else
+ rate=0; //rate=((FNS(slot)>>9)&1);
+
+ slot->EG.volume=0x17F<<EG_SHIFT;
+ slot->EG.AR=Get_AR(SCSP,rate,AR(slot));
+ slot->EG.D1R=Get_DR(SCSP,rate,D1R(slot));
+ slot->EG.D2R=Get_DR(SCSP,rate,D2R(slot));
+ slot->EG.RR=Get_RR(SCSP,rate,RR(slot));
+ slot->EG.DL=0x1f-DL(slot);
+ slot->EG.EGHOLD=EGHOLD(slot);
+}
+
+static void SCSP_StopSlot(struct _SLOT *slot,int keyoff);
+
+static int EG_Update(struct _SLOT *slot)
+{
+ switch(slot->EG.state)
+ {
+ case ATTACK:
+ slot->EG.volume+=slot->EG.AR;
+ if(slot->EG.volume>=(0x3ff<<EG_SHIFT))
+ {
+ if (!LPSLNK(slot))
+ {
+ slot->EG.state=DECAY1;
+ if(slot->EG.D1R>=(1024<<EG_SHIFT)) //Skip DECAY1, go directly to DECAY2
+ slot->EG.state=DECAY2;
+ }
+ slot->EG.volume=0x3ff<<EG_SHIFT;
+ }
+ if(slot->EG.EGHOLD)
+ return 0x3ff<<(SHIFT-10);
+ break;
+ case DECAY1:
+ slot->EG.volume-=slot->EG.D1R;
+ if(slot->EG.volume<=0)
+ slot->EG.volume=0;
+ if(slot->EG.volume>>(EG_SHIFT+5)<=slot->EG.DL)
+ slot->EG.state=DECAY2;
+ break;
+ case DECAY2:
+ if(D2R(slot)==0)
+ return (slot->EG.volume>>EG_SHIFT)<<(SHIFT-10);
+ slot->EG.volume-=slot->EG.D2R;
+ if(slot->EG.volume<=0)
+ slot->EG.volume=0;
+
+ break;
+ case RELEASE:
+ slot->EG.volume-=slot->EG.RR;
+ if(slot->EG.volume<=0)
+ {
+ slot->EG.volume=0;
+ SCSP_StopSlot(slot,0);
+ //slot->EG.volume=0x17F<<EG_SHIFT;
+ //slot->EG.state=ATTACK;
+ }
+ break;
+ default:
+ return 1<<SHIFT;
+ }
+ return (slot->EG.volume>>EG_SHIFT)<<(SHIFT-10);
+}
+
+static UINT32 SCSP_Step(struct _SLOT *slot)
+{
+ int octave=OCT(slot);
+ UINT64 Fn;
+
+ Fn=(FNS_Table[FNS(slot)]); //24.8
+ if(octave&8)
+ Fn>>=(16-octave);
+ else
+ Fn<<=octave;
+
+ return Fn/(44100);
+}
+
+
+static void Compute_LFO(struct _SLOT *slot)
+{
+ if(PLFOS(slot)!=0)
+ LFO_ComputeStep(&(slot->PLFO),LFOF(slot),PLFOWS(slot),PLFOS(slot),0);
+ if(ALFOS(slot)!=0)
+ LFO_ComputeStep(&(slot->ALFO),LFOF(slot),ALFOWS(slot),ALFOS(slot),1);
+}
+
+static void SCSP_StartSlot(struct _SCSP *SCSP, struct _SLOT *slot)
+{
+ UINT32 start_offset;
+ slot->active=1;
+ slot->Backwards=0;
+ slot->cur_addr=0; slot->nxt_addr=1<<SHIFT;
+ start_offset = PCM8B(slot) ? SA(slot) : SA(slot) & 0x7FFFE;
+ slot->base=SCSP->SCSPRAM + start_offset;
+ slot->step=SCSP_Step(slot);
+ Compute_EG(SCSP,slot);
+ slot->EG.state=ATTACK;
+ slot->EG.volume=0x17F<<EG_SHIFT;
+ slot->Prev=0;
+ Compute_LFO(slot);
+
+// printf("StartSlot: SA %x PCM8B %x LPCTL %x ALFOS %x STWINH %x TL %x EFSDL %x\n", SA(slot), PCM8B(slot), LPCTL(slot), ALFOS(slot), STWINH(slot), TL(slot), EFSDL(slot));
+// printf(" AR %x D1R %x D2R %x RR %x DL %x KRS %x EGHOLD %x LPSLNK %x\n", AR(slot), D1R(slot), D2R(slot), RR(slot), DL(slot), KRS(slot), EGHOLD(slot), LPSLNK(slot));
+}
+
+static void SCSP_StopSlot(struct _SLOT *slot,int keyoff)
+{
+ if(keyoff /*&& slot->EG.state!=RELEASE*/)
+ {
+ slot->EG.state=RELEASE;
+ }
+ else
+ {
+ slot->active=0;
+ }
+ slot->udata.data[0]&=~0x800;
+}
+
+#define log_base_2(n) (log((float) n)/log((float) 2))
+
+static void SCSP_Init(struct _SCSP *SCSP, const struct SCSPinterface *intf)
+{
+ int i=0;
+
+ SCSP->IrqTimA = SCSP->IrqTimBC = SCSP->IrqMidi = 0;
+ SCSP->MidiR=SCSP->MidiW=0;
+ SCSP->MidiOutR=SCSP->MidiOutW=0;
+
+ // get SCSP RAM
+ {
+ memset(SCSP,0,sizeof(*SCSP));
+
+ if (!i)
+ {
+ SCSP->Master=1;
+ }
+ else
+ {
+ SCSP->Master=0;
+ }
+
+ if (intf->region)
+ {
+ SCSP->SCSPRAM = &sat_ram[0]; //(unsigned char *)intf->region;
+ SCSP->SCSPRAM_LENGTH = 512*1024;
+ SCSP->DSP.SCSPRAM = (UINT16 *)SCSP->SCSPRAM;
+ SCSP->DSP.SCSPRAM_LENGTH = (512*1024)/2;
+// SCSP->SCSPRAM += intf->roffset;
+ }
+ }
+
+ for(i=0;i<0x400;++i)
+ {
+ float fcent=(double) 1200.0*log_base_2((double)(((double) 1024.0+(double)i)/(double)1024.0));
+ fcent=(double) 44100.0*pow(2.0,fcent/1200.0);
+ FNS_Table[i]=(float) (1<<SHIFT) *fcent;
+ }
+
+ for(i=0;i<0x400;++i)
+ {
+ float envDB=((float)(3*(i-0x3ff)))/32.0;
+ float scale=(float)(1<<SHIFT);
+ EG_TABLE[i]=(INT32)(pow(10.0,envDB/20.0)*scale);
+ }
+
+ for(i=0;i<0x10000;++i)
+ {
+ int iTL =(i>>0x0)&0xff;
+ int iPAN=(i>>0x8)&0x1f;
+ int iSDL=(i>>0xD)&0x07;
+ float TL=1.0;
+ float SegaDB=0;
+ float fSDL=1.0;
+ float PAN=1.0;
+ float LPAN,RPAN;
+
+ if(iTL&0x01) SegaDB-=0.4;
+ if(iTL&0x02) SegaDB-=0.8;
+ if(iTL&0x04) SegaDB-=1.5;
+ if(iTL&0x08) SegaDB-=3;
+ if(iTL&0x10) SegaDB-=6;
+ if(iTL&0x20) SegaDB-=12;
+ if(iTL&0x40) SegaDB-=24;
+ if(iTL&0x80) SegaDB-=48;
+
+ TL=pow(10.0,SegaDB/20.0);
+
+ SegaDB=0;
+ if(iPAN&0x1) SegaDB-=3;
+ if(iPAN&0x2) SegaDB-=6;
+ if(iPAN&0x4) SegaDB-=12;
+ if(iPAN&0x8) SegaDB-=24;
+
+ if((iPAN&0xf)==0xf) PAN=0.0;
+ else PAN=pow(10.0,SegaDB/20.0);
+
+ if(iPAN<0x10)
+ {
+ LPAN=PAN;
+ RPAN=1.0;
+ }
+ else
+ {
+ RPAN=PAN;
+ LPAN=1.0;
+ }
+
+ if(iSDL)
+ fSDL=pow(10.0,(SDLT[iSDL])/20.0);
+ else
+ fSDL=0.0;
+
+ SCSP->LPANTABLE[i]=FIX((4.0*LPAN*TL*fSDL));
+ SCSP->RPANTABLE[i]=FIX((4.0*RPAN*TL*fSDL));
+ }
+
+ SCSP->ARTABLE[0]=SCSP->DRTABLE[0]=0; //Infinite time
+ SCSP->ARTABLE[1]=SCSP->DRTABLE[1]=0; //Infinite time
+ for(i=2;i<64;++i)
+ {
+ double t,step,scale;
+ t=ARTimes[i]; //In ms
+ if(t!=0.0)
+ {
+ step=(1023*1000.0)/((float) 44100.0f*t);
+ scale=(double) (1<<EG_SHIFT);
+ SCSP->ARTABLE[i]=(int) (step*scale);
+ }
+ else
+ SCSP->ARTABLE[i]=1024<<EG_SHIFT;
+
+ t=DRTimes[i]; //In ms
+ step=(1023*1000.0)/((float) 44100.0f*t);
+ scale=(double) (1<<EG_SHIFT);
+ SCSP->DRTABLE[i]=(int) (step*scale);
+ }
+
+ // make sure all the slots are off
+ for(i=0;i<32;++i)
+ {
+ SCSP->Slots[i].slot=i;
+ SCSP->Slots[i].active=0;
+ SCSP->Slots[i].base=NULL;
+ }
+
+ LFO_Init();
+ SCSP->buffertmpl=(signed int*) malloc(44100*sizeof(signed int));
+ SCSP->buffertmpr=(signed int*) malloc(44100*sizeof(signed int));
+ memset(SCSP->buffertmpl,0,44100*sizeof(signed int));
+ memset(SCSP->buffertmpr,0,44100*sizeof(signed int));
+
+ // no "pend"
+ SCSP[0].udata.data[0x20/2] = 0;
+ //SCSP[1].udata.data[0x20/2] = 0;
+ SCSP->TimCnt[0] = 0xffff;
+ SCSP->TimCnt[1] = 0xffff;
+ SCSP->TimCnt[2] = 0xffff;
+}
+
+static void SCSP_UpdateSlotReg(struct _SCSP *SCSP,int s,int r)
+{
+ struct _SLOT *slot=SCSP->Slots+s;
+ int sl;
+ switch(r&0x3f)
+ {
+ case 0:
+ case 1:
+ if(KEYONEX(slot))
+ {
+ for(sl=0;sl<32;++sl)
+ {
+ struct _SLOT *s2=SCSP->Slots+sl;
+ {
+ if(KEYONB(s2) && s2->EG.state==RELEASE/*&& !s2->active*/)
+ {
+ SCSP_StartSlot(SCSP, s2);
+ }
+ if(!KEYONB(s2) /*&& s2->active*/)
+ {
+ SCSP_StopSlot(s2,1);
+ }
+ }
+ }
+ slot->udata.data[0]&=~0x1000;
+ }
+ break;
+ case 0x10:
+ case 0x11:
+ slot->step=SCSP_Step(slot);
+ break;
+ case 0xA:
+ case 0xB:
+ slot->EG.RR=Get_RR(SCSP,0,RR(slot));
+ slot->EG.DL=0x1f-DL(slot);
+ break;
+ case 0x12:
+ case 0x13:
+ Compute_LFO(slot);
+ break;
+ }
+}
+
+static void SCSP_UpdateReg(struct _SCSP *SCSP, int reg)
+{
+ switch(reg&0x3f)
+ {
+ case 0x2:
+ case 0x3:
+ {
+ unsigned int v=RBL(SCSP);
+ SCSP->DSP.RBP=RBP(SCSP);
+ if(v==0)
+ SCSP->DSP.RBL=8*1024;
+ else if(v==1)
+ SCSP->DSP.RBL=16*1024;
+ if(v==2)
+ SCSP->DSP.RBL=32*1024;
+ if(v==3)
+ SCSP->DSP.RBL=64*1024;
+ }
+ break;
+ case 0x6:
+ case 0x7:
+ SCSP_MidiIn(0, SCSP->udata.data[0x6/2]&0xff, 0);
+ break;
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ case 0x17:
+ break;
+ case 0x18:
+ case 0x19:
+ if(SCSP->Master)
+ {
+ SCSP->TimPris[0]=1<<((SCSP->udata.data[0x18/2]>>8)&0x7);
+ SCSP->TimCnt[0]=(SCSP->udata.data[0x18/2]&0xff)<<8;
+ }
+ break;
+ case 0x1a:
+ case 0x1b:
+ if(SCSP->Master)
+ {
+ SCSP->TimPris[1]=1<<((SCSP->udata.data[0x1A/2]>>8)&0x7);
+ SCSP->TimCnt[1]=(SCSP->udata.data[0x1A/2]&0xff)<<8;
+ }
+ break;
+ case 0x1C:
+ case 0x1D:
+ if(SCSP->Master)
+ {
+ SCSP->TimPris[2]=1<<((SCSP->udata.data[0x1C/2]>>8)&0x7);
+ SCSP->TimCnt[2]=(SCSP->udata.data[0x1C/2]&0xff)<<8;
+ }
+ break;
+ case 0x22: //SCIRE
+ case 0x23:
+
+ if(SCSP->Master)
+ {
+ SCSP->udata.data[0x20/2]&=~SCSP->udata.data[0x22/2];
+ ResetInterrupts(SCSP);
+
+ // behavior from real hardware: if you SCIRE a timer that's expired,
+ // it'll immediately pop up again. ask Sakura Taisen on the Saturn...
+ if (SCSP->TimCnt[0] >= 0xff00)
+ {
+ SCSP->udata.data[0x20/2] |= 0x40;
+ }
+ if (SCSP->TimCnt[1] >= 0xff00)
+ {
+ SCSP->udata.data[0x20/2] |= 0x80;
+ }
+ if (SCSP->TimCnt[2] >= 0xff00)
+ {
+ SCSP->udata.data[0x20/2] |= 0x100;
+ }
+ }
+ break;
+ case 0x24:
+ case 0x25:
+ case 0x26:
+ case 0x27:
+ case 0x28:
+ case 0x29:
+ if(SCSP->Master)
+ {
+ SCSP->IrqTimA=DecodeSCI(SCSP,SCITMA);
+ SCSP->IrqTimBC=DecodeSCI(SCSP,SCITMB);
+ SCSP->IrqMidi=DecodeSCI(SCSP,SCIMID);
+ }
+ break;
+ }
+}
+
+static void SCSP_UpdateSlotRegR(struct _SCSP *SCSP, int slot,int reg)
+{
+
+}
+
+static void SCSP_UpdateRegR(struct _SCSP *SCSP, int reg)
+{
+ switch(reg&0x3f)
+ {
+ case 4:
+ case 5:
+ {
+ unsigned short v=SCSP->udata.data[0x5/2];
+ v&=0xff00;
+ v|=SCSP->MidiStack[SCSP->MidiR];
+ SCSP->Int68kCB(0); // cancel the IRQ
+ if(SCSP->MidiR!=SCSP->MidiW)
+ {
+ ++SCSP->MidiR;
+ SCSP->MidiR&=15;
+ }
+ SCSP->udata.data[0x5/2]=v;
+ }
+ break;
+ case 8:
+ case 9:
+ {
+ unsigned char slot=SCSP->udata.data[0x8/2]>>11;
+ unsigned int CA=SCSP->Slots[slot&0x1f].cur_addr>>(SHIFT+12);
+ SCSP->udata.data[0x8/2]&=~(0x780);
+ SCSP->udata.data[0x8/2]|=CA<<7;
+ }
+ break;
+ }
+}
+
+static void SCSP_w16(struct _SCSP *SCSP,unsigned int addr,unsigned short val)
+{
+ addr&=0xffff;
+ if(addr<0x400)
+ {
+ int slot=addr/0x20;
+ addr&=0x1f;
+ *((unsigned short *) (SCSP->Slots[slot].udata.datab+(addr))) = val;
+ SCSP_UpdateSlotReg(SCSP,slot,addr&0x1f);
+ }
+ else if(addr<0x600)
+ {
+ if (addr < 0x430)
+ {
+ *((unsigned short *) (SCSP->udata.datab+((addr&0x3f)))) = val;
+ SCSP_UpdateReg(SCSP, addr&0x3f);
+ }
+ }
+ else if(addr<0x700)
+ SCSP->RINGBUF[(addr-0x600)/2]=val;
+ else
+ {
+ //DSP
+ if(addr<0x780) //COEF
+ *((unsigned short *) (SCSP->DSP.COEF+(addr-0x700)/2))=val;
+ else if(addr<0x800)
+ *((unsigned short *) (SCSP->DSP.MADRS+(addr-0x780)/2))=val;
+ else if(addr<0xC00)
+ *((unsigned short *) (SCSP->DSP.MPRO+(addr-0x800)/2))=val;
+
+ if(addr==0xBF0)
+ {
+// printf("DSP start\n");
+ SCSPDSP_Start(&SCSP->DSP);
+ }
+ }
+}
+
+static unsigned short SCSP_r16(struct _SCSP *SCSP, unsigned int addr)
+{
+ unsigned short v=0;
+ addr&=0xffff;
+ if(addr<0x400)
+ {
+ int slot=addr/0x20;
+ addr&=0x1f;
+ SCSP_UpdateSlotRegR(SCSP, slot,addr&0x1f);
+ v=*((unsigned short *) (SCSP->Slots[slot].udata.datab+(addr)));
+ }
+ else if(addr<0x600)
+ {
+ if (addr < 0x430)
+ {
+ SCSP_UpdateRegR(SCSP, addr&0x3f);
+ v= *((unsigned short *) (SCSP->udata.datab+((addr&0x3f))));
+ }
+ }
+ else if(addr<0x700)
+ v=SCSP->RINGBUF[(addr-0x600)/2];
+ return v;
+}
+
+
+#define REVSIGN(v) ((~v)+1)
+
+void SCSP_TimersAddTicks(struct _SCSP *SCSP, int ticks)
+{
+ if(SCSP->TimCnt[0]<=0xff00)
+ {
+ SCSP->TimCnt[0] += ticks << (8-((SCSP->udata.data[0x18/2]>>8)&0x7));
+ if (SCSP->TimCnt[0] > 0xFF00)
+ {
+ SCSP->TimCnt[0] = 0xFFFF;
+ SCSP->udata.data[0x20/2]|=0x40;
+ }
+ SCSP->udata.data[0x18/2]&=0xff00;
+ SCSP->udata.data[0x18/2]|=SCSP->TimCnt[0]>>8;
+ }
+
+ if(SCSP->TimCnt[1]<=0xff00)
+ {
+ SCSP->TimCnt[1] += ticks << (8-((SCSP->udata.data[0x1a/2]>>8)&0x7));
+ if (SCSP->TimCnt[1] > 0xFF00)
+ {
+ SCSP->TimCnt[1] = 0xFFFF;
+ SCSP->udata.data[0x20/2]|=0x80;
+ }
+ SCSP->udata.data[0x1a/2]&=0xff00;
+ SCSP->udata.data[0x1a/2]|=SCSP->TimCnt[1]>>8;
+ }
+
+ if(SCSP->TimCnt[2]<=0xff00)
+ {
+ SCSP->TimCnt[2] += ticks << (8-((SCSP->udata.data[0x1c/2]>>8)&0x7));
+ if (SCSP->TimCnt[2] > 0xFF00)
+ {
+ SCSP->TimCnt[2] = 0xFFFF;
+ SCSP->udata.data[0x20/2]|=0x100;
+ }
+ SCSP->udata.data[0x1c/2]&=0xff00;
+ SCSP->udata.data[0x1c/2]|=SCSP->TimCnt[2]>>8;
+ }
+}
+
+INLINE INT32 SCSP_UpdateSlot(struct _SCSP *SCSP, struct _SLOT *slot)
+{
+ INT32 sample;
+ int step=slot->step;
+ UINT32 addr1,addr2,addr_select; // current and next sample addresses
+ UINT32 *addr[2] = {&addr1, &addr2}; // used for linear interpolation
+ UINT32 *slot_addr[2] = {&(slot->cur_addr), &(slot->nxt_addr)}; //
+
+ if(SSCTL(slot)!=0) //no FM or noise yet
+ return 0;
+
+ if(PLFOS(slot)!=0)
+ {
+ step=step*PLFO_Step(&(slot->PLFO));
+ step>>=SHIFT;
+ }
+
+ if(PCM8B(slot))
+ {
+ addr1=slot->cur_addr>>SHIFT;
+ addr2=slot->nxt_addr>>SHIFT;
+ }
+ else
+ {
+ addr1=(slot->cur_addr>>(SHIFT-1))&0x7fffe;
+ addr2=(slot->nxt_addr>>(SHIFT-1))&0x7fffe;
+ }
+
+ if(MDL(slot)!=0 || MDXSL(slot)!=0 || MDYSL(slot)!=0)
+ {
+ INT32 smp=(SCSP->RINGBUF[(SCSP->BUFPTR+MDXSL(slot))&63]+SCSP->RINGBUF[(SCSP->BUFPTR+MDYSL(slot))&63])/2;
+
+ smp<<=0xA; // associate cycle with 1024
+ smp>>=0x1A-MDL(slot); // ex. for MDL=0xF, sample range corresponds to +/- 64 pi (32=2^5 cycles) so shift by 11 (16-5 == 0x1A-0xF)
+ if(!PCM8B(slot)) smp<<=1;
+
+ addr1+=smp; addr2+=smp;
+ }
+
+ if(PCM8B(slot)) //8 bit signed
+ {
+ INT8 *p1=(signed char *) (SCSP->SCSPRAM+(((SA(slot)+addr1)^1)&0x7FFFF));
+ INT8 *p2=(signed char *) (SCSP->SCSPRAM+(((SA(slot)+addr2)^1)&0x7FFFF));
+ //sample=(p[0])<<8;
+ INT32 s;
+ INT32 fpart=slot->cur_addr&((1<<SHIFT)-1);
+ s=(int) (p1[0]<<8)*((1<<SHIFT)-fpart)+(int) (p2[0]<<8)*fpart;
+ sample=(s>>SHIFT);
+ }
+ else //16 bit signed (endianness?)
+ {
+ INT16 *p1=(signed short *) (SCSP->SCSPRAM+((SA(slot)+addr1)&0x7FFFE));
+ INT16 *p2=(signed short *) (SCSP->SCSPRAM+((SA(slot)+addr2)&0x7FFFE));
+ //sample=LE16(p[0]);
+ INT32 s;
+ INT32 fpart=slot->cur_addr&((1<<SHIFT)-1);
+ s=(int) LE16(p1[0])*((1<<SHIFT)-fpart)+(int) LE16(p2[0])*fpart;
+ sample=(s>>SHIFT);
+ }
+
+ if(SBCTL(slot)&0x1)
+ sample ^= 0x7FFF;
+ if(SBCTL(slot)&0x2)
+ sample = (INT16)(sample^0x8000);
+
+ if(slot->Backwards)
+ slot->cur_addr-=step;
+ else
+ slot->cur_addr+=step;
+ slot->nxt_addr=slot->cur_addr+(1<<SHIFT);
+
+ addr1=slot->cur_addr>>SHIFT;
+ addr2=slot->nxt_addr>>SHIFT;
+
+ if(addr1>=LSA(slot) && !(slot->Backwards))
+ {
+ if(LPSLNK(slot) && slot->EG.state==ATTACK)
+ slot->EG.state = DECAY1;
+ }
+
+ for (addr_select=0;addr_select<2;addr_select++)
+ {
+ INT32 rem_addr;
+ switch(LPCTL(slot))
+ {
+ case 0: //no loop
+ if(*addr[addr_select]>=LSA(slot) && *addr[addr_select]>=LEA(slot))
+ {
+ //slot->active=0;
+ SCSP_StopSlot(slot,0);
+ }
+ break;
+ case 1: //normal loop
+ if(*addr[addr_select]>=LEA(slot))
+ {
+ rem_addr = *slot_addr[addr_select] - (LEA(slot)<<SHIFT);
+ *slot_addr[addr_select]=(LSA(slot)<<SHIFT) + rem_addr;
+ }
+ break;
+ case 2: //reverse loop
+ if((*addr[addr_select]>=LSA(slot)) && !(slot->Backwards))
+ {
+ rem_addr = *slot_addr[addr_select] - (LSA(slot)<<SHIFT);
+ *slot_addr[addr_select]=(LEA(slot)<<SHIFT) - rem_addr;
+ slot->Backwards=1;
+ }
+ else if((*addr[addr_select]<LSA(slot) || (*slot_addr[addr_select]&0x80000000)) && slot->Backwards)
+ {
+ rem_addr = (LSA(slot)<<SHIFT) - *slot_addr[addr_select];
+ *slot_addr[addr_select]=(LEA(slot)<<SHIFT) - rem_addr;
+ }
+ break;
+ case 3: //ping-pong
+ if(*addr[addr_select]>=LEA(slot)) //reached end, reverse till start
+ {
+ rem_addr = *slot_addr[addr_select] - (LEA(slot)<<SHIFT);
+ *slot_addr[addr_select]=(LEA(slot)<<SHIFT) - rem_addr;
+ slot->Backwards=1;
+ }
+ else if((*addr[addr_select]<LSA(slot) || (*slot_addr[addr_select]&0x80000000)) && slot->Backwards)//reached start or negative
+ {
+ rem_addr = (LSA(slot)<<SHIFT) - *slot_addr[addr_select];
+ *slot_addr[addr_select]=(LSA(slot)<<SHIFT) + rem_addr;
+ slot->Backwards=0;
+ }
+ break;
+ }
+ }
+
+ if(ALFOS(slot)!=0)
+ {
+ sample=sample*ALFO_Step(&(slot->ALFO));
+ sample>>=SHIFT;
+ }
+
+ if(slot->EG.state==ATTACK)
+ sample=(sample*EG_Update(slot))>>SHIFT;
+ else
+ sample=(sample*EG_TABLE[EG_Update(slot)>>(SHIFT-10)])>>SHIFT;
+
+ if(!STWINH(slot))
+ {
+ unsigned short Enc=((TL(slot))<<0x0)|(0x7<<0xd);
+ *RBUFDST=(sample*SCSP->LPANTABLE[Enc])>>(SHIFT+1);
+ }
+
+ return sample;
+}
+
+static void SCSP_DoMasterSamples(struct _SCSP *SCSP, int nsamples)
+{
+ INT16 *bufr,*bufl;
+ int sl, s, i;
+
+ bufr=bufferr;
+ bufl=bufferl;
+
+ for(s=0;s<nsamples;++s)
+ {
+ INT32 smpl, smpr;
+
+ smpl = smpr = 0;
+
+ for(sl=0;sl<32;++sl)
+ {
+#if FM_DELAY
+ RBUFDST=SCSP->DELAYBUF+SCSP->DELAYPTR;
+#else
+ RBUFDST=SCSP->RINGBUF+SCSP->BUFPTR;
+#endif
+ if(SCSP->Slots[sl].active)
+ {
+ struct _SLOT *slot=SCSP->Slots+sl;
+ unsigned short Enc;
+ signed int sample;
+
+ sample=SCSP_UpdateSlot(SCSP, slot);
+
+ Enc=((TL(slot))<<0x0)|((IMXL(slot))<<0xd);
+ SCSPDSP_SetSample(&SCSP->DSP,(sample*SCSP->LPANTABLE[Enc])>>(SHIFT-2),ISEL(slot),IMXL(slot));
+ Enc=((TL(slot))<<0x0)|((DIPAN(slot))<<0x8)|((DISDL(slot))<<0xd);
+ {
+ smpl+=(sample*SCSP->LPANTABLE[Enc])>>SHIFT;
+ smpr+=(sample*SCSP->RPANTABLE[Enc])>>SHIFT;
+ }
+ }
+
+#if FM_DELAY
+ SCSP->RINGBUF[(SCSP->BUFPTR+64-(FM_DELAY-1))&63] = SCSP->DELAYBUF[(SCSP->DELAYPTR+FM_DELAY-(FM_DELAY-1))%FM_DELAY];
+#endif
+ ++SCSP->BUFPTR;
+ SCSP->BUFPTR&=63;
+#if FM_DELAY
+ ++SCSP->DELAYPTR;
+ if(SCSP->DELAYPTR>FM_DELAY-1) SCSP->DELAYPTR=0;
+#endif
+ }
+
+ SCSPDSP_Step(&SCSP->DSP);
+
+ for(i=0;i<16;++i)
+ {
+ struct _SLOT *slot=SCSP->Slots+i;
+ if(EFSDL(slot))
+ {
+ unsigned short Enc=((EFPAN(slot))<<0x8)|((EFSDL(slot))<<0xd);
+ smpl+=(SCSP->DSP.EFREG[i]*SCSP->LPANTABLE[Enc])>>SHIFT;
+ smpr+=(SCSP->DSP.EFREG[i]*SCSP->RPANTABLE[Enc])>>SHIFT;
+ }
+ }
+
+ *bufl++ = ICLIP16(smpl>>2);
+ *bufr++ = ICLIP16(smpr>>2);
+
+ SCSP_TimersAddTicks(SCSP, 1);
+ CheckPendingIRQ(SCSP);
+ }
+
+}
+
+static void dma_scsp(struct _SCSP *SCSP)
+{
+ static UINT16 tmp_dma[3], *scsp_regs;
+
+ scsp_regs = (UINT16 *)SCSP->udata.datab;
+
+ printf("SCSP: DMA transfer START\n"
+ "DMEA: %04x DRGA: %04x DTLG: %04x\n"
+ "DGATE: %d DDIR: %d\n",SCSP->scsp_dmea,SCSP->scsp_drga,SCSP->scsp_dtlg,scsp_dgate ? 1 : 0,scsp_ddir ? 1 : 0);
+
+ /* Copy the dma values in a temp storage for resuming later *
+ * (DMA *can't* overwrite his parameters). */
+ if(!(scsp_ddir))
+ {
+ tmp_dma[0] = scsp_regs[0x12/2];
+ tmp_dma[1] = scsp_regs[0x14/2];
+ tmp_dma[2] = scsp_regs[0x16/2];
+ }
+
+ if(scsp_ddir)
+ {
+ for(;SCSP->scsp_dtlg > 0;SCSP->scsp_dtlg-=2)
+ {
+// program_write_word(SCSP->scsp_dmea, program_read_word(0x100000|SCSP->scsp_drga));
+ SCSP->scsp_dmea+=2;
+ SCSP->scsp_drga+=2;
+ }
+ }
+ else
+ {
+ for(;SCSP->scsp_dtlg > 0;SCSP->scsp_dtlg-=2)
+ {
+// program_write_word(0x100000|SCSP->scsp_drga,program_read_word(SCSP->scsp_dmea));
+ SCSP->scsp_dmea+=2;
+ SCSP->scsp_drga+=2;
+ }
+ }
+
+ /*Resume the values*/
+ if(!(scsp_ddir))
+ {
+ scsp_regs[0x12/2] = tmp_dma[0];
+ scsp_regs[0x14/2] = tmp_dma[1];
+ scsp_regs[0x16/2] = tmp_dma[2];
+ }
+
+ /*Job done,request a dma end irq*/
+// if(scsp_regs[0x1e/2] & 0x10)
+// cpunum_set_input_line(2,dma_transfer_end,HOLD_LINE);
+}
+
+int SCSP_IRQCB(void *param)
+{
+ CheckPendingIRQ(param);
+ return -1;
+}
+
+void SCSP_Update(void *param, INT16 **inputs, INT16 **buf, int samples)
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+ bufferl = buf[0];
+ bufferr = buf[1];
+ length = samples;
+ SCSP_DoMasterSamples(SCSP, samples);
+}
+
+void *scsp_start(const void *config)
+{
+ const struct SCSPinterface *intf;
+
+ struct _SCSP *SCSP;
+
+ SCSP = malloc(sizeof(*SCSP));
+ memset(SCSP, 0, sizeof(*SCSP));
+
+ intf = config;
+
+ // init the emulation
+ SCSP_Init(SCSP, intf);
+
+ // set up the IRQ callbacks
+ {
+ SCSP->Int68kCB = intf->irq_callback[0];
+
+// SCSP->stream = stream_create(0, 2, 44100, SCSP, SCSP_Update);
+ }
+
+ AllocedSCSP = SCSP;
+
+ return SCSP;
+}
+
+
+void SCSP_set_ram_base(int which, void *base)
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+ if (SCSP)
+ {
+ SCSP->SCSPRAM = base;
+ SCSP->DSP.SCSPRAM = base;
+ }
+}
+
+
+READ16_HANDLER( SCSP_0_r )
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+
+ return SCSP_r16(SCSP, offset*2);
+}
+
+extern UINT32* stv_scu;
+
+WRITE16_HANDLER( SCSP_0_w )
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+ UINT16 tmp, *scsp_regs;
+
+ tmp = SCSP_r16(SCSP, offset*2);
+ COMBINE_DATA(&tmp);
+ SCSP_w16(SCSP,offset*2, tmp);
+
+ scsp_regs = (UINT16 *)SCSP->udata.datab;
+
+ switch(offset*2)
+ {
+ // check DMA
+ case 0x412:
+ /*DMEA [15:1]*/
+ /*Sound memory address*/
+ SCSP->scsp_dmea = (((scsp_regs[0x14/2] & 0xf000)>>12)*0x10000) | (scsp_regs[0x12/2] & 0xfffe);
+ break;
+ case 0x414:
+ /*DMEA [19:16]*/
+ SCSP->scsp_dmea = (((scsp_regs[0x14/2] & 0xf000)>>12)*0x10000) | (scsp_regs[0x12/2] & 0xfffe);
+ /*DRGA [11:1]*/
+ /*Register memory address*/
+ SCSP->scsp_drga = scsp_regs[0x14/2] & 0x0ffe;
+ break;
+ case 0x416:
+ /*DGATE[14]*/
+ /*DDIR[13]*/
+ /*if 0 sound_mem -> reg*/
+ /*if 1 sound_mem <- reg*/
+ /*DEXE[12]*/
+ /*starting bit*/
+ /*DTLG[11:1]*/
+ /*size of transfer*/
+ SCSP->scsp_dtlg = scsp_regs[0x16/2] & 0x0ffe;
+ if(scsp_dexe)
+ {
+ dma_scsp(SCSP);
+ scsp_regs[0x16/2]^=0x1000;//disable starting bit
+ }
+ break;
+ //check main cpu IRQ
+ case 0x42a:
+#if 0
+ if(stv_scu && !(stv_scu[40] & 0x40) /*&& scsp_regs[0x42c/2] & 0x20*/)/*Main CPU allow sound irq*/
+ {
+ cpunum_set_input_line_and_vector(0, 9, HOLD_LINE , 0x46);
+ logerror("SCSP: Main CPU interrupt\n");
+ }
+#endif
+ break;
+ case 0x42c:
+ break;
+ case 0x42e:
+ break;
+ }
+}
+
+WRITE16_HANDLER( SCSP_MidiIn )
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+ SCSP->MidiStack[SCSP->MidiW++]=data;
+ SCSP->MidiW &= 15;
+}
+
+READ16_HANDLER( SCSP_MidiOutR )
+{
+ struct _SCSP *SCSP = AllocedSCSP;
+ unsigned char val;
+
+ val=SCSP->MidiStack[SCSP->MidiR++];
+ SCSP->MidiR&=7;
+ return val;
+}
+
diff --git a/plugins/ao/eng_ssf/scsp.h b/plugins/ao/eng_ssf/scsp.h
new file mode 100644
index 00000000..345c78b8
--- /dev/null
+++ b/plugins/ao/eng_ssf/scsp.h
@@ -0,0 +1,43 @@
+/*
+
+ SCSP (YMF292-F) header
+*/
+
+#ifndef _SCSP_H_
+#define _SCSP_H_
+
+#define MAX_SCSP (2)
+
+#define COMBINE_DATA(varptr) (*(varptr) = (*(varptr) & mem_mask) | (data & ~mem_mask))
+
+// convert AO types
+typedef int8 data8_t;
+typedef int16 data16_t;
+typedef int32 data32_t;
+typedef int offs_t;
+
+struct SCSPinterface
+{
+ int num;
+ void *region[MAX_SCSP];
+ int mixing_level[MAX_SCSP]; /* volume */
+ void (*irq_callback[MAX_SCSP])(int state); /* irq callback */
+};
+
+void *scsp_start(const void *config);
+void SCSP_Update(void *param, INT16 **inputs, INT16 **buf, int samples);
+
+#define READ16_HANDLER(name) data16_t name(offs_t offset, data16_t mem_mask)
+#define WRITE16_HANDLER(name) void name(offs_t offset, data16_t data, data16_t mem_mask)
+
+// SCSP register access
+READ16_HANDLER( SCSP_0_r );
+WRITE16_HANDLER( SCSP_0_w );
+READ16_HANDLER( SCSP_1_r );
+WRITE16_HANDLER( SCSP_1_w );
+
+// MIDI I/O access (used for comms on Model 2/3)
+WRITE16_HANDLER( SCSP_MidiIn );
+READ16_HANDLER( SCSP_MidiOutR );
+
+#endif
diff --git a/plugins/ao/eng_ssf/scspdsp.c b/plugins/ao/eng_ssf/scspdsp.c
new file mode 100644
index 00000000..8c08dd72
--- /dev/null
+++ b/plugins/ao/eng_ssf/scspdsp.c
@@ -0,0 +1,349 @@
+#include <assert.h>
+#include <math.h>
+#include "ao.h"
+#include "cpuintrf.h"
+#include "scsp.h"
+#include "scspdsp.h"
+
+static UINT16 PACK(INT32 val)
+{
+ UINT32 temp;
+ int sign,exponent,k;
+
+ sign = (val >> 23) & 0x1;
+ temp = (val ^ (val << 1)) & 0xFFFFFF;
+ exponent = 0;
+ for (k=0; k<12; k++)
+ {
+ if (temp & 0x800000)
+ break;
+ temp <<= 1;
+ exponent += 1;
+ }
+ if (exponent < 12)
+ val = (val << exponent) & 0x3FFFFF;
+ else
+ val <<= 11;
+ val >>= 11;
+ val |= sign << 15;
+ val |= exponent << 11;
+
+ return (UINT16)val;
+}
+
+static INT32 UNPACK(UINT16 val)
+{
+ int sign,exponent,mantissa;
+ INT32 uval;
+
+ sign = (val >> 15) & 0x1;
+ exponent = (val >> 11) & 0xF;
+ mantissa = val & 0x7FF;
+ uval = mantissa << 11;
+ if (exponent > 11)
+ exponent = 11;
+ else
+ uval |= (sign ^ 1) << 22;
+ uval |= sign << 23;
+ uval <<= 8;
+ uval >>= 8;
+ uval >>= exponent;
+
+ return uval;
+}
+
+void SCSPDSP_Init(struct _SCSPDSP *DSP)
+{
+ memset(DSP,0,sizeof(struct _SCSPDSP));
+ DSP->RBL=0x8000;
+ DSP->Stopped=1;
+}
+
+void SCSPDSP_Step(struct _SCSPDSP *DSP)
+{
+ INT32 ACC=0; //26 bit
+ INT32 SHIFTED=0; //24 bit
+ INT32 X=0; //24 bit
+ INT32 Y=0; //13 bit
+ INT32 B=0; //26 bit
+ INT32 INPUTS=0; //24 bit
+ INT32 MEMVAL=0;
+ INT32 FRC_REG=0; //13 bit
+ INT32 Y_REG=0; //24 bit
+ UINT32 ADDR=0;
+ UINT32 ADRS_REG=0; //13 bit
+ int step;
+
+ if(DSP->Stopped)
+ return;
+
+ memset(DSP->EFREG,0,2*16);
+#if 0
+ int dump=0;
+ FILE *f=NULL;
+ if(dump)
+ f=fopen("dsp.txt","wt");
+#endif
+ for(step=0;step</*128*/DSP->LastStep;++step)
+ {
+ UINT16 *IPtr=DSP->MPRO+step*4;
+
+// if(IPtr[0]==0 && IPtr[1]==0 && IPtr[2]==0 && IPtr[3]==0)
+// break;
+
+ UINT32 TRA=(IPtr[0]>>8)&0x7F;
+ UINT32 TWT=(IPtr[0]>>7)&0x01;
+ UINT32 TWA=(IPtr[0]>>0)&0x7F;
+
+ UINT32 XSEL=(IPtr[1]>>15)&0x01;
+ UINT32 YSEL=(IPtr[1]>>13)&0x03;
+ UINT32 IRA=(IPtr[1]>>6)&0x3F;
+ UINT32 IWT=(IPtr[1]>>5)&0x01;
+ UINT32 IWA=(IPtr[1]>>0)&0x1F;
+
+ UINT32 TABLE=(IPtr[2]>>15)&0x01;
+ UINT32 MWT=(IPtr[2]>>14)&0x01;
+ UINT32 MRD=(IPtr[2]>>13)&0x01;
+ UINT32 EWT=(IPtr[2]>>12)&0x01;
+ UINT32 EWA=(IPtr[2]>>8)&0x0F;
+ UINT32 ADRL=(IPtr[2]>>7)&0x01;
+ UINT32 FRCL=(IPtr[2]>>6)&0x01;
+ UINT32 SHIFT=(IPtr[2]>>4)&0x03;
+ UINT32 YRL=(IPtr[2]>>3)&0x01;
+ UINT32 NEGB=(IPtr[2]>>2)&0x01;
+ UINT32 ZERO=(IPtr[2]>>1)&0x01;
+ UINT32 BSEL=(IPtr[2]>>0)&0x01;
+
+ UINT32 NOFL=(IPtr[3]>>15)&1; //????
+ UINT32 COEF=(IPtr[3]>>9)&0x3f;
+
+ UINT32 MASA=(IPtr[3]>>2)&0x1f; //???
+ UINT32 ADREB=(IPtr[3]>>1)&0x1;
+ UINT32 NXADR=(IPtr[3]>>0)&0x1;
+
+ INT64 v;
+
+ //operations are done at 24 bit precision
+#if 0
+ if(MASA)
+ int a=1;
+ if(NOFL)
+ int a=1;
+
+// int dump=0;
+
+ if(f)
+ {
+#define DUMP(v) fprintf(f," " #v ": %04X",v);
+
+ fprintf(f,"%d: ",step);
+ DUMP(ACC);
+ DUMP(SHIFTED);
+ DUMP(X);
+ DUMP(Y);
+ DUMP(B);
+ DUMP(INPUTS);
+ DUMP(MEMVAL);
+ DUMP(FRC_REG);
+ DUMP(Y_REG);
+ DUMP(ADDR);
+ DUMP(ADRS_REG);
+ fprintf(f,"\n");
+ }
+#endif
+ //INPUTS RW
+ assert(IRA<0x32);
+ if(IRA<=0x1f)
+ INPUTS=DSP->MEMS[IRA];
+ else if(IRA<=0x2F)
+ INPUTS=DSP->MIXS[IRA-0x20]<<4; //MIXS is 20 bit
+ else if(IRA<=0x31)
+ INPUTS=0;
+
+ INPUTS<<=8;
+ INPUTS>>=8;
+ //if(INPUTS&0x00800000)
+ // INPUTS|=0xFF000000;
+
+ if(IWT)
+ {
+ DSP->MEMS[IWA]=MEMVAL; //MEMVAL was selected in previous MRD
+ if(IRA==IWA)
+ INPUTS=MEMVAL;
+ }
+
+ //Operand sel
+ //B
+ if(!ZERO)
+ {
+ if(BSEL)
+ B=ACC;
+ else
+ {
+ B=DSP->TEMP[(TRA+DSP->DEC)&0x7F];
+ B<<=8;
+ B>>=8;
+ //if(B&0x00800000)
+ // B|=0xFF000000; //Sign extend
+ }
+ if(NEGB)
+ B=0-B;
+ }
+ else
+ B=0;
+
+ //X
+ if(XSEL)
+ X=INPUTS;
+ else
+ {
+ X=DSP->TEMP[(TRA+DSP->DEC)&0x7F];
+ X<<=8;
+ X>>=8;
+ //if(X&0x00800000)
+ // X|=0xFF000000;
+ }
+
+ //Y
+ if(YSEL==0)
+ Y=FRC_REG;
+ else if(YSEL==1)
+ Y=DSP->COEF[COEF]>>3; //COEF is 16 bits
+ else if(YSEL==2)
+ Y=(Y_REG>>11)&0x1FFF;
+ else if(YSEL==3)
+ Y=(Y_REG>>4)&0x0FFF;
+
+ if(YRL)
+ Y_REG=INPUTS;
+
+ //Shifter
+ if(SHIFT==0)
+ {
+ SHIFTED=ACC;
+ if(SHIFTED>0x007FFFFF)
+ SHIFTED=0x007FFFFF;
+ if(SHIFTED<(-0x00800000))
+ SHIFTED=-0x00800000;
+ }
+ else if(SHIFT==1)
+ {
+ SHIFTED=ACC*2;
+ if(SHIFTED>0x007FFFFF)
+ SHIFTED=0x007FFFFF;
+ if(SHIFTED<(-0x00800000))
+ SHIFTED=-0x00800000;
+ }
+ else if(SHIFT==2)
+ {
+ SHIFTED=ACC*2;
+ SHIFTED<<=8;
+ SHIFTED>>=8;
+ //SHIFTED&=0x00FFFFFF;
+ //if(SHIFTED&0x00800000)
+ // SHIFTED|=0xFF000000;
+ }
+ else if(SHIFT==3)
+ {
+ SHIFTED=ACC;
+ SHIFTED<<=8;
+ SHIFTED>>=8;
+ //SHIFTED&=0x00FFFFFF;
+ //if(SHIFTED&0x00800000)
+ // SHIFTED|=0xFF000000;
+ }
+
+ //ACCUM
+ Y<<=19;
+ Y>>=19;
+ //if(Y&0x1000)
+ // Y|=0xFFFFF000;
+
+ v=(((INT64) X*(INT64) Y)>>12);
+ ACC=(int) v+B;
+
+ if(TWT)
+ DSP->TEMP[(TWA+DSP->DEC)&0x7F]=SHIFTED;
+
+ if(FRCL)
+ {
+ if(SHIFT==3)
+ FRC_REG=SHIFTED&0x0FFF;
+ else
+ FRC_REG=(SHIFTED>>11)&0x1FFF;
+ }
+
+ if(MRD || MWT)
+ //if(0)
+ {
+ ADDR=DSP->MADRS[MASA];
+ if(!TABLE)
+ ADDR+=DSP->DEC;
+ if(ADREB)
+ ADDR+=ADRS_REG&0x0FFF;
+ if(NXADR)
+ ADDR++;
+ if(!TABLE)
+ ADDR&=DSP->RBL-1;
+ else
+ ADDR&=0xFFFF;
+ //ADDR<<=1;
+ //ADDR+=DSP->RBP<<13;
+ //MEMVAL=DSP->SCSPRAM[ADDR>>1];
+ ADDR+=DSP->RBP<<12;
+ if(MRD && (step&1)) //memory only allowed on odd? DoA inserts NOPs on even
+ {
+ if(NOFL)
+ MEMVAL=DSP->SCSPRAM[ADDR]<<8;
+ else
+ MEMVAL=UNPACK(DSP->SCSPRAM[ADDR]);
+ }
+ if(MWT && (step&1))
+ {
+ if(NOFL)
+ DSP->SCSPRAM[ADDR]=SHIFTED>>8;
+ else
+ DSP->SCSPRAM[ADDR]=PACK(SHIFTED);
+ }
+ }
+
+ if(ADRL)
+ {
+ if(SHIFT==3)
+ ADRS_REG=(SHIFTED>>12)&0xFFF;
+ else
+ ADRS_REG=(INPUTS>>16);
+ }
+
+ if(EWT)
+ DSP->EFREG[EWA]+=SHIFTED>>8;
+
+ }
+ --DSP->DEC;
+ memset(DSP->MIXS,0,4*16);
+// if(f)
+// fclose(f);
+}
+
+void SCSPDSP_SetSample(struct _SCSPDSP *DSP,INT32 sample,int SEL,int MXL)
+{
+ //DSP->MIXS[SEL]+=sample<<(MXL+1)/*7*/;
+ DSP->MIXS[SEL]+=sample;
+// if(MXL)
+// int a=1;
+}
+
+void SCSPDSP_Start(struct _SCSPDSP *DSP)
+{
+ int i;
+ DSP->Stopped=0;
+ for(i=127;i>=0;--i)
+ {
+ UINT16 *IPtr=DSP->MPRO+i*4;
+
+ if(IPtr[0]!=0 || IPtr[1]!=0 || IPtr[2]!=0 || IPtr[3]!=0)
+ break;
+ }
+ DSP->LastStep=i+1;
+
+}
diff --git a/plugins/ao/eng_ssf/scspdsp.h b/plugins/ao/eng_ssf/scspdsp.h
new file mode 100644
index 00000000..481f93af
--- /dev/null
+++ b/plugins/ao/eng_ssf/scspdsp.h
@@ -0,0 +1,37 @@
+#ifndef SCSPDSP_H
+#define SCSPDSP_H
+
+//the DSP Context
+struct _SCSPDSP
+{
+//Config
+ UINT16 *SCSPRAM;
+ UINT32 SCSPRAM_LENGTH;
+ UINT32 RBP; //Ring buf pointer
+ UINT32 RBL; //Delay ram (Ring buffer) size in words
+
+//context
+
+ INT16 COEF[64]; //16 bit signed
+ UINT16 MADRS[32]; //offsets (in words), 16 bit
+ UINT16 MPRO[128*4]; //128 steps 64 bit
+ INT32 TEMP[128]; //TEMP regs,24 bit signed
+ INT32 MEMS[32]; //MEMS regs,24 bit signed
+ UINT32 DEC;
+
+//input
+ INT32 MIXS[16]; //MIXS, 24 bit signed
+ INT16 EXTS[2]; //External inputs (CDDA) 16 bit signed
+
+//output
+ INT16 EFREG[16]; //EFREG, 16 bit signed
+
+ int Stopped;
+ int LastStep;
+};
+
+void SCSPDSP_Init(struct _SCSPDSP *DSP);
+void SCSPDSP_SetSample(struct _SCSPDSP *DSP, INT32 sample, INT32 SEL, INT32 MXL);
+void SCSPDSP_Step(struct _SCSPDSP *DSP);
+void SCSPDSP_Start(struct _SCSPDSP *DSP);
+#endif
diff --git a/plugins/ao/eng_ssf/scsplfo.c b/plugins/ao/eng_ssf/scsplfo.c
new file mode 100644
index 00000000..c25e3c8d
--- /dev/null
+++ b/plugins/ao/eng_ssf/scsplfo.c
@@ -0,0 +1,157 @@
+/*
+ SCSP LFO handling
+
+ Part of the SCSP (YMF292-F) emulator package.
+ (not compiled directly, #included from scsp.c)
+
+ By ElSemi
+ MAME/M1 conversion and cleanup by R. Belmont
+*/
+
+#define LFO_SHIFT 8
+
+struct _LFO
+{
+ unsigned short phase;
+ UINT32 phase_step;
+ int *table;
+ int *scale;
+};
+
+#define LFIX(v) ((unsigned int) ((float) (1<<LFO_SHIFT)*(v)))
+
+//Convert DB to multiply amplitude
+#define DB(v) LFIX(pow(10.0,v/20.0))
+
+//Convert cents to step increment
+#define CENTS(v) LFIX(pow(2.0,v/1200.0))
+
+static int PLFO_TRI[256],PLFO_SQR[256],PLFO_SAW[256],PLFO_NOI[256];
+static int ALFO_TRI[256],ALFO_SQR[256],ALFO_SAW[256],ALFO_NOI[256];
+static float LFOFreq[32]={0.17,0.19,0.23,0.27,0.34,0.39,0.45,0.55,0.68,0.78,0.92,1.10,1.39,1.60,1.87,2.27,
+ 2.87,3.31,3.92,4.79,6.15,7.18,8.60,10.8,14.4,17.2,21.5,28.7,43.1,57.4,86.1,172.3};
+static float ASCALE[8]={0.0,0.4,0.8,1.5,3.0,6.0,12.0,24.0};
+static float PSCALE[8]={0.0,7.0,13.5,27.0,55.0,112.0,230.0,494};
+static int PSCALES[8][256];
+static int ASCALES[8][256];
+
+void LFO_Init(void)
+{
+ int i,s;
+ for(i=0;i<256;++i)
+ {
+ int a,p;
+// float TL;
+ //Saw
+ a=255-i;
+ if(i<128)
+ p=i;
+ else
+ p=i-256;
+ ALFO_SAW[i]=a;
+ PLFO_SAW[i]=p;
+
+ //Square
+ if(i<128)
+ {
+ a=255;
+ p=127;
+ }
+ else
+ {
+ a=0;
+ p=-128;
+ }
+ ALFO_SQR[i]=a;
+ PLFO_SQR[i]=p;
+
+ //Tri
+ if(i<128)
+ a=255-(i*2);
+ else
+ a=(i*2)-256;
+ if(i<64)
+ p=i*2;
+ else if(i<128)
+ p=255-i*2;
+ else if(i<192)
+ p=256-i*2;
+ else
+ p=i*2-511;
+ ALFO_TRI[i]=a;
+ PLFO_TRI[i]=p;
+
+ //noise
+ //a=lfo_noise[i];
+ a=rand()&0xff;
+ p=128-a;
+ ALFO_NOI[i]=a;
+ PLFO_NOI[i]=p;
+ }
+
+ for(s=0;s<8;++s)
+ {
+ float limit=PSCALE[s];
+ for(i=-128;i<128;++i)
+ {
+ PSCALES[s][i+128]=CENTS(((limit*(float) i)/128.0));
+ }
+ limit=-ASCALE[s];
+ for(i=0;i<256;++i)
+ {
+ ASCALES[s][i]=DB(((limit*(float) i)/256.0));
+ }
+ }
+}
+
+signed int INLINE PLFO_Step(struct _LFO *LFO)
+{
+ int p;
+ LFO->phase+=LFO->phase_step;
+#if LFO_SHIFT!=8
+ LFO->phase&=(1<<(LFO_SHIFT+8))-1;
+#endif
+ p=LFO->table[LFO->phase>>LFO_SHIFT];
+ p=LFO->scale[p+128];
+ return p<<(SHIFT-LFO_SHIFT);
+}
+
+signed int INLINE ALFO_Step(struct _LFO *LFO)
+{
+ int p;
+ LFO->phase+=LFO->phase_step;
+#if LFO_SHIFT!=8
+ LFO->phase&=(1<<(LFO_SHIFT+8))-1;
+#endif
+ p=LFO->table[LFO->phase>>LFO_SHIFT];
+ p=LFO->scale[p];
+ return p<<(SHIFT-LFO_SHIFT);
+}
+
+void LFO_ComputeStep(struct _LFO *LFO,UINT32 LFOF,UINT32 LFOWS,UINT32 LFOS,int ALFO)
+{
+ float step=(float) LFOFreq[LFOF]*256.0/(float)44100.0;
+ LFO->phase_step=(unsigned int) ((float) (1<<LFO_SHIFT)*step);
+ if(ALFO)
+ {
+ switch(LFOWS)
+ {
+ case 0: LFO->table=ALFO_SAW; break;
+ case 1: LFO->table=ALFO_SQR; break;
+ case 2: LFO->table=ALFO_TRI; break;
+ case 3: LFO->table=ALFO_NOI; break;
+ }
+ LFO->scale=ASCALES[LFOS];
+ }
+ else
+ {
+ switch(LFOWS)
+ {
+ case 0: LFO->table=PLFO_SAW; break;
+ case 1: LFO->table=PLFO_SQR; break;
+ case 2: LFO->table=PLFO_TRI; break;
+ case 3: LFO->table=PLFO_NOI; break;
+ }
+ LFO->scale=PSCALES[LFOS];
+ }
+}