# HG changeset patch # User Michael Pavone # Date 1551478649 28800 # Node ID 8fe162bdb03890090d8c2708f9ec0fd49470fcd9 # Parent 63256371046fa742a34b2c42b524006b6b44984a# Parent 8a29c250f3523c3f85dd76f24c3bbd60cd050159 Merge from default diff -r 8a29c250f352 -r 8fe162bdb038 Makefile --- a/Makefile Mon Feb 25 21:22:14 2019 -0800 +++ b/Makefile Fri Mar 01 14:17:29 2019 -0800 @@ -39,7 +39,11 @@ FONT:=nuklear_ui/font_mac.o else ifdef USE_GLES +ifdef GLES_LIB +LIBS=sdl2 +else LIBS=sdl2 glesv2 +endif CFLAGS+= -DUSE_GLES else LIBS=sdl2 glew gl @@ -87,7 +91,7 @@ LDFLAGS:=-lm else CFLAGS:=$(shell pkg-config --cflags-only-I $(LIBS)) $(CFLAGS) -LDFLAGS:=-lm $(shell pkg-config --libs $(LIBS)) +LDFLAGS:=-lm $(shell pkg-config --libs $(LIBS)) $(GLES_LIB) endif #libblastem.so ifeq ($(OS),Darwin) @@ -148,15 +152,16 @@ endif endif -TRANSOBJS=gen.o backend.o $(MEM) arena.o tern.o -M68KOBJS=68kinst.o m68k_core.o +#TRANSOBJS=gen.o backend.o $(MEM) arena.o tern.o +TRANSOBJS=backend.o tern.o +M68KOBJS=68kinst.o m68k_core.o musashi/m68kops.o musashi/m68kcpu.o ifeq ($(CPU),x86_64) -M68KOBJS+= m68k_core_x86.o -TRANSOBJS+= gen_x86.o backend_x86.o +#M68KOBJS+= m68k_core_x86.o +#TRANSOBJS+= gen_x86.o backend_x86.o else ifeq ($(CPU),i686) -M68KOBJS+= m68k_core_x86.o -TRANSOBJS+= gen_x86.o backend_x86.o +#M68KOBJS+= m68k_core_x86.o +#TRANSOBJS+= gen_x86.o backend_x86.o endif endif @@ -164,7 +169,8 @@ Z80OBJS=z80.o z80inst.o CFLAGS+= -DNEW_CORE else -Z80OBJS=z80inst.o z80_to_x86.o +#Z80OBJS=z80inst.o z80_to_x86.o +Z80OBJS=z80inst.o mame_z80/z80.o endif AUDIOOBJS=ym2612.o psg.o wave.o CONFIGOBJS=config.o tern.o util.o paths.o @@ -177,8 +183,9 @@ RENDEROBJS+= $(LIBZOBJS) png.o endif -MAINOBJS=blastem.o system.o genesis.o debug.o gdb_remote.o vdp.o $(RENDEROBJS) io.o romdb.o hash.o menu.o xband.o \ - realtec.o i2c.o nor.o sega_mapper.o multi_game.o megawifi.o $(NET) serialize.o $(TERMINAL) $(CONFIGOBJS) gst.o \ +#MAINOBJS=blastem.o system.o genesis.o debug.o gdb_remote.o vdp.o $(RENDEROBJS) io.o romdb.o hash.o menu.o xband.o +MAINOBJS=blastem.o system.o genesis.o vdp.o $(RENDEROBJS) io.o romdb.o hash.o menu.o xband.o \ + realtec.o i2c.o nor.o sega_mapper.o multi_game.o megawifi.o $(NET) serialize.o $(TERMINAL) $(CONFIGOBJS) \ $(M68KOBJS) $(TRANSOBJS) $(AUDIOOBJS) saves.o zip.o bindings.o jcart.o LIBOBJS=libblastem.o system.o genesis.o debug.o gdb_remote.o vdp.o io.o romdb.o hash.o menu.o xband.o realtec.o \ @@ -199,7 +206,7 @@ CFLAGS+=-DX86_32 -m32 LDFLAGS+=-m32 else -$(error $(CPU) is not a supported architecture) +#$(error $(CPU) is not a supported architecture) endif endif diff -r 8a29c250f352 -r 8fe162bdb038 backend.c --- a/backend.c Mon Feb 25 21:22:14 2019 -0800 +++ b/backend.c Fri Mar 01 14:17:29 2019 -0800 @@ -6,6 +6,7 @@ #include "backend.h" #include +#ifdef USE_NATIVE deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest) { deferred_addr * new_head = malloc(sizeof(deferred_addr)); @@ -50,6 +51,7 @@ } } } +#endif memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum) { @@ -154,6 +156,38 @@ return 0xFFFF; } +void write_word(uint32_t address, uint16_t value, void **mem_pointers, cpu_options *opts, void *context) +{ + memmap_chunk const *chunk = find_map_chunk(address, opts, 0, NULL); + if (!chunk) { + return; + } + uint32_t offset = (address - chunk->start) & chunk->mask; + if (chunk->flags & MMAP_WRITE) { + uint8_t *base; + if (chunk->flags & MMAP_PTR_IDX) { + base = mem_pointers[chunk->ptr_index]; + } else { + base = chunk->buffer; + } + if (base) { + if ((chunk->flags & MMAP_ONLY_ODD) || (chunk->flags & MMAP_ONLY_EVEN)) { + offset /= 2; + if (chunk->flags & MMAP_ONLY_EVEN) { + value >>= 16; + } + base[offset] = value; + } else { + *(uint16_t *)(base + offset) = value; + } + return; + } + } + if ((!(chunk->flags & MMAP_WRITE) || (chunk->flags & MMAP_FUNC_NULL)) && chunk->write_16) { + chunk->write_16(offset, context, value); + } +} + uint8_t read_byte(uint32_t address, void **mem_pointers, cpu_options *opts, void *context) { memmap_chunk const *chunk = find_map_chunk(address, opts, 0, NULL); diff -r 8a29c250f352 -r 8fe162bdb038 backend.h --- a/backend.h Mon Feb 25 21:22:14 2019 -0800 +++ b/backend.h Fri Mar 01 14:17:29 2019 -0800 @@ -8,7 +8,16 @@ #include #include +#ifdef USE_NATIVE #include "gen.h" +#else +typedef uint8_t * code_ptr; +typedef struct { + code_ptr cur; + code_ptr last; + uint32_t stack_off; +} code_info; +#endif #define INVALID_OFFSET 0xFFFFFFFF #define EXTENSION_WORD 0xFFFFFFFE @@ -45,11 +54,14 @@ typedef struct { uint32_t flags; +#ifdef USE_NATIVE native_map_slot *native_code_map; deferred_addr *deferred; code_info code; uint8_t **ram_inst_sizes; +#endif memmap_chunk const *memmap; +#ifdef USE_NATIVE code_ptr save_context; code_ptr load_context; code_ptr handle_cycle_limit; @@ -57,27 +69,33 @@ code_ptr handle_code_write; code_ptr handle_align_error_write; code_ptr handle_align_error_read; +#endif system_str_fun_r8 debug_cmd_handler; uint32_t memmap_chunks; uint32_t address_mask; uint32_t max_address; uint32_t bus_cycles; uint32_t clock_divider; +#ifdef USE_NATIVE uint32_t move_pc_off; uint32_t move_pc_size; int32_t mem_ptr_off; int32_t ram_flags_off; uint8_t ram_flags_shift; +#endif uint8_t address_size; uint8_t byte_swap; +#ifdef USE_NATIVE int8_t context_reg; int8_t cycles; int8_t limit; int8_t scratch1; int8_t scratch2; uint8_t align_error_mask; +#endif } cpu_options; +#ifdef USE_NATIVE typedef uint8_t * (*native_addr_func)(void * context, uint32_t address); deferred_addr * defer_address(deferred_addr * old_head, uint32_t address, uint8_t *dest); @@ -94,9 +112,11 @@ void patch_for_retranslate(cpu_options *opts, code_ptr native_address, code_ptr handler); code_ptr gen_mem_fun(cpu_options * opts, memmap_chunk const * memmap, uint32_t num_chunks, ftype fun_type, code_ptr *after_inc); +#endif void * get_native_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts); void * get_native_write_pointer(uint32_t address, void ** mem_pointers, cpu_options * opts); uint16_t read_word(uint32_t address, void **mem_pointers, cpu_options *opts, void *context); +void write_word(uint32_t address, uint16_t value, void **mem_pointers, cpu_options *opts, void *context); uint8_t read_byte(uint32_t address, void **mem_pointers, cpu_options *opts, void *context); void write_byte(uint32_t address, uint8_t value, void **mem_pointers, cpu_options *opts, void *context); memmap_chunk const *find_map_chunk(uint32_t address, cpu_options *opts, uint16_t flags, uint32_t *size_sum); diff -r 8a29c250f352 -r 8fe162bdb038 blastcpm.c --- a/blastcpm.c Mon Feb 25 21:22:14 2019 -0800 +++ b/blastcpm.c Fri Mar 01 14:17:29 2019 -0800 @@ -8,7 +8,11 @@ #ifdef NEW_CORE #include "z80.h" #else +#ifdef USE_NATIVE #include "z80_to_x86.h" +#else +#include "mame_z80/z80.h" +#endif #endif #include "util.h" diff -r 8a29c250f352 -r 8fe162bdb038 blastem.c --- a/blastem.c Mon Feb 25 21:22:14 2019 -0800 +++ b/blastem.c Fri Mar 01 14:17:29 2019 -0800 @@ -14,7 +14,11 @@ #ifdef NEW_CORE #include "z80.h" #else +#ifdef USE_NATIVE #include "z80_to_x86.h" +#else +#include "mame_z80/z80.h" +#endif #endif #include "mem.h" #include "vdp.h" @@ -382,15 +386,19 @@ { if (game_system) { game_system->persist_save(game_system); +#ifdef USE_NATIVE //swap to game context arena and mark all allocated pages in it free if (current_system == menu_system) { current_system->arena = set_current_arena(game_system->arena); } mark_all_free(); +#endif game_system->free_context(game_system); +#ifdef USE_NATIVE } else if(current_system) { //start a new arena and save old one in suspended system context current_system->arena = start_new_arena(); +#endif } system_type stype = SYSTEM_UNKNOWN; if (!(cart.size = load_rom(path, &cart.buffer, &stype))) { @@ -457,11 +465,13 @@ debug_target = 1; } break; +#ifdef USE_NATIVE case 'D': gdb_remote_init(); dtype = DEBUGGER_GDB; start_in_debugger = 1; break; +#endif case 'f': fullscreen = !fullscreen; break; @@ -686,7 +696,9 @@ current_system->enter_debugger = start_in_debugger && menu == debug_target; current_system->start_context(current_system, statefile); } else if (menu && game_system) { +#ifdef USE_NATIVE current_system->arena = set_current_arena(game_system->arena); +#endif current_system = game_system; menu = 0; current_system->resume_context(current_system); @@ -696,7 +708,9 @@ ui_idle_loop(); #endif } else { +#ifdef USE_NATIVE current_system->arena = set_current_arena(menu_system->arena); +#endif current_system = menu_system; menu = 1; } diff -r 8a29c250f352 -r 8fe162bdb038 debug.h --- a/debug.h Mon Feb 25 21:22:14 2019 -0800 +++ b/debug.h Fri Mar 01 14:17:29 2019 -0800 @@ -6,7 +6,11 @@ #ifdef NEW_CORE #include "z80.h" #else +#ifdef USE_NATIVE #include "z80_to_x86.h" +#else +#include "mame_z80/z80.h" +#endif #endif typedef struct disp_def { diff -r 8a29c250f352 -r 8fe162bdb038 fib.s68 diff -r 8a29c250f352 -r 8fe162bdb038 gdb_remote.c --- a/gdb_remote.c Mon Feb 25 21:22:14 2019 -0800 +++ b/gdb_remote.c Fri Mar 01 14:17:29 2019 -0800 @@ -132,7 +132,7 @@ } } -uint8_t m68k_read_byte(m68k_context * context, uint32_t address) +static uint8_t m68k_read_byte(m68k_context * context, uint32_t address) { genesis_context *gen = context->system; @@ -150,7 +150,7 @@ return 0; } -void m68k_write_byte(m68k_context * context, uint32_t address, uint8_t value) +static void m68k_write_byte(m68k_context * context, uint32_t address, uint8_t value) { genesis_context *gen = context->system; //TODO: Use generated read/write functions so that memory map is properly respected diff -r 8a29c250f352 -r 8fe162bdb038 genesis.c --- a/genesis.c Mon Feb 25 21:22:14 2019 -0800 +++ b/genesis.c Fri Mar 01 14:17:29 2019 -0800 @@ -198,8 +198,10 @@ deserialize_buffer buffer; init_deserialize(&buffer, data, size); genesis_deserialize(&buffer, gen); +#ifdef USE_NATIVE //HACK: Fix this once PC/IR is represented in a better way in 68K core gen->m68k->resume_pc = get_native_address_trans(gen->m68k, gen->m68k->last_prefetch_address); +#endif } uint16_t read_dma_value(uint32_t address) @@ -346,7 +348,7 @@ static uint32_t last_frame_num; //My refresh emulation isn't currently good enough and causes more problems than it solves -#define REFRESH_EMULATION +//#define REFRESH_EMULATION #ifdef REFRESH_EMULATION #define REFRESH_INTERVAL 128 #define REFRESH_DELAY 2 @@ -427,6 +429,7 @@ if (gen->reset_cycle < context->target_cycle) { context->target_cycle = gen->reset_cycle; } +#ifdef USE_NATIVE if (address) { if (gen->header.enter_debugger) { gen->header.enter_debugger = 0; @@ -471,6 +474,7 @@ context->sync_cycle = context->current_cycle + 1; } } +#endif #ifdef REFRESH_EMULATION last_sync_cycle = context->current_cycle; #endif @@ -993,11 +997,21 @@ { z80_context * context = vcontext; genesis_context *gen = context->system; + if (gen->bus_busy) { +#if defined(USE_NATIVE) || defined(NEW_CORE) context->Z80_CYCLE = gen->m68k->current_cycle; +#else + context->m_icount = 0; +#endif } + //typical delay from bus arbitration +#if defined(USE_NATIVE) || defined(NEW_CORE) context->Z80_CYCLE += 3 * MCLKS_PER_Z80; +#else + context->m_icount -= 3; +#endif //TODO: add cycle for an access right after a previous one //TODO: Below cycle time is an estimate based on the time between 68K !BG goes low and Z80 !MREQ goes high // Needs a new logic analyzer capture to get the actual delay on the 68K side @@ -1021,10 +1035,18 @@ z80_context * context = vcontext; genesis_context *gen = context->system; if (gen->bus_busy) { +#if defined(USE_NATIVE) || defined(NEW_CORE) context->Z80_CYCLE = gen->m68k->current_cycle; +#else + context->m_icount = 0; +#endif } //typical delay from bus arbitration +#if defined(USE_NATIVE) || defined(NEW_CORE) context->Z80_CYCLE += 3 * MCLKS_PER_Z80; +#else + context->m_icount -= 3; +#endif //TODO: add cycle for an access right after a previous one //TODO: Below cycle time is an estimate based on the time between 68K !BG goes low and Z80 !MREQ goes high // Needs a new logic analyzer capture to get the actual delay on the 68K side @@ -1098,7 +1120,7 @@ char *statepath = get_slot_name(system, slot, "state"); deserialize_buffer state; uint32_t pc = 0; - uint8_t ret; + uint8_t ret = 0; if (!gen->m68k->resume_pc) { system->delayed_load_slot = slot + 1; gen->m68k->should_return = 1; @@ -1116,13 +1138,17 @@ pc = gen->m68k->last_prefetch_address; ret = 1; } else { +#ifdef USE_NATIVE strcpy(statepath + strlen(statepath)-strlen("state"), "gst"); pc = load_gst(gen, statepath); ret = pc != 0; +#endif } +#ifdef USE_NATIVE if (ret) { gen->m68k->resume_pc = get_native_address_trans(gen->m68k, pc); } +#endif done: free(statepath); return ret; @@ -1168,24 +1194,30 @@ //HACK pc = gen->m68k->last_prefetch_address; } else { +#ifdef USE_NATIVE pc = load_gst(gen, statefile); if (!pc) { fatal_error("Failed to load save state %s\n", statefile); } +#endif } printf("Loaded %s\n", statefile); +#ifdef USE_NATIVE if (gen->header.enter_debugger) { gen->header.enter_debugger = 0; insert_breakpoint(gen->m68k, pc, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); } +#endif adjust_int_cycle(gen->m68k, gen->vdp); start_68k_context(gen->m68k, pc); } else { +#ifdef USE_NATIVE if (gen->header.enter_debugger) { gen->header.enter_debugger = 0; uint32_t address = gen->cart[2] << 16 | gen->cart[3]; insert_breakpoint(gen->m68k, address, gen->header.debugger_type == DEBUGGER_NATIVE ? debugger : gdb_debug_enter); } +#endif m68k_reset(gen->m68k); } handle_reset_requests(gen); diff -r 8a29c250f352 -r 8fe162bdb038 genesis.h --- a/genesis.h Mon Feb 25 21:22:14 2019 -0800 +++ b/genesis.h Fri Mar 01 14:17:29 2019 -0800 @@ -12,7 +12,11 @@ #ifdef NEW_CORE #include "z80.h" #else +#ifdef USE_NATIVE #include "z80_to_x86.h" +#else +#include "mame_z80/z80.h" +#endif #endif #include "ym2612.h" #include "vdp.h" diff -r 8a29c250f352 -r 8fe162bdb038 m68k_core.c --- a/m68k_core.c Mon Feb 25 21:22:14 2019 -0800 +++ b/m68k_core.c Fri Mar 01 14:17:29 2019 -0800 @@ -4,19 +4,26 @@ BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. */ #include "m68k_core.h" +#ifdef USE_NATIVE #include "m68k_internal.h" +#endif #include "68kinst.h" #include "backend.h" +#ifdef USE_NATIVE #include "gen.h" +#endif #include "util.h" #include "serialize.h" +#ifndef USE_NATIVE +#include "musashi/m68kcpu.h" +#endif #include #include #include #include char disasm_buf[1024]; - +#ifdef USE_NATIVE int8_t native_reg(m68k_op_info * op, m68k_options * opts) { if (op->addr_mode == MODE_REG) { @@ -43,7 +50,7 @@ { return op->addr_mode == MODE_REG ? dreg_offset(op->params.regs.pri) : areg_offset(op->params.regs.pri); } - +#endif void m68k_print_regs(m68k_context * context) { printf("XNZVC\n%d%d%d%d%d\n", context->flags[0], context->flags[1], context->flags[2], context->flags[3], context->flags[4]); @@ -54,7 +61,7 @@ printf("a%d: %X\n", i, context->aregs[i]); } } - +#ifdef USE_NATIVE void m68k_read_size(m68k_options *opts, uint8_t size) { switch (size) @@ -763,6 +770,7 @@ uint32_t slot = meta_off/1024; return opts->gen.ram_inst_sizes[slot][(meta_off/2)%512]; } +#endif uint8_t m68k_is_terminal(m68kinst * inst) { @@ -771,6 +779,7 @@ || (inst->op == M68K_BCC && inst->extra.cond == COND_TRUE); } +#ifdef USE_NATIVE static void m68k_handle_deferred(m68k_context * context) { m68k_options * opts = context->options; @@ -779,9 +788,11 @@ translate_m68k_stream(opts->gen.deferred->address, context); } } +#endif uint16_t m68k_get_ir(m68k_context *context) { +#ifdef USE_NATIVE uint32_t inst_addr = get_instruction_start(context->options, context->last_prefetch_address-2); uint16_t *native_addr = get_native_pointer(inst_addr, (void **)context->mem_pointers, &context->options->gen); if (native_addr) { @@ -789,6 +800,9 @@ } fprintf(stderr, "M68K: Failed to calculate value of IR. Last prefetch address: %X\n", context->last_prefetch_address); return 0xFFFF; +#else + return ((m68000_base_device *)context)->ir; +#endif } static m68k_debug_handler find_breakpoint(m68k_context *context, uint32_t address) @@ -816,7 +830,9 @@ .handler = bp_handler, .address = address }; +#ifdef USE_NATIVE m68k_breakpoint_patch(context, address, bp_handler, NULL); +#endif } } @@ -834,6 +850,7 @@ return context; } +#ifdef USE_NATIVE typedef enum { RAW_FUNC = 1, BINARY_ARITH, @@ -1144,6 +1161,7 @@ } return ret; } +#endif void remove_breakpoint(m68k_context * context, uint32_t address) { @@ -1157,6 +1175,7 @@ break; } } +#ifdef USE_NATIVE code_ptr native = get_native_address(context->options, address); if (!native) { return; @@ -1166,35 +1185,59 @@ context->options->gen.code.last = native + MAX_NATIVE_SIZE; check_cycles_int(&context->options->gen, address); context->options->gen.code = tmp; +#endif } +m68k_context * sync_components(m68k_context * context, uint32_t address); void start_68k_context(m68k_context * context, uint32_t address) { + m68k_options * options = context->options; +#ifdef USE_NATIVE code_ptr addr = get_native_address_trans(context, address); - m68k_options * options = context->options; options->start_context(addr, context); +#else + while (!context->should_return) { + if (context->current_cycle >= context->target_cycle) { + context->target_cycle += 4 * options->gen.clock_divider; + } + m68k_cpu_execute((m68000_base_device *)context); + if (!context->should_return) { + sync_components(context, 0); + } + } +#endif } void resume_68k(m68k_context *context) { +#ifdef USE_NATIVE code_ptr addr = context->resume_pc; context->resume_pc = NULL; m68k_options * options = context->options; context->should_return = 0; options->start_context(addr, context); +#else + start_68k_context(context, 0); +#endif } void m68k_reset(m68k_context * context) { +#ifdef USE_NATIVE //TODO: Actually execute the M68K reset vector rather than simulating some of its behavior uint16_t *reset_vec = get_native_pointer(0, (void **)context->mem_pointers, &context->options->gen); context->aregs[7] = reset_vec[0] << 16 | reset_vec[1]; uint32_t address = reset_vec[2] << 16 | reset_vec[3]; +#else + m68k_reset_cpu((m68000_base_device *)context); + uint32_t address = 0; +#endif start_68k_context(context, address); } void m68k_options_free(m68k_options *opts) { +#ifdef USE_NATIVE for (uint32_t address = 0; address < opts->gen.address_mask; address += NATIVE_CHUNK_SIZE) { uint32_t chunk = address / NATIVE_CHUNK_SIZE; @@ -1210,16 +1253,39 @@ } free(opts->gen.ram_inst_sizes); free(opts->big_movem); +#endif free(opts); } +#ifndef USE_NATIVE +void init_m68k_opts(m68k_options * opts, memmap_chunk * memmap, uint32_t num_chunks, uint32_t clock_divider) +{ + memset(opts, 0, sizeof(*opts)); + opts->gen.memmap = memmap; + opts->gen.memmap_chunks = num_chunks; + opts->gen.address_mask = 0xFFFFFF; + opts->gen.byte_swap = 1; + opts->gen.max_address = 0x1000000; + opts->gen.bus_cycles = 4; + opts->gen.clock_divider = clock_divider; +} +#endif m68k_context * init_68k_context(m68k_options * opts, m68k_reset_handler reset_handler) { +#ifdef USE_NATIVE size_t ctx_size = sizeof(m68k_context) + ram_size(&opts->gen) / (1 << opts->gen.ram_flags_shift) / 8; m68k_context * context = malloc(ctx_size); memset(context, 0, ctx_size); context->options = opts; +#else + m68000_base_device *device = malloc(sizeof(m68000_base_device));; + memset(device, 0, sizeof(m68000_base_device)); + m68k_context *context = &device->c; + context->options = opts; + m68k_init_cpu_m68000(device); + +#endif context->int_cycle = CYCLE_NEVER; context->status = 0x27; context->reset_handler = (code_ptr)reset_handler; diff -r 8a29c250f352 -r 8fe162bdb038 m68k_core.h --- a/m68k_core.h Mon Feb 25 21:22:14 2019 -0800 +++ b/m68k_core.h Fri Mar 01 14:17:29 2019 -0800 @@ -36,11 +36,13 @@ typedef struct { cpu_options gen; - +#ifdef USE_NATIVE int8_t dregs[8]; int8_t aregs[8]; int8_t flag_regs[5]; +#endif FILE *address_log; +#ifdef USE_NATIVE code_ptr read_16; code_ptr write_16; code_ptr read_8; @@ -64,6 +66,7 @@ uint32_t num_movem; uint32_t movem_storage; code_word prologue_start; +#endif } m68k_options; typedef struct m68k_context m68k_context; @@ -112,11 +115,16 @@ void m68k_options_free(m68k_options *opts); void insert_breakpoint(m68k_context * context, uint32_t address, m68k_debug_handler bp_handler); void remove_breakpoint(m68k_context * context, uint32_t address); -m68k_context * m68k_handle_code_write(uint32_t address, m68k_context * context); uint32_t get_instruction_start(m68k_options *opts, uint32_t address); uint16_t m68k_get_ir(m68k_context *context); void m68k_print_regs(m68k_context * context); +#ifdef USE_NATIVE +m68k_context * m68k_handle_code_write(uint32_t address, m68k_context * context); void m68k_invalidate_code_range(m68k_context *context, uint32_t start, uint32_t end); +#else +#define m68k_handle_code_write(A, M) +#define m68k_invalidate_code_range(M, S, E) +#endif void m68k_serialize(m68k_context *context, uint32_t pc, serialize_buffer *buf); void m68k_deserialize(deserialize_buffer *buf, void *vcontext); diff -r 8a29c250f352 -r 8fe162bdb038 mame_z80/z80.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mame_z80/z80.c Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,3642 @@ +// license:BSD-3-Clause +// copyright-holders:Juergen Buchmueller +/***************************************************************************** + * + * z80.c + * Portable Z80 emulator V3.9 + * + * TODO: + * - Interrupt mode 0 should be able to execute arbitrary opcodes + * - If LD A,I or LD A,R is interrupted, P/V flag gets reset, even if IFF2 + * was set before this instruction (implemented, but not enabled: we need + * document Z80 types first, see below) + * - WAIT only stalls between instructions now, it should stall immediately. + * - Ideally, the tiny differences between Z80 types should be supported, + * currently known differences: + * - LD A,I/R P/V flag reset glitch is fixed on CMOS Z80 + * - OUT (C),0 outputs 0 on NMOS Z80, $FF on CMOS Z80 + * - SCF/CCF X/Y flags is ((flags | A) & 0x28) on SGS/SHARP/ZiLOG NMOS Z80, + * (flags & A & 0x28) on NEC NMOS Z80, other models unknown. + * However, people from the Speccy scene mention that SCF/CCF X/Y results + * are inconsistant and may be influenced by I and R registers. + * This Z80 emulator assumes a ZiLOG NMOS model. + * + * Changes in 3.9: + * - Fixed cycle counts for LD IYL/IXL/IYH/IXH,n [Marshmellow] + * - Fixed X/Y flags in CCF/SCF/BIT, ZEXALL is happy now [hap] + * - Simplified DAA, renamed MEMPTR (3.8) to WZ, added TODO [hap] + * - Fixed IM2 interrupt cycles [eke] + * Changes in 3.8 [Miodrag Milanovic]: + * - Added MEMPTR register (according to informations provided + * by Vladimir Kladov + * - BIT n,(HL) now return valid values due to use of MEMPTR + * - Fixed BIT 6,(XY+o) undocumented instructions + * Changes in 3.7 [Aaron Giles]: + * - Changed NMI handling. NMIs are now latched in set_irq_state + * but are not taken there. Instead they are taken at the start of the + * execute loop. + * - Changed IRQ handling. IRQ state is set in set_irq_state but not taken + * except during the inner execute loop. + * - Removed x86 assembly hacks and obsolete timing loop catchers. + * Changes in 3.6: + * - Got rid of the code that would inexactly emulate a Z80, i.e. removed + * all the #if Z80_EXACT #else branches. + * - Removed leading underscores from local register name shortcuts as + * this violates the C99 standard. + * - Renamed the registers inside the Z80 context to lower case to avoid + * ambiguities (shortcuts would have had the same names as the fields + * of the structure). + * Changes in 3.5: + * - Implemented OTIR, INIR, etc. without look-up table for PF flag. + * [Ramsoft, Sean Young] + * Changes in 3.4: + * - Removed Z80-MSX specific code as it's not needed any more. + * - Implemented DAA without look-up table [Ramsoft, Sean Young] + * Changes in 3.3: + * - Fixed undocumented flags XF & YF in the non-asm versions of CP, + * and all the 16 bit arithmetic instructions. [Sean Young] + * Changes in 3.2: + * - Fixed undocumented flags XF & YF of RRCA, and CF and HF of + * INI/IND/OUTI/OUTD/INIR/INDR/OTIR/OTDR [Sean Young] + * Changes in 3.1: + * - removed the REPEAT_AT_ONCE execution of LDIR/CPIR etc. opcodes + * for readabilities sake and because the implementation was buggy + * (and i was not able to find the difference) + * Changes in 3.0: + * - 'finished' switch to dynamically overrideable cycle count tables + * Changes in 2.9: + * - added methods to access and override the cycle count tables + * - fixed handling and timing of multiple DD/FD prefixed opcodes + * Changes in 2.8: + * - OUTI/OUTD/OTIR/OTDR also pre-decrement the B register now. + * This was wrong because of a bug fix on the wrong side + * (astrocade sound driver). + * Changes in 2.7: + * - removed z80_vm specific code, it's not needed (and never was). + * Changes in 2.6: + * - BUSY_LOOP_HACKS needed to call change_pc() earlier, before + * checking the opcodes at the new address, because otherwise they + * might access the old (wrong or even nullptr) banked memory region. + * Thanks to Sean Young for finding this nasty bug. + * Changes in 2.5: + * - Burning cycles always adjusts the ICount by a multiple of 4. + * - In REPEAT_AT_ONCE cases the r register wasn't incremented twice + * per repetition as it should have been. Those repeated opcodes + * could also underflow the ICount. + * - Simplified TIME_LOOP_HACKS for BC and added two more for DE + HL + * timing loops. i think those hacks weren't endian safe before too. + * Changes in 2.4: + * - z80_reset zaps the entire context, sets IX and IY to 0xffff(!) and + * sets the Z flag. With these changes the Tehkan World Cup driver + * _seems_ to work again. + * Changes in 2.3: + * - External termination of the execution loop calls z80_burn() and + * z80_vm_burn() to burn an amount of cycles (r adjustment) + * - Shortcuts which burn CPU cycles (BUSY_LOOP_HACKS and TIME_LOOP_HACKS) + * now also adjust the r register depending on the skipped opcodes. + * Changes in 2.2: + * - Fixed bugs in CPL, SCF and CCF instructions flag handling. + * - Changed variable ea and arg16() function to uint32_t; this + * produces slightly more efficient code. + * - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E + * are changed to calls to the X6/XE opcodes to reduce object size. + * They're hardly ever used so this should not yield a speed penalty. + * New in 2.0: + * - Optional more exact Z80 emulation (#define Z80_EXACT 1) according + * to a detailed description by Sean Young which can be found at: + * http://www.msxnet.org/tech/z80-documented.pdf + *****************************************************************************/ + +#include "z80.h" +#include "../util.h" +#include +#include +#include + +#define VERBOSE 0 + +/* On an NMOS Z80, if LD A,I or LD A,R is interrupted, P/V flag gets reset, + even if IFF2 was set before this instruction. This issue was fixed on + the CMOS Z80, so until knowing (most) Z80 types on hardware, it's disabled */ +#define HAS_LDAIR_QUIRK 0 + +#define LOG(x) do { if (VERBOSE) warning x; } while (0) + + +/****************************************************************************/ +/* The Z80 registers. halt is set to 1 when the CPU is halted, the refresh */ +/* register is calculated as follows: refresh=(r&127)|(r2&128) */ +/****************************************************************************/ + +#define CF 0x01 +#define NF 0x02 +#define PF 0x04 +#define VF PF +#define XF 0x08 +#define HF 0x10 +#define YF 0x20 +#define ZF 0x40 +#define SF 0x80 + +#define INT_IRQ 0x01 +#define NMI_IRQ 0x02 + +#define PRVPC z80->m_prvpc.d /* previous program counter */ + +#define PCD z80->m_pc.d +#define PC z80->m_pc.w.l + +#define SPD z80->m_sp.d +#define SP z80->m_sp.w.l + +#define AFD z80->m_af.d +#define AF z80->m_af.w.l +#define A z80->m_af.b.h +#define F z80->m_af.b.l + +#define BCD z80->m_bc.d +#define BC z80->m_bc.w.l +#define B z80->m_bc.b.h +#define C z80->m_bc.b.l + +#define DED z80->m_de.d +#define DE z80->m_de.w.l +#define D z80->m_de.b.h +#define E z80->m_de.b.l + +#define HLD z80->m_hl.d +#define HL z80->m_hl.w.l +#define H z80->m_hl.b.h +#define L z80->m_hl.b.l + +#define IXD z80->m_ix.d +#define IX z80->m_ix.w.l +#define HX z80->m_ix.b.h +#define LX z80->m_ix.b.l + +#define IYD z80->m_iy.d +#define IY z80->m_iy.w.l +#define HY z80->m_iy.b.h +#define LY z80->m_iy.b.l + +#define WZ z80->m_wz.w.l +#define WZ_H z80->m_wz.b.h +#define WZ_L z80->m_wz.b.l + + +static uint8_t tables_initialised = 0; +static uint8_t SZ[256]; /* zero and sign flags */ +static uint8_t SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */ +static uint8_t SZP[256]; /* zero, sign and parity flags */ +static uint8_t SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */ +static uint8_t SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */ + +static uint8_t SZHVC_add[2*256*256]; +static uint8_t SZHVC_sub[2*256*256]; + +static const uint8_t cc_op[0x100] = { + 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4, + 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4, + 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4, + 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4, + 5,10,10,10,10,11, 7,11, 5,10,10, 0,10,17, 7,11, /* cb -> cc_cb */ + 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 0, 7,11, /* dd -> cc_xy */ + 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 0, 7,11, /* ed -> cc_ed */ + 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 0, 7,11 /* fd -> cc_xy */ +}; + +static const uint8_t cc_cb[0x100] = { + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8, + 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8 +}; + +static const uint8_t cc_ed[0x100] = { + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9, +12,12,15,20, 8,14, 8, 9,12,12,15,20, 8,14, 8, 9, +12,12,15,20, 8,14, 8,18,12,12,15,20, 8,14, 8,18, +12,12,15,20, 8,14, 8, 8,12,12,15,20, 8,14, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, +16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8, +16,16,16,16, 8, 8, 8, 8,16,16,16,16, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 +}; + +/* ix/iy: with the exception of (i+offset) opcodes, t-states are main_opcode_table + 4 */ +static const uint8_t cc_xy[0x100] = { + 4+4,10+4, 7+4, 6+4, 4+4, 4+4, 7+4, 4+4, 4+4,11+4, 7+4, 6+4, 4+4, 4+4, 7+4, 4+4, + 8+4,10+4, 7+4, 6+4, 4+4, 4+4, 7+4, 4+4,12+4,11+4, 7+4, 6+4, 4+4, 4+4, 7+4, 4+4, + 7+4,10+4,16+4, 6+4, 4+4, 4+4, 7+4, 4+4, 7+4,11+4,16+4, 6+4, 4+4, 4+4, 7+4, 4+4, + 7+4,10+4,13+4, 6+4,23 ,23 ,19 , 4+4, 7+4,11+4,13+4, 6+4, 4+4, 4+4, 7+4, 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, +19 ,19 ,19 ,19 ,19 ,19 , 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, 4+4, 4+4, 4+4, 4+4, 4+4, 4+4,19 , 4+4, + 5+4,10+4,10+4,10+4,10+4,11+4, 7+4,11+4, 5+4,10+4,10+4, 0 ,10+4,17+4, 7+4,11+4, /* cb -> cc_xycb */ + 5+4,10+4,10+4,11+4,10+4,11+4, 7+4,11+4, 5+4, 4+4,10+4,11+4,10+4, 4 , 7+4,11+4, /* dd -> cc_xy again */ + 5+4,10+4,10+4,19+4,10+4,11+4, 7+4,11+4, 5+4, 4+4,10+4, 4+4,10+4, 4 , 7+4,11+4, /* ed -> cc_ed */ + 5+4,10+4,10+4, 4+4,10+4,11+4, 7+4,11+4, 5+4, 6+4,10+4, 4+4,10+4, 4 , 7+4,11+4 /* fd -> cc_xy again */ +}; + +static const uint8_t cc_xycb[0x100] = { +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23, +23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23 +}; + +/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */ +static const uint8_t cc_ex[0x100] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */ + 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */ + 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */ + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2, + 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2 +}; + +#define m_cc_dd m_cc_xy +#define m_cc_fd m_cc_xy + +/*************************************************************** + * define an opcode function + ***************************************************************/ +#define OP(prefix,opcode) static inline void prefix##_##opcode(z80_device *z80) + +/*************************************************************** + * adjust cycle count by n T-states + ***************************************************************/ +#define CC(prefix,opcode) do { z80->m_icount -= z80->m_cc_##prefix[opcode]; } while (0) + +#define EXEC(prefix,opcode) do { \ + unsigned op = opcode; \ + CC(prefix,op); \ + switch(op) \ + { \ + case 0x00:prefix##_##00(z80);break; case 0x01:prefix##_##01(z80);break; case 0x02:prefix##_##02(z80);break; case 0x03:prefix##_##03(z80);break; \ + case 0x04:prefix##_##04(z80);break; case 0x05:prefix##_##05(z80);break; case 0x06:prefix##_##06(z80);break; case 0x07:prefix##_##07(z80);break; \ + case 0x08:prefix##_##08(z80);break; case 0x09:prefix##_##09(z80);break; case 0x0a:prefix##_##0a(z80);break; case 0x0b:prefix##_##0b(z80);break; \ + case 0x0c:prefix##_##0c(z80);break; case 0x0d:prefix##_##0d(z80);break; case 0x0e:prefix##_##0e(z80);break; case 0x0f:prefix##_##0f(z80);break; \ + case 0x10:prefix##_##10(z80);break; case 0x11:prefix##_##11(z80);break; case 0x12:prefix##_##12(z80);break; case 0x13:prefix##_##13(z80);break; \ + case 0x14:prefix##_##14(z80);break; case 0x15:prefix##_##15(z80);break; case 0x16:prefix##_##16(z80);break; case 0x17:prefix##_##17(z80);break; \ + case 0x18:prefix##_##18(z80);break; case 0x19:prefix##_##19(z80);break; case 0x1a:prefix##_##1a(z80);break; case 0x1b:prefix##_##1b(z80);break; \ + case 0x1c:prefix##_##1c(z80);break; case 0x1d:prefix##_##1d(z80);break; case 0x1e:prefix##_##1e(z80);break; case 0x1f:prefix##_##1f(z80);break; \ + case 0x20:prefix##_##20(z80);break; case 0x21:prefix##_##21(z80);break; case 0x22:prefix##_##22(z80);break; case 0x23:prefix##_##23(z80);break; \ + case 0x24:prefix##_##24(z80);break; case 0x25:prefix##_##25(z80);break; case 0x26:prefix##_##26(z80);break; case 0x27:prefix##_##27(z80);break; \ + case 0x28:prefix##_##28(z80);break; case 0x29:prefix##_##29(z80);break; case 0x2a:prefix##_##2a(z80);break; case 0x2b:prefix##_##2b(z80);break; \ + case 0x2c:prefix##_##2c(z80);break; case 0x2d:prefix##_##2d(z80);break; case 0x2e:prefix##_##2e(z80);break; case 0x2f:prefix##_##2f(z80);break; \ + case 0x30:prefix##_##30(z80);break; case 0x31:prefix##_##31(z80);break; case 0x32:prefix##_##32(z80);break; case 0x33:prefix##_##33(z80);break; \ + case 0x34:prefix##_##34(z80);break; case 0x35:prefix##_##35(z80);break; case 0x36:prefix##_##36(z80);break; case 0x37:prefix##_##37(z80);break; \ + case 0x38:prefix##_##38(z80);break; case 0x39:prefix##_##39(z80);break; case 0x3a:prefix##_##3a(z80);break; case 0x3b:prefix##_##3b(z80);break; \ + case 0x3c:prefix##_##3c(z80);break; case 0x3d:prefix##_##3d(z80);break; case 0x3e:prefix##_##3e(z80);break; case 0x3f:prefix##_##3f(z80);break; \ + case 0x40:prefix##_##40(z80);break; case 0x41:prefix##_##41(z80);break; case 0x42:prefix##_##42(z80);break; case 0x43:prefix##_##43(z80);break; \ + case 0x44:prefix##_##44(z80);break; case 0x45:prefix##_##45(z80);break; case 0x46:prefix##_##46(z80);break; case 0x47:prefix##_##47(z80);break; \ + case 0x48:prefix##_##48(z80);break; case 0x49:prefix##_##49(z80);break; case 0x4a:prefix##_##4a(z80);break; case 0x4b:prefix##_##4b(z80);break; \ + case 0x4c:prefix##_##4c(z80);break; case 0x4d:prefix##_##4d(z80);break; case 0x4e:prefix##_##4e(z80);break; case 0x4f:prefix##_##4f(z80);break; \ + case 0x50:prefix##_##50(z80);break; case 0x51:prefix##_##51(z80);break; case 0x52:prefix##_##52(z80);break; case 0x53:prefix##_##53(z80);break; \ + case 0x54:prefix##_##54(z80);break; case 0x55:prefix##_##55(z80);break; case 0x56:prefix##_##56(z80);break; case 0x57:prefix##_##57(z80);break; \ + case 0x58:prefix##_##58(z80);break; case 0x59:prefix##_##59(z80);break; case 0x5a:prefix##_##5a(z80);break; case 0x5b:prefix##_##5b(z80);break; \ + case 0x5c:prefix##_##5c(z80);break; case 0x5d:prefix##_##5d(z80);break; case 0x5e:prefix##_##5e(z80);break; case 0x5f:prefix##_##5f(z80);break; \ + case 0x60:prefix##_##60(z80);break; case 0x61:prefix##_##61(z80);break; case 0x62:prefix##_##62(z80);break; case 0x63:prefix##_##63(z80);break; \ + case 0x64:prefix##_##64(z80);break; case 0x65:prefix##_##65(z80);break; case 0x66:prefix##_##66(z80);break; case 0x67:prefix##_##67(z80);break; \ + case 0x68:prefix##_##68(z80);break; case 0x69:prefix##_##69(z80);break; case 0x6a:prefix##_##6a(z80);break; case 0x6b:prefix##_##6b(z80);break; \ + case 0x6c:prefix##_##6c(z80);break; case 0x6d:prefix##_##6d(z80);break; case 0x6e:prefix##_##6e(z80);break; case 0x6f:prefix##_##6f(z80);break; \ + case 0x70:prefix##_##70(z80);break; case 0x71:prefix##_##71(z80);break; case 0x72:prefix##_##72(z80);break; case 0x73:prefix##_##73(z80);break; \ + case 0x74:prefix##_##74(z80);break; case 0x75:prefix##_##75(z80);break; case 0x76:prefix##_##76(z80);break; case 0x77:prefix##_##77(z80);break; \ + case 0x78:prefix##_##78(z80);break; case 0x79:prefix##_##79(z80);break; case 0x7a:prefix##_##7a(z80);break; case 0x7b:prefix##_##7b(z80);break; \ + case 0x7c:prefix##_##7c(z80);break; case 0x7d:prefix##_##7d(z80);break; case 0x7e:prefix##_##7e(z80);break; case 0x7f:prefix##_##7f(z80);break; \ + case 0x80:prefix##_##80(z80);break; case 0x81:prefix##_##81(z80);break; case 0x82:prefix##_##82(z80);break; case 0x83:prefix##_##83(z80);break; \ + case 0x84:prefix##_##84(z80);break; case 0x85:prefix##_##85(z80);break; case 0x86:prefix##_##86(z80);break; case 0x87:prefix##_##87(z80);break; \ + case 0x88:prefix##_##88(z80);break; case 0x89:prefix##_##89(z80);break; case 0x8a:prefix##_##8a(z80);break; case 0x8b:prefix##_##8b(z80);break; \ + case 0x8c:prefix##_##8c(z80);break; case 0x8d:prefix##_##8d(z80);break; case 0x8e:prefix##_##8e(z80);break; case 0x8f:prefix##_##8f(z80);break; \ + case 0x90:prefix##_##90(z80);break; case 0x91:prefix##_##91(z80);break; case 0x92:prefix##_##92(z80);break; case 0x93:prefix##_##93(z80);break; \ + case 0x94:prefix##_##94(z80);break; case 0x95:prefix##_##95(z80);break; case 0x96:prefix##_##96(z80);break; case 0x97:prefix##_##97(z80);break; \ + case 0x98:prefix##_##98(z80);break; case 0x99:prefix##_##99(z80);break; case 0x9a:prefix##_##9a(z80);break; case 0x9b:prefix##_##9b(z80);break; \ + case 0x9c:prefix##_##9c(z80);break; case 0x9d:prefix##_##9d(z80);break; case 0x9e:prefix##_##9e(z80);break; case 0x9f:prefix##_##9f(z80);break; \ + case 0xa0:prefix##_##a0(z80);break; case 0xa1:prefix##_##a1(z80);break; case 0xa2:prefix##_##a2(z80);break; case 0xa3:prefix##_##a3(z80);break; \ + case 0xa4:prefix##_##a4(z80);break; case 0xa5:prefix##_##a5(z80);break; case 0xa6:prefix##_##a6(z80);break; case 0xa7:prefix##_##a7(z80);break; \ + case 0xa8:prefix##_##a8(z80);break; case 0xa9:prefix##_##a9(z80);break; case 0xaa:prefix##_##aa(z80);break; case 0xab:prefix##_##ab(z80);break; \ + case 0xac:prefix##_##ac(z80);break; case 0xad:prefix##_##ad(z80);break; case 0xae:prefix##_##ae(z80);break; case 0xaf:prefix##_##af(z80);break; \ + case 0xb0:prefix##_##b0(z80);break; case 0xb1:prefix##_##b1(z80);break; case 0xb2:prefix##_##b2(z80);break; case 0xb3:prefix##_##b3(z80);break; \ + case 0xb4:prefix##_##b4(z80);break; case 0xb5:prefix##_##b5(z80);break; case 0xb6:prefix##_##b6(z80);break; case 0xb7:prefix##_##b7(z80);break; \ + case 0xb8:prefix##_##b8(z80);break; case 0xb9:prefix##_##b9(z80);break; case 0xba:prefix##_##ba(z80);break; case 0xbb:prefix##_##bb(z80);break; \ + case 0xbc:prefix##_##bc(z80);break; case 0xbd:prefix##_##bd(z80);break; case 0xbe:prefix##_##be(z80);break; case 0xbf:prefix##_##bf(z80);break; \ + case 0xc0:prefix##_##c0(z80);break; case 0xc1:prefix##_##c1(z80);break; case 0xc2:prefix##_##c2(z80);break; case 0xc3:prefix##_##c3(z80);break; \ + case 0xc4:prefix##_##c4(z80);break; case 0xc5:prefix##_##c5(z80);break; case 0xc6:prefix##_##c6(z80);break; case 0xc7:prefix##_##c7(z80);break; \ + case 0xc8:prefix##_##c8(z80);break; case 0xc9:prefix##_##c9(z80);break; case 0xca:prefix##_##ca(z80);break; case 0xcb:prefix##_##cb(z80);break; \ + case 0xcc:prefix##_##cc(z80);break; case 0xcd:prefix##_##cd(z80);break; case 0xce:prefix##_##ce(z80);break; case 0xcf:prefix##_##cf(z80);break; \ + case 0xd0:prefix##_##d0(z80);break; case 0xd1:prefix##_##d1(z80);break; case 0xd2:prefix##_##d2(z80);break; case 0xd3:prefix##_##d3(z80);break; \ + case 0xd4:prefix##_##d4(z80);break; case 0xd5:prefix##_##d5(z80);break; case 0xd6:prefix##_##d6(z80);break; case 0xd7:prefix##_##d7(z80);break; \ + case 0xd8:prefix##_##d8(z80);break; case 0xd9:prefix##_##d9(z80);break; case 0xda:prefix##_##da(z80);break; case 0xdb:prefix##_##db(z80);break; \ + case 0xdc:prefix##_##dc(z80);break; case 0xdd:prefix##_##dd(z80);break; case 0xde:prefix##_##de(z80);break; case 0xdf:prefix##_##df(z80);break; \ + case 0xe0:prefix##_##e0(z80);break; case 0xe1:prefix##_##e1(z80);break; case 0xe2:prefix##_##e2(z80);break; case 0xe3:prefix##_##e3(z80);break; \ + case 0xe4:prefix##_##e4(z80);break; case 0xe5:prefix##_##e5(z80);break; case 0xe6:prefix##_##e6(z80);break; case 0xe7:prefix##_##e7(z80);break; \ + case 0xe8:prefix##_##e8(z80);break; case 0xe9:prefix##_##e9(z80);break; case 0xea:prefix##_##ea(z80);break; case 0xeb:prefix##_##eb(z80);break; \ + case 0xec:prefix##_##ec(z80);break; case 0xed:prefix##_##ed(z80);break; case 0xee:prefix##_##ee(z80);break; case 0xef:prefix##_##ef(z80);break; \ + case 0xf0:prefix##_##f0(z80);break; case 0xf1:prefix##_##f1(z80);break; case 0xf2:prefix##_##f2(z80);break; case 0xf3:prefix##_##f3(z80);break; \ + case 0xf4:prefix##_##f4(z80);break; case 0xf5:prefix##_##f5(z80);break; case 0xf6:prefix##_##f6(z80);break; case 0xf7:prefix##_##f7(z80);break; \ + case 0xf8:prefix##_##f8(z80);break; case 0xf9:prefix##_##f9(z80);break; case 0xfa:prefix##_##fa(z80);break; case 0xfb:prefix##_##fb(z80);break; \ + case 0xfc:prefix##_##fc(z80);break; case 0xfd:prefix##_##fd(z80);break; case 0xfe:prefix##_##fe(z80);break; case 0xff:prefix##_##ff(z80);break; \ + } \ +} while (0) + +/*************************************************************** + * Enter halt state; write 1 to fake port on first execution + ***************************************************************/ +static inline void halt(z80_device *z80) +{ + PC--; + z80->m_halt = 1; +} + +/*************************************************************** + * Leave halt state; write 0 to fake port + ***************************************************************/ +static inline void leave_halt(z80_device *z80) +{ + if( z80->m_halt ) + { + z80->m_halt = 0; + PC++; + } +} + +/*************************************************************** + * Input a byte from given I/O port + ***************************************************************/ +static inline uint8_t in(z80_device *z80, uint16_t port) +{ + memmap_chunk const *map_tmp = z80->options->gen.memmap; + uint32_t chunks_tmp = z80->options->gen.memmap_chunks; + uint32_t mask_tmp = z80->options->gen.address_mask; + z80->options->gen.memmap = z80->options->iomap; + z80->options->gen.memmap_chunks = z80->options->io_chunks; + z80->options->gen.address_mask = z80->options->io_address_mask; + uint8_t value = read_byte(port, (void **)z80->mem_pointers, &z80->options->gen, z80); + z80->options->gen.memmap = map_tmp; + z80->options->gen.memmap_chunks = chunks_tmp; + z80->options->gen.address_mask = mask_tmp; + return value; +} + +/*************************************************************** + * Output a byte to given I/O port + ***************************************************************/ +static inline void out(z80_device *z80, uint16_t port, uint8_t value) +{ + memmap_chunk const *map_tmp = z80->options->gen.memmap; + uint32_t chunks_tmp = z80->options->gen.memmap_chunks; + z80->options->gen.memmap = z80->options->iomap; + z80->options->gen.memmap_chunks = z80->options->io_chunks; + write_byte(port & z80->options->io_address_mask, value, (void **)z80->mem_pointers, &z80->options->gen, z80); + z80->options->gen.memmap = map_tmp; + z80->options->gen.memmap_chunks = chunks_tmp; +} + +/*************************************************************** + * Read a byte from given memory location + ***************************************************************/ +static inline uint8_t rm(z80_device *z80, uint16_t addr) +{ + uint16_t index = addr >> 13; + if (z80->read_pointers[index]) { + return z80->read_pointers[index][addr & 0x1FFF]; + } + return read_byte(addr, (void **)z80->mem_pointers, &z80->options->gen, z80); +} + +/*************************************************************** + * Read a word from given memory location + ***************************************************************/ +static inline void rm16(z80_device *z80, uint16_t addr, PAIR *r) +{ + r->b.l = rm(z80, addr); + r->b.h = rm(z80, (addr+1)); +} + +/*************************************************************** + * Write a byte to given memory location + ***************************************************************/ +static inline void wm(z80_device *z80, uint16_t addr, uint8_t value) +{ + uint16_t index = addr >> 13; + if (z80->write_pointers[index]) { + z80->write_pointers[index][addr & 0x1FFF] = value; + return; + } + write_byte(addr, value, (void **)z80->mem_pointers, &z80->options->gen, z80); +} + +/*************************************************************** + * Write a word to given memory location + ***************************************************************/ +static inline void wm16(z80_device *z80, uint16_t addr, PAIR *r) +{ + wm(z80, addr, r->b.l); + wm(z80, (addr+1), r->b.h); +} + +/*************************************************************** + * rop() is identical to rm() except it is used for + * reading opcodes. In case of system with memory mapped I/O, + * this function can be used to greatly speed up emulation + ***************************************************************/ +static inline uint8_t rop(z80_device *z80) +{ + unsigned pc = PCD; + PC++; + return rm(z80, pc); +} + +/**************************************************************** + * arg(z80) is identical to rop() except it is used + * for reading opcode arguments. This difference can be used to + * support systems that use different encoding mechanisms for + * opcodes and opcode arguments + ***************************************************************/ +#define arg(Z) rop(Z) + +static inline uint16_t arg16(z80_device *z80) +{ + unsigned pc = PCD; + PC += 2; + return rm(z80, pc) | (rm(z80, (pc+1)&0xffff) << 8); +} + +/*************************************************************** + * Calculate the effective address EA of an opcode using + * IX+offset resp. IY+offset addressing. + ***************************************************************/ +static inline void eax(z80_device *z80) +{ + z80->m_ea = (uint32_t)(uint16_t)(IX + (int8_t)arg(z80)); + WZ = z80->m_ea; +} + +static inline void eay(z80_device *z80) +{ + z80->m_ea = (uint32_t)(uint16_t)(IY + (int8_t)arg(z80)); + WZ = z80->m_ea; +} + +/*************************************************************** + * POP + ***************************************************************/ +static inline void pop(z80_device *z80, PAIR *r) +{ + rm16(z80, SPD, r); + SP += 2; +} + +/*************************************************************** + * PUSH + ***************************************************************/ +static inline void push(z80_device *z80, PAIR *r) +{ + SP -= 2; + wm16(z80, SPD, r); +} + +/*************************************************************** + * JP + ***************************************************************/ +static inline void jp(z80_device *z80) +{ + PCD = arg16(z80); + WZ = PCD; +} + +/*************************************************************** + * JP_COND + ***************************************************************/ +static inline void jp_cond(z80_device *z80, uint8_t cond) +{ + if (cond) + { + PCD = arg16(z80); + WZ = PCD; + } + else + { + WZ = arg16(z80); /* implicit do PC += 2 */ + } +} + +/*************************************************************** + * JR + ***************************************************************/ +static inline void jr(z80_device *z80) +{ + int8_t a = (int8_t)arg(z80); /* arg(z80) also increments PC */ + PC += a; /* so don't do PC += arg(z80) */ + WZ = PC; +} + +/*************************************************************** + * JR_COND + ***************************************************************/ +static inline void jr_cond(z80_device *z80, uint8_t cond, uint8_t opcode) +{ + if (cond) + { + jr(z80); + CC(ex, opcode); + } + else + PC++; +} + +/*************************************************************** + * CALL + ***************************************************************/ +static inline void call(z80_device *z80) +{ + z80->m_ea = arg16(z80); + WZ = z80->m_ea; + push(z80, &z80->m_pc); + PCD = z80->m_ea; +} + +/*************************************************************** + * CALL_COND + ***************************************************************/ +static inline void call_cond(z80_device *z80, uint8_t cond, uint8_t opcode) +{ + if (cond) + { + z80->m_ea = arg16(z80); + WZ = z80->m_ea; + push(z80, &z80->m_pc); + PCD = z80->m_ea; + CC(ex, opcode); + } + else + { + WZ = arg16(z80); /* implicit call PC+=2; */ + } +} + +/*************************************************************** + * RET_COND + ***************************************************************/ +static inline void ret_cond(z80_device *z80, uint8_t cond, uint8_t opcode) +{ + if (cond) + { + pop(z80, &z80->m_pc); + WZ = PC; + CC(ex, opcode); + } +} + +/*************************************************************** + * RETN + ***************************************************************/ +static inline void retn(z80_device *z80) +{ + LOG(("Z80 RETN m_iff1:%d m_iff2:%d\n", + z80->m_iff1, z80->m_iff2)); + pop(z80, &z80->m_pc); + WZ = PC; + z80->m_iff1 = z80->m_iff2; +} + +/*************************************************************** + * RETI + ***************************************************************/ +static inline void reti(z80_device *z80) +{ + pop(z80, &z80->m_pc); + WZ = PC; + z80->m_iff1 = z80->m_iff2; + //daisy_call_reti_device(z80); +} + +/*************************************************************** + * LD R,A + ***************************************************************/ +static inline void ld_r_a(z80_device *z80) +{ + z80->m_r = A; + z80->m_r2 = A & 0x80; /* keep bit 7 of r */ +} + +/*************************************************************** + * LD A,R + ***************************************************************/ +static inline void ld_a_r(z80_device *z80) +{ + A = (z80->m_r & 0x7f) | z80->m_r2; + F = (F & CF) | SZ[A] | (z80->m_iff2 << 2); + z80->m_after_ldair = 1; +} + +/*************************************************************** + * LD I,A + ***************************************************************/ +static inline void ld_i_a(z80_device *z80) +{ + z80->m_i = A; +} + +/*************************************************************** + * LD A,I + ***************************************************************/ +static inline void ld_a_i(z80_device *z80) +{ + A = z80->m_i; + F = (F & CF) | SZ[A] | (z80->m_iff2 << 2); + z80->m_after_ldair = 1; +} + +/*************************************************************** + * RST + ***************************************************************/ +static inline void rst(z80_device *z80, uint16_t addr) +{ + push(z80, &z80->m_pc); + PCD = addr; + WZ = PC; +} + +/*************************************************************** + * INC r8 + ***************************************************************/ +static inline uint8_t inc(z80_device *z80, uint8_t value) +{ + uint8_t res = value + 1; + F = (F & CF) | SZHV_inc[res]; + return (uint8_t)res; +} + +/*************************************************************** + * DEC r8 + ***************************************************************/ +static inline uint8_t dec(z80_device *z80, uint8_t value) +{ + uint8_t res = value - 1; + F = (F & CF) | SZHV_dec[res]; + return res; +} + +/*************************************************************** + * RLCA + ***************************************************************/ +static inline void rlca(z80_device *z80) +{ + A = (A << 1) | (A >> 7); + F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF)); +} + +/*************************************************************** + * RRCA + ***************************************************************/ +static inline void rrca(z80_device *z80) +{ + F = (F & (SF | ZF | PF)) | (A & CF); + A = (A >> 1) | (A << 7); + F |= (A & (YF | XF)); +} + +/*************************************************************** + * RLA + ***************************************************************/ +static inline void rla(z80_device *z80) +{ + uint8_t res = (A << 1) | (F & CF); + uint8_t c = (A & 0x80) ? CF : 0; + F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); + A = res; +} + +/*************************************************************** + * RRA + ***************************************************************/ +static inline void rra(z80_device *z80) +{ + uint8_t res = (A >> 1) | (F << 7); + uint8_t c = (A & 0x01) ? CF : 0; + F = (F & (SF | ZF | PF)) | c | (res & (YF | XF)); + A = res; +} + +/*************************************************************** + * RRD + ***************************************************************/ +static inline void rrd(z80_device *z80) +{ + uint8_t n = rm(z80, HL); + WZ = HL+1; + wm(z80, HL, (n >> 4) | (A << 4)); + A = (A & 0xf0) | (n & 0x0f); + F = (F & CF) | SZP[A]; +} + +/*************************************************************** + * RLD + ***************************************************************/ +static inline void rld(z80_device *z80) +{ + uint8_t n = rm(z80, HL); + WZ = HL+1; + wm(z80, HL, (n << 4) | (A & 0x0f)); + A = (A & 0xf0) | (n >> 4); + F = (F & CF) | SZP[A]; +} + +/*************************************************************** + * ADD A,n + ***************************************************************/ +static inline void add_a(z80_device *z80, uint8_t value) +{ + uint32_t ah = AFD & 0xff00; + uint32_t res = (uint8_t)((ah >> 8) + value); + F = SZHVC_add[ah | res]; + A = res; +} + +/*************************************************************** + * ADC A,n + ***************************************************************/ +static inline void adc_a(z80_device *z80, uint8_t value) +{ + uint32_t ah = AFD & 0xff00, c = AFD & 1; + uint32_t res = (uint8_t)((ah >> 8) + value + c); + F = SZHVC_add[(c << 16) | ah | res]; + A = res; +} + +/*************************************************************** + * SUB n + ***************************************************************/ +static inline void sub(z80_device *z80, uint8_t value) +{ + uint32_t ah = AFD & 0xff00; + uint32_t res = (uint8_t)((ah >> 8) - value); + F = SZHVC_sub[ah | res]; + A = res; +} + +/*************************************************************** + * SBC A,n + ***************************************************************/ +static inline void sbc_a(z80_device *z80, uint8_t value) +{ + uint32_t ah = AFD & 0xff00, c = AFD & 1; + uint32_t res = (uint8_t)((ah >> 8) - value - c); + F = SZHVC_sub[(c<<16) | ah | res]; + A = res; +} + +/*************************************************************** + * NEG + ***************************************************************/ +static inline void neg(z80_device *z80) +{ + uint8_t value = A; + A = 0; + sub(z80, value); +} + +/*************************************************************** + * DAA + ***************************************************************/ +static inline void daa(z80_device *z80) +{ + uint8_t a = A; + if (F & NF) { + if ((F&HF) | ((A&0xf)>9)) a-=6; + if ((F&CF) | (A>0x99)) a-=0x60; + } + else { + if ((F&HF) | ((A&0xf)>9)) a+=6; + if ((F&CF) | (A>0x99)) a+=0x60; + } + + F = (F&(CF|NF)) | (A>0x99) | ((A^a)&HF) | SZP[a]; + A = a; +} + +/*************************************************************** + * AND n + ***************************************************************/ +static inline void and_a(z80_device *z80, uint8_t value) +{ + A &= value; + F = SZP[A] | HF; +} + +/*************************************************************** + * OR n + ***************************************************************/ +static inline void or_a(z80_device *z80, uint8_t value) +{ + A |= value; + F = SZP[A]; +} + +/*************************************************************** + * XOR n + ***************************************************************/ +static inline void xor_a(z80_device *z80, uint8_t value) +{ + A ^= value; + F = SZP[A]; +} + +/*************************************************************** + * CP n + ***************************************************************/ +static inline void cp(z80_device *z80, uint8_t value) +{ + unsigned val = value; + uint32_t ah = AFD & 0xff00; + uint32_t res = (uint8_t)((ah >> 8) - val); + F = (SZHVC_sub[ah | res] & ~(YF | XF)) | + (val & (YF | XF)); +} + +/*************************************************************** + * EX AF,AF' + ***************************************************************/ +static inline void ex_af(z80_device *z80) +{ + PAIR tmp; + tmp = z80->m_af; z80->m_af = z80->m_af2; z80->m_af2 = tmp; +} + +/*************************************************************** + * EX DE,HL + ***************************************************************/ +static inline void ex_de_hl(z80_device *z80) +{ + PAIR tmp; + tmp = z80->m_de; z80->m_de = z80->m_hl; z80->m_hl = tmp; +} + +/*************************************************************** + * EXX + ***************************************************************/ +static inline void exx(z80_device *z80) +{ + PAIR tmp; + tmp = z80->m_bc; z80->m_bc = z80->m_bc2; z80->m_bc2 = tmp; + tmp = z80->m_de; z80->m_de = z80->m_de2; z80->m_de2 = tmp; + tmp = z80->m_hl; z80->m_hl = z80->m_hl2; z80->m_hl2 = tmp; +} + +/*************************************************************** + * EX (SP),r16 + ***************************************************************/ +static inline void ex_sp(z80_device *z80, PAIR *r) +{ + PAIR tmp = { { 0, 0, 0, 0 } }; + rm16(z80, SPD, &tmp); + wm16(z80, SPD, r); + *r = tmp; + WZ = r->d; +} + +/*************************************************************** + * ADD16 + ***************************************************************/ +static inline void add16(z80_device *z80, PAIR *dr, PAIR *sr) +{ + uint32_t res = dr->d + sr->d; + WZ = dr->d + 1; + F = (F & (SF | ZF | VF)) | + (((dr->d ^ res ^ sr->d) >> 8) & HF) | + ((res >> 16) & CF) | ((res >> 8) & (YF | XF)); + dr->w.l = (uint16_t)res; +} + +/*************************************************************** + * ADC HL,r16 + ***************************************************************/ +static inline void adc_hl(z80_device *z80, PAIR *r) +{ + uint32_t res = HLD + r->d + (F & CF); + WZ = HL + 1; + F = (((HLD ^ res ^ r->d) >> 8) & HF) | + ((res >> 16) & CF) | + ((res >> 8) & (SF | YF | XF)) | + ((res & 0xffff) ? 0 : ZF) | + (((r->d ^ HLD ^ 0x8000) & (r->d ^ res) & 0x8000) >> 13); + HL = (uint16_t)res; +} + +/*************************************************************** + * SBC HL,r16 + ***************************************************************/ +static inline void sbc_hl(z80_device *z80, PAIR *r) +{ + uint32_t res = HLD - r->d - (F & CF); + WZ = HL + 1; + F = (((HLD ^ res ^ r->d) >> 8) & HF) | NF | + ((res >> 16) & CF) | + ((res >> 8) & (SF | YF | XF)) | + ((res & 0xffff) ? 0 : ZF) | + (((r->d ^ HLD) & (HLD ^ res) &0x8000) >> 13); + HL = (uint16_t)res; +} + +/*************************************************************** + * RLC r8 + ***************************************************************/ +static inline uint8_t rlc(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | (res >> 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RRC r8 + ***************************************************************/ +static inline uint8_t rrc(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (res << 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RL r8 + ***************************************************************/ +static inline uint8_t rl(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | (F & CF)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * RR r8 + ***************************************************************/ +static inline uint8_t rr(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (F << 7)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SLA r8 + ***************************************************************/ +static inline uint8_t sla(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = (res << 1) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SRA r8 + ***************************************************************/ +static inline uint8_t sra(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = ((res >> 1) | (res & 0x80)) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SLL r8 + ***************************************************************/ +static inline uint8_t sll(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x80) ? CF : 0; + res = ((res << 1) | 0x01) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * SRL r8 + ***************************************************************/ +static inline uint8_t srl(z80_device *z80, uint8_t value) +{ + unsigned res = value; + unsigned c = (res & 0x01) ? CF : 0; + res = (res >> 1) & 0xff; + F = SZP[res] | c; + return res; +} + +/*************************************************************** + * BIT bit,r8 + ***************************************************************/ +static inline void bit(z80_device *z80, int bit, uint8_t value) +{ + F = (F & CF) | HF | (SZ_BIT[value & (1<m_ea>>8) & (YF|XF)); +} + +/*************************************************************** + * RES bit,r8 + ***************************************************************/ +static inline uint8_t res(int bit, uint8_t value) +{ + return value & ~(1< flag 5 */ + if ((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */ + HL++; DE++; BC--; + if(BC) F |= VF; +} + +/*************************************************************** + * CPI + ***************************************************************/ +static inline void cpi(z80_device *z80) +{ + uint8_t val = rm(z80, HL); + uint8_t res = A - val; + WZ++; + HL++; BC--; + F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; + if (F & HF) res -= 1; + if (res & 0x02) F |= YF; /* bit 1 -> flag 5 */ + if (res & 0x08) F |= XF; /* bit 3 -> flag 3 */ + if (BC) F |= VF; +} + +/*************************************************************** + * INI + ***************************************************************/ +static inline void ini(z80_device *z80) +{ + unsigned t; + uint8_t io = in(z80, BC); + WZ = BC + 1; + B--; + wm(z80, HL, io); + HL++; + F = SZ[B]; + t = (unsigned)((C + 1) & 0xff) + (unsigned)io; + if (io & SF) F |= NF; + if (t & 0x100) F |= HF | CF; + F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; +} + +/*************************************************************** + * OUTI + ***************************************************************/ +static inline void outi(z80_device *z80) +{ + unsigned t; + uint8_t io = rm(z80, HL); + B--; + WZ = BC + 1; + out(z80, BC, io); + HL++; + F = SZ[B]; + t = (unsigned)L + (unsigned)io; + if (io & SF) F |= NF; + if (t & 0x100) F |= HF | CF; + F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; +} + +/*************************************************************** + * LDD + ***************************************************************/ +static inline void ldd(z80_device *z80) +{ + uint8_t io = rm(z80, HL); + wm(z80, DE, io); + F &= SF | ZF | CF; + if ((A + io) & 0x02) F |= YF; /* bit 1 -> flag 5 */ + if ((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */ + HL--; DE--; BC--; + if (BC) F |= VF; +} + +/*************************************************************** + * CPD + ***************************************************************/ +static inline void cpd(z80_device *z80) +{ + uint8_t val = rm(z80, HL); + uint8_t res = A - val; + WZ--; + HL--; BC--; + F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF; + if (F & HF) res -= 1; + if (res & 0x02) F |= YF; /* bit 1 -> flag 5 */ + if (res & 0x08) F |= XF; /* bit 3 -> flag 3 */ + if (BC) F |= VF; +} + +/*************************************************************** + * IND + ***************************************************************/ +static inline void ind(z80_device *z80) +{ + unsigned t; + uint8_t io = in(z80, BC); + WZ = BC - 1; + B--; + wm(z80, HL, io); + HL--; + F = SZ[B]; + t = ((unsigned)(C - 1) & 0xff) + (unsigned)io; + if (io & SF) F |= NF; + if (t & 0x100) F |= HF | CF; + F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; +} + +/*************************************************************** + * OUTD + ***************************************************************/ +static inline void outd(z80_device *z80) +{ + unsigned t; + uint8_t io = rm(z80, HL); + B--; + WZ = BC - 1; + out(z80, BC, io); + HL--; + F = SZ[B]; + t = (unsigned)L + (unsigned)io; + if (io & SF) F |= NF; + if (t & 0x100) F |= HF | CF; + F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF; +} + +/*************************************************************** + * LDIR + ***************************************************************/ +static inline void ldir(z80_device *z80) +{ + ldi(z80); + if (BC != 0) + { + PC -= 2; + WZ = PC + 1; + CC(ex, 0xb0); + } +} + +/*************************************************************** + * CPIR + ***************************************************************/ +static inline void cpir(z80_device *z80) +{ + cpi(z80); + if (BC != 0 && !(F & ZF)) + { + PC -= 2; + WZ = PC + 1; + CC(ex, 0xb1); + } +} + +/*************************************************************** + * INIR + ***************************************************************/ +static inline void inir(z80_device *z80) +{ + ini(z80); + if (B != 0) + { + PC -= 2; + CC(ex, 0xb2); + } +} + +/*************************************************************** + * OTIR + ***************************************************************/ +static inline void otir(z80_device *z80) +{ + outi(z80); + if (B != 0) + { + PC -= 2; + CC(ex, 0xb3); + } +} + +/*************************************************************** + * LDDR + ***************************************************************/ +static inline void lddr(z80_device *z80) +{ + ldd(z80); + if (BC != 0) + { + PC -= 2; + WZ = PC + 1; + CC(ex, 0xb8); + } +} + +/*************************************************************** + * CPDR + ***************************************************************/ +static inline void cpdr(z80_device *z80) +{ + cpd(z80); + if (BC != 0 && !(F & ZF)) + { + PC -= 2; + WZ = PC + 1; + CC(ex, 0xb9); + } +} + +/*************************************************************** + * INDR + ***************************************************************/ +static inline void indr(z80_device *z80) +{ + ind(z80); + if (B != 0) + { + PC -= 2; + CC(ex, 0xba); + } +} + +/*************************************************************** + * OTDR + ***************************************************************/ +static inline void otdr(z80_device *z80) +{ + outd(z80); + if (B != 0) + { + PC -= 2; + CC(ex, 0xbb); + } +} + +/*************************************************************** + * EI + ***************************************************************/ +static inline void ei(z80_device *z80) +{ + z80->m_iff1 = z80->m_iff2 = 1; + z80->m_after_ei = 1; +} + +#define PROTOTYPES(prefix) \ + static inline void prefix##_00(z80_device *z80); static inline void prefix##_01(z80_device *z80); static inline void prefix##_02(z80_device *z80); static inline void prefix##_03(z80_device *z80); \ + static inline void prefix##_04(z80_device *z80); static inline void prefix##_05(z80_device *z80); static inline void prefix##_06(z80_device *z80); static inline void prefix##_07(z80_device *z80); \ + static inline void prefix##_08(z80_device *z80); static inline void prefix##_09(z80_device *z80); static inline void prefix##_0a(z80_device *z80); static inline void prefix##_0b(z80_device *z80); \ + static inline void prefix##_0c(z80_device *z80); static inline void prefix##_0d(z80_device *z80); static inline void prefix##_0e(z80_device *z80); static inline void prefix##_0f(z80_device *z80); \ + static inline void prefix##_10(z80_device *z80); static inline void prefix##_11(z80_device *z80); static inline void prefix##_12(z80_device *z80); static inline void prefix##_13(z80_device *z80); \ + static inline void prefix##_14(z80_device *z80); static inline void prefix##_15(z80_device *z80); static inline void prefix##_16(z80_device *z80); static inline void prefix##_17(z80_device *z80); \ + static inline void prefix##_18(z80_device *z80); static inline void prefix##_19(z80_device *z80); static inline void prefix##_1a(z80_device *z80); static inline void prefix##_1b(z80_device *z80); \ + static inline void prefix##_1c(z80_device *z80); static inline void prefix##_1d(z80_device *z80); static inline void prefix##_1e(z80_device *z80); static inline void prefix##_1f(z80_device *z80); \ + static inline void prefix##_20(z80_device *z80); static inline void prefix##_21(z80_device *z80); static inline void prefix##_22(z80_device *z80); static inline void prefix##_23(z80_device *z80); \ + static inline void prefix##_24(z80_device *z80); static inline void prefix##_25(z80_device *z80); static inline void prefix##_26(z80_device *z80); static inline void prefix##_27(z80_device *z80); \ + static inline void prefix##_28(z80_device *z80); static inline void prefix##_29(z80_device *z80); static inline void prefix##_2a(z80_device *z80); static inline void prefix##_2b(z80_device *z80); \ + static inline void prefix##_2c(z80_device *z80); static inline void prefix##_2d(z80_device *z80); static inline void prefix##_2e(z80_device *z80); static inline void prefix##_2f(z80_device *z80); \ + static inline void prefix##_30(z80_device *z80); static inline void prefix##_31(z80_device *z80); static inline void prefix##_32(z80_device *z80); static inline void prefix##_33(z80_device *z80); \ + static inline void prefix##_34(z80_device *z80); static inline void prefix##_35(z80_device *z80); static inline void prefix##_36(z80_device *z80); static inline void prefix##_37(z80_device *z80); \ + static inline void prefix##_38(z80_device *z80); static inline void prefix##_39(z80_device *z80); static inline void prefix##_3a(z80_device *z80); static inline void prefix##_3b(z80_device *z80); \ + static inline void prefix##_3c(z80_device *z80); static inline void prefix##_3d(z80_device *z80); static inline void prefix##_3e(z80_device *z80); static inline void prefix##_3f(z80_device *z80); \ + static inline void prefix##_40(z80_device *z80); static inline void prefix##_41(z80_device *z80); static inline void prefix##_42(z80_device *z80); static inline void prefix##_43(z80_device *z80); \ + static inline void prefix##_44(z80_device *z80); static inline void prefix##_45(z80_device *z80); static inline void prefix##_46(z80_device *z80); static inline void prefix##_47(z80_device *z80); \ + static inline void prefix##_48(z80_device *z80); static inline void prefix##_49(z80_device *z80); static inline void prefix##_4a(z80_device *z80); static inline void prefix##_4b(z80_device *z80); \ + static inline void prefix##_4c(z80_device *z80); static inline void prefix##_4d(z80_device *z80); static inline void prefix##_4e(z80_device *z80); static inline void prefix##_4f(z80_device *z80); \ + static inline void prefix##_50(z80_device *z80); static inline void prefix##_51(z80_device *z80); static inline void prefix##_52(z80_device *z80); static inline void prefix##_53(z80_device *z80); \ + static inline void prefix##_54(z80_device *z80); static inline void prefix##_55(z80_device *z80); static inline void prefix##_56(z80_device *z80); static inline void prefix##_57(z80_device *z80); \ + static inline void prefix##_58(z80_device *z80); static inline void prefix##_59(z80_device *z80); static inline void prefix##_5a(z80_device *z80); static inline void prefix##_5b(z80_device *z80); \ + static inline void prefix##_5c(z80_device *z80); static inline void prefix##_5d(z80_device *z80); static inline void prefix##_5e(z80_device *z80); static inline void prefix##_5f(z80_device *z80); \ + static inline void prefix##_60(z80_device *z80); static inline void prefix##_61(z80_device *z80); static inline void prefix##_62(z80_device *z80); static inline void prefix##_63(z80_device *z80); \ + static inline void prefix##_64(z80_device *z80); static inline void prefix##_65(z80_device *z80); static inline void prefix##_66(z80_device *z80); static inline void prefix##_67(z80_device *z80); \ + static inline void prefix##_68(z80_device *z80); static inline void prefix##_69(z80_device *z80); static inline void prefix##_6a(z80_device *z80); static inline void prefix##_6b(z80_device *z80); \ + static inline void prefix##_6c(z80_device *z80); static inline void prefix##_6d(z80_device *z80); static inline void prefix##_6e(z80_device *z80); static inline void prefix##_6f(z80_device *z80); \ + static inline void prefix##_70(z80_device *z80); static inline void prefix##_71(z80_device *z80); static inline void prefix##_72(z80_device *z80); static inline void prefix##_73(z80_device *z80); \ + static inline void prefix##_74(z80_device *z80); static inline void prefix##_75(z80_device *z80); static inline void prefix##_76(z80_device *z80); static inline void prefix##_77(z80_device *z80); \ + static inline void prefix##_78(z80_device *z80); static inline void prefix##_79(z80_device *z80); static inline void prefix##_7a(z80_device *z80); static inline void prefix##_7b(z80_device *z80); \ + static inline void prefix##_7c(z80_device *z80); static inline void prefix##_7d(z80_device *z80); static inline void prefix##_7e(z80_device *z80); static inline void prefix##_7f(z80_device *z80); \ + static inline void prefix##_80(z80_device *z80); static inline void prefix##_81(z80_device *z80); static inline void prefix##_82(z80_device *z80); static inline void prefix##_83(z80_device *z80); \ + static inline void prefix##_84(z80_device *z80); static inline void prefix##_85(z80_device *z80); static inline void prefix##_86(z80_device *z80); static inline void prefix##_87(z80_device *z80); \ + static inline void prefix##_88(z80_device *z80); static inline void prefix##_89(z80_device *z80); static inline void prefix##_8a(z80_device *z80); static inline void prefix##_8b(z80_device *z80); \ + static inline void prefix##_8c(z80_device *z80); static inline void prefix##_8d(z80_device *z80); static inline void prefix##_8e(z80_device *z80); static inline void prefix##_8f(z80_device *z80); \ + static inline void prefix##_90(z80_device *z80); static inline void prefix##_91(z80_device *z80); static inline void prefix##_92(z80_device *z80); static inline void prefix##_93(z80_device *z80); \ + static inline void prefix##_94(z80_device *z80); static inline void prefix##_95(z80_device *z80); static inline void prefix##_96(z80_device *z80); static inline void prefix##_97(z80_device *z80); \ + static inline void prefix##_98(z80_device *z80); static inline void prefix##_99(z80_device *z80); static inline void prefix##_9a(z80_device *z80); static inline void prefix##_9b(z80_device *z80); \ + static inline void prefix##_9c(z80_device *z80); static inline void prefix##_9d(z80_device *z80); static inline void prefix##_9e(z80_device *z80); static inline void prefix##_9f(z80_device *z80); \ + static inline void prefix##_a0(z80_device *z80); static inline void prefix##_a1(z80_device *z80); static inline void prefix##_a2(z80_device *z80); static inline void prefix##_a3(z80_device *z80); \ + static inline void prefix##_a4(z80_device *z80); static inline void prefix##_a5(z80_device *z80); static inline void prefix##_a6(z80_device *z80); static inline void prefix##_a7(z80_device *z80); \ + static inline void prefix##_a8(z80_device *z80); static inline void prefix##_a9(z80_device *z80); static inline void prefix##_aa(z80_device *z80); static inline void prefix##_ab(z80_device *z80); \ + static inline void prefix##_ac(z80_device *z80); static inline void prefix##_ad(z80_device *z80); static inline void prefix##_ae(z80_device *z80); static inline void prefix##_af(z80_device *z80); \ + static inline void prefix##_b0(z80_device *z80); static inline void prefix##_b1(z80_device *z80); static inline void prefix##_b2(z80_device *z80); static inline void prefix##_b3(z80_device *z80); \ + static inline void prefix##_b4(z80_device *z80); static inline void prefix##_b5(z80_device *z80); static inline void prefix##_b6(z80_device *z80); static inline void prefix##_b7(z80_device *z80); \ + static inline void prefix##_b8(z80_device *z80); static inline void prefix##_b9(z80_device *z80); static inline void prefix##_ba(z80_device *z80); static inline void prefix##_bb(z80_device *z80); \ + static inline void prefix##_bc(z80_device *z80); static inline void prefix##_bd(z80_device *z80); static inline void prefix##_be(z80_device *z80); static inline void prefix##_bf(z80_device *z80); \ + static inline void prefix##_c0(z80_device *z80); static inline void prefix##_c1(z80_device *z80); static inline void prefix##_c2(z80_device *z80); static inline void prefix##_c3(z80_device *z80); \ + static inline void prefix##_c4(z80_device *z80); static inline void prefix##_c5(z80_device *z80); static inline void prefix##_c6(z80_device *z80); static inline void prefix##_c7(z80_device *z80); \ + static inline void prefix##_c8(z80_device *z80); static inline void prefix##_c9(z80_device *z80); static inline void prefix##_ca(z80_device *z80); static inline void prefix##_cb(z80_device *z80); \ + static inline void prefix##_cc(z80_device *z80); static inline void prefix##_cd(z80_device *z80); static inline void prefix##_ce(z80_device *z80); static inline void prefix##_cf(z80_device *z80); \ + static inline void prefix##_d0(z80_device *z80); static inline void prefix##_d1(z80_device *z80); static inline void prefix##_d2(z80_device *z80); static inline void prefix##_d3(z80_device *z80); \ + static inline void prefix##_d4(z80_device *z80); static inline void prefix##_d5(z80_device *z80); static inline void prefix##_d6(z80_device *z80); static inline void prefix##_d7(z80_device *z80); \ + static inline void prefix##_d8(z80_device *z80); static inline void prefix##_d9(z80_device *z80); static inline void prefix##_da(z80_device *z80); static inline void prefix##_db(z80_device *z80); \ + static inline void prefix##_dc(z80_device *z80); static inline void prefix##_dd(z80_device *z80); static inline void prefix##_de(z80_device *z80); static inline void prefix##_df(z80_device *z80); \ + static inline void prefix##_e0(z80_device *z80); static inline void prefix##_e1(z80_device *z80); static inline void prefix##_e2(z80_device *z80); static inline void prefix##_e3(z80_device *z80); \ + static inline void prefix##_e4(z80_device *z80); static inline void prefix##_e5(z80_device *z80); static inline void prefix##_e6(z80_device *z80); static inline void prefix##_e7(z80_device *z80); \ + static inline void prefix##_e8(z80_device *z80); static inline void prefix##_e9(z80_device *z80); static inline void prefix##_ea(z80_device *z80); static inline void prefix##_eb(z80_device *z80); \ + static inline void prefix##_ec(z80_device *z80); static inline void prefix##_ed(z80_device *z80); static inline void prefix##_ee(z80_device *z80); static inline void prefix##_ef(z80_device *z80); \ + static inline void prefix##_f0(z80_device *z80); static inline void prefix##_f1(z80_device *z80); static inline void prefix##_f2(z80_device *z80); static inline void prefix##_f3(z80_device *z80); \ + static inline void prefix##_f4(z80_device *z80); static inline void prefix##_f5(z80_device *z80); static inline void prefix##_f6(z80_device *z80); static inline void prefix##_f7(z80_device *z80); \ + static inline void prefix##_f8(z80_device *z80); static inline void prefix##_f9(z80_device *z80); static inline void prefix##_fa(z80_device *z80); static inline void prefix##_fb(z80_device *z80); \ + static inline void prefix##_fc(z80_device *z80); static inline void prefix##_fd(z80_device *z80); static inline void prefix##_fe(z80_device *z80); static inline void prefix##_ff(z80_device *z80); + +PROTOTYPES(op) +PROTOTYPES(cb) +PROTOTYPES(dd) +PROTOTYPES(ed) +PROTOTYPES(fd) +PROTOTYPES(xycb) + +/********************************************************** + * opcodes with CB prefix + * rotate, shift and bit operations + **********************************************************/ +OP(cb,00) { B = rlc(z80, B); } /* RLC B */ +OP(cb,01) { C = rlc(z80, C); } /* RLC C */ +OP(cb,02) { D = rlc(z80, D); } /* RLC D */ +OP(cb,03) { E = rlc(z80, E); } /* RLC E */ +OP(cb,04) { H = rlc(z80, H); } /* RLC H */ +OP(cb,05) { L = rlc(z80, L); } /* RLC L */ +OP(cb,06) { wm(z80, HL, rlc(z80, rm(z80, HL))); } /* RLC (HL) */ +OP(cb,07) { A = rlc(z80, A); } /* RLC A */ + +OP(cb,08) { B = rrc(z80, B); } /* RRC B */ +OP(cb,09) { C = rrc(z80, C); } /* RRC C */ +OP(cb,0a) { D = rrc(z80, D); } /* RRC D */ +OP(cb,0b) { E = rrc(z80, E); } /* RRC E */ +OP(cb,0c) { H = rrc(z80, H); } /* RRC H */ +OP(cb,0d) { L = rrc(z80, L); } /* RRC L */ +OP(cb,0e) { wm(z80, HL, rrc(z80, rm(z80, HL))); } /* RRC (HL) */ +OP(cb,0f) { A = rrc(z80, A); } /* RRC A */ + +OP(cb,10) { B = rl(z80, B); } /* RL B */ +OP(cb,11) { C = rl(z80, C); } /* RL C */ +OP(cb,12) { D = rl(z80, D); } /* RL D */ +OP(cb,13) { E = rl(z80, E); } /* RL E */ +OP(cb,14) { H = rl(z80, H); } /* RL H */ +OP(cb,15) { L = rl(z80, L); } /* RL L */ +OP(cb,16) { wm(z80, HL, rl(z80, rm(z80, HL))); } /* RL (HL) */ +OP(cb,17) { A = rl(z80, A); } /* RL A */ + +OP(cb,18) { B = rr(z80, B); } /* RR B */ +OP(cb,19) { C = rr(z80, C); } /* RR C */ +OP(cb,1a) { D = rr(z80, D); } /* RR D */ +OP(cb,1b) { E = rr(z80, E); } /* RR E */ +OP(cb,1c) { H = rr(z80, H); } /* RR H */ +OP(cb,1d) { L = rr(z80, L); } /* RR L */ +OP(cb,1e) { wm(z80, HL, rr(z80, rm(z80, HL))); } /* RR (HL) */ +OP(cb,1f) { A = rr(z80, A); } /* RR A */ + +OP(cb,20) { B = sla(z80, B); } /* SLA B */ +OP(cb,21) { C = sla(z80, C); } /* SLA C */ +OP(cb,22) { D = sla(z80, D); } /* SLA D */ +OP(cb,23) { E = sla(z80, E); } /* SLA E */ +OP(cb,24) { H = sla(z80, H); } /* SLA H */ +OP(cb,25) { L = sla(z80, L); } /* SLA L */ +OP(cb,26) { wm(z80, HL, sla(z80, rm(z80, HL))); } /* SLA (HL) */ +OP(cb,27) { A = sla(z80, A); } /* SLA A */ + +OP(cb,28) { B = sra(z80, B); } /* SRA B */ +OP(cb,29) { C = sra(z80, C); } /* SRA C */ +OP(cb,2a) { D = sra(z80, D); } /* SRA D */ +OP(cb,2b) { E = sra(z80, E); } /* SRA E */ +OP(cb,2c) { H = sra(z80, H); } /* SRA H */ +OP(cb,2d) { L = sra(z80, L); } /* SRA L */ +OP(cb,2e) { wm(z80, HL, sra(z80, rm(z80, HL))); } /* SRA (HL) */ +OP(cb,2f) { A = sra(z80, A); } /* SRA A */ + +OP(cb,30) { B = sll(z80, B); } /* SLL B */ +OP(cb,31) { C = sll(z80, C); } /* SLL C */ +OP(cb,32) { D = sll(z80, D); } /* SLL D */ +OP(cb,33) { E = sll(z80, E); } /* SLL E */ +OP(cb,34) { H = sll(z80, H); } /* SLL H */ +OP(cb,35) { L = sll(z80, L); } /* SLL L */ +OP(cb,36) { wm(z80, HL, sll(z80, rm(z80, HL))); } /* SLL (HL) */ +OP(cb,37) { A = sll(z80, A); } /* SLL A */ + +OP(cb,38) { B = srl(z80, B); } /* SRL B */ +OP(cb,39) { C = srl(z80, C); } /* SRL C */ +OP(cb,3a) { D = srl(z80, D); } /* SRL D */ +OP(cb,3b) { E = srl(z80, E); } /* SRL E */ +OP(cb,3c) { H = srl(z80, H); } /* SRL H */ +OP(cb,3d) { L = srl(z80, L); } /* SRL L */ +OP(cb,3e) { wm(z80, HL, srl(z80, rm(z80, HL))); } /* SRL (HL) */ +OP(cb,3f) { A = srl(z80, A); } /* SRL A */ + +OP(cb,40) { bit(z80, 0, B); } /* BIT 0,B */ +OP(cb,41) { bit(z80, 0, C); } /* BIT 0,C */ +OP(cb,42) { bit(z80, 0, D); } /* BIT 0,D */ +OP(cb,43) { bit(z80, 0, E); } /* BIT 0,E */ +OP(cb,44) { bit(z80, 0, H); } /* BIT 0,H */ +OP(cb,45) { bit(z80, 0, L); } /* BIT 0,L */ +OP(cb,46) { bit_hl(z80, 0, rm(z80, HL)); } /* BIT 0,(HL) */ +OP(cb,47) { bit(z80, 0, A); } /* BIT 0,A */ + +OP(cb,48) { bit(z80, 1, B); } /* BIT 1,B */ +OP(cb,49) { bit(z80, 1, C); } /* BIT 1,C */ +OP(cb,4a) { bit(z80, 1, D); } /* BIT 1,D */ +OP(cb,4b) { bit(z80, 1, E); } /* BIT 1,E */ +OP(cb,4c) { bit(z80, 1, H); } /* BIT 1,H */ +OP(cb,4d) { bit(z80, 1, L); } /* BIT 1,L */ +OP(cb,4e) { bit_hl(z80, 1, rm(z80, HL)); } /* BIT 1,(HL) */ +OP(cb,4f) { bit(z80, 1, A); } /* BIT 1,A */ + +OP(cb,50) { bit(z80, 2, B); } /* BIT 2,B */ +OP(cb,51) { bit(z80, 2, C); } /* BIT 2,C */ +OP(cb,52) { bit(z80, 2, D); } /* BIT 2,D */ +OP(cb,53) { bit(z80, 2, E); } /* BIT 2,E */ +OP(cb,54) { bit(z80, 2, H); } /* BIT 2,H */ +OP(cb,55) { bit(z80, 2, L); } /* BIT 2,L */ +OP(cb,56) { bit_hl(z80, 2, rm(z80, HL)); } /* BIT 2,(HL) */ +OP(cb,57) { bit(z80, 2, A); } /* BIT 2,A */ + +OP(cb,58) { bit(z80, 3, B); } /* BIT 3,B */ +OP(cb,59) { bit(z80, 3, C); } /* BIT 3,C */ +OP(cb,5a) { bit(z80, 3, D); } /* BIT 3,D */ +OP(cb,5b) { bit(z80, 3, E); } /* BIT 3,E */ +OP(cb,5c) { bit(z80, 3, H); } /* BIT 3,H */ +OP(cb,5d) { bit(z80, 3, L); } /* BIT 3,L */ +OP(cb,5e) { bit_hl(z80, 3, rm(z80, HL)); } /* BIT 3,(HL) */ +OP(cb,5f) { bit(z80, 3, A); } /* BIT 3,A */ + +OP(cb,60) { bit(z80, 4, B); } /* BIT 4,B */ +OP(cb,61) { bit(z80, 4, C); } /* BIT 4,C */ +OP(cb,62) { bit(z80, 4, D); } /* BIT 4,D */ +OP(cb,63) { bit(z80, 4, E); } /* BIT 4,E */ +OP(cb,64) { bit(z80, 4, H); } /* BIT 4,H */ +OP(cb,65) { bit(z80, 4, L); } /* BIT 4,L */ +OP(cb,66) { bit_hl(z80, 4, rm(z80, HL)); } /* BIT 4,(HL) */ +OP(cb,67) { bit(z80, 4, A); } /* BIT 4,A */ + +OP(cb,68) { bit(z80, 5, B); } /* BIT 5,B */ +OP(cb,69) { bit(z80, 5, C); } /* BIT 5,C */ +OP(cb,6a) { bit(z80, 5, D); } /* BIT 5,D */ +OP(cb,6b) { bit(z80, 5, E); } /* BIT 5,E */ +OP(cb,6c) { bit(z80, 5, H); } /* BIT 5,H */ +OP(cb,6d) { bit(z80, 5, L); } /* BIT 5,L */ +OP(cb,6e) { bit_hl(z80, 5, rm(z80, HL)); } /* BIT 5,(HL) */ +OP(cb,6f) { bit(z80, 5, A); } /* BIT 5,A */ + +OP(cb,70) { bit(z80, 6, B); } /* BIT 6,B */ +OP(cb,71) { bit(z80, 6, C); } /* BIT 6,C */ +OP(cb,72) { bit(z80, 6, D); } /* BIT 6,D */ +OP(cb,73) { bit(z80, 6, E); } /* BIT 6,E */ +OP(cb,74) { bit(z80, 6, H); } /* BIT 6,H */ +OP(cb,75) { bit(z80, 6, L); } /* BIT 6,L */ +OP(cb,76) { bit_hl(z80, 6, rm(z80, HL)); } /* BIT 6,(HL) */ +OP(cb,77) { bit(z80, 6, A); } /* BIT 6,A */ + +OP(cb,78) { bit(z80, 7, B); } /* BIT 7,B */ +OP(cb,79) { bit(z80, 7, C); } /* BIT 7,C */ +OP(cb,7a) { bit(z80, 7, D); } /* BIT 7,D */ +OP(cb,7b) { bit(z80, 7, E); } /* BIT 7,E */ +OP(cb,7c) { bit(z80, 7, H); } /* BIT 7,H */ +OP(cb,7d) { bit(z80, 7, L); } /* BIT 7,L */ +OP(cb,7e) { bit_hl(z80, 7, rm(z80, HL)); } /* BIT 7,(HL) */ +OP(cb,7f) { bit(z80, 7, A); } /* BIT 7,A */ + +OP(cb,80) { B = res(0, B); } /* RES 0,B */ +OP(cb,81) { C = res(0, C); } /* RES 0,C */ +OP(cb,82) { D = res(0, D); } /* RES 0,D */ +OP(cb,83) { E = res(0, E); } /* RES 0,E */ +OP(cb,84) { H = res(0, H); } /* RES 0,H */ +OP(cb,85) { L = res(0, L); } /* RES 0,L */ +OP(cb,86) { wm(z80, HL, res(0, rm(z80, HL))); } /* RES 0,(HL) */ +OP(cb,87) { A = res(0, A); } /* RES 0,A */ + +OP(cb,88) { B = res(1, B); } /* RES 1,B */ +OP(cb,89) { C = res(1, C); } /* RES 1,C */ +OP(cb,8a) { D = res(1, D); } /* RES 1,D */ +OP(cb,8b) { E = res(1, E); } /* RES 1,E */ +OP(cb,8c) { H = res(1, H); } /* RES 1,H */ +OP(cb,8d) { L = res(1, L); } /* RES 1,L */ +OP(cb,8e) { wm(z80, HL, res(1, rm(z80, HL))); } /* RES 1,(HL) */ +OP(cb,8f) { A = res(1, A); } /* RES 1,A */ + +OP(cb,90) { B = res(2, B); } /* RES 2,B */ +OP(cb,91) { C = res(2, C); } /* RES 2,C */ +OP(cb,92) { D = res(2, D); } /* RES 2,D */ +OP(cb,93) { E = res(2, E); } /* RES 2,E */ +OP(cb,94) { H = res(2, H); } /* RES 2,H */ +OP(cb,95) { L = res(2, L); } /* RES 2,L */ +OP(cb,96) { wm(z80, HL, res(2, rm(z80, HL))); } /* RES 2,(HL) */ +OP(cb,97) { A = res(2, A); } /* RES 2,A */ + +OP(cb,98) { B = res(3, B); } /* RES 3,B */ +OP(cb,99) { C = res(3, C); } /* RES 3,C */ +OP(cb,9a) { D = res(3, D); } /* RES 3,D */ +OP(cb,9b) { E = res(3, E); } /* RES 3,E */ +OP(cb,9c) { H = res(3, H); } /* RES 3,H */ +OP(cb,9d) { L = res(3, L); } /* RES 3,L */ +OP(cb,9e) { wm(z80, HL, res(3, rm(z80, HL))); } /* RES 3,(HL) */ +OP(cb,9f) { A = res(3, A); } /* RES 3,A */ + +OP(cb,a0) { B = res(4, B); } /* RES 4,B */ +OP(cb,a1) { C = res(4, C); } /* RES 4,C */ +OP(cb,a2) { D = res(4, D); } /* RES 4,D */ +OP(cb,a3) { E = res(4, E); } /* RES 4,E */ +OP(cb,a4) { H = res(4, H); } /* RES 4,H */ +OP(cb,a5) { L = res(4, L); } /* RES 4,L */ +OP(cb,a6) { wm(z80, HL, res(4, rm(z80, HL))); } /* RES 4,(HL) */ +OP(cb,a7) { A = res(4, A); } /* RES 4,A */ + +OP(cb,a8) { B = res(5, B); } /* RES 5,B */ +OP(cb,a9) { C = res(5, C); } /* RES 5,C */ +OP(cb,aa) { D = res(5, D); } /* RES 5,D */ +OP(cb,ab) { E = res(5, E); } /* RES 5,E */ +OP(cb,ac) { H = res(5, H); } /* RES 5,H */ +OP(cb,ad) { L = res(5, L); } /* RES 5,L */ +OP(cb,ae) { wm(z80, HL, res(5, rm(z80, HL))); } /* RES 5,(HL) */ +OP(cb,af) { A = res(5, A); } /* RES 5,A */ + +OP(cb,b0) { B = res(6, B); } /* RES 6,B */ +OP(cb,b1) { C = res(6, C); } /* RES 6,C */ +OP(cb,b2) { D = res(6, D); } /* RES 6,D */ +OP(cb,b3) { E = res(6, E); } /* RES 6,E */ +OP(cb,b4) { H = res(6, H); } /* RES 6,H */ +OP(cb,b5) { L = res(6, L); } /* RES 6,L */ +OP(cb,b6) { wm(z80, HL, res(6, rm(z80, HL))); } /* RES 6,(HL) */ +OP(cb,b7) { A = res(6, A); } /* RES 6,A */ + +OP(cb,b8) { B = res(7, B); } /* RES 7,B */ +OP(cb,b9) { C = res(7, C); } /* RES 7,C */ +OP(cb,ba) { D = res(7, D); } /* RES 7,D */ +OP(cb,bb) { E = res(7, E); } /* RES 7,E */ +OP(cb,bc) { H = res(7, H); } /* RES 7,H */ +OP(cb,bd) { L = res(7, L); } /* RES 7,L */ +OP(cb,be) { wm(z80, HL, res(7, rm(z80, HL))); } /* RES 7,(HL) */ +OP(cb,bf) { A = res(7, A); } /* RES 7,A */ + +OP(cb,c0) { B = set(0, B); } /* SET 0,B */ +OP(cb,c1) { C = set(0, C); } /* SET 0,C */ +OP(cb,c2) { D = set(0, D); } /* SET 0,D */ +OP(cb,c3) { E = set(0, E); } /* SET 0,E */ +OP(cb,c4) { H = set(0, H); } /* SET 0,H */ +OP(cb,c5) { L = set(0, L); } /* SET 0,L */ +OP(cb,c6) { wm(z80, HL, set(0, rm(z80, HL))); } /* SET 0,(HL) */ +OP(cb,c7) { A = set(0, A); } /* SET 0,A */ + +OP(cb,c8) { B = set(1, B); } /* SET 1,B */ +OP(cb,c9) { C = set(1, C); } /* SET 1,C */ +OP(cb,ca) { D = set(1, D); } /* SET 1,D */ +OP(cb,cb) { E = set(1, E); } /* SET 1,E */ +OP(cb,cc) { H = set(1, H); } /* SET 1,H */ +OP(cb,cd) { L = set(1, L); } /* SET 1,L */ +OP(cb,ce) { wm(z80, HL, set(1, rm(z80, HL))); } /* SET 1,(HL) */ +OP(cb,cf) { A = set(1, A); } /* SET 1,A */ + +OP(cb,d0) { B = set(2, B); } /* SET 2,B */ +OP(cb,d1) { C = set(2, C); } /* SET 2,C */ +OP(cb,d2) { D = set(2, D); } /* SET 2,D */ +OP(cb,d3) { E = set(2, E); } /* SET 2,E */ +OP(cb,d4) { H = set(2, H); } /* SET 2,H */ +OP(cb,d5) { L = set(2, L); } /* SET 2,L */ +OP(cb,d6) { wm(z80, HL, set(2, rm(z80, HL))); } /* SET 2,(HL) */ +OP(cb,d7) { A = set(2, A); } /* SET 2,A */ + +OP(cb,d8) { B = set(3, B); } /* SET 3,B */ +OP(cb,d9) { C = set(3, C); } /* SET 3,C */ +OP(cb,da) { D = set(3, D); } /* SET 3,D */ +OP(cb,db) { E = set(3, E); } /* SET 3,E */ +OP(cb,dc) { H = set(3, H); } /* SET 3,H */ +OP(cb,dd) { L = set(3, L); } /* SET 3,L */ +OP(cb,de) { wm(z80, HL, set(3, rm(z80, HL))); } /* SET 3,(HL) */ +OP(cb,df) { A = set(3, A); } /* SET 3,A */ + +OP(cb,e0) { B = set(4, B); } /* SET 4,B */ +OP(cb,e1) { C = set(4, C); } /* SET 4,C */ +OP(cb,e2) { D = set(4, D); } /* SET 4,D */ +OP(cb,e3) { E = set(4, E); } /* SET 4,E */ +OP(cb,e4) { H = set(4, H); } /* SET 4,H */ +OP(cb,e5) { L = set(4, L); } /* SET 4,L */ +OP(cb,e6) { wm(z80, HL, set(4, rm(z80, HL))); } /* SET 4,(HL) */ +OP(cb,e7) { A = set(4, A); } /* SET 4,A */ + +OP(cb,e8) { B = set(5, B); } /* SET 5,B */ +OP(cb,e9) { C = set(5, C); } /* SET 5,C */ +OP(cb,ea) { D = set(5, D); } /* SET 5,D */ +OP(cb,eb) { E = set(5, E); } /* SET 5,E */ +OP(cb,ec) { H = set(5, H); } /* SET 5,H */ +OP(cb,ed) { L = set(5, L); } /* SET 5,L */ +OP(cb,ee) { wm(z80, HL, set(5, rm(z80, HL))); } /* SET 5,(HL) */ +OP(cb,ef) { A = set(5, A); } /* SET 5,A */ + +OP(cb,f0) { B = set(6, B); } /* SET 6,B */ +OP(cb,f1) { C = set(6, C); } /* SET 6,C */ +OP(cb,f2) { D = set(6, D); } /* SET 6,D */ +OP(cb,f3) { E = set(6, E); } /* SET 6,E */ +OP(cb,f4) { H = set(6, H); } /* SET 6,H */ +OP(cb,f5) { L = set(6, L); } /* SET 6,L */ +OP(cb,f6) { wm(z80, HL, set(6, rm(z80, HL))); } /* SET 6,(HL) */ +OP(cb,f7) { A = set(6, A); } /* SET 6,A */ + +OP(cb,f8) { B = set(7, B); } /* SET 7,B */ +OP(cb,f9) { C = set(7, C); } /* SET 7,C */ +OP(cb,fa) { D = set(7, D); } /* SET 7,D */ +OP(cb,fb) { E = set(7, E); } /* SET 7,E */ +OP(cb,fc) { H = set(7, H); } /* SET 7,H */ +OP(cb,fd) { L = set(7, L); } /* SET 7,L */ +OP(cb,fe) { wm(z80, HL, set(7, rm(z80, HL))); } /* SET 7,(HL) */ +OP(cb,ff) { A = set(7, A); } /* SET 7,A */ + + +/********************************************************** +* opcodes with DD/FD CB prefix +* rotate, shift and bit operations with (IX+o) +**********************************************************/ +OP(xycb,00) { B = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RLC B=(XY+o) */ +OP(xycb,01) { C = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RLC C=(XY+o) */ +OP(xycb,02) { D = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RLC D=(XY+o) */ +OP(xycb,03) { E = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RLC E=(XY+o) */ +OP(xycb,04) { H = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RLC H=(XY+o) */ +OP(xycb,05) { L = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RLC L=(XY+o) */ +OP(xycb,06) { wm(z80, z80->m_ea, rlc(z80, rm(z80, z80->m_ea))); } /* RLC (XY+o) */ +OP(xycb,07) { A = rlc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RLC A=(XY+o) */ + +OP(xycb,08) { B = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RRC B=(XY+o) */ +OP(xycb,09) { C = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RRC C=(XY+o) */ +OP(xycb,0a) { D = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RRC D=(XY+o) */ +OP(xycb,0b) { E = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RRC E=(XY+o) */ +OP(xycb,0c) { H = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RRC H=(XY+o) */ +OP(xycb,0d) { L = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RRC L=(XY+o) */ +OP(xycb,0e) { wm(z80, z80->m_ea,rrc(z80, rm(z80, z80->m_ea))); } /* RRC (XY+o) */ +OP(xycb,0f) { A = rrc(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RRC A=(XY+o) */ + +OP(xycb,10) { B = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RL B=(XY+o) */ +OP(xycb,11) { C = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RL C=(XY+o) */ +OP(xycb,12) { D = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RL D=(XY+o) */ +OP(xycb,13) { E = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RL E=(XY+o) */ +OP(xycb,14) { H = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RL H=(XY+o) */ +OP(xycb,15) { L = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RL L=(XY+o) */ +OP(xycb,16) { wm(z80, z80->m_ea,rl(z80, rm(z80, z80->m_ea))); } /* RL (XY+o) */ +OP(xycb,17) { A = rl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RL A=(XY+o) */ + +OP(xycb,18) { B = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RR B=(XY+o) */ +OP(xycb,19) { C = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RR C=(XY+o) */ +OP(xycb,1a) { D = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RR D=(XY+o) */ +OP(xycb,1b) { E = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RR E=(XY+o) */ +OP(xycb,1c) { H = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RR H=(XY+o) */ +OP(xycb,1d) { L = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RR L=(XY+o) */ +OP(xycb,1e) { wm(z80, z80->m_ea, rr(z80, rm(z80, z80->m_ea))); } /* RR (XY+o) */ +OP(xycb,1f) { A = rr(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RR A=(XY+o) */ + +OP(xycb,20) { B = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SLA B=(XY+o) */ +OP(xycb,21) { C = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SLA C=(XY+o) */ +OP(xycb,22) { D = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SLA D=(XY+o) */ +OP(xycb,23) { E = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SLA E=(XY+o) */ +OP(xycb,24) { H = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SLA H=(XY+o) */ +OP(xycb,25) { L = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SLA L=(XY+o) */ +OP(xycb,26) { wm(z80, z80->m_ea, sla(z80, rm(z80, z80->m_ea))); } /* SLA (XY+o) */ +OP(xycb,27) { A = sla(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SLA A=(XY+o) */ + +OP(xycb,28) { B = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SRA B=(XY+o) */ +OP(xycb,29) { C = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SRA C=(XY+o) */ +OP(xycb,2a) { D = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SRA D=(XY+o) */ +OP(xycb,2b) { E = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SRA E=(XY+o) */ +OP(xycb,2c) { H = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SRA H=(XY+o) */ +OP(xycb,2d) { L = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SRA L=(XY+o) */ +OP(xycb,2e) { wm(z80, z80->m_ea, sra(z80, rm(z80, z80->m_ea))); } /* SRA (XY+o) */ +OP(xycb,2f) { A = sra(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SRA A=(XY+o) */ + +OP(xycb,30) { B = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SLL B=(XY+o) */ +OP(xycb,31) { C = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SLL C=(XY+o) */ +OP(xycb,32) { D = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SLL D=(XY+o) */ +OP(xycb,33) { E = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SLL E=(XY+o) */ +OP(xycb,34) { H = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SLL H=(XY+o) */ +OP(xycb,35) { L = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SLL L=(XY+o) */ +OP(xycb,36) { wm(z80, z80->m_ea, sll(z80, rm(z80, z80->m_ea))); } /* SLL (XY+o) */ +OP(xycb,37) { A = sll(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SLL A=(XY+o) */ + +OP(xycb,38) { B = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SRL B=(XY+o) */ +OP(xycb,39) { C = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SRL C=(XY+o) */ +OP(xycb,3a) { D = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SRL D=(XY+o) */ +OP(xycb,3b) { E = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SRL E=(XY+o) */ +OP(xycb,3c) { H = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SRL H=(XY+o) */ +OP(xycb,3d) { L = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SRL L=(XY+o) */ +OP(xycb,3e) { wm(z80, z80->m_ea, srl(z80, rm(z80, z80->m_ea))); } /* SRL (XY+o) */ +OP(xycb,3f) { A = srl(z80, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SRL A=(XY+o) */ + +OP(xycb,40) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,41) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,42) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,43) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,44) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,45) { xycb_46(z80); } /* BIT 0,(XY+o) */ +OP(xycb,46) { bit_xy(z80, 0, rm(z80, z80->m_ea)); } /* BIT 0,(XY+o) */ +OP(xycb,47) { xycb_46(z80); } /* BIT 0,(XY+o) */ + +OP(xycb,48) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,49) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,4a) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,4b) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,4c) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,4d) { xycb_4e(z80); } /* BIT 1,(XY+o) */ +OP(xycb,4e) { bit_xy(z80, 1, rm(z80, z80->m_ea)); } /* BIT 1,(XY+o) */ +OP(xycb,4f) { xycb_4e(z80); } /* BIT 1,(XY+o) */ + +OP(xycb,50) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,51) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,52) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,53) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,54) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,55) { xycb_56(z80); } /* BIT 2,(XY+o) */ +OP(xycb,56) { bit_xy(z80, 2, rm(z80, z80->m_ea)); } /* BIT 2,(XY+o) */ +OP(xycb,57) { xycb_56(z80); } /* BIT 2,(XY+o) */ + +OP(xycb,58) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,59) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,5a) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,5b) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,5c) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,5d) { xycb_5e(z80); } /* BIT 3,(XY+o) */ +OP(xycb,5e) { bit_xy(z80, 3, rm(z80, z80->m_ea)); } /* BIT 3,(XY+o) */ +OP(xycb,5f) { xycb_5e(z80); } /* BIT 3,(XY+o) */ + +OP(xycb,60) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,61) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,62) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,63) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,64) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,65) { xycb_66(z80); } /* BIT 4,(XY+o) */ +OP(xycb,66) { bit_xy(z80, 4, rm(z80, z80->m_ea)); } /* BIT 4,(XY+o) */ +OP(xycb,67) { xycb_66(z80); } /* BIT 4,(XY+o) */ + +OP(xycb,68) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,69) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,6a) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,6b) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,6c) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,6d) { xycb_6e(z80); } /* BIT 5,(XY+o) */ +OP(xycb,6e) { bit_xy(z80, 5, rm(z80, z80->m_ea)); } /* BIT 5,(XY+o) */ +OP(xycb,6f) { xycb_6e(z80); } /* BIT 5,(XY+o) */ + +OP(xycb,70) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,71) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,72) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,73) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,74) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,75) { xycb_76(z80); } /* BIT 6,(XY+o) */ +OP(xycb,76) { bit_xy(z80, 6, rm(z80, z80->m_ea)); } /* BIT 6,(XY+o) */ +OP(xycb,77) { xycb_76(z80); } /* BIT 6,(XY+o) */ + +OP(xycb,78) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,79) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,7a) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,7b) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,7c) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,7d) { xycb_7e(z80); } /* BIT 7,(XY+o) */ +OP(xycb,7e) { bit_xy(z80, 7, rm(z80, z80->m_ea)); } /* BIT 7,(XY+o) */ +OP(xycb,7f) { xycb_7e(z80); } /* BIT 7,(XY+o) */ + +OP(xycb,80) { B = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 0,B=(XY+o) */ +OP(xycb,81) { C = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 0,C=(XY+o) */ +OP(xycb,82) { D = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 0,D=(XY+o) */ +OP(xycb,83) { E = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 0,E=(XY+o) */ +OP(xycb,84) { H = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 0,H=(XY+o) */ +OP(xycb,85) { L = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 0,L=(XY+o) */ +OP(xycb,86) { wm(z80, z80->m_ea, res(0, rm(z80, z80->m_ea))); } /* RES 0,(XY+o) */ +OP(xycb,87) { A = res(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 0,A=(XY+o) */ + +OP(xycb,88) { B = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 1,B=(XY+o) */ +OP(xycb,89) { C = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 1,C=(XY+o) */ +OP(xycb,8a) { D = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 1,D=(XY+o) */ +OP(xycb,8b) { E = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 1,E=(XY+o) */ +OP(xycb,8c) { H = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 1,H=(XY+o) */ +OP(xycb,8d) { L = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 1,L=(XY+o) */ +OP(xycb,8e) { wm(z80, z80->m_ea, res(1, rm(z80, z80->m_ea))); } /* RES 1,(XY+o) */ +OP(xycb,8f) { A = res(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 1,A=(XY+o) */ + +OP(xycb,90) { B = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 2,B=(XY+o) */ +OP(xycb,91) { C = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 2,C=(XY+o) */ +OP(xycb,92) { D = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 2,D=(XY+o) */ +OP(xycb,93) { E = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 2,E=(XY+o) */ +OP(xycb,94) { H = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 2,H=(XY+o) */ +OP(xycb,95) { L = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 2,L=(XY+o) */ +OP(xycb,96) { wm(z80, z80->m_ea, res(2, rm(z80, z80->m_ea))); } /* RES 2,(XY+o) */ +OP(xycb,97) { A = res(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 2,A=(XY+o) */ + +OP(xycb,98) { B = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 3,B=(XY+o) */ +OP(xycb,99) { C = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 3,C=(XY+o) */ +OP(xycb,9a) { D = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 3,D=(XY+o) */ +OP(xycb,9b) { E = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 3,E=(XY+o) */ +OP(xycb,9c) { H = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 3,H=(XY+o) */ +OP(xycb,9d) { L = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 3,L=(XY+o) */ +OP(xycb,9e) { wm(z80, z80->m_ea, res(3, rm(z80, z80->m_ea))); } /* RES 3,(XY+o) */ +OP(xycb,9f) { A = res(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 3,A=(XY+o) */ + +OP(xycb,a0) { B = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 4,B=(XY+o) */ +OP(xycb,a1) { C = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 4,C=(XY+o) */ +OP(xycb,a2) { D = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 4,D=(XY+o) */ +OP(xycb,a3) { E = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 4,E=(XY+o) */ +OP(xycb,a4) { H = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 4,H=(XY+o) */ +OP(xycb,a5) { L = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 4,L=(XY+o) */ +OP(xycb,a6) { wm(z80, z80->m_ea, res(4, rm(z80, z80->m_ea))); } /* RES 4,(XY+o) */ +OP(xycb,a7) { A = res(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 4,A=(XY+o) */ + +OP(xycb,a8) { B = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 5,B=(XY+o) */ +OP(xycb,a9) { C = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 5,C=(XY+o) */ +OP(xycb,aa) { D = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 5,D=(XY+o) */ +OP(xycb,ab) { E = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 5,E=(XY+o) */ +OP(xycb,ac) { H = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 5,H=(XY+o) */ +OP(xycb,ad) { L = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 5,L=(XY+o) */ +OP(xycb,ae) { wm(z80, z80->m_ea, res(5, rm(z80, z80->m_ea))); } /* RES 5,(XY+o) */ +OP(xycb,af) { A = res(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 5,A=(XY+o) */ + +OP(xycb,b0) { B = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 6,B=(XY+o) */ +OP(xycb,b1) { C = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 6,C=(XY+o) */ +OP(xycb,b2) { D = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 6,D=(XY+o) */ +OP(xycb,b3) { E = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 6,E=(XY+o) */ +OP(xycb,b4) { H = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 6,H=(XY+o) */ +OP(xycb,b5) { L = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 6,L=(XY+o) */ +OP(xycb,b6) { wm(z80, z80->m_ea, res(6, rm(z80, z80->m_ea))); } /* RES 6,(XY+o) */ +OP(xycb,b7) { A = res(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 6,A=(XY+o) */ + +OP(xycb,b8) { B = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* RES 7,B=(XY+o) */ +OP(xycb,b9) { C = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* RES 7,C=(XY+o) */ +OP(xycb,ba) { D = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* RES 7,D=(XY+o) */ +OP(xycb,bb) { E = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* RES 7,E=(XY+o) */ +OP(xycb,bc) { H = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* RES 7,H=(XY+o) */ +OP(xycb,bd) { L = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* RES 7,L=(XY+o) */ +OP(xycb,be) { wm(z80, z80->m_ea, res(7, rm(z80, z80->m_ea))); } /* RES 7,(XY+o) */ +OP(xycb,bf) { A = res(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* RES 7,A=(XY+o) */ + +OP(xycb,c0) { B = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 0,B=(XY+o) */ +OP(xycb,c1) { C = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 0,C=(XY+o) */ +OP(xycb,c2) { D = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 0,D=(XY+o) */ +OP(xycb,c3) { E = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 0,E=(XY+o) */ +OP(xycb,c4) { H = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 0,H=(XY+o) */ +OP(xycb,c5) { L = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 0,L=(XY+o) */ +OP(xycb,c6) { wm(z80, z80->m_ea, set(0, rm(z80, z80->m_ea))); } /* SET 0,(XY+o) */ +OP(xycb,c7) { A = set(0, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 0,A=(XY+o) */ + +OP(xycb,c8) { B = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 1,B=(XY+o) */ +OP(xycb,c9) { C = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 1,C=(XY+o) */ +OP(xycb,ca) { D = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 1,D=(XY+o) */ +OP(xycb,cb) { E = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 1,E=(XY+o) */ +OP(xycb,cc) { H = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 1,H=(XY+o) */ +OP(xycb,cd) { L = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 1,L=(XY+o) */ +OP(xycb,ce) { wm(z80, z80->m_ea, set(1, rm(z80, z80->m_ea))); } /* SET 1,(XY+o) */ +OP(xycb,cf) { A = set(1, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 1,A=(XY+o) */ + +OP(xycb,d0) { B = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 2,B=(XY+o) */ +OP(xycb,d1) { C = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 2,C=(XY+o) */ +OP(xycb,d2) { D = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 2,D=(XY+o) */ +OP(xycb,d3) { E = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 2,E=(XY+o) */ +OP(xycb,d4) { H = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 2,H=(XY+o) */ +OP(xycb,d5) { L = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 2,L=(XY+o) */ +OP(xycb,d6) { wm(z80, z80->m_ea, set(2, rm(z80, z80->m_ea))); } /* SET 2,(XY+o) */ +OP(xycb,d7) { A = set(2, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 2,A=(XY+o) */ + +OP(xycb,d8) { B = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 3,B=(XY+o) */ +OP(xycb,d9) { C = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 3,C=(XY+o) */ +OP(xycb,da) { D = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 3,D=(XY+o) */ +OP(xycb,db) { E = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 3,E=(XY+o) */ +OP(xycb,dc) { H = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 3,H=(XY+o) */ +OP(xycb,dd) { L = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 3,L=(XY+o) */ +OP(xycb,de) { wm(z80, z80->m_ea, set(3, rm(z80, z80->m_ea))); } /* SET 3,(XY+o) */ +OP(xycb,df) { A = set(3, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 3,A=(XY+o) */ + +OP(xycb,e0) { B = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 4,B=(XY+o) */ +OP(xycb,e1) { C = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 4,C=(XY+o) */ +OP(xycb,e2) { D = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 4,D=(XY+o) */ +OP(xycb,e3) { E = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 4,E=(XY+o) */ +OP(xycb,e4) { H = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 4,H=(XY+o) */ +OP(xycb,e5) { L = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 4,L=(XY+o) */ +OP(xycb,e6) { wm(z80, z80->m_ea, set(4, rm(z80, z80->m_ea))); } /* SET 4,(XY+o) */ +OP(xycb,e7) { A = set(4, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 4,A=(XY+o) */ + +OP(xycb,e8) { B = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 5,B=(XY+o) */ +OP(xycb,e9) { C = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 5,C=(XY+o) */ +OP(xycb,ea) { D = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 5,D=(XY+o) */ +OP(xycb,eb) { E = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 5,E=(XY+o) */ +OP(xycb,ec) { H = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 5,H=(XY+o) */ +OP(xycb,ed) { L = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 5,L=(XY+o) */ +OP(xycb,ee) { wm(z80, z80->m_ea, set(5, rm(z80, z80->m_ea))); } /* SET 5,(XY+o) */ +OP(xycb,ef) { A = set(5, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 5,A=(XY+o) */ + +OP(xycb,f0) { B = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 6,B=(XY+o) */ +OP(xycb,f1) { C = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 6,C=(XY+o) */ +OP(xycb,f2) { D = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 6,D=(XY+o) */ +OP(xycb,f3) { E = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 6,E=(XY+o) */ +OP(xycb,f4) { H = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 6,H=(XY+o) */ +OP(xycb,f5) { L = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 6,L=(XY+o) */ +OP(xycb,f6) { wm(z80, z80->m_ea, set(6, rm(z80, z80->m_ea))); } /* SET 6,(XY+o) */ +OP(xycb,f7) { A = set(6, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 6,A=(XY+o) */ + +OP(xycb,f8) { B = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, B); } /* SET 7,B=(XY+o) */ +OP(xycb,f9) { C = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, C); } /* SET 7,C=(XY+o) */ +OP(xycb,fa) { D = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, D); } /* SET 7,D=(XY+o) */ +OP(xycb,fb) { E = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, E); } /* SET 7,E=(XY+o) */ +OP(xycb,fc) { H = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, H); } /* SET 7,H=(XY+o) */ +OP(xycb,fd) { L = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, L); } /* SET 7,L=(XY+o) */ +OP(xycb,fe) { wm(z80, z80->m_ea, set(7, rm(z80, z80->m_ea))); } /* SET 7,(XY+o) */ +OP(xycb,ff) { A = set(7, rm(z80, z80->m_ea)); wm(z80, z80->m_ea, A); } /* SET 7,A=(XY+o) */ + +OP(illegal,1) { + warning("Z80 ill. opcode $%02x $%02x ($%04x)\n", + rm(z80, (PCD-1)&0xffff), rm(z80, PCD), PCD-1); +} + +/********************************************************** + * IX register related opcodes (DD prefix) + **********************************************************/ +OP(dd,00) { illegal_1(z80); op_00(z80); } /* DB DD */ +OP(dd,01) { illegal_1(z80); op_01(z80); } /* DB DD */ +OP(dd,02) { illegal_1(z80); op_02(z80); } /* DB DD */ +OP(dd,03) { illegal_1(z80); op_03(z80); } /* DB DD */ +OP(dd,04) { illegal_1(z80); op_04(z80); } /* DB DD */ +OP(dd,05) { illegal_1(z80); op_05(z80); } /* DB DD */ +OP(dd,06) { illegal_1(z80); op_06(z80); } /* DB DD */ +OP(dd,07) { illegal_1(z80); op_07(z80); } /* DB DD */ + +OP(dd,08) { illegal_1(z80); op_08(z80); } /* DB DD */ +OP(dd,09) { add16(z80, &z80->m_ix, &z80->m_bc); } /* ADD IX,BC */ +OP(dd,0a) { illegal_1(z80); op_0a(z80); } /* DB DD */ +OP(dd,0b) { illegal_1(z80); op_0b(z80); } /* DB DD */ +OP(dd,0c) { illegal_1(z80); op_0c(z80); } /* DB DD */ +OP(dd,0d) { illegal_1(z80); op_0d(z80); } /* DB DD */ +OP(dd,0e) { illegal_1(z80); op_0e(z80); } /* DB DD */ +OP(dd,0f) { illegal_1(z80); op_0f(z80); } /* DB DD */ + +OP(dd,10) { illegal_1(z80); op_10(z80); } /* DB DD */ +OP(dd,11) { illegal_1(z80); op_11(z80); } /* DB DD */ +OP(dd,12) { illegal_1(z80); op_12(z80); } /* DB DD */ +OP(dd,13) { illegal_1(z80); op_13(z80); } /* DB DD */ +OP(dd,14) { illegal_1(z80); op_14(z80); } /* DB DD */ +OP(dd,15) { illegal_1(z80); op_15(z80); } /* DB DD */ +OP(dd,16) { illegal_1(z80); op_16(z80); } /* DB DD */ +OP(dd,17) { illegal_1(z80); op_17(z80); } /* DB DD */ + +OP(dd,18) { illegal_1(z80); op_18(z80); } /* DB DD */ +OP(dd,19) { add16(z80, &z80->m_ix, &z80->m_de); } /* ADD IX,DE */ +OP(dd,1a) { illegal_1(z80); op_1a(z80); } /* DB DD */ +OP(dd,1b) { illegal_1(z80); op_1b(z80); } /* DB DD */ +OP(dd,1c) { illegal_1(z80); op_1c(z80); } /* DB DD */ +OP(dd,1d) { illegal_1(z80); op_1d(z80); } /* DB DD */ +OP(dd,1e) { illegal_1(z80); op_1e(z80); } /* DB DD */ +OP(dd,1f) { illegal_1(z80); op_1f(z80); } /* DB DD */ + +OP(dd,20) { illegal_1(z80); op_20(z80); } /* DB DD */ +OP(dd,21) { IX = arg16(z80); } /* LD IX,w */ +OP(dd,22) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_ix); WZ = z80->m_ea + 1; } /* LD (w),IX */ +OP(dd,23) { IX++; } /* INC IX */ +OP(dd,24) { HX = inc(z80, HX); } /* INC HX */ +OP(dd,25) { HX = dec(z80, HX); } /* DEC HX */ +OP(dd,26) { HX = arg(z80); } /* LD HX,n */ +OP(dd,27) { illegal_1(z80); op_27(z80); } /* DB DD */ + +OP(dd,28) { illegal_1(z80); op_28(z80); } /* DB DD */ +OP(dd,29) { add16(z80, &z80->m_ix, &z80->m_ix); } /* ADD IX,IX */ +OP(dd,2a) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_ix); WZ = z80->m_ea + 1; } /* LD IX,(w) */ +OP(dd,2b) { IX--; } /* DEC IX */ +OP(dd,2c) { LX = inc(z80, LX); } /* INC LX */ +OP(dd,2d) { LX = dec(z80, LX); } /* DEC LX */ +OP(dd,2e) { LX = arg(z80); } /* LD LX,n */ +OP(dd,2f) { illegal_1(z80); op_2f(z80); } /* DB DD */ + +OP(dd,30) { illegal_1(z80); op_30(z80); } /* DB DD */ +OP(dd,31) { illegal_1(z80); op_31(z80); } /* DB DD */ +OP(dd,32) { illegal_1(z80); op_32(z80); } /* DB DD */ +OP(dd,33) { illegal_1(z80); op_33(z80); } /* DB DD */ +OP(dd,34) { eax(z80); wm(z80, z80->m_ea, inc(z80, rm(z80, z80->m_ea))); } /* INC (IX+o) */ +OP(dd,35) { eax(z80); wm(z80, z80->m_ea, dec(z80, rm(z80, z80->m_ea))); } /* DEC (IX+o) */ +OP(dd,36) { eax(z80); wm(z80, z80->m_ea, arg(z80)); } /* LD (IX+o),n */ +OP(dd,37) { illegal_1(z80); op_37(z80); } /* DB DD */ + +OP(dd,38) { illegal_1(z80); op_38(z80); } /* DB DD */ +OP(dd,39) { add16(z80, &z80->m_ix, &z80->m_sp); } /* ADD IX,SP */ +OP(dd,3a) { illegal_1(z80); op_3a(z80); } /* DB DD */ +OP(dd,3b) { illegal_1(z80); op_3b(z80); } /* DB DD */ +OP(dd,3c) { illegal_1(z80); op_3c(z80); } /* DB DD */ +OP(dd,3d) { illegal_1(z80); op_3d(z80); } /* DB DD */ +OP(dd,3e) { illegal_1(z80); op_3e(z80); } /* DB DD */ +OP(dd,3f) { illegal_1(z80); op_3f(z80); } /* DB DD */ + +OP(dd,40) { illegal_1(z80); op_40(z80); } /* DB DD */ +OP(dd,41) { illegal_1(z80); op_41(z80); } /* DB DD */ +OP(dd,42) { illegal_1(z80); op_42(z80); } /* DB DD */ +OP(dd,43) { illegal_1(z80); op_43(z80); } /* DB DD */ +OP(dd,44) { B = HX; } /* LD B,HX */ +OP(dd,45) { B = LX; } /* LD B,LX */ +OP(dd,46) { eax(z80); B = rm(z80, z80->m_ea); } /* LD B,(IX+o) */ +OP(dd,47) { illegal_1(z80); op_47(z80); } /* DB DD */ + +OP(dd,48) { illegal_1(z80); op_48(z80); } /* DB DD */ +OP(dd,49) { illegal_1(z80); op_49(z80); } /* DB DD */ +OP(dd,4a) { illegal_1(z80); op_4a(z80); } /* DB DD */ +OP(dd,4b) { illegal_1(z80); op_4b(z80); } /* DB DD */ +OP(dd,4c) { C = HX; } /* LD C,HX */ +OP(dd,4d) { C = LX; } /* LD C,LX */ +OP(dd,4e) { eax(z80); C = rm(z80, z80->m_ea); } /* LD C,(IX+o) */ +OP(dd,4f) { illegal_1(z80); op_4f(z80); } /* DB DD */ + +OP(dd,50) { illegal_1(z80); op_50(z80); } /* DB DD */ +OP(dd,51) { illegal_1(z80); op_51(z80); } /* DB DD */ +OP(dd,52) { illegal_1(z80); op_52(z80); } /* DB DD */ +OP(dd,53) { illegal_1(z80); op_53(z80); } /* DB DD */ +OP(dd,54) { D = HX; } /* LD D,HX */ +OP(dd,55) { D = LX; } /* LD D,LX */ +OP(dd,56) { eax(z80); D = rm(z80, z80->m_ea); } /* LD D,(IX+o) */ +OP(dd,57) { illegal_1(z80); op_57(z80); } /* DB DD */ + +OP(dd,58) { illegal_1(z80); op_58(z80); } /* DB DD */ +OP(dd,59) { illegal_1(z80); op_59(z80); } /* DB DD */ +OP(dd,5a) { illegal_1(z80); op_5a(z80); } /* DB DD */ +OP(dd,5b) { illegal_1(z80); op_5b(z80); } /* DB DD */ +OP(dd,5c) { E = HX; } /* LD E,HX */ +OP(dd,5d) { E = LX; } /* LD E,LX */ +OP(dd,5e) { eax(z80); E = rm(z80, z80->m_ea); } /* LD E,(IX+o) */ +OP(dd,5f) { illegal_1(z80); op_5f(z80); } /* DB DD */ + +OP(dd,60) { HX = B; } /* LD HX,B */ +OP(dd,61) { HX = C; } /* LD HX,C */ +OP(dd,62) { HX = D; } /* LD HX,D */ +OP(dd,63) { HX = E; } /* LD HX,E */ +OP(dd,64) { } /* LD HX,HX */ +OP(dd,65) { HX = LX; } /* LD HX,LX */ +OP(dd,66) { eax(z80); H = rm(z80, z80->m_ea); } /* LD H,(IX+o) */ +OP(dd,67) { HX = A; } /* LD HX,A */ + +OP(dd,68) { LX = B; } /* LD LX,B */ +OP(dd,69) { LX = C; } /* LD LX,C */ +OP(dd,6a) { LX = D; } /* LD LX,D */ +OP(dd,6b) { LX = E; } /* LD LX,E */ +OP(dd,6c) { LX = HX; } /* LD LX,HX */ +OP(dd,6d) { } /* LD LX,LX */ +OP(dd,6e) { eax(z80); L = rm(z80, z80->m_ea); } /* LD L,(IX+o) */ +OP(dd,6f) { LX = A; } /* LD LX,A */ + +OP(dd,70) { eax(z80); wm(z80, z80->m_ea, B); } /* LD (IX+o),B */ +OP(dd,71) { eax(z80); wm(z80, z80->m_ea, C); } /* LD (IX+o),C */ +OP(dd,72) { eax(z80); wm(z80, z80->m_ea, D); } /* LD (IX+o),D */ +OP(dd,73) { eax(z80); wm(z80, z80->m_ea, E); } /* LD (IX+o),E */ +OP(dd,74) { eax(z80); wm(z80, z80->m_ea, H); } /* LD (IX+o),H */ +OP(dd,75) { eax(z80); wm(z80, z80->m_ea, L); } /* LD (IX+o),L */ +OP(dd,76) { illegal_1(z80); op_76(z80); } /* DB DD */ +OP(dd,77) { eax(z80); wm(z80, z80->m_ea, A); } /* LD (IX+o),A */ + +OP(dd,78) { illegal_1(z80); op_78(z80); } /* DB DD */ +OP(dd,79) { illegal_1(z80); op_79(z80); } /* DB DD */ +OP(dd,7a) { illegal_1(z80); op_7a(z80); } /* DB DD */ +OP(dd,7b) { illegal_1(z80); op_7b(z80); } /* DB DD */ +OP(dd,7c) { A = HX; } /* LD A,HX */ +OP(dd,7d) { A = LX; } /* LD A,LX */ +OP(dd,7e) { eax(z80); A = rm(z80, z80->m_ea); } /* LD A,(IX+o) */ +OP(dd,7f) { illegal_1(z80); op_7f(z80); } /* DB DD */ + +OP(dd,80) { illegal_1(z80); op_80(z80); } /* DB DD */ +OP(dd,81) { illegal_1(z80); op_81(z80); } /* DB DD */ +OP(dd,82) { illegal_1(z80); op_82(z80); } /* DB DD */ +OP(dd,83) { illegal_1(z80); op_83(z80); } /* DB DD */ +OP(dd,84) { add_a(z80, HX); } /* ADD A,HX */ +OP(dd,85) { add_a(z80, LX); } /* ADD A,LX */ +OP(dd,86) { eax(z80); add_a(z80, rm(z80, z80->m_ea)); } /* ADD A,(IX+o) */ +OP(dd,87) { illegal_1(z80); op_87(z80); } /* DB DD */ + +OP(dd,88) { illegal_1(z80); op_88(z80); } /* DB DD */ +OP(dd,89) { illegal_1(z80); op_89(z80); } /* DB DD */ +OP(dd,8a) { illegal_1(z80); op_8a(z80); } /* DB DD */ +OP(dd,8b) { illegal_1(z80); op_8b(z80); } /* DB DD */ +OP(dd,8c) { adc_a(z80, HX); } /* ADC A,HX */ +OP(dd,8d) { adc_a(z80, LX); } /* ADC A,LX */ +OP(dd,8e) { eax(z80); adc_a(z80, rm(z80, z80->m_ea)); } /* ADC A,(IX+o) */ +OP(dd,8f) { illegal_1(z80); op_8f(z80); } /* DB DD */ + +OP(dd,90) { illegal_1(z80); op_90(z80); } /* DB DD */ +OP(dd,91) { illegal_1(z80); op_91(z80); } /* DB DD */ +OP(dd,92) { illegal_1(z80); op_92(z80); } /* DB DD */ +OP(dd,93) { illegal_1(z80); op_93(z80); } /* DB DD */ +OP(dd,94) { sub(z80, HX); } /* SUB HX */ +OP(dd,95) { sub(z80, LX); } /* SUB LX */ +OP(dd,96) { eax(z80); sub(z80, rm(z80, z80->m_ea)); } /* SUB (IX+o) */ +OP(dd,97) { illegal_1(z80); op_97(z80); } /* DB DD */ + +OP(dd,98) { illegal_1(z80); op_98(z80); } /* DB DD */ +OP(dd,99) { illegal_1(z80); op_99(z80); } /* DB DD */ +OP(dd,9a) { illegal_1(z80); op_9a(z80); } /* DB DD */ +OP(dd,9b) { illegal_1(z80); op_9b(z80); } /* DB DD */ +OP(dd,9c) { sbc_a(z80, HX); } /* SBC A,HX */ +OP(dd,9d) { sbc_a(z80, LX); } /* SBC A,LX */ +OP(dd,9e) { eax(z80); sbc_a(z80, rm(z80, z80->m_ea)); } /* SBC A,(IX+o) */ +OP(dd,9f) { illegal_1(z80); op_9f(z80); } /* DB DD */ + +OP(dd,a0) { illegal_1(z80); op_a0(z80); } /* DB DD */ +OP(dd,a1) { illegal_1(z80); op_a1(z80); } /* DB DD */ +OP(dd,a2) { illegal_1(z80); op_a2(z80); } /* DB DD */ +OP(dd,a3) { illegal_1(z80); op_a3(z80); } /* DB DD */ +OP(dd,a4) { and_a(z80, HX); } /* AND HX */ +OP(dd,a5) { and_a(z80, LX); } /* AND LX */ +OP(dd,a6) { eax(z80); and_a(z80, rm(z80, z80->m_ea)); } /* AND (IX+o) */ +OP(dd,a7) { illegal_1(z80); op_a7(z80); } /* DB DD */ + +OP(dd,a8) { illegal_1(z80); op_a8(z80); } /* DB DD */ +OP(dd,a9) { illegal_1(z80); op_a9(z80); } /* DB DD */ +OP(dd,aa) { illegal_1(z80); op_aa(z80); } /* DB DD */ +OP(dd,ab) { illegal_1(z80); op_ab(z80); } /* DB DD */ +OP(dd,ac) { xor_a(z80, HX); } /* XOR HX */ +OP(dd,ad) { xor_a(z80, LX); } /* XOR LX */ +OP(dd,ae) { eax(z80); xor_a(z80, rm(z80, z80->m_ea)); } /* XOR (IX+o) */ +OP(dd,af) { illegal_1(z80); op_af(z80); } /* DB DD */ + +OP(dd,b0) { illegal_1(z80); op_b0(z80); } /* DB DD */ +OP(dd,b1) { illegal_1(z80); op_b1(z80); } /* DB DD */ +OP(dd,b2) { illegal_1(z80); op_b2(z80); } /* DB DD */ +OP(dd,b3) { illegal_1(z80); op_b3(z80); } /* DB DD */ +OP(dd,b4) { or_a(z80, HX); } /* OR HX */ +OP(dd,b5) { or_a(z80, LX); } /* OR LX */ +OP(dd,b6) { eax(z80); or_a(z80, rm(z80, z80->m_ea)); } /* OR (IX+o) */ +OP(dd,b7) { illegal_1(z80); op_b7(z80); } /* DB DD */ + +OP(dd,b8) { illegal_1(z80); op_b8(z80); } /* DB DD */ +OP(dd,b9) { illegal_1(z80); op_b9(z80); } /* DB DD */ +OP(dd,ba) { illegal_1(z80); op_ba(z80); } /* DB DD */ +OP(dd,bb) { illegal_1(z80); op_bb(z80); } /* DB DD */ +OP(dd,bc) { cp(z80, HX); } /* CP HX */ +OP(dd,bd) { cp(z80, LX); } /* CP LX */ +OP(dd,be) { eax(z80); cp(z80, rm(z80, z80->m_ea)); } /* CP (IX+o) */ +OP(dd,bf) { illegal_1(z80); op_bf(z80); } /* DB DD */ + +OP(dd,c0) { illegal_1(z80); op_c0(z80); } /* DB DD */ +OP(dd,c1) { illegal_1(z80); op_c1(z80); } /* DB DD */ +OP(dd,c2) { illegal_1(z80); op_c2(z80); } /* DB DD */ +OP(dd,c3) { illegal_1(z80); op_c3(z80); } /* DB DD */ +OP(dd,c4) { illegal_1(z80); op_c4(z80); } /* DB DD */ +OP(dd,c5) { illegal_1(z80); op_c5(z80); } /* DB DD */ +OP(dd,c6) { illegal_1(z80); op_c6(z80); } /* DB DD */ +OP(dd,c7) { illegal_1(z80); op_c7(z80); } /* DB DD */ + +OP(dd,c8) { illegal_1(z80); op_c8(z80); } /* DB DD */ +OP(dd,c9) { illegal_1(z80); op_c9(z80); } /* DB DD */ +OP(dd,ca) { illegal_1(z80); op_ca(z80); } /* DB DD */ +OP(dd,cb) { eax(z80); EXEC(xycb,arg(z80)); } /* ** DD CB xx */ +OP(dd,cc) { illegal_1(z80); op_cc(z80); } /* DB DD */ +OP(dd,cd) { illegal_1(z80); op_cd(z80); } /* DB DD */ +OP(dd,ce) { illegal_1(z80); op_ce(z80); } /* DB DD */ +OP(dd,cf) { illegal_1(z80); op_cf(z80); } /* DB DD */ + +OP(dd,d0) { illegal_1(z80); op_d0(z80); } /* DB DD */ +OP(dd,d1) { illegal_1(z80); op_d1(z80); } /* DB DD */ +OP(dd,d2) { illegal_1(z80); op_d2(z80); } /* DB DD */ +OP(dd,d3) { illegal_1(z80); op_d3(z80); } /* DB DD */ +OP(dd,d4) { illegal_1(z80); op_d4(z80); } /* DB DD */ +OP(dd,d5) { illegal_1(z80); op_d5(z80); } /* DB DD */ +OP(dd,d6) { illegal_1(z80); op_d6(z80); } /* DB DD */ +OP(dd,d7) { illegal_1(z80); op_d7(z80); } /* DB DD */ + +OP(dd,d8) { illegal_1(z80); op_d8(z80); } /* DB DD */ +OP(dd,d9) { illegal_1(z80); op_d9(z80); } /* DB DD */ +OP(dd,da) { illegal_1(z80); op_da(z80); } /* DB DD */ +OP(dd,db) { illegal_1(z80); op_db(z80); } /* DB DD */ +OP(dd,dc) { illegal_1(z80); op_dc(z80); } /* DB DD */ +OP(dd,dd) { illegal_1(z80); op_dd(z80); } /* DB DD */ +OP(dd,de) { illegal_1(z80); op_de(z80); } /* DB DD */ +OP(dd,df) { illegal_1(z80); op_df(z80); } /* DB DD */ + +OP(dd,e0) { illegal_1(z80); op_e0(z80); } /* DB DD */ +OP(dd,e1) { pop(z80, &z80->m_ix); } /* POP IX */ +OP(dd,e2) { illegal_1(z80); op_e2(z80); } /* DB DD */ +OP(dd,e3) { ex_sp(z80, &z80->m_ix); } /* EX (SP),IX */ +OP(dd,e4) { illegal_1(z80); op_e4(z80); } /* DB DD */ +OP(dd,e5) { push(z80, &z80->m_ix); } /* PUSH IX */ +OP(dd,e6) { illegal_1(z80); op_e6(z80); } /* DB DD */ +OP(dd,e7) { illegal_1(z80); op_e7(z80); } /* DB DD */ + +OP(dd,e8) { illegal_1(z80); op_e8(z80); } /* DB DD */ +OP(dd,e9) { PC = IX; } /* JP (IX) */ +OP(dd,ea) { illegal_1(z80); op_ea(z80); } /* DB DD */ +OP(dd,eb) { illegal_1(z80); op_eb(z80); } /* DB DD */ +OP(dd,ec) { illegal_1(z80); op_ec(z80); } /* DB DD */ +OP(dd,ed) { illegal_1(z80); op_ed(z80); } /* DB DD */ +OP(dd,ee) { illegal_1(z80); op_ee(z80); } /* DB DD */ +OP(dd,ef) { illegal_1(z80); op_ef(z80); } /* DB DD */ + +OP(dd,f0) { illegal_1(z80); op_f0(z80); } /* DB DD */ +OP(dd,f1) { illegal_1(z80); op_f1(z80); } /* DB DD */ +OP(dd,f2) { illegal_1(z80); op_f2(z80); } /* DB DD */ +OP(dd,f3) { illegal_1(z80); op_f3(z80); } /* DB DD */ +OP(dd,f4) { illegal_1(z80); op_f4(z80); } /* DB DD */ +OP(dd,f5) { illegal_1(z80); op_f5(z80); } /* DB DD */ +OP(dd,f6) { illegal_1(z80); op_f6(z80); } /* DB DD */ +OP(dd,f7) { illegal_1(z80); op_f7(z80); } /* DB DD */ + +OP(dd,f8) { illegal_1(z80); op_f8(z80); } /* DB DD */ +OP(dd,f9) { SP = IX; } /* LD SP,IX */ +OP(dd,fa) { illegal_1(z80); op_fa(z80); } /* DB DD */ +OP(dd,fb) { illegal_1(z80); op_fb(z80); } /* DB DD */ +OP(dd,fc) { illegal_1(z80); op_fc(z80); } /* DB DD */ +OP(dd,fd) { illegal_1(z80); op_fd(z80); } /* DB DD */ +OP(dd,fe) { illegal_1(z80); op_fe(z80); } /* DB DD */ +OP(dd,ff) { illegal_1(z80); op_ff(z80); } /* DB DD */ + +/********************************************************** + * IY register related opcodes (FD prefix) + **********************************************************/ +OP(fd,00) { illegal_1(z80); op_00(z80); } /* DB FD */ +OP(fd,01) { illegal_1(z80); op_01(z80); } /* DB FD */ +OP(fd,02) { illegal_1(z80); op_02(z80); } /* DB FD */ +OP(fd,03) { illegal_1(z80); op_03(z80); } /* DB FD */ +OP(fd,04) { illegal_1(z80); op_04(z80); } /* DB FD */ +OP(fd,05) { illegal_1(z80); op_05(z80); } /* DB FD */ +OP(fd,06) { illegal_1(z80); op_06(z80); } /* DB FD */ +OP(fd,07) { illegal_1(z80); op_07(z80); } /* DB FD */ + +OP(fd,08) { illegal_1(z80); op_08(z80); } /* DB FD */ +OP(fd,09) { add16(z80, &z80->m_iy, &z80->m_bc); } /* ADD IY,BC */ +OP(fd,0a) { illegal_1(z80); op_0a(z80); } /* DB FD */ +OP(fd,0b) { illegal_1(z80); op_0b(z80); } /* DB FD */ +OP(fd,0c) { illegal_1(z80); op_0c(z80); } /* DB FD */ +OP(fd,0d) { illegal_1(z80); op_0d(z80); } /* DB FD */ +OP(fd,0e) { illegal_1(z80); op_0e(z80); } /* DB FD */ +OP(fd,0f) { illegal_1(z80); op_0f(z80); } /* DB FD */ + +OP(fd,10) { illegal_1(z80); op_10(z80); } /* DB FD */ +OP(fd,11) { illegal_1(z80); op_11(z80); } /* DB FD */ +OP(fd,12) { illegal_1(z80); op_12(z80); } /* DB FD */ +OP(fd,13) { illegal_1(z80); op_13(z80); } /* DB FD */ +OP(fd,14) { illegal_1(z80); op_14(z80); } /* DB FD */ +OP(fd,15) { illegal_1(z80); op_15(z80); } /* DB FD */ +OP(fd,16) { illegal_1(z80); op_16(z80); } /* DB FD */ +OP(fd,17) { illegal_1(z80); op_17(z80); } /* DB FD */ + +OP(fd,18) { illegal_1(z80); op_18(z80); } /* DB FD */ +OP(fd,19) { add16(z80, &z80->m_iy, &z80->m_de); } /* ADD IY,DE */ +OP(fd,1a) { illegal_1(z80); op_1a(z80); } /* DB FD */ +OP(fd,1b) { illegal_1(z80); op_1b(z80); } /* DB FD */ +OP(fd,1c) { illegal_1(z80); op_1c(z80); } /* DB FD */ +OP(fd,1d) { illegal_1(z80); op_1d(z80); } /* DB FD */ +OP(fd,1e) { illegal_1(z80); op_1e(z80); } /* DB FD */ +OP(fd,1f) { illegal_1(z80); op_1f(z80); } /* DB FD */ + +OP(fd,20) { illegal_1(z80); op_20(z80); } /* DB FD */ +OP(fd,21) { IY = arg16(z80); } /* LD IY,w */ +OP(fd,22) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_iy); WZ = z80->m_ea + 1; } /* LD (w),IY */ +OP(fd,23) { IY++; } /* INC IY */ +OP(fd,24) { HY = inc(z80, HY); } /* INC HY */ +OP(fd,25) { HY = dec(z80, HY); } /* DEC HY */ +OP(fd,26) { HY = arg(z80); } /* LD HY,n */ +OP(fd,27) { illegal_1(z80); op_27(z80); } /* DB FD */ + +OP(fd,28) { illegal_1(z80); op_28(z80); } /* DB FD */ +OP(fd,29) { add16(z80, &z80->m_iy, &z80->m_iy); } /* ADD IY,IY */ +OP(fd,2a) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_iy); WZ = z80->m_ea + 1; } /* LD IY,(w) */ +OP(fd,2b) { IY--; } /* DEC IY */ +OP(fd,2c) { LY = inc(z80, LY); } /* INC LY */ +OP(fd,2d) { LY = dec(z80, LY); } /* DEC LY */ +OP(fd,2e) { LY = arg(z80); } /* LD LY,n */ +OP(fd,2f) { illegal_1(z80); op_2f(z80); } /* DB FD */ + +OP(fd,30) { illegal_1(z80); op_30(z80); } /* DB FD */ +OP(fd,31) { illegal_1(z80); op_31(z80); } /* DB FD */ +OP(fd,32) { illegal_1(z80); op_32(z80); } /* DB FD */ +OP(fd,33) { illegal_1(z80); op_33(z80); } /* DB FD */ +OP(fd,34) { eay(z80); wm(z80, z80->m_ea, inc(z80, rm(z80, z80->m_ea))); } /* INC (IY+o) */ +OP(fd,35) { eay(z80); wm(z80, z80->m_ea, dec(z80, rm(z80, z80->m_ea))); } /* DEC (IY+o) */ +OP(fd,36) { eay(z80); wm(z80, z80->m_ea, arg(z80)); } /* LD (IY+o),n */ +OP(fd,37) { illegal_1(z80); op_37(z80); } /* DB FD */ + +OP(fd,38) { illegal_1(z80); op_38(z80); } /* DB FD */ +OP(fd,39) { add16(z80, &z80->m_iy, &z80->m_sp); } /* ADD IY,SP */ +OP(fd,3a) { illegal_1(z80); op_3a(z80); } /* DB FD */ +OP(fd,3b) { illegal_1(z80); op_3b(z80); } /* DB FD */ +OP(fd,3c) { illegal_1(z80); op_3c(z80); } /* DB FD */ +OP(fd,3d) { illegal_1(z80); op_3d(z80); } /* DB FD */ +OP(fd,3e) { illegal_1(z80); op_3e(z80); } /* DB FD */ +OP(fd,3f) { illegal_1(z80); op_3f(z80); } /* DB FD */ + +OP(fd,40) { illegal_1(z80); op_40(z80); } /* DB FD */ +OP(fd,41) { illegal_1(z80); op_41(z80); } /* DB FD */ +OP(fd,42) { illegal_1(z80); op_42(z80); } /* DB FD */ +OP(fd,43) { illegal_1(z80); op_43(z80); } /* DB FD */ +OP(fd,44) { B = HY; } /* LD B,HY */ +OP(fd,45) { B = LY; } /* LD B,LY */ +OP(fd,46) { eay(z80); B = rm(z80, z80->m_ea); } /* LD B,(IY+o) */ +OP(fd,47) { illegal_1(z80); op_47(z80); } /* DB FD */ + +OP(fd,48) { illegal_1(z80); op_48(z80); } /* DB FD */ +OP(fd,49) { illegal_1(z80); op_49(z80); } /* DB FD */ +OP(fd,4a) { illegal_1(z80); op_4a(z80); } /* DB FD */ +OP(fd,4b) { illegal_1(z80); op_4b(z80); } /* DB FD */ +OP(fd,4c) { C = HY; } /* LD C,HY */ +OP(fd,4d) { C = LY; } /* LD C,LY */ +OP(fd,4e) { eay(z80); C = rm(z80, z80->m_ea); } /* LD C,(IY+o) */ +OP(fd,4f) { illegal_1(z80); op_4f(z80); } /* DB FD */ + +OP(fd,50) { illegal_1(z80); op_50(z80); } /* DB FD */ +OP(fd,51) { illegal_1(z80); op_51(z80); } /* DB FD */ +OP(fd,52) { illegal_1(z80); op_52(z80); } /* DB FD */ +OP(fd,53) { illegal_1(z80); op_53(z80); } /* DB FD */ +OP(fd,54) { D = HY; } /* LD D,HY */ +OP(fd,55) { D = LY; } /* LD D,LY */ +OP(fd,56) { eay(z80); D = rm(z80, z80->m_ea); } /* LD D,(IY+o) */ +OP(fd,57) { illegal_1(z80); op_57(z80); } /* DB FD */ + +OP(fd,58) { illegal_1(z80); op_58(z80); } /* DB FD */ +OP(fd,59) { illegal_1(z80); op_59(z80); } /* DB FD */ +OP(fd,5a) { illegal_1(z80); op_5a(z80); } /* DB FD */ +OP(fd,5b) { illegal_1(z80); op_5b(z80); } /* DB FD */ +OP(fd,5c) { E = HY; } /* LD E,HY */ +OP(fd,5d) { E = LY; } /* LD E,LY */ +OP(fd,5e) { eay(z80); E = rm(z80, z80->m_ea); } /* LD E,(IY+o) */ +OP(fd,5f) { illegal_1(z80); op_5f(z80); } /* DB FD */ + +OP(fd,60) { HY = B; } /* LD HY,B */ +OP(fd,61) { HY = C; } /* LD HY,C */ +OP(fd,62) { HY = D; } /* LD HY,D */ +OP(fd,63) { HY = E; } /* LD HY,E */ +OP(fd,64) { } /* LD HY,HY */ +OP(fd,65) { HY = LY; } /* LD HY,LY */ +OP(fd,66) { eay(z80); H = rm(z80, z80->m_ea); } /* LD H,(IY+o) */ +OP(fd,67) { HY = A; } /* LD HY,A */ + +OP(fd,68) { LY = B; } /* LD LY,B */ +OP(fd,69) { LY = C; } /* LD LY,C */ +OP(fd,6a) { LY = D; } /* LD LY,D */ +OP(fd,6b) { LY = E; } /* LD LY,E */ +OP(fd,6c) { LY = HY; } /* LD LY,HY */ +OP(fd,6d) { } /* LD LY,LY */ +OP(fd,6e) { eay(z80); L = rm(z80, z80->m_ea); } /* LD L,(IY+o) */ +OP(fd,6f) { LY = A; } /* LD LY,A */ + +OP(fd,70) { eay(z80); wm(z80, z80->m_ea, B); } /* LD (IY+o),B */ +OP(fd,71) { eay(z80); wm(z80, z80->m_ea, C); } /* LD (IY+o),C */ +OP(fd,72) { eay(z80); wm(z80, z80->m_ea, D); } /* LD (IY+o),D */ +OP(fd,73) { eay(z80); wm(z80, z80->m_ea, E); } /* LD (IY+o),E */ +OP(fd,74) { eay(z80); wm(z80, z80->m_ea, H); } /* LD (IY+o),H */ +OP(fd,75) { eay(z80); wm(z80, z80->m_ea, L); } /* LD (IY+o),L */ +OP(fd,76) { illegal_1(z80); op_76(z80); } /* DB FD */ +OP(fd,77) { eay(z80); wm(z80, z80->m_ea, A); } /* LD (IY+o),A */ + +OP(fd,78) { illegal_1(z80); op_78(z80); } /* DB FD */ +OP(fd,79) { illegal_1(z80); op_79(z80); } /* DB FD */ +OP(fd,7a) { illegal_1(z80); op_7a(z80); } /* DB FD */ +OP(fd,7b) { illegal_1(z80); op_7b(z80); } /* DB FD */ +OP(fd,7c) { A = HY; } /* LD A,HY */ +OP(fd,7d) { A = LY; } /* LD A,LY */ +OP(fd,7e) { eay(z80); A = rm(z80, z80->m_ea); } /* LD A,(IY+o) */ +OP(fd,7f) { illegal_1(z80); op_7f(z80); } /* DB FD */ + +OP(fd,80) { illegal_1(z80); op_80(z80); } /* DB FD */ +OP(fd,81) { illegal_1(z80); op_81(z80); } /* DB FD */ +OP(fd,82) { illegal_1(z80); op_82(z80); } /* DB FD */ +OP(fd,83) { illegal_1(z80); op_83(z80); } /* DB FD */ +OP(fd,84) { add_a(z80, HY); } /* ADD A,HY */ +OP(fd,85) { add_a(z80, LY); } /* ADD A,LY */ +OP(fd,86) { eay(z80); add_a(z80, rm(z80, z80->m_ea)); } /* ADD A,(IY+o) */ +OP(fd,87) { illegal_1(z80); op_87(z80); } /* DB FD */ + +OP(fd,88) { illegal_1(z80); op_88(z80); } /* DB FD */ +OP(fd,89) { illegal_1(z80); op_89(z80); } /* DB FD */ +OP(fd,8a) { illegal_1(z80); op_8a(z80); } /* DB FD */ +OP(fd,8b) { illegal_1(z80); op_8b(z80); } /* DB FD */ +OP(fd,8c) { adc_a(z80, HY); } /* ADC A,HY */ +OP(fd,8d) { adc_a(z80, LY); } /* ADC A,LY */ +OP(fd,8e) { eay(z80); adc_a(z80, rm(z80, z80->m_ea)); } /* ADC A,(IY+o) */ +OP(fd,8f) { illegal_1(z80); op_8f(z80); } /* DB FD */ + +OP(fd,90) { illegal_1(z80); op_90(z80); } /* DB FD */ +OP(fd,91) { illegal_1(z80); op_91(z80); } /* DB FD */ +OP(fd,92) { illegal_1(z80); op_92(z80); } /* DB FD */ +OP(fd,93) { illegal_1(z80); op_93(z80); } /* DB FD */ +OP(fd,94) { sub(z80, HY); } /* SUB HY */ +OP(fd,95) { sub(z80, LY); } /* SUB LY */ +OP(fd,96) { eay(z80); sub(z80, rm(z80, z80->m_ea)); } /* SUB (IY+o) */ +OP(fd,97) { illegal_1(z80); op_97(z80); } /* DB FD */ + +OP(fd,98) { illegal_1(z80); op_98(z80); } /* DB FD */ +OP(fd,99) { illegal_1(z80); op_99(z80); } /* DB FD */ +OP(fd,9a) { illegal_1(z80); op_9a(z80); } /* DB FD */ +OP(fd,9b) { illegal_1(z80); op_9b(z80); } /* DB FD */ +OP(fd,9c) { sbc_a(z80, HY); } /* SBC A,HY */ +OP(fd,9d) { sbc_a(z80, LY); } /* SBC A,LY */ +OP(fd,9e) { eay(z80); sbc_a(z80, rm(z80, z80->m_ea)); } /* SBC A,(IY+o) */ +OP(fd,9f) { illegal_1(z80); op_9f(z80); } /* DB FD */ + +OP(fd,a0) { illegal_1(z80); op_a0(z80); } /* DB FD */ +OP(fd,a1) { illegal_1(z80); op_a1(z80); } /* DB FD */ +OP(fd,a2) { illegal_1(z80); op_a2(z80); } /* DB FD */ +OP(fd,a3) { illegal_1(z80); op_a3(z80); } /* DB FD */ +OP(fd,a4) { and_a(z80, HY); } /* AND HY */ +OP(fd,a5) { and_a(z80, LY); } /* AND LY */ +OP(fd,a6) { eay(z80); and_a(z80, rm(z80, z80->m_ea)); } /* AND (IY+o) */ +OP(fd,a7) { illegal_1(z80); op_a7(z80); } /* DB FD */ + +OP(fd,a8) { illegal_1(z80); op_a8(z80); } /* DB FD */ +OP(fd,a9) { illegal_1(z80); op_a9(z80); } /* DB FD */ +OP(fd,aa) { illegal_1(z80); op_aa(z80); } /* DB FD */ +OP(fd,ab) { illegal_1(z80); op_ab(z80); } /* DB FD */ +OP(fd,ac) { xor_a(z80, HY); } /* XOR HY */ +OP(fd,ad) { xor_a(z80, LY); } /* XOR LY */ +OP(fd,ae) { eay(z80); xor_a(z80, rm(z80, z80->m_ea)); } /* XOR (IY+o) */ +OP(fd,af) { illegal_1(z80); op_af(z80); } /* DB FD */ + +OP(fd,b0) { illegal_1(z80); op_b0(z80); } /* DB FD */ +OP(fd,b1) { illegal_1(z80); op_b1(z80); } /* DB FD */ +OP(fd,b2) { illegal_1(z80); op_b2(z80); } /* DB FD */ +OP(fd,b3) { illegal_1(z80); op_b3(z80); } /* DB FD */ +OP(fd,b4) { or_a(z80, HY); } /* OR HY */ +OP(fd,b5) { or_a(z80, LY); } /* OR LY */ +OP(fd,b6) { eay(z80); or_a(z80, rm(z80, z80->m_ea)); } /* OR (IY+o) */ +OP(fd,b7) { illegal_1(z80); op_b7(z80); } /* DB FD */ + +OP(fd,b8) { illegal_1(z80); op_b8(z80); } /* DB FD */ +OP(fd,b9) { illegal_1(z80); op_b9(z80); } /* DB FD */ +OP(fd,ba) { illegal_1(z80); op_ba(z80); } /* DB FD */ +OP(fd,bb) { illegal_1(z80); op_bb(z80); } /* DB FD */ +OP(fd,bc) { cp(z80, HY); } /* CP HY */ +OP(fd,bd) { cp(z80, LY); } /* CP LY */ +OP(fd,be) { eay(z80); cp(z80, rm(z80, z80->m_ea)); } /* CP (IY+o) */ +OP(fd,bf) { illegal_1(z80); op_bf(z80); } /* DB FD */ + +OP(fd,c0) { illegal_1(z80); op_c0(z80); } /* DB FD */ +OP(fd,c1) { illegal_1(z80); op_c1(z80); } /* DB FD */ +OP(fd,c2) { illegal_1(z80); op_c2(z80); } /* DB FD */ +OP(fd,c3) { illegal_1(z80); op_c3(z80); } /* DB FD */ +OP(fd,c4) { illegal_1(z80); op_c4(z80); } /* DB FD */ +OP(fd,c5) { illegal_1(z80); op_c5(z80); } /* DB FD */ +OP(fd,c6) { illegal_1(z80); op_c6(z80); } /* DB FD */ +OP(fd,c7) { illegal_1(z80); op_c7(z80); } /* DB FD */ + +OP(fd,c8) { illegal_1(z80); op_c8(z80); } /* DB FD */ +OP(fd,c9) { illegal_1(z80); op_c9(z80); } /* DB FD */ +OP(fd,ca) { illegal_1(z80); op_ca(z80); } /* DB FD */ +OP(fd,cb) { eay(z80); EXEC(xycb,arg(z80)); } /* ** FD CB xx */ +OP(fd,cc) { illegal_1(z80); op_cc(z80); } /* DB FD */ +OP(fd,cd) { illegal_1(z80); op_cd(z80); } /* DB FD */ +OP(fd,ce) { illegal_1(z80); op_ce(z80); } /* DB FD */ +OP(fd,cf) { illegal_1(z80); op_cf(z80); } /* DB FD */ + +OP(fd,d0) { illegal_1(z80); op_d0(z80); } /* DB FD */ +OP(fd,d1) { illegal_1(z80); op_d1(z80); } /* DB FD */ +OP(fd,d2) { illegal_1(z80); op_d2(z80); } /* DB FD */ +OP(fd,d3) { illegal_1(z80); op_d3(z80); } /* DB FD */ +OP(fd,d4) { illegal_1(z80); op_d4(z80); } /* DB FD */ +OP(fd,d5) { illegal_1(z80); op_d5(z80); } /* DB FD */ +OP(fd,d6) { illegal_1(z80); op_d6(z80); } /* DB FD */ +OP(fd,d7) { illegal_1(z80); op_d7(z80); } /* DB FD */ + +OP(fd,d8) { illegal_1(z80); op_d8(z80); } /* DB FD */ +OP(fd,d9) { illegal_1(z80); op_d9(z80); } /* DB FD */ +OP(fd,da) { illegal_1(z80); op_da(z80); } /* DB FD */ +OP(fd,db) { illegal_1(z80); op_db(z80); } /* DB FD */ +OP(fd,dc) { illegal_1(z80); op_dc(z80); } /* DB FD */ +OP(fd,dd) { illegal_1(z80); op_dd(z80); } /* DB FD */ +OP(fd,de) { illegal_1(z80); op_de(z80); } /* DB FD */ +OP(fd,df) { illegal_1(z80); op_df(z80); } /* DB FD */ + +OP(fd,e0) { illegal_1(z80); op_e0(z80); } /* DB FD */ +OP(fd,e1) { pop(z80, &z80->m_iy); } /* POP IY */ +OP(fd,e2) { illegal_1(z80); op_e2(z80); } /* DB FD */ +OP(fd,e3) { ex_sp(z80, &z80->m_iy); } /* EX (SP),IY */ +OP(fd,e4) { illegal_1(z80); op_e4(z80); } /* DB FD */ +OP(fd,e5) { push(z80, &z80->m_iy); } /* PUSH IY */ +OP(fd,e6) { illegal_1(z80); op_e6(z80); } /* DB FD */ +OP(fd,e7) { illegal_1(z80); op_e7(z80); } /* DB FD */ + +OP(fd,e8) { illegal_1(z80); op_e8(z80); } /* DB FD */ +OP(fd,e9) { PC = IY; } /* JP (IY) */ +OP(fd,ea) { illegal_1(z80); op_ea(z80); } /* DB FD */ +OP(fd,eb) { illegal_1(z80); op_eb(z80); } /* DB FD */ +OP(fd,ec) { illegal_1(z80); op_ec(z80); } /* DB FD */ +OP(fd,ed) { illegal_1(z80); op_ed(z80); } /* DB FD */ +OP(fd,ee) { illegal_1(z80); op_ee(z80); } /* DB FD */ +OP(fd,ef) { illegal_1(z80); op_ef(z80); } /* DB FD */ + +OP(fd,f0) { illegal_1(z80); op_f0(z80); } /* DB FD */ +OP(fd,f1) { illegal_1(z80); op_f1(z80); } /* DB FD */ +OP(fd,f2) { illegal_1(z80); op_f2(z80); } /* DB FD */ +OP(fd,f3) { illegal_1(z80); op_f3(z80); } /* DB FD */ +OP(fd,f4) { illegal_1(z80); op_f4(z80); } /* DB FD */ +OP(fd,f5) { illegal_1(z80); op_f5(z80); } /* DB FD */ +OP(fd,f6) { illegal_1(z80); op_f6(z80); } /* DB FD */ +OP(fd,f7) { illegal_1(z80); op_f7(z80); } /* DB FD */ + +OP(fd,f8) { illegal_1(z80); op_f8(z80); } /* DB FD */ +OP(fd,f9) { SP = IY; } /* LD SP,IY */ +OP(fd,fa) { illegal_1(z80); op_fa(z80); } /* DB FD */ +OP(fd,fb) { illegal_1(z80); op_fb(z80); } /* DB FD */ +OP(fd,fc) { illegal_1(z80); op_fc(z80); } /* DB FD */ +OP(fd,fd) { illegal_1(z80); op_fd(z80); } /* DB FD */ +OP(fd,fe) { illegal_1(z80); op_fe(z80); } /* DB FD */ +OP(fd,ff) { illegal_1(z80); op_ff(z80); } /* DB FD */ + +OP(illegal,2) +{ + warning("Z80 ill. opcode $ed $%02x\n", + rm(z80, (PCD-1)&0xffff)); +} + +/********************************************************** + * special opcodes (ED prefix) + **********************************************************/ +OP(ed,00) { illegal_2(z80); } /* DB ED */ +OP(ed,01) { illegal_2(z80); } /* DB ED */ +OP(ed,02) { illegal_2(z80); } /* DB ED */ +OP(ed,03) { illegal_2(z80); } /* DB ED */ +OP(ed,04) { illegal_2(z80); } /* DB ED */ +OP(ed,05) { illegal_2(z80); } /* DB ED */ +OP(ed,06) { illegal_2(z80); } /* DB ED */ +OP(ed,07) { illegal_2(z80); } /* DB ED */ + +OP(ed,08) { illegal_2(z80); } /* DB ED */ +OP(ed,09) { illegal_2(z80); } /* DB ED */ +OP(ed,0a) { illegal_2(z80); } /* DB ED */ +OP(ed,0b) { illegal_2(z80); } /* DB ED */ +OP(ed,0c) { illegal_2(z80); } /* DB ED */ +OP(ed,0d) { illegal_2(z80); } /* DB ED */ +OP(ed,0e) { illegal_2(z80); } /* DB ED */ +OP(ed,0f) { illegal_2(z80); } /* DB ED */ + +OP(ed,10) { illegal_2(z80); } /* DB ED */ +OP(ed,11) { illegal_2(z80); } /* DB ED */ +OP(ed,12) { illegal_2(z80); } /* DB ED */ +OP(ed,13) { illegal_2(z80); } /* DB ED */ +OP(ed,14) { illegal_2(z80); } /* DB ED */ +OP(ed,15) { illegal_2(z80); } /* DB ED */ +OP(ed,16) { illegal_2(z80); } /* DB ED */ +OP(ed,17) { illegal_2(z80); } /* DB ED */ + +OP(ed,18) { illegal_2(z80); } /* DB ED */ +OP(ed,19) { illegal_2(z80); } /* DB ED */ +OP(ed,1a) { illegal_2(z80); } /* DB ED */ +OP(ed,1b) { illegal_2(z80); } /* DB ED */ +OP(ed,1c) { illegal_2(z80); } /* DB ED */ +OP(ed,1d) { illegal_2(z80); } /* DB ED */ +OP(ed,1e) { illegal_2(z80); } /* DB ED */ +OP(ed,1f) { illegal_2(z80); } /* DB ED */ + +OP(ed,20) { illegal_2(z80); } /* DB ED */ +OP(ed,21) { illegal_2(z80); } /* DB ED */ +OP(ed,22) { illegal_2(z80); } /* DB ED */ +OP(ed,23) { illegal_2(z80); } /* DB ED */ +OP(ed,24) { illegal_2(z80); } /* DB ED */ +OP(ed,25) { illegal_2(z80); } /* DB ED */ +OP(ed,26) { illegal_2(z80); } /* DB ED */ +OP(ed,27) { illegal_2(z80); } /* DB ED */ + +OP(ed,28) { illegal_2(z80); } /* DB ED */ +OP(ed,29) { illegal_2(z80); } /* DB ED */ +OP(ed,2a) { illegal_2(z80); } /* DB ED */ +OP(ed,2b) { illegal_2(z80); } /* DB ED */ +OP(ed,2c) { illegal_2(z80); } /* DB ED */ +OP(ed,2d) { illegal_2(z80); } /* DB ED */ +OP(ed,2e) { illegal_2(z80); } /* DB ED */ +OP(ed,2f) { illegal_2(z80); } /* DB ED */ + +OP(ed,30) { illegal_2(z80); } /* DB ED */ +OP(ed,31) { illegal_2(z80); } /* DB ED */ +OP(ed,32) { illegal_2(z80); } /* DB ED */ +OP(ed,33) { illegal_2(z80); } /* DB ED */ +OP(ed,34) { illegal_2(z80); } /* DB ED */ +OP(ed,35) { illegal_2(z80); } /* DB ED */ +OP(ed,36) { illegal_2(z80); } /* DB ED */ +OP(ed,37) { illegal_2(z80); } /* DB ED */ + +OP(ed,38) { illegal_2(z80); } /* DB ED */ +OP(ed,39) { illegal_2(z80); } /* DB ED */ +OP(ed,3a) { illegal_2(z80); } /* DB ED */ +OP(ed,3b) { illegal_2(z80); } /* DB ED */ +OP(ed,3c) { illegal_2(z80); } /* DB ED */ +OP(ed,3d) { illegal_2(z80); } /* DB ED */ +OP(ed,3e) { illegal_2(z80); } /* DB ED */ +OP(ed,3f) { illegal_2(z80); } /* DB ED */ + +OP(ed,40) { B = in(z80, BC); F = (F & CF) | SZP[B]; } /* IN B,(C) */ +OP(ed,41) { out(z80, BC, B); } /* OUT (C),B */ +OP(ed,42) { sbc_hl(z80, &z80->m_bc); } /* SBC HL,BC */ +OP(ed,43) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_bc); WZ = z80->m_ea + 1; } /* LD (w),BC */ +OP(ed,44) { neg(z80); } /* NEG */ +OP(ed,45) { retn(z80); } /* RETN */ +OP(ed,46) { z80->m_im = 0; } /* IM 0 */ +OP(ed,47) { ld_i_a(z80); } /* LD i,A */ + +OP(ed,48) { C = in(z80, BC); F = (F & CF) | SZP[C]; } /* IN C,(C) */ +OP(ed,49) { out(z80, BC, C); } /* OUT (C),C */ +OP(ed,4a) { adc_hl(z80, &z80->m_bc); } /* ADC HL,BC */ +OP(ed,4b) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_bc); WZ = z80->m_ea + 1; } /* LD BC,(w) */ +OP(ed,4c) { neg(z80); } /* NEG */ +OP(ed,4d) { reti(z80); } /* RETI */ +OP(ed,4e) { z80->m_im = 0; } /* IM 0 */ +OP(ed,4f) { ld_r_a(z80); } /* LD r,A */ + +OP(ed,50) { D = in(z80, BC); F = (F & CF) | SZP[D]; } /* IN D,(C) */ +OP(ed,51) { out(z80, BC, D); } /* OUT (C),D */ +OP(ed,52) { sbc_hl(z80, &z80->m_de); } /* SBC HL,DE */ +OP(ed,53) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_de); WZ = z80->m_ea + 1; } /* LD (w),DE */ +OP(ed,54) { neg(z80); } /* NEG */ +OP(ed,55) { retn(z80); } /* RETN */ +OP(ed,56) { z80->m_im = 1; } /* IM 1 */ +OP(ed,57) { ld_a_i(z80); } /* LD A,i */ + +OP(ed,58) { E = in(z80, BC); F = (F & CF) | SZP[E]; } /* IN E,(C) */ +OP(ed,59) { out(z80, BC, E); } /* OUT (C),E */ +OP(ed,5a) { adc_hl(z80, &z80->m_de); } /* ADC HL,DE */ +OP(ed,5b) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_de); WZ = z80->m_ea + 1; } /* LD DE,(w) */ +OP(ed,5c) { neg(z80); } /* NEG */ +OP(ed,5d) { reti(z80); } /* RETI */ +OP(ed,5e) { z80->m_im = 2; } /* IM 2 */ +OP(ed,5f) { ld_a_r(z80); } /* LD A,r */ + +OP(ed,60) { H = in(z80, BC); F = (F & CF) | SZP[H]; } /* IN H,(C) */ +OP(ed,61) { out(z80, BC, H); } /* OUT (C),H */ +OP(ed,62) { sbc_hl(z80, &z80->m_hl); } /* SBC HL,HL */ +OP(ed,63) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_hl); WZ = z80->m_ea + 1; } /* LD (w),HL */ +OP(ed,64) { neg(z80); } /* NEG */ +OP(ed,65) { retn(z80); } /* RETN */ +OP(ed,66) { z80->m_im = 0; } /* IM 0 */ +OP(ed,67) { rrd(z80); } /* RRD (HL) */ + +OP(ed,68) { L = in(z80, BC); F = (F & CF) | SZP[L]; } /* IN L,(C) */ +OP(ed,69) { out(z80, BC, L); } /* OUT (C),L */ +OP(ed,6a) { adc_hl(z80, &z80->m_hl); } /* ADC HL,HL */ +OP(ed,6b) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_hl); WZ = z80->m_ea + 1; } /* LD HL,(w) */ +OP(ed,6c) { neg(z80); } /* NEG */ +OP(ed,6d) { reti(z80); } /* RETI */ +OP(ed,6e) { z80->m_im = 0; } /* IM 0 */ +OP(ed,6f) { rld(z80); } /* RLD (HL) */ + +OP(ed,70) { uint8_t res = in(z80, BC); F = (F & CF) | SZP[res]; } /* IN 0,(C) */ +OP(ed,71) { out(z80, BC, 0); } /* OUT (C),0 */ +OP(ed,72) { sbc_hl(z80, &z80->m_sp); } /* SBC HL,SP */ +OP(ed,73) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_sp); WZ = z80->m_ea + 1; } /* LD (w),SP */ +OP(ed,74) { neg(z80); } /* NEG */ +OP(ed,75) { retn(z80); } /* RETN */ +OP(ed,76) { z80->m_im = 1; } /* IM 1 */ +OP(ed,77) { illegal_2(z80); } /* DB ED,77 */ + +OP(ed,78) { A = in(z80, BC); F = (F & CF) | SZP[A]; WZ = BC + 1; } /* IN A,(C) */ +OP(ed,79) { out(z80, BC, A); WZ = BC + 1; } /* OUT (C),A */ +OP(ed,7a) { adc_hl(z80, &z80->m_sp); } /* ADC HL,SP */ +OP(ed,7b) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_sp); WZ = z80->m_ea + 1; } /* LD SP,(w) */ +OP(ed,7c) { neg(z80); } /* NEG */ +OP(ed,7d) { reti(z80); } /* RETI */ +OP(ed,7e) { z80->m_im = 2; } /* IM 2 */ +OP(ed,7f) { illegal_2(z80); } /* DB ED,7F */ + +OP(ed,80) { illegal_2(z80); } /* DB ED */ +OP(ed,81) { illegal_2(z80); } /* DB ED */ +OP(ed,82) { illegal_2(z80); } /* DB ED */ +OP(ed,83) { illegal_2(z80); } /* DB ED */ +OP(ed,84) { illegal_2(z80); } /* DB ED */ +OP(ed,85) { illegal_2(z80); } /* DB ED */ +OP(ed,86) { illegal_2(z80); } /* DB ED */ +OP(ed,87) { illegal_2(z80); } /* DB ED */ + +OP(ed,88) { illegal_2(z80); } /* DB ED */ +OP(ed,89) { illegal_2(z80); } /* DB ED */ +OP(ed,8a) { illegal_2(z80); } /* DB ED */ +OP(ed,8b) { illegal_2(z80); } /* DB ED */ +OP(ed,8c) { illegal_2(z80); } /* DB ED */ +OP(ed,8d) { illegal_2(z80); } /* DB ED */ +OP(ed,8e) { illegal_2(z80); } /* DB ED */ +OP(ed,8f) { illegal_2(z80); } /* DB ED */ + +OP(ed,90) { illegal_2(z80); } /* DB ED */ +OP(ed,91) { illegal_2(z80); } /* DB ED */ +OP(ed,92) { illegal_2(z80); } /* DB ED */ +OP(ed,93) { illegal_2(z80); } /* DB ED */ +OP(ed,94) { illegal_2(z80); } /* DB ED */ +OP(ed,95) { illegal_2(z80); } /* DB ED */ +OP(ed,96) { illegal_2(z80); } /* DB ED */ +OP(ed,97) { illegal_2(z80); } /* DB ED */ + +OP(ed,98) { illegal_2(z80); } /* DB ED */ +OP(ed,99) { illegal_2(z80); } /* DB ED */ +OP(ed,9a) { illegal_2(z80); } /* DB ED */ +OP(ed,9b) { illegal_2(z80); } /* DB ED */ +OP(ed,9c) { illegal_2(z80); } /* DB ED */ +OP(ed,9d) { illegal_2(z80); } /* DB ED */ +OP(ed,9e) { illegal_2(z80); } /* DB ED */ +OP(ed,9f) { illegal_2(z80); } /* DB ED */ + +OP(ed,a0) { ldi(z80); } /* LDI */ +OP(ed,a1) { cpi(z80); } /* CPI */ +OP(ed,a2) { ini(z80); } /* INI */ +OP(ed,a3) { outi(z80); } /* OUTI */ +OP(ed,a4) { illegal_2(z80); } /* DB ED */ +OP(ed,a5) { illegal_2(z80); } /* DB ED */ +OP(ed,a6) { illegal_2(z80); } /* DB ED */ +OP(ed,a7) { illegal_2(z80); } /* DB ED */ + +OP(ed,a8) { ldd(z80); } /* LDD */ +OP(ed,a9) { cpd(z80); } /* CPD */ +OP(ed,aa) { ind(z80); } /* IND */ +OP(ed,ab) { outd(z80); } /* OUTD */ +OP(ed,ac) { illegal_2(z80); } /* DB ED */ +OP(ed,ad) { illegal_2(z80); } /* DB ED */ +OP(ed,ae) { illegal_2(z80); } /* DB ED */ +OP(ed,af) { illegal_2(z80); } /* DB ED */ + +OP(ed,b0) { ldir(z80); } /* LDIR */ +OP(ed,b1) { cpir(z80); } /* CPIR */ +OP(ed,b2) { inir(z80); } /* INIR */ +OP(ed,b3) { otir(z80); } /* OTIR */ +OP(ed,b4) { illegal_2(z80); } /* DB ED */ +OP(ed,b5) { illegal_2(z80); } /* DB ED */ +OP(ed,b6) { illegal_2(z80); } /* DB ED */ +OP(ed,b7) { illegal_2(z80); } /* DB ED */ + +OP(ed,b8) { lddr(z80); } /* LDDR */ +OP(ed,b9) { cpdr(z80); } /* CPDR */ +OP(ed,ba) { indr(z80); } /* INDR */ +OP(ed,bb) { otdr(z80); } /* OTDR */ +OP(ed,bc) { illegal_2(z80); } /* DB ED */ +OP(ed,bd) { illegal_2(z80); } /* DB ED */ +OP(ed,be) { illegal_2(z80); } /* DB ED */ +OP(ed,bf) { illegal_2(z80); } /* DB ED */ + +OP(ed,c0) { illegal_2(z80); } /* DB ED */ +OP(ed,c1) { illegal_2(z80); } /* DB ED */ +OP(ed,c2) { illegal_2(z80); } /* DB ED */ +OP(ed,c3) { illegal_2(z80); } /* DB ED */ +OP(ed,c4) { illegal_2(z80); } /* DB ED */ +OP(ed,c5) { illegal_2(z80); } /* DB ED */ +OP(ed,c6) { illegal_2(z80); } /* DB ED */ +OP(ed,c7) { illegal_2(z80); } /* DB ED */ + +OP(ed,c8) { illegal_2(z80); } /* DB ED */ +OP(ed,c9) { illegal_2(z80); } /* DB ED */ +OP(ed,ca) { illegal_2(z80); } /* DB ED */ +OP(ed,cb) { illegal_2(z80); } /* DB ED */ +OP(ed,cc) { illegal_2(z80); } /* DB ED */ +OP(ed,cd) { illegal_2(z80); } /* DB ED */ +OP(ed,ce) { illegal_2(z80); } /* DB ED */ +OP(ed,cf) { illegal_2(z80); } /* DB ED */ + +OP(ed,d0) { illegal_2(z80); } /* DB ED */ +OP(ed,d1) { illegal_2(z80); } /* DB ED */ +OP(ed,d2) { illegal_2(z80); } /* DB ED */ +OP(ed,d3) { illegal_2(z80); } /* DB ED */ +OP(ed,d4) { illegal_2(z80); } /* DB ED */ +OP(ed,d5) { illegal_2(z80); } /* DB ED */ +OP(ed,d6) { illegal_2(z80); } /* DB ED */ +OP(ed,d7) { illegal_2(z80); } /* DB ED */ + +OP(ed,d8) { illegal_2(z80); } /* DB ED */ +OP(ed,d9) { illegal_2(z80); } /* DB ED */ +OP(ed,da) { illegal_2(z80); } /* DB ED */ +OP(ed,db) { illegal_2(z80); } /* DB ED */ +OP(ed,dc) { illegal_2(z80); } /* DB ED */ +OP(ed,dd) { illegal_2(z80); } /* DB ED */ +OP(ed,de) { illegal_2(z80); } /* DB ED */ +OP(ed,df) { illegal_2(z80); } /* DB ED */ + +OP(ed,e0) { illegal_2(z80); } /* DB ED */ +OP(ed,e1) { illegal_2(z80); } /* DB ED */ +OP(ed,e2) { illegal_2(z80); } /* DB ED */ +OP(ed,e3) { illegal_2(z80); } /* DB ED */ +OP(ed,e4) { illegal_2(z80); } /* DB ED */ +OP(ed,e5) { illegal_2(z80); } /* DB ED */ +OP(ed,e6) { illegal_2(z80); } /* DB ED */ +OP(ed,e7) { illegal_2(z80); } /* DB ED */ + +OP(ed,e8) { illegal_2(z80); } /* DB ED */ +OP(ed,e9) { illegal_2(z80); } /* DB ED */ +OP(ed,ea) { illegal_2(z80); } /* DB ED */ +OP(ed,eb) { illegal_2(z80); } /* DB ED */ +OP(ed,ec) { illegal_2(z80); } /* DB ED */ +OP(ed,ed) { illegal_2(z80); } /* DB ED */ +OP(ed,ee) { illegal_2(z80); } /* DB ED */ +OP(ed,ef) { illegal_2(z80); } /* DB ED */ + +OP(ed,f0) { illegal_2(z80); } /* DB ED */ +OP(ed,f1) { illegal_2(z80); } /* DB ED */ +OP(ed,f2) { illegal_2(z80); } /* DB ED */ +OP(ed,f3) { illegal_2(z80); } /* DB ED */ +OP(ed,f4) { illegal_2(z80); } /* DB ED */ +OP(ed,f5) { illegal_2(z80); } /* DB ED */ +OP(ed,f6) { illegal_2(z80); } /* DB ED */ +OP(ed,f7) { illegal_2(z80); } /* DB ED */ + +OP(ed,f8) { illegal_2(z80); } /* DB ED */ +OP(ed,f9) { illegal_2(z80); } /* DB ED */ +OP(ed,fa) { illegal_2(z80); } /* DB ED */ +OP(ed,fb) { illegal_2(z80); } /* DB ED */ +OP(ed,fc) { illegal_2(z80); } /* DB ED */ +OP(ed,fd) { illegal_2(z80); } /* DB ED */ +OP(ed,fe) { illegal_2(z80); } /* DB ED */ +OP(ed,ff) { illegal_2(z80); } /* DB ED */ + + +/********************************************************** + * main opcodes + **********************************************************/ +OP(op,00) { } /* NOP */ +OP(op,01) { BC = arg16(z80); } /* LD BC,w */ +OP(op,02) { wm(z80, BC,A); WZ_L = (BC + 1) & 0xFF; WZ_H = A; } /* LD (BC),A */ +OP(op,03) { BC++; } /* INC BC */ +OP(op,04) { B = inc(z80, B); } /* INC B */ +OP(op,05) { B = dec(z80, B); } /* DEC B */ +OP(op,06) { B = arg(z80); } /* LD B,n */ +OP(op,07) { rlca(z80); } /* RLCA */ + +OP(op,08) { ex_af(z80); } /* EX AF,AF' */ +OP(op,09) { add16(z80, &z80->m_hl, &z80->m_bc); } /* ADD HL,BC */ +OP(op,0a) { A = rm(z80, BC); WZ=BC+1; } /* LD A,(BC) */ +OP(op,0b) { BC--; } /* DEC BC */ +OP(op,0c) { C = inc(z80, C); } /* INC C */ +OP(op,0d) { C = dec(z80, C); } /* DEC C */ +OP(op,0e) { C = arg(z80); } /* LD C,n */ +OP(op,0f) { rrca(z80); } /* RRCA */ + +OP(op,10) { B--; jr_cond(z80, B, 0x10); } /* DJNZ o */ +OP(op,11) { DE = arg16(z80); } /* LD DE,w */ +OP(op,12) { wm(z80, DE,A); WZ_L = (DE + 1) & 0xFF; WZ_H = A; } /* LD (DE),A */ +OP(op,13) { DE++; } /* INC DE */ +OP(op,14) { D = inc(z80, D); } /* INC D */ +OP(op,15) { D = dec(z80, D); } /* DEC D */ +OP(op,16) { D = arg(z80); } /* LD D,n */ +OP(op,17) { rla(z80); } /* RLA */ + +OP(op,18) { jr(z80); } /* JR o */ +OP(op,19) { add16(z80, &z80->m_hl, &z80->m_de); } /* ADD HL,DE */ +OP(op,1a) { A = rm(z80, DE); WZ = DE + 1; } /* LD A,(DE) */ +OP(op,1b) { DE--; } /* DEC DE */ +OP(op,1c) { E = inc(z80, E); } /* INC E */ +OP(op,1d) { E = dec(z80, E); } /* DEC E */ +OP(op,1e) { E = arg(z80); } /* LD E,n */ +OP(op,1f) { rra(z80); } /* RRA */ + +OP(op,20) { jr_cond(z80, !(F & ZF), 0x20); } /* JR NZ,o */ +OP(op,21) { HL = arg16(z80); } /* LD HL,w */ +OP(op,22) { z80->m_ea = arg16(z80); wm16(z80, z80->m_ea, &z80->m_hl); WZ = z80->m_ea + 1; } /* LD (w),HL */ +OP(op,23) { HL++; } /* INC HL */ +OP(op,24) { H = inc(z80, H); } /* INC H */ +OP(op,25) { H = dec(z80, H); } /* DEC H */ +OP(op,26) { H = arg(z80); } /* LD H,n */ +OP(op,27) { daa(z80); } /* DAA */ + +OP(op,28) { jr_cond(z80, F & ZF, 0x28); } /* JR Z,o */ +OP(op,29) { add16(z80, &z80->m_hl, &z80->m_hl); } /* ADD HL,HL */ +OP(op,2a) { z80->m_ea = arg16(z80); rm16(z80, z80->m_ea, &z80->m_hl); WZ = z80->m_ea+1; } /* LD HL,(w) */ +OP(op,2b) { HL--; } /* DEC HL */ +OP(op,2c) { L = inc(z80, L); } /* INC L */ +OP(op,2d) { L = dec(z80, L); } /* DEC L */ +OP(op,2e) { L = arg(z80); } /* LD L,n */ +OP(op,2f) { A ^= 0xff; F = (F & (SF | ZF | PF | CF)) | HF | NF | (A & (YF | XF)); } /* CPL */ + +OP(op,30) { jr_cond(z80, !(F & CF), 0x30); } /* JR NC,o */ +OP(op,31) { SP = arg16(z80); } /* LD SP,w */ +OP(op,32) { z80->m_ea = arg16(z80); wm(z80, z80->m_ea, A); WZ_L = (z80->m_ea + 1) & 0xFF; WZ_H = A; } /* LD (w),A */ +OP(op,33) { SP++; } /* INC SP */ +OP(op,34) { wm(z80, HL, inc(z80, rm(z80, HL))); } /* INC (HL) */ +OP(op,35) { wm(z80, HL, dec(z80, rm(z80, HL))); } /* DEC (HL) */ +OP(op,36) { wm(z80, HL, arg(z80)); } /* LD (HL),n */ +OP(op,37) { F = (F & (SF | ZF | YF | XF | PF)) | CF | (A & (YF | XF)); } /* SCF */ + +OP(op,38) { jr_cond(z80, F & CF, 0x38); } /* JR C,o */ +OP(op,39) { add16(z80, &z80->m_hl, &z80->m_sp); } /* ADD HL,SP */ +OP(op,3a) { z80->m_ea = arg16(z80); A = rm(z80, z80->m_ea); WZ = z80->m_ea + 1; } /* LD A,(w) */ +OP(op,3b) { SP--; } /* DEC SP */ +OP(op,3c) { A = inc(z80, A); } /* INC A */ +OP(op,3d) { A = dec(z80, A); } /* DEC A */ +OP(op,3e) { A = arg(z80); } /* LD A,n */ +OP(op,3f) { F = ((F&(SF|ZF|YF|XF|PF|CF))|((F&CF)<<4)|(A&(YF|XF)))^CF; } /* CCF */ + +OP(op,40) { } /* LD B,B */ +OP(op,41) { B = C; } /* LD B,C */ +OP(op,42) { B = D; } /* LD B,D */ +OP(op,43) { B = E; } /* LD B,E */ +OP(op,44) { B = H; } /* LD B,H */ +OP(op,45) { B = L; } /* LD B,L */ +OP(op,46) { B = rm(z80, HL); } /* LD B,(HL) */ +OP(op,47) { B = A; } /* LD B,A */ + +OP(op,48) { C = B; } /* LD C,B */ +OP(op,49) { } /* LD C,C */ +OP(op,4a) { C = D; } /* LD C,D */ +OP(op,4b) { C = E; } /* LD C,E */ +OP(op,4c) { C = H; } /* LD C,H */ +OP(op,4d) { C = L; } /* LD C,L */ +OP(op,4e) { C = rm(z80, HL); } /* LD C,(HL) */ +OP(op,4f) { C = A; } /* LD C,A */ + +OP(op,50) { D = B; } /* LD D,B */ +OP(op,51) { D = C; } /* LD D,C */ +OP(op,52) { } /* LD D,D */ +OP(op,53) { D = E; } /* LD D,E */ +OP(op,54) { D = H; } /* LD D,H */ +OP(op,55) { D = L; } /* LD D,L */ +OP(op,56) { D = rm(z80, HL); } /* LD D,(HL) */ +OP(op,57) { D = A; } /* LD D,A */ + +OP(op,58) { E = B; } /* LD E,B */ +OP(op,59) { E = C; } /* LD E,C */ +OP(op,5a) { E = D; } /* LD E,D */ +OP(op,5b) { } /* LD E,E */ +OP(op,5c) { E = H; } /* LD E,H */ +OP(op,5d) { E = L; } /* LD E,L */ +OP(op,5e) { E = rm(z80, HL); } /* LD E,(HL) */ +OP(op,5f) { E = A; } /* LD E,A */ + +OP(op,60) { H = B; } /* LD H,B */ +OP(op,61) { H = C; } /* LD H,C */ +OP(op,62) { H = D; } /* LD H,D */ +OP(op,63) { H = E; } /* LD H,E */ +OP(op,64) { } /* LD H,H */ +OP(op,65) { H = L; } /* LD H,L */ +OP(op,66) { H = rm(z80, HL); } /* LD H,(HL) */ +OP(op,67) { H = A; } /* LD H,A */ + +OP(op,68) { L = B; } /* LD L,B */ +OP(op,69) { L = C; } /* LD L,C */ +OP(op,6a) { L = D; } /* LD L,D */ +OP(op,6b) { L = E; } /* LD L,E */ +OP(op,6c) { L = H; } /* LD L,H */ +OP(op,6d) { } /* LD L,L */ +OP(op,6e) { L = rm(z80, HL); } /* LD L,(HL) */ +OP(op,6f) { L = A; } /* LD L,A */ + +OP(op,70) { wm(z80, HL, B); } /* LD (HL),B */ +OP(op,71) { wm(z80, HL, C); } /* LD (HL),C */ +OP(op,72) { wm(z80, HL, D); } /* LD (HL),D */ +OP(op,73) { wm(z80, HL, E); } /* LD (HL),E */ +OP(op,74) { wm(z80, HL, H); } /* LD (HL),H */ +OP(op,75) { wm(z80, HL, L); } /* LD (HL),L */ +OP(op,76) { halt(z80); } /* halt */ +OP(op,77) { wm(z80, HL, A); } /* LD (HL),A */ + +OP(op,78) { A = B; } /* LD A,B */ +OP(op,79) { A = C; } /* LD A,C */ +OP(op,7a) { A = D; } /* LD A,D */ +OP(op,7b) { A = E; } /* LD A,E */ +OP(op,7c) { A = H; } /* LD A,H */ +OP(op,7d) { A = L; } /* LD A,L */ +OP(op,7e) { A = rm(z80, HL); } /* LD A,(HL) */ +OP(op,7f) { } /* LD A,A */ + +OP(op,80) { add_a(z80, B); } /* ADD A,B */ +OP(op,81) { add_a(z80, C); } /* ADD A,C */ +OP(op,82) { add_a(z80, D); } /* ADD A,D */ +OP(op,83) { add_a(z80, E); } /* ADD A,E */ +OP(op,84) { add_a(z80, H); } /* ADD A,H */ +OP(op,85) { add_a(z80, L); } /* ADD A,L */ +OP(op,86) { add_a(z80, rm(z80, HL)); } /* ADD A,(HL) */ +OP(op,87) { add_a(z80, A); } /* ADD A,A */ + +OP(op,88) { adc_a(z80, B); } /* ADC A,B */ +OP(op,89) { adc_a(z80, C); } /* ADC A,C */ +OP(op,8a) { adc_a(z80, D); } /* ADC A,D */ +OP(op,8b) { adc_a(z80, E); } /* ADC A,E */ +OP(op,8c) { adc_a(z80, H); } /* ADC A,H */ +OP(op,8d) { adc_a(z80, L); } /* ADC A,L */ +OP(op,8e) { adc_a(z80, rm(z80, HL)); } /* ADC A,(HL) */ +OP(op,8f) { adc_a(z80, A); } /* ADC A,A */ + +OP(op,90) { sub(z80, B); } /* SUB B */ +OP(op,91) { sub(z80, C); } /* SUB C */ +OP(op,92) { sub(z80, D); } /* SUB D */ +OP(op,93) { sub(z80, E); } /* SUB E */ +OP(op,94) { sub(z80, H); } /* SUB H */ +OP(op,95) { sub(z80, L); } /* SUB L */ +OP(op,96) { sub(z80, rm(z80, HL)); } /* SUB (HL) */ +OP(op,97) { sub(z80, A); } /* SUB A */ + +OP(op,98) { sbc_a(z80, B); } /* SBC A,B */ +OP(op,99) { sbc_a(z80, C); } /* SBC A,C */ +OP(op,9a) { sbc_a(z80, D); } /* SBC A,D */ +OP(op,9b) { sbc_a(z80, E); } /* SBC A,E */ +OP(op,9c) { sbc_a(z80, H); } /* SBC A,H */ +OP(op,9d) { sbc_a(z80, L); } /* SBC A,L */ +OP(op,9e) { sbc_a(z80, rm(z80, HL)); } /* SBC A,(HL) */ +OP(op,9f) { sbc_a(z80, A); } /* SBC A,A */ + +OP(op,a0) { and_a(z80, B); } /* AND B */ +OP(op,a1) { and_a(z80, C); } /* AND C */ +OP(op,a2) { and_a(z80, D); } /* AND D */ +OP(op,a3) { and_a(z80, E); } /* AND E */ +OP(op,a4) { and_a(z80, H); } /* AND H */ +OP(op,a5) { and_a(z80, L); } /* AND L */ +OP(op,a6) { and_a(z80, rm(z80, HL)); } /* AND (HL) */ +OP(op,a7) { and_a(z80, A); } /* AND A */ + +OP(op,a8) { xor_a(z80, B); } /* XOR B */ +OP(op,a9) { xor_a(z80, C); } /* XOR C */ +OP(op,aa) { xor_a(z80, D); } /* XOR D */ +OP(op,ab) { xor_a(z80, E); } /* XOR E */ +OP(op,ac) { xor_a(z80, H); } /* XOR H */ +OP(op,ad) { xor_a(z80, L); } /* XOR L */ +OP(op,ae) { xor_a(z80, rm(z80, HL)); } /* XOR (HL) */ +OP(op,af) { xor_a(z80, A); } /* XOR A */ + +OP(op,b0) { or_a(z80, B); } /* OR B */ +OP(op,b1) { or_a(z80, C); } /* OR C */ +OP(op,b2) { or_a(z80, D); } /* OR D */ +OP(op,b3) { or_a(z80, E); } /* OR E */ +OP(op,b4) { or_a(z80, H); } /* OR H */ +OP(op,b5) { or_a(z80, L); } /* OR L */ +OP(op,b6) { or_a(z80, rm(z80, HL)); } /* OR (HL) */ +OP(op,b7) { or_a(z80, A); } /* OR A */ + +OP(op,b8) { cp(z80, B); } /* CP B */ +OP(op,b9) { cp(z80, C); } /* CP C */ +OP(op,ba) { cp(z80, D); } /* CP D */ +OP(op,bb) { cp(z80, E); } /* CP E */ +OP(op,bc) { cp(z80, H); } /* CP H */ +OP(op,bd) { cp(z80, L); } /* CP L */ +OP(op,be) { cp(z80, rm(z80, HL)); } /* CP (HL) */ +OP(op,bf) { cp(z80, A); } /* CP A */ + +OP(op,c0) { ret_cond(z80, !(F & ZF), 0xc0); } /* RET NZ */ +OP(op,c1) { pop(z80, &z80->m_bc); } /* POP BC */ +OP(op,c2) { jp_cond(z80, !(F & ZF)); } /* JP NZ,a */ +OP(op,c3) { jp(z80); } /* JP a */ +OP(op,c4) { call_cond(z80, !(F & ZF), 0xc4); } /* CALL NZ,a */ +OP(op,c5) { push(z80, &z80->m_bc); } /* PUSH BC */ +OP(op,c6) { add_a(z80, arg(z80)); } /* ADD A,n */ +OP(op,c7) { rst(z80, 0x00); } /* RST 0 */ + +OP(op,c8) { ret_cond(z80, F & ZF, 0xc8); } /* RET Z */ +OP(op,c9) { pop(z80, &z80->m_pc); WZ = PCD; } /* RET */ +OP(op,ca) { jp_cond(z80, F & ZF); } /* JP Z,a */ +OP(op,cb) { z80->m_r++; EXEC(cb,rop(z80)); } /* **** CB xx */ +OP(op,cc) { call_cond(z80, F & ZF, 0xcc); } /* CALL Z,a */ +OP(op,cd) { call(z80); } /* CALL a */ +OP(op,ce) { adc_a(z80, arg(z80)); } /* ADC A,n */ +OP(op,cf) { rst(z80, 0x08); } /* RST 1 */ + +OP(op,d0) { ret_cond(z80, !(F & CF), 0xd0); } /* RET NC */ +OP(op,d1) { pop(z80, &z80->m_de); } /* POP DE */ +OP(op,d2) { jp_cond(z80, !(F & CF)); } /* JP NC,a */ +OP(op,d3) { unsigned n = arg(z80) | (A << 8); out(z80, n, A); WZ_L = ((n & 0xff) + 1) & 0xff; WZ_H = A; } /* OUT (n),A */ +OP(op,d4) { call_cond(z80, !(F & CF), 0xd4); } /* CALL NC,a */ +OP(op,d5) { push(z80, &z80->m_de); } /* PUSH DE */ +OP(op,d6) { sub(z80, arg(z80)); } /* SUB n */ +OP(op,d7) { rst(z80, 0x10); } /* RST 2 */ + +OP(op,d8) { ret_cond(z80, F & CF, 0xd8); } /* RET C */ +OP(op,d9) { exx(z80); } /* EXX */ +OP(op,da) { jp_cond(z80, F & CF); } /* JP C,a */ +OP(op,db) { unsigned n = arg(z80) | (A << 8); A = in(z80, n); WZ = n + 1; } /* IN A,(n) */ +OP(op,dc) { call_cond(z80, F & CF, 0xdc); } /* CALL C,a */ +OP(op,dd) { z80->m_r++; EXEC(dd,rop(z80)); } /* **** DD xx */ +OP(op,de) { sbc_a(z80, arg(z80)); } /* SBC A,n */ +OP(op,df) { rst(z80, 0x18); } /* RST 3 */ + +OP(op,e0) { ret_cond(z80, !(F & PF), 0xe0); } /* RET PO */ +OP(op,e1) { pop(z80, &z80->m_hl); } /* POP HL */ +OP(op,e2) { jp_cond(z80, !(F & PF)); } /* JP PO,a */ +OP(op,e3) { ex_sp(z80, &z80->m_hl); } /* EX HL,(SP) */ +OP(op,e4) { call_cond(z80, !(F & PF), 0xe4); } /* CALL PO,a */ +OP(op,e5) { push(z80, &z80->m_hl); } /* PUSH HL */ +OP(op,e6) { and_a(z80, arg(z80)); } /* AND n */ +OP(op,e7) { rst(z80, 0x20); } /* RST 4 */ + +OP(op,e8) { ret_cond(z80, F & PF, 0xe8); } /* RET PE */ +OP(op,e9) { PC = HL; } /* JP (HL) */ +OP(op,ea) { jp_cond(z80, F & PF); } /* JP PE,a */ +OP(op,eb) { ex_de_hl(z80); } /* EX DE,HL */ +OP(op,ec) { call_cond(z80, F & PF, 0xec); } /* CALL PE,a */ +OP(op,ed) { z80->m_r++; EXEC(ed,rop(z80)); } /* **** ED xx */ +OP(op,ee) { xor_a(z80, arg(z80)); } /* XOR n */ +OP(op,ef) { rst(z80, 0x28); } /* RST 5 */ + +OP(op,f0) { ret_cond(z80, !(F & SF), 0xf0); } /* RET P */ +OP(op,f1) { pop(z80, &z80->m_af); } /* POP AF */ +OP(op,f2) { jp_cond(z80, !(F & SF)); } /* JP P,a */ +OP(op,f3) { z80->m_iff1 = z80->m_iff2 = 0; } /* DI */ +OP(op,f4) { call_cond(z80, !(F & SF), 0xf4); } /* CALL P,a */ +OP(op,f5) { push(z80, &z80->m_af); } /* PUSH AF */ +OP(op,f6) { or_a(z80, arg(z80)); } /* OR n */ +OP(op,f7) { rst(z80, 0x30); } /* RST 6 */ + +OP(op,f8) { ret_cond(z80, F & SF, 0xf8); } /* RET M */ +OP(op,f9) { SP = HL; } /* LD SP,HL */ +OP(op,fa) { jp_cond(z80, F & SF); } /* JP M,a */ +OP(op,fb) { ei(z80); } /* EI */ +OP(op,fc) { call_cond(z80, F & SF, 0xfc); } /* CALL M,a */ +OP(op,fd) { z80->m_r++; EXEC(fd,rop(z80)); } /* **** FD xx */ +OP(op,fe) { cp(z80, arg(z80)); } /* CP n */ +OP(op,ff) { rst(z80, 0x38); } /* RST 7 */ + +/* +void z80_device::take_nmi() +{ + PRVPC = 0xffff; // HACK: segag80r protection kludge + + // Check if processor was halted + leave_halt(z80); + +#if HAS_LDAIR_QUIRK + // reset parity flag after LD A,I or LD A,R + if (m_after_ldair) F &= ~PF; +#endif + + m_iff1 = 0; + push(m_pc); + PCD = 0x0066; + WZ=PCD; + m_icount -= 11; + m_nmi_pending = false; +}*/ + +static void take_interrupt(z80_device *z80) +{ + PRVPC = 0xffff; // HACK: segag80r protection kludge + + // check if processor was halted + leave_halt(z80); + + // clear both interrupt flip flops + z80->m_iff1 = z80->m_iff2 = 0; + + + // fetch the IRQ vector + int irq_vector = z80->im2_vector; + + // Interrupt mode 2. Call [i:databyte] + if( z80->m_im == 2 ) + { + // Zilog's datasheet claims that "the least-significant bit must be a zero." + // However, experiments have confirmed that IM 2 vectors do not have to be + // even, and all 8 bits will be used; even $FF is handled normally. + irq_vector = (irq_vector & 0xff) | (z80->m_i << 8); + push(z80, &z80->m_pc); + rm16(z80, irq_vector, &z80->m_pc); + //LOG(("Z80 '%s' IM2 [$%04x] = $%04x\n", tag(), irq_vector, PCD)); + // CALL opcode timing + 'interrupt latency' cycles + z80->m_icount -= z80->m_cc_op[0xcd] + z80->m_cc_ex[0xff]; + } + else + // Interrupt mode 1. RST 38h + if( z80->m_im == 1 ) + { + //LOG(("Z80 '%s' IM1 $0038\n", tag())); + push(z80, &z80->m_pc); + PCD = 0x0038; + // RST $38 + 'interrupt latency' cycles + z80->m_icount -= z80->m_cc_op[0xff] + cc_ex[0xff]; + } + else + { + // Interrupt mode 0. We check for CALL and JP instructions, + // if neither of these were found we assume a 1 byte opcode + // was placed on the databus + //LOG(("Z80 '%s' IM0 $%04x\n", tag(), irq_vector)); + + // check for nop + if (irq_vector != 0x00) + { + switch (irq_vector & 0xff0000) + { + case 0xcd0000: // call + push(z80, &z80->m_pc); + PCD = irq_vector & 0xffff; + // CALL $xxxx cycles + z80->m_icount -= z80->m_cc_op[0xcd]; + break; + case 0xc30000: // jump + PCD = irq_vector & 0xffff; + // JP $xxxx cycles + z80->m_icount -= z80->m_cc_op[0xc3]; + break; + default: // rst (or other opcodes?) + push(z80, &z80->m_pc); + PCD = irq_vector & 0x0038; + // RST $xx cycles + z80->m_icount -= z80->m_cc_op[0xff]; + break; + } + } + + // 'interrupt latency' cycles + z80->m_icount -= z80->m_cc_ex[0xff]; + } + WZ=PCD; + +#if HAS_LDAIR_QUIRK + // reset parity flag after LD A,I or LD A,R + if (m_after_ldair) F &= ~PF; +#endif +} + +void init_z80_opts(z80_options * options, memmap_chunk const * chunks, uint32_t num_chunks, memmap_chunk const * io_chunks, uint32_t num_io_chunks, uint32_t clock_divider, uint32_t io_address_mask) +{ + memset(options, 0, sizeof(*options)); + options->gen.clock_divider = clock_divider; + options->gen.memmap = chunks; + options->gen.memmap_chunks = num_chunks; + options->gen.address_mask = 0xFFFF; + options->iomap = io_chunks; + options->io_chunks = num_io_chunks; + options->io_address_mask = io_address_mask; +} + +/**************************************************************************** + * Processor initialization + ****************************************************************************/ +z80_context *init_z80_context(z80_options *opts) +{ + z80_context *z80 = calloc(1, sizeof(z80_context)); + if( !tables_initialised ) + { + uint8_t *padd = &SZHVC_add[ 0*256]; + uint8_t *padc = &SZHVC_add[256*256]; + uint8_t *psub = &SZHVC_sub[ 0*256]; + uint8_t *psbc = &SZHVC_sub[256*256]; + for (int oldval = 0; oldval < 256; oldval++) + { + for (int newval = 0; newval < 256; newval++) + { + /* add or adc w/o carry set */ + int val = newval - oldval; + *padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; + *padd |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF; + if( newval < oldval ) *padd |= CF; + if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF; + padd++; + + /* adc with carry set */ + val = newval - oldval - 1; + *padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF; + *padc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF; + if( newval <= oldval ) *padc |= CF; + if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF; + padc++; + + /* cp, sub or sbc w/o carry set */ + val = oldval - newval; + *psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); + *psub |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF; + if( newval > oldval ) *psub |= CF; + if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF; + psub++; + + /* sbc with carry set */ + val = oldval - newval - 1; + *psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF); + *psbc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */ + if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF; + if( newval >= oldval ) *psbc |= CF; + if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF; + psbc++; + } + } + + for (int i = 0; i < 256; i++) + { + int p = 0; + if( i&0x01 ) ++p; + if( i&0x02 ) ++p; + if( i&0x04 ) ++p; + if( i&0x08 ) ++p; + if( i&0x10 ) ++p; + if( i&0x20 ) ++p; + if( i&0x40 ) ++p; + if( i&0x80 ) ++p; + SZ[i] = i ? i & SF : ZF; + SZ[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ + SZ_BIT[i] = i ? i & SF : ZF | PF; + SZ_BIT[i] |= (i & (YF | XF)); /* undocumented flag bits 5+3 */ + SZP[i] = SZ[i] | ((p & 1) ? 0 : PF); + SZHV_inc[i] = SZ[i]; + if( i == 0x80 ) SZHV_inc[i] |= VF; + if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF; + SZHV_dec[i] = SZ[i] | NF; + if( i == 0x7f ) SZHV_dec[i] |= VF; + if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF; + } + + tables_initialised = 1; + } + z80->options = opts; + + /* Reset registers to their initial values */ + PRVPC = 0; + PCD = 0; + SPD = 0; + AFD = 0; + BCD = 0; + DED = 0; + HLD = 0; + IXD = 0; + IYD = 0; + WZ = 0; + z80->m_af2.d = 0; + z80->m_bc2.d = 0; + z80->m_de2.d = 0; + z80->m_hl2.d = 0; + z80->m_r = 0; + z80->m_r2 = 0; + z80->m_iff1 = 0; + z80->m_iff2 = 0; + z80->m_halt = 0; + z80->m_im = 0; + z80->m_i = 0; + z80->m_nmi_state = 0; + z80->m_nmi_pending = 0; + z80->m_irq_state = 0; + z80->m_wait_state = 0; + z80->busreq = 0; + z80->m_after_ei = 0; + z80->m_after_ldair = 0; + z80->m_ea = 0; + + IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */ + F = ZF; /* Zero flag is set */ + + /* setup cycle tables */ + z80->m_cc_op = cc_op; + z80->m_cc_cb = cc_cb; + z80->m_cc_ed = cc_ed; + z80->m_cc_xy = cc_xy; + z80->m_cc_xycb = cc_xycb; + z80->m_cc_ex = cc_ex; + + for (uint32_t address = 0; address < (64*1024); address += 8*1024) + { + z80->read_pointers[address >> 13] = NULL; + z80->write_pointers[address >> 13] = NULL; + memmap_chunk const *chunk = find_map_chunk(address, &z80->options->gen, 0, NULL); + if (!chunk || chunk->end < (address + 8*1024) || (chunk->flags & MMAP_PTR_IDX) || !chunk->buffer) { + continue; + } + void *ptr = get_native_pointer(address, (void **)z80->mem_pointers, &z80->options->gen); + if (!ptr) { + continue; + } + if (chunk->flags & MMAP_READ) { + z80->read_pointers[address >> 13] = ptr; + } + if (chunk->flags & MMAP_WRITE) { + z80->write_pointers[address >> 13] = ptr; + } + } + + return z80; +} + +/**************************************************************************** + * Do a reset + ****************************************************************************/ +void z80_assert_reset(z80_context *z80, uint32_t cycle) +{ + z80_run(z80, cycle); + z80->reset = 1; +} +void z80_clear_reset(z80_context *z80, uint32_t cycle) +{ + if (!z80->reset) { + return; + } + z80_run(z80, cycle); + PC = 0x0000; + z80->m_i = 0; + z80->m_r = 0; + z80->m_r2 = 0; + //m_nmi_pending = false; + z80->m_after_ei = 0; + z80->m_after_ldair = 0; + z80->m_iff1 = 0; + z80->m_iff2 = 0; + z80->reset = 0; + + WZ=PCD; +} + +void z80_assert_busreq(z80_context *z80, uint32_t cycle) +{ + z80->busreq = 1; +} + +void z80_clear_busreq(z80_context *z80, uint32_t cycle) +{ + z80->busreq = 0; + z80->busack = 0; +} + +uint8_t z80_get_busack(z80_context * context, uint32_t cycle) +{ + z80_run(context, cycle); + return context->busack; +} + +/**************************************************************************** + * Execute 'cycles' T-states. + ****************************************************************************/ +void z80_run(z80_context *z80, uint32_t target_cycle) +{ + if (z80->busack || z80->reset) { + z80->current_cycle = target_cycle; + return; + } + if (z80->current_cycle >= target_cycle) { + return; + } + uint32_t sync_cycle = target_cycle; + if (z80->next_int_pulse && (z80->int_pulse_end < z80->current_cycle || z80->int_pulse_end == CYCLE_NEVER)) { + z80->next_int_pulse(z80); + } + z80->m_icount = ((target_cycle - z80->current_cycle) + z80->options->gen.clock_divider - 1) / z80->options->gen.clock_divider; + int32_t int_icount = INT_MIN; + if (z80->int_pulse_start < target_cycle) { + int_icount = (z80->int_pulse_start < z80->current_cycle) ? z80->m_icount + : ((z80->int_pulse_start - z80->current_cycle) + z80->options->gen.clock_divider - 1) / z80->options->gen.clock_divider; + } + do + { + // check for interrupts before each instruction + /* + //TODO: Interrupts + if (m_nmi_pending) + take_nmi(z80); + else */ + if (z80->m_icount <= int_icount && z80->m_iff1 && !z80->m_after_ei) { + take_interrupt(z80); + z80->current_cycle = target_cycle - z80->m_icount * z80->options->gen.clock_divider; + if (z80->next_int_pulse) { + z80->next_int_pulse(z80); + } + if (z80->int_pulse_start < target_cycle) { + int_icount = (z80->int_pulse_start < z80->current_cycle) ? z80->m_icount + : ((z80->int_pulse_start - z80->current_cycle) + z80->options->gen.clock_divider - 1) / z80->options->gen.clock_divider; + } + } + + z80->m_after_ei = 0; + z80->m_after_ldair = 0; + + PRVPC = PCD; + /*printf("Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n", + PCD, A, B, C, D, E, H, L, SPD, IXD, IYD, target_cycle - z80->m_icount * z80->options->gen.clock_divider);*/ + //debugger_instruction_hook(this, PCD); + z80->m_r++; + EXEC(op,rop(z80)); + if (z80->busreq) { + z80->busack = 1; + z80->m_icount = 0; + } + } while (z80->m_icount > 0); + z80->current_cycle = target_cycle - z80->m_icount * z80->options->gen.clock_divider; +} + +/************************************************************************** + * Generic set_info + **************************************************************************/ + +void z80_set_cycle_tables(z80_device *z80, const uint8_t *op, const uint8_t *cb, const uint8_t *ed, const uint8_t *xy, const uint8_t *xycb, const uint8_t *ex) +{ + z80->m_cc_op = (op != NULL) ? op : cc_op; + z80->m_cc_cb = (cb != NULL) ? cb : cc_cb; + z80->m_cc_ed = (ed != NULL) ? ed : cc_ed; + z80->m_cc_xy = (xy != NULL) ? xy : cc_xy; + z80->m_cc_xycb = (xycb != NULL) ? xycb : cc_xycb; + z80->m_cc_ex = (ex != NULL) ? ex : cc_ex; +} + +void z80_serialize(z80_context *context, serialize_buffer *buf) +{ +} +void z80_deserialize(deserialize_buffer *buf, void *vcontext) +{ +} + +void z80_options_free(z80_options *opts) +{ + free(opts); +} + +void z80_assert_nmi(z80_context *context, uint32_t cycle) +{ + context->nmi_start = cycle; + //check_nmi(context); +} + +void z80_adjust_cycles(z80_context * context, uint32_t deduction) +{ + if (context->current_cycle < deduction) { + fprintf(stderr, "WARNING: Deduction of %u cycles when Z80 cycle counter is only %u\n", deduction, context->current_cycle); + context->current_cycle = 0; + } else { + context->current_cycle -= deduction; + } + /*if (context->int_enable_cycle != CYCLE_NEVER) { + if (context->int_enable_cycle < deduction) { + context->int_enable_cycle = 0; + } else { + context->int_enable_cycle -= deduction; + } + }*/ + if (context->int_pulse_start != CYCLE_NEVER) { + if (context->int_pulse_end < deduction) { + context->int_pulse_start = context->int_pulse_end = CYCLE_NEVER; + } else { + if (context->int_pulse_end != CYCLE_NEVER) { + context->int_pulse_end -= deduction; + } + if (context->int_pulse_start < deduction) { + context->int_pulse_start = 0; + } else { + context->int_pulse_start -= deduction; + } + } + } +} \ No newline at end of file diff -r 8a29c250f352 -r 8fe162bdb038 mame_z80/z80.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mame_z80/z80.h Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,118 @@ +// license:BSD-3-Clause +// copyright-holders:Juergen Buchmueller +#pragma once + +#ifndef __Z80_H__ +#define __Z80_H__ + +#include "../backend.h" + +typedef struct +{ + cpu_options gen; + memmap_chunk const *iomap; + uint32_t io_chunks; + uint32_t io_address_mask; +} z80_options; + +#define LSB_FIRST + +typedef union +{ +#ifdef LSB_FIRST + struct { uint8_t l,h,h2,h3; } b; + struct { uint16_t l,h; } w; + struct { int8_t l,h,h2,h3; } sb; + struct { int16_t l,h; } sw; +#else + struct { uint8_t h3,h2,h,l; } b; + struct { int8_t h3,h2,h,l; } sb; + struct { uint16_t h,l; } w; + struct { int16_t h,l; } sw; +#endif + uint32_t d; + int32_t sd; +} PAIR; + +#define ZNUM_MEM_AREAS 4 +typedef struct z80_device z80_device; +//typedefs for compatibility with existing BlastEm code +typedef z80_device z80_context; +typedef void (*z80_ctx_fun)(z80_context * context); + +struct z80_device +{ + z80_options *options; + uint8_t * mem_pointers[ZNUM_MEM_AREAS]; + void *system; + z80_ctx_fun next_int_pulse; + + PAIR m_prvpc; + PAIR m_pc; + PAIR m_sp; + PAIR m_af; + PAIR m_bc; + PAIR m_de; + PAIR m_hl; + PAIR m_ix; + PAIR m_iy; + PAIR m_wz; + PAIR m_af2; + PAIR m_bc2; + PAIR m_de2; + PAIR m_hl2; + uint8_t m_r; + uint8_t m_r2; + uint8_t m_iff1; + uint8_t m_iff2; + uint8_t m_halt; + uint8_t m_im; + uint8_t m_i; + uint8_t m_nmi_state; /* nmi line state */ + uint8_t m_nmi_pending; /* nmi pending */ + uint8_t m_irq_state; /* irq line state */ + int m_wait_state; // wait line state + int busreq; // bus request line state + int busack; // bus ack line state + int reset; + uint8_t m_after_ei; /* are we in the EI shadow? */ + uint8_t m_after_ldair; /* same, but for LD A,I or LD A,R */ + uint32_t m_ea; + + int m_icount; + uint32_t current_cycle; + uint32_t nmi_start; + uint32_t int_pulse_start; + uint32_t int_pulse_end; + uint16_t bank_reg; + uint8_t m_rtemp; + uint8_t int_is_nmi; + uint8_t im2_vector; + const uint8_t * m_cc_op; + const uint8_t * m_cc_cb; + const uint8_t * m_cc_ed; + const uint8_t * m_cc_xy; + const uint8_t * m_cc_xycb; + const uint8_t * m_cc_ex; + uint8_t *read_pointers[64/8]; + uint8_t *write_pointers[64/8]; +}; + +#define z80_invalidate_code_range(Z, S, E) +#define z80_handle_code_write(A, Z) + +void init_z80_opts(z80_options * options, memmap_chunk const * chunks, uint32_t num_chunks, memmap_chunk const * io_chunks, uint32_t num_io_chunks, uint32_t clock_divider, uint32_t io_address_mask); +z80_context *init_z80_context(z80_options *opts); +void z80_assert_reset(z80_context *z80, uint32_t cycle); +void z80_clear_reset(z80_context *z80, uint32_t cycle); +void z80_assert_busreq(z80_context *z80, uint32_t cycle); +void z80_clear_busreq(z80_context *z80, uint32_t cycle); +void z80_run(z80_context *z80, uint32_t target_cycle); +uint8_t z80_get_busack(z80_context * context, uint32_t cycle); +void z80_adjust_cycles(z80_context * context, uint32_t deduction); +void z80_serialize(z80_context *context, serialize_buffer *buf); +void z80_deserialize(deserialize_buffer *buf, void *vcontext); +void z80_options_free(z80_options *opts); +void z80_assert_nmi(z80_context *context, uint32_t cycle); + +#endif /* __Z80_H__ */ diff -r 8a29c250f352 -r 8fe162bdb038 musashi/m68kcpu.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/musashi/m68kcpu.c Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,948 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ + +#if 0 +static const char copyright_notice[] = +"MUSASHI\n" +"Version 4.95 (2012-02-19)\n" +"A portable Motorola M68xxx/CPU32/ColdFire processor emulation engine.\n" +"Copyright Karl Stenerud. All rights reserved.\n" +; +#endif + + +/* ======================================================================== */ +/* ================================= NOTES ================================ */ +/* ======================================================================== */ + + + +/* ======================================================================== */ +/* ================================ INCLUDES ============================== */ +/* ======================================================================== */ + +#include "m68kcpu.h" +#include "m68kops.h" +#include +#include + + +/* ======================================================================== */ +/* ================================= DATA ================================= */ +/* ======================================================================== */ + +/* Used by shift & rotate instructions */ +const uint8_t 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 +}; +const uint16_t 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 +}; +const uint32_t 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. + */ +const uint8_t m68ki_exception_cycle_table[7][256] = +{ + { /* 000 */ + 40, /* 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 */ + 40, /* 6: CHK */ + 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 */ + 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 */ + 40, /* 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 + }, + { /* 030 - not correct */ + 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 + }, + { /* 040 */ // TODO: these values are not correct + 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 + }, + { /* CPU32 */ + 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 + }, + { /* ColdFire - not correct */ + 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 + }, +}; + +const uint8_t 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 nullptr */ + 5, /* ..01..01 memory indirect, base nullptr, outer nullptr */ + 7, /* ..01..10 memory indirect, base nullptr, outer 16 */ + 7, /* ..01..11 memory indirect, base nullptr, 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 nullptr */ + 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 nullptr */ + 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 +}; + + + +/*************************************************************************** + CPU STATE DESCRIPTION +***************************************************************************/ + +#define MASK_ALL (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 ) +#define MASK_24BIT_SPACE (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020) +#define MASK_32BIT_SPACE (CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 ) +#define MASK_010_OR_LATER (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 ) +#define MASK_020_OR_LATER (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_EC040 | CPU_TYPE_040 | CPU_TYPE_FSCPU32 ) +#define MASK_030_OR_LATER (CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040) +#define MASK_040_OR_LATER (CPU_TYPE_040 | CPU_TYPE_EC040) + + + +/* ======================================================================== */ +/* ================================= API ================================== */ +/* ======================================================================== */ + + + +void m68k_cpu_execute(m68000_base_device *this) +{ + //this->initial_cycles = this->remaining_cycles; + + /* eat up any reset cycles */ + /*if (this->reset_cycles) { + int rc = this->reset_cycles; + this->reset_cycles = 0; + this->remaining_cycles -= rc; + + if (this->remaining_cycles <= 0) return; + }*/ + + /* See if interrupts came in */ + m68ki_check_interrupts(this); + + /* Make sure we're not stopped */ + if(!this->stopped) + { + /* Return point if we had an address error */ + /*check_address_error: + if (this->m_address_error==1) + { + this->m_address_error = 0; + try { + m68ki_exception_address_error(this); + } + catch(int error) + { + if (error==10) + { + this->m_address_error = 1; + REG_PPC(this) = REG_PC(this); + goto check_address_error; + } + else + throw; + } + if(stopped) + { + if (remaining_cycles > 0) + remaining_cycles = 0; + return; + } + }*/ + + + /* Main loop. Keep going until we run out of clock cycles */ + while (this->c.current_cycle < this->c.target_cycle) + { + /* Set tracing accodring to T1. (T0 is done inside instruction) */ + m68ki_trace_t1(this); /* auto-disable (see m68kcpu.h) */ + + /* Record previous program counter */ + REG_PPC(this) = REG_PC(this); + + + this->run_mode = RUN_MODE_NORMAL; + /* Read an instruction and call its handler */ + this->ir = m68ki_read_imm_16(this); + this->jump_table[this->ir](this); + this->c.current_cycle += this->cyc_instruction[this->ir]; + + /*} + catch (int error) + { + if (error==10) + { + m_address_error = 1; + goto check_address_error; + } + else + throw; + }*/ + + + /* Trace m68k_exception, if necessary */ + m68ki_exception_if_trace(this); /* auto-disable (see m68kcpu.h) */ + } + + /* set previous PC to current PC for the next entry into the loop */ + REG_PPC(this) = REG_PC(this); + } + else if (this->c.current_cycle < this->c.target_cycle) + this->c.current_cycle = this->c.target_cycle; + this->c.status = m68ki_get_sr(this) >> 8; +} + + + +void m68k_init_cpu_common(m68000_base_device *this) +{ + static uint32_t 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; + } + + + + //m_icountptr = &remaining_cycles; + this->c.current_cycle = 0; + +} + +void m68k_reset_cpu(m68000_base_device *this) +{ + + + /* Clear all stop levels and eat up all remaining cycles */ + this->stopped = 0; + + this->run_mode = RUN_MODE_BERR_AERR_RESET; + /* Go to supervisor mode */ + m68ki_set_sm_flag(this, SFLAG_SET | MFLAG_CLEAR); + + /* Invalidate the prefetch queue */ + /* Set to arbitrary number since our first fetch is from 0 */ + this->pref_addr = 0x1000; + + /* Read the initial stack pointer and program counter */ + m68ki_jump(this, 0); + REG_SP(this) = m68ki_read_imm_32(this); + REG_PC(this) = m68ki_read_imm_32(this); + m68ki_jump(this, REG_PC(this)); + + this->run_mode = RUN_MODE_NORMAL; + + this->c.current_cycle += this->cyc_exception[EXCEPTION_RESET]; + +} + +/**************************************************************************** + * 8-bit data memory interface + ****************************************************************************/ + +uint8_t m68ki_read_8(m68000_base_device *m68k, uint32_t address) +{ + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint8_t *chunk = m68k->read_pointers[base]; + return chunk[(address ^ 1) & 0xFFFF]; + } + return read_byte(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); +} + +void m68ki_write_8(m68000_base_device *m68k, uint32_t address, uint8_t value) +{ + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint8_t *chunk = m68k->read_pointers[base]; + chunk[(address ^ 1) & 0xFFFF] = value; + return; + } + write_byte(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); +} + +/**************************************************************************** + * 16-bit data memory interface + ****************************************************************************/ + +uint16_t m68ki_read_16(m68000_base_device *m68k, uint32_t address) +{ + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->read_pointers[base]) { + uint16_t *chunk = m68k->read_pointers[base]; + return chunk[address >> 1 & 0x7FFF]; + } + return read_word(address, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); +} + +void m68ki_write_16(m68000_base_device *m68k, uint32_t address, uint16_t value) +{ + address &= 0xFFFFFF; + uint32_t base = address >> 16; + if (m68k->write_pointers[base]) { + uint16_t *chunk = m68k->read_pointers[base]; + chunk[address >> 1 & 0x7FFF] = value; + return; + } + write_word(address, value, (void **)m68k->c.mem_pointers, &m68k->c.options->gen, &m68k->c); +} + + +/**************** + CPU Inits +****************/ + + +void m68k_init_cpu_m68000(m68000_base_device *this) +{ + m68k_init_cpu_common(this); + + this->cpu_type = CPU_TYPE_000; +// dasm_type = M68K_CPU_TYPE_68000; + + this->sr_mask = 0xa71f; /* T1 -- S -- -- I2 I1 I0 -- -- -- X N Z V C */ + this->jump_table = m68ki_instruction_jump_table[0]; + uint8_t *tmp = malloc(sizeof(m68ki_cycles[0])); + for (uint32_t i = 0; i < sizeof(m68ki_cycles[0]); i++) + { + tmp[i] = m68ki_cycles[0][i] * this->c.options->gen.clock_divider; + } + this->cyc_instruction = tmp; + tmp = malloc(sizeof(m68ki_exception_cycle_table[0])); + for (uint32_t i = 0; i < sizeof(m68ki_exception_cycle_table[0]); i++) + { + tmp[i] = m68ki_exception_cycle_table[0][i] * this->c.options->gen.clock_divider; + } + this->cyc_exception = tmp; + this->cyc_bcc_notake_b = -2 * this->c.options->gen.clock_divider; + this->cyc_bcc_notake_w = 2 * this->c.options->gen.clock_divider; + this->cyc_dbcc_f_noexp = -2 * this->c.options->gen.clock_divider; + this->cyc_dbcc_f_exp = 2 * this->c.options->gen.clock_divider; + this->cyc_scc_r_true = 2 * this->c.options->gen.clock_divider; + this->cyc_movem_w = 2;// * this->c.options->gen.clock_divider; + this->cyc_movem_l = 3;// * this->c.options->gen.clock_divider; + this->cyc_shift = 1;// * this->c.options->gen.clock_divider; + this->cyc_reset = 132 * this->c.options->gen.clock_divider; + this->int_mask = 7 << 8; + this->c.status = m68ki_get_sr(this) >> 8; + for (uint32_t address = 0; address < (24*1024*1024); address += 64*1024) + { + this->read_pointers[address >> 16] = NULL; + this->write_pointers[address >> 16] = NULL; + memmap_chunk const *chunk = find_map_chunk(address, &this->c.options->gen, 0, NULL); + if (!chunk || chunk->end < (address + 64*1024) || (chunk->flags & (MMAP_ONLY_ODD | MMAP_ONLY_EVEN | MMAP_PTR_IDX)) || !chunk->buffer) { + continue; + } + void *ptr = get_native_pointer(address, (void **)this->c.mem_pointers, &this->c.options->gen); + if (!ptr) { + continue; + } + if (chunk->flags & MMAP_READ) { + this->read_pointers[address >> 16] = ptr; + } + if (chunk->flags & MMAP_WRITE) { + this->write_pointers[address >> 16] = ptr; + } + } +} + +/* Service an interrupt request and start exception processing */ +void m68ki_exception_interrupt(m68000_base_device *this, uint32_t int_level) +{ + uint32_t vector; + uint32_t sr; + uint32_t new_pc; + + if(CPU_TYPE_IS_000(this->cpu_type)) + { + this->instr_mode = INSTRUCTION_NO; + } + + /* Turn off the stopped state */ + this->stopped &= ~STOP_LEVEL_STOP; + + /* If we are halted, don't do anything */ + if(this->stopped) + return; + + /* Acknowledge the interrupt */ + this->c.int_ack = int_level; + + vector = M68K_INT_ACK_AUTOVECTOR;//int_ack_callback(*this, 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; + uint32_t e_clock = this->c.current_cycle / this->c.options->gen.clock_divider; + this->c.current_cycle += ((9-4) + e_clock % 10) * this->c.options->gen.clock_divider; + } else if(vector == M68K_INT_ACK_SPURIOUS) + /* Called if no devices respond to the interrupt acknowledge */ + vector = EXCEPTION_SPURIOUS_INTERRUPT; + else if(vector > 255) + return; + + /* Start exception processing */ + sr = m68ki_init_exception(this); + + /* Set the interrupt mask to the level of the one being serviced */ + this->int_mask = int_level<<8; + + /* Get the new PC */ + new_pc = m68ki_read_32(this, (vector<<2) /*+ vbr*/); + + /* If vector is uninitialized, call the uninitialized interrupt vector */ + if(new_pc == 0) + new_pc = m68ki_read_32(this, (EXCEPTION_UNINITIALIZED_INTERRUPT<<2) /*+ vbr*/); + + /* Generate a stack frame */ + m68ki_stack_frame_0000(this, REG_PC(this), sr, vector); + if(this->m_flag && CPU_TYPE_IS_EC020_PLUS(this->cpu_type)) + { + /* Create throwaway frame */ + m68ki_set_sm_flag(this, this->s_flag); /* clear M */ + sr |= 0x2000; /* Same as SR in master stack frame except S is forced high */ + m68ki_stack_frame_0001(this, REG_PC(this), sr, vector); + } + + m68ki_jump(this, new_pc); + + /* Defer cycle counting until later */ + this->c.current_cycle += this->cyc_exception[vector]; +} + + diff -r 8a29c250f352 -r 8fe162bdb038 musashi/m68kcpu.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/musashi/m68kcpu.h Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,1496 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud +/* ======================================================================== */ +/* ========================= LICENSING & COPYRIGHT ======================== */ +/* ======================================================================== */ +/* + * MUSASHI + * Version 4.50 + * + * A portable Motorola M680x0 processor emulation engine. + * Copyright Karl Stenerud. All rights reserved. + * + */ + + +#pragma once + +#ifndef __M68KCPU_H__ +#define __M68KCPU_H__ + +#include "../m68k_core.h" +typedef struct m68000_base_device m68000_base_device; +struct m68000_base_device { + m68k_context c; + uint32_t cpu_type; + uint32_t pc; + uint32_t ppc; + uint32_t stopped; /* Stopped state */ + uint32_t pref_addr; + uint32_t pref_data; + uint32_t sr_mask; /* Implemented status register bits */ + uint32_t instr_mode; /* Stores whether we are in instruction mode or group 0/1 exception mode */ + uint32_t run_mode; /* Stores whether we are processing a reset, bus error, address error, or something else */ + uint32_t s_flag; /* Supervisor */ + uint32_t m_flag; /* Master/Interrupt state */ + uint32_t x_flag; /* Extend */ + uint32_t n_flag; /* Negative */ + uint32_t not_z_flag; /* Zero, inverted for speedups */ + uint32_t v_flag; /* Overflow */ + uint32_t c_flag; /* Carry */ + uint32_t int_mask; /* I0-I2 */ + uint32_t t1_flag; /* Trace 1 */ + uint32_t tracing; + uint32_t ir; + uint32_t cyc_bcc_notake_b; + uint32_t cyc_bcc_notake_w; + uint32_t cyc_dbcc_f_noexp; + uint32_t cyc_dbcc_f_exp; + uint32_t cyc_scc_r_true; + uint32_t cyc_movem_w; + uint32_t cyc_movem_l; + uint32_t cyc_shift; + uint32_t cyc_reset; + + void (**jump_table)(m68000_base_device *m68k); + const uint8_t* cyc_instruction; + const uint8_t* cyc_exception; + void *read_pointers[24*1024/64]; + void *write_pointers[24*1024/64]; +}; + +/* 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 + +#include + +#if defined(__sun__) && defined(__svr4__) +#undef REG_SP +#undef REG_PC +#undef REG_FP +#endif + +/* ======================================================================== */ +/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */ +/* ======================================================================== */ + +/* Check for > 32bit sizes */ +#define MAKE_INT_8(A) (int8_t)(A) +#define MAKE_INT_16(A) (int16_t)(A) +#define MAKE_INT_32(A) (int32_t)(A) + + +/* ======================================================================== */ +/* ============================ GENERAL DEFINES =========================== */ +/* ======================================================================== */ + +/* Exception Vectors handled by emulation */ +#define EXCEPTION_RESET 0 +#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 (0x00000001) +#define CPU_TYPE_008 (0x00000002) +#define CPU_TYPE_010 (0x00000004) +#define CPU_TYPE_EC020 (0x00000008) +#define CPU_TYPE_020 (0x00000010) +#define CPU_TYPE_EC030 (0x00000020) +#define CPU_TYPE_030 (0x00000040) +#define CPU_TYPE_EC040 (0x00000080) +#define CPU_TYPE_LC040 (0x00000100) +#define CPU_TYPE_040 (0x00000200) +#define CPU_TYPE_SCC070 (0x00000400) +#define CPU_TYPE_FSCPU32 (0x00000800) +#define CPU_TYPE_COLDFIRE (0x00001000) + +/* 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 + + + +#define M68K_CACR_IBE 0x10 // Instruction Burst Enable +#define M68K_CACR_CI 0x08 // Clear Instruction Cache +#define M68K_CACR_CEI 0x04 // Clear Entry in Instruction Cache +#define M68K_CACR_FI 0x02 // Freeze Instruction Cache +#define M68K_CACR_EI 0x01 // Enable Instruction Cache + +/* ======================================================================== */ +/* ================================ 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) +#define GET_MSB_33(A) ((A) & 0x100000000U) + +/* 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 */ +#define MASK_OUT_ABOVE_32(A) ((A) & ((uint64_t)0xffffffffU)) +#define MASK_OUT_BELOW_32(A) ((A) & ~((uint64_t)0xffffffffU)) + +/* Shift & Rotate Macros. */ +#define LSL(A, C) ((A) << (C)) +#define LSR(A, C) ((A) >> (C)) + +/* 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) + +#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))) + +#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 REG_DA(M) (M)->c.dregs /* easy access to data and address regs */ +#define REG_D(M) (M)->c.dregs +#define REG_A(M) (M)->c.aregs +#define REG_PPC(M) (M)->ppc +#define REG_PC(M) (M)->pc +#define REG_USP(M) (M)->c.aregs[8] +#define REG_ISP(M) (M)->c.aregs[7] +#define REG_MSP(M) (M)->c.aregs[7] +#define REG_SP(M) (M)->c.aregs[7] + + + +/* ----------------------------- Configuration ---------------------------- */ + +/* These defines are dependant on the configuration defines in m68kconf.h */ + +/* Disable certain comparisons if we're not using all CPU types */ +#define CPU_TYPE_IS_COLDFIRE(A) 0//((A) & (CPU_TYPE_COLDFIRE)) + +#define CPU_TYPE_IS_040_PLUS(A) 0//((A) & (CPU_TYPE_040 | CPU_TYPE_EC040)) +#define CPU_TYPE_IS_040_LESS(A) 1 + +#define CPU_TYPE_IS_030_PLUS(A) 0//((A) & (CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040)) +#define CPU_TYPE_IS_030_LESS(A) 1 + +#define CPU_TYPE_IS_020_PLUS(A) 0//((A) & (CPU_TYPE_020 | CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 | CPU_TYPE_COLDFIRE)) +#define CPU_TYPE_IS_020_LESS(A) 1 + +#define CPU_TYPE_IS_020_VARIANT(A) 0//((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_FSCPU32)) + +#define CPU_TYPE_IS_EC020_PLUS(A) 0//((A) & (CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_030 | CPU_TYPE_EC030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 | CPU_TYPE_COLDFIRE)) +#define CPU_TYPE_IS_EC020_LESS(A) 1//((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010 | CPU_TYPE_EC020)) + +#define CPU_TYPE_IS_010(A) 0//((A) == CPU_TYPE_010) +#define CPU_TYPE_IS_010_PLUS(A) 0//((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020 | CPU_TYPE_EC030 | CPU_TYPE_030 | CPU_TYPE_040 | CPU_TYPE_EC040 | CPU_TYPE_FSCPU32 | CPU_TYPE_COLDFIRE)) +#define CPU_TYPE_IS_010_LESS(A) 1//((A) & (CPU_TYPE_000 | CPU_TYPE_008 | CPU_TYPE_010)) + +#define CPU_TYPE_IS_000(A) 1//((A) == CPU_TYPE_000 || (A) == CPU_TYPE_008) + + +/* -------------------------- 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(M) (REG_D(M)[((M)->ir >> 9) & 7]) +#define DY(M) (REG_D(M)[(M)->ir & 7]) +/* Address Register Isolation */ +#define AX(M) (REG_A(M)[((M)->ir >> 9) & 7]) +#define AY(M) (REG_A(M)[(M)->ir & 7]) + + +/* Effective Address Calculations */ +#define EA_AY_AI_8(M) AY(M) /* address register indirect */ +#define EA_AY_AI_16(M) EA_AY_AI_8(M) +#define EA_AY_AI_32(M) EA_AY_AI_8(M) +#define EA_AY_PI_8(M) (AY(M)++) /* postincrement (size = byte) */ +#define EA_AY_PI_16(M) ((AY(M)+=2)-2) /* postincrement (size = word) */ +#define EA_AY_PI_32(M) ((AY(M)+=4)-4) /* postincrement (size = long) */ +#define EA_AY_PD_8(M) (--AY(M)) /* predecrement (size = byte) */ +#define EA_AY_PD_16(M) (AY(M)-=2) /* predecrement (size = word) */ +#define EA_AY_PD_32(M) (AY(M)-=4) /* predecrement (size = long) */ +#define EA_AY_DI_8(M) (AY(M)+MAKE_INT_16(m68ki_read_imm_16(M))) /* displacement */ +#define EA_AY_DI_16(M) EA_AY_DI_8(M) +#define EA_AY_DI_32(M) EA_AY_DI_8(M) +#define EA_AY_IX_8(M) m68ki_get_ea_ix(M, AY(M)) /* indirect + index */ +#define EA_AY_IX_16(M) EA_AY_IX_8(M) +#define EA_AY_IX_32(M) EA_AY_IX_8(M) + +#define EA_AX_AI_8(M) AX(M) +#define EA_AX_AI_16(M) EA_AX_AI_8(M) +#define EA_AX_AI_32(M) EA_AX_AI_8(M) +#define EA_AX_PI_8(M) (AX(M)++) +#define EA_AX_PI_16(M) ((AX(M)+=2)-2) +#define EA_AX_PI_32(M) ((AX(M)+=4)-4) +#define EA_AX_PD_8(M) (--AX(M)) +#define EA_AX_PD_16(M) (AX(M)-=2) +#define EA_AX_PD_32(M) (AX(M)-=4) +#define EA_AX_DI_8(M) (AX(M)+MAKE_INT_16(m68ki_read_imm_16(M))) +#define EA_AX_DI_16(M) EA_AX_DI_8(M) +#define EA_AX_DI_32(M) EA_AX_DI_8(M) +#define EA_AX_IX_8(M) m68ki_get_ea_ix(M, AX(M)) +#define EA_AX_IX_16(M) EA_AX_IX_8(M) +#define EA_AX_IX_32(M) EA_AX_IX_8(M) + +#define EA_A7_PI_8(m68k) ((REG_A(m68k)[7]+=2)-2) +#define EA_A7_PD_8(m68k) (REG_A(m68k)[7]-=2) + +#define EA_AW_8(m68k) MAKE_INT_16(m68ki_read_imm_16(m68k)) /* absolute word */ +#define EA_AW_16(m68k) EA_AW_8(m68k) +#define EA_AW_32(m68k) EA_AW_8(m68k) +#define EA_AL_8(m68k) m68ki_read_imm_32(m68k) /* absolute long */ +#define EA_AL_16(m68k) EA_AL_8(m68k) +#define EA_AL_32(m68k) EA_AL_8(m68k) +#define EA_PCDI_8(m68k) m68ki_get_ea_pcdi(m68k) /* pc indirect + displacement */ +#define EA_PCDI_16(m68k) EA_PCDI_8(m68k) +#define EA_PCDI_32(m68k) EA_PCDI_8(m68k) +#define EA_PCIX_8(m68k) m68ki_get_ea_pcix(m68k) /* pc indirect + index */ +#define EA_PCIX_16(m68k) EA_PCIX_8(m68k) +#define EA_PCIX_32(m68k) EA_PCIX_8(m68k) + + +#define OPER_I_8(m68k) m68ki_read_imm_8(m68k) +#define OPER_I_16(m68k) m68ki_read_imm_16(m68k) +#define OPER_I_32(m68k) m68ki_read_imm_32(m68k) + + + +/* --------------------------- Status Register ---------------------------- */ + +/* Flag Calculation Macros */ +#define CFLAG_8(A) (A) +#define CFLAG_16(A) ((A)>>8) + +#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) + +#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(M) (((M)->x_flag>>8)&1) +#define NFLAG_AS_1(M) (((M)->n_flag>>7)&1) +#define VFLAG_AS_1(M) (((M)->v_flag>>7)&1) +#define ZFLAG_AS_1(M) (!(M)->not_z_flag) +#define CFLAG_AS_1(M) (((M)->c_flag>>8)&1) + + +/* Conditions */ +#define COND_CS(M) ((M)->c_flag&0x100) +#define COND_CC(M) (!COND_CS(M)) +#define COND_VS(M) ((M)->v_flag&0x80) +#define COND_VC(M) (!COND_VS(M)) +#define COND_NE(M) (M)->not_z_flag +#define COND_EQ(M) (!COND_NE(M)) +#define COND_MI(M) ((M)->n_flag&0x80) +#define COND_PL(M) (!COND_MI(M)) +#define COND_LT(M) (((M)->n_flag^(M)->v_flag)&0x80) +#define COND_GE(M) (!COND_LT(M)) +#define COND_HI(M) (COND_CC(M) && COND_NE(M)) +#define COND_LS(M) (COND_CS(M) || COND_EQ(M)) +#define COND_GT(M) (COND_GE(M) && COND_NE(M)) +#define COND_LE(M) (COND_LT(M) || COND_EQ(M)) + +/* Reversed conditions */ +#define COND_NOT_CS(M) COND_CC(M) +#define COND_NOT_CC(M) COND_CS(M) +#define COND_NOT_VS(M) COND_VC(M) +#define COND_NOT_VC(M) COND_VS(M) +#define COND_NOT_NE(M) COND_EQ(M) +#define COND_NOT_EQ(M) COND_NE(M) +#define COND_NOT_MI(M) COND_PL(M) +#define COND_NOT_PL(M) COND_MI(M) +#define COND_NOT_LT(M) COND_GE(M) +#define COND_NOT_GE(M) COND_LT(M) +#define COND_NOT_HI(M) COND_LS(M) +#define COND_NOT_LS(M) COND_HI(M) +#define COND_NOT_GT(M) COND_LE(M) +#define COND_NOT_LE(M) COND_GT(M) + +/* Not real conditions, but here for convenience */ +#define COND_XS(M) ((M)->x_flag&0x100) +#define COND_XC(M) (!COND_XS) + + +/* Get the condition code register */ +#define m68ki_get_ccr(M) ((COND_XS(M) >> 4) | \ + (COND_MI(M) >> 4) | \ + (COND_EQ(M) << 2) | \ + (COND_VS(M) >> 6) | \ + (COND_CS(M) >> 8)) + +/* Get the status register */ +#define m68ki_get_sr(M) ((M)->t1_flag | \ + /*(M)->t0_flag |*/ \ + ((M)->s_flag << 11) | \ + ((M)->m_flag << 11) | \ + (M)->int_mask | \ + m68ki_get_ccr(M)) + + + +/* ----------------------------- Read / Write ----------------------------- */ + +/* Read from the current address space */ +uint8_t m68ki_read_8(m68000_base_device *m68k, uint32_t address); +uint16_t m68ki_read_16(m68000_base_device *m68k, uint32_t address); +static inline uint32_t m68ki_read_32(m68000_base_device *m68k, uint32_t address) +{ + return m68ki_read_16(m68k, address) << 16 | m68ki_read_16(m68k, address+2); +} +/*#define m68ki_read_8(M, A) m68ki_read_8_fc (M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA) +#define m68ki_read_16(M, A) m68ki_read_16_fc(M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA) +#define m68ki_read_32(M, A) m68ki_read_32_fc(M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA)*/ + +/* Write to the current data space */ +void m68ki_write_8(m68000_base_device *m68k, uint32_t address, uint8_t value); +void m68ki_write_16(m68000_base_device *m68k, uint32_t address, uint16_t value); +static inline void m68ki_write_32(m68000_base_device *m68k, uint32_t address, uint32_t value) +{ + m68ki_write_16(m68k, address, value >> 16); + m68ki_write_16(m68k, address+2, value); +} +/* +#define m68ki_write_8(M, A, V) m68ki_write_8_fc (M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA, V) +#define m68ki_write_16(M, A, V) m68ki_write_16_fc(M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA, V) +#define m68ki_write_32(M, A, V) m68ki_write_32_fc(M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA, V) +#define m68ki_write_32_pd(M, A, V) m68ki_write_32_pd_fc(M, A, (M)->s_flag | FUNCTION_CODE_USER_DATA, V)*/ + +/* map read immediate 8 to read immediate 16 */ +#define m68ki_read_imm_8(M) MASK_OUT_ABOVE_8(m68ki_read_imm_16(M)) + + +/* ======================================================================== */ +/* =============================== PROTOTYPES ============================= */ +/* ======================================================================== */ + +union fp_reg +{ + uint64_t i; + double f; +}; + +void m68ki_exception_interrupt(m68000_base_device *m68k, uint32_t int_level); + + +extern const uint8_t m68ki_shift_8_table[]; +extern const uint16_t m68ki_shift_16_table[]; +extern const uint32_t m68ki_shift_32_table[]; +extern const uint8_t m68ki_exception_cycle_table[][256]; +extern const uint8_t m68ki_ea_idx_cycle_table[]; + +/* Read data immediately after the program counter */ +static inline uint32_t m68ki_read_imm_16(m68000_base_device *m68k); +static inline uint32_t m68ki_read_imm_32(m68000_base_device *m68k); + +/* Write data with specific function code */ +static inline void m68ki_write_8_fc (m68000_base_device *m68k, uint32_t address, uint32_t fc, uint32_t value); +static inline void m68ki_write_16_fc(m68000_base_device *m68k, uint32_t address, uint32_t fc, uint32_t value); +static inline void m68ki_write_32_fc(m68000_base_device *m68k, uint32_t address, uint32_t fc, uint32_t value); + +/* Indexed and PC-relative ea fetching */ +static inline uint32_t m68ki_get_ea_pcdi(m68000_base_device *m68k); +static inline uint32_t m68ki_get_ea_pcix(m68000_base_device *m68k); +static inline uint32_t m68ki_get_ea_ix(m68000_base_device *m68k, uint32_t An); + +/* Operand fetching */ +static inline uint32_t OPER_AY_AI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AY_AI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AY_AI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PD_8(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PD_16(m68000_base_device *m68k); +static inline uint32_t OPER_AY_PD_32(m68000_base_device *m68k); +static inline uint32_t OPER_AY_DI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AY_DI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AY_DI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AY_IX_8(m68000_base_device *m68k); +static inline uint32_t OPER_AY_IX_16(m68000_base_device *m68k); +static inline uint32_t OPER_AY_IX_32(m68000_base_device *m68k); + +static inline uint32_t OPER_AX_AI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AX_AI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AX_AI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PD_8(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PD_16(m68000_base_device *m68k); +static inline uint32_t OPER_AX_PD_32(m68000_base_device *m68k); +static inline uint32_t OPER_AX_DI_8(m68000_base_device *m68k); +static inline uint32_t OPER_AX_DI_16(m68000_base_device *m68k); +static inline uint32_t OPER_AX_DI_32(m68000_base_device *m68k); +static inline uint32_t OPER_AX_IX_8(m68000_base_device *m68k); +static inline uint32_t OPER_AX_IX_16(m68000_base_device *m68k); +static inline uint32_t OPER_AX_IX_32(m68000_base_device *m68k); + +static inline uint32_t OPER_A7_PI_8(m68000_base_device *m68k); +static inline uint32_t OPER_A7_PD_8(m68000_base_device *m68k); + +static inline uint32_t OPER_AW_8(m68000_base_device *m68k); +static inline uint32_t OPER_AW_16(m68000_base_device *m68k); +static inline uint32_t OPER_AW_32(m68000_base_device *m68k); +static inline uint32_t OPER_AL_8(m68000_base_device *m68k); +static inline uint32_t OPER_AL_16(m68000_base_device *m68k); +static inline uint32_t OPER_AL_32(m68000_base_device *m68k); +static inline uint32_t OPER_PCDI_8(m68000_base_device *m68k); +static inline uint32_t OPER_PCDI_16(m68000_base_device *m68k); +static inline uint32_t OPER_PCDI_32(m68000_base_device *m68k); +static inline uint32_t OPER_PCIX_8(m68000_base_device *m68k); +static inline uint32_t OPER_PCIX_16(m68000_base_device *m68k); +static inline uint32_t OPER_PCIX_32(m68000_base_device *m68k); + +/* Stack operations */ +static inline void m68ki_push_16(m68000_base_device *m68k, uint32_t value); +static inline void m68ki_push_32(m68000_base_device *m68k, uint32_t value); +static inline uint32_t m68ki_pull_16(m68000_base_device *m68k); +static inline uint32_t m68ki_pull_32(m68000_base_device *m68k); + +/* Program flow operations */ +static inline void m68ki_jump(m68000_base_device *m68k, uint32_t new_pc); +static inline void m68ki_jump_vector(m68000_base_device *m68k, uint32_t vector); +static inline void m68ki_branch_8(m68000_base_device *m68k, uint32_t offset); +static inline void m68ki_branch_16(m68000_base_device *m68k, uint32_t offset); +static inline void m68ki_branch_32(m68000_base_device *m68k, uint32_t offset); + +/* Status register operations. */ +static inline void m68ki_set_s_flag(m68000_base_device *m68k, uint32_t value); /* Only bit 2 of value should be set (i.e. 4 or 0) */ +static inline void m68ki_set_sm_flag(m68000_base_device *m68k, uint32_t value); /* only bits 1 and 2 of value should be set */ +static inline void m68ki_set_ccr(m68000_base_device *m68k, uint32_t value); /* set the condition code register */ +static inline void m68ki_set_sr(m68000_base_device *m68k, uint32_t value); /* set the status register */ +static inline void m68ki_set_sr_noint(m68000_base_device *m68k, uint32_t value); /* set the status register */ + +/* Exception processing */ +static inline uint32_t m68ki_init_exception(m68000_base_device *m68k); /* Initial exception processing */ + +static inline void m68ki_stack_frame_3word(m68000_base_device *m68k, uint32_t pc, uint32_t sr); /* Stack various frame types */ +static inline void m68ki_stack_frame_buserr(m68000_base_device *m68k, uint32_t sr); + +static inline void m68ki_stack_frame_0000(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector); +static inline void m68ki_stack_frame_0001(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector); +static inline void m68ki_stack_frame_0010(m68000_base_device *m68k, uint32_t sr, uint32_t vector); +static inline void m68ki_stack_frame_1000(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector); +static inline void m68ki_stack_frame_1010(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address); +static inline void m68ki_stack_frame_1011(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address); +static inline void m68ki_stack_frame_0111(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address, uint8_t in_mmu); + +static inline void m68ki_exception_trap(m68000_base_device *m68k, uint32_t vector); +static inline void m68ki_exception_trapN(m68000_base_device *m68k, uint32_t vector); +static inline void m68ki_exception_trace(m68000_base_device *m68k); +static inline void m68ki_exception_privilege_violation(m68000_base_device *m68k); +static inline void m68ki_exception_1010(m68000_base_device *m68k); +static inline void m68ki_exception_1111(m68000_base_device *m68k); +static inline void m68ki_exception_illegal(m68000_base_device *m68k); +static inline void m68ki_exception_format_error(m68000_base_device *m68k); +static inline void m68ki_exception_address_error(m68000_base_device *m68k); + +static inline void m68ki_check_interrupts(m68000_base_device *m68k); /* ASG: check for interrupts */ + +/* quick disassembly (used for logging) */ +char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type); + +void m68k_cpu_execute(m68000_base_device *this); +void m68k_reset_cpu(m68000_base_device *this); +void m68k_init_cpu_m68000(m68000_base_device *this); + +#define m68ki_trace_t0(M) +#define m68ki_trace_t1(m68k) m68k->tracing = m68k->t1_flag +/* Clear all tracing */ +#define m68ki_clear_trace(m68k) m68k->tracing = 0 +/* Cause a trace exception if we are tracing */ +#define m68ki_exception_if_trace(m68k) if(m68k->tracing) m68ki_exception_trace(m68k) + + +/* ======================================================================== */ +/* =========================== UTILITY FUNCTIONS ========================== */ +/* ======================================================================== */ + + +/* 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]. + */ +static inline void m68kx_write_memory_32_pd(m68000_base_device *m68k, unsigned int address, unsigned int value) +{ + m68ki_write_16(m68k, address, value); + m68ki_write_16(m68k, address, value >> 16); +} + + +/* ---------------------------- Read Immediate ---------------------------- */ + + +/* Handles all immediate reads, does address error check, function code setting, + * and prefetching if they are enabled in m68kconf.h + */ +static inline uint32_t m68ki_read_imm_16(m68000_base_device *m68k) +{ + uint32_t result; + + if(REG_PC(m68k) != m68k->pref_addr) + { + m68k->pref_data = m68ki_read_16(m68k, REG_PC(m68k)); + m68k->pref_addr = REG_PC(m68k); + } + result = MASK_OUT_ABOVE_16(m68k->pref_data); + REG_PC(m68k) += 2; + + return result; +} + +static inline uint32_t m68ki_read_imm_32(m68000_base_device *m68k) +{ + uint32_t temp_val; + if(REG_PC(m68k) != m68k->pref_addr) + { + m68k->pref_addr = REG_PC(m68k); + m68k->pref_data = m68ki_read_16(m68k, m68k->pref_addr); + } + temp_val = MASK_OUT_ABOVE_16(m68k->pref_data); + REG_PC(m68k) += 2; + m68k->pref_addr = REG_PC(m68k); + m68k->pref_data = m68ki_read_16(m68k, m68k->pref_addr); + + temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | MASK_OUT_ABOVE_16(m68k->pref_data)); + REG_PC(m68k) += 2; + m68k->pref_data = m68ki_read_16(m68k, REG_PC(m68k)); + m68k->pref_addr = REG_PC(m68k); + + return temp_val; +} + + +/* --------------------- Effective Address Calculation -------------------- */ + +/* The program counter relative addressing modes cause operands to be + * retrieved from program space, not data space. + */ +static inline uint32_t m68ki_get_ea_pcdi(m68000_base_device *m68k) +{ + uint32_t old_pc = REG_PC(m68k); + return old_pc + MAKE_INT_16(m68ki_read_imm_16(m68k)); +} + + +static inline uint32_t m68ki_get_ea_pcix(m68000_base_device *m68k) +{ + return m68ki_get_ea_ix(m68k, REG_PC(m68k)); +} + +/* 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 + */ +static inline uint32_t m68ki_get_ea_ix(m68000_base_device *m68k, uint32_t An) +{ + /* An = base register */ + uint32_t extension = m68ki_read_imm_16(m68k); + uint32_t Xn = 0; /* Index register */ + uint32_t bd = 0; /* Base Displacement */ + uint32_t od = 0; /* Outer Displacement */ + + /* Calculate index */ + Xn = REG_DA(m68k)[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); +} + + +/* Fetch operands */ +static inline uint32_t OPER_AY_AI_8(m68000_base_device *m68k) {uint32_t ea = EA_AY_AI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AY_AI_16(m68000_base_device *m68k) {uint32_t ea = EA_AY_AI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AY_AI_32(m68000_base_device *m68k) {uint32_t ea = EA_AY_AI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AY_PI_8(m68000_base_device *m68k) {uint32_t ea = EA_AY_PI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AY_PI_16(m68000_base_device *m68k) {uint32_t ea = EA_AY_PI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AY_PI_32(m68000_base_device *m68k) {uint32_t ea = EA_AY_PI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AY_PD_8(m68000_base_device *m68k) {uint32_t ea = EA_AY_PD_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AY_PD_16(m68000_base_device *m68k) {uint32_t ea = EA_AY_PD_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AY_PD_32(m68000_base_device *m68k) {uint32_t ea = EA_AY_PD_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AY_DI_8(m68000_base_device *m68k) {uint32_t ea = EA_AY_DI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AY_DI_16(m68000_base_device *m68k) {uint32_t ea = EA_AY_DI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AY_DI_32(m68000_base_device *m68k) {uint32_t ea = EA_AY_DI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AY_IX_8(m68000_base_device *m68k) {uint32_t ea = EA_AY_IX_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AY_IX_16(m68000_base_device *m68k) {uint32_t ea = EA_AY_IX_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AY_IX_32(m68000_base_device *m68k) {uint32_t ea = EA_AY_IX_32(m68k); return m68ki_read_32(m68k, ea);} + +static inline uint32_t OPER_AX_AI_8(m68000_base_device *m68k) {uint32_t ea = EA_AX_AI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AX_AI_16(m68000_base_device *m68k) {uint32_t ea = EA_AX_AI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AX_AI_32(m68000_base_device *m68k) {uint32_t ea = EA_AX_AI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AX_PI_8(m68000_base_device *m68k) {uint32_t ea = EA_AX_PI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AX_PI_16(m68000_base_device *m68k) {uint32_t ea = EA_AX_PI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AX_PI_32(m68000_base_device *m68k) {uint32_t ea = EA_AX_PI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AX_PD_8(m68000_base_device *m68k) {uint32_t ea = EA_AX_PD_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AX_PD_16(m68000_base_device *m68k) {uint32_t ea = EA_AX_PD_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AX_PD_32(m68000_base_device *m68k) {uint32_t ea = EA_AX_PD_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AX_DI_8(m68000_base_device *m68k) {uint32_t ea = EA_AX_DI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AX_DI_16(m68000_base_device *m68k) {uint32_t ea = EA_AX_DI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AX_DI_32(m68000_base_device *m68k) {uint32_t ea = EA_AX_DI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AX_IX_8(m68000_base_device *m68k) {uint32_t ea = EA_AX_IX_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AX_IX_16(m68000_base_device *m68k) {uint32_t ea = EA_AX_IX_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AX_IX_32(m68000_base_device *m68k) {uint32_t ea = EA_AX_IX_32(m68k); return m68ki_read_32(m68k, ea);} + +static inline uint32_t OPER_A7_PI_8(m68000_base_device *m68k) {uint32_t ea = EA_A7_PI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_A7_PD_8(m68000_base_device *m68k) {uint32_t ea = EA_A7_PD_8(m68k); return m68ki_read_8(m68k, ea); } + +static inline uint32_t OPER_AW_8(m68000_base_device *m68k) {uint32_t ea = EA_AW_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AW_16(m68000_base_device *m68k) {uint32_t ea = EA_AW_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AW_32(m68000_base_device *m68k) {uint32_t ea = EA_AW_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_AL_8(m68000_base_device *m68k) {uint32_t ea = EA_AL_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_AL_16(m68000_base_device *m68k) {uint32_t ea = EA_AL_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_AL_32(m68000_base_device *m68k) {uint32_t ea = EA_AL_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_PCDI_8(m68000_base_device *m68k) {uint32_t ea = EA_PCDI_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_PCDI_16(m68000_base_device *m68k) {uint32_t ea = EA_PCDI_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_PCDI_32(m68000_base_device *m68k) {uint32_t ea = EA_PCDI_32(m68k); return m68ki_read_32(m68k, ea);} +static inline uint32_t OPER_PCIX_8(m68000_base_device *m68k) {uint32_t ea = EA_PCIX_8(m68k); return m68ki_read_8(m68k, ea); } +static inline uint32_t OPER_PCIX_16(m68000_base_device *m68k) {uint32_t ea = EA_PCIX_16(m68k); return m68ki_read_16(m68k, ea);} +static inline uint32_t OPER_PCIX_32(m68000_base_device *m68k) {uint32_t ea = EA_PCIX_32(m68k); return m68ki_read_32(m68k, ea);} + + + +/* ---------------------------- Stack Functions --------------------------- */ + +/* Push/pull data from the stack */ +static inline void m68ki_push_16(m68000_base_device *m68k, uint32_t value) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) - 2); + m68ki_write_16(m68k, REG_SP(m68k), value); +} + +static inline void m68ki_push_32(m68000_base_device *m68k, uint32_t value) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) - 4); + m68ki_write_32(m68k, REG_SP(m68k), value); +} + +static inline uint32_t m68ki_pull_16(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) + 2); + return m68ki_read_16(m68k, REG_SP(m68k)-2); +} + +static inline uint32_t m68ki_pull_32(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) + 4); + return m68ki_read_32(m68k, REG_SP(m68k)-4); +} + + +/* Increment/decrement the stack as if doing a push/pull but + * don't do any memory access. + */ +static inline void m68ki_fake_push_16(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) - 2); +} + +static inline void m68ki_fake_push_32(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) - 4); +} + +static inline void m68ki_fake_pull_16(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) + 2); +} + +static inline void m68ki_fake_pull_32(m68000_base_device *m68k) +{ + REG_SP(m68k) = MASK_OUT_ABOVE_32(REG_SP(m68k) + 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. + */ +static inline void m68ki_jump(m68000_base_device *m68k, uint32_t new_pc) +{ + REG_PC(m68k) = new_pc; +} + +static inline void m68ki_jump_vector(m68000_base_device *m68k, uint32_t vector) +{ + REG_PC(m68k) = (vector<<2); + REG_PC(m68k) = m68ki_read_32(m68k, REG_PC(m68k)); +} + + +/* 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. + */ +static inline void m68ki_branch_8(m68000_base_device *m68k, uint32_t offset) +{ + REG_PC(m68k) += MAKE_INT_8(offset); +} + +static inline void m68ki_branch_16(m68000_base_device *m68k, uint32_t offset) +{ + REG_PC(m68k) += MAKE_INT_16(offset); +} + +static inline void m68ki_branch_32(m68000_base_device *m68k, uint32_t offset) +{ + REG_PC(m68k) += offset; +} + + + +/* ---------------------------- Status Register --------------------------- */ + +/* Set the S flag and change the active stack pointer. + * Note that value MUST be 4 or 0. + */ +static inline void m68ki_set_s_flag(m68000_base_device *m68k, uint32_t value) +{ + /* Backup the old stack pointer */ + uint32_t old = REG_SP(m68k); + //REG_SP_BASE(m68k)[m68k->s_flag | ((m68k->s_flag>>1) & m68k->m_flag)] = REG_SP(m68k); + /* Set the S flag */ + if (value != m68k->s_flag) { + m68k->s_flag = value; + /* Set the new stack pointer */ + REG_SP(m68k) = REG_USP(m68k); + REG_USP(m68k) = old; + } + //REG_SP(m68k) = REG_SP_BASE(m68k)[m68k->s_flag | ((m68k->s_flag>>1) & m68k->m_flag)]; +} + +/* 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). + */ +static inline void m68ki_set_sm_flag(m68000_base_device *m68k, uint32_t value) +{ + m68ki_set_s_flag(m68k, value & 4); +} + +/* Set the S and M flags. Don't touch the stack pointer. */ +static inline void m68ki_set_sm_flag_nosp(m68000_base_device *m68k, uint32_t value) +{ + /* Set the S and M flags */ + m68k->s_flag = value & SFLAG_SET; + //m68k->m_flag = value & MFLAG_SET; +} + + +/* Set the condition code register */ +static inline void m68ki_set_ccr(m68000_base_device *m68k, uint32_t value) +{ + m68k->x_flag = BIT_4(value) << 4; + m68k->n_flag = BIT_3(value) << 4; + m68k->not_z_flag = !BIT_2(value); + m68k->v_flag = BIT_1(value) << 6; + m68k->c_flag = BIT_0(value) << 8; +} + +/* Set the status register but don't check for interrupts */ +static inline void m68ki_set_sr_noint(m68000_base_device *m68k, uint32_t value) +{ + /* Mask out the "unimplemented" bits */ + value &= m68k->sr_mask; + + /* Now set the status register */ + m68k->t1_flag = BIT_F(value); + //m68k->t0_flag = BIT_E(value); + m68k->int_mask = value & 0x0700; + m68k->c.target_cycle = m68k->c.current_cycle; + m68ki_set_ccr(m68k, value); + m68ki_set_sm_flag(m68k, (value >> 11) & 6); +} + +/* Set the status register but don't check for interrupts nor + * change the stack pointer + */ +static inline void m68ki_set_sr_noint_nosp(m68000_base_device *m68k, uint32_t value) +{ + /* Mask out the "unimplemented" bits */ + value &= m68k->sr_mask; + + /* Now set the status register */ + m68k->t1_flag = BIT_F(value); + //m68k->t0_flag = BIT_E(value); + m68k->int_mask = value & 0x0700; + m68k->c.target_cycle = m68k->c.current_cycle; + m68ki_set_ccr(m68k, value); + m68ki_set_sm_flag_nosp(m68k, (value >> 11) & 6); +} + +/* Set the status register and check for interrupts */ +static inline void m68ki_set_sr(m68000_base_device *m68k, uint32_t value) +{ + m68ki_set_sr_noint(m68k, value); + m68ki_check_interrupts(m68k); +} + + +/* ------------------------- Exception Processing ------------------------- */ + +/* Initiate exception processing */ +static inline uint32_t m68ki_init_exception(m68000_base_device *m68k) +{ + /* Save the old status register */ + uint32_t sr = m68ki_get_sr(m68k); + + /* Turn off trace flag, clear pending traces */ + m68k->t1_flag = 0;//m68k->t0_flag = 0; + m68ki_clear_trace(m68k); + /* Enter supervisor mode */ + m68ki_set_s_flag(m68k, SFLAG_SET); + + return sr; +} + +/* 3 word stack frame (68000 only) */ +static inline void m68ki_stack_frame_3word(m68000_base_device *m68k, uint32_t pc, uint32_t sr) +{ + m68ki_push_32(m68k, pc); + m68ki_push_16(m68k, sr); +} + +/* Format 0 stack frame. + * This is the standard stack frame for 68010+. + */ +static inline void m68ki_stack_frame_0000(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector) +{ + /* Stack a 3-word frame if we are 68000 */ + if(m68k->cpu_type == CPU_TYPE_000 || m68k->cpu_type == CPU_TYPE_008) + { + m68ki_stack_frame_3word(m68k, pc, sr); + return; + } + m68ki_push_16(m68k, vector<<2); + m68ki_push_32(m68k, pc); + m68ki_push_16(m68k, sr); +} + +/* Format 1 stack frame (68020). + * For 68020, this is the 4 word throwaway frame. + */ +static inline void m68ki_stack_frame_0001(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector) +{ + m68ki_push_16(m68k, 0x1000 | (vector<<2)); + m68ki_push_32(m68k, pc); + m68ki_push_16(m68k, sr); +} + +/* Format 2 stack frame. + * This is used only by 68020 for trap exceptions. + */ +static inline void m68ki_stack_frame_0010(m68000_base_device *m68k, uint32_t sr, uint32_t vector) +{ + m68ki_push_32(m68k, REG_PPC(m68k)); + m68ki_push_16(m68k, 0x2000 | (vector<<2)); + m68ki_push_32(m68k, REG_PC(m68k)); + m68ki_push_16(m68k, sr); +} + + +/* Bus error stack frame (68000 only). + */ +static inline void m68ki_stack_frame_buserr(m68000_base_device *m68k, uint32_t sr) +{ + m68ki_push_32(m68k, REG_PC(m68k)); + m68ki_push_16(m68k, sr); + m68ki_push_16(m68k, m68k->ir); + m68ki_push_32(m68k, 0/*m68k->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(m68k, 0/*m68k->aerr_write_mode | m68k->instr_mode | m68k->aerr_fc*/); +} + +/* Format 8 stack frame (68010). + * 68010 only. This is the 29 word bus/address error frame. + */ +static inline void m68ki_stack_frame_1000(m68000_base_device *m68k, uint32_t pc, uint32_t sr, uint32_t vector) +{ + /* VERSION + * NUMBER + * INTERNAL INFORMATION, 16 WORDS + */ + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + m68ki_fake_push_32(m68k); + + /* INSTRUCTION INPUT BUFFER */ + m68ki_push_16(m68k, 0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(m68k); + + /* DATA INPUT BUFFER */ + m68ki_push_16(m68k, 0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(m68k); + + /* DATA OUTPUT BUFFER */ + m68ki_push_16(m68k, 0); + + /* UNUSED, RESERVED (not written) */ + m68ki_fake_push_16(m68k); + + /* FAULT ADDRESS */ + m68ki_push_32(m68k, 0); + + /* SPECIAL STATUS WORD */ + m68ki_push_16(m68k, 0); + + /* 1000, VECTOR OFFSET */ + m68ki_push_16(m68k, 0x8000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(m68k, pc); + + /* STATUS REGISTER */ + m68ki_push_16(m68k, 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. + */ +static inline void m68ki_stack_frame_1010(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address) +{ + //int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now + //int orig_fc = m68k->mmu_tmp_buserror_fc; + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* DATA OUTPUT BUFFER (2 words) */ + m68ki_push_32(m68k, 0); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* DATA CYCLE FAULT ADDRESS (2 words) */ + m68ki_push_32(m68k, fault_address); + + /* INSTRUCTION PIPE STAGE B */ + m68ki_push_16(m68k, 0); + + /* INSTRUCTION PIPE STAGE C */ + m68ki_push_16(m68k, 0); + + /* SPECIAL STATUS REGISTER */ + // set bit for: Rerun Faulted bus Cycle, or run pending prefetch + // set FC + m68ki_push_16(m68k, 0x0100 /*| orig_fc | orig_rw<<6*/); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* 1010, VECTOR OFFSET */ + m68ki_push_16(m68k, 0xa000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(m68k, pc); + + /* STATUS REGISTER */ + m68ki_push_16(m68k, 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. + */ +static inline void m68ki_stack_frame_1011(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address) +{ + /*int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now + int orig_fc = m68k->mmu_tmp_buserror_fc;*/ + + /* INTERNAL REGISTERS (18 words) */ + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + + /* VERSION# (4 bits), INTERNAL INFORMATION */ + m68ki_push_16(m68k, 0); + + /* INTERNAL REGISTERS (3 words) */ + m68ki_push_32(m68k, 0); + m68ki_push_16(m68k, 0); + + /* DATA INTPUT BUFFER (2 words) */ + m68ki_push_32(m68k, 0); + + /* INTERNAL REGISTERS (2 words) */ + m68ki_push_32(m68k, 0); + + /* STAGE B ADDRESS (2 words) */ + m68ki_push_32(m68k, 0); + + /* INTERNAL REGISTER (4 words) */ + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + + /* DATA OUTPUT BUFFER (2 words) */ + m68ki_push_32(m68k, 0); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* DATA CYCLE FAULT ADDRESS (2 words) */ + m68ki_push_32(m68k, fault_address); + + /* INSTRUCTION PIPE STAGE B */ + m68ki_push_16(m68k, 0); + + /* INSTRUCTION PIPE STAGE C */ + m68ki_push_16(m68k, 0); + + /* SPECIAL STATUS REGISTER */ + m68ki_push_16(m68k, 0x0100/* | orig_fc | orig_rw<<6*/); + + /* INTERNAL REGISTER */ + m68ki_push_16(m68k, 0); + + /* 1011, VECTOR OFFSET */ + m68ki_push_16(m68k, 0xb000 | (vector<<2)); + + /* PROGRAM COUNTER */ + m68ki_push_32(m68k, pc); + + /* STATUS REGISTER */ + m68ki_push_16(m68k, sr); +} + +/* Type 7 stack frame (access fault). + * This is used by the 68040 for bus fault and mmu trap + * 30 words + */ +static inline void m68ki_stack_frame_0111(m68000_base_device *m68k, uint32_t sr, uint32_t vector, uint32_t pc, uint32_t fault_address, uint8_t in_mmu) +{ + /*int orig_rw = m68k->mmu_tmp_buserror_rw; // this gets splatted by the following pushes, so save it now + int orig_fc = m68k->mmu_tmp_buserror_fc;*/ + + /* INTERNAL REGISTERS (18 words) */ + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + m68ki_push_32(m68k, 0); + + /* FAULT ADDRESS (2 words) */ + m68ki_push_32(m68k, fault_address); + + /* INTERNAL REGISTERS (3 words) */ + m68ki_push_32(m68k, 0); + m68ki_push_16(m68k, 0); + + /* SPECIAL STATUS REGISTER (1 word) */ + m68ki_push_16(m68k, 0/*(in_mmu ? 0x400 : 0) | orig_fc | (orig_rw<<8)*/); + + /* EFFECTIVE ADDRESS (2 words) */ + m68ki_push_32(m68k, fault_address); + + /* 0111, VECTOR OFFSET (1 word) */ + m68ki_push_16(m68k, 0x7000 | (vector<<2)); + + /* PROGRAM COUNTER (2 words) */ + m68ki_push_32(m68k, pc); + + /* STATUS REGISTER (1 word) */ + m68ki_push_16(m68k, sr); +} + + +/* Used for Group 2 exceptions. + * These stack a type 2 frame on the 020. + */ +static inline void m68ki_exception_trap(m68000_base_device *m68k, uint32_t vector) +{ + uint32_t sr = m68ki_init_exception(m68k); + + if(CPU_TYPE_IS_010_LESS(m68k->cpu_type)) + m68ki_stack_frame_0000(m68k, REG_PC(m68k), sr, vector); + else + m68ki_stack_frame_0010(m68k, sr, vector); + + m68ki_jump_vector(m68k, vector); + + /* Use up some clock cycles */ + m68k->c.current_cycle += m68k->cyc_exception[vector]; +} + +/* Trap#n stacks a 0 frame but behaves like group2 otherwise */ +static inline void m68ki_exception_trapN(m68000_base_device *m68k, uint32_t vector) +{ + uint32_t sr = m68ki_init_exception(m68k); + m68ki_stack_frame_0000(m68k, REG_PC(m68k), sr, vector); + m68ki_jump_vector(m68k, vector); + + /* Use up some clock cycles */ + m68k->c.current_cycle += m68k->cyc_exception[vector]; +} + +/* Exception for trace mode */ +static inline void m68ki_exception_trace(m68000_base_device *m68k) +{ + uint32_t sr = m68ki_init_exception(m68k); + + if(CPU_TYPE_IS_010_LESS(m68k->cpu_type)) + { + if(CPU_TYPE_IS_000(m68k->cpu_type)) + { + m68k->instr_mode = INSTRUCTION_NO; + } + m68ki_stack_frame_0000(m68k, REG_PC(m68k), sr, EXCEPTION_TRACE); + } + else + m68ki_stack_frame_0010(m68k, sr, EXCEPTION_TRACE); + + m68ki_jump_vector(m68k, EXCEPTION_TRACE); + + /* Trace nullifies a STOP instruction */ + m68k->stopped &= ~STOP_LEVEL_STOP; + + /* Use up some clock cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_TRACE]; +} + +/* Exception for privilege violation */ +static inline void m68ki_exception_privilege_violation(m68000_base_device *m68k) +{ + uint32_t sr = m68ki_init_exception(m68k); + + if(CPU_TYPE_IS_000(m68k->cpu_type)) + { + m68k->instr_mode = INSTRUCTION_NO; + } + + m68ki_stack_frame_0000(m68k, REG_PPC(m68k), sr, EXCEPTION_PRIVILEGE_VIOLATION); + m68ki_jump_vector(m68k, EXCEPTION_PRIVILEGE_VIOLATION); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_PRIVILEGE_VIOLATION] - m68k->cyc_instruction[m68k->ir]; +} + +/* Exception for A-Line instructions */ +static inline void m68ki_exception_1010(m68000_base_device *m68k) +{ + uint32_t sr; + + sr = m68ki_init_exception(m68k); + m68ki_stack_frame_0000(m68k, REG_PPC(m68k), sr, EXCEPTION_1010); + m68ki_jump_vector(m68k, EXCEPTION_1010); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_1010] - m68k->cyc_instruction[m68k->ir]; +} + +/* Exception for F-Line instructions */ +static inline void m68ki_exception_1111(m68000_base_device *m68k) +{ + uint32_t sr; + + sr = m68ki_init_exception(m68k); + m68ki_stack_frame_0000(m68k, REG_PPC(m68k), sr, EXCEPTION_1111); + m68ki_jump_vector(m68k, EXCEPTION_1111); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_1111] - m68k->cyc_instruction[m68k->ir]; +} + +/* Exception for illegal instructions */ +static inline void m68ki_exception_illegal(m68000_base_device *m68k) +{ + uint32_t sr; + + sr = m68ki_init_exception(m68k); + + if(CPU_TYPE_IS_000(m68k->cpu_type)) + { + m68k->instr_mode = INSTRUCTION_NO; + } + + m68ki_stack_frame_0000(m68k, REG_PPC(m68k), sr, EXCEPTION_ILLEGAL_INSTRUCTION); + m68ki_jump_vector(m68k, EXCEPTION_ILLEGAL_INSTRUCTION); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_ILLEGAL_INSTRUCTION] - m68k->cyc_instruction[m68k->ir]; +} + +/* Exception for format errror in RTE */ +static inline void m68ki_exception_format_error(m68000_base_device *m68k) +{ + uint32_t sr = m68ki_init_exception(m68k); + m68ki_stack_frame_0000(m68k, REG_PC(m68k), sr, EXCEPTION_FORMAT_ERROR); + m68ki_jump_vector(m68k, EXCEPTION_FORMAT_ERROR); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_FORMAT_ERROR] - m68k->cyc_instruction[m68k->ir]; +} + +/* Exception for address error */ +static inline void m68ki_exception_address_error(m68000_base_device *m68k) +{ + uint32_t sr = m68ki_init_exception(m68k); + + /* If we were processing a bus error, address error, or reset, + * this is a catastrophic failure. + * Halt the CPU + */ + if(m68k->run_mode == RUN_MODE_BERR_AERR_RESET) + { + //m68k->/*memory.*/read8(0x00ffff01); + m68k->stopped = STOP_LEVEL_HALT; + return; + } + m68k->run_mode = RUN_MODE_BERR_AERR_RESET; + + /* Note: This is implemented for 68000 only! */ + m68ki_stack_frame_buserr(m68k, sr); + + m68ki_jump_vector(m68k, EXCEPTION_ADDRESS_ERROR); + + /* Use up some clock cycles and undo the instruction's cycles */ + m68k->c.current_cycle += m68k->cyc_exception[EXCEPTION_ADDRESS_ERROR] - m68k->cyc_instruction[m68k->ir]; +} + + + +/* ASG: Check for interrupts */ +static inline void m68ki_check_interrupts(m68000_base_device *m68k) +{ + /*if(m68k->nmi_pending) + { + m68k->nmi_pending = false; + m68k->m68ki_exception_interrupt(m68k, 7); + } + else if(m68k->int_level > m68k->int_mask) + m68k->m68ki_exception_interrupt(m68k, m68k->int_level>>8);*/ + if (m68k->c.current_cycle >= m68k->c.int_cycle) { + m68ki_exception_interrupt(m68k, m68k->c.int_num); + } +} + + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + +#endif /* __M68KCPU_H__ */ diff -r 8a29c250f352 -r 8fe162bdb038 musashi/m68kops.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/musashi/m68kops.c Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,33731 @@ +#include +#include "../util.h" +#include "m68kcpu.h" +/* ======================================================================== */ +/* ========================= INSTRUCTION HANDLERS ========================= */ +/* ======================================================================== */ + + +static void m68k_op_1010(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1010(mc68kcpu); +} + + +static void m68k_op_1111(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_040fpu0_32(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_040fpu1_32(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_abcd_8_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (res > 0x99) << 8; + if((mc68kcpu)->c_flag) + res -= 0xa0; + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_abcd_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (res > 0x99) << 8; + if((mc68kcpu)->c_flag) + res -= 0xa0; + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_abcd_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (res > 0x99) << 8; + if((mc68kcpu)->c_flag) + res -= 0xa0; + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_abcd_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (res > 0x99) << 8; + if((mc68kcpu)->c_flag) + res -= 0xa0; + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_abcd_8_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if(res > 9) + res += 6; + res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (res > 0x99) << 8; + if((mc68kcpu)->c_flag) + res -= 0xa0; + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_add_8_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_A7_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_16_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = AY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_32_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_add_8_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_8_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_16_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_add_32_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_adda_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY(mc68kcpu))); +} + + +static void m68k_op_adda_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY(mc68kcpu))); +} + + +static void m68k_op_adda_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY(mc68kcpu)); +} + + +static void m68k_op_adda_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY(mc68kcpu)); +} + + +static void m68k_op_adda_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_AI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_PI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_PD_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_DI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_IX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AW_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AL_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_PCDI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_PCIX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_adda_32_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +static void m68k_op_addi_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addi_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addi_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addi_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addi_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addq_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addq_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1); +} + + +static void m68k_op_addq_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = *r_dst; + uint32_t res = src + dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_addq_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1); +} + + +static void m68k_op_addq_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addq_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst; + + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_addx_8_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_addx_16_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_addx_32_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = res; +} + + +static void m68k_op_addx_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_addx_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_addx_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_addx_8_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_ADD_8(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_addx_16_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_ADD_16(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_addx_32_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = src + dst + XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_ADD_32(src, dst, res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_ADD_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_8_er_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (DY(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_ai(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AY_AI_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AY_PI_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pi7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_A7_PI_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pd(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AY_PD_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pd7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_A7_PD_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_di(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AY_DI_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_ix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AY_IX_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_aw(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AW_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_al(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_AL_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_PCDI_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_pcix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_PCIX_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_er_i(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DX(mc68kcpu) &= (OPER_I_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (DY(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_ai(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AY_AI_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AY_PI_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pd(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AY_PD_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_di(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AY_DI_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_ix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AY_IX_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_aw(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AW_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_al(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_AL_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_PCDI_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_pcix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_PCIX_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_16_er_i(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DX(mc68kcpu) &= (OPER_I_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= DY(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_ai(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AY_AI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AY_PI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pd(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AY_PD_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_di(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AY_DI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_ix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AY_IX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_aw(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AW_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_al(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_AL_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_PCDI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_pcix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_PCIX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_32_er_i(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DX(mc68kcpu) &= OPER_I_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_and_8_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_8_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_16_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_and_32_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_and_32_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(DY(mc68kcpu) &= (OPER_I_8(mc68kcpu) | 0xffffff00)); + + (mc68kcpu)->n_flag = NFLAG_8((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_andi_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = src & m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(DY(mc68kcpu) &= (OPER_I_16(mc68kcpu) | 0xffff0000)); + + (mc68kcpu)->n_flag = NFLAG_16((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_andi_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = src & m68ki_read_16((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DY(mc68kcpu) &= (OPER_I_32(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_32((mc68kcpu)->not_z_flag); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_andi_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = src & m68ki_read_32((mc68kcpu), ea); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_andi_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) & OPER_I_16(mc68kcpu)); +} + + +static void m68k_op_andi_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t src = OPER_I_16(mc68kcpu); + //m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), m68ki_get_sr(mc68kcpu) & src); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_asr_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(GET_MSB_8(src)) + res |= m68ki_shift_8_table[shift]; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); +} + + +static void m68k_op_asr_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(GET_MSB_16(src)) + res |= m68ki_shift_16_table[shift]; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); +} + + +static void m68k_op_asr_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = *r_dst; + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(GET_MSB_32(src)) + res |= m68ki_shift_32_table[shift]; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); +} + + +static void m68k_op_asr_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 8) + { + if(GET_MSB_8(src)) + res |= m68ki_shift_8_table[shift]; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + if(GET_MSB_8(src)) + { + *r_dst |= 0xff; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; + (mc68kcpu)->not_z_flag = ZFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffffff00; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asr_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 16) + { + if(GET_MSB_16(src)) + res |= m68ki_shift_16_table[shift]; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = (src >> (shift - 1))<<8; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + if(GET_MSB_16(src)) + { + *r_dst |= 0xffff; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; + (mc68kcpu)->not_z_flag = ZFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asr_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = *r_dst; + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 32) + { + if(GET_MSB_32(src)) + res |= m68ki_shift_32_table[shift]; + + *r_dst = res; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = (src >> (shift - 1))<<8; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + if(GET_MSB_32(src)) + { + *r_dst = 0xffffffff; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; + (mc68kcpu)->not_z_flag = ZFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asr_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asr_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + if(GET_MSB_16(src)) + res |= 0x8000; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; +} + + +static void m68k_op_asl_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << shift; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + src &= m68ki_shift_8_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7; +} + + +static void m68k_op_asl_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> (8-shift); + src &= m68ki_shift_16_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; +} + + +static void m68k_op_asl_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = *r_dst; + uint32_t res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> (24-shift); + src &= m68ki_shift_32_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; +} + + +static void m68k_op_asl_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 8) + { + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << shift; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + src &= m68ki_shift_8_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7; + return; + } + + *r_dst &= 0xffffff00; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = ((shift == 8 ? src & 1 : 0))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = (!(src == 0))<<7; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asl_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 16) + { + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (src << shift) >> 8; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + src &= m68ki_shift_16_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7; + return; + } + + *r_dst &= 0xffff0000; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = ((shift == 16 ? src & 1 : 0))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = (!(src == 0))<<7; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asl_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = *r_dst; + uint32_t res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 32) + { + *r_dst = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (src >> (32 - shift)) << 8; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + src &= m68ki_shift_32_table[shift + 1]; + (mc68kcpu)->v_flag = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7; + return; + } + + *r_dst = 0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = ((shift == 32 ? src & 1 : 0))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = (!(src == 0))<<7; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_asl_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_asl_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + src &= 0xc000; + (mc68kcpu)->v_flag = (!(src == 0 || src == 0xc000))<<7; +} + + +static void m68k_op_bhi_8(m68000_base_device* mc68kcpu) +{ + if(COND_HI(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bls_8(m68000_base_device* mc68kcpu) +{ + if(COND_LS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bcc_8(m68000_base_device* mc68kcpu) +{ + if(COND_CC(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bcs_8(m68000_base_device* mc68kcpu) +{ + if(COND_CS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bne_8(m68000_base_device* mc68kcpu) +{ + if(COND_NE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_beq_8(m68000_base_device* mc68kcpu) +{ + if(COND_EQ(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bvc_8(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bvs_8(m68000_base_device* mc68kcpu) +{ + if(COND_VS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bpl_8(m68000_base_device* mc68kcpu) +{ + if(COND_PL(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bmi_8(m68000_base_device* mc68kcpu) +{ + if(COND_MI(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bge_8(m68000_base_device* mc68kcpu) +{ + if(COND_GE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_blt_8(m68000_base_device* mc68kcpu) +{ + if(COND_LT(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bgt_8(m68000_base_device* mc68kcpu) +{ + if(COND_GT(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_ble_8(m68000_base_device* mc68kcpu) +{ + if(COND_LE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; +} + + +static void m68k_op_bhi_16(m68000_base_device* mc68kcpu) +{ + if(COND_HI(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bls_16(m68000_base_device* mc68kcpu) +{ + if(COND_LS(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bcc_16(m68000_base_device* mc68kcpu) +{ + if(COND_CC(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bcs_16(m68000_base_device* mc68kcpu) +{ + if(COND_CS(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bne_16(m68000_base_device* mc68kcpu) +{ + if(COND_NE(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_beq_16(m68000_base_device* mc68kcpu) +{ + if(COND_EQ(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bvc_16(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bvs_16(m68000_base_device* mc68kcpu) +{ + if(COND_VS(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bpl_16(m68000_base_device* mc68kcpu) +{ + if(COND_PL(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bmi_16(m68000_base_device* mc68kcpu) +{ + if(COND_MI(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bge_16(m68000_base_device* mc68kcpu) +{ + if(COND_GE(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_blt_16(m68000_base_device* mc68kcpu) +{ + if(COND_LT(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bgt_16(m68000_base_device* mc68kcpu) +{ + if(COND_GT(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_ble_16(m68000_base_device* mc68kcpu) +{ + if(COND_LE(mc68kcpu)) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_w; +} + + +static void m68k_op_bhi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_HI(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_HI(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bls_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LS(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_LS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bcc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CC(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_CC(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bcs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CS(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_CS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bne_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_NE(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_NE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_beq_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_EQ(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_EQ(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bvc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VC(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_VC(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bvs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VS(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_VS(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bpl_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_PL(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_PL(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bmi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_MI(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_MI(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bge_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GE(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_GE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_blt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LT(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_LT(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bgt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GT(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_GT(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_ble_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LE(mc68kcpu)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + else + { + if(COND_LE(mc68kcpu)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + return; + } + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +static void m68k_op_bchg_32_r_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst ^= mask; +} + + +static void m68k_op_bchg_8_r_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_r_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_32_s_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst ^= mask; +} + + +static void m68k_op_bchg_8_s_ai(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pi(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pd(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_di(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_ix(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_aw(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bchg_8_s_al(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +static void m68k_op_bclr_32_r_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst &= ~mask; +} + + +static void m68k_op_bclr_8_r_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_r_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_32_s_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst &= ~mask; +} + + +static void m68k_op_bclr_8_s_ai(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pi(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pd(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_di(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_ix(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_aw(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bclr_8_s_al(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +static void m68k_op_bfchg_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t* data = &DY(mc68kcpu); + uint64_t mask; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + (mc68kcpu)->n_flag = NFLAG_32(*data<not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data ^= mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfchg_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfchg_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfchg_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfchg_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfchg_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long ^ mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t* data = &DY(mc68kcpu); + uint64_t mask; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + (mc68kcpu)->n_flag = NFLAG_32(*data<not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data &= ~mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfclr_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long & ~mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint64_t data = DY(mc68kcpu); + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2>>12)&7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_PCDI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfexts_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_PCIX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data = MAKE_INT_32(data) >> (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint64_t data = DY(mc68kcpu); + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= 32 - width; + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2>>12)&7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_PCDI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfextu_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t data; + uint32_t ea = EA_PCIX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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 = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + REG_D(mc68kcpu)[(word2 >> 12) & 7] = data; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint64_t data = DY(mc68kcpu); + uint32_t bit; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + offset &= 31; + width = ((width-1) & 31) + 1; + + data = ROL_32(data, offset); + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= 32 - width; + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_PCDI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfffo_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + int32_t local_offset; + uint32_t width = word2; + uint32_t data; + uint32_t bit; + uint32_t ea = EA_PCIX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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 = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + data = MASK_OUT_ABOVE_32(data< 32) + data |= (m68ki_read_8((mc68kcpu), ea+4) << local_offset) >> 8; + + (mc68kcpu)->n_flag = NFLAG_32(data); + data >>= (32 - width); + + (mc68kcpu)->not_z_flag = data; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1) + offset++; + + REG_D(mc68kcpu)[(word2>>12)&7] = offset; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t* data = &DY(mc68kcpu); + uint64_t mask; + uint64_t insert = REG_D(mc68kcpu)[(word2>>12)&7]; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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)); + (mc68kcpu)->n_flag = NFLAG_32(insert); + (mc68kcpu)->not_z_flag = insert; + insert = ROR_32(insert, offset); + + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data &= ~mask; + *data |= insert; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + uint32_t insert_long; + uint32_t insert_byte; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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)); + (mc68kcpu)->n_flag = NFLAG_32(insert_base); + (mc68kcpu)->not_z_flag = insert_base; + insert_long = insert_base >> offset; + + data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) < 8) + { + m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24); + } + else if((width + offset) < 16) + { + m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16); + } + else + { + m68ki_write_32((mc68kcpu), ea, (data_long & ~mask_long) | insert_long); + } + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + uint32_t insert_long; + uint32_t insert_byte; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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)); + (mc68kcpu)->n_flag = NFLAG_32(insert_base); + (mc68kcpu)->not_z_flag = insert_base; + insert_long = insert_base >> offset; + + data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) < 8) + { + m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24); + } + else if((width + offset) < 16) + { + m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16); + } + else + { + m68ki_write_32((mc68kcpu), ea, (data_long & ~mask_long) | insert_long); + } + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + uint32_t insert_long; + uint32_t insert_byte; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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)); + (mc68kcpu)->n_flag = NFLAG_32(insert_base); + (mc68kcpu)->not_z_flag = insert_base; + insert_long = insert_base >> offset; + + data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) < 8) + { + m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24); + } + else if((width + offset) < 16) + { + m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16); + } + else + { + m68ki_write_32((mc68kcpu), ea, (data_long & ~mask_long) | insert_long); + } + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + uint32_t insert_long; + uint32_t insert_byte; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AW_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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)); + (mc68kcpu)->n_flag = NFLAG_32(insert_base); + (mc68kcpu)->not_z_flag = insert_base; + insert_long = insert_base >> offset; + + data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) < 8) + { + m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24); + } + else if((width + offset) < 16) + { + m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16); + } + else + { + m68ki_write_32((mc68kcpu), ea, (data_long & ~mask_long) | insert_long); + } + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfins_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + uint32_t insert_long; + uint32_t insert_byte; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AL_8(mc68kcpu); + + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + if(BIT_B(word2)) + { + /* 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)); + (mc68kcpu)->n_flag = NFLAG_32(insert_base); + (mc68kcpu)->not_z_flag = insert_base; + insert_long = insert_base >> offset; + + data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) : + (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) < 8) + { + m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24); + } + else if((width + offset) < 16) + { + m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16); + } + else + { + m68ki_write_32((mc68kcpu), ea, (data_long & ~mask_long) | insert_long); + } + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + insert_byte = MASK_OUT_ABOVE_8(insert_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (insert_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, (data_byte & ~mask_byte) | insert_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t* data = &DY(mc68kcpu); + uint64_t mask; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + (mc68kcpu)->n_flag = NFLAG_32(*data<not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data |= mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AW_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bfset_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AL_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = NFLAG_32(data_long << offset); + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + m68ki_write_32((mc68kcpu), ea, data_long | mask_long); + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t* data = &DY(mc68kcpu); + uint64_t mask; + + + if(BIT_B(word2)) + offset = REG_D(mc68kcpu)[offset&7]; + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[width&7]; + + + offset &= 31; + width = ((width-1) & 31) + 1; + + + mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width)); + mask = ROR_32(mask, offset); + + (mc68kcpu)->n_flag = NFLAG_32(*data<not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AW_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_AL_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_PCDI_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bftst_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + int32_t offset = (word2>>6)&31; + uint32_t width = word2; + uint32_t mask_base; + uint32_t data_long; + uint32_t mask_long; + uint32_t data_byte = 0; + uint32_t mask_byte = 0; + uint32_t ea = EA_PCIX_8(mc68kcpu); + + if(BIT_B(word2)) + offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]); + if(BIT_5(word2)) + width = REG_D(mc68kcpu)[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((mc68kcpu), ea); + (mc68kcpu)->n_flag = ((data_long & (0x80000000 >> offset))<>24; + (mc68kcpu)->not_z_flag = data_long & mask_long; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if((width + offset) > 32) + { + mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset); + data_byte = m68ki_read_8((mc68kcpu), ea+4); + (mc68kcpu)->not_z_flag |= (data_byte & mask_byte); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bkpt(m68000_base_device* mc68kcpu) +{ +/* if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if (!(mc68kcpu)->bkpt_ack_callback.isnull()) + ((mc68kcpu)->bkpt_ack_callback)((*mc68kcpu->program), 0, CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type) ? (mc68kcpu)->ir & 7 : 0, 0xffffffff); + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_bra_8(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_bra_16(m68000_base_device* mc68kcpu) +{ + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_bra_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + REG_PC(mc68kcpu) -= 4; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_32((mc68kcpu), offset); + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; + return; + } + else + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; + } +} + + +static void m68k_op_bset_32_r_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst |= mask; +} + + +static void m68k_op_bset_8_r_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_r_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_32_s_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst |= mask; +} + + +static void m68k_op_bset_8_s_ai(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_pi(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_pd(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_di(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_ix(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_aw(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bset_8_s_al(m68000_base_device* mc68kcpu) +{ + uint32_t mask = 1 << (OPER_I_8(mc68kcpu) & 7); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +static void m68k_op_bsr_8(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); +} + + +static void m68k_op_bsr_16(m68000_base_device* mc68kcpu) +{ + uint32_t offset = OPER_I_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + REG_PC(mc68kcpu) -= 2; + m68ki_branch_16((mc68kcpu), offset); +} + + +static void m68k_op_bsr_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t offset = OPER_I_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + REG_PC(mc68kcpu) -= 4; + m68ki_branch_32((mc68kcpu), offset); + return; + } + else + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_branch_8((mc68kcpu), MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + } +} + + +static void m68k_op_btst_32_r_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DY(mc68kcpu) & (1 << (DX(mc68kcpu) & 0x1f)); +} + + +static void m68k_op_btst_8_r_ai(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_AI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_PI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pi7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_A7_PI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pd(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_PD_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pd7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_A7_PD_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_di(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_DI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_ix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_IX_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_aw(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AW_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_al(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AL_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pcdi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_PCDI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_pcix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_PCIX_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_8_r_i(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_I_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +static void m68k_op_btst_32_s_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DY(mc68kcpu) & (1 << (OPER_I_8(mc68kcpu) & 0x1f)); +} + + +static void m68k_op_btst_8_s_ai(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_AI_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pi(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_PI_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_A7_PI_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pd(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_PD_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_A7_PD_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_di(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_DI_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_ix(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_IX_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_aw(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AW_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_al(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AL_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_PCDI_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_btst_8_s_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_PCIX_8(mc68kcpu) & (1 << bit); +} + + +static void m68k_op_callm_32_ai(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_AY_AI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_di(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_AY_DI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_ix(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_AY_IX_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_aw(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_al(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_pcdi(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_PCDI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_callm_32_pcix(m68000_base_device* mc68kcpu) +{ + /* note: watch out for pcrelative modes */ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + uint32_t ea = EA_PCIX_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); + REG_PC(mc68kcpu) += 2; +(void)ea; + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_pi7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_pd7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_8_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dest = m68ki_read_8((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_8(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_8(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_16_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t dest = m68ki_read_16((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - MASK_OUT_ABOVE_16(*compare); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + + if(COND_NE(mc68kcpu)) + *compare = MASK_OUT_BELOW_16(*compare) | dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t dest = m68ki_read_32((mc68kcpu), ea); + uint32_t* compare = ®_D(mc68kcpu)[word2 & 7]; + uint32_t res = dest - *compare; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare, dest, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare, dest, res); + + if(COND_NE(mc68kcpu)) + *compare = dest; + else + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cas2_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_32(mc68kcpu); + uint32_t* compare1 = ®_D(mc68kcpu)[(word2 >> 16) & 7]; + uint32_t ea1 = REG_DA(mc68kcpu)[(word2 >> 28) & 15]; + uint32_t dest1 = m68ki_read_16((mc68kcpu), ea1); + uint32_t res1 = dest1 - MASK_OUT_ABOVE_16(*compare1); + uint32_t* compare2 = ®_D(mc68kcpu)[word2 & 7]; + uint32_t ea2 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t dest2 = m68ki_read_16((mc68kcpu), ea2); + uint32_t res2; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_16(res1); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res1); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare1, dest1, res1); + (mc68kcpu)->c_flag = CFLAG_16(res1); + + if(COND_EQ(mc68kcpu)) + { + res2 = dest2 - MASK_OUT_ABOVE_16(*compare2); + + (mc68kcpu)->n_flag = NFLAG_16(res2); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res2); + (mc68kcpu)->v_flag = VFLAG_SUB_16(*compare2, dest2, res2); + (mc68kcpu)->c_flag = CFLAG_16(res2); + + if(COND_EQ(mc68kcpu)) + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_16((mc68kcpu), ea1, REG_D(mc68kcpu)[(word2 >> 22) & 7]); + m68ki_write_16((mc68kcpu), ea2, REG_D(mc68kcpu)[(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(mc68kcpu); +} + + +static void m68k_op_cas2_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_32(mc68kcpu); + uint32_t* compare1 = ®_D(mc68kcpu)[(word2 >> 16) & 7]; + uint32_t ea1 = REG_DA(mc68kcpu)[(word2 >> 28) & 15]; + uint32_t dest1 = m68ki_read_32((mc68kcpu), ea1); + uint32_t res1 = dest1 - *compare1; + uint32_t* compare2 = ®_D(mc68kcpu)[word2 & 7]; + uint32_t ea2 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t dest2 = m68ki_read_32((mc68kcpu), ea2); + uint32_t res2; + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->n_flag = NFLAG_32(res1); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res1); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare1, dest1, res1); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare1, dest1, res1); + + if(COND_EQ(mc68kcpu)) + { + res2 = dest2 - *compare2; + + (mc68kcpu)->n_flag = NFLAG_32(res2); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res2); + (mc68kcpu)->v_flag = VFLAG_SUB_32(*compare2, dest2, res2); + (mc68kcpu)->c_flag = CFLAG_SUB_32(*compare2, dest2, res2); + + if(COND_EQ(mc68kcpu)) + { + (mc68kcpu)->c.current_cycle += 3; + m68ki_write_32((mc68kcpu), ea1, REG_D(mc68kcpu)[(word2 >> 22) & 7]); + m68ki_write_32((mc68kcpu), ea2, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + return; + } + } + *compare1 = dest1; + *compare2 = dest2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_16_d(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(DY(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_ai(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pi(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pd(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_di(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_ix(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_aw(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_al(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pcdi(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_pcix(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_16_i(m68000_base_device* mc68kcpu) +{ + int32_t src = MAKE_INT_16(DX(mc68kcpu)); + int32_t bound = MAKE_INT_16(OPER_I_16(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_16(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); +} + + +static void m68k_op_chk_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(DY(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AY_AI_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AY_PI_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AY_PD_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AY_DI_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AY_IX_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AW_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_AL_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_PCDI_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_PCIX_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + int32_t src = MAKE_INT_32(DX(mc68kcpu)); + int32_t bound = MAKE_INT_32(OPER_I_32(mc68kcpu)); + + (mc68kcpu)->not_z_flag = ZFLAG_32(src); /* Undocumented */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undocumented */ + (mc68kcpu)->c_flag = CFLAG_CLEAR; /* Undocumented */ + + if(src >= 0 && src <= bound) + { + return; + } + (mc68kcpu)->n_flag = (src < 0)<<7; + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_pcdi(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_PCDI_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_pcix(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_PCIX_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_ai(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_8_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t lower_bound = m68ki_read_8((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_8((mc68kcpu), ea + 1); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_8(compare) - MAKE_INT_8(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_pcdi(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_PCDI_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_pcix(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_PCIX_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_16_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t lower_bound = m68ki_read_16((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_16((mc68kcpu), ea + 2); + + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(compare) - MAKE_INT_16(lower_bound); + else + (mc68kcpu)->c_flag = compare - lower_bound; + + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + if(!BIT_F(word2)) + (mc68kcpu)->c_flag = MAKE_INT_16(upper_bound) - MAKE_INT_16(compare); + else + (mc68kcpu)->c_flag = upper_bound - compare; + + (mc68kcpu)->c_flag = CFLAG_16((mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_pcdi(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_PCDI_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_pcix(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_PCIX_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_chk2cmp2_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint32_t compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t lower_bound = m68ki_read_32((mc68kcpu), ea); + uint32_t upper_bound = m68ki_read_32((mc68kcpu), ea + 4); + + (mc68kcpu)->c_flag = compare - lower_bound; + (mc68kcpu)->not_z_flag = !((upper_bound==compare) | (lower_bound==compare)); + (mc68kcpu)->c_flag = CFLAG_SUB_32(lower_bound, compare, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu)) + { + if(BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + + (mc68kcpu)->c_flag = upper_bound - compare; + (mc68kcpu)->c_flag = CFLAG_SUB_32(compare, upper_bound, (mc68kcpu)->c_flag); + if(COND_CS(mc68kcpu) && BIT_B(word2)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_CHK); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_clr_8_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) &= 0xffffff00; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_8((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_8((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) &= 0xffff0000; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_16((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_16((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) = 0; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_clr_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + m68ki_read_32((mc68kcpu), ea); /* the 68000 does a dummy read, the value is discarded */ + } + + m68ki_write_32((mc68kcpu), ea, 0); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; +} + + +static void m68k_op_cmp_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_AI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_DI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_IX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AW_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AL_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCDI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCIX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_8_i(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmp_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_AI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_DI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_IX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AW_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AL_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCDI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCIX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmp_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = DY(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t src = AY(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_AI_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_DI_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_IX_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AW_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AL_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCDI_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCIX_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmp_32_i(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = DX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(DY(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(AY(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = DY(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t src = AY(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_AI_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_DI_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_IX_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AW_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AL_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCDI_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_PCIX_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpa_32_i(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = AX(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AY_AI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AY_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_A7_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AY_PD_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_A7_PD_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AY_DI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AY_IX_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AW_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_AL_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpi_8_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_PCDI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpi_8_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = OPER_PCIX_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpi_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AY_AI_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AY_PI_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AY_PD_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AY_DI_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AY_IX_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AW_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_AL_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpi_16_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_PCDI_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpi_16_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = OPER_PCIX_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpi_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = DY(mc68kcpu); + uint32_t res = dst - src; + +/* if (!(mc68kcpu)->cmpild_instr_callback.isnull()) + ((mc68kcpu)->cmpild_instr_callback)(*(mc68kcpu)->program, (mc68kcpu)->ir & 7, src, 0xffffffff);*/ + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AY_AI_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AY_PI_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AY_PD_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AY_DI_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AY_IX_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AW_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_AL_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cmpi_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_PCDI_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpi_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = OPER_PCIX_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cmpm_8_ax7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_8(mc68kcpu); + uint32_t dst = OPER_A7_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8_ay7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PI_8(mc68kcpu); + uint32_t dst = OPER_AX_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8_axy7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PI_8(mc68kcpu); + uint32_t dst = OPER_A7_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpm_8(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_8(mc68kcpu); + uint32_t dst = OPER_AX_PI_8(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_8(res); +} + + +static void m68k_op_cmpm_16(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_16(mc68kcpu); + uint32_t dst = OPER_AX_PI_16(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_16(res); +} + + +static void m68k_op_cmpm_32(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PI_32(mc68kcpu); + uint32_t dst = OPER_AX_PI_32(mc68kcpu); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); +} + + +static void m68k_op_cpbcc_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpbcc)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_cpdbcc_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpdbcc)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_cpgen_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type) && (mc68kcpu->get_fpu_enable() || mc68kcpu->has_pmmu)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpgen)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_cpscc_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpscc)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_cptrapcc_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cptrapcc)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_ftrapcc_32(m68000_base_device* mc68kcpu) +{ +/* if((mc68kcpu)->get_fpu_enable()) + { + m68881_ftrap(mc68kcpu); + return; + }*/ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_dbt_16(m68000_base_device* mc68kcpu) +{ + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbf_16(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; +} + + +static void m68k_op_dbhi_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_HI(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbls_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LS(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbcc_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_CC(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbcs_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_CS(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbne_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_NE(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbeq_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_EQ(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbvc_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_VC(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbvs_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_VS(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbpl_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_PL(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbmi_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_MI(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbge_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_GE(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dblt_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LT(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dbgt_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_GT(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_dble_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LE(mc68kcpu)) + { + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + uint32_t offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +static void m68k_op_divs_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(DY(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divs_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + int32_t src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + int32_t quotient; + int32_t remainder; + + if(src != 0) + { + if((uint32_t)*r_dst == 0x80000000 && src == -1) + { + (mc68kcpu)->not_z_flag = 0; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = 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)) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divu_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_16(mc68kcpu); + + if(src != 0) + { + uint32_t quotient = *r_dst / src; + uint32_t remainder = *r_dst % src; + + if(quotient < 0x10000) + { + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->n_flag = NFLAG_16(quotient); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16)); + return; + } + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); +} + + +static void m68k_op_divl_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = DY(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AY_AI_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AY_PI_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AY_PD_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AY_DI_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AY_IX_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AW_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_AL_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_PCDI_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_PCIX_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_divl_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t divisor = OPER_I_32(mc68kcpu); + uint64_t dividend = 0; + uint64_t quotient = 0; + uint64_t remainder = 0; + + if(divisor != 0) + { + if(BIT_A(word2)) /* 64 bit */ + { + dividend = REG_D(mc68kcpu)[word2 & 7]; + dividend <<= 32; + dividend |= REG_D(mc68kcpu)[(word2 >> 12) & 7]; + + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)dividend / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)dividend % (int64_t)((int32_t)divisor)); + if((int64_t)quotient != (int64_t)((int32_t)quotient)) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + } + else /* unsigned */ + { + quotient = dividend / divisor; + if(quotient > 0xffffffff) + { + (mc68kcpu)->v_flag = VFLAG_SET; + return; + } + remainder = dividend % divisor; + } + } + else /* 32 bit */ + { + dividend = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + if(BIT_B(word2)) /* signed */ + { + quotient = (uint64_t)((int64_t)((int32_t)dividend) / (int64_t)((int32_t)divisor)); + remainder = (uint64_t)((int64_t)((int32_t)dividend) % (int64_t)((int32_t)divisor)); + } + else /* unsigned */ + { + quotient = dividend / divisor; + remainder = dividend % divisor; + } + } + + REG_D(mc68kcpu)[word2 & 7] = remainder; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = quotient; + + (mc68kcpu)->n_flag = NFLAG_32(quotient); + (mc68kcpu)->not_z_flag = quotient; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_ZERO_DIVIDE); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_eor_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu) ^= MASK_OUT_ABOVE_8(DX(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) ^ m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu) ^= MASK_OUT_ABOVE_16(DX(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) ^ m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu) ^= DX(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eor_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu) ^= OPER_I_8(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = src ^ m68ki_read_8((mc68kcpu), ea); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu) ^= OPER_I_16(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = src ^ m68ki_read_16((mc68kcpu), ea); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu) ^= OPER_I_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = src ^ m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_eori_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) ^ OPER_I_16(mc68kcpu)); +} + + +static void m68k_op_eori_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t src = OPER_I_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), m68ki_get_sr(mc68kcpu) ^ src); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_exg_32_dd(m68000_base_device* mc68kcpu) +{ + uint32_t* reg_a = &DX(mc68kcpu); + uint32_t* reg_b = &DY(mc68kcpu); + uint32_t tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_exg_32_aa(m68000_base_device* mc68kcpu) +{ + uint32_t* reg_a = &AX(mc68kcpu); + uint32_t* reg_b = &AY(mc68kcpu); + uint32_t tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_exg_32_da(m68000_base_device* mc68kcpu) +{ + uint32_t* reg_a = &DX(mc68kcpu); + uint32_t* reg_b = &AY(mc68kcpu); + uint32_t tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +static void m68k_op_ext_16(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0); + + (mc68kcpu)->n_flag = NFLAG_16(*r_dst); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_ext_32(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0); + + (mc68kcpu)->n_flag = NFLAG_32(*r_dst); + (mc68kcpu)->not_z_flag = *r_dst; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_extb_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t* r_dst = &DY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0); + + (mc68kcpu)->n_flag = NFLAG_32(*r_dst); + (mc68kcpu)->not_z_flag = *r_dst; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_illegal(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_jmp_32_ai(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_AY_AI_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_di(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_AY_DI_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_ix(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_AY_IX_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_aw(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_AW_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_al(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_AL_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_pcdi(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_PCDI_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jmp_32_pcix(m68000_base_device* mc68kcpu) +{ + m68ki_jump((mc68kcpu), EA_PCIX_32(mc68kcpu)); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(REG_PC(mc68kcpu) == REG_PPC(mc68kcpu) && (mc68kcpu)->c.current_cycle < (mc68kcpu)->c.target_cycle) + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; +} + + +static void m68k_op_jsr_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_PCDI_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_jsr_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_PCIX_32(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_push_32((mc68kcpu), REG_PC(mc68kcpu)); + m68ki_jump((mc68kcpu), ea); +} + + +static void m68k_op_lea_32_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_AI_32(mc68kcpu); +} + + +static void m68k_op_lea_32_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_DI_32(mc68kcpu); +} + + +static void m68k_op_lea_32_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_IX_32(mc68kcpu); +} + + +static void m68k_op_lea_32_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AW_32(mc68kcpu); +} + + +static void m68k_op_lea_32_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AL_32(mc68kcpu); +} + + +static void m68k_op_lea_32_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_PCDI_32(mc68kcpu); +} + + +static void m68k_op_lea_32_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_PCIX_32(mc68kcpu); +} + + +static void m68k_op_link_16_a7(m68000_base_device* mc68kcpu) +{ + REG_A(mc68kcpu)[7] -= 4; + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[7], REG_A(mc68kcpu)[7]); + REG_A(mc68kcpu)[7] = MASK_OUT_ABOVE_32(REG_A(mc68kcpu)[7] + MAKE_INT_16(OPER_I_16(mc68kcpu))); +} + + +static void m68k_op_link_16(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + m68ki_push_32((mc68kcpu), *r_dst); + *r_dst = REG_A(mc68kcpu)[7]; + REG_A(mc68kcpu)[7] = MASK_OUT_ABOVE_32(REG_A(mc68kcpu)[7] + MAKE_INT_16(OPER_I_16(mc68kcpu))); +} + + +static void m68k_op_link_32_a7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_A(mc68kcpu)[7] -= 4; + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[7], REG_A(mc68kcpu)[7]); + REG_A(mc68kcpu)[7] = MASK_OUT_ABOVE_32(REG_A(mc68kcpu)[7] + OPER_I_32(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_link_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t* r_dst = &AY(mc68kcpu); + + m68ki_push_32((mc68kcpu), *r_dst); + *r_dst = REG_A(mc68kcpu)[7]; + REG_A(mc68kcpu)[7] = MASK_OUT_ABOVE_32(REG_A(mc68kcpu)[7] + OPER_I_32(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_lsr_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = *r_dst; + uint32_t res = src >> shift; + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift <= 8) + { + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffffff00; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift <= 16) + { + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = (src >> (shift - 1))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = *r_dst; + uint32_t res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 32) + { + *r_dst = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = (src >> (shift - 1))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (shift == 32 ? GET_MSB_32(src)>>23 : 0); + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsr_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = src >> 1; + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << shift; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> (8-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = *r_dst; + uint32_t res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> (24-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift <= 8) + { + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src << shift; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffffff00; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift <= 16) + { + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (src << shift) >> 8; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst &= 0xffff0000; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = DX(mc68kcpu) & 0x3f; + uint32_t src = *r_dst; + uint32_t res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift < 32) + { + *r_dst = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = (src >> (32 - shift)) << 8; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + *r_dst = 0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = ((shift == 32 ? src & 1 : 0))<<8; + (mc68kcpu)->n_flag = NFLAG_CLEAR; + (mc68kcpu)->not_z_flag = ZFLAG_SET; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_lsl_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(src << 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_d_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ai_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AX_AI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi7_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pi_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AX_PI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd7_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_pd_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_di_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AX_DI_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_ix_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AX_IX_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_aw_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_8_al_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_d_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ai_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AX_AI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pi_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AX_PI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_pd_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_di_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AX_DI_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_ix_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AX_IX_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_aw_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_16_al_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_d_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ai_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AX_AI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pi_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AX_PI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_pd_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + + m68ki_write_16((mc68kcpu), ea+2, res & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (res >> 16) & 0xFFFF ); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_di_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AX_DI_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_ix_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AX_IX_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_aw_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_a(m68000_base_device* mc68kcpu) +{ + uint32_t res = AY(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCDI_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_PCIX_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move_32_al_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_movea_16_d(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(DY(mc68kcpu)); +} + + +static void m68k_op_movea_16_a(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(AY(mc68kcpu)); +} + + +static void m68k_op_movea_16_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_pi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_pd(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AW_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AL_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); +} + + +static void m68k_op_movea_16_i(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_I_16(mc68kcpu)); +} + + +static void m68k_op_movea_32_d(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = DY(mc68kcpu); +} + + +static void m68k_op_movea_32_a(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = AY(mc68kcpu); +} + + +static void m68k_op_movea_32_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_AI_32(mc68kcpu); +} + + +static void m68k_op_movea_32_pi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_PI_32(mc68kcpu); +} + + +static void m68k_op_movea_32_pd(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_PD_32(mc68kcpu); +} + + +static void m68k_op_movea_32_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_DI_32(mc68kcpu); +} + + +static void m68k_op_movea_32_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_IX_32(mc68kcpu); +} + + +static void m68k_op_movea_32_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AW_32(mc68kcpu); +} + + +static void m68k_op_movea_32_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AL_32(mc68kcpu); +} + + +static void m68k_op_movea_32_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_PCDI_32(mc68kcpu); +} + + +static void m68k_op_movea_32_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_PCIX_32(mc68kcpu); +} + + +static void m68k_op_movea_32_i(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_I_32(mc68kcpu); +} + + +static void m68k_op_move_16_frc_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + DY(mc68kcpu) = MASK_OUT_BELOW_16(DY(mc68kcpu)) | m68ki_get_ccr(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AY_AI_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AY_PI_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AY_PD_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AY_DI_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AY_IX_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AW_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_frc_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_write_16((mc68kcpu), EA_AL_16(mc68kcpu), m68ki_get_ccr(mc68kcpu)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_move_16_toc_d(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), DY(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_ai(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_AI_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_pi(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_PI_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_pd(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_PD_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_di(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_DI_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_ix(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_IX_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_aw(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AW_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_al(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AL_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_pcdi(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_PCDI_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_pcix(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_PCIX_16(mc68kcpu)); +} + + +static void m68k_op_move_16_toc_i(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_I_16(mc68kcpu)); +} + + +static void m68k_op_move_16_frs_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + DY(mc68kcpu) = MASK_OUT_BELOW_16(DY(mc68kcpu)) | m68ki_get_sr(mc68kcpu); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AY_AI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AY_PI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AY_PD_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AY_DI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AY_IX_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AW_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_frs_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + uint32_t ea = EA_AL_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_d(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + m68ki_set_sr((mc68kcpu), DY(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_ai(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AY_AI_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_pi(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AY_PI_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_pd(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AY_PD_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_di(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AY_DI_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_ix(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AY_IX_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_aw(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AW_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_al(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_AL_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_pcdi(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_PCDI_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_pcix(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_PCIX_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_16_tos_i(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_I_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), new_sr); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_32_fru(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + AY(mc68kcpu) = REG_USP(mc68kcpu); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_move_32_tou(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_USP(mc68kcpu) = AY(mc68kcpu); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_movec_32_cr(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_movec_32_rc(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_movem_16_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = AY(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + ea -= 2; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[15-i])); + count++; + } + AY(mc68kcpu) = ea; + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[i])); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[i])); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[i])); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[i])); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[i])); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = AY(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + ea -= 4; + m68ki_write_16((mc68kcpu), ea+2, REG_DA(mc68kcpu)[15-i] & 0xFFFF ); + m68ki_write_16((mc68kcpu), ea, (REG_DA(mc68kcpu)[15-i] >> 16) & 0xFFFF ); + count++; + } + AY(mc68kcpu) = ea; + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = AY(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + AY(mc68kcpu) = ea; + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_PCDI_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_PCIX_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_16_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_w) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = AY(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + AY(mc68kcpu) = ea; + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_PCDI_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_PCIX_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movem_32_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t i = 0; + uint32_t register_list = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->c.current_cycle += (count<<(mc68kcpu)->cyc_movem_l) * (mc68kcpu)->c.options->gen.clock_divider; +} + + +static void m68k_op_movep_16_re(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = DX(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(src >> 8)); + m68ki_write_8((mc68kcpu), ea += 2, MASK_OUT_ABOVE_8(src)); +} + + +static void m68k_op_movep_32_re(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(src >> 24)); + m68ki_write_8((mc68kcpu), ea += 2, MASK_OUT_ABOVE_8(src >> 16)); + m68ki_write_8((mc68kcpu), ea += 2, MASK_OUT_ABOVE_8(src >> 8)); + m68ki_write_8((mc68kcpu), ea += 2, MASK_OUT_ABOVE_8(src)); +} + + +static void m68k_op_movep_16_er(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8((mc68kcpu), ea) << 8) + m68ki_read_8((mc68kcpu), ea + 2)); +} + + +static void m68k_op_movep_32_er(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + + DX(mc68kcpu) = (m68ki_read_8((mc68kcpu), ea) << 24) + (m68ki_read_8((mc68kcpu), ea + 2) << 16) + + (m68ki_read_8((mc68kcpu), ea + 4) << 8) + m68ki_read_8((mc68kcpu), ea + 6); +} + + +static void m68k_op_moves_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_ai(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_pi(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_pd(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_di(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_ix(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_aw(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_16_al(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_ai(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_pi(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_pd(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_di(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_ix(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_aw(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moves_32_al(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_moveq_32(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) = MAKE_INT_8(MASK_OUT_ABOVE_8((mc68kcpu)->ir)); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_move16_32(m68000_base_device* mc68kcpu) +{ + uint16_t w2 = OPER_I_16(mc68kcpu); + int ax = (mc68kcpu)->ir & 7; + int ay = (w2 >> 12) & 7; + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[ay], m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[ax])); + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[ay]+4, m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[ax]+4)); + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[ay]+8, m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[ax]+8)); + m68ki_write_32((mc68kcpu), REG_A(mc68kcpu)[ay]+12, m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[ax]+12)); + + REG_A(mc68kcpu)[ax] += 16; + REG_A(mc68kcpu)[ay] += 16; +} + + +static void m68k_op_muls_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AW_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_AL_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCDI_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_PCIX_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_muls_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(MAKE_INT_16(OPER_I_16(mc68kcpu)) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst))); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AY_AI_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AY_PI_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AY_PD_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AY_DI_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AY_IX_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AW_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_AL_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_PCDI_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_PCIX_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mulu_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t res = OPER_I_16(mc68kcpu) * MASK_OUT_ABOVE_16(*r_dst); + + *r_dst = res; + + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_mull_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = DY(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AY_AI_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AY_PI_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AY_PD_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AY_DI_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AY_IX_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AW_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_AL_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_PCDI_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_PCIX_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_mull_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t word2 = OPER_I_16(mc68kcpu); + uint64_t src = OPER_I_32(mc68kcpu); + uint64_t dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + uint64_t res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (int64_t)((int32_t)src) * (int64_t)((int32_t)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((int64_t)res != (int32_t)res)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + + res = src * dst; + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = (res > 0xffffffff)<<7; + REG_D(mc68kcpu)[(word2 >> 12) & 7] = (mc68kcpu)->not_z_flag; + return; + } + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res) | (res>>32); + (mc68kcpu)->n_flag = NFLAG_64(res); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + REG_D(mc68kcpu)[word2 & 7] = (res >> 32); + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_nbcd_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_nbcd_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1(mc68kcpu)); + + if(res != 0x9a) + { + (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + + if((res & 0x0f) == 0xa) + res = (res & 0xf0) + 0x10; + + res = MASK_OUT_ABOVE_8(res); + + (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ + + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(res)); + + (mc68kcpu)->not_z_flag |= res; + (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->x_flag = XFLAG_SET; + } + else + { + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->x_flag = XFLAG_CLEAR; + } + (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ +} + + +static void m68k_op_neg_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - MASK_OUT_ABOVE_8(*r_dst); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = *r_dst & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_neg_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - MASK_OUT_ABOVE_16(*r_dst); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (*r_dst & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_neg_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - *r_dst; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(*r_dst, 0, res); + (mc68kcpu)->v_flag = (*r_dst & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_neg_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_neg_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_negx_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = *r_dst & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_negx_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea); + uint32_t res = 0 - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = src & res; + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (*r_dst & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_negx_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = (src & res)>>8; + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(*r_dst, 0, res); + (mc68kcpu)->v_flag = (*r_dst & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = res; +} + + +static void m68k_op_negx_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_negx_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t src = m68ki_read_32((mc68kcpu), ea); + uint32_t res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, 0, res); + (mc68kcpu)->v_flag = (src & res)>>24; + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_nop(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ +} + + +static void m68k_op_not_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~*r_dst); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(~m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~*r_dst); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(~m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_not_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_32(~m68ki_read_32((mc68kcpu), ea)); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= MASK_OUT_ABOVE_8(DY(mc68kcpu)))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AY_AI_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AY_PI_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_A7_PI_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AY_PD_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_A7_PD_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AY_DI_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AY_IX_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AW_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_AL_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_PCDI_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_PCIX_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DX(mc68kcpu) |= OPER_I_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= MASK_OUT_ABOVE_16(DY(mc68kcpu)))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AY_AI_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AY_PI_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AY_PD_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AY_DI_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AY_IX_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AW_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_AL_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_PCDI_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_PCIX_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16((DX(mc68kcpu) |= OPER_I_16(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= DY(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AY_AI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AY_PI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AY_PD_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AY_DI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AY_IX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AW_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_AL_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_PCDI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_PCIX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t res = DX(mc68kcpu) |= OPER_I_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_8_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(DX(mc68kcpu) | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_16_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(DX(mc68kcpu) | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_or_32_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = DX(mc68kcpu) | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8((DY(mc68kcpu) |= OPER_I_8(mc68kcpu))); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_8(src | m68ki_read_8((mc68kcpu), ea)); + + m68ki_write_8((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu) |= OPER_I_16(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t res = MASK_OUT_ABOVE_16(src | m68ki_read_16((mc68kcpu), ea)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu) |= OPER_I_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t res = src | m68ki_read_32((mc68kcpu), ea); + + m68ki_write_32((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ori_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) | OPER_I_16(mc68kcpu)); +} + + +static void m68k_op_ori_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t src = OPER_I_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_sr((mc68kcpu), m68ki_get_sr(mc68kcpu) | src); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_pack_16_rr(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: DX(mc68kcpu) and DY(mc68kcpu) are reversed in Motorola's docs */ + uint32_t src = DY(mc68kcpu) + OPER_I_16(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_pack_16_mm_ax7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t ea_src = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea_src); + ea_src = EA_AY_PD_8(mc68kcpu); + src = ((src << 8) | m68ki_read_8((mc68kcpu), ea_src)) + OPER_I_16(mc68kcpu); + + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), ((src >> 8) & 0x000f) | ((src<<4) & 0x00f0)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_pack_16_mm_ay7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t ea_src = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea_src); + ea_src = EA_A7_PD_8(mc68kcpu); + src = ((src << 8) | m68ki_read_8((mc68kcpu), ea_src)) + OPER_I_16(mc68kcpu); + + m68ki_write_8((mc68kcpu), EA_AX_PD_8(mc68kcpu), ((src >> 8) & 0x000f) | ((src<<4) & 0x00f0)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_pack_16_mm_axy7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t ea_src = EA_A7_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea_src); + ea_src = EA_A7_PD_8(mc68kcpu); + src = ((src << 8) | m68ki_read_8((mc68kcpu), ea_src)) + OPER_I_16(mc68kcpu); + + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), ((src >> 8) & 0x000f) | ((src<<4) & 0x00f0)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_pack_16_mm(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t ea_src = EA_AY_PD_8(mc68kcpu); + uint32_t src = m68ki_read_8((mc68kcpu), ea_src); + ea_src = EA_AY_PD_8(mc68kcpu); + src = ((src << 8) | m68ki_read_8((mc68kcpu), ea_src)) + OPER_I_16(mc68kcpu); + + m68ki_write_8((mc68kcpu), EA_AX_PD_8(mc68kcpu), ((src >> 8) & 0x000f) | ((src<<4) & 0x00f0)); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_pea_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_PCDI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pea_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_PCIX_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +static void m68k_op_pflusha_32(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_pflushan_32(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_pmmu_32(m68000_base_device* mc68kcpu) +{ + + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_ptest_32(m68000_base_device* mc68kcpu) +{ + + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_reset(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + m68k_reset_handler handler = (m68k_reset_handler)(mc68kcpu)->c.reset_handler; + handler(&(mc68kcpu)->c); + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_reset; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_ror_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t shift = orig_shift & 7; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROR_8(src, shift); + + if(orig_shift != 0) + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << (9-orig_shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROR_16(src, shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint64_t src = *r_dst; + uint32_t res = ROR_32(src, shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << (9-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 7; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROR_8(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->c_flag = src << (8-((shift-1)&7)); + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 15; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROR_16(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->c_flag = (src >> ((shift - 1) & 15)) << 8; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 31; + uint64_t src = *r_dst; + uint32_t res = ROR_32(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + (mc68kcpu)->c_flag = (src >> ((shift - 1) & 31)) << 8; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_ror_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_16(src, 1); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << 8; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t shift = orig_shift & 7; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROL_8(src, shift); + + if(orig_shift != 0) + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src << orig_shift; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROL_16(src, shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> (8-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint64_t src = *r_dst; + uint32_t res = ROL_32(src, shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> (24-shift); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 7; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROL_8(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift != 0) + { + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->c_flag = src << shift; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + (mc68kcpu)->c_flag = (src & 1)<<8; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_8(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 15; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, shift)); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + if(shift != 0) + { + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->c_flag = (src << shift) >> 8; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + (mc68kcpu)->c_flag = (src & 1)<<8; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_16(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + uint32_t shift = orig_shift & 31; + uint64_t src = *r_dst; + uint32_t res = ROL_32(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + *r_dst = res; + + (mc68kcpu)->c_flag = (src >> ((32 - shift) & 0x1f)) << 8; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->n_flag = NFLAG_32(src); + (mc68kcpu)->not_z_flag = src; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rol_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = MASK_OUT_ABOVE_16(ROL_16(src, 1)); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->c_flag = src >> 7; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROR_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res; + res = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint64_t src = *r_dst; + uint64_t res = src | (((uint64_t)XFLAG_AS_1(mc68kcpu)) << 32); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + res = ROR_33_64(res, shift); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 9; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROR_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res; + res = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_8(*r_dst); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 17; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_16(*r_dst); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 33; + uint64_t src = *r_dst; + uint64_t res = src | (((uint64_t)XFLAG_AS_1(mc68kcpu)) << 32); + + res = ROR_33_64(res, shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_32(*r_dst); + (mc68kcpu)->not_z_flag = *r_dst; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxr_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_8_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROL_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res; + res = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_32_s(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint64_t src = *r_dst; + uint64_t res = src | (((uint64_t)XFLAG_AS_1(mc68kcpu)) << 32); + + if(shift != 0) + (mc68kcpu)->c.current_cycle += (shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + res = ROL_33_64(res, shift); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_8_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 9; + uint32_t src = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = ROL_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res; + res = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_8(*r_dst); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 17; + uint32_t src = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_16(*r_dst); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_32_r(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + uint32_t shift = orig_shift % 33; + uint64_t src = *r_dst; + uint64_t res = src | (((uint64_t)XFLAG_AS_1(mc68kcpu)) << 32); + + res = ROL_33_64(res, shift); + + (mc68kcpu)->c.current_cycle += (orig_shift<<(mc68kcpu)->cyc_shift) * (mc68kcpu)->c.options->gen.clock_divider; + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 24; + res = MASK_OUT_ABOVE_32(res); + + *r_dst = res; + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + return; + } + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag; + (mc68kcpu)->n_flag = NFLAG_32(*r_dst); + (mc68kcpu)->not_z_flag = *r_dst; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_roxl_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = m68ki_read_16((mc68kcpu), ea); + uint32_t res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), 1); + + (mc68kcpu)->c_flag = (mc68kcpu)->x_flag = res >> 8; + res = MASK_OUT_ABOVE_16(res); + + m68ki_write_16((mc68kcpu), ea, res); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_rtd_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t new_pc = m68ki_pull_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_A(mc68kcpu)[7] = MASK_OUT_ABOVE_32(REG_A(mc68kcpu)[7] + MAKE_INT_16(OPER_I_16(mc68kcpu))); + m68ki_jump((mc68kcpu), new_pc); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_rte_32(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr; + uint32_t new_pc; + uint32_t format_word; + +/* if (!(mc68kcpu)->rte_instr_callback.isnull()) + ((mc68kcpu)->rte_instr_callback)(1);*/ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type)) + { + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + + return; + } + + if(CPU_TYPE_IS_010((mc68kcpu)->cpu_type)) + { + format_word = m68ki_read_16((mc68kcpu), REG_A(mc68kcpu)[7]+6) >> 12; + if(format_word == 0) + { + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* format word */ + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + } + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + /* Not handling bus fault (9) */ + m68ki_exception_format_error(mc68kcpu); + return; + } + + /* Otherwise it's 020 */ +rte_loop: + format_word = m68ki_read_16((mc68kcpu), REG_A(mc68kcpu)[7]+6) >> 12; + switch(format_word) + { + case 0: /* Normal */ + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* format word */ + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + case 1: /* Throwaway */ + new_sr = m68ki_pull_16(mc68kcpu); + m68ki_fake_pull_32(mc68kcpu); /* program counter */ + m68ki_fake_pull_16(mc68kcpu); /* format word */ + m68ki_set_sr_noint((mc68kcpu), new_sr); + goto rte_loop; + case 2: /* Trap */ + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* format word */ + m68ki_fake_pull_32(mc68kcpu); /* address */ + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + case 7: /* 68040 access error */ + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* $06: format word */ + m68ki_fake_pull_32(mc68kcpu); /* $08: effective address */ + m68ki_fake_pull_16(mc68kcpu); /* $0c: special status word */ + m68ki_fake_pull_16(mc68kcpu); /* $0e: wb3s */ + m68ki_fake_pull_16(mc68kcpu); /* $10: wb2s */ + m68ki_fake_pull_16(mc68kcpu); /* $12: wb1s */ + m68ki_fake_pull_32(mc68kcpu); /* $14: data fault address */ + m68ki_fake_pull_32(mc68kcpu); /* $18: wb3a */ + m68ki_fake_pull_32(mc68kcpu); /* $1c: wb3d */ + m68ki_fake_pull_32(mc68kcpu); /* $20: wb2a */ + m68ki_fake_pull_32(mc68kcpu); /* $24: wb2d */ + m68ki_fake_pull_32(mc68kcpu); /* $28: wb1a */ + m68ki_fake_pull_32(mc68kcpu); /* $2c: wb1d/pd0 */ + m68ki_fake_pull_32(mc68kcpu); /* $30: pd1 */ + m68ki_fake_pull_32(mc68kcpu); /* $34: pd2 */ + m68ki_fake_pull_32(mc68kcpu); /* $38: pd3 */ + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + + case 0x0a: /* Bus Error at instruction boundary */ + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* $06: format word */ + m68ki_fake_pull_16(mc68kcpu); /* $08: internal register */ + m68ki_fake_pull_16(mc68kcpu); /* $0a: special status word */ + m68ki_fake_pull_16(mc68kcpu); /* $0c: instruction pipe stage c */ + m68ki_fake_pull_16(mc68kcpu); /* $0e: instruction pipe stage b */ + m68ki_fake_pull_32(mc68kcpu); /* $10: data fault address */ + m68ki_fake_pull_32(mc68kcpu); /* $14: internal registers */ + m68ki_fake_pull_32(mc68kcpu); /* $18: data output buffer */ + m68ki_fake_pull_32(mc68kcpu); /* $1c: internal registers */ + + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + case 0x0b: /* Bus Error - Instruction Execution in Progress */ + new_sr = m68ki_pull_16(mc68kcpu); + new_pc = m68ki_pull_32(mc68kcpu); + m68ki_fake_pull_16(mc68kcpu); /* $06: format word */ + m68ki_fake_pull_16(mc68kcpu); /* $08: internal register */ + m68ki_fake_pull_16(mc68kcpu); /* $0a: special status word */ + m68ki_fake_pull_16(mc68kcpu); /* $0c: instruction pipe stage c */ + m68ki_fake_pull_16(mc68kcpu); /* $0e: instruction pipe stage b */ + m68ki_fake_pull_32(mc68kcpu); /* $10: data fault address */ + m68ki_fake_pull_32(mc68kcpu); /* $14: internal registers */ + m68ki_fake_pull_32(mc68kcpu); /* $18: data output buffer */ + m68ki_fake_pull_32(mc68kcpu); /* $1c: internal registers */ + m68ki_fake_pull_32(mc68kcpu); /* $20: */ + m68ki_fake_pull_32(mc68kcpu); /* $24: stage B address */ + m68ki_fake_pull_32(mc68kcpu); /* $28: */ + m68ki_fake_pull_32(mc68kcpu); /* $2c: data input buffer */ + m68ki_fake_pull_32(mc68kcpu); /* $30: */ + m68ki_fake_pull_16(mc68kcpu); /* $34: */ + m68ki_fake_pull_16(mc68kcpu); /* $36: version #, internal information */ + m68ki_fake_pull_32(mc68kcpu); /* $38: */ + m68ki_fake_pull_32(mc68kcpu); /* $3c: */ + m68ki_fake_pull_32(mc68kcpu); /* $40: */ + m68ki_fake_pull_32(mc68kcpu); /* $44: */ + m68ki_fake_pull_32(mc68kcpu); /* $48: */ + m68ki_fake_pull_32(mc68kcpu); /* $4c: */ + m68ki_fake_pull_32(mc68kcpu); /* $50: */ + m68ki_fake_pull_32(mc68kcpu); /* $54: */ + m68ki_fake_pull_32(mc68kcpu); /* $58: */ + + m68ki_jump((mc68kcpu), new_pc); + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + return; + } + /* Not handling long or short bus fault */ + (mc68kcpu)->instr_mode = INSTRUCTION_YES; + (mc68kcpu)->run_mode = RUN_MODE_NORMAL; + m68ki_exception_format_error(mc68kcpu); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_rtm_32(m68000_base_device* mc68kcpu) +{ + /*if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + m68ki_trace_t0(mc68kcpu); + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (rtm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + }*/ + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_rtr_32(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_set_ccr((mc68kcpu), m68ki_pull_16(mc68kcpu)); + m68ki_jump((mc68kcpu), m68ki_pull_32(mc68kcpu)); +} + + +static void m68k_op_rts_32(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_jump((mc68kcpu), m68ki_pull_32(mc68kcpu)); +} + + +static void m68k_op_sbcd_8_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(mc68kcpu); + +// (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to assume cleared. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + (mc68kcpu)->n_flag = (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = 0; + + res = MASK_OUT_ABOVE_8(res); + +// (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ +// (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_sbcd_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(mc68kcpu); + +// (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + (mc68kcpu)->n_flag = (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = 0; + + res = MASK_OUT_ABOVE_8(res); + +// (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ +// (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_sbcd_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(mc68kcpu); + +// (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + (mc68kcpu)->n_flag = (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = 0; + + res = MASK_OUT_ABOVE_8(res); + +// (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ +// (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_sbcd_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(mc68kcpu); + +// (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + (mc68kcpu)->n_flag = (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = 0; + + res = MASK_OUT_ABOVE_8(res); + +// (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ +// (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_sbcd_8_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1(mc68kcpu); + +// (mc68kcpu)->v_flag = ~res; /* Undefined V behavior */ + (mc68kcpu)->v_flag = VFLAG_CLEAR; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to return zero. */ + + if(res > 9) + res -= 6; + res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src); + if(res > 0x99) + { + res += 0xa0; + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SET; + (mc68kcpu)->n_flag = NFLAG_SET; /* Undefined in Motorola's M68000PM/AD rev.1 and safer to follow carry. */ + } + else + (mc68kcpu)->n_flag = (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = 0; + + res = MASK_OUT_ABOVE_8(res); + +// (mc68kcpu)->v_flag &= res; /* Undefined V behavior part II */ +// (mc68kcpu)->n_flag = NFLAG_8(res); /* Undefined N behavior */ + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_st_8_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) |= 0xff; +} + + +static void m68k_op_st_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), 0xff); +} + + +static void m68k_op_st_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), 0xff); +} + + +static void m68k_op_sf_8_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sf_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), 0); +} + + +static void m68k_op_sf_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), 0); +} + + +static void m68k_op_shi_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_HI(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sls_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_scc_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_CC(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_scs_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_CS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sne_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_NE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_seq_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_EQ(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_svc_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_svs_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_VS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_spl_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_PL(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_smi_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_MI(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sge_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_GE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_slt_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LT(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sgt_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_GT(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_sle_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->c.current_cycle += (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +static void m68k_op_shi_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_shi_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sls_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scc_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_scs_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sne_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_seq_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svc_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_svs_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_spl_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_smi_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sge_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_slt_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sgt_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_sle_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +static void m68k_op_stop(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + uint32_t new_sr = OPER_I_16(mc68kcpu); + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + (mc68kcpu)->stopped |= STOP_LEVEL_STOP; + m68ki_set_sr((mc68kcpu), new_sr); + (mc68kcpu)->c.current_cycle = (mc68kcpu)->c.target_cycle; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +static void m68k_op_sub_8_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_A7_PI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_16_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = AY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_AI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_DI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AY_IX_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AW_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_AL_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCDI_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_PCIX_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_32_er_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_sub_8_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_8_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_16_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_sub_32_re_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t src = DX(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_suba_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY(mc68kcpu))); +} + + +static void m68k_op_suba_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY(mc68kcpu))); +} + + +static void m68k_op_suba_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_16_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY(mc68kcpu)); +} + + +static void m68k_op_suba_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY(mc68kcpu)); +} + + +static void m68k_op_suba_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_AI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_PI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_PD_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_DI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AY_IX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AW_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_AL_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pcdi(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_PCDI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_pcix(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_PCIX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_suba_32_i(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AX(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +static void m68k_op_subi_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subi_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_8(mc68kcpu); + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subi_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_16(mc68kcpu); + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subi_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subi_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_I_32(mc68kcpu); + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subq_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + m68ki_write_8((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subq_16_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - (((((mc68kcpu)->ir >> 9) - 1) & 7) + 1)); +} + + +static void m68k_op_subq_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + m68ki_write_16((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t dst = *r_dst; + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + *r_dst = (mc68kcpu)->not_z_flag; +} + + +static void m68k_op_subq_32_a(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - (((((mc68kcpu)->ir >> 9) - 1) & 7) + 1)); +} + + +static void m68k_op_subq_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_AI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_DI_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AY_IX_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AW_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subq_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + uint32_t ea = EA_AL_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src; + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + m68ki_write_32((mc68kcpu), ea, (mc68kcpu)->not_z_flag); +} + + +static void m68k_op_subx_8_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_8(*r_dst); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; +} + + +static void m68k_op_subx_16_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + uint32_t dst = MASK_OUT_ABOVE_16(*r_dst); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; +} + + +static void m68k_op_subx_32_rr(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DX(mc68kcpu); + uint32_t src = DY(mc68kcpu); + uint32_t dst = *r_dst; + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + *r_dst = res; +} + + +static void m68k_op_subx_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_subx_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_subx_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_subx_8_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea = EA_AX_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_8(res); + (mc68kcpu)->v_flag = VFLAG_SUB_8(src, dst, res); + + res = MASK_OUT_ABOVE_8(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_8((mc68kcpu), ea, res); +} + + +static void m68k_op_subx_16_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_16(mc68kcpu); + uint32_t ea = EA_AX_PD_16(mc68kcpu); + uint32_t dst = m68ki_read_16((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_16(res); + (mc68kcpu)->v_flag = VFLAG_SUB_16(src, dst, res); + + res = MASK_OUT_ABOVE_16(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_16((mc68kcpu), ea, res); +} + + +static void m68k_op_subx_32_mm(m68000_base_device* mc68kcpu) +{ + uint32_t src = OPER_AY_PD_32(mc68kcpu); + uint32_t ea = EA_AX_PD_32(mc68kcpu); + uint32_t dst = m68ki_read_32((mc68kcpu), ea); + uint32_t res = dst - src - XFLAG_AS_1(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->x_flag = (mc68kcpu)->c_flag = CFLAG_SUB_32(src, dst, res); + (mc68kcpu)->v_flag = VFLAG_SUB_32(src, dst, res); + + res = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->not_z_flag |= res; + + m68ki_write_32((mc68kcpu), ea, res); +} + + +static void m68k_op_swap_32(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(*r_dst<<16); + *r_dst = (*r_dst>>16) | (mc68kcpu)->not_z_flag; + + (mc68kcpu)->not_z_flag = *r_dst; + (mc68kcpu)->n_flag = NFLAG_32(*r_dst); + (mc68kcpu)->c_flag = CFLAG_CLEAR; + (mc68kcpu)->v_flag = VFLAG_CLEAR; +} + + +static void m68k_op_tas_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &DY(mc68kcpu); + + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_8(*r_dst); + (mc68kcpu)->n_flag = NFLAG_8(*r_dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + *r_dst |= 0x80; +} + + +static void m68k_op_tas_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_AI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ +/* if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_A7_PD_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_DI_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AY_IX_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AW_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_tas_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t ea = EA_AL_8(mc68kcpu); + uint32_t dst = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = dst; + (mc68kcpu)->n_flag = NFLAG_8(dst); + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + /* On the 68000 and 68010, the TAS instruction uses a unique bus cycle that may have + side effects (e.g. delaying DMA) or may fail to write back at all depending on the + bus implementation. + In particular, the Genesis/Megadrive games Gargoyles and Ex-Mutants need the TAS + to fail to write back in order to function properly. */ + /*if (CPU_TYPE_IS_010_LESS((mc68kcpu)->cpu_type) && !(mc68kcpu)->tas_write_callback.isnull()) + ((mc68kcpu)->tas_write_callback)(*(mc68kcpu)->program, ea, dst | 0x80, 0xff); + else + m68ki_write_8((mc68kcpu), ea, dst | 0x80);*/ +} + + +static void m68k_op_trap(m68000_base_device* mc68kcpu) +{ + /* Trap#n stacks exception frame type 0 */ + m68ki_exception_trapN((mc68kcpu), EXCEPTION_TRAP_BASE + ((mc68kcpu)->ir & 0xf)); /* HJB 990403 */ +} + + +static void m68k_op_trapt(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapt_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapf(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapf_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapf_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traphi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_HI(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapls(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LS(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcc(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CC(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcs(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CS(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapne(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_NE(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapeq(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_EQ(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvc(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VC(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvs(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VS(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trappl(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_PL(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapmi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_MI(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapge(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GE(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traplt(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LT(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapgt(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GT(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traple(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LE(mc68kcpu)) + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traphi_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_HI(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapls_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcc_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CC(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcs_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapne_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_NE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapeq_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_EQ(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvc_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VC(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvs_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trappl_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_PL(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapmi_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_MI(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapge_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traplt_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LT(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapgt_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GT(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traple_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 2; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traphi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_HI(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapls_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CC(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapcs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapne_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_NE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapeq_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_EQ(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VC(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapvs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VS(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trappl_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_PL(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapmi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_MI(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapge_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traplt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LT(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapgt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GT(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_traple_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LE(mc68kcpu)) + { + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ + return; + } + REG_PC(mc68kcpu) += 4; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_trapv(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ +} + + +static void m68k_op_tst_8_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pi7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PI_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pd7(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_A7_PD_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_8_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCDI_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_8_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCIX_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_8_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_I_8(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_8(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_16_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_a(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = MAKE_INT_16(AY(mc68kcpu)); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_16_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_16_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCDI_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_16_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCIX_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_16_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_I_16(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_16(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_32_d(m68000_base_device* mc68kcpu) +{ + uint32_t res = DY(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_a(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = AY(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_32_ai(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_AI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pi(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pd(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_PD_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_di(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_DI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_ix(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AY_IX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_aw(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AW_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_al(m68000_base_device* mc68kcpu) +{ + uint32_t res = OPER_AL_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +static void m68k_op_tst_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCDI_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_PCIX_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_tst_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t res = OPER_I_32(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_unlk_32_a7(m68000_base_device* mc68kcpu) +{ + REG_A(mc68kcpu)[7] = m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[7]); +} + + +static void m68k_op_unlk_32(m68000_base_device* mc68kcpu) +{ + uint32_t* r_dst = &AY(mc68kcpu); + + REG_A(mc68kcpu)[7] = *r_dst; + *r_dst = m68ki_pull_32(mc68kcpu); +} + + +static void m68k_op_unpk_16_rr(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: DX(mc68kcpu) and DY(mc68kcpu) are reversed in Motorola's docs */ + uint32_t src = DY(mc68kcpu); + uint32_t* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(mc68kcpu)) & 0xffff); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_unpk_16_mm_ax7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(mc68kcpu); + ea_dst = EA_A7_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, src & 0xff); + ea_dst = EA_A7_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, (src >> 8) & 0xff); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_unpk_16_mm_ay7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(mc68kcpu); + ea_dst = EA_AX_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, src & 0xff); + ea_dst = EA_AX_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, (src >> 8) & 0xff); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_unpk_16_mm_axy7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + uint32_t src = OPER_A7_PD_8(mc68kcpu); + uint32_t ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(mc68kcpu); + ea_dst = EA_A7_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, src & 0xff); + ea_dst = EA_A7_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, (src >> 8) & 0xff); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_unpk_16_mm(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* Note: AX and AY are reversed in Motorola's docs */ + uint32_t src = OPER_AY_PD_8(mc68kcpu); + uint32_t ea_dst; + + src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16(mc68kcpu); + ea_dst = EA_AX_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, src & 0xff); + ea_dst = EA_AX_PD_8(mc68kcpu); + m68ki_write_8((mc68kcpu), ea_dst, (src >> 8) & 0xff); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +static void m68k_op_cinv_32(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +static void m68k_op_cpush_32(m68000_base_device* mc68kcpu) +{ + + m68ki_exception_1111(mc68kcpu); +} + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + + +/* ======================================================================== */ +/* ========================= OPCODE TABLE BUILDER ========================= */ +/* ======================================================================== */ + +#include "m68kops.h" + +#define NUM_CPU_TYPES 7 + +void (*m68ki_instruction_jump_table[NUM_CPU_TYPES][0x10000])(m68000_base_device *m68k); /* 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)(m68000_base_device *m68k); /* 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 const opcode_handler_struct m68k_opcode_handler_table[] = +{ +/* function mask match 000 010 020 040 */ + + + {m68k_op_1010, 0xf000, 0xa000, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_1111, 0xf000, 0xf000, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_moveq_32, 0xf100, 0x7000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cpbcc_32, 0xf180, 0xf080, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_cpgen_32, 0xf1c0, 0xf000, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_cpscc_32, 0xf1c0, 0xf040, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_pmmu_32, 0xfe00, 0xf000, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_bra_8, 0xff00, 0x6000, { 10, 10, 10, 10, 10, 10, 10}}, + {m68k_op_bsr_8, 0xff00, 0x6100, { 18, 18, 7, 7, 7, 7, 7}}, + {m68k_op_bhi_8, 0xff00, 0x6200, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bls_8, 0xff00, 0x6300, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcc_8, 0xff00, 0x6400, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcs_8, 0xff00, 0x6500, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bne_8, 0xff00, 0x6600, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_beq_8, 0xff00, 0x6700, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvc_8, 0xff00, 0x6800, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvs_8, 0xff00, 0x6900, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bpl_8, 0xff00, 0x6a00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bmi_8, 0xff00, 0x6b00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bge_8, 0xff00, 0x6c00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_blt_8, 0xff00, 0x6d00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bgt_8, 0xff00, 0x6e00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_ble_8, 0xff00, 0x6f00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_040fpu0_32, 0xff00, 0xf200, {255, 255, 0, 0, 0, 0, 255}}, + {m68k_op_040fpu1_32, 0xff00, 0xf300, {255, 255, 0, 0, 0, 0, 255}}, + {m68k_op_cinv_32, 0xff20, 0xf400, {255, 255, 255, 255, 16, 255, 255}}, + {m68k_op_cpush_32, 0xff20, 0xf420, {255, 255, 255, 255, 16, 255, 255}}, + {m68k_op_btst_32_r_d, 0xf1f8, 0x0100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_movep_16_er, 0xf1f8, 0x0108, { 16, 16, 12, 12, 12, 12, 12}}, + {m68k_op_btst_8_r_ai, 0xf1f8, 0x0110, { 8, 8, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_r_pi, 0xf1f8, 0x0118, { 8, 8, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_r_pd, 0xf1f8, 0x0120, { 10, 10, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_r_di, 0xf1f8, 0x0128, { 12, 12, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_r_ix, 0xf1f8, 0x0130, { 14, 14, 11, 11, 11, 11, 4}}, + {m68k_op_bchg_32_r_d, 0xf1f8, 0x0140, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_movep_32_er, 0xf1f8, 0x0148, { 24, 24, 18, 18, 18, 18, 18}}, + {m68k_op_bchg_8_r_ai, 0xf1f8, 0x0150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_r_pi, 0xf1f8, 0x0158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_r_pd, 0xf1f8, 0x0160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_r_di, 0xf1f8, 0x0168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_r_ix, 0xf1f8, 0x0170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_bclr_32_r_d, 0xf1f8, 0x0180, { 10, 10, 4, 4, 4, 4, 4}}, + {m68k_op_movep_16_re, 0xf1f8, 0x0188, { 16, 16, 11, 11, 11, 11, 11}}, + {m68k_op_bclr_8_r_ai, 0xf1f8, 0x0190, { 12, 14, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_r_pi, 0xf1f8, 0x0198, { 12, 14, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_r_pd, 0xf1f8, 0x01a0, { 14, 16, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_r_di, 0xf1f8, 0x01a8, { 16, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_r_ix, 0xf1f8, 0x01b0, { 18, 20, 11, 11, 11, 11, 4}}, + {m68k_op_bset_32_r_d, 0xf1f8, 0x01c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_movep_32_re, 0xf1f8, 0x01c8, { 24, 24, 17, 17, 17, 17, 17}}, + {m68k_op_bset_8_r_ai, 0xf1f8, 0x01d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_r_pi, 0xf1f8, 0x01d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_r_pd, 0xf1f8, 0x01e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_r_di, 0xf1f8, 0x01e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_r_ix, 0xf1f8, 0x01f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_d_d, 0xf1f8, 0x1000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_move_8_d_ai, 0xf1f8, 0x1010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_move_8_d_pi, 0xf1f8, 0x1018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_move_8_d_pd, 0xf1f8, 0x1020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_move_8_d_di, 0xf1f8, 0x1028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_move_8_d_ix, 0xf1f8, 0x1030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_move_8_ai_d, 0xf1f8, 0x1080, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_8_ai_ai, 0xf1f8, 0x1090, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_ai_pi, 0xf1f8, 0x1098, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_ai_pd, 0xf1f8, 0x10a0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_ai_di, 0xf1f8, 0x10a8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_ai_ix, 0xf1f8, 0x10b0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_pi_d, 0xf1f8, 0x10c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_8_pi_ai, 0xf1f8, 0x10d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi_pi, 0xf1f8, 0x10d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi_pd, 0xf1f8, 0x10e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi_di, 0xf1f8, 0x10e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi_ix, 0xf1f8, 0x10f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_pd_d, 0xf1f8, 0x1100, { 8, 8, 5, 5, 5, 5, 5}}, + {m68k_op_move_8_pd_ai, 0xf1f8, 0x1110, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd_pi, 0xf1f8, 0x1118, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd_pd, 0xf1f8, 0x1120, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd_di, 0xf1f8, 0x1128, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd_ix, 0xf1f8, 0x1130, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_8_di_d, 0xf1f8, 0x1140, { 12, 12, 5, 5, 5, 5, 5}}, + {m68k_op_move_8_di_ai, 0xf1f8, 0x1150, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_di_pi, 0xf1f8, 0x1158, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_di_pd, 0xf1f8, 0x1160, { 18, 18, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_di_di, 0xf1f8, 0x1168, { 20, 20, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_di_ix, 0xf1f8, 0x1170, { 22, 22, 12, 12, 12, 12, 5}}, + {m68k_op_move_8_ix_d, 0xf1f8, 0x1180, { 14, 14, 7, 7, 7, 7, 7}}, + {m68k_op_move_8_ix_ai, 0xf1f8, 0x1190, { 18, 18, 11, 11, 11, 11, 7}}, + {m68k_op_move_8_ix_pi, 0xf1f8, 0x1198, { 18, 18, 11, 11, 11, 11, 7}}, + {m68k_op_move_8_ix_pd, 0xf1f8, 0x11a0, { 20, 20, 12, 12, 12, 12, 7}}, + {m68k_op_move_8_ix_di, 0xf1f8, 0x11a8, { 22, 22, 12, 12, 12, 12, 7}}, + {m68k_op_move_8_ix_ix, 0xf1f8, 0x11b0, { 24, 24, 14, 14, 14, 14, 7}}, + {m68k_op_move_32_d_d, 0xf1f8, 0x2000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_move_32_d_a, 0xf1f8, 0x2008, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_move_32_d_ai, 0xf1f8, 0x2010, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_move_32_d_pi, 0xf1f8, 0x2018, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_move_32_d_pd, 0xf1f8, 0x2020, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_move_32_d_di, 0xf1f8, 0x2028, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_move_32_d_ix, 0xf1f8, 0x2030, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_movea_32_d, 0xf1f8, 0x2040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_movea_32_a, 0xf1f8, 0x2048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_movea_32_ai, 0xf1f8, 0x2050, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_movea_32_pi, 0xf1f8, 0x2058, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_movea_32_pd, 0xf1f8, 0x2060, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_movea_32_di, 0xf1f8, 0x2068, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_movea_32_ix, 0xf1f8, 0x2070, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_move_32_ai_d, 0xf1f8, 0x2080, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_ai_a, 0xf1f8, 0x2088, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_ai_ai, 0xf1f8, 0x2090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_ai_pi, 0xf1f8, 0x2098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_ai_pd, 0xf1f8, 0x20a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_ai_di, 0xf1f8, 0x20a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_ai_ix, 0xf1f8, 0x20b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_pi_d, 0xf1f8, 0x20c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_pi_a, 0xf1f8, 0x20c8, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_pi_ai, 0xf1f8, 0x20d0, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pi_pi, 0xf1f8, 0x20d8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pi_pd, 0xf1f8, 0x20e0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_pi_di, 0xf1f8, 0x20e8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_pi_ix, 0xf1f8, 0x20f0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_pd_d, 0xf1f8, 0x2100, { 12, 14, 5, 5, 5, 5, 5}}, + {m68k_op_move_32_pd_a, 0xf1f8, 0x2108, { 12, 14, 5, 5, 5, 5, 5}}, + {m68k_op_move_32_pd_ai, 0xf1f8, 0x2110, { 20, 22, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_pd_pi, 0xf1f8, 0x2118, { 20, 22, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_pd_pd, 0xf1f8, 0x2120, { 22, 24, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_pd_di, 0xf1f8, 0x2128, { 24, 26, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_pd_ix, 0xf1f8, 0x2130, { 26, 28, 12, 12, 12, 12, 5}}, + {m68k_op_move_32_di_d, 0xf1f8, 0x2140, { 16, 16, 5, 5, 5, 5, 5}}, + {m68k_op_move_32_di_a, 0xf1f8, 0x2148, { 16, 16, 5, 5, 5, 5, 5}}, + {m68k_op_move_32_di_ai, 0xf1f8, 0x2150, { 24, 24, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_di_pi, 0xf1f8, 0x2158, { 24, 24, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_di_pd, 0xf1f8, 0x2160, { 26, 26, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_di_di, 0xf1f8, 0x2168, { 28, 28, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_di_ix, 0xf1f8, 0x2170, { 30, 30, 12, 12, 12, 12, 5}}, + {m68k_op_move_32_ix_d, 0xf1f8, 0x2180, { 18, 18, 7, 7, 7, 7, 7}}, + {m68k_op_move_32_ix_a, 0xf1f8, 0x2188, { 18, 18, 7, 7, 7, 7, 7}}, + {m68k_op_move_32_ix_ai, 0xf1f8, 0x2190, { 26, 26, 11, 11, 11, 11, 7}}, + {m68k_op_move_32_ix_pi, 0xf1f8, 0x2198, { 26, 26, 11, 11, 11, 11, 7}}, + {m68k_op_move_32_ix_pd, 0xf1f8, 0x21a0, { 28, 28, 12, 12, 12, 12, 7}}, + {m68k_op_move_32_ix_di, 0xf1f8, 0x21a8, { 30, 30, 12, 12, 12, 12, 7}}, + {m68k_op_move_32_ix_ix, 0xf1f8, 0x21b0, { 32, 32, 14, 14, 14, 14, 7}}, + {m68k_op_move_16_d_d, 0xf1f8, 0x3000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_move_16_d_a, 0xf1f8, 0x3008, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_move_16_d_ai, 0xf1f8, 0x3010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_move_16_d_pi, 0xf1f8, 0x3018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_move_16_d_pd, 0xf1f8, 0x3020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_move_16_d_di, 0xf1f8, 0x3028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_move_16_d_ix, 0xf1f8, 0x3030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_movea_16_d, 0xf1f8, 0x3040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_movea_16_a, 0xf1f8, 0x3048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_movea_16_ai, 0xf1f8, 0x3050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_movea_16_pi, 0xf1f8, 0x3058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_movea_16_pd, 0xf1f8, 0x3060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_movea_16_di, 0xf1f8, 0x3068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_movea_16_ix, 0xf1f8, 0x3070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_move_16_ai_d, 0xf1f8, 0x3080, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_ai_a, 0xf1f8, 0x3088, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_ai_ai, 0xf1f8, 0x3090, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_ai_pi, 0xf1f8, 0x3098, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_ai_pd, 0xf1f8, 0x30a0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_ai_di, 0xf1f8, 0x30a8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_ai_ix, 0xf1f8, 0x30b0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_pi_d, 0xf1f8, 0x30c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_pi_a, 0xf1f8, 0x30c8, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_pi_ai, 0xf1f8, 0x30d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_pi_pi, 0xf1f8, 0x30d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_pi_pd, 0xf1f8, 0x30e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_pi_di, 0xf1f8, 0x30e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_pi_ix, 0xf1f8, 0x30f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_pd_d, 0xf1f8, 0x3100, { 8, 8, 5, 5, 5, 5, 5}}, + {m68k_op_move_16_pd_a, 0xf1f8, 0x3108, { 8, 8, 5, 5, 5, 5, 5}}, + {m68k_op_move_16_pd_ai, 0xf1f8, 0x3110, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_pd_pi, 0xf1f8, 0x3118, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_pd_pd, 0xf1f8, 0x3120, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_pd_di, 0xf1f8, 0x3128, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_pd_ix, 0xf1f8, 0x3130, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_16_di_d, 0xf1f8, 0x3140, { 12, 12, 5, 5, 5, 5, 5}}, + {m68k_op_move_16_di_a, 0xf1f8, 0x3148, { 12, 12, 5, 5, 5, 5, 5}}, + {m68k_op_move_16_di_ai, 0xf1f8, 0x3150, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_di_pi, 0xf1f8, 0x3158, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_di_pd, 0xf1f8, 0x3160, { 18, 18, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_di_di, 0xf1f8, 0x3168, { 20, 20, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_di_ix, 0xf1f8, 0x3170, { 22, 22, 12, 12, 12, 12, 5}}, + {m68k_op_move_16_ix_d, 0xf1f8, 0x3180, { 14, 14, 7, 7, 7, 7, 7}}, + {m68k_op_move_16_ix_a, 0xf1f8, 0x3188, { 14, 14, 7, 7, 7, 7, 7}}, + {m68k_op_move_16_ix_ai, 0xf1f8, 0x3190, { 18, 18, 11, 11, 11, 11, 7}}, + {m68k_op_move_16_ix_pi, 0xf1f8, 0x3198, { 18, 18, 11, 11, 11, 11, 7}}, + {m68k_op_move_16_ix_pd, 0xf1f8, 0x31a0, { 20, 20, 12, 12, 12, 12, 7}}, + {m68k_op_move_16_ix_di, 0xf1f8, 0x31a8, { 22, 22, 12, 12, 12, 12, 7}}, + {m68k_op_move_16_ix_ix, 0xf1f8, 0x31b0, { 24, 24, 14, 14, 14, 14, 7}}, + {m68k_op_chk_32_d, 0xf1f8, 0x4100, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_chk_32_ai, 0xf1f8, 0x4110, {255, 255, 12, 12, 12, 12, 8}}, + {m68k_op_chk_32_pi, 0xf1f8, 0x4118, {255, 255, 12, 12, 12, 12, 8}}, + {m68k_op_chk_32_pd, 0xf1f8, 0x4120, {255, 255, 13, 13, 13, 13, 8}}, + {m68k_op_chk_32_di, 0xf1f8, 0x4128, {255, 255, 13, 13, 13, 13, 8}}, + {m68k_op_chk_32_ix, 0xf1f8, 0x4130, {255, 255, 15, 15, 15, 15, 8}}, + {m68k_op_chk_16_d, 0xf1f8, 0x4180, { 10, 8, 8, 8, 8, 8, 8}}, + {m68k_op_chk_16_ai, 0xf1f8, 0x4190, { 14, 12, 12, 12, 12, 12, 8}}, + {m68k_op_chk_16_pi, 0xf1f8, 0x4198, { 14, 12, 12, 12, 12, 12, 8}}, + {m68k_op_chk_16_pd, 0xf1f8, 0x41a0, { 16, 14, 13, 13, 13, 13, 8}}, + {m68k_op_chk_16_di, 0xf1f8, 0x41a8, { 18, 16, 13, 13, 13, 13, 8}}, + {m68k_op_chk_16_ix, 0xf1f8, 0x41b0, { 20, 18, 15, 15, 15, 15, 8}}, + {m68k_op_lea_32_ai, 0xf1f8, 0x41d0, { 4, 4, 6, 6, 6, 6, 2}}, + {m68k_op_lea_32_di, 0xf1f8, 0x41e8, { 8, 8, 7, 7, 7, 7, 2}}, + {m68k_op_lea_32_ix, 0xf1f8, 0x41f0, { 12, 12, 9, 9, 9, 9, 2}}, + {m68k_op_addq_8_d, 0xf1f8, 0x5000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_addq_8_ai, 0xf1f8, 0x5010, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_addq_8_pi, 0xf1f8, 0x5018, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_addq_8_pd, 0xf1f8, 0x5020, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_addq_8_di, 0xf1f8, 0x5028, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_addq_8_ix, 0xf1f8, 0x5030, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_addq_16_d, 0xf1f8, 0x5040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_addq_16_a, 0xf1f8, 0x5048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_addq_16_ai, 0xf1f8, 0x5050, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_addq_16_pi, 0xf1f8, 0x5058, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_addq_16_pd, 0xf1f8, 0x5060, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_addq_16_di, 0xf1f8, 0x5068, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_addq_16_ix, 0xf1f8, 0x5070, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_addq_32_d, 0xf1f8, 0x5080, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_addq_32_a, 0xf1f8, 0x5088, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_addq_32_ai, 0xf1f8, 0x5090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addq_32_pi, 0xf1f8, 0x5098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addq_32_pd, 0xf1f8, 0x50a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_addq_32_di, 0xf1f8, 0x50a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_addq_32_ix, 0xf1f8, 0x50b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_subq_8_d, 0xf1f8, 0x5100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_subq_8_ai, 0xf1f8, 0x5110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_subq_8_pi, 0xf1f8, 0x5118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_subq_8_pd, 0xf1f8, 0x5120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_subq_8_di, 0xf1f8, 0x5128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_subq_8_ix, 0xf1f8, 0x5130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_subq_16_d, 0xf1f8, 0x5140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_subq_16_a, 0xf1f8, 0x5148, { 8, 4, 2, 2, 2, 2, 2}}, + {m68k_op_subq_16_ai, 0xf1f8, 0x5150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_subq_16_pi, 0xf1f8, 0x5158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_subq_16_pd, 0xf1f8, 0x5160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_subq_16_di, 0xf1f8, 0x5168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_subq_16_ix, 0xf1f8, 0x5170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_subq_32_d, 0xf1f8, 0x5180, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_subq_32_a, 0xf1f8, 0x5188, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_subq_32_ai, 0xf1f8, 0x5190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subq_32_pi, 0xf1f8, 0x5198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subq_32_pd, 0xf1f8, 0x51a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_subq_32_di, 0xf1f8, 0x51a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_subq_32_ix, 0xf1f8, 0x51b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_or_8_er_d, 0xf1f8, 0x8000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_or_8_er_ai, 0xf1f8, 0x8010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_or_8_er_pi, 0xf1f8, 0x8018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_or_8_er_pd, 0xf1f8, 0x8020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_or_8_er_di, 0xf1f8, 0x8028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_or_8_er_ix, 0xf1f8, 0x8030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_or_16_er_d, 0xf1f8, 0x8040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_or_16_er_ai, 0xf1f8, 0x8050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_or_16_er_pi, 0xf1f8, 0x8058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_or_16_er_pd, 0xf1f8, 0x8060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_or_16_er_di, 0xf1f8, 0x8068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_or_16_er_ix, 0xf1f8, 0x8070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_or_32_er_d, 0xf1f8, 0x8080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_or_32_er_ai, 0xf1f8, 0x8090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_or_32_er_pi, 0xf1f8, 0x8098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_or_32_er_pd, 0xf1f8, 0x80a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_or_32_er_di, 0xf1f8, 0x80a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_or_32_er_ix, 0xf1f8, 0x80b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_divu_16_d, 0xf1f8, 0x80c0, {140, 108, 44, 44, 44, 44, 44}}, + {m68k_op_divu_16_ai, 0xf1f8, 0x80d0, {144, 112, 48, 48, 48, 48, 44}}, + {m68k_op_divu_16_pi, 0xf1f8, 0x80d8, {144, 112, 48, 48, 48, 48, 44}}, + {m68k_op_divu_16_pd, 0xf1f8, 0x80e0, {146, 114, 49, 49, 49, 49, 44}}, + {m68k_op_divu_16_di, 0xf1f8, 0x80e8, {148, 116, 49, 49, 49, 49, 44}}, + {m68k_op_divu_16_ix, 0xf1f8, 0x80f0, {150, 118, 51, 51, 51, 51, 44}}, + {m68k_op_sbcd_8_rr, 0xf1f8, 0x8100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_sbcd_8_mm, 0xf1f8, 0x8108, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_or_8_re_ai, 0xf1f8, 0x8110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_or_8_re_pi, 0xf1f8, 0x8118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_or_8_re_pd, 0xf1f8, 0x8120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_or_8_re_di, 0xf1f8, 0x8128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_or_8_re_ix, 0xf1f8, 0x8130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_pack_16_rr, 0xf1f8, 0x8140, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_pack_16_mm, 0xf1f8, 0x8148, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_or_16_re_ai, 0xf1f8, 0x8150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_or_16_re_pi, 0xf1f8, 0x8158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_or_16_re_pd, 0xf1f8, 0x8160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_or_16_re_di, 0xf1f8, 0x8168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_or_16_re_ix, 0xf1f8, 0x8170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_unpk_16_rr, 0xf1f8, 0x8180, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_unpk_16_mm, 0xf1f8, 0x8188, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_or_32_re_ai, 0xf1f8, 0x8190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_or_32_re_pi, 0xf1f8, 0x8198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_or_32_re_pd, 0xf1f8, 0x81a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_or_32_re_di, 0xf1f8, 0x81a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_or_32_re_ix, 0xf1f8, 0x81b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_divs_16_d, 0xf1f8, 0x81c0, {158, 122, 56, 56, 56, 56, 56}}, + {m68k_op_divs_16_ai, 0xf1f8, 0x81d0, {162, 126, 60, 60, 60, 60, 56}}, + {m68k_op_divs_16_pi, 0xf1f8, 0x81d8, {162, 126, 60, 60, 60, 60, 56}}, + {m68k_op_divs_16_pd, 0xf1f8, 0x81e0, {164, 128, 61, 61, 61, 61, 56}}, + {m68k_op_divs_16_di, 0xf1f8, 0x81e8, {166, 130, 61, 61, 61, 61, 56}}, + {m68k_op_divs_16_ix, 0xf1f8, 0x81f0, {168, 132, 63, 63, 63, 63, 56}}, + {m68k_op_sub_8_er_d, 0xf1f8, 0x9000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_sub_8_er_ai, 0xf1f8, 0x9010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_sub_8_er_pi, 0xf1f8, 0x9018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_sub_8_er_pd, 0xf1f8, 0x9020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_sub_8_er_di, 0xf1f8, 0x9028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_sub_8_er_ix, 0xf1f8, 0x9030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_sub_16_er_d, 0xf1f8, 0x9040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_sub_16_er_a, 0xf1f8, 0x9048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_sub_16_er_ai, 0xf1f8, 0x9050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_sub_16_er_pi, 0xf1f8, 0x9058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_sub_16_er_pd, 0xf1f8, 0x9060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_sub_16_er_di, 0xf1f8, 0x9068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_sub_16_er_ix, 0xf1f8, 0x9070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_sub_32_er_d, 0xf1f8, 0x9080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_sub_32_er_a, 0xf1f8, 0x9088, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_sub_32_er_ai, 0xf1f8, 0x9090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_sub_32_er_pi, 0xf1f8, 0x9098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_sub_32_er_pd, 0xf1f8, 0x90a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_sub_32_er_di, 0xf1f8, 0x90a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_sub_32_er_ix, 0xf1f8, 0x90b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_suba_16_d, 0xf1f8, 0x90c0, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_suba_16_a, 0xf1f8, 0x90c8, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_suba_16_ai, 0xf1f8, 0x90d0, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_suba_16_pi, 0xf1f8, 0x90d8, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_suba_16_pd, 0xf1f8, 0x90e0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_suba_16_di, 0xf1f8, 0x90e8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_suba_16_ix, 0xf1f8, 0x90f0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_subx_8_rr, 0xf1f8, 0x9100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_subx_8_mm, 0xf1f8, 0x9108, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_sub_8_re_ai, 0xf1f8, 0x9110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_sub_8_re_pi, 0xf1f8, 0x9118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_sub_8_re_pd, 0xf1f8, 0x9120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_sub_8_re_di, 0xf1f8, 0x9128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_sub_8_re_ix, 0xf1f8, 0x9130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_subx_16_rr, 0xf1f8, 0x9140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_subx_16_mm, 0xf1f8, 0x9148, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_sub_16_re_ai, 0xf1f8, 0x9150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_sub_16_re_pi, 0xf1f8, 0x9158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_sub_16_re_pd, 0xf1f8, 0x9160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_sub_16_re_di, 0xf1f8, 0x9168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_sub_16_re_ix, 0xf1f8, 0x9170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_subx_32_rr, 0xf1f8, 0x9180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_subx_32_mm, 0xf1f8, 0x9188, { 30, 30, 12, 12, 12, 12, 12}}, + {m68k_op_sub_32_re_ai, 0xf1f8, 0x9190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_sub_32_re_pi, 0xf1f8, 0x9198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_sub_32_re_pd, 0xf1f8, 0x91a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_sub_32_re_di, 0xf1f8, 0x91a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_sub_32_re_ix, 0xf1f8, 0x91b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_suba_32_d, 0xf1f8, 0x91c0, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_suba_32_a, 0xf1f8, 0x91c8, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_suba_32_ai, 0xf1f8, 0x91d0, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_suba_32_pi, 0xf1f8, 0x91d8, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_suba_32_pd, 0xf1f8, 0x91e0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_suba_32_di, 0xf1f8, 0x91e8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_suba_32_ix, 0xf1f8, 0x91f0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_8_d, 0xf1f8, 0xb000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cmp_8_ai, 0xf1f8, 0xb010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_pi, 0xf1f8, 0xb018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_pd, 0xf1f8, 0xb020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_8_di, 0xf1f8, 0xb028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_8_ix, 0xf1f8, 0xb030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_16_d, 0xf1f8, 0xb040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cmp_16_a, 0xf1f8, 0xb048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cmp_16_ai, 0xf1f8, 0xb050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_16_pi, 0xf1f8, 0xb058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_16_pd, 0xf1f8, 0xb060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_16_di, 0xf1f8, 0xb068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_16_ix, 0xf1f8, 0xb070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_32_d, 0xf1f8, 0xb080, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_cmp_32_a, 0xf1f8, 0xb088, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_cmp_32_ai, 0xf1f8, 0xb090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_32_pi, 0xf1f8, 0xb098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_32_pd, 0xf1f8, 0xb0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_32_di, 0xf1f8, 0xb0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_32_ix, 0xf1f8, 0xb0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_cmpa_16_d, 0xf1f8, 0xb0c0, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_cmpa_16_a, 0xf1f8, 0xb0c8, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_cmpa_16_ai, 0xf1f8, 0xb0d0, { 10, 10, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_16_pi, 0xf1f8, 0xb0d8, { 10, 10, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_16_pd, 0xf1f8, 0xb0e0, { 12, 12, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_16_di, 0xf1f8, 0xb0e8, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_16_ix, 0xf1f8, 0xb0f0, { 16, 16, 11, 11, 11, 11, 4}}, + {m68k_op_eor_8_d, 0xf1f8, 0xb100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cmpm_8, 0xf1f8, 0xb108, { 12, 12, 9, 9, 9, 9, 9}}, + {m68k_op_eor_8_ai, 0xf1f8, 0xb110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_eor_8_pi, 0xf1f8, 0xb118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_eor_8_pd, 0xf1f8, 0xb120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_eor_8_di, 0xf1f8, 0xb128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_eor_8_ix, 0xf1f8, 0xb130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_eor_16_d, 0xf1f8, 0xb140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_cmpm_16, 0xf1f8, 0xb148, { 12, 12, 9, 9, 9, 9, 9}}, + {m68k_op_eor_16_ai, 0xf1f8, 0xb150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_eor_16_pi, 0xf1f8, 0xb158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_eor_16_pd, 0xf1f8, 0xb160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_eor_16_di, 0xf1f8, 0xb168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_eor_16_ix, 0xf1f8, 0xb170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_eor_32_d, 0xf1f8, 0xb180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_cmpm_32, 0xf1f8, 0xb188, { 20, 20, 9, 9, 9, 9, 9}}, + {m68k_op_eor_32_ai, 0xf1f8, 0xb190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eor_32_pi, 0xf1f8, 0xb198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eor_32_pd, 0xf1f8, 0xb1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_eor_32_di, 0xf1f8, 0xb1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_eor_32_ix, 0xf1f8, 0xb1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_cmpa_32_d, 0xf1f8, 0xb1c0, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_cmpa_32_a, 0xf1f8, 0xb1c8, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_cmpa_32_ai, 0xf1f8, 0xb1d0, { 14, 14, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_32_pi, 0xf1f8, 0xb1d8, { 14, 14, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_32_pd, 0xf1f8, 0xb1e0, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_32_di, 0xf1f8, 0xb1e8, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_32_ix, 0xf1f8, 0xb1f0, { 20, 20, 11, 11, 11, 11, 4}}, + {m68k_op_and_8_er_d, 0xf1f8, 0xc000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_and_8_er_ai, 0xf1f8, 0xc010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_and_8_er_pi, 0xf1f8, 0xc018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_and_8_er_pd, 0xf1f8, 0xc020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_and_8_er_di, 0xf1f8, 0xc028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_and_8_er_ix, 0xf1f8, 0xc030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_and_16_er_d, 0xf1f8, 0xc040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_and_16_er_ai, 0xf1f8, 0xc050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_and_16_er_pi, 0xf1f8, 0xc058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_and_16_er_pd, 0xf1f8, 0xc060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_and_16_er_di, 0xf1f8, 0xc068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_and_16_er_ix, 0xf1f8, 0xc070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_and_32_er_d, 0xf1f8, 0xc080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_and_32_er_ai, 0xf1f8, 0xc090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_and_32_er_pi, 0xf1f8, 0xc098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_and_32_er_pd, 0xf1f8, 0xc0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_and_32_er_di, 0xf1f8, 0xc0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_and_32_er_ix, 0xf1f8, 0xc0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_mulu_16_d, 0xf1f8, 0xc0c0, { 54, 30, 27, 27, 27, 27, 27}}, + {m68k_op_mulu_16_ai, 0xf1f8, 0xc0d0, { 58, 34, 31, 31, 31, 31, 27}}, + {m68k_op_mulu_16_pi, 0xf1f8, 0xc0d8, { 58, 34, 31, 31, 31, 31, 27}}, + {m68k_op_mulu_16_pd, 0xf1f8, 0xc0e0, { 60, 36, 32, 32, 32, 32, 27}}, + {m68k_op_mulu_16_di, 0xf1f8, 0xc0e8, { 62, 38, 32, 32, 32, 32, 27}}, + {m68k_op_mulu_16_ix, 0xf1f8, 0xc0f0, { 64, 40, 34, 34, 34, 34, 27}}, + {m68k_op_abcd_8_rr, 0xf1f8, 0xc100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_abcd_8_mm, 0xf1f8, 0xc108, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_and_8_re_ai, 0xf1f8, 0xc110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_and_8_re_pi, 0xf1f8, 0xc118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_and_8_re_pd, 0xf1f8, 0xc120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_and_8_re_di, 0xf1f8, 0xc128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_and_8_re_ix, 0xf1f8, 0xc130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_exg_32_dd, 0xf1f8, 0xc140, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_exg_32_aa, 0xf1f8, 0xc148, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_and_16_re_ai, 0xf1f8, 0xc150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_and_16_re_pi, 0xf1f8, 0xc158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_and_16_re_pd, 0xf1f8, 0xc160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_and_16_re_di, 0xf1f8, 0xc168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_and_16_re_ix, 0xf1f8, 0xc170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_exg_32_da, 0xf1f8, 0xc188, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_and_32_re_ai, 0xf1f8, 0xc190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_and_32_re_pi, 0xf1f8, 0xc198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_and_32_re_pd, 0xf1f8, 0xc1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_and_32_re_di, 0xf1f8, 0xc1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_and_32_re_ix, 0xf1f8, 0xc1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_muls_16_d, 0xf1f8, 0xc1c0, { 54, 32, 27, 27, 27, 27, 27}}, + {m68k_op_muls_16_ai, 0xf1f8, 0xc1d0, { 58, 36, 31, 31, 31, 31, 27}}, + {m68k_op_muls_16_pi, 0xf1f8, 0xc1d8, { 58, 36, 31, 31, 31, 31, 27}}, + {m68k_op_muls_16_pd, 0xf1f8, 0xc1e0, { 60, 38, 32, 32, 32, 32, 27}}, + {m68k_op_muls_16_di, 0xf1f8, 0xc1e8, { 62, 40, 32, 32, 32, 32, 27}}, + {m68k_op_muls_16_ix, 0xf1f8, 0xc1f0, { 64, 42, 34, 34, 34, 34, 27}}, + {m68k_op_add_8_er_d, 0xf1f8, 0xd000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_add_8_er_ai, 0xf1f8, 0xd010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_add_8_er_pi, 0xf1f8, 0xd018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_add_8_er_pd, 0xf1f8, 0xd020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_add_8_er_di, 0xf1f8, 0xd028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_add_8_er_ix, 0xf1f8, 0xd030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_add_16_er_d, 0xf1f8, 0xd040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_add_16_er_a, 0xf1f8, 0xd048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_add_16_er_ai, 0xf1f8, 0xd050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_add_16_er_pi, 0xf1f8, 0xd058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_add_16_er_pd, 0xf1f8, 0xd060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_add_16_er_di, 0xf1f8, 0xd068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_add_16_er_ix, 0xf1f8, 0xd070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_add_32_er_d, 0xf1f8, 0xd080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_add_32_er_a, 0xf1f8, 0xd088, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_add_32_er_ai, 0xf1f8, 0xd090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_add_32_er_pi, 0xf1f8, 0xd098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_add_32_er_pd, 0xf1f8, 0xd0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_add_32_er_di, 0xf1f8, 0xd0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_add_32_er_ix, 0xf1f8, 0xd0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_adda_16_d, 0xf1f8, 0xd0c0, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_adda_16_a, 0xf1f8, 0xd0c8, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_adda_16_ai, 0xf1f8, 0xd0d0, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_adda_16_pi, 0xf1f8, 0xd0d8, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_adda_16_pd, 0xf1f8, 0xd0e0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_adda_16_di, 0xf1f8, 0xd0e8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_adda_16_ix, 0xf1f8, 0xd0f0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_addx_8_rr, 0xf1f8, 0xd100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_addx_8_mm, 0xf1f8, 0xd108, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_add_8_re_ai, 0xf1f8, 0xd110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_add_8_re_pi, 0xf1f8, 0xd118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_add_8_re_pd, 0xf1f8, 0xd120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_add_8_re_di, 0xf1f8, 0xd128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_add_8_re_ix, 0xf1f8, 0xd130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_addx_16_rr, 0xf1f8, 0xd140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_addx_16_mm, 0xf1f8, 0xd148, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_add_16_re_ai, 0xf1f8, 0xd150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_add_16_re_pi, 0xf1f8, 0xd158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_add_16_re_pd, 0xf1f8, 0xd160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_add_16_re_di, 0xf1f8, 0xd168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_add_16_re_ix, 0xf1f8, 0xd170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_addx_32_rr, 0xf1f8, 0xd180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_addx_32_mm, 0xf1f8, 0xd188, { 30, 30, 12, 12, 12, 12, 12}}, + {m68k_op_add_32_re_ai, 0xf1f8, 0xd190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_add_32_re_pi, 0xf1f8, 0xd198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_add_32_re_pd, 0xf1f8, 0xd1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_add_32_re_di, 0xf1f8, 0xd1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_add_32_re_ix, 0xf1f8, 0xd1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_adda_32_d, 0xf1f8, 0xd1c0, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_adda_32_a, 0xf1f8, 0xd1c8, { 8, 6, 2, 2, 2, 2, 2}}, + {m68k_op_adda_32_ai, 0xf1f8, 0xd1d0, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_adda_32_pi, 0xf1f8, 0xd1d8, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_adda_32_pd, 0xf1f8, 0xd1e0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_adda_32_di, 0xf1f8, 0xd1e8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_adda_32_ix, 0xf1f8, 0xd1f0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_asr_8_s, 0xf1f8, 0xe000, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_8_s, 0xf1f8, 0xe008, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_roxr_8_s, 0xf1f8, 0xe010, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_ror_8_s, 0xf1f8, 0xe018, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asr_8_r, 0xf1f8, 0xe020, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_8_r, 0xf1f8, 0xe028, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_roxr_8_r, 0xf1f8, 0xe030, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_ror_8_r, 0xf1f8, 0xe038, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asr_16_s, 0xf1f8, 0xe040, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_16_s, 0xf1f8, 0xe048, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_roxr_16_s, 0xf1f8, 0xe050, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_ror_16_s, 0xf1f8, 0xe058, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asr_16_r, 0xf1f8, 0xe060, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_16_r, 0xf1f8, 0xe068, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_roxr_16_r, 0xf1f8, 0xe070, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_ror_16_r, 0xf1f8, 0xe078, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asr_32_s, 0xf1f8, 0xe080, { 8, 8, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_32_s, 0xf1f8, 0xe088, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_roxr_32_s, 0xf1f8, 0xe090, { 8, 8, 12, 12, 12, 12, 12}}, + {m68k_op_ror_32_s, 0xf1f8, 0xe098, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_asr_32_r, 0xf1f8, 0xe0a0, { 8, 8, 6, 6, 6, 6, 6}}, + {m68k_op_lsr_32_r, 0xf1f8, 0xe0a8, { 8, 8, 6, 6, 6, 6, 6}}, + {m68k_op_roxr_32_r, 0xf1f8, 0xe0b0, { 8, 8, 12, 12, 12, 12, 12}}, + {m68k_op_ror_32_r, 0xf1f8, 0xe0b8, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_asl_8_s, 0xf1f8, 0xe100, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_8_s, 0xf1f8, 0xe108, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_roxl_8_s, 0xf1f8, 0xe110, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_rol_8_s, 0xf1f8, 0xe118, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asl_8_r, 0xf1f8, 0xe120, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_8_r, 0xf1f8, 0xe128, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_roxl_8_r, 0xf1f8, 0xe130, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_rol_8_r, 0xf1f8, 0xe138, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asl_16_s, 0xf1f8, 0xe140, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_16_s, 0xf1f8, 0xe148, { 6, 6, 4, 4, 4, 4, 4}}, + {m68k_op_roxl_16_s, 0xf1f8, 0xe150, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_rol_16_s, 0xf1f8, 0xe158, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asl_16_r, 0xf1f8, 0xe160, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_16_r, 0xf1f8, 0xe168, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_roxl_16_r, 0xf1f8, 0xe170, { 6, 6, 12, 12, 12, 12, 12}}, + {m68k_op_rol_16_r, 0xf1f8, 0xe178, { 6, 6, 8, 8, 8, 8, 8}}, + {m68k_op_asl_32_s, 0xf1f8, 0xe180, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_32_s, 0xf1f8, 0xe188, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_roxl_32_s, 0xf1f8, 0xe190, { 8, 8, 12, 12, 12, 12, 12}}, + {m68k_op_rol_32_s, 0xf1f8, 0xe198, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_asl_32_r, 0xf1f8, 0xe1a0, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_lsl_32_r, 0xf1f8, 0xe1a8, { 8, 8, 6, 6, 6, 6, 6}}, + {m68k_op_roxl_32_r, 0xf1f8, 0xe1b0, { 8, 8, 12, 12, 12, 12, 12}}, + {m68k_op_rol_32_r, 0xf1f8, 0xe1b8, { 8, 8, 8, 8, 8, 8, 8}}, + {m68k_op_cpdbcc_32, 0xf1f8, 0xf048, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_cptrapcc_32, 0xf1f8, 0xf078, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_ptest_32, 0xffd8, 0xf548, {255, 255, 255, 255, 8, 255, 255}}, + {m68k_op_rtm_32, 0xfff0, 0x06c0, {255, 255, 19, 19, 19, 19, 19}}, + {m68k_op_trap, 0xfff0, 0x4e40, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_btst_8_r_pi7, 0xf1ff, 0x011f, { 8, 8, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_r_pd7, 0xf1ff, 0x0127, { 10, 10, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_r_aw, 0xf1ff, 0x0138, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_r_al, 0xf1ff, 0x0139, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_r_pcdi, 0xf1ff, 0x013a, { 12, 12, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_r_pcix, 0xf1ff, 0x013b, { 14, 14, 11, 11, 11, 11, 4}}, + {m68k_op_btst_8_r_i, 0xf1ff, 0x013c, { 8, 8, 6, 6, 6, 6, 4}}, + {m68k_op_bchg_8_r_pi7, 0xf1ff, 0x015f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_r_pd7, 0xf1ff, 0x0167, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_r_aw, 0xf1ff, 0x0178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_r_al, 0xf1ff, 0x0179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_r_pi7, 0xf1ff, 0x019f, { 12, 14, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_r_pd7, 0xf1ff, 0x01a7, { 14, 16, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_r_aw, 0xf1ff, 0x01b8, { 16, 18, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_r_al, 0xf1ff, 0x01b9, { 20, 22, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_r_pi7, 0xf1ff, 0x01df, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_r_pd7, 0xf1ff, 0x01e7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_r_aw, 0xf1ff, 0x01f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_r_al, 0xf1ff, 0x01f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_d_pi7, 0xf1ff, 0x101f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_move_8_d_pd7, 0xf1ff, 0x1027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_move_8_d_aw, 0xf1ff, 0x1038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_move_8_d_al, 0xf1ff, 0x1039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_move_8_d_pcdi, 0xf1ff, 0x103a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_move_8_d_pcix, 0xf1ff, 0x103b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_move_8_d_i, 0xf1ff, 0x103c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_move_8_ai_pi7, 0xf1ff, 0x109f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_ai_pd7, 0xf1ff, 0x10a7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_ai_aw, 0xf1ff, 0x10b8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_ai_al, 0xf1ff, 0x10b9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_ai_pcdi, 0xf1ff, 0x10ba, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_ai_pcix, 0xf1ff, 0x10bb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_ai_i, 0xf1ff, 0x10bc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68k_op_move_8_pi_pi7, 0xf1ff, 0x10df, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi_pd7, 0xf1ff, 0x10e7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi_aw, 0xf1ff, 0x10f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi_al, 0xf1ff, 0x10f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi_pcdi, 0xf1ff, 0x10fa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi_pcix, 0xf1ff, 0x10fb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_pi_i, 0xf1ff, 0x10fc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68k_op_move_8_pd_pi7, 0xf1ff, 0x111f, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd_pd7, 0xf1ff, 0x1127, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd_aw, 0xf1ff, 0x1138, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd_al, 0xf1ff, 0x1139, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd_pcdi, 0xf1ff, 0x113a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd_pcix, 0xf1ff, 0x113b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_8_pd_i, 0xf1ff, 0x113c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68k_op_move_8_di_pi7, 0xf1ff, 0x115f, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_di_pd7, 0xf1ff, 0x1167, { 18, 18, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_di_aw, 0xf1ff, 0x1178, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_di_al, 0xf1ff, 0x1179, { 24, 24, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_di_pcdi, 0xf1ff, 0x117a, { 20, 20, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_di_pcix, 0xf1ff, 0x117b, { 22, 22, 12, 12, 12, 12, 5}}, + {m68k_op_move_8_di_i, 0xf1ff, 0x117c, { 16, 16, 7, 7, 7, 7, 5}}, + {m68k_op_move_8_ix_pi7, 0xf1ff, 0x119f, { 18, 18, 11, 11, 11, 11, 7}}, + {m68k_op_move_8_ix_pd7, 0xf1ff, 0x11a7, { 20, 20, 12, 12, 12, 12, 7}}, + {m68k_op_move_8_ix_aw, 0xf1ff, 0x11b8, { 22, 22, 11, 11, 11, 11, 7}}, + {m68k_op_move_8_ix_al, 0xf1ff, 0x11b9, { 26, 26, 11, 11, 11, 11, 7}}, + {m68k_op_move_8_ix_pcdi, 0xf1ff, 0x11ba, { 22, 22, 12, 12, 12, 12, 7}}, + {m68k_op_move_8_ix_pcix, 0xf1ff, 0x11bb, { 24, 24, 14, 14, 14, 14, 7}}, + {m68k_op_move_8_ix_i, 0xf1ff, 0x11bc, { 18, 18, 9, 9, 9, 9, 7}}, + {m68k_op_move_32_d_aw, 0xf1ff, 0x2038, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_move_32_d_al, 0xf1ff, 0x2039, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_move_32_d_pcdi, 0xf1ff, 0x203a, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_move_32_d_pcix, 0xf1ff, 0x203b, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_move_32_d_i, 0xf1ff, 0x203c, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_movea_32_aw, 0xf1ff, 0x2078, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_movea_32_al, 0xf1ff, 0x2079, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_movea_32_pcdi, 0xf1ff, 0x207a, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_movea_32_pcix, 0xf1ff, 0x207b, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_movea_32_i, 0xf1ff, 0x207c, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_move_32_ai_aw, 0xf1ff, 0x20b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_ai_al, 0xf1ff, 0x20b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_ai_pcdi, 0xf1ff, 0x20ba, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_ai_pcix, 0xf1ff, 0x20bb, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_ai_i, 0xf1ff, 0x20bc, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pi_aw, 0xf1ff, 0x20f8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pi_al, 0xf1ff, 0x20f9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pi_pcdi, 0xf1ff, 0x20fa, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_pi_pcix, 0xf1ff, 0x20fb, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_pi_i, 0xf1ff, 0x20fc, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_pd_aw, 0xf1ff, 0x2138, { 24, 26, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_pd_al, 0xf1ff, 0x2139, { 28, 30, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_pd_pcdi, 0xf1ff, 0x213a, { 24, 26, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_pd_pcix, 0xf1ff, 0x213b, { 26, 28, 12, 12, 12, 12, 5}}, + {m68k_op_move_32_pd_i, 0xf1ff, 0x213c, { 20, 22, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_di_aw, 0xf1ff, 0x2178, { 28, 28, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_di_al, 0xf1ff, 0x2179, { 32, 32, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_di_pcdi, 0xf1ff, 0x217a, { 28, 28, 10, 10, 10, 10, 5}}, + {m68k_op_move_32_di_pcix, 0xf1ff, 0x217b, { 30, 30, 12, 12, 12, 12, 5}}, + {m68k_op_move_32_di_i, 0xf1ff, 0x217c, { 24, 24, 9, 9, 9, 9, 5}}, + {m68k_op_move_32_ix_aw, 0xf1ff, 0x21b8, { 30, 30, 11, 11, 11, 11, 7}}, + {m68k_op_move_32_ix_al, 0xf1ff, 0x21b9, { 34, 34, 11, 11, 11, 11, 7}}, + {m68k_op_move_32_ix_pcdi, 0xf1ff, 0x21ba, { 30, 30, 12, 12, 12, 12, 7}}, + {m68k_op_move_32_ix_pcix, 0xf1ff, 0x21bb, { 32, 32, 14, 14, 14, 14, 7}}, + {m68k_op_move_32_ix_i, 0xf1ff, 0x21bc, { 26, 26, 11, 11, 11, 11, 7}}, + {m68k_op_move_16_d_aw, 0xf1ff, 0x3038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_move_16_d_al, 0xf1ff, 0x3039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_move_16_d_pcdi, 0xf1ff, 0x303a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_move_16_d_pcix, 0xf1ff, 0x303b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_move_16_d_i, 0xf1ff, 0x303c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_movea_16_aw, 0xf1ff, 0x3078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_movea_16_al, 0xf1ff, 0x3079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_movea_16_pcdi, 0xf1ff, 0x307a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_movea_16_pcix, 0xf1ff, 0x307b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_movea_16_i, 0xf1ff, 0x307c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_move_16_ai_aw, 0xf1ff, 0x30b8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_ai_al, 0xf1ff, 0x30b9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_ai_pcdi, 0xf1ff, 0x30ba, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_ai_pcix, 0xf1ff, 0x30bb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_ai_i, 0xf1ff, 0x30bc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68k_op_move_16_pi_aw, 0xf1ff, 0x30f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_pi_al, 0xf1ff, 0x30f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_pi_pcdi, 0xf1ff, 0x30fa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_pi_pcix, 0xf1ff, 0x30fb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_pi_i, 0xf1ff, 0x30fc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68k_op_move_16_pd_aw, 0xf1ff, 0x3138, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_pd_al, 0xf1ff, 0x3139, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_pd_pcdi, 0xf1ff, 0x313a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_pd_pcix, 0xf1ff, 0x313b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_16_pd_i, 0xf1ff, 0x313c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68k_op_move_16_di_aw, 0xf1ff, 0x3178, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_di_al, 0xf1ff, 0x3179, { 24, 24, 9, 9, 9, 9, 5}}, + {m68k_op_move_16_di_pcdi, 0xf1ff, 0x317a, { 20, 20, 10, 10, 10, 10, 5}}, + {m68k_op_move_16_di_pcix, 0xf1ff, 0x317b, { 22, 22, 12, 12, 12, 12, 5}}, + {m68k_op_move_16_di_i, 0xf1ff, 0x317c, { 16, 16, 7, 7, 7, 7, 5}}, + {m68k_op_move_16_ix_aw, 0xf1ff, 0x31b8, { 22, 22, 11, 11, 11, 11, 7}}, + {m68k_op_move_16_ix_al, 0xf1ff, 0x31b9, { 26, 26, 11, 11, 11, 11, 7}}, + {m68k_op_move_16_ix_pcdi, 0xf1ff, 0x31ba, { 22, 22, 12, 12, 12, 12, 7}}, + {m68k_op_move_16_ix_pcix, 0xf1ff, 0x31bb, { 24, 24, 14, 14, 14, 14, 7}}, + {m68k_op_move_16_ix_i, 0xf1ff, 0x31bc, { 18, 18, 9, 9, 9, 9, 7}}, + {m68k_op_chk_32_aw, 0xf1ff, 0x4138, {255, 255, 12, 12, 12, 12, 8}}, + {m68k_op_chk_32_al, 0xf1ff, 0x4139, {255, 255, 12, 12, 12, 12, 8}}, + {m68k_op_chk_32_pcdi, 0xf1ff, 0x413a, {255, 255, 13, 13, 13, 13, 8}}, + {m68k_op_chk_32_pcix, 0xf1ff, 0x413b, {255, 255, 15, 15, 15, 15, 8}}, + {m68k_op_chk_32_i, 0xf1ff, 0x413c, {255, 255, 12, 12, 12, 12, 8}}, + {m68k_op_chk_16_aw, 0xf1ff, 0x41b8, { 18, 16, 12, 12, 12, 12, 8}}, + {m68k_op_chk_16_al, 0xf1ff, 0x41b9, { 22, 20, 12, 12, 12, 12, 8}}, + {m68k_op_chk_16_pcdi, 0xf1ff, 0x41ba, { 18, 16, 13, 13, 13, 13, 8}}, + {m68k_op_chk_16_pcix, 0xf1ff, 0x41bb, { 20, 18, 15, 15, 15, 15, 8}}, + {m68k_op_chk_16_i, 0xf1ff, 0x41bc, { 14, 12, 10, 10, 10, 10, 8}}, + {m68k_op_lea_32_aw, 0xf1ff, 0x41f8, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_lea_32_al, 0xf1ff, 0x41f9, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_lea_32_pcdi, 0xf1ff, 0x41fa, { 8, 8, 7, 7, 7, 7, 2}}, + {m68k_op_lea_32_pcix, 0xf1ff, 0x41fb, { 12, 12, 9, 9, 9, 9, 2}}, + {m68k_op_addq_8_pi7, 0xf1ff, 0x501f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_addq_8_pd7, 0xf1ff, 0x5027, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_addq_8_aw, 0xf1ff, 0x5038, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addq_8_al, 0xf1ff, 0x5039, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addq_16_aw, 0xf1ff, 0x5078, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addq_16_al, 0xf1ff, 0x5079, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addq_32_aw, 0xf1ff, 0x50b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_addq_32_al, 0xf1ff, 0x50b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_subq_8_pi7, 0xf1ff, 0x511f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_subq_8_pd7, 0xf1ff, 0x5127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_subq_8_aw, 0xf1ff, 0x5138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subq_8_al, 0xf1ff, 0x5139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subq_16_aw, 0xf1ff, 0x5178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subq_16_al, 0xf1ff, 0x5179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subq_32_aw, 0xf1ff, 0x51b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_subq_32_al, 0xf1ff, 0x51b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_or_8_er_pi7, 0xf1ff, 0x801f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_or_8_er_pd7, 0xf1ff, 0x8027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_or_8_er_aw, 0xf1ff, 0x8038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_or_8_er_al, 0xf1ff, 0x8039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_or_8_er_pcdi, 0xf1ff, 0x803a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_or_8_er_pcix, 0xf1ff, 0x803b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_or_8_er_i, 0xf1ff, 0x803c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_or_16_er_aw, 0xf1ff, 0x8078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_or_16_er_al, 0xf1ff, 0x8079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_or_16_er_pcdi, 0xf1ff, 0x807a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_or_16_er_pcix, 0xf1ff, 0x807b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_or_16_er_i, 0xf1ff, 0x807c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_or_32_er_aw, 0xf1ff, 0x80b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_or_32_er_al, 0xf1ff, 0x80b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_or_32_er_pcdi, 0xf1ff, 0x80ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_or_32_er_pcix, 0xf1ff, 0x80bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_or_32_er_i, 0xf1ff, 0x80bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_divu_16_aw, 0xf1ff, 0x80f8, {148, 116, 48, 48, 48, 48, 44}}, + {m68k_op_divu_16_al, 0xf1ff, 0x80f9, {152, 120, 48, 48, 48, 48, 44}}, + {m68k_op_divu_16_pcdi, 0xf1ff, 0x80fa, {148, 116, 49, 49, 49, 49, 44}}, + {m68k_op_divu_16_pcix, 0xf1ff, 0x80fb, {150, 118, 51, 51, 51, 51, 44}}, + {m68k_op_divu_16_i, 0xf1ff, 0x80fc, {144, 112, 46, 46, 46, 46, 44}}, + {m68k_op_sbcd_8_mm_ay7, 0xf1ff, 0x810f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_or_8_re_pi7, 0xf1ff, 0x811f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_or_8_re_pd7, 0xf1ff, 0x8127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_or_8_re_aw, 0xf1ff, 0x8138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_or_8_re_al, 0xf1ff, 0x8139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_pack_16_mm_ay7, 0xf1ff, 0x814f, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_or_16_re_aw, 0xf1ff, 0x8178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_or_16_re_al, 0xf1ff, 0x8179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_unpk_16_mm_ay7, 0xf1ff, 0x818f, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_or_32_re_aw, 0xf1ff, 0x81b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_or_32_re_al, 0xf1ff, 0x81b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_divs_16_aw, 0xf1ff, 0x81f8, {166, 130, 60, 60, 60, 60, 56}}, + {m68k_op_divs_16_al, 0xf1ff, 0x81f9, {170, 134, 60, 60, 60, 60, 56}}, + {m68k_op_divs_16_pcdi, 0xf1ff, 0x81fa, {166, 130, 61, 61, 61, 61, 56}}, + {m68k_op_divs_16_pcix, 0xf1ff, 0x81fb, {168, 132, 63, 63, 63, 63, 56}}, + {m68k_op_divs_16_i, 0xf1ff, 0x81fc, {162, 126, 58, 58, 58, 58, 56}}, + {m68k_op_sub_8_er_pi7, 0xf1ff, 0x901f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_sub_8_er_pd7, 0xf1ff, 0x9027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_sub_8_er_aw, 0xf1ff, 0x9038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_sub_8_er_al, 0xf1ff, 0x9039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_sub_8_er_pcdi, 0xf1ff, 0x903a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_sub_8_er_pcix, 0xf1ff, 0x903b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_sub_8_er_i, 0xf1ff, 0x903c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_sub_16_er_aw, 0xf1ff, 0x9078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_sub_16_er_al, 0xf1ff, 0x9079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_sub_16_er_pcdi, 0xf1ff, 0x907a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_sub_16_er_pcix, 0xf1ff, 0x907b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_sub_16_er_i, 0xf1ff, 0x907c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_sub_32_er_aw, 0xf1ff, 0x90b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_sub_32_er_al, 0xf1ff, 0x90b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_sub_32_er_pcdi, 0xf1ff, 0x90ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_sub_32_er_pcix, 0xf1ff, 0x90bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_sub_32_er_i, 0xf1ff, 0x90bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_suba_16_aw, 0xf1ff, 0x90f8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_suba_16_al, 0xf1ff, 0x90f9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_suba_16_pcdi, 0xf1ff, 0x90fa, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_suba_16_pcix, 0xf1ff, 0x90fb, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_suba_16_i, 0xf1ff, 0x90fc, { 12, 12, 4, 4, 4, 4, 2}}, + {m68k_op_subx_8_mm_ay7, 0xf1ff, 0x910f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_sub_8_re_pi7, 0xf1ff, 0x911f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_sub_8_re_pd7, 0xf1ff, 0x9127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_sub_8_re_aw, 0xf1ff, 0x9138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_sub_8_re_al, 0xf1ff, 0x9139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_sub_16_re_aw, 0xf1ff, 0x9178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_sub_16_re_al, 0xf1ff, 0x9179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_sub_32_re_aw, 0xf1ff, 0x91b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_sub_32_re_al, 0xf1ff, 0x91b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_suba_32_aw, 0xf1ff, 0x91f8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_suba_32_al, 0xf1ff, 0x91f9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_suba_32_pcdi, 0xf1ff, 0x91fa, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_suba_32_pcix, 0xf1ff, 0x91fb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_suba_32_i, 0xf1ff, 0x91fc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_pi7, 0xf1ff, 0xb01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_pd7, 0xf1ff, 0xb027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_8_aw, 0xf1ff, 0xb038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_al, 0xf1ff, 0xb039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_8_pcdi, 0xf1ff, 0xb03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_8_pcix, 0xf1ff, 0xb03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_8_i, 0xf1ff, 0xb03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_cmp_16_aw, 0xf1ff, 0xb078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_16_al, 0xf1ff, 0xb079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_16_pcdi, 0xf1ff, 0xb07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_16_pcix, 0xf1ff, 0xb07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_16_i, 0xf1ff, 0xb07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_cmp_32_aw, 0xf1ff, 0xb0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_32_al, 0xf1ff, 0xb0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_cmp_32_pcdi, 0xf1ff, 0xb0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_cmp_32_pcix, 0xf1ff, 0xb0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_cmp_32_i, 0xf1ff, 0xb0bc, { 14, 14, 6, 6, 6, 6, 2}}, + {m68k_op_cmpa_16_aw, 0xf1ff, 0xb0f8, { 14, 14, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_16_al, 0xf1ff, 0xb0f9, { 18, 18, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_16_pcdi, 0xf1ff, 0xb0fa, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_16_pcix, 0xf1ff, 0xb0fb, { 16, 16, 11, 11, 11, 11, 4}}, + {m68k_op_cmpa_16_i, 0xf1ff, 0xb0fc, { 10, 10, 6, 6, 6, 6, 4}}, + {m68k_op_cmpm_8_ay7, 0xf1ff, 0xb10f, { 12, 12, 9, 9, 9, 9, 9}}, + {m68k_op_eor_8_pi7, 0xf1ff, 0xb11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_eor_8_pd7, 0xf1ff, 0xb127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_eor_8_aw, 0xf1ff, 0xb138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eor_8_al, 0xf1ff, 0xb139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eor_16_aw, 0xf1ff, 0xb178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eor_16_al, 0xf1ff, 0xb179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eor_32_aw, 0xf1ff, 0xb1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_eor_32_al, 0xf1ff, 0xb1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_32_aw, 0xf1ff, 0xb1f8, { 18, 18, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_32_al, 0xf1ff, 0xb1f9, { 22, 22, 8, 8, 8, 8, 4}}, + {m68k_op_cmpa_32_pcdi, 0xf1ff, 0xb1fa, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_cmpa_32_pcix, 0xf1ff, 0xb1fb, { 20, 20, 11, 11, 11, 11, 4}}, + {m68k_op_cmpa_32_i, 0xf1ff, 0xb1fc, { 14, 14, 8, 8, 8, 8, 4}}, + {m68k_op_and_8_er_pi7, 0xf1ff, 0xc01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_and_8_er_pd7, 0xf1ff, 0xc027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_and_8_er_aw, 0xf1ff, 0xc038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_and_8_er_al, 0xf1ff, 0xc039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_and_8_er_pcdi, 0xf1ff, 0xc03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_and_8_er_pcix, 0xf1ff, 0xc03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_and_8_er_i, 0xf1ff, 0xc03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_and_16_er_aw, 0xf1ff, 0xc078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_and_16_er_al, 0xf1ff, 0xc079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_and_16_er_pcdi, 0xf1ff, 0xc07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_and_16_er_pcix, 0xf1ff, 0xc07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_and_16_er_i, 0xf1ff, 0xc07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_and_32_er_aw, 0xf1ff, 0xc0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_and_32_er_al, 0xf1ff, 0xc0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_and_32_er_pcdi, 0xf1ff, 0xc0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_and_32_er_pcix, 0xf1ff, 0xc0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_and_32_er_i, 0xf1ff, 0xc0bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_mulu_16_aw, 0xf1ff, 0xc0f8, { 62, 38, 31, 31, 31, 31, 27}}, + {m68k_op_mulu_16_al, 0xf1ff, 0xc0f9, { 66, 42, 31, 31, 31, 31, 27}}, + {m68k_op_mulu_16_pcdi, 0xf1ff, 0xc0fa, { 62, 38, 32, 32, 32, 32, 27}}, + {m68k_op_mulu_16_pcix, 0xf1ff, 0xc0fb, { 64, 40, 34, 34, 34, 34, 27}}, + {m68k_op_mulu_16_i, 0xf1ff, 0xc0fc, { 58, 34, 29, 29, 29, 29, 27}}, + {m68k_op_abcd_8_mm_ay7, 0xf1ff, 0xc10f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_and_8_re_pi7, 0xf1ff, 0xc11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_and_8_re_pd7, 0xf1ff, 0xc127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_and_8_re_aw, 0xf1ff, 0xc138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_and_8_re_al, 0xf1ff, 0xc139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_and_16_re_aw, 0xf1ff, 0xc178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_and_16_re_al, 0xf1ff, 0xc179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_and_32_re_aw, 0xf1ff, 0xc1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_and_32_re_al, 0xf1ff, 0xc1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_muls_16_aw, 0xf1ff, 0xc1f8, { 62, 40, 31, 31, 31, 31, 27}}, + {m68k_op_muls_16_al, 0xf1ff, 0xc1f9, { 66, 44, 31, 31, 31, 31, 27}}, + {m68k_op_muls_16_pcdi, 0xf1ff, 0xc1fa, { 62, 40, 32, 32, 32, 32, 27}}, + {m68k_op_muls_16_pcix, 0xf1ff, 0xc1fb, { 64, 42, 34, 34, 34, 34, 27}}, + {m68k_op_muls_16_i, 0xf1ff, 0xc1fc, { 58, 36, 29, 29, 29, 29, 27}}, + {m68k_op_add_8_er_pi7, 0xf1ff, 0xd01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_add_8_er_pd7, 0xf1ff, 0xd027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_add_8_er_aw, 0xf1ff, 0xd038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_add_8_er_al, 0xf1ff, 0xd039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_add_8_er_pcdi, 0xf1ff, 0xd03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_add_8_er_pcix, 0xf1ff, 0xd03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_add_8_er_i, 0xf1ff, 0xd03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_add_16_er_aw, 0xf1ff, 0xd078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_add_16_er_al, 0xf1ff, 0xd079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_add_16_er_pcdi, 0xf1ff, 0xd07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_add_16_er_pcix, 0xf1ff, 0xd07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_add_16_er_i, 0xf1ff, 0xd07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68k_op_add_32_er_aw, 0xf1ff, 0xd0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_add_32_er_al, 0xf1ff, 0xd0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_add_32_er_pcdi, 0xf1ff, 0xd0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_add_32_er_pcix, 0xf1ff, 0xd0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_add_32_er_i, 0xf1ff, 0xd0bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_adda_16_aw, 0xf1ff, 0xd0f8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_adda_16_al, 0xf1ff, 0xd0f9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_adda_16_pcdi, 0xf1ff, 0xd0fa, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_adda_16_pcix, 0xf1ff, 0xd0fb, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_adda_16_i, 0xf1ff, 0xd0fc, { 12, 12, 4, 4, 4, 4, 2}}, + {m68k_op_addx_8_mm_ay7, 0xf1ff, 0xd10f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_add_8_re_pi7, 0xf1ff, 0xd11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_add_8_re_pd7, 0xf1ff, 0xd127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_add_8_re_aw, 0xf1ff, 0xd138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_add_8_re_al, 0xf1ff, 0xd139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_add_16_re_aw, 0xf1ff, 0xd178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_add_16_re_al, 0xf1ff, 0xd179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_add_32_re_aw, 0xf1ff, 0xd1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_add_32_re_al, 0xf1ff, 0xd1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_adda_32_aw, 0xf1ff, 0xd1f8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68k_op_adda_32_al, 0xf1ff, 0xd1f9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68k_op_adda_32_pcdi, 0xf1ff, 0xd1fa, { 18, 18, 7, 7, 7, 7, 2}}, + {m68k_op_adda_32_pcix, 0xf1ff, 0xd1fb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68k_op_adda_32_i, 0xf1ff, 0xd1fc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68k_op_ori_8_d, 0xfff8, 0x0000, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_ori_8_ai, 0xfff8, 0x0010, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_ori_8_pi, 0xfff8, 0x0018, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_ori_8_pd, 0xfff8, 0x0020, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_ori_8_di, 0xfff8, 0x0028, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_ori_8_ix, 0xfff8, 0x0030, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_ori_16_d, 0xfff8, 0x0040, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_ori_16_ai, 0xfff8, 0x0050, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_ori_16_pi, 0xfff8, 0x0058, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_ori_16_pd, 0xfff8, 0x0060, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_ori_16_di, 0xfff8, 0x0068, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_ori_16_ix, 0xfff8, 0x0070, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_ori_32_d, 0xfff8, 0x0080, { 16, 14, 2, 2, 2, 2, 2}}, + {m68k_op_ori_32_ai, 0xfff8, 0x0090, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_ori_32_pi, 0xfff8, 0x0098, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_ori_32_pd, 0xfff8, 0x00a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68k_op_ori_32_di, 0xfff8, 0x00a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68k_op_ori_32_ix, 0xfff8, 0x00b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68k_op_chk2cmp2_8_ai, 0xfff8, 0x00d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_8_di, 0xfff8, 0x00e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68k_op_chk2cmp2_8_ix, 0xfff8, 0x00f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68k_op_andi_8_d, 0xfff8, 0x0200, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_andi_8_ai, 0xfff8, 0x0210, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_andi_8_pi, 0xfff8, 0x0218, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_andi_8_pd, 0xfff8, 0x0220, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_andi_8_di, 0xfff8, 0x0228, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_andi_8_ix, 0xfff8, 0x0230, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_andi_16_d, 0xfff8, 0x0240, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_andi_16_ai, 0xfff8, 0x0250, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_andi_16_pi, 0xfff8, 0x0258, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_andi_16_pd, 0xfff8, 0x0260, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_andi_16_di, 0xfff8, 0x0268, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_andi_16_ix, 0xfff8, 0x0270, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_andi_32_d, 0xfff8, 0x0280, { 14, 14, 2, 2, 2, 2, 2}}, + {m68k_op_andi_32_ai, 0xfff8, 0x0290, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_andi_32_pi, 0xfff8, 0x0298, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_andi_32_pd, 0xfff8, 0x02a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68k_op_andi_32_di, 0xfff8, 0x02a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68k_op_andi_32_ix, 0xfff8, 0x02b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68k_op_chk2cmp2_16_ai, 0xfff8, 0x02d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_16_di, 0xfff8, 0x02e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68k_op_chk2cmp2_16_ix, 0xfff8, 0x02f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68k_op_subi_8_d, 0xfff8, 0x0400, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_subi_8_ai, 0xfff8, 0x0410, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subi_8_pi, 0xfff8, 0x0418, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subi_8_pd, 0xfff8, 0x0420, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_subi_8_di, 0xfff8, 0x0428, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_subi_8_ix, 0xfff8, 0x0430, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_subi_16_d, 0xfff8, 0x0440, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_subi_16_ai, 0xfff8, 0x0450, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subi_16_pi, 0xfff8, 0x0458, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subi_16_pd, 0xfff8, 0x0460, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_subi_16_di, 0xfff8, 0x0468, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_subi_16_ix, 0xfff8, 0x0470, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_subi_32_d, 0xfff8, 0x0480, { 16, 14, 2, 2, 2, 2, 2}}, + {m68k_op_subi_32_ai, 0xfff8, 0x0490, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_subi_32_pi, 0xfff8, 0x0498, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_subi_32_pd, 0xfff8, 0x04a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68k_op_subi_32_di, 0xfff8, 0x04a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68k_op_subi_32_ix, 0xfff8, 0x04b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68k_op_chk2cmp2_32_ai, 0xfff8, 0x04d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_32_di, 0xfff8, 0x04e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68k_op_chk2cmp2_32_ix, 0xfff8, 0x04f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68k_op_addi_8_d, 0xfff8, 0x0600, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_addi_8_ai, 0xfff8, 0x0610, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addi_8_pi, 0xfff8, 0x0618, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addi_8_pd, 0xfff8, 0x0620, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_addi_8_di, 0xfff8, 0x0628, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_addi_8_ix, 0xfff8, 0x0630, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_addi_16_d, 0xfff8, 0x0640, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_addi_16_ai, 0xfff8, 0x0650, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addi_16_pi, 0xfff8, 0x0658, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addi_16_pd, 0xfff8, 0x0660, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_addi_16_di, 0xfff8, 0x0668, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_addi_16_ix, 0xfff8, 0x0670, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_addi_32_d, 0xfff8, 0x0680, { 16, 14, 2, 2, 2, 2, 2}}, + {m68k_op_addi_32_ai, 0xfff8, 0x0690, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_addi_32_pi, 0xfff8, 0x0698, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_addi_32_pd, 0xfff8, 0x06a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68k_op_addi_32_di, 0xfff8, 0x06a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68k_op_addi_32_ix, 0xfff8, 0x06b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68k_op_callm_32_ai, 0xfff8, 0x06d0, {255, 255, 64, 64, 64, 64, 60}}, + {m68k_op_callm_32_di, 0xfff8, 0x06e8, {255, 255, 65, 65, 65, 65, 60}}, + {m68k_op_callm_32_ix, 0xfff8, 0x06f0, {255, 255, 67, 67, 67, 67, 60}}, + {m68k_op_btst_32_s_d, 0xfff8, 0x0800, { 10, 10, 4, 4, 4, 4, 4}}, + {m68k_op_btst_8_s_ai, 0xfff8, 0x0810, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_s_pi, 0xfff8, 0x0818, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_s_pd, 0xfff8, 0x0820, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_s_di, 0xfff8, 0x0828, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_s_ix, 0xfff8, 0x0830, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_bchg_32_s_d, 0xfff8, 0x0840, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_bchg_8_s_ai, 0xfff8, 0x0850, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_s_pi, 0xfff8, 0x0858, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_s_pd, 0xfff8, 0x0860, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_s_di, 0xfff8, 0x0868, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_s_ix, 0xfff8, 0x0870, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_bclr_32_s_d, 0xfff8, 0x0880, { 14, 14, 4, 4, 4, 4, 4}}, + {m68k_op_bclr_8_s_ai, 0xfff8, 0x0890, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_s_pi, 0xfff8, 0x0898, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_s_pd, 0xfff8, 0x08a0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_s_di, 0xfff8, 0x08a8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_s_ix, 0xfff8, 0x08b0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_bset_32_s_d, 0xfff8, 0x08c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_bset_8_s_ai, 0xfff8, 0x08d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_s_pi, 0xfff8, 0x08d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_s_pd, 0xfff8, 0x08e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_s_di, 0xfff8, 0x08e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_s_ix, 0xfff8, 0x08f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_eori_8_d, 0xfff8, 0x0a00, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_eori_8_ai, 0xfff8, 0x0a10, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eori_8_pi, 0xfff8, 0x0a18, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eori_8_pd, 0xfff8, 0x0a20, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_eori_8_di, 0xfff8, 0x0a28, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_eori_8_ix, 0xfff8, 0x0a30, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_eori_16_d, 0xfff8, 0x0a40, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_eori_16_ai, 0xfff8, 0x0a50, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eori_16_pi, 0xfff8, 0x0a58, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eori_16_pd, 0xfff8, 0x0a60, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_eori_16_di, 0xfff8, 0x0a68, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_eori_16_ix, 0xfff8, 0x0a70, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_eori_32_d, 0xfff8, 0x0a80, { 16, 14, 2, 2, 2, 2, 2}}, + {m68k_op_eori_32_ai, 0xfff8, 0x0a90, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_eori_32_pi, 0xfff8, 0x0a98, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_eori_32_pd, 0xfff8, 0x0aa0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68k_op_eori_32_di, 0xfff8, 0x0aa8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68k_op_eori_32_ix, 0xfff8, 0x0ab0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68k_op_cas_8_ai, 0xfff8, 0x0ad0, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_8_pi, 0xfff8, 0x0ad8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_8_pd, 0xfff8, 0x0ae0, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_8_di, 0xfff8, 0x0ae8, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_8_ix, 0xfff8, 0x0af0, {255, 255, 19, 19, 19, 19, 12}}, + {m68k_op_cmpi_8_d, 0xfff8, 0x0c00, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_cmpi_8_ai, 0xfff8, 0x0c10, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_8_pi, 0xfff8, 0x0c18, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_8_pd, 0xfff8, 0x0c20, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_8_di, 0xfff8, 0x0c28, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_8_ix, 0xfff8, 0x0c30, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_cmpi_16_d, 0xfff8, 0x0c40, { 8, 8, 2, 2, 2, 2, 2}}, + {m68k_op_cmpi_16_ai, 0xfff8, 0x0c50, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_16_pi, 0xfff8, 0x0c58, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_16_pd, 0xfff8, 0x0c60, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_16_di, 0xfff8, 0x0c68, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_16_ix, 0xfff8, 0x0c70, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_cmpi_32_d, 0xfff8, 0x0c80, { 14, 12, 2, 2, 2, 2, 2}}, + {m68k_op_cmpi_32_ai, 0xfff8, 0x0c90, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_32_pi, 0xfff8, 0x0c98, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_32_pd, 0xfff8, 0x0ca0, { 22, 22, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_32_di, 0xfff8, 0x0ca8, { 24, 24, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_32_ix, 0xfff8, 0x0cb0, { 26, 26, 9, 9, 9, 9, 2}}, + {m68k_op_cas_16_ai, 0xfff8, 0x0cd0, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_16_pi, 0xfff8, 0x0cd8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_16_pd, 0xfff8, 0x0ce0, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_16_di, 0xfff8, 0x0ce8, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_16_ix, 0xfff8, 0x0cf0, {255, 255, 19, 19, 19, 19, 12}}, + {m68k_op_moves_8_ai, 0xfff8, 0x0e10, {255, 18, 9, 9, 9, 9, 5}}, + {m68k_op_moves_8_pi, 0xfff8, 0x0e18, {255, 18, 9, 9, 9, 9, 5}}, + {m68k_op_moves_8_pd, 0xfff8, 0x0e20, {255, 20, 10, 10, 10, 10, 5}}, + {m68k_op_moves_8_di, 0xfff8, 0x0e28, {255, 26, 10, 10, 10, 10, 5}}, + {m68k_op_moves_8_ix, 0xfff8, 0x0e30, {255, 30, 12, 12, 12, 12, 5}}, + {m68k_op_moves_16_ai, 0xfff8, 0x0e50, {255, 18, 9, 9, 9, 9, 5}}, + {m68k_op_moves_16_pi, 0xfff8, 0x0e58, {255, 18, 9, 9, 9, 9, 5}}, + {m68k_op_moves_16_pd, 0xfff8, 0x0e60, {255, 20, 10, 10, 10, 10, 5}}, + {m68k_op_moves_16_di, 0xfff8, 0x0e68, {255, 26, 10, 10, 10, 10, 5}}, + {m68k_op_moves_16_ix, 0xfff8, 0x0e70, {255, 30, 12, 12, 12, 12, 5}}, + {m68k_op_moves_32_ai, 0xfff8, 0x0e90, {255, 22, 9, 9, 9, 9, 5}}, + {m68k_op_moves_32_pi, 0xfff8, 0x0e98, {255, 22, 9, 9, 9, 9, 5}}, + {m68k_op_moves_32_pd, 0xfff8, 0x0ea0, {255, 28, 10, 10, 10, 10, 5}}, + {m68k_op_moves_32_di, 0xfff8, 0x0ea8, {255, 32, 10, 10, 10, 10, 5}}, + {m68k_op_moves_32_ix, 0xfff8, 0x0eb0, {255, 36, 12, 12, 12, 12, 5}}, + {m68k_op_cas_32_ai, 0xfff8, 0x0ed0, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_32_pi, 0xfff8, 0x0ed8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_32_pd, 0xfff8, 0x0ee0, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_32_di, 0xfff8, 0x0ee8, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_32_ix, 0xfff8, 0x0ef0, {255, 255, 19, 19, 19, 19, 12}}, + {m68k_op_move_8_aw_d, 0xfff8, 0x11c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_8_aw_ai, 0xfff8, 0x11d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_aw_pi, 0xfff8, 0x11d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_aw_pd, 0xfff8, 0x11e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_aw_di, 0xfff8, 0x11e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_aw_ix, 0xfff8, 0x11f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_al_d, 0xfff8, 0x13c0, { 16, 16, 6, 6, 6, 6, 6}}, + {m68k_op_move_8_al_ai, 0xfff8, 0x13d0, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_move_8_al_pi, 0xfff8, 0x13d8, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_move_8_al_pd, 0xfff8, 0x13e0, { 22, 22, 11, 11, 11, 11, 6}}, + {m68k_op_move_8_al_di, 0xfff8, 0x13e8, { 24, 24, 11, 11, 11, 11, 6}}, + {m68k_op_move_8_al_ix, 0xfff8, 0x13f0, { 26, 26, 13, 13, 13, 13, 6}}, + {m68k_op_move_8_pi7_d, 0xfff8, 0x1ec0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_move_8_pi7_ai, 0xfff8, 0x1ed0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi7_pi, 0xfff8, 0x1ed8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi7_pd, 0xfff8, 0x1ee0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi7_di, 0xfff8, 0x1ee8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi7_ix, 0xfff8, 0x1ef0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_pd7_d, 0xfff8, 0x1f00, { 8, 8, 5, 5, 5, 5, 5}}, + {m68k_op_move_8_pd7_ai, 0xfff8, 0x1f10, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd7_pi, 0xfff8, 0x1f18, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd7_pd, 0xfff8, 0x1f20, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd7_di, 0xfff8, 0x1f28, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd7_ix, 0xfff8, 0x1f30, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_32_aw_d, 0xfff8, 0x21c0, { 16, 16, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_aw_a, 0xfff8, 0x21c8, { 16, 16, 4, 4, 4, 4, 4}}, + {m68k_op_move_32_aw_ai, 0xfff8, 0x21d0, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_aw_pi, 0xfff8, 0x21d8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_aw_pd, 0xfff8, 0x21e0, { 26, 26, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_aw_di, 0xfff8, 0x21e8, { 28, 28, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_aw_ix, 0xfff8, 0x21f0, { 30, 30, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_al_d, 0xfff8, 0x23c0, { 20, 20, 6, 6, 6, 6, 6}}, + {m68k_op_move_32_al_a, 0xfff8, 0x23c8, { 20, 20, 6, 6, 6, 6, 6}}, + {m68k_op_move_32_al_ai, 0xfff8, 0x23d0, { 28, 28, 10, 10, 10, 10, 6}}, + {m68k_op_move_32_al_pi, 0xfff8, 0x23d8, { 28, 28, 10, 10, 10, 10, 6}}, + {m68k_op_move_32_al_pd, 0xfff8, 0x23e0, { 30, 30, 11, 11, 11, 11, 6}}, + {m68k_op_move_32_al_di, 0xfff8, 0x23e8, { 32, 32, 11, 11, 11, 11, 6}}, + {m68k_op_move_32_al_ix, 0xfff8, 0x23f0, { 34, 34, 13, 13, 13, 13, 6}}, + {m68k_op_move_16_aw_d, 0xfff8, 0x31c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_aw_a, 0xfff8, 0x31c8, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_aw_ai, 0xfff8, 0x31d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_aw_pi, 0xfff8, 0x31d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_aw_pd, 0xfff8, 0x31e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_aw_di, 0xfff8, 0x31e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_aw_ix, 0xfff8, 0x31f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_al_d, 0xfff8, 0x33c0, { 16, 16, 6, 6, 6, 6, 6}}, + {m68k_op_move_16_al_a, 0xfff8, 0x33c8, { 16, 16, 6, 6, 6, 6, 6}}, + {m68k_op_move_16_al_ai, 0xfff8, 0x33d0, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_move_16_al_pi, 0xfff8, 0x33d8, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_move_16_al_pd, 0xfff8, 0x33e0, { 22, 22, 11, 11, 11, 11, 6}}, + {m68k_op_move_16_al_di, 0xfff8, 0x33e8, { 24, 24, 11, 11, 11, 11, 6}}, + {m68k_op_move_16_al_ix, 0xfff8, 0x33f0, { 26, 26, 13, 13, 13, 13, 6}}, + {m68k_op_negx_8_d, 0xfff8, 0x4000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_negx_8_ai, 0xfff8, 0x4010, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_negx_8_pi, 0xfff8, 0x4018, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_negx_8_pd, 0xfff8, 0x4020, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_negx_8_di, 0xfff8, 0x4028, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_negx_8_ix, 0xfff8, 0x4030, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_negx_16_d, 0xfff8, 0x4040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_negx_16_ai, 0xfff8, 0x4050, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_negx_16_pi, 0xfff8, 0x4058, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_negx_16_pd, 0xfff8, 0x4060, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_negx_16_di, 0xfff8, 0x4068, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_negx_16_ix, 0xfff8, 0x4070, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_negx_32_d, 0xfff8, 0x4080, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_negx_32_ai, 0xfff8, 0x4090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_negx_32_pi, 0xfff8, 0x4098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_negx_32_pd, 0xfff8, 0x40a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_negx_32_di, 0xfff8, 0x40a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_negx_32_ix, 0xfff8, 0x40b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_frs_d, 0xfff8, 0x40c0, { 6, 4, 8, 8, 8, 8, 8}}, + {m68k_op_move_16_frs_ai, 0xfff8, 0x40d0, { 12, 12, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_frs_pi, 0xfff8, 0x40d8, { 12, 12, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_frs_pd, 0xfff8, 0x40e0, { 14, 14, 13, 13, 13, 13, 8}}, + {m68k_op_move_16_frs_di, 0xfff8, 0x40e8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68k_op_move_16_frs_ix, 0xfff8, 0x40f0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68k_op_clr_8_d, 0xfff8, 0x4200, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_clr_8_ai, 0xfff8, 0x4210, { 12, 8, 8, 8, 8, 8, 4}}, + {m68k_op_clr_8_pi, 0xfff8, 0x4218, { 12, 8, 8, 8, 8, 8, 4}}, + {m68k_op_clr_8_pd, 0xfff8, 0x4220, { 14, 10, 9, 9, 9, 9, 4}}, + {m68k_op_clr_8_di, 0xfff8, 0x4228, { 16, 12, 9, 9, 9, 9, 4}}, + {m68k_op_clr_8_ix, 0xfff8, 0x4230, { 18, 14, 11, 11, 11, 11, 4}}, + {m68k_op_clr_16_d, 0xfff8, 0x4240, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_clr_16_ai, 0xfff8, 0x4250, { 12, 8, 8, 8, 8, 8, 4}}, + {m68k_op_clr_16_pi, 0xfff8, 0x4258, { 12, 8, 8, 8, 8, 8, 4}}, + {m68k_op_clr_16_pd, 0xfff8, 0x4260, { 14, 10, 9, 9, 9, 9, 4}}, + {m68k_op_clr_16_di, 0xfff8, 0x4268, { 16, 12, 9, 9, 9, 9, 4}}, + {m68k_op_clr_16_ix, 0xfff8, 0x4270, { 18, 14, 11, 11, 11, 11, 4}}, + {m68k_op_clr_32_d, 0xfff8, 0x4280, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_clr_32_ai, 0xfff8, 0x4290, { 20, 12, 8, 8, 8, 8, 4}}, + {m68k_op_clr_32_pi, 0xfff8, 0x4298, { 20, 12, 8, 8, 8, 8, 4}}, + {m68k_op_clr_32_pd, 0xfff8, 0x42a0, { 22, 14, 9, 9, 9, 9, 4}}, + {m68k_op_clr_32_di, 0xfff8, 0x42a8, { 24, 16, 9, 9, 9, 9, 4}}, + {m68k_op_clr_32_ix, 0xfff8, 0x42b0, { 26, 20, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_frc_d, 0xfff8, 0x42c0, {255, 4, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_frc_ai, 0xfff8, 0x42d0, {255, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_frc_pi, 0xfff8, 0x42d8, {255, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_frc_pd, 0xfff8, 0x42e0, {255, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_frc_di, 0xfff8, 0x42e8, {255, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_frc_ix, 0xfff8, 0x42f0, {255, 18, 11, 11, 11, 11, 4}}, + {m68k_op_neg_8_d, 0xfff8, 0x4400, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_neg_8_ai, 0xfff8, 0x4410, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_neg_8_pi, 0xfff8, 0x4418, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_neg_8_pd, 0xfff8, 0x4420, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_neg_8_di, 0xfff8, 0x4428, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_neg_8_ix, 0xfff8, 0x4430, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_neg_16_d, 0xfff8, 0x4440, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_neg_16_ai, 0xfff8, 0x4450, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_neg_16_pi, 0xfff8, 0x4458, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_neg_16_pd, 0xfff8, 0x4460, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_neg_16_di, 0xfff8, 0x4468, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_neg_16_ix, 0xfff8, 0x4470, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_neg_32_d, 0xfff8, 0x4480, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_neg_32_ai, 0xfff8, 0x4490, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_neg_32_pi, 0xfff8, 0x4498, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_neg_32_pd, 0xfff8, 0x44a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_neg_32_di, 0xfff8, 0x44a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_neg_32_ix, 0xfff8, 0x44b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_toc_d, 0xfff8, 0x44c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68k_op_move_16_toc_ai, 0xfff8, 0x44d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_toc_pi, 0xfff8, 0x44d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_toc_pd, 0xfff8, 0x44e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_toc_di, 0xfff8, 0x44e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_toc_ix, 0xfff8, 0x44f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_not_8_d, 0xfff8, 0x4600, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_not_8_ai, 0xfff8, 0x4610, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_not_8_pi, 0xfff8, 0x4618, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_not_8_pd, 0xfff8, 0x4620, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_not_8_di, 0xfff8, 0x4628, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_not_8_ix, 0xfff8, 0x4630, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_not_16_d, 0xfff8, 0x4640, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_not_16_ai, 0xfff8, 0x4650, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_not_16_pi, 0xfff8, 0x4658, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_not_16_pd, 0xfff8, 0x4660, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_not_16_di, 0xfff8, 0x4668, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_not_16_ix, 0xfff8, 0x4670, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_not_32_d, 0xfff8, 0x4680, { 6, 6, 2, 2, 2, 2, 2}}, + {m68k_op_not_32_ai, 0xfff8, 0x4690, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_not_32_pi, 0xfff8, 0x4698, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_not_32_pd, 0xfff8, 0x46a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68k_op_not_32_di, 0xfff8, 0x46a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68k_op_not_32_ix, 0xfff8, 0x46b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_tos_d, 0xfff8, 0x46c0, { 12, 12, 8, 8, 8, 8, 8}}, + {m68k_op_move_16_tos_ai, 0xfff8, 0x46d0, { 16, 16, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_tos_pi, 0xfff8, 0x46d8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_tos_pd, 0xfff8, 0x46e0, { 18, 18, 13, 13, 13, 13, 8}}, + {m68k_op_move_16_tos_di, 0xfff8, 0x46e8, { 20, 20, 13, 13, 13, 13, 8}}, + {m68k_op_move_16_tos_ix, 0xfff8, 0x46f0, { 22, 22, 15, 15, 15, 15, 8}}, + {m68k_op_nbcd_8_d, 0xfff8, 0x4800, { 6, 6, 6, 6, 6, 6, 6}}, + {m68k_op_link_32, 0xfff8, 0x4808, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_nbcd_8_ai, 0xfff8, 0x4810, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_nbcd_8_pi, 0xfff8, 0x4818, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_nbcd_8_pd, 0xfff8, 0x4820, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_nbcd_8_di, 0xfff8, 0x4828, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_nbcd_8_ix, 0xfff8, 0x4830, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_swap_32, 0xfff8, 0x4840, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_bkpt, 0xfff8, 0x4848, {255, 10, 10, 10, 10, 10, 10}}, + {m68k_op_pea_32_ai, 0xfff8, 0x4850, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_pea_32_di, 0xfff8, 0x4868, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_pea_32_ix, 0xfff8, 0x4870, { 20, 20, 12, 12, 12, 12, 5}}, + {m68k_op_ext_16, 0xfff8, 0x4880, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_movem_16_re_ai, 0xfff8, 0x4890, { 8, 8, 8, 8, 8, 8, 4}}, + {m68k_op_movem_16_re_pd, 0xfff8, 0x48a0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_movem_16_re_di, 0xfff8, 0x48a8, { 12, 12, 9, 9, 9, 9, 4}}, + {m68k_op_movem_16_re_ix, 0xfff8, 0x48b0, { 14, 14, 11, 11, 11, 11, 4}}, + {m68k_op_ext_32, 0xfff8, 0x48c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_movem_32_re_ai, 0xfff8, 0x48d0, { 8, 8, 8, 8, 8, 8, 4}}, + {m68k_op_movem_32_re_pd, 0xfff8, 0x48e0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68k_op_movem_32_re_di, 0xfff8, 0x48e8, { 12, 12, 9, 9, 9, 9, 4}}, + {m68k_op_movem_32_re_ix, 0xfff8, 0x48f0, { 14, 14, 11, 11, 11, 11, 4}}, + {m68k_op_extb_32, 0xfff8, 0x49c0, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_tst_8_d, 0xfff8, 0x4a00, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_tst_8_ai, 0xfff8, 0x4a10, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_tst_8_pi, 0xfff8, 0x4a18, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_tst_8_pd, 0xfff8, 0x4a20, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_tst_8_di, 0xfff8, 0x4a28, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_tst_8_ix, 0xfff8, 0x4a30, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_tst_16_d, 0xfff8, 0x4a40, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_tst_16_a, 0xfff8, 0x4a48, {255, 255, 2, 2, 2, 2, 2}}, + {m68k_op_tst_16_ai, 0xfff8, 0x4a50, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_tst_16_pi, 0xfff8, 0x4a58, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_tst_16_pd, 0xfff8, 0x4a60, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_tst_16_di, 0xfff8, 0x4a68, { 12, 12, 7, 7, 7, 7, 2}}, + {m68k_op_tst_16_ix, 0xfff8, 0x4a70, { 14, 14, 9, 9, 9, 9, 2}}, + {m68k_op_tst_32_d, 0xfff8, 0x4a80, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_tst_32_a, 0xfff8, 0x4a88, {255, 255, 2, 2, 2, 2, 2}}, + {m68k_op_tst_32_ai, 0xfff8, 0x4a90, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_tst_32_pi, 0xfff8, 0x4a98, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_tst_32_pd, 0xfff8, 0x4aa0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_tst_32_di, 0xfff8, 0x4aa8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68k_op_tst_32_ix, 0xfff8, 0x4ab0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68k_op_tas_8_d, 0xfff8, 0x4ac0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_tas_8_ai, 0xfff8, 0x4ad0, { 18, 18, 16, 16, 16, 16, 12}}, + {m68k_op_tas_8_pi, 0xfff8, 0x4ad8, { 18, 18, 16, 16, 16, 16, 12}}, + {m68k_op_tas_8_pd, 0xfff8, 0x4ae0, { 20, 20, 17, 17, 17, 17, 12}}, + {m68k_op_tas_8_di, 0xfff8, 0x4ae8, { 22, 22, 17, 17, 17, 17, 12}}, + {m68k_op_tas_8_ix, 0xfff8, 0x4af0, { 24, 24, 19, 19, 19, 19, 12}}, + {m68k_op_mull_32_d, 0xfff8, 0x4c00, {255, 255, 43, 43, 43, 43, 43}}, + {m68k_op_mull_32_ai, 0xfff8, 0x4c10, {255, 255, 47, 47, 47, 47, 43}}, + {m68k_op_mull_32_pi, 0xfff8, 0x4c18, {255, 255, 47, 47, 47, 47, 43}}, + {m68k_op_mull_32_pd, 0xfff8, 0x4c20, {255, 255, 48, 48, 48, 48, 43}}, + {m68k_op_mull_32_di, 0xfff8, 0x4c28, {255, 255, 48, 48, 48, 48, 43}}, + {m68k_op_mull_32_ix, 0xfff8, 0x4c30, {255, 255, 50, 50, 50, 50, 43}}, + {m68k_op_divl_32_d, 0xfff8, 0x4c40, {255, 255, 84, 84, 84, 84, 84}}, + {m68k_op_divl_32_ai, 0xfff8, 0x4c50, {255, 255, 88, 88, 88, 88, 84}}, + {m68k_op_divl_32_pi, 0xfff8, 0x4c58, {255, 255, 88, 88, 88, 88, 84}}, + {m68k_op_divl_32_pd, 0xfff8, 0x4c60, {255, 255, 89, 89, 89, 89, 84}}, + {m68k_op_divl_32_di, 0xfff8, 0x4c68, {255, 255, 89, 89, 89, 89, 84}}, + {m68k_op_divl_32_ix, 0xfff8, 0x4c70, {255, 255, 91, 91, 91, 91, 84}}, + {m68k_op_movem_16_er_ai, 0xfff8, 0x4c90, { 12, 12, 12, 12, 12, 12, 8}}, + {m68k_op_movem_16_er_pi, 0xfff8, 0x4c98, { 12, 12, 8, 8, 8, 8, 8}}, + {m68k_op_movem_16_er_di, 0xfff8, 0x4ca8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68k_op_movem_16_er_ix, 0xfff8, 0x4cb0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68k_op_movem_32_er_ai, 0xfff8, 0x4cd0, { 12, 12, 12, 12, 12, 12, 8}}, + {m68k_op_movem_32_er_pi, 0xfff8, 0x4cd8, { 12, 12, 8, 8, 8, 8, 8}}, + {m68k_op_movem_32_er_di, 0xfff8, 0x4ce8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68k_op_movem_32_er_ix, 0xfff8, 0x4cf0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68k_op_link_16, 0xfff8, 0x4e50, { 16, 16, 5, 5, 5, 5, 5}}, + {m68k_op_unlk_32, 0xfff8, 0x4e58, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_move_32_tou, 0xfff8, 0x4e60, { 4, 6, 2, 2, 2, 2, 2}}, + {m68k_op_move_32_fru, 0xfff8, 0x4e68, { 4, 6, 2, 2, 2, 2, 2}}, + {m68k_op_jsr_32_ai, 0xfff8, 0x4e90, { 16, 16, 4, 4, 4, 4, 0}}, + {m68k_op_jsr_32_di, 0xfff8, 0x4ea8, { 18, 18, 5, 5, 5, 5, 0}}, + {m68k_op_jsr_32_ix, 0xfff8, 0x4eb0, { 22, 22, 7, 7, 7, 7, 0}}, + {m68k_op_jmp_32_ai, 0xfff8, 0x4ed0, { 8, 8, 4, 4, 4, 4, 0}}, + {m68k_op_jmp_32_di, 0xfff8, 0x4ee8, { 10, 10, 5, 5, 5, 5, 0}}, + {m68k_op_jmp_32_ix, 0xfff8, 0x4ef0, { 14, 14, 7, 7, 7, 7, 0}}, + {m68k_op_st_8_d, 0xfff8, 0x50c0, { 6, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbt_16, 0xfff8, 0x50c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_st_8_ai, 0xfff8, 0x50d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_st_8_pi, 0xfff8, 0x50d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_st_8_pd, 0xfff8, 0x50e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_st_8_di, 0xfff8, 0x50e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_st_8_ix, 0xfff8, 0x50f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sf_8_d, 0xfff8, 0x51c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbf_16, 0xfff8, 0x51c8, { 12, 12, 6, 4, 4, 4, 4}}, + {m68k_op_sf_8_ai, 0xfff8, 0x51d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sf_8_pi, 0xfff8, 0x51d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sf_8_pd, 0xfff8, 0x51e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sf_8_di, 0xfff8, 0x51e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sf_8_ix, 0xfff8, 0x51f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_shi_8_d, 0xfff8, 0x52c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbhi_16, 0xfff8, 0x52c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_shi_8_ai, 0xfff8, 0x52d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_shi_8_pi, 0xfff8, 0x52d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_shi_8_pd, 0xfff8, 0x52e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_shi_8_di, 0xfff8, 0x52e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_shi_8_ix, 0xfff8, 0x52f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sls_8_d, 0xfff8, 0x53c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbls_16, 0xfff8, 0x53c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_sls_8_ai, 0xfff8, 0x53d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sls_8_pi, 0xfff8, 0x53d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sls_8_pd, 0xfff8, 0x53e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sls_8_di, 0xfff8, 0x53e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sls_8_ix, 0xfff8, 0x53f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_scc_8_d, 0xfff8, 0x54c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbcc_16, 0xfff8, 0x54c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_scc_8_ai, 0xfff8, 0x54d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scc_8_pi, 0xfff8, 0x54d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scc_8_pd, 0xfff8, 0x54e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_scc_8_di, 0xfff8, 0x54e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_scc_8_ix, 0xfff8, 0x54f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_scs_8_d, 0xfff8, 0x55c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbcs_16, 0xfff8, 0x55c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_scs_8_ai, 0xfff8, 0x55d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scs_8_pi, 0xfff8, 0x55d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scs_8_pd, 0xfff8, 0x55e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_scs_8_di, 0xfff8, 0x55e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_scs_8_ix, 0xfff8, 0x55f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sne_8_d, 0xfff8, 0x56c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbne_16, 0xfff8, 0x56c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_sne_8_ai, 0xfff8, 0x56d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sne_8_pi, 0xfff8, 0x56d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sne_8_pd, 0xfff8, 0x56e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sne_8_di, 0xfff8, 0x56e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sne_8_ix, 0xfff8, 0x56f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_seq_8_d, 0xfff8, 0x57c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbeq_16, 0xfff8, 0x57c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_seq_8_ai, 0xfff8, 0x57d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_seq_8_pi, 0xfff8, 0x57d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_seq_8_pd, 0xfff8, 0x57e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_seq_8_di, 0xfff8, 0x57e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_seq_8_ix, 0xfff8, 0x57f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_svc_8_d, 0xfff8, 0x58c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbvc_16, 0xfff8, 0x58c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_svc_8_ai, 0xfff8, 0x58d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svc_8_pi, 0xfff8, 0x58d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svc_8_pd, 0xfff8, 0x58e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_svc_8_di, 0xfff8, 0x58e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_svc_8_ix, 0xfff8, 0x58f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_svs_8_d, 0xfff8, 0x59c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbvs_16, 0xfff8, 0x59c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_svs_8_ai, 0xfff8, 0x59d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svs_8_pi, 0xfff8, 0x59d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svs_8_pd, 0xfff8, 0x59e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_svs_8_di, 0xfff8, 0x59e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_svs_8_ix, 0xfff8, 0x59f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_spl_8_d, 0xfff8, 0x5ac0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbpl_16, 0xfff8, 0x5ac8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_spl_8_ai, 0xfff8, 0x5ad0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_spl_8_pi, 0xfff8, 0x5ad8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_spl_8_pd, 0xfff8, 0x5ae0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_spl_8_di, 0xfff8, 0x5ae8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_spl_8_ix, 0xfff8, 0x5af0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_smi_8_d, 0xfff8, 0x5bc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbmi_16, 0xfff8, 0x5bc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_smi_8_ai, 0xfff8, 0x5bd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_smi_8_pi, 0xfff8, 0x5bd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_smi_8_pd, 0xfff8, 0x5be0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_smi_8_di, 0xfff8, 0x5be8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_smi_8_ix, 0xfff8, 0x5bf0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sge_8_d, 0xfff8, 0x5cc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbge_16, 0xfff8, 0x5cc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_sge_8_ai, 0xfff8, 0x5cd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sge_8_pi, 0xfff8, 0x5cd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sge_8_pd, 0xfff8, 0x5ce0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sge_8_di, 0xfff8, 0x5ce8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sge_8_ix, 0xfff8, 0x5cf0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_slt_8_d, 0xfff8, 0x5dc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dblt_16, 0xfff8, 0x5dc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_slt_8_ai, 0xfff8, 0x5dd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_slt_8_pi, 0xfff8, 0x5dd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_slt_8_pd, 0xfff8, 0x5de0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_slt_8_di, 0xfff8, 0x5de8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_slt_8_ix, 0xfff8, 0x5df0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sgt_8_d, 0xfff8, 0x5ec0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dbgt_16, 0xfff8, 0x5ec8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_sgt_8_ai, 0xfff8, 0x5ed0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sgt_8_pi, 0xfff8, 0x5ed8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sgt_8_pd, 0xfff8, 0x5ee0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sgt_8_di, 0xfff8, 0x5ee8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sgt_8_ix, 0xfff8, 0x5ef0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sle_8_d, 0xfff8, 0x5fc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_dble_16, 0xfff8, 0x5fc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_sle_8_ai, 0xfff8, 0x5fd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sle_8_pi, 0xfff8, 0x5fd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sle_8_pd, 0xfff8, 0x5fe0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sle_8_di, 0xfff8, 0x5fe8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_sle_8_ix, 0xfff8, 0x5ff0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_sbcd_8_mm_ax7, 0xfff8, 0x8f08, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_pack_16_mm_ax7, 0xfff8, 0x8f48, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_unpk_16_mm_ax7, 0xfff8, 0x8f88, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_subx_8_mm_ax7, 0xfff8, 0x9f08, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_cmpm_8_ax7, 0xfff8, 0xbf08, { 12, 12, 9, 9, 9, 9, 9}}, + {m68k_op_abcd_8_mm_ax7, 0xfff8, 0xcf08, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_addx_8_mm_ax7, 0xfff8, 0xdf08, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_asr_16_ai, 0xfff8, 0xe0d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_asr_16_pi, 0xfff8, 0xe0d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_asr_16_pd, 0xfff8, 0xe0e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_asr_16_di, 0xfff8, 0xe0e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_asr_16_ix, 0xfff8, 0xe0f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_asl_16_ai, 0xfff8, 0xe1d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_asl_16_pi, 0xfff8, 0xe1d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_asl_16_pd, 0xfff8, 0xe1e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_asl_16_di, 0xfff8, 0xe1e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68k_op_asl_16_ix, 0xfff8, 0xe1f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68k_op_lsr_16_ai, 0xfff8, 0xe2d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_lsr_16_pi, 0xfff8, 0xe2d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_lsr_16_pd, 0xfff8, 0xe2e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_lsr_16_di, 0xfff8, 0xe2e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_lsr_16_ix, 0xfff8, 0xe2f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_lsl_16_ai, 0xfff8, 0xe3d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_lsl_16_pi, 0xfff8, 0xe3d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_lsl_16_pd, 0xfff8, 0xe3e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_lsl_16_di, 0xfff8, 0xe3e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_lsl_16_ix, 0xfff8, 0xe3f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_roxr_16_ai, 0xfff8, 0xe4d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_roxr_16_pi, 0xfff8, 0xe4d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_roxr_16_pd, 0xfff8, 0xe4e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_roxr_16_di, 0xfff8, 0xe4e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_roxr_16_ix, 0xfff8, 0xe4f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_roxl_16_ai, 0xfff8, 0xe5d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_roxl_16_pi, 0xfff8, 0xe5d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_roxl_16_pd, 0xfff8, 0xe5e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_roxl_16_di, 0xfff8, 0xe5e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_roxl_16_ix, 0xfff8, 0xe5f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_ror_16_ai, 0xfff8, 0xe6d0, { 12, 12, 11, 11, 11, 11, 7}}, + {m68k_op_ror_16_pi, 0xfff8, 0xe6d8, { 12, 12, 11, 11, 11, 11, 7}}, + {m68k_op_ror_16_pd, 0xfff8, 0xe6e0, { 14, 14, 12, 12, 12, 12, 7}}, + {m68k_op_ror_16_di, 0xfff8, 0xe6e8, { 16, 16, 12, 12, 12, 12, 7}}, + {m68k_op_ror_16_ix, 0xfff8, 0xe6f0, { 18, 18, 14, 14, 14, 14, 7}}, + {m68k_op_rol_16_ai, 0xfff8, 0xe7d0, { 12, 12, 11, 11, 11, 11, 7}}, + {m68k_op_rol_16_pi, 0xfff8, 0xe7d8, { 12, 12, 11, 11, 11, 11, 7}}, + {m68k_op_rol_16_pd, 0xfff8, 0xe7e0, { 14, 14, 12, 12, 12, 12, 7}}, + {m68k_op_rol_16_di, 0xfff8, 0xe7e8, { 16, 16, 12, 12, 12, 12, 7}}, + {m68k_op_rol_16_ix, 0xfff8, 0xe7f0, { 18, 18, 14, 14, 14, 14, 7}}, + {m68k_op_bftst_32_d, 0xfff8, 0xe8c0, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_bftst_32_ai, 0xfff8, 0xe8d0, {255, 255, 17, 17, 17, 17, 13}}, + {m68k_op_bftst_32_di, 0xfff8, 0xe8e8, {255, 255, 18, 18, 18, 18, 13}}, + {m68k_op_bftst_32_ix, 0xfff8, 0xe8f0, {255, 255, 20, 20, 20, 20, 13}}, + {m68k_op_bfextu_32_d, 0xfff8, 0xe9c0, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_bfextu_32_ai, 0xfff8, 0xe9d0, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfextu_32_di, 0xfff8, 0xe9e8, {255, 255, 20, 20, 20, 20, 15}}, + {m68k_op_bfextu_32_ix, 0xfff8, 0xe9f0, {255, 255, 22, 22, 22, 22, 15}}, + {m68k_op_bfchg_32_d, 0xfff8, 0xeac0, {255, 255, 12, 12, 12, 12, 12}}, + {m68k_op_bfchg_32_ai, 0xfff8, 0xead0, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfchg_32_di, 0xfff8, 0xeae8, {255, 255, 25, 25, 25, 25, 20}}, + {m68k_op_bfchg_32_ix, 0xfff8, 0xeaf0, {255, 255, 27, 27, 27, 27, 20}}, + {m68k_op_bfexts_32_d, 0xfff8, 0xebc0, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_bfexts_32_ai, 0xfff8, 0xebd0, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfexts_32_di, 0xfff8, 0xebe8, {255, 255, 20, 20, 20, 20, 15}}, + {m68k_op_bfexts_32_ix, 0xfff8, 0xebf0, {255, 255, 22, 22, 22, 22, 15}}, + {m68k_op_bfclr_32_d, 0xfff8, 0xecc0, {255, 255, 12, 12, 12, 12, 12}}, + {m68k_op_bfclr_32_ai, 0xfff8, 0xecd0, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfclr_32_di, 0xfff8, 0xece8, {255, 255, 25, 25, 25, 25, 20}}, + {m68k_op_bfclr_32_ix, 0xfff8, 0xecf0, {255, 255, 27, 27, 27, 27, 20}}, + {m68k_op_bfffo_32_d, 0xfff8, 0xedc0, {255, 255, 18, 18, 18, 18, 18}}, + {m68k_op_bfffo_32_ai, 0xfff8, 0xedd0, {255, 255, 32, 32, 32, 32, 28}}, + {m68k_op_bfffo_32_di, 0xfff8, 0xede8, {255, 255, 33, 33, 33, 33, 28}}, + {m68k_op_bfffo_32_ix, 0xfff8, 0xedf0, {255, 255, 35, 35, 35, 35, 28}}, + {m68k_op_bfset_32_d, 0xfff8, 0xeec0, {255, 255, 12, 12, 12, 12, 12}}, + {m68k_op_bfset_32_ai, 0xfff8, 0xeed0, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfset_32_di, 0xfff8, 0xeee8, {255, 255, 25, 25, 25, 25, 20}}, + {m68k_op_bfset_32_ix, 0xfff8, 0xeef0, {255, 255, 27, 27, 27, 27, 20}}, + {m68k_op_bfins_32_d, 0xfff8, 0xefc0, {255, 255, 10, 10, 10, 10, 10}}, + {m68k_op_bfins_32_ai, 0xfff8, 0xefd0, {255, 255, 21, 21, 21, 21, 17}}, + {m68k_op_bfins_32_di, 0xfff8, 0xefe8, {255, 255, 22, 22, 22, 22, 17}}, + {m68k_op_bfins_32_ix, 0xfff8, 0xeff0, {255, 255, 24, 24, 24, 24, 17}}, + {m68k_op_ftrapcc_32, 0xfff8, 0xf278, {255, 255, 4, 4, 255, 255, 255}}, + {m68k_op_pflushan_32, 0xfff8, 0xf510, {255, 255, 255, 255, 4, 4, 4}}, + {m68k_op_pflusha_32, 0xfff8, 0xf518, {255, 255, 255, 255, 4, 4, 4}}, + {m68k_op_move16_32, 0xfff8, 0xf620, {255, 255, 255, 255, 4, 4, 4}}, + {m68k_op_ori_8_pi7, 0xffff, 0x001f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_ori_8_pd7, 0xffff, 0x0027, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_ori_8_aw, 0xffff, 0x0038, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_ori_8_al, 0xffff, 0x0039, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_ori_16_toc, 0xffff, 0x003c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_ori_16_aw, 0xffff, 0x0078, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_ori_16_al, 0xffff, 0x0079, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_ori_16_tos, 0xffff, 0x007c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_ori_32_aw, 0xffff, 0x00b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_ori_32_al, 0xffff, 0x00b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68k_op_chk2cmp2_8_aw, 0xffff, 0x00f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_8_al, 0xffff, 0x00f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_8_pcdi, 0xffff, 0x00fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_chk2cmp2_8_pcix, 0xffff, 0x00fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_andi_8_pi7, 0xffff, 0x021f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_andi_8_pd7, 0xffff, 0x0227, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_andi_8_aw, 0xffff, 0x0238, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_andi_8_al, 0xffff, 0x0239, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_andi_16_toc, 0xffff, 0x023c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_andi_16_aw, 0xffff, 0x0278, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_andi_16_al, 0xffff, 0x0279, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_andi_16_tos, 0xffff, 0x027c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_andi_32_aw, 0xffff, 0x02b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_andi_32_al, 0xffff, 0x02b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68k_op_chk2cmp2_16_aw, 0xffff, 0x02f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_16_al, 0xffff, 0x02f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_16_pcdi, 0xffff, 0x02fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_chk2cmp2_16_pcix, 0xffff, 0x02fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_subi_8_pi7, 0xffff, 0x041f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_subi_8_pd7, 0xffff, 0x0427, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_subi_8_aw, 0xffff, 0x0438, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subi_8_al, 0xffff, 0x0439, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_subi_16_aw, 0xffff, 0x0478, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_subi_16_al, 0xffff, 0x0479, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_subi_32_aw, 0xffff, 0x04b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_subi_32_al, 0xffff, 0x04b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68k_op_chk2cmp2_32_aw, 0xffff, 0x04f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_32_al, 0xffff, 0x04f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68k_op_chk2cmp2_32_pcdi, 0xffff, 0x04fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_chk2cmp2_32_pcix, 0xffff, 0x04fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68k_op_addi_8_pi7, 0xffff, 0x061f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_addi_8_pd7, 0xffff, 0x0627, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_addi_8_aw, 0xffff, 0x0638, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addi_8_al, 0xffff, 0x0639, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_addi_16_aw, 0xffff, 0x0678, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_addi_16_al, 0xffff, 0x0679, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_addi_32_aw, 0xffff, 0x06b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_addi_32_al, 0xffff, 0x06b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68k_op_callm_32_aw, 0xffff, 0x06f8, {255, 255, 64, 64, 64, 64, 60}}, + {m68k_op_callm_32_al, 0xffff, 0x06f9, {255, 255, 64, 64, 64, 64, 60}}, + {m68k_op_callm_32_pcdi, 0xffff, 0x06fa, {255, 255, 65, 65, 65, 65, 60}}, + {m68k_op_callm_32_pcix, 0xffff, 0x06fb, {255, 255, 67, 67, 67, 67, 60}}, + {m68k_op_btst_8_s_pi7, 0xffff, 0x081f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_s_pd7, 0xffff, 0x0827, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_s_aw, 0xffff, 0x0838, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_s_al, 0xffff, 0x0839, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_btst_8_s_pcdi, 0xffff, 0x083a, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_btst_8_s_pcix, 0xffff, 0x083b, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_bchg_8_s_pi7, 0xffff, 0x085f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_s_pd7, 0xffff, 0x0867, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bchg_8_s_aw, 0xffff, 0x0878, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_bchg_8_s_al, 0xffff, 0x0879, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_s_pi7, 0xffff, 0x089f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_s_pd7, 0xffff, 0x08a7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bclr_8_s_aw, 0xffff, 0x08b8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_bclr_8_s_al, 0xffff, 0x08b9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_s_pi7, 0xffff, 0x08df, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_s_pd7, 0xffff, 0x08e7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_bset_8_s_aw, 0xffff, 0x08f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_bset_8_s_al, 0xffff, 0x08f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_eori_8_pi7, 0xffff, 0x0a1f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_eori_8_pd7, 0xffff, 0x0a27, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_eori_8_aw, 0xffff, 0x0a38, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eori_8_al, 0xffff, 0x0a39, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_eori_16_toc, 0xffff, 0x0a3c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_eori_16_aw, 0xffff, 0x0a78, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_eori_16_al, 0xffff, 0x0a79, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_eori_16_tos, 0xffff, 0x0a7c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68k_op_eori_32_aw, 0xffff, 0x0ab8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_eori_32_al, 0xffff, 0x0ab9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68k_op_cas_8_pi7, 0xffff, 0x0adf, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_8_pd7, 0xffff, 0x0ae7, {255, 255, 17, 17, 17, 17, 12}}, + {m68k_op_cas_8_aw, 0xffff, 0x0af8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_8_al, 0xffff, 0x0af9, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cmpi_8_pi7, 0xffff, 0x0c1f, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_8_pd7, 0xffff, 0x0c27, { 14, 14, 7, 7, 7, 7, 2}}, + {m68k_op_cmpi_8_aw, 0xffff, 0x0c38, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_8_al, 0xffff, 0x0c39, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_8_pcdi, 0xffff, 0x0c3a, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_cmpi_8_pcix, 0xffff, 0x0c3b, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_cmpi_16_aw, 0xffff, 0x0c78, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_16_al, 0xffff, 0x0c79, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_16_pcdi, 0xffff, 0x0c7a, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_cmpi_16_pcix, 0xffff, 0x0c7b, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_cmpi_32_aw, 0xffff, 0x0cb8, { 24, 24, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_32_al, 0xffff, 0x0cb9, { 28, 28, 6, 6, 6, 6, 2}}, + {m68k_op_cmpi_32_pcdi, 0xffff, 0x0cba, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_cmpi_32_pcix, 0xffff, 0x0cbb, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_cas_16_aw, 0xffff, 0x0cf8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_16_al, 0xffff, 0x0cf9, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas2_16, 0xffff, 0x0cfc, {255, 255, 12, 12, 12, 12, 12}}, + {m68k_op_moves_8_pi7, 0xffff, 0x0e1f, {255, 18, 9, 9, 9, 9, 5}}, + {m68k_op_moves_8_pd7, 0xffff, 0x0e27, {255, 20, 10, 10, 10, 10, 5}}, + {m68k_op_moves_8_aw, 0xffff, 0x0e38, {255, 26, 9, 9, 9, 9, 5}}, + {m68k_op_moves_8_al, 0xffff, 0x0e39, {255, 30, 9, 9, 9, 9, 5}}, + {m68k_op_moves_16_aw, 0xffff, 0x0e78, {255, 26, 9, 9, 9, 9, 5}}, + {m68k_op_moves_16_al, 0xffff, 0x0e79, {255, 30, 9, 9, 9, 9, 5}}, + {m68k_op_moves_32_aw, 0xffff, 0x0eb8, {255, 32, 9, 9, 9, 9, 5}}, + {m68k_op_moves_32_al, 0xffff, 0x0eb9, {255, 36, 9, 9, 9, 9, 5}}, + {m68k_op_cas_32_aw, 0xffff, 0x0ef8, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas_32_al, 0xffff, 0x0ef9, {255, 255, 16, 16, 16, 16, 12}}, + {m68k_op_cas2_32, 0xffff, 0x0efc, {255, 255, 12, 12, 12, 12, 12}}, + {m68k_op_move_8_aw_pi7, 0xffff, 0x11df, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_aw_pd7, 0xffff, 0x11e7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_aw_aw, 0xffff, 0x11f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_aw_al, 0xffff, 0x11f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_aw_pcdi, 0xffff, 0x11fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_aw_pcix, 0xffff, 0x11fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_aw_i, 0xffff, 0x11fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68k_op_move_8_al_pi7, 0xffff, 0x13df, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_move_8_al_pd7, 0xffff, 0x13e7, { 22, 22, 11, 11, 11, 11, 6}}, + {m68k_op_move_8_al_aw, 0xffff, 0x13f8, { 24, 24, 10, 10, 10, 10, 6}}, + {m68k_op_move_8_al_al, 0xffff, 0x13f9, { 28, 28, 10, 10, 10, 10, 6}}, + {m68k_op_move_8_al_pcdi, 0xffff, 0x13fa, { 24, 24, 11, 11, 11, 11, 6}}, + {m68k_op_move_8_al_pcix, 0xffff, 0x13fb, { 26, 26, 13, 13, 13, 13, 6}}, + {m68k_op_move_8_al_i, 0xffff, 0x13fc, { 20, 20, 8, 8, 8, 8, 6}}, + {m68k_op_move_8_pi7_pi7, 0xffff, 0x1edf, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi7_pd7, 0xffff, 0x1ee7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi7_aw, 0xffff, 0x1ef8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi7_al, 0xffff, 0x1ef9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_8_pi7_pcdi, 0xffff, 0x1efa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68k_op_move_8_pi7_pcix, 0xffff, 0x1efb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68k_op_move_8_pi7_i, 0xffff, 0x1efc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68k_op_move_8_pd7_pi7, 0xffff, 0x1f1f, { 12, 12, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd7_pd7, 0xffff, 0x1f27, { 14, 14, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd7_aw, 0xffff, 0x1f38, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd7_al, 0xffff, 0x1f39, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_move_8_pd7_pcdi, 0xffff, 0x1f3a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_move_8_pd7_pcix, 0xffff, 0x1f3b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68k_op_move_8_pd7_i, 0xffff, 0x1f3c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68k_op_move_32_aw_aw, 0xffff, 0x21f8, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_aw_al, 0xffff, 0x21f9, { 32, 32, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_aw_pcdi, 0xffff, 0x21fa, { 28, 28, 9, 9, 9, 9, 4}}, + {m68k_op_move_32_aw_pcix, 0xffff, 0x21fb, { 30, 30, 11, 11, 11, 11, 4}}, + {m68k_op_move_32_aw_i, 0xffff, 0x21fc, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_32_al_aw, 0xffff, 0x23f8, { 32, 32, 10, 10, 10, 10, 6}}, + {m68k_op_move_32_al_al, 0xffff, 0x23f9, { 36, 36, 10, 10, 10, 10, 6}}, + {m68k_op_move_32_al_pcdi, 0xffff, 0x23fa, { 32, 32, 11, 11, 11, 11, 6}}, + {m68k_op_move_32_al_pcix, 0xffff, 0x23fb, { 34, 34, 13, 13, 13, 13, 6}}, + {m68k_op_move_32_al_i, 0xffff, 0x23fc, { 28, 28, 10, 10, 10, 10, 6}}, + {m68k_op_move_16_aw_aw, 0xffff, 0x31f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_aw_al, 0xffff, 0x31f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_aw_pcdi, 0xffff, 0x31fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_aw_pcix, 0xffff, 0x31fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_aw_i, 0xffff, 0x31fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68k_op_move_16_al_aw, 0xffff, 0x33f8, { 24, 24, 10, 10, 10, 10, 6}}, + {m68k_op_move_16_al_al, 0xffff, 0x33f9, { 28, 28, 10, 10, 10, 10, 6}}, + {m68k_op_move_16_al_pcdi, 0xffff, 0x33fa, { 24, 24, 11, 11, 11, 11, 6}}, + {m68k_op_move_16_al_pcix, 0xffff, 0x33fb, { 26, 26, 13, 13, 13, 13, 6}}, + {m68k_op_move_16_al_i, 0xffff, 0x33fc, { 20, 20, 8, 8, 8, 8, 6}}, + {m68k_op_negx_8_pi7, 0xffff, 0x401f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_negx_8_pd7, 0xffff, 0x4027, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_negx_8_aw, 0xffff, 0x4038, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_negx_8_al, 0xffff, 0x4039, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_negx_16_aw, 0xffff, 0x4078, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_negx_16_al, 0xffff, 0x4079, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_negx_32_aw, 0xffff, 0x40b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_negx_32_al, 0xffff, 0x40b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_frs_aw, 0xffff, 0x40f8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_frs_al, 0xffff, 0x40f9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68k_op_clr_8_pi7, 0xffff, 0x421f, { 12, 8, 8, 8, 8, 8, 4}}, + {m68k_op_clr_8_pd7, 0xffff, 0x4227, { 14, 10, 9, 9, 9, 9, 4}}, + {m68k_op_clr_8_aw, 0xffff, 0x4238, { 16, 12, 8, 8, 8, 8, 4}}, + {m68k_op_clr_8_al, 0xffff, 0x4239, { 20, 14, 8, 8, 8, 8, 4}}, + {m68k_op_clr_16_aw, 0xffff, 0x4278, { 16, 12, 8, 8, 8, 8, 4}}, + {m68k_op_clr_16_al, 0xffff, 0x4279, { 20, 14, 8, 8, 8, 8, 4}}, + {m68k_op_clr_32_aw, 0xffff, 0x42b8, { 24, 16, 8, 8, 8, 8, 4}}, + {m68k_op_clr_32_al, 0xffff, 0x42b9, { 28, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_frc_aw, 0xffff, 0x42f8, {255, 16, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_frc_al, 0xffff, 0x42f9, {255, 20, 8, 8, 8, 8, 4}}, + {m68k_op_neg_8_pi7, 0xffff, 0x441f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_neg_8_pd7, 0xffff, 0x4427, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_neg_8_aw, 0xffff, 0x4438, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_neg_8_al, 0xffff, 0x4439, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_neg_16_aw, 0xffff, 0x4478, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_neg_16_al, 0xffff, 0x4479, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_neg_32_aw, 0xffff, 0x44b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_neg_32_al, 0xffff, 0x44b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_toc_aw, 0xffff, 0x44f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_toc_al, 0xffff, 0x44f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_toc_pcdi, 0xffff, 0x44fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68k_op_move_16_toc_pcix, 0xffff, 0x44fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68k_op_move_16_toc_i, 0xffff, 0x44fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68k_op_not_8_pi7, 0xffff, 0x461f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_not_8_pd7, 0xffff, 0x4627, { 14, 14, 9, 9, 9, 9, 4}}, + {m68k_op_not_8_aw, 0xffff, 0x4638, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_not_8_al, 0xffff, 0x4639, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_not_16_aw, 0xffff, 0x4678, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_not_16_al, 0xffff, 0x4679, { 20, 20, 8, 8, 8, 8, 4}}, + {m68k_op_not_32_aw, 0xffff, 0x46b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68k_op_not_32_al, 0xffff, 0x46b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68k_op_move_16_tos_aw, 0xffff, 0x46f8, { 20, 20, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_tos_al, 0xffff, 0x46f9, { 24, 24, 12, 12, 12, 12, 8}}, + {m68k_op_move_16_tos_pcdi, 0xffff, 0x46fa, { 20, 20, 13, 13, 13, 13, 8}}, + {m68k_op_move_16_tos_pcix, 0xffff, 0x46fb, { 22, 22, 15, 15, 15, 15, 8}}, + {m68k_op_move_16_tos_i, 0xffff, 0x46fc, { 16, 16, 10, 10, 10, 10, 8}}, + {m68k_op_link_32_a7, 0xffff, 0x480f, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_nbcd_8_pi7, 0xffff, 0x481f, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_nbcd_8_pd7, 0xffff, 0x4827, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_nbcd_8_aw, 0xffff, 0x4838, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_nbcd_8_al, 0xffff, 0x4839, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_pea_32_aw, 0xffff, 0x4878, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_pea_32_al, 0xffff, 0x4879, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_pea_32_pcdi, 0xffff, 0x487a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68k_op_pea_32_pcix, 0xffff, 0x487b, { 20, 20, 12, 12, 12, 12, 5}}, + {m68k_op_movem_16_re_aw, 0xffff, 0x48b8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_movem_16_re_al, 0xffff, 0x48b9, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_movem_32_re_aw, 0xffff, 0x48f8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68k_op_movem_32_re_al, 0xffff, 0x48f9, { 16, 16, 8, 8, 8, 8, 4}}, + {m68k_op_tst_8_pi7, 0xffff, 0x4a1f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68k_op_tst_8_pd7, 0xffff, 0x4a27, { 10, 10, 7, 7, 7, 7, 2}}, + {m68k_op_tst_8_aw, 0xffff, 0x4a38, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_tst_8_al, 0xffff, 0x4a39, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_tst_8_pcdi, 0xffff, 0x4a3a, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_tst_8_pcix, 0xffff, 0x4a3b, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_tst_8_i, 0xffff, 0x4a3c, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_tst_16_aw, 0xffff, 0x4a78, { 12, 12, 6, 6, 6, 6, 2}}, + {m68k_op_tst_16_al, 0xffff, 0x4a79, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_tst_16_pcdi, 0xffff, 0x4a7a, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_tst_16_pcix, 0xffff, 0x4a7b, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_tst_16_i, 0xffff, 0x4a7c, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_tst_32_aw, 0xffff, 0x4ab8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68k_op_tst_32_al, 0xffff, 0x4ab9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68k_op_tst_32_pcdi, 0xffff, 0x4aba, {255, 255, 7, 7, 7, 7, 7}}, + {m68k_op_tst_32_pcix, 0xffff, 0x4abb, {255, 255, 9, 9, 9, 9, 9}}, + {m68k_op_tst_32_i, 0xffff, 0x4abc, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_tas_8_pi7, 0xffff, 0x4adf, { 18, 18, 16, 16, 16, 16, 12}}, + {m68k_op_tas_8_pd7, 0xffff, 0x4ae7, { 20, 20, 17, 17, 17, 17, 12}}, + {m68k_op_tas_8_aw, 0xffff, 0x4af8, { 22, 22, 16, 16, 16, 16, 12}}, + {m68k_op_tas_8_al, 0xffff, 0x4af9, { 26, 26, 16, 16, 16, 16, 12}}, + {m68k_op_illegal, 0xffff, 0x4afc, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_mull_32_aw, 0xffff, 0x4c38, {255, 255, 47, 47, 47, 47, 43}}, + {m68k_op_mull_32_al, 0xffff, 0x4c39, {255, 255, 47, 47, 47, 47, 43}}, + {m68k_op_mull_32_pcdi, 0xffff, 0x4c3a, {255, 255, 48, 48, 48, 48, 43}}, + {m68k_op_mull_32_pcix, 0xffff, 0x4c3b, {255, 255, 50, 50, 50, 50, 43}}, + {m68k_op_mull_32_i, 0xffff, 0x4c3c, {255, 255, 47, 47, 47, 47, 43}}, + {m68k_op_divl_32_aw, 0xffff, 0x4c78, {255, 255, 88, 88, 88, 88, 84}}, + {m68k_op_divl_32_al, 0xffff, 0x4c79, {255, 255, 88, 88, 88, 88, 84}}, + {m68k_op_divl_32_pcdi, 0xffff, 0x4c7a, {255, 255, 89, 89, 89, 89, 84}}, + {m68k_op_divl_32_pcix, 0xffff, 0x4c7b, {255, 255, 91, 91, 91, 91, 84}}, + {m68k_op_divl_32_i, 0xffff, 0x4c7c, {255, 255, 88, 88, 88, 88, 84}}, + {m68k_op_movem_16_er_aw, 0xffff, 0x4cb8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68k_op_movem_16_er_al, 0xffff, 0x4cb9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68k_op_movem_16_er_pcdi, 0xffff, 0x4cba, { 16, 16, 9, 9, 9, 9, 9}}, + {m68k_op_movem_16_er_pcix, 0xffff, 0x4cbb, { 18, 18, 11, 11, 11, 11, 11}}, + {m68k_op_movem_32_er_aw, 0xffff, 0x4cf8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68k_op_movem_32_er_al, 0xffff, 0x4cf9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68k_op_movem_32_er_pcdi, 0xffff, 0x4cfa, { 16, 16, 9, 9, 9, 9, 9}}, + {m68k_op_movem_32_er_pcix, 0xffff, 0x4cfb, { 18, 18, 11, 11, 11, 11, 11}}, + {m68k_op_link_16_a7, 0xffff, 0x4e57, { 16, 16, 5, 5, 5, 5, 5}}, + {m68k_op_unlk_32_a7, 0xffff, 0x4e5f, { 12, 12, 6, 6, 6, 6, 6}}, + {m68k_op_reset, 0xffff, 0x4e70, { 0, 0, 0, 0, 0, 0, 0}}, + {m68k_op_nop, 0xffff, 0x4e71, { 4, 4, 2, 2, 2, 2, 2}}, + {m68k_op_stop, 0xffff, 0x4e72, { 4, 4, 8, 8, 8, 8, 8}}, + {m68k_op_rte_32, 0xffff, 0x4e73, { 20, 24, 20, 20, 20, 20, 20}}, + {m68k_op_rtd_32, 0xffff, 0x4e74, {255, 16, 10, 10, 10, 10, 10}}, + {m68k_op_rts_32, 0xffff, 0x4e75, { 16, 16, 10, 10, 10, 10, 10}}, + {m68k_op_trapv, 0xffff, 0x4e76, { 4, 4, 4, 4, 4, 4, 4}}, + {m68k_op_rtr_32, 0xffff, 0x4e77, { 20, 20, 14, 14, 14, 14, 14}}, + {m68k_op_movec_32_cr, 0xffff, 0x4e7a, {255, 12, 6, 6, 6, 6, 6}}, + {m68k_op_movec_32_rc, 0xffff, 0x4e7b, {255, 10, 12, 12, 12, 12, 12}}, + {m68k_op_jsr_32_aw, 0xffff, 0x4eb8, { 18, 18, 4, 4, 4, 4, 0}}, + {m68k_op_jsr_32_al, 0xffff, 0x4eb9, { 20, 20, 4, 4, 4, 4, 0}}, + {m68k_op_jsr_32_pcdi, 0xffff, 0x4eba, { 18, 18, 5, 5, 5, 5, 0}}, + {m68k_op_jsr_32_pcix, 0xffff, 0x4ebb, { 22, 22, 7, 7, 7, 7, 0}}, + {m68k_op_jmp_32_aw, 0xffff, 0x4ef8, { 10, 10, 4, 4, 4, 4, 0}}, + {m68k_op_jmp_32_al, 0xffff, 0x4ef9, { 12, 12, 4, 4, 4, 4, 0}}, + {m68k_op_jmp_32_pcdi, 0xffff, 0x4efa, { 10, 10, 5, 5, 5, 5, 0}}, + {m68k_op_jmp_32_pcix, 0xffff, 0x4efb, { 14, 14, 7, 7, 7, 7, 0}}, + {m68k_op_st_8_pi7, 0xffff, 0x50df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_st_8_pd7, 0xffff, 0x50e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_st_8_aw, 0xffff, 0x50f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_st_8_al, 0xffff, 0x50f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapt_16, 0xffff, 0x50fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapt_32, 0xffff, 0x50fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapt, 0xffff, 0x50fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sf_8_pi7, 0xffff, 0x51df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sf_8_pd7, 0xffff, 0x51e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sf_8_aw, 0xffff, 0x51f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sf_8_al, 0xffff, 0x51f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapf_16, 0xffff, 0x51fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapf_32, 0xffff, 0x51fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapf, 0xffff, 0x51fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_shi_8_pi7, 0xffff, 0x52df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_shi_8_pd7, 0xffff, 0x52e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_shi_8_aw, 0xffff, 0x52f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_shi_8_al, 0xffff, 0x52f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_traphi_16, 0xffff, 0x52fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_traphi_32, 0xffff, 0x52fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_traphi, 0xffff, 0x52fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sls_8_pi7, 0xffff, 0x53df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sls_8_pd7, 0xffff, 0x53e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sls_8_aw, 0xffff, 0x53f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sls_8_al, 0xffff, 0x53f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapls_16, 0xffff, 0x53fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapls_32, 0xffff, 0x53fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapls, 0xffff, 0x53fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_scc_8_pi7, 0xffff, 0x54df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scc_8_pd7, 0xffff, 0x54e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_scc_8_aw, 0xffff, 0x54f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_scc_8_al, 0xffff, 0x54f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapcc_16, 0xffff, 0x54fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapcc_32, 0xffff, 0x54fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapcc, 0xffff, 0x54fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_scs_8_pi7, 0xffff, 0x55df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_scs_8_pd7, 0xffff, 0x55e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_scs_8_aw, 0xffff, 0x55f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_scs_8_al, 0xffff, 0x55f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapcs_16, 0xffff, 0x55fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapcs_32, 0xffff, 0x55fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapcs, 0xffff, 0x55fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sne_8_pi7, 0xffff, 0x56df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sne_8_pd7, 0xffff, 0x56e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sne_8_aw, 0xffff, 0x56f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sne_8_al, 0xffff, 0x56f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapne_16, 0xffff, 0x56fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapne_32, 0xffff, 0x56fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapne, 0xffff, 0x56fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_seq_8_pi7, 0xffff, 0x57df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_seq_8_pd7, 0xffff, 0x57e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_seq_8_aw, 0xffff, 0x57f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_seq_8_al, 0xffff, 0x57f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapeq_16, 0xffff, 0x57fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapeq_32, 0xffff, 0x57fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapeq, 0xffff, 0x57fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_svc_8_pi7, 0xffff, 0x58df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svc_8_pd7, 0xffff, 0x58e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_svc_8_aw, 0xffff, 0x58f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_svc_8_al, 0xffff, 0x58f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapvc_16, 0xffff, 0x58fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapvc_32, 0xffff, 0x58fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapvc, 0xffff, 0x58fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_svs_8_pi7, 0xffff, 0x59df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_svs_8_pd7, 0xffff, 0x59e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_svs_8_aw, 0xffff, 0x59f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_svs_8_al, 0xffff, 0x59f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapvs_16, 0xffff, 0x59fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapvs_32, 0xffff, 0x59fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapvs, 0xffff, 0x59fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_spl_8_pi7, 0xffff, 0x5adf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_spl_8_pd7, 0xffff, 0x5ae7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_spl_8_aw, 0xffff, 0x5af8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_spl_8_al, 0xffff, 0x5af9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trappl_16, 0xffff, 0x5afa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trappl_32, 0xffff, 0x5afb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trappl, 0xffff, 0x5afc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_smi_8_pi7, 0xffff, 0x5bdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_smi_8_pd7, 0xffff, 0x5be7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_smi_8_aw, 0xffff, 0x5bf8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_smi_8_al, 0xffff, 0x5bf9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapmi_16, 0xffff, 0x5bfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapmi_32, 0xffff, 0x5bfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapmi, 0xffff, 0x5bfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sge_8_pi7, 0xffff, 0x5cdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sge_8_pd7, 0xffff, 0x5ce7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sge_8_aw, 0xffff, 0x5cf8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sge_8_al, 0xffff, 0x5cf9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapge_16, 0xffff, 0x5cfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapge_32, 0xffff, 0x5cfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapge, 0xffff, 0x5cfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_slt_8_pi7, 0xffff, 0x5ddf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_slt_8_pd7, 0xffff, 0x5de7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_slt_8_aw, 0xffff, 0x5df8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_slt_8_al, 0xffff, 0x5df9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_traplt_16, 0xffff, 0x5dfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_traplt_32, 0xffff, 0x5dfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_traplt, 0xffff, 0x5dfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sgt_8_pi7, 0xffff, 0x5edf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sgt_8_pd7, 0xffff, 0x5ee7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sgt_8_aw, 0xffff, 0x5ef8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sgt_8_al, 0xffff, 0x5ef9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_trapgt_16, 0xffff, 0x5efa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_trapgt_32, 0xffff, 0x5efb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_trapgt, 0xffff, 0x5efc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_sle_8_pi7, 0xffff, 0x5fdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68k_op_sle_8_pd7, 0xffff, 0x5fe7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68k_op_sle_8_aw, 0xffff, 0x5ff8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_sle_8_al, 0xffff, 0x5ff9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_traple_16, 0xffff, 0x5ffa, {255, 255, 6, 6, 6, 6, 6}}, + {m68k_op_traple_32, 0xffff, 0x5ffb, {255, 255, 8, 8, 8, 8, 8}}, + {m68k_op_traple, 0xffff, 0x5ffc, {255, 255, 4, 4, 4, 4, 4}}, + {m68k_op_bra_16, 0xffff, 0x6000, { 10, 10, 10, 10, 10, 10, 10}}, + {m68k_op_bra_32, 0xffff, 0x60ff, { 10, 10, 10, 10, 10, 10, 10}}, + {m68k_op_bsr_16, 0xffff, 0x6100, { 18, 18, 7, 7, 7, 7, 7}}, + {m68k_op_bsr_32, 0xffff, 0x61ff, { 18, 18, 7, 7, 7, 7, 7}}, + {m68k_op_bhi_16, 0xffff, 0x6200, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bhi_32, 0xffff, 0x62ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bls_16, 0xffff, 0x6300, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bls_32, 0xffff, 0x63ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcc_16, 0xffff, 0x6400, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcc_32, 0xffff, 0x64ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcs_16, 0xffff, 0x6500, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bcs_32, 0xffff, 0x65ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bne_16, 0xffff, 0x6600, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bne_32, 0xffff, 0x66ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_beq_16, 0xffff, 0x6700, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_beq_32, 0xffff, 0x67ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvc_16, 0xffff, 0x6800, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvc_32, 0xffff, 0x68ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvs_16, 0xffff, 0x6900, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bvs_32, 0xffff, 0x69ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bpl_16, 0xffff, 0x6a00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bpl_32, 0xffff, 0x6aff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bmi_16, 0xffff, 0x6b00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bmi_32, 0xffff, 0x6bff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bge_16, 0xffff, 0x6c00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bge_32, 0xffff, 0x6cff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_blt_16, 0xffff, 0x6d00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_blt_32, 0xffff, 0x6dff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bgt_16, 0xffff, 0x6e00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_bgt_32, 0xffff, 0x6eff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_ble_16, 0xffff, 0x6f00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_ble_32, 0xffff, 0x6fff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68k_op_sbcd_8_mm_axy7, 0xffff, 0x8f0f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_pack_16_mm_axy7, 0xffff, 0x8f4f, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_unpk_16_mm_axy7, 0xffff, 0x8f8f, {255, 255, 13, 13, 13, 13, 13}}, + {m68k_op_subx_8_mm_axy7, 0xffff, 0x9f0f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_cmpm_8_axy7, 0xffff, 0xbf0f, { 12, 12, 9, 9, 9, 9, 9}}, + {m68k_op_abcd_8_mm_axy7, 0xffff, 0xcf0f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68k_op_addx_8_mm_axy7, 0xffff, 0xdf0f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68k_op_asr_16_aw, 0xffff, 0xe0f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_asr_16_al, 0xffff, 0xe0f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_asl_16_aw, 0xffff, 0xe1f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68k_op_asl_16_al, 0xffff, 0xe1f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68k_op_lsr_16_aw, 0xffff, 0xe2f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_lsr_16_al, 0xffff, 0xe2f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_lsl_16_aw, 0xffff, 0xe3f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_lsl_16_al, 0xffff, 0xe3f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_roxr_16_aw, 0xffff, 0xe4f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_roxr_16_al, 0xffff, 0xe4f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_roxl_16_aw, 0xffff, 0xe5f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68k_op_roxl_16_al, 0xffff, 0xe5f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68k_op_ror_16_aw, 0xffff, 0xe6f8, { 16, 16, 11, 11, 11, 11, 7}}, + {m68k_op_ror_16_al, 0xffff, 0xe6f9, { 20, 20, 11, 11, 11, 11, 7}}, + {m68k_op_rol_16_aw, 0xffff, 0xe7f8, { 16, 16, 11, 11, 11, 11, 7}}, + {m68k_op_rol_16_al, 0xffff, 0xe7f9, { 20, 20, 11, 11, 11, 11, 7}}, + {m68k_op_bftst_32_aw, 0xffff, 0xe8f8, {255, 255, 17, 17, 17, 17, 13}}, + {m68k_op_bftst_32_al, 0xffff, 0xe8f9, {255, 255, 17, 17, 17, 17, 13}}, + {m68k_op_bftst_32_pcdi, 0xffff, 0xe8fa, {255, 255, 18, 18, 18, 18, 13}}, + {m68k_op_bftst_32_pcix, 0xffff, 0xe8fb, {255, 255, 20, 20, 20, 20, 13}}, + {m68k_op_bfextu_32_aw, 0xffff, 0xe9f8, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfextu_32_al, 0xffff, 0xe9f9, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfextu_32_pcdi, 0xffff, 0xe9fa, {255, 255, 20, 20, 20, 20, 15}}, + {m68k_op_bfextu_32_pcix, 0xffff, 0xe9fb, {255, 255, 22, 22, 22, 22, 15}}, + {m68k_op_bfchg_32_aw, 0xffff, 0xeaf8, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfchg_32_al, 0xffff, 0xeaf9, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfexts_32_aw, 0xffff, 0xebf8, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfexts_32_al, 0xffff, 0xebf9, {255, 255, 19, 19, 19, 19, 15}}, + {m68k_op_bfexts_32_pcdi, 0xffff, 0xebfa, {255, 255, 20, 20, 20, 20, 15}}, + {m68k_op_bfexts_32_pcix, 0xffff, 0xebfb, {255, 255, 22, 22, 22, 22, 15}}, + {m68k_op_bfclr_32_aw, 0xffff, 0xecf8, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfclr_32_al, 0xffff, 0xecf9, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfffo_32_aw, 0xffff, 0xedf8, {255, 255, 32, 32, 32, 32, 28}}, + {m68k_op_bfffo_32_al, 0xffff, 0xedf9, {255, 255, 32, 32, 32, 32, 28}}, + {m68k_op_bfffo_32_pcdi, 0xffff, 0xedfa, {255, 255, 33, 33, 33, 33, 28}}, + {m68k_op_bfffo_32_pcix, 0xffff, 0xedfb, {255, 255, 35, 35, 35, 35, 28}}, + {m68k_op_bfset_32_aw, 0xffff, 0xeef8, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfset_32_al, 0xffff, 0xeef9, {255, 255, 24, 24, 24, 24, 20}}, + {m68k_op_bfins_32_aw, 0xffff, 0xeff8, {255, 255, 21, 21, 21, 21, 17}}, + {m68k_op_bfins_32_al, 0xffff, 0xeff9, {255, 255, 21, 21, 21, 21, 17}}, + {NULL, 0, 0, {0, 0, 0, 0, 0}} +}; + + +/* Build the opcode handler jump table */ + +static void m68ki_set_one(unsigned short opcode, const opcode_handler_struct *s) +{ + for(int i=0; icycles[i] != 0xff) { + m68ki_cycles[i][opcode] = s->cycles[i]; + m68ki_instruction_jump_table[i][opcode] = s->opcode_handler; + } +} + +void m68ki_build_opcode_table(void) +{ + const opcode_handler_struct *ostruct; + int i; + int j; + int k; + + for(i = 0; i < 0x10000; i++) + { + /* default to illegal */ + for(k=0;kmask != 0xff00) + { + for(i = 0;i < 0x10000;i++) + { + if((i & ostruct->mask) == ostruct->match) + m68ki_set_one(i, ostruct); + } + ostruct++; + } + while(ostruct->mask == 0xff00) + { + for(i = 0;i <= 0xff;i++) + m68ki_set_one(ostruct->match | i, ostruct); + ostruct++; + } + while(ostruct->mask == 0xff20) + { + for(i = 0;i < 4;i++) + { + for(j = 0;j < 32;j++) + { + m68ki_set_one(ostruct->match | (i << 6) | j, ostruct); + } + } + ostruct++; + } + while(ostruct->mask == 0xf1f8) + { + for(i = 0;i < 8;i++) + { + for(j = 0;j < 8;j++) + m68ki_set_one(ostruct->match | (i << 9) | j, ostruct); + } + ostruct++; + } + while(ostruct->mask == 0xffd8) + { + for(i = 0;i < 2;i++) + { + for(j = 0;j < 8;j++) + { + m68ki_set_one(ostruct->match | (i << 5) | j, ostruct); + } + } + ostruct++; + } + while(ostruct->mask == 0xfff0) + { + for(i = 0;i <= 0x0f;i++) + m68ki_set_one(ostruct->match | i, ostruct); + ostruct++; + } + while(ostruct->mask == 0xf1ff) + { + for(i = 0;i <= 0x07;i++) + m68ki_set_one(ostruct->match | (i << 9), ostruct); + ostruct++; + } + while(ostruct->mask == 0xfff8) + { + for(i = 0;i <= 0x07;i++) + m68ki_set_one(ostruct->match | i, ostruct); + ostruct++; + } + while(ostruct->mask == 0xffff) + { + m68ki_set_one(ostruct->match, ostruct); + ostruct++; + } + + // if we fell all the way through with a non-zero mask, the opcode table wasn't built properly + if (ostruct->mask != 0) + { + fatal_error("m68ki_build_opcode_table: unhandled opcode mask %x (match %x), m68k core will not function!\n", ostruct->mask, ostruct->match); + } +} + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + + diff -r 8a29c250f352 -r 8fe162bdb038 musashi/m68kops.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/musashi/m68kops.h Fri Mar 01 14:17:29 2019 -0800 @@ -0,0 +1,1995 @@ +// license:BSD-3-Clause +// copyright-holders:Karl Stenerud +/* ======================================================================== */ +/* ============================ OPCODE HANDLERS =========================== */ +/* ======================================================================== */ + + +#ifdef OPCODE_PROTOTYPES + +static void m68k_op_1010(m68000_base_device* mc68kcpu); +static void m68k_op_1111(m68000_base_device* mc68kcpu); +static void m68k_op_040fpu0_32(m68000_base_device* mc68kcpu); +static void m68k_op_040fpu1_32(m68000_base_device* mc68kcpu); +static void m68k_op_abcd_8_rr(m68000_base_device* mc68kcpu); +static void m68k_op_abcd_8_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_abcd_8_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_abcd_8_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_abcd_8_mm(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_a(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_a(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_8_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_16_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_add_32_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_adda_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_adda_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addi_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addi_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addq_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addq_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_addq_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_addx_8_rr(m68000_base_device* mc68kcpu); +static void m68k_op_addx_16_rr(m68000_base_device* mc68kcpu); +static void m68k_op_addx_32_rr(m68000_base_device* mc68kcpu); +static void m68k_op_addx_8_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_addx_8_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_addx_8_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_addx_8_mm(m68000_base_device* mc68kcpu); +static void m68k_op_addx_16_mm(m68000_base_device* mc68kcpu); +static void m68k_op_addx_32_mm(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_8_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_16_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_and_32_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_andi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_andi_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_toc(m68000_base_device* mc68kcpu); +static void m68k_op_andi_16_tos(m68000_base_device* mc68kcpu); +static void m68k_op_asr_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_asr_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_asr_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_asr_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_asr_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_asl_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_asl_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_asl_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_asl_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_asl_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_bhi_8(m68000_base_device* mc68kcpu); +static void m68k_op_bls_8(m68000_base_device* mc68kcpu); +static void m68k_op_bcc_8(m68000_base_device* mc68kcpu); +static void m68k_op_bcs_8(m68000_base_device* mc68kcpu); +static void m68k_op_bne_8(m68000_base_device* mc68kcpu); +static void m68k_op_beq_8(m68000_base_device* mc68kcpu); +static void m68k_op_bvc_8(m68000_base_device* mc68kcpu); +static void m68k_op_bvs_8(m68000_base_device* mc68kcpu); +static void m68k_op_bpl_8(m68000_base_device* mc68kcpu); +static void m68k_op_bmi_8(m68000_base_device* mc68kcpu); +static void m68k_op_bge_8(m68000_base_device* mc68kcpu); +static void m68k_op_blt_8(m68000_base_device* mc68kcpu); +static void m68k_op_bgt_8(m68000_base_device* mc68kcpu); +static void m68k_op_ble_8(m68000_base_device* mc68kcpu); +static void m68k_op_bhi_16(m68000_base_device* mc68kcpu); +static void m68k_op_bls_16(m68000_base_device* mc68kcpu); +static void m68k_op_bcc_16(m68000_base_device* mc68kcpu); +static void m68k_op_bcs_16(m68000_base_device* mc68kcpu); +static void m68k_op_bne_16(m68000_base_device* mc68kcpu); +static void m68k_op_beq_16(m68000_base_device* mc68kcpu); +static void m68k_op_bvc_16(m68000_base_device* mc68kcpu); +static void m68k_op_bvs_16(m68000_base_device* mc68kcpu); +static void m68k_op_bpl_16(m68000_base_device* mc68kcpu); +static void m68k_op_bmi_16(m68000_base_device* mc68kcpu); +static void m68k_op_bge_16(m68000_base_device* mc68kcpu); +static void m68k_op_blt_16(m68000_base_device* mc68kcpu); +static void m68k_op_bgt_16(m68000_base_device* mc68kcpu); +static void m68k_op_ble_16(m68000_base_device* mc68kcpu); +static void m68k_op_bhi_32(m68000_base_device* mc68kcpu); +static void m68k_op_bls_32(m68000_base_device* mc68kcpu); +static void m68k_op_bcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_bcs_32(m68000_base_device* mc68kcpu); +static void m68k_op_bne_32(m68000_base_device* mc68kcpu); +static void m68k_op_beq_32(m68000_base_device* mc68kcpu); +static void m68k_op_bvc_32(m68000_base_device* mc68kcpu); +static void m68k_op_bvs_32(m68000_base_device* mc68kcpu); +static void m68k_op_bpl_32(m68000_base_device* mc68kcpu); +static void m68k_op_bmi_32(m68000_base_device* mc68kcpu); +static void m68k_op_bge_32(m68000_base_device* mc68kcpu); +static void m68k_op_blt_32(m68000_base_device* mc68kcpu); +static void m68k_op_bgt_32(m68000_base_device* mc68kcpu); +static void m68k_op_ble_32(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_32_r_d(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_di(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_r_al(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_32_s_d(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_di(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bchg_8_s_al(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_32_r_d(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_di(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_r_al(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_32_s_d(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_di(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bclr_8_s_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfchg_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfclr_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_bfexts_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_bfextu_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_bfffo_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfins_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bfset_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_bftst_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_bkpt(m68000_base_device* mc68kcpu); +static void m68k_op_bra_8(m68000_base_device* mc68kcpu); +static void m68k_op_bra_16(m68000_base_device* mc68kcpu); +static void m68k_op_bra_32(m68000_base_device* mc68kcpu); +static void m68k_op_bset_32_r_d(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_di(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_r_al(m68000_base_device* mc68kcpu); +static void m68k_op_bset_32_s_d(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_ai(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_pi(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_pd(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_di(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_ix(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_aw(m68000_base_device* mc68kcpu); +static void m68k_op_bset_8_s_al(m68000_base_device* mc68kcpu); +static void m68k_op_bsr_8(m68000_base_device* mc68kcpu); +static void m68k_op_bsr_16(m68000_base_device* mc68kcpu); +static void m68k_op_bsr_32(m68000_base_device* mc68kcpu); +static void m68k_op_btst_32_r_d(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_ai(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pi(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pd(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_di(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_ix(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_aw(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_al(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_r_i(m68000_base_device* mc68kcpu); +static void m68k_op_btst_32_s_d(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_ai(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pi(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pd(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_di(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_ix(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_aw(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_al(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_btst_8_s_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_callm_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cas_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cas_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cas_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_cas2_16(m68000_base_device* mc68kcpu); +static void m68k_op_cas2_32(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_chk_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_chk_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_chk2cmp2_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_clr_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_clr_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_clr_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_8_i(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmp_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpa_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_8_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_cmpi_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_8_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_8_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_8_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_8(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_16(m68000_base_device* mc68kcpu); +static void m68k_op_cmpm_32(m68000_base_device* mc68kcpu); +static void m68k_op_cpbcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_cpdbcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_cpgen_32(m68000_base_device* mc68kcpu); +static void m68k_op_cpscc_32(m68000_base_device* mc68kcpu); +static void m68k_op_cptrapcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_ftrapcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_dbt_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbf_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbhi_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbls_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbcc_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbcs_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbne_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbeq_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbvc_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbvs_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbpl_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbmi_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbge_16(m68000_base_device* mc68kcpu); +static void m68k_op_dblt_16(m68000_base_device* mc68kcpu); +static void m68k_op_dbgt_16(m68000_base_device* mc68kcpu); +static void m68k_op_dble_16(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_divs_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_divu_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_divl_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eor_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eor_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eor_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eori_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_eori_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_toc(m68000_base_device* mc68kcpu); +static void m68k_op_eori_16_tos(m68000_base_device* mc68kcpu); +static void m68k_op_exg_32_dd(m68000_base_device* mc68kcpu); +static void m68k_op_exg_32_aa(m68000_base_device* mc68kcpu); +static void m68k_op_exg_32_da(m68000_base_device* mc68kcpu); +static void m68k_op_ext_16(m68000_base_device* mc68kcpu); +static void m68k_op_ext_32(m68000_base_device* mc68kcpu); +static void m68k_op_extb_32(m68000_base_device* mc68kcpu); +static void m68k_op_illegal(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_jmp_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_jsr_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_lea_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_link_16_a7(m68000_base_device* mc68kcpu); +static void m68k_op_link_16(m68000_base_device* mc68kcpu); +static void m68k_op_link_32_a7(m68000_base_device* mc68kcpu); +static void m68k_op_link_32(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_lsr_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_lsl_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_d_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ai_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi7_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pi_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd7_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_pd_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_di_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_ix_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_aw_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_8_al_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_d_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ai_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pi_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_pd_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_di_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_ix_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_aw_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_al_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_d_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ai_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pi_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_pd_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_di_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_ix_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_aw_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_a(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_al_i(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_movea_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_movea_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frc_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_toc_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_frs_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_d(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_ai(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_pi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_pd(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_di(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_ix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_aw(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_al(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_move_16_tos_i(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_fru(m68000_base_device* mc68kcpu); +static void m68k_op_move_32_tou(m68000_base_device* mc68kcpu); +static void m68k_op_movec_32_cr(m68000_base_device* mc68kcpu); +static void m68k_op_movec_32_rc(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movem_16_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_movem_32_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_movep_16_re(m68000_base_device* mc68kcpu); +static void m68k_op_movep_32_re(m68000_base_device* mc68kcpu); +static void m68k_op_movep_16_er(m68000_base_device* mc68kcpu); +static void m68k_op_movep_32_er(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_moves_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_moves_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_moves_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_moveq_32(m68000_base_device* mc68kcpu); +static void m68k_op_move16_32(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_muls_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_mulu_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_mull_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_nbcd_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_neg_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_neg_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_neg_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_negx_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_negx_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_negx_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_nop(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_not_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_not_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_not_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_8_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_16_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_or_32_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_ori_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_ori_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_toc(m68000_base_device* mc68kcpu); +static void m68k_op_ori_16_tos(m68000_base_device* mc68kcpu); +static void m68k_op_pack_16_rr(m68000_base_device* mc68kcpu); +static void m68k_op_pack_16_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_pack_16_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_pack_16_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_pack_16_mm(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_pea_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_pflusha_32(m68000_base_device* mc68kcpu); +static void m68k_op_pflushan_32(m68000_base_device* mc68kcpu); +static void m68k_op_pmmu_32(m68000_base_device* mc68kcpu); +static void m68k_op_ptest_32(m68000_base_device* mc68kcpu); +static void m68k_op_reset(m68000_base_device* mc68kcpu); +static void m68k_op_ror_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_ror_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_ror_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_ror_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_ror_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_rol_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_rol_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_rol_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_rol_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_rol_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_roxr_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_8_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_32_s(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_8_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_32_r(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_roxl_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_rtd_32(m68000_base_device* mc68kcpu); +static void m68k_op_rte_32(m68000_base_device* mc68kcpu); +static void m68k_op_rtm_32(m68000_base_device* mc68kcpu); +static void m68k_op_rtr_32(m68000_base_device* mc68kcpu); +static void m68k_op_rts_32(m68000_base_device* mc68kcpu); +static void m68k_op_sbcd_8_rr(m68000_base_device* mc68kcpu); +static void m68k_op_sbcd_8_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_sbcd_8_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_sbcd_8_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_sbcd_8_mm(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_st_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sf_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_shi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sls_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_scc_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_scs_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sne_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_seq_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_svc_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_svs_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_spl_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_smi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sge_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_slt_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sgt_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sle_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_stop(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_a(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_d(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_a(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_al(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_er_i(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_8_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_16_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_ai(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_pi(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_pd(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_di(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_ix(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_aw(m68000_base_device* mc68kcpu); +static void m68k_op_sub_32_re_al(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_suba_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_suba_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subi_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subi_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subi_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subq_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subq_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_subq_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_subx_8_rr(m68000_base_device* mc68kcpu); +static void m68k_op_subx_16_rr(m68000_base_device* mc68kcpu); +static void m68k_op_subx_32_rr(m68000_base_device* mc68kcpu); +static void m68k_op_subx_8_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_subx_8_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_subx_8_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_subx_8_mm(m68000_base_device* mc68kcpu); +static void m68k_op_subx_16_mm(m68000_base_device* mc68kcpu); +static void m68k_op_subx_32_mm(m68000_base_device* mc68kcpu); +static void m68k_op_swap_32(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_tas_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_trap(m68000_base_device* mc68kcpu); +static void m68k_op_trapt(m68000_base_device* mc68kcpu); +static void m68k_op_trapt_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapt_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapf(m68000_base_device* mc68kcpu); +static void m68k_op_trapf_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapf_32(m68000_base_device* mc68kcpu); +static void m68k_op_traphi(m68000_base_device* mc68kcpu); +static void m68k_op_trapls(m68000_base_device* mc68kcpu); +static void m68k_op_trapcc(m68000_base_device* mc68kcpu); +static void m68k_op_trapcs(m68000_base_device* mc68kcpu); +static void m68k_op_trapne(m68000_base_device* mc68kcpu); +static void m68k_op_trapeq(m68000_base_device* mc68kcpu); +static void m68k_op_trapvc(m68000_base_device* mc68kcpu); +static void m68k_op_trapvs(m68000_base_device* mc68kcpu); +static void m68k_op_trappl(m68000_base_device* mc68kcpu); +static void m68k_op_trapmi(m68000_base_device* mc68kcpu); +static void m68k_op_trapge(m68000_base_device* mc68kcpu); +static void m68k_op_traplt(m68000_base_device* mc68kcpu); +static void m68k_op_trapgt(m68000_base_device* mc68kcpu); +static void m68k_op_traple(m68000_base_device* mc68kcpu); +static void m68k_op_traphi_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapls_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapcc_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapcs_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapne_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapeq_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapvc_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapvs_16(m68000_base_device* mc68kcpu); +static void m68k_op_trappl_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapmi_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapge_16(m68000_base_device* mc68kcpu); +static void m68k_op_traplt_16(m68000_base_device* mc68kcpu); +static void m68k_op_trapgt_16(m68000_base_device* mc68kcpu); +static void m68k_op_traple_16(m68000_base_device* mc68kcpu); +static void m68k_op_traphi_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapls_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapcc_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapcs_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapne_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapeq_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapvc_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapvs_32(m68000_base_device* mc68kcpu); +static void m68k_op_trappl_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapmi_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapge_32(m68000_base_device* mc68kcpu); +static void m68k_op_traplt_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapgt_32(m68000_base_device* mc68kcpu); +static void m68k_op_traple_32(m68000_base_device* mc68kcpu); +static void m68k_op_trapv(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_d(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_ai(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pi7(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pd(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pd7(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_di(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_ix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_aw(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_al(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_8_i(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_d(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_a(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_ai(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_pi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_pd(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_di(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_ix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_aw(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_al(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_16_i(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_d(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_a(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_ai(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_pi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_pd(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_di(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_ix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_aw(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_al(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_pcdi(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_pcix(m68000_base_device* mc68kcpu); +static void m68k_op_tst_32_i(m68000_base_device* mc68kcpu); +static void m68k_op_unlk_32_a7(m68000_base_device* mc68kcpu); +static void m68k_op_unlk_32(m68000_base_device* mc68kcpu); +static void m68k_op_unpk_16_rr(m68000_base_device* mc68kcpu); +static void m68k_op_unpk_16_mm_ax7(m68000_base_device* mc68kcpu); +static void m68k_op_unpk_16_mm_ay7(m68000_base_device* mc68kcpu); +static void m68k_op_unpk_16_mm_axy7(m68000_base_device* mc68kcpu); +static void m68k_op_unpk_16_mm(m68000_base_device* mc68kcpu); +static void m68k_op_cinv_32(m68000_base_device* mc68kcpu); +static void m68k_op_cpush_32(m68000_base_device* mc68kcpu); +#else +/* Build the opcode handler table */ +void m68ki_build_opcode_table(void); + +extern void (*m68ki_instruction_jump_table[][0x10000])(m68000_base_device *m68k); /* opcode handler jump table */ +extern unsigned char m68ki_cycles[][0x10000]; + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ + + +#endif diff -r 8a29c250f352 -r 8fe162bdb038 sms.c --- a/sms.c Mon Feb 25 21:22:14 2019 -0800 +++ b/sms.c Fri Mar 01 14:17:29 2019 -0800 @@ -357,7 +357,7 @@ sms_context *sms = (sms_context *)system; char *statepath = get_slot_name(system, slot, "state"); uint8_t ret; -#ifndef NEW_CORE +#if !defined(NEW_CORE) && defined(USE_NATIVE) if (!sms->z80->native_pc) { ret = get_modification_time(statepath) != 0; if (ret) { @@ -381,6 +381,7 @@ render_set_video_standard(VID_NTSC); while (!sms->should_return) { +#ifdef USE_NATIVE if (system->delayed_load_slot) { load_state(system, system->delayed_load_slot - 1); system->delayed_load_slot = 0; @@ -390,6 +391,7 @@ system->enter_debugger = 0; zdebugger(sms->z80, sms->z80->pc); } +#endif #ifdef NEW_CORE if (sms->z80->nmi_cycle == CYCLE_NEVER) { #else @@ -408,6 +410,7 @@ vdp_run_context(sms->vdp, target_cycle); psg_run(sms->psg, target_cycle); +#ifdef USE_NATIVE if (system->save_state) { while (!sms->z80->pc) { //advance Z80 to an instruction boundary @@ -416,6 +419,7 @@ save_state(sms, system->save_state - 1); system->save_state = 0; } +#endif target_cycle += 3420*16; if (target_cycle > 0x10000000) { @@ -458,10 +462,12 @@ load_state_path(sms, statefile); } +#ifdef USE_NATIVE if (system->enter_debugger) { system->enter_debugger = 0; zinsert_breakpoint(sms->z80, sms->z80->pc, (uint8_t *)zdebugger); } +#endif run_sms(system); } @@ -470,8 +476,8 @@ { sms_context *sms = (sms_context *)system; z80_assert_reset(sms->z80, sms->z80->Z80_CYCLE); -#ifndef NEW_CORE - sms->z80->target_cycle = sms->z80->sync_cycle = sms->z80->Z80_CYCLE; +#if !defined(NEW_CORE) && defined(USE_NATIVE) + sms->z80->target_cycle = sms->z80->sync_cycle = sms->z80->current_cycle; #endif } @@ -494,9 +500,11 @@ { sms_context *sms = (sms_context *)system; sms->should_return = 1; +#ifdef USE_NATIVE #ifndef NEW_CORE sms->z80->target_cycle = sms->z80->sync_cycle = sms->z80->Z80_CYCLE; #endif +#endif } static void inc_debug_mode(system_header *system) @@ -654,4 +662,4 @@ sms->header.type = SYSTEM_SMS; return sms; -} \ No newline at end of file +} diff -r 8a29c250f352 -r 8fe162bdb038 sms.h --- a/sms.h Mon Feb 25 21:22:14 2019 -0800 +++ b/sms.h Fri Mar 01 14:17:29 2019 -0800 @@ -7,7 +7,11 @@ #ifdef NEW_CORE #include "z80.h" #else +#ifdef USE_NATIVE #include "z80_to_x86.h" +#else +#include "mame_z80/z80.h" +#endif #endif #include "io.h" diff -r 8a29c250f352 -r 8fe162bdb038 trans.c --- a/trans.c Mon Feb 25 21:22:14 2019 -0800 +++ b/trans.c Fri Mar 01 14:17:29 2019 -0800 @@ -19,10 +19,13 @@ { } +uint64_t total_cycles; + m68k_context * sync_components(m68k_context * context, uint32_t address) { if (context->current_cycle > 0x80000000) { context->current_cycle -= 0x80000000; + total_cycles += 0x80000000; } if (context->status & M68K_STATUS_TRACE || context->trace_pending) { context->target_cycle = context->current_cycle; @@ -33,6 +36,8 @@ m68k_context *reset_handler(m68k_context *context) { m68k_print_regs(context); + total_cycles += context->current_cycle; + printf("%ld cycles\n", total_cycles); exit(0); //unreachable return context; @@ -70,14 +75,15 @@ memmap[1].flags = MMAP_READ | MMAP_WRITE | MMAP_CODE; memmap[1].buffer = malloc(64 * 1024); memset(memmap[1].buffer, 0, 64 * 1024); - init_m68k_opts(&opts, memmap, 2, 1); + init_m68k_opts(&opts, memmap, 2, 7); m68k_context * context = init_68k_context(&opts, reset_handler); context->mem_pointers[0] = memmap[0].buffer; context->mem_pointers[1] = memmap[1].buffer; context->target_cycle = context->sync_cycle = 0x80000000; + /* uint32_t address; address = filebuf[2] << 16 | filebuf[3]; - translate_m68k_stream(address, context); + translate_m68k_stream(address, context);*/ m68k_reset(context); return 0; }