diff options
Diffstat (limited to 'src/devices')
91 files changed, 40990 insertions, 6822 deletions
diff --git a/src/devices/bus/a2bus/a2pic.cpp b/src/devices/bus/a2bus/a2pic.cpp index c16ee6f2140..f47f964f192 100644 --- a/src/devices/bus/a2bus/a2pic.cpp +++ b/src/devices/bus/a2bus/a2pic.cpp @@ -49,11 +49,11 @@ static INPUT_PORTS_START( pic ) PORT_DIPSETTING( 0x06, "13 microseconds" ) PORT_DIPSETTING( 0x07, "15 microseconds" ) - PORT_DIPNAME( 0x08, 0x08, "Strobe polarity (SW4)" ) + PORT_DIPNAME( 0x08, 0x00, "Strobe polarity (SW4)" ) PORT_DIPSETTING( 0x00, "Positive" ) PORT_DIPSETTING( 0x08, "Negative" ) - PORT_DIPNAME( 0x10, 0x10, "Acknowledge polarity (SW5)" ) + PORT_DIPNAME( 0x10, 0x00, "Acknowledge polarity (SW5)" ) PORT_DIPSETTING( 0x00, "Positive" ) PORT_DIPSETTING( 0x10, "Negative" ) @@ -181,27 +181,13 @@ UINT8 a2bus_pic_device::read_cnxx(address_space &space, UINT8 offset) UINT8 a2bus_pic_device::read_c0nx(address_space &space, UINT8 offset) { - UINT8 rv = 0; - switch (offset) { case 3: return m_ctx_data_in->read(); case 4: - rv = m_ack; - - // clear flip-flop - if (m_dsw1->read() & 0x10) // negative polarity - { - m_ack |= 0x80; - } - else - { - m_ack &= ~0x80; - } - - return rv; + return m_ack; case 6: // does reading this really work? m_irqenable = true; diff --git a/src/devices/bus/abcbus/lux10828.cpp b/src/devices/bus/abcbus/lux10828.cpp index e14bdf9a20e..32bc5e619bc 100644 --- a/src/devices/bus/abcbus/lux10828.cpp +++ b/src/devices/bus/abcbus/lux10828.cpp @@ -310,14 +310,14 @@ WRITE_LINE_MEMBER( luxor_55_10828_device::fdc_intrq_w ) m_fdc_irq = state; m_pio->port_b_write(state << 7); - if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, CLEAR_LINE); + if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); } WRITE_LINE_MEMBER( luxor_55_10828_device::fdc_drq_w ) { m_fdc_drq = state; - if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, CLEAR_LINE); + if (state) m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, CLEAR_LINE); } @@ -654,7 +654,7 @@ READ8_MEMBER( luxor_55_10828_device::fdc_r ) { logerror("Z80 WAIT not supported by MAME core\n"); - m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); } return m_fdc->gen_r(offset); @@ -671,7 +671,7 @@ WRITE8_MEMBER( luxor_55_10828_device::fdc_w ) { logerror("Z80 WAIT not supported by MAME core\n"); - m_maincpu->set_input_line(Z80_INPUT_LINE_BOGUSWAIT, ASSERT_LINE); + m_maincpu->set_input_line(Z80_INPUT_LINE_WAIT, ASSERT_LINE); } m_fdc->gen_w(offset, data); diff --git a/src/devices/bus/amiga/zorro/zorro.h b/src/devices/bus/amiga/zorro/zorro.h index 7a37e334ada..fb14b7f09ca 100644 --- a/src/devices/bus/amiga/zorro/zorro.h +++ b/src/devices/bus/amiga/zorro/zorro.h @@ -166,10 +166,8 @@ #define MCFG_EXPANSION_SLOT_ADD(_cputag, _slot_intf, _def_slot) \ MCFG_DEVICE_ADD(EXP_SLOT_TAG, EXP_SLOT, 0) \ - device_t *temp = device; \ zorro_device::set_cputag(*device, _cputag); \ - MCFG_ZORRO_SLOT_ADD(EXP_SLOT_TAG, "slot", _slot_intf, _def_slot) \ - device = temp; + MCFG_ZORRO_SLOT_ADD(EXP_SLOT_TAG, "slot", _slot_intf, _def_slot) // callbacks #define MCFG_EXPANSION_SLOT_OVR_HANDLER(_devcb) \ diff --git a/src/devices/bus/centronics/epson_lx810l.cpp b/src/devices/bus/centronics/epson_lx810l.cpp index 77a130b26bf..fc7d557d928 100644 --- a/src/devices/bus/centronics/epson_lx810l.cpp +++ b/src/devices/bus/centronics/epson_lx810l.cpp @@ -26,7 +26,7 @@ */ #include "epson_lx810l.h" -//extern const char layout_lx800[]; /* use layout from lx800 */ +extern const char layout_lx800[]; /* use layout from lx800 */ //#define LX810LDEBUG #ifdef LX810LDEBUG @@ -132,7 +132,7 @@ static MACHINE_CONFIG_FRAGMENT( epson_lx810l ) MCFG_UPD7810_CO0(WRITELINE(epson_lx810l_t, co0_w)) MCFG_UPD7810_CO1(WRITELINE(epson_lx810l_t, co1_w)) -// MCFG_DEFAULT_LAYOUT(layout_lx800) + MCFG_DEFAULT_LAYOUT(layout_lx800) /* video hardware (simulates paper) */ MCFG_SCREEN_ADD("screen", RASTER) diff --git a/src/devices/bus/isa/3c505.cpp b/src/devices/bus/isa/3c505.cpp index 371526d29ee..2cb640e91d5 100644 --- a/src/devices/bus/isa/3c505.cpp +++ b/src/devices/bus/isa/3c505.cpp @@ -26,6 +26,8 @@ static int verbose = VERBOSE; #define LOG1(d,x) { if (verbose > 0) LOG(d,x)} #define LOG2(d,x) { if (verbose > 1) LOG(d,x)} +#define MAINCPU "maincpu" + #ifdef LSB_FIRST static UINT16 uint16_to_le(UINT16 value) { @@ -422,7 +424,7 @@ const char *threecom3c505_device::cpu_context() { static char statebuf[64]; /* string buffer containing state description */ - device_t *cpu = machine().firstcpu; + device_t *cpu = machine().device(MAINCPU); osd_ticks_t t = osd_ticks(); int s = t / osd_ticks_per_second(); int ms = (t % osd_ticks_per_second()) / 1000; @@ -440,18 +442,6 @@ const char *threecom3c505_device::cpu_context() return statebuf; } -/*------------------------------------------------- - logerror - log an error message (w/o device tags) - -------------------------------------------------*/ - -void threecom3c505_device::logerror(const char *format, ...) const -{ - va_list arg; - va_start(arg, format); - machine().vlogerror(format, arg); - va_end(arg); -} - //************************************************************************** // data_buffer //************************************************************************** @@ -865,8 +855,8 @@ void threecom3c505_device::do_receive_command() void threecom3c505_device::set_command_pending(int state) { - LOG2(this,("set_command_pending %d -> %d m_wait_for_ack=%d m_wait_for_nak=%d m_rx_pending=%d", - m_command_pending, state, m_wait_for_ack, m_wait_for_nak, m_rx_pending)); + LOG2(this,("set_command_pending %d -> %d m_wait_for_ack=%d m_wait_for_nak=%d m_rx_pending=%d%s", + m_command_pending, state, m_wait_for_ack, m_wait_for_nak, m_rx_pending, state ? "" :"\n")); //- verbose = onoff ? 1 : 2; @@ -1667,7 +1657,7 @@ void threecom3c505_device::set_verbose(int on_off) int threecom3c505_device::tx_data(device_t *device, const UINT8 data[], int length) { - LOG1(this,("threecom3c505_device::tx_data length=%d", length)); + LOG1(device,("threecom3c505_device::tx_data length=%d", length)); return 1; } diff --git a/src/devices/bus/isa/3c505.h b/src/devices/bus/isa/3c505.h index 80cdd496a03..e31317792da 100644 --- a/src/devices/bus/isa/3c505.h +++ b/src/devices/bus/isa/3c505.h @@ -143,7 +143,6 @@ protected: virtual int setfilter(device_t *, int); const char *cpu_context(); - void logerror(const char *format, ...) const; // device-level overrides virtual void device_start() override; diff --git a/src/devices/bus/isa/omti8621.cpp b/src/devices/bus/isa/omti8621.cpp index a1379bc229d..5f42c31200b 100644 --- a/src/devices/bus/isa/omti8621.cpp +++ b/src/devices/bus/isa/omti8621.cpp @@ -73,10 +73,6 @@ protected: virtual void device_reset() override; void omti_disk_config(UINT16 disk_type); - -private: - void logerror(const char *format, ...) const; - public: UINT16 m_type; UINT16 m_cylinders; @@ -689,18 +685,6 @@ void omti8621_device::set_esdi_defect_list(UINT8 lun, UINT8 head) memset(disk->m_esdi_defect_list+6, 0xff, 5); // end of defect list } -/*------------------------------------------------- - logerror - log an error message (w/o device tags) - -------------------------------------------------*/ - -void omti8621_device::logerror(const char *format, ...) const -{ - va_list arg; - va_start(arg, format); - machine().vlogerror(format, arg); - va_end(arg); -} - /*************************************************************************** log_command - log command from a command descriptor block ***************************************************************************/ @@ -709,80 +693,83 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length) { if (verbose > 0) { int i; - logerror("%s: OMTI command ", cpu_context(this)); + char sb[100]; + std::string text(cpu_context(this)); + text += ": OMTI command "; switch (cdb[0]) { case OMTI_CMD_TEST_DRIVE_READY: // 0x00 - logerror("Test Drive Ready"); + text += "Test Drive Ready"; break; case OMTI_CMD_RECALIBRATE: // 0x01 - logerror("Recalibrate"); + text += "Recalibrate"; break; case OMTI_CMD_REQUEST_SENSE: // 0x03 - logerror("Request Sense"); + text += "Request Sense"; break; case OMTI_CMD_READ_VERIFY: // 0x05 - logerror("Read Verify"); + text += "Read Verify"; break; case OMTI_CMD_FORMAT_TRACK: // 0x06 - logerror("Format Track"); + text += "Format Track"; break; case OMTI_CMD_FORMAT_BAD_TRACK: // 0x07 - logerror("Format Bad Track"); + text += "Format Bad Track"; break; case OMTI_CMD_READ: // 0x08 - logerror("Read"); + text += "Read"; break; case OMTI_CMD_WRITE: // 0x0A - logerror("Write"); + text += "Write"; break; case OMTI_CMD_SEEK: // 0x0B - logerror("Seek"); + text += "Seek"; break; case OMTI_CMD_READ_SECTOR_BUFFER: // 0x0E - logerror("Read Sector Buffer"); + text += "Read Sector Buffer"; break; case OMTI_CMD_WRITE_SECTOR_BUFFER: // 0x0F - logerror("Write Sector Buffer"); + text += "Write Sector Buffer"; break; case OMTI_CMD_ASSIGN_ALTERNATE_TRACK: // 0x11 - logerror("Assign Alternate Track"); + text += "Assign Alternate Track"; break; case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E - logerror("Read Data to Buffer"); + text += "Read Data to Buffer"; break; case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F - logerror("Write Data from Buffer"); + text += "Write Data from Buffer"; break; case OMTI_CMD_COPY: // 0x20 - logerror("Copy"); + text += "Copy"; break; case OMTI_CMD_READ_ESDI_DEFECT_LIST: // 0x37 - logerror("Read ESDI Defect List"); + text += "Read ESDI Defect List"; break; case OMTI_CMD_RAM_DIAGNOSTICS: // 0xE0 - logerror("RAM. Diagnostic"); + text += "RAM. Diagnostic"; break; case OMTI_CMD_CONTROLLER_INT_DIAGNOSTIC: // 0xE4 - logerror("Controller Int. Diagnostic"); + text += "Controller Int. Diagnostic"; break; case OMTI_CMD_READ_LONG: // 0xE5 - logerror("Read Long"); + text += "Read Long"; break; case OMTI_CMD_WRITE_LONG: // 0xE6 - logerror("Write Long"); + text += "Write Long"; break; case OMTI_CMD_READ_CONFIGURATION: // 0xEC - logerror("Read Configuration"); + text += "Read Configuration"; break; case OMTI_CMD_INVALID_COMMAND: // 0xFF - logerror("Invalid Command"); + text += "Invalid Command"; break; default: - logerror("!!! Unexpected Command !!!"); + text += "!!! Unexpected Command !!!"; } // logerror(" (%02x, length=%02x)", cdb[0], cdb_length); for (i = 0; i < cdb_length; i++) { - logerror(" %02x", cdb[i]); + sprintf(sb, " %02x", cdb[i]); + text += sb; } switch (cdb[0]) { @@ -793,10 +780,12 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length) case OMTI_CMD_READ_DATA_TO_BUFFER: // 0x1E case OMTI_CMD_WRITE_DATA_FROM_BUFFER: // 0x1F case OMTI_CMD_COPY: // 0x20 - logerror(" (diskaddr=%x count=%x)", get_disk_address(cdb), cdb[4]); + sprintf(sb, " (diskaddr=%x count=%x)", get_disk_address(cdb), cdb[4]); + text += sb; break; } - logerror("\n"); + text += "\n"; + logerror(text.c_str()); } } @@ -806,18 +795,25 @@ void omti8621_device::log_command(const UINT8 cdb[], const UINT16 cdb_length) void omti8621_device::log_data() { - if (verbose > 0) { + if (verbose > 0) + { int i; - logerror("%s: OMTI data (length=%02x)", cpu_context(this), + char sb[100]; + sprintf(sb, "%s: OMTI data (length=%02x)", cpu_context(this), data_length); - for (i = 0; i < data_length && i < OMTI_DISK_SECTOR_SIZE; i++) { - logerror(" %02x", data_buffer[i]); + std::string text(sb); + for (i = 0; i < data_length && i < OMTI_DISK_SECTOR_SIZE; i++) + { + sprintf(sb, " %02x", data_buffer[i]); + text += sb; } - if (i < data_length) { - logerror(" ..."); + if (i < data_length) + { + text += " ..."; } - logerror("\n"); + text += "\n"; + logerror(text.c_str()); } } @@ -1355,18 +1351,6 @@ void omti_disk_image_device::omti_disk_config(UINT16 disk_type) } /*------------------------------------------------- - logerror - log an error message (w/o device tags) - -------------------------------------------------*/ - -void omti_disk_image_device::logerror(const char *format, ...) const -{ - va_list arg; - va_start(arg, format); - machine().vlogerror(format, arg); - va_end(arg); -} - -/*------------------------------------------------- device start callback -------------------------------------------------*/ diff --git a/src/devices/bus/isa/omti8621.h b/src/devices/bus/isa/omti8621.h index 7554df8ddf6..04dff836316 100644 --- a/src/devices/bus/isa/omti8621.h +++ b/src/devices/bus/isa/omti8621.h @@ -114,9 +114,6 @@ private: void copy_sectors(INT32 dst_addr, INT32 src_addr, UINT8 count, UINT8 lun); void format_track(const UINT8 * cdb); void set_esdi_defect_list(UINT8 lun, UINT8 head); - - void logerror(const char *format, ...) const; - void log_command(const UINT8 cdb[], const UINT16 cdb_length); void log_data(); void do_command(const UINT8 cdb[], const UINT16 cdb_length); diff --git a/src/devices/bus/isa/sc499.cpp b/src/devices/bus/isa/sc499.cpp index 3d94caa2b2c..4effacb3394 100644 --- a/src/devices/bus/isa/sc499.cpp +++ b/src/devices/bus/isa/sc499.cpp @@ -409,34 +409,13 @@ const char *sc499_device::cpu_context() { static char statebuf[64]; /* string buffer containing state description */ - device_t *cpu = machine().firstcpu; osd_ticks_t t = osd_ticks(); int s = t / osd_ticks_per_second(); int ms = (t % osd_ticks_per_second()) / 1000; - /* if we have an executing CPU, output data */ - if (cpu != nullptr) - { - sprintf(statebuf, "%d.%03d %s pc=%08x - %s", s, ms, cpu->tag(), - cpu->safe_pcbase(), tag()); - } - else - { - sprintf(statebuf, "%d.%03d", s, ms); - } - return statebuf; -} - -/*------------------------------------------------- - logerror - log an error message (w/o device tags) - -------------------------------------------------*/ + sprintf(statebuf, "%d.%03d%s:", s, ms, tag()); -void sc499_device::logerror(const char *format, ...) const -{ - va_list arg; - va_start(arg, format); - machine().vlogerror(format, arg); - va_end(arg); + return statebuf; } /*------------------------------------------------- diff --git a/src/devices/bus/isa/sc499.h b/src/devices/bus/isa/sc499.h index 2b5b1ddaa6a..8c63f810073 100644 --- a/src/devices/bus/isa/sc499.h +++ b/src/devices/bus/isa/sc499.h @@ -80,7 +80,6 @@ private: virtual void eop_w(int state) override; const char *cpu_context(); - void logerror(const char *format, ...) const; void tape_status_clear(UINT16 value); void tape_status_set(UINT16 value); diff --git a/src/devices/bus/m5/rom.cpp b/src/devices/bus/m5/rom.cpp deleted file mode 100644 index bffd33df541..00000000000 --- a/src/devices/bus/m5/rom.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Fabio Priuli -/*********************************************************************************************************** - - - M5 cart emulation - - - ***********************************************************************************************************/ - - -#include "emu.h" -#include "rom.h" - - -//------------------------------------------------- -// m5_rom_device - constructor -//------------------------------------------------- - -const device_type M5_ROM_STD = &device_creator<m5_rom_device>; -const device_type M5_ROM_RAM = &device_creator<m5_ram_device>; - - -m5_rom_device::m5_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) - : device_t(mconfig, type, name, tag, owner, clock, shortname, source), - device_m5_cart_interface( mconfig, *this ) -{ -} - -m5_rom_device::m5_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, M5_ROM_STD, "M5 Standard ROM Carts", tag, owner, clock, "m5_rom", __FILE__), - device_m5_cart_interface( mconfig, *this ) -{ -} - - -m5_ram_device::m5_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : m5_rom_device(mconfig, M5_ROM_RAM, "M5 Expansion memory cart", tag, owner, clock, "m5_ram", __FILE__) -{ -} - - -/*------------------------------------------------- - mapper specific handlers - -------------------------------------------------*/ - -READ8_MEMBER(m5_rom_device::read_rom) -{ - if (offset < m_rom_size) - return m_rom[offset]; - else - return 0xff; -} - -READ8_MEMBER(m5_ram_device::read_ram) -{ - return m_ram[offset]; -} - -WRITE8_MEMBER(m5_ram_device::write_ram) -{ - m_ram[offset] = data; -} diff --git a/src/devices/bus/m5/rom.h b/src/devices/bus/m5/rom.h deleted file mode 100644 index dedd7555f1c..00000000000 --- a/src/devices/bus/m5/rom.h +++ /dev/null @@ -1,50 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Fabio Priuli -#ifndef __M5_ROM_H -#define __M5_ROM_H - -#include "slot.h" - - -// ======================> m5_rom_device - -class m5_rom_device : public device_t, - public device_m5_cart_interface -{ -public: - // construction/destruction - m5_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); - m5_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // device-level overrides - virtual void device_start() override {} - virtual void device_reset() override {} - - // reading and writing - virtual DECLARE_READ8_MEMBER(read_rom) override; -}; - -// ======================> m5_ram_device - -class m5_ram_device : public m5_rom_device -{ -public: - // construction/destruction - m5_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // device-level overrides - virtual void device_start() override {} - virtual void device_reset() override {} - - // reading and writing - virtual DECLARE_READ8_MEMBER(read_ram) override; - virtual DECLARE_WRITE8_MEMBER(write_ram) override; -}; - - -// device type definition -extern const device_type M5_ROM_STD; -extern const device_type M5_ROM_RAM; - - -#endif diff --git a/src/devices/bus/m5/slot.cpp b/src/devices/bus/m5/slot.cpp deleted file mode 100644 index 162d802136e..00000000000 --- a/src/devices/bus/m5/slot.cpp +++ /dev/null @@ -1,276 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Fabio Priuli -/*********************************************************************************************************** - - M5 cart emulation - (through slot devices) - - ***********************************************************************************************************/ - - -#include "emu.h" -#include "slot.h" - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -const device_type M5_CART_SLOT = &device_creator<m5_cart_slot_device>; - -//************************************************************************** -// M5 Cartridges Interface -//************************************************************************** - -//------------------------------------------------- -// device_m5_cart_interface - constructor -//------------------------------------------------- - -device_m5_cart_interface::device_m5_cart_interface(const machine_config &mconfig, device_t &device) - : device_slot_card_interface(mconfig, device), - m_rom(NULL), - m_rom_size(0) -{ -} - - -//------------------------------------------------- -// ~device_m5_cart_interface - destructor -//------------------------------------------------- - -device_m5_cart_interface::~device_m5_cart_interface() -{ -} - -//------------------------------------------------- -// rom_alloc - alloc the space for the cart -//------------------------------------------------- - -void device_m5_cart_interface::rom_alloc(UINT32 size, const char *tag) -{ - if (m_rom == NULL) - { - m_rom = device().machine().memory().region_alloc(std::string(tag).append(M5SLOT_ROM_REGION_TAG).c_str(), size, 1, ENDIANNESS_LITTLE)->base(); - m_rom_size = size; - } -} - - -//------------------------------------------------- -// ram_alloc - alloc the space for the ram -//------------------------------------------------- - -void device_m5_cart_interface::ram_alloc(UINT32 size) -{ - m_ram.resize(size); -} - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// m5_cart_slot_device - constructor -//------------------------------------------------- -m5_cart_slot_device::m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, M5_CART_SLOT, "M5 Cartridge Slot", tag, owner, clock, "m5_cart_slot", __FILE__), - device_image_interface(mconfig, *this), - device_slot_interface(mconfig, *this), - m_type(M5_STD), m_cart(nullptr) -{ -} - - -//------------------------------------------------- -// m5_cart_slot_device - destructor -//------------------------------------------------- - -m5_cart_slot_device::~m5_cart_slot_device() -{ -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void m5_cart_slot_device::device_start() -{ - m_cart = dynamic_cast<device_m5_cart_interface *>(get_card_device()); -} - -//------------------------------------------------- -// device_config_complete - perform any -// operations now that the configuration is -// complete -//------------------------------------------------- - -void m5_cart_slot_device::device_config_complete() -{ - // set brief and instance name - update_names(); -} - - -//------------------------------------------------- -// M5 PCB -//------------------------------------------------- - -struct m5_slot -{ - int pcb_id; - const char *slot_option; -}; - -// Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it -static const m5_slot slot_list[] = -{ - {EM_5,"em-5"}, - {MEM64KBI,"64kbi"}, - {MEM64KBF,"64kbf"}, - {MEM64KRX,"64krx"} -}; - -static int m5_get_pcb_id(const char *slot) -{ - for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) - { - if (!core_stricmp(slot_list[i].slot_option, slot)) - return slot_list[i].pcb_id; - } - - return 0; -} - -static const char *m5_get_slot(int type) -{ - for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) - { - if (slot_list[i].pcb_id == type) - return slot_list[i].slot_option; - } - - return "std"; -} - - -/*------------------------------------------------- - call load - -------------------------------------------------*/ - -bool m5_cart_slot_device::call_load() -{ - if (m_cart) - { - m_type=M5_STD; - - if (software_entry() != NULL) - { - const char *pcb_name = get_feature("slot"); - //software_info *name=m_software_info_ptr; - if (pcb_name) //is it ram cart? - m_type = m5_get_pcb_id(m_full_software_name.c_str()); - else - m_type=M5_STD; //standard cart(no feature line in xml) - } - - if (m_type == M5_STD || m_type>2) //carts with roms - { - - UINT32 size = (software_entry() == NULL) ? length() : get_software_region_length("rom"); - - if (size > 0x5000 && m_type == M5_STD) - { - seterror(IMAGE_ERROR_UNSPECIFIED, "Image extends beyond the expected size for an M5 cart"); - return IMAGE_INIT_FAIL; - } - - m_cart->rom_alloc(size, tag()); - - if (software_entry() == NULL) - fread(m_cart->get_rom_base(), size); - else - memcpy(m_cart->get_rom_base(), get_software_region("rom"), size); - - } - if (!M5_STD) - if (get_software_region("ram")) - m_cart->ram_alloc(get_software_region_length("ram")); - - - //printf("Type: %s\n", m5_get_slot(m_type)); - } - - return IMAGE_INIT_PASS; -} - - -/*------------------------------------------------- - call softlist load - -------------------------------------------------*/ - -bool m5_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) -{ - machine().rom_load().load_software_part_region(*this, swlist, swname, start_entry); - return TRUE; -} - - -/*------------------------------------------------- - get default card software - -------------------------------------------------*/ - -std::string m5_cart_slot_device::get_default_card_software() -{ - std::string result; - if (open_image_file(mconfig().options())) - { - const char *slot_string = "std"; - //UINT32 size = core_fsize(m_file); - int type = M5_STD; - - - slot_string = m5_get_slot(type); - - //printf("type: %s\n", slot_string); - clear(); - - result.assign(slot_string); - return result; - } - - return software_get_default_slot("std"); -} - -/*------------------------------------------------- - read - -------------------------------------------------*/ - -READ8_MEMBER(m5_cart_slot_device::read_rom) -{ - if (m_cart) - return m_cart->read_rom(space, offset); - else - return 0xff; -} - -/*------------------------------------------------- - read - -------------------------------------------------*/ - -READ8_MEMBER(m5_cart_slot_device::read_ram) -{ - if (m_cart) - return m_cart->read_ram(space, offset); - else - return 0xff; -} - -/*------------------------------------------------- - write - -------------------------------------------------*/ - -WRITE8_MEMBER(m5_cart_slot_device::write_ram) -{ - if (m_cart) - m_cart->write_ram(space, offset, data); -} diff --git a/src/devices/bus/m5/slot.h b/src/devices/bus/m5/slot.h deleted file mode 100644 index 177977043cf..00000000000 --- a/src/devices/bus/m5/slot.h +++ /dev/null @@ -1,118 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Fabio Priuli -#ifndef __M5_SLOT_H -#define __M5_SLOT_H - -/*************************************************************************** - TYPE DEFINITIONS - ***************************************************************************/ - - -/* PCB */ -enum -{ - EM_5 = 1, - MEM64KBI, - MEM64KBF, - MEM64KRX -}; - - -#define M5_STD 0 - - -// ======================> device_m5_cart_interface - -class device_m5_cart_interface : public device_slot_card_interface -{ -public: - // construction/destruction - device_m5_cart_interface(const machine_config &mconfig, device_t &device); - virtual ~device_m5_cart_interface(); - - // reading and writing - virtual DECLARE_READ8_MEMBER(read_rom) { return 0xff; } - virtual DECLARE_READ8_MEMBER(read_ram) { return 0xff; } - virtual DECLARE_WRITE8_MEMBER(write_ram) {} - - void rom_alloc(UINT32 size, const char *tag); - void ram_alloc(UINT32 size); - UINT8* get_rom_base() { return m_rom; } - UINT8* get_ram_base() { return &m_ram[0]; } - UINT32 get_rom_size() { return m_rom_size; } - UINT32 get_ram_size() { return m_ram.size(); } - - void save_ram() { device().save_item(NAME(m_ram)); } - -protected: - // internal state - UINT8 *m_rom; - UINT32 m_rom_size; - dynamic_buffer m_ram; -}; - - -// ======================> m5_cart_slot_device - -class m5_cart_slot_device : public device_t, - public device_image_interface, - public device_slot_interface -{ -public: - // construction/destruction - m5_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - virtual ~m5_cart_slot_device(); - - // device-level overrides - virtual void device_start() override; - virtual void device_config_complete() override; - - // image-level overrides - virtual bool call_load() override; - virtual void call_unload() override {} - virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) override; - - int get_type() { return m_type; } - - void save_ram() { if (m_cart && m_cart->get_ram_size()) m_cart->save_ram(); } - - virtual iodevice_t image_type() const override { return IO_CARTSLOT; } - virtual bool is_readable() const override { return 1; } - virtual bool is_writeable() const override { return 0; } - virtual bool is_creatable() const override { return 0; } - virtual bool must_be_loaded() const override { return 0; } - virtual bool is_reset_on_load() const override { return 1; } - virtual const option_guide *create_option_guide() const override { return NULL; } - virtual const char *image_interface() const override { return "m5_cart"; } - virtual const char *file_extensions() const override { return "bin,rom"; } - - // slot interface overrides - virtual std::string get_default_card_software() override; - - // reading and writing - virtual DECLARE_READ8_MEMBER(read_rom); - virtual DECLARE_READ8_MEMBER(read_ram); - virtual DECLARE_WRITE8_MEMBER(write_ram); - -protected: - - int m_type; - device_m5_cart_interface* m_cart; -}; - - - -// device type definition -extern const device_type M5_CART_SLOT; - - -/*************************************************************************** - DEVICE CONFIGURATION MACROS - ***************************************************************************/ - -#define M5SLOT_ROM_REGION_TAG ":cart:rom" - -#define MCFG_M5_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ - MCFG_DEVICE_ADD(_tag, M5_CART_SLOT, 0) \ - MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) -#endif diff --git a/src/devices/bus/neogeo/bootleg_prot.cpp b/src/devices/bus/neogeo/bootleg_prot.cpp index 145e17efa0b..8c023f00091 100644 --- a/src/devices/bus/neogeo/bootleg_prot.cpp +++ b/src/devices/bus/neogeo/bootleg_prot.cpp @@ -142,7 +142,8 @@ WRITE16_MEMBER( ngbootleg_prot_device::kof10th_custom_w ) //UINT16 *prom = (UINT16*)m_mainrom; COMBINE_DATA(&m_cartridge_ram2[(0x00000/2) + (offset & 0xFFFF)]); } else { // Write S data on-the-fly - m_fixedrom[offset] = BITSWAP8(data,7,6,0,4,3,2,1,5); + UINT8 *srom = m_fixedrom; + srom[offset] = BITSWAP8(data,7,6,0,4,3,2,1,5); } } @@ -172,7 +173,6 @@ void ngbootleg_prot_device::install_kof10th_protection (cpu_device* maincpu, neo maincpu->space(AS_PROGRAM).install_write_handler(0x240000, 0x2fffff, write16_delegate(FUNC(ngbootleg_prot_device::kof10th_bankswitch_w),this)); memcpy(m_cartridge_ram2, cpurom + 0xe0000, 0x20000); - save_pointer(NAME(m_fixedrom), 0x40000); } void ngbootleg_prot_device::decrypt_kof10th(UINT8* cpurom, UINT32 cpurom_size) diff --git a/src/devices/bus/ti99_peb/bwg.cpp b/src/devices/bus/ti99_peb/bwg.cpp index 4716ccedf8a..4085dcfe230 100644 --- a/src/devices/bus/ti99_peb/bwg.cpp +++ b/src/devices/bus/ti99_peb/bwg.cpp @@ -151,7 +151,7 @@ SETADDRESS_DBIN_MEMBER( snug_bwg_device::setaddress_dbin ) && ((state==ASSERT_LINE && ((m_address & 0x1ff8)==0x1ff0)) // read || (state==CLEAR_LINE && ((m_address & 0x1ff8)==0x1ff8))); // write - m_WDsel = m_WDsel0 && WORD_ALIGNED(m_address); + m_WDsel = m_WDsel0 && ((m_address & 1)==0); // Is the RTC selected on the card? (even addr) m_RTCsel = m_inDsrArea && m_rtc_enabled && ((m_address & 0x1fe1)==0x1fe0); diff --git a/src/devices/bus/ti99_peb/hfdc.cpp b/src/devices/bus/ti99_peb/hfdc.cpp index 46ca7a1b819..c3e4779c1ef 100644 --- a/src/devices/bus/ti99_peb/hfdc.cpp +++ b/src/devices/bus/ti99_peb/hfdc.cpp @@ -232,7 +232,7 @@ READ8Z_MEMBER(myarc_hfdc_device::readz) if (m_dip == CLEAR_LINE) *value = m_buffer_ram[(m_ram_page[bank]<<10) | (m_address & 0x03ff)]; if (TRACE_RAM) { - if (WORD_ALIGNED(m_address)) + if ((m_address & 1)==0) // only show even addresses with words { int valword = (((*value) << 8) | m_buffer_ram[(m_ram_page[bank]<<10) | ((m_address+1) & 0x03ff)])&0xffff; logerror("%s: %04x[%02x] -> %04x\n", tag(), m_address & 0xffff, m_ram_page[bank], valword); @@ -246,7 +246,7 @@ READ8Z_MEMBER(myarc_hfdc_device::readz) *value = m_dsrrom[(m_rom_page << 12) | (m_address & 0x0fff)]; if (TRACE_ROM) { - if (WORD_ALIGNED(m_address)) + if ((m_address & 1)==0) // only show even addresses with words { int valword = (((*value) << 8) | m_dsrrom[(m_rom_page << 12) | ((m_address + 1) & 0x0fff)])&0xffff; logerror("%s: %04x[%02x] -> %04x\n", tag(), m_address & 0xffff, m_rom_page, valword); diff --git a/src/devices/cpu/alto2/alto2cpu.cpp b/src/devices/cpu/alto2/alto2cpu.cpp index 653f56949e5..a3538dee290 100644 --- a/src/devices/cpu/alto2/alto2cpu.cpp +++ b/src/devices/cpu/alto2/alto2cpu.cpp @@ -204,9 +204,7 @@ alto2_cpu_device::alto2_cpu_device(const machine_config& mconfig, const char* ta m_ether_a49(nullptr), m_eth() { - m_ucode_config.m_is_octal = true; - m_const_config.m_is_octal = true; - m_iomem_config.m_is_octal = true; + m_is_octal = true; memset(m_task_mpc, 0x00, sizeof(m_task_mpc)); memset(m_task_next2, 0x00, sizeof(m_task_next2)); memset(m_r, 0x00, sizeof(m_r)); diff --git a/src/devices/cpu/arm/arm.cpp b/src/devices/cpu/arm/arm.cpp index 34dc1635639..41724668f53 100644 --- a/src/devices/cpu/arm/arm.cpp +++ b/src/devices/cpu/arm/arm.cpp @@ -259,7 +259,7 @@ void arm_cpu_device::cpu_write32( int addr, UINT32 data ) { /* Unaligned writes are treated as normal writes */ m_program->write_dword(addr&ADDRESS_MASK,data); - if (ARM_DEBUG_CORE && !DWORD_ALIGNED(addr)) logerror("%08x: Unaligned write %08x\n",R15,addr); + if (ARM_DEBUG_CORE && addr&3) logerror("%08x: Unaligned write %08x\n",R15,addr); } void arm_cpu_device::cpu_write8( int addr, UINT8 data ) @@ -272,9 +272,9 @@ UINT32 arm_cpu_device::cpu_read32( int addr ) UINT32 result = m_program->read_dword(addr&ADDRESS_MASK); /* Unaligned reads rotate the word, they never combine words */ - if (!DWORD_ALIGNED(addr)) + if (addr&3) { - if (ARM_DEBUG_CORE && !WORD_ALIGNED(addr)) + if (ARM_DEBUG_CORE && addr&1) logerror("%08x: Unaligned byte read %08x\n",R15,addr); if ((addr&3)==1) diff --git a/src/devices/cpu/asap/asap.cpp b/src/devices/cpu/asap/asap.cpp index b369ab6d07b..c22d0cdcee2 100644 --- a/src/devices/cpu/asap/asap.cpp +++ b/src/devices/cpu/asap/asap.cpp @@ -364,7 +364,7 @@ inline UINT8 asap_device::readbyte(offs_t address) inline UINT16 asap_device::readword(offs_t address) { // aligned reads are easy - if (WORD_ALIGNED(address)) + if (!(address & 1)) return m_program->read_word(address); // misaligned reads are tricky @@ -379,7 +379,7 @@ inline UINT16 asap_device::readword(offs_t address) inline UINT32 asap_device::readlong(offs_t address) { // aligned reads are easy - if (DWORD_ALIGNED(address)) + if (!(address & 3)) return m_program->read_dword(address); // misaligned reads are tricky @@ -405,7 +405,7 @@ inline void asap_device::writebyte(offs_t address, UINT8 data) inline void asap_device::writeword(offs_t address, UINT16 data) { // aligned writes are easy - if (WORD_ALIGNED(address)) + if (!(address & 1)) { m_program->write_word(address, data); return; @@ -429,7 +429,7 @@ inline void asap_device::writeword(offs_t address, UINT16 data) inline void asap_device::writelong(offs_t address, UINT32 data) { // aligned writes are easy - if (DWORD_ALIGNED(address)) + if (!(address & 3)) { m_program->write_dword(address, data); return; diff --git a/src/devices/cpu/dsp32/dsp32.cpp b/src/devices/cpu/dsp32/dsp32.cpp index 98640f7d1b4..f060e81d13c 100644 --- a/src/devices/cpu/dsp32/dsp32.cpp +++ b/src/devices/cpu/dsp32/dsp32.cpp @@ -452,8 +452,7 @@ inline void dsp32c_device::WBYTE(offs_t addr, UINT8 data) inline UINT16 dsp32c_device::RWORD(offs_t addr) { #if DETECT_MISALIGNED_MEMORY - if (!WORD_ALIGNED(addr)) - osd_printf_error("Unaligned word read @ %06X, PC=%06X\n", addr, PC); + if (addr & 1) fprintf(stderr, "Unaligned word read @ %06X, PC=%06X\n", addr, PC); #endif return m_program->read_word(addr); } @@ -461,8 +460,7 @@ inline UINT16 dsp32c_device::RWORD(offs_t addr) inline UINT32 dsp32c_device::RLONG(offs_t addr) { #if DETECT_MISALIGNED_MEMORY - if (!DWORD_ALIGNED(addr)) - osd_printf_error("Unaligned long read @ %06X, PC=%06X\n", addr, PC); + if (addr & 3) fprintf(stderr, "Unaligned long read @ %06X, PC=%06X\n", addr, PC); #endif return m_program->read_dword(addr); } @@ -470,8 +468,7 @@ inline UINT32 dsp32c_device::RLONG(offs_t addr) inline void dsp32c_device::WWORD(offs_t addr, UINT16 data) { #if DETECT_MISALIGNED_MEMORY - if (!WORD_ALIGNED(addr)) - osd_printf_error("Unaligned word write @ %06X, PC=%06X\n", addr, PC); + if (addr & 1) fprintf(stderr, "Unaligned word write @ %06X, PC=%06X\n", addr, PC); #endif m_program->write_word(addr, data); } @@ -479,8 +476,7 @@ inline void dsp32c_device::WWORD(offs_t addr, UINT16 data) inline void dsp32c_device::WLONG(offs_t addr, UINT32 data) { #if DETECT_MISALIGNED_MEMORY - if (!DWORD_ALIGNED(addr)) - osd_printf_error("Unaligned long write @ %06X, PC=%06X\n", addr, PC); + if (addr & 3) fprintf(stderr, "Unaligned long write @ %06X, PC=%06X\n", addr, PC); #endif m_program->write_dword(addr, data); } diff --git a/src/devices/cpu/h8/h8.cpp b/src/devices/cpu/h8/h8.cpp index ba8b853e9ec..bc78626b00b 100644 --- a/src/devices/cpu/h8/h8.cpp +++ b/src/devices/cpu/h8/h8.cpp @@ -281,7 +281,7 @@ void h8_device::disassemble_am(char *&buffer, int am, offs_t pc, const UINT8 *op "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7", }; - static const char *const r32_names[8] = { + static const char *const r32_names[88] = { "er0", "er1", "er2", "er3", "er4", "er5", "er6", "sp", }; diff --git a/src/devices/cpu/hd61700/hd61700.cpp b/src/devices/cpu/hd61700/hd61700.cpp index 4e8d2c6590d..c786c7235ba 100644 --- a/src/devices/cpu/hd61700/hd61700.cpp +++ b/src/devices/cpu/hd61700/hd61700.cpp @@ -2654,7 +2654,7 @@ void hd61700_cpu_device::execute_run() } //if is in the internal ROM align the pc - if (!WORD_ALIGNED(m_fetch_addr) && m_pc < INT_ROM) + if ((m_fetch_addr&1) && m_pc < INT_ROM) set_pc((m_fetch_addr+1)>>1); m_icount -= 3; @@ -2871,7 +2871,7 @@ inline void hd61700_cpu_device::check_optional_jr(UINT8 arg) { if (arg & 0x80) { - if (m_pc < INT_ROM && WORD_ALIGNED(m_fetch_addr)) read_op(); + if (m_pc < INT_ROM && !(m_fetch_addr&1)) read_op(); UINT8 arg1 = read_op(); diff --git a/src/devices/cpu/hphybrid/hphybrid.cpp b/src/devices/cpu/hphybrid/hphybrid.cpp index 71aec796760..052c7058604 100644 --- a/src/devices/cpu/hphybrid/hphybrid.cpp +++ b/src/devices/cpu/hphybrid/hphybrid.cpp @@ -673,7 +673,12 @@ UINT16 hp_hybrid_cpu_device::RM(UINT32 addr) return RIO(CURRENT_PA , addr_wo_bsc - HP_REG_R4_ADDR); case HP_REG_IV_ADDR: - return m_reg_IV; + // Correct? + if (!BIT(m_flags , HPHYBRID_IRH_SVC_BIT) && !BIT(m_flags , HPHYBRID_IRL_SVC_BIT)) { + return m_reg_IV; + } else { + return m_reg_IV | CURRENT_PA; + } case HP_REG_PA_ADDR: return CURRENT_PA; @@ -1016,7 +1021,7 @@ void hp_hybrid_cpu_device::check_for_interrupts(void) // Do a double-indirect JSM IV,I instruction WM(AEC_CASE_C , ++m_reg_R , m_reg_P); - m_reg_P = RM(AEC_CASE_I , m_reg_IV + CURRENT_PA); + m_reg_P = RM(AEC_CASE_I , RM(HP_REG_IV_ADDR)); m_reg_I = fetch(); } diff --git a/src/devices/cpu/i386/i386.cpp b/src/devices/cpu/i386/i386.cpp index 4f593de3dea..f0d57ada9a0 100644 --- a/src/devices/cpu/i386/i386.cpp +++ b/src/devices/cpu/i386/i386.cpp @@ -41,31 +41,23 @@ const device_type PENTIUM4 = &device_creator<pentium4_device>; i386_device::i386_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : cpu_device(mconfig, I386, "I386", tag, owner, clock, "i386", __FILE__) - , device_vtlb_interface(mconfig, *this, AS_PROGRAM) , m_program_config("program", ENDIANNESS_LITTLE, 32, 32, 0) , m_io_config("io", ENDIANNESS_LITTLE, 32, 16, 0) , m_smiact(*this) { m_program_config.m_logaddr_width = 32; m_program_config.m_page_shift = 12; - - // 32 unified - set_vtlb_dynamic_entries(32); } i386_device::i386_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source, int program_data_width, int program_addr_width, int io_data_width) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, source) - , device_vtlb_interface(mconfig, *this, AS_PROGRAM) , m_program_config("program", ENDIANNESS_LITTLE, program_data_width, program_addr_width, 0) , m_io_config("io", ENDIANNESS_LITTLE, io_data_width, 16, 0) , m_smiact(*this) { m_program_config.m_logaddr_width = 32; m_program_config.m_page_shift = 12; - - // 32 unified - set_vtlb_dynamic_entries(32); } i386SX_device::i386SX_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) @@ -81,15 +73,11 @@ i486_device::i486_device(const machine_config &mconfig, const char *tag, device_ pentium_device::pentium_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : i386_device(mconfig, PENTIUM, "PENTIUM", tag, owner, clock, "pentium", __FILE__) { - // 64 dtlb small, 8 dtlb large, 32 itlb - set_vtlb_dynamic_entries(96); } pentium_device::pentium_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) : i386_device(mconfig, type, name, tag, owner, clock, shortname, source) { - // 64 dtlb small, 8 dtlb large, 32 itlb - set_vtlb_dynamic_entries(96); } mediagx_device::mediagx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) @@ -105,29 +93,21 @@ pentium_pro_device::pentium_pro_device(const machine_config &mconfig, const char pentium_mmx_device::pentium_mmx_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pentium_device(mconfig, PENTIUM_MMX, "Pentium MMX", tag, owner, clock, "pentium_mmx", __FILE__) { - // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large - set_vtlb_dynamic_entries(96); } pentium2_device::pentium2_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pentium_device(mconfig, PENTIUM2, "Pentium II", tag, owner, clock, "pentium2", __FILE__) { - // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large - set_vtlb_dynamic_entries(96); } pentium3_device::pentium3_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pentium_device(mconfig, PENTIUM3, "Pentium III", tag, owner, clock, "pentium3", __FILE__) { - // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large - set_vtlb_dynamic_entries(96); } pentium4_device::pentium4_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : pentium_device(mconfig, PENTIUM4, "Pentium 4", tag, owner, clock, "pentium4", __FILE__) { - // 128 dtlb, 64 itlb - set_vtlb_dynamic_entries(196); } @@ -976,10 +956,10 @@ void i386_device::i386_trap(int irq, int irq_gate, int trap_level) //logerror("IRQ (%08x): Interrupt during V8086 task\n",m_pc); if(type & 0x08) { - PUSH32SEG(m_sreg[GS].selector & 0xffff); - PUSH32SEG(m_sreg[FS].selector & 0xffff); - PUSH32SEG(m_sreg[DS].selector & 0xffff); - PUSH32SEG(m_sreg[ES].selector & 0xffff); + PUSH32(m_sreg[GS].selector & 0xffff); + PUSH32(m_sreg[FS].selector & 0xffff); + PUSH32(m_sreg[DS].selector & 0xffff); + PUSH32(m_sreg[ES].selector & 0xffff); } else { @@ -1001,7 +981,7 @@ void i386_device::i386_trap(int irq, int irq_gate, int trap_level) if(type & 0x08) { // 32-bit gate - PUSH32SEG(oldSS); + PUSH32(oldSS); PUSH32(oldESP); } else @@ -1063,7 +1043,7 @@ void i386_device::i386_trap(int irq, int irq_gate, int trap_level) else { PUSH32(oldflags & 0x00ffffff ); - PUSH32SEG(m_sreg[CS].selector ); + PUSH32(m_sreg[CS].selector ); if(irq == 3 || irq == 4 || irq == 9 || irq_gate == 1) PUSH32(m_eip ); else @@ -1326,7 +1306,7 @@ void i386_device::i386_task_switch(UINT16 selector, UINT8 nested) } m_cr[3] = READ32(tss+0x1c); // CR3 (PDBR) if(oldcr3 != m_cr[3]) - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); /* Set the busy bit in the new task's descriptor */ if(selector & 0x0004) @@ -1935,7 +1915,7 @@ void i386_device::i386_protected_mode_call(UINT16 seg, UINT32 off, int indirect, if(operand32 != 0) { - PUSH32SEG(oldSS); + PUSH32(oldSS); PUSH32(oldESP); } else @@ -2069,7 +2049,7 @@ void i386_device::i386_protected_mode_call(UINT16 seg, UINT32 off, int indirect, else { /* 32-bit operand size */ - PUSH32SEG(m_sreg[CS].selector ); + PUSH32(m_sreg[CS].selector ); PUSH32(m_eip ); m_sreg[CS].selector = selector; m_performed_intersegment_jump = 1; @@ -2364,7 +2344,6 @@ void i386_device::i386_protected_mode_iret(int operand32) I386_SREG desc,stack; UINT8 CPL, RPL, DPL; UINT32 newflags; - UINT8 IOPL = m_IOP1 | (m_IOP2 << 1); CPL = m_CPL; UINT32 ea = i386_translate(SS, (STACK_32BIT)?REG32(ESP):REG16(SP), 0); @@ -2384,7 +2363,7 @@ void i386_device::i386_protected_mode_iret(int operand32) if(V8086_MODE) { UINT32 oldflags = get_flags(); - if(IOPL != 3) + if(!m_IOP1 || !m_IOP2) { logerror("IRET (%08x): Is in Virtual 8086 mode and IOPL != 3.\n",m_pc); FAULT(FAULT_GP,0) @@ -2456,8 +2435,6 @@ void i386_device::i386_protected_mode_iret(int operand32) { UINT32 oldflags = get_flags(); newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); - if(CPL > IOPL) - newflags = (newflags & ~0x200 ) | (oldflags & 0x200); } set_flags(newflags); m_eip = POP32() & 0xffff; // high 16 bits are ignored @@ -2574,7 +2551,7 @@ void i386_device::i386_protected_mode_iret(int operand32) } if((desc.flags & 0x0080) == 0) { - logerror("IRET: (%08x) Return CS segment is not present.\n", m_pc); + logerror("IRET: Return CS segment is not present.\n"); FAULT(FAULT_NP,newCS & ~0x03) } if(newEIP > desc.limit) @@ -2587,8 +2564,6 @@ void i386_device::i386_protected_mode_iret(int operand32) { UINT32 oldflags = get_flags(); newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); - if(CPL > IOPL) - newflags = (newflags & ~0x200 ) | (oldflags & 0x200); } if(operand32 == 0) @@ -2758,8 +2733,6 @@ void i386_device::i386_protected_mode_iret(int operand32) { UINT32 oldflags = get_flags(); newflags = (newflags & ~0x00003000) | (oldflags & 0x00003000); - if(CPL > IOPL) - newflags = (newflags & ~0x200 ) | (oldflags & 0x200); } if(operand32 == 0) @@ -3205,7 +3178,7 @@ void i386_device::i386_postload() CHANGE_PC(m_eip); } -void i386_device::i386_common_init() +void i386_device::i386_common_init(int tlbsize) { int i, j; static const int regs8[8] = {AL,CL,DL,BL,AH,CH,DH,BH}; @@ -3238,6 +3211,7 @@ void i386_device::i386_common_init() m_program = &space(AS_PROGRAM); m_direct = &m_program->direct(); m_io = &space(AS_IO); + m_vtlb = vtlb_alloc(this, AS_PROGRAM, 0, tlbsize); m_smi = false; m_debugger_temp = 0; m_lock = false; @@ -3320,7 +3294,7 @@ void i386_device::i386_common_init() void i386_device::device_start() { - i386_common_init(); + i386_common_init(32); build_opcode_table(OP_I386); m_cycle_table_rm = cycle_table_rm[CPU_CYCLES_I386].get(); @@ -3724,6 +3698,7 @@ void i386_device::zero_state() void i386_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -3756,7 +3731,6 @@ void i386_device::device_reset() // Family 3 (386), Model 0 (DX), Stepping 8 (D1) REG32(EAX) = 0; REG32(EDX) = (3 << 8) | (0 << 4) | (8); - m_cpu_version = REG32(EDX); m_CPL = 0; @@ -3830,7 +3804,7 @@ void i386_device::pentium_smi() WRITE32(REG32(ESI), smram_state+SMRAM_ESI); WRITE32(REG32(EDI), smram_state+SMRAM_EDI); WRITE32(m_eip, smram_state+SMRAM_EIP); - WRITE32(old_flags, smram_state+SMRAM_EFLAGS); + WRITE32(old_flags, smram_state+SMRAM_EAX); WRITE32(m_cr[3], smram_state+SMRAM_CR3); WRITE32(old_cr0, smram_state+SMRAM_CR0); @@ -3916,7 +3890,7 @@ void i386_device::i386_set_a20_line(int state) m_a20_mask = ~(1 << 20); } // TODO: how does A20M and the tlb interact - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); } void i386_device::execute_run() @@ -4002,7 +3976,7 @@ offs_t i386_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *opr void i486_device::device_start() { - i386_common_init(); + i386_common_init(32); build_opcode_table(OP_I386 | OP_FPU | OP_I486); build_x87_opcode_table(); @@ -4015,6 +3989,7 @@ void i486_device::device_start() void i486_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4047,7 +4022,6 @@ void i486_device::device_reset() // Family 4 (486), Model 0/1 (DX), Stepping 3 REG32(EAX) = 0; REG32(EDX) = (4 << 8) | (0 << 4) | (3); - m_cpu_version = REG32(EDX); CHANGE_PC(m_eip); } @@ -4059,7 +4033,8 @@ void i486_device::device_reset() void pentium_device::device_start() { - i386_common_init(); + // 64 dtlb small, 8 dtlb large, 32 itlb + i386_common_init(96); register_state_i386_x87(); build_opcode_table(OP_I386 | OP_FPU | OP_I486 | OP_PENTIUM); @@ -4071,6 +4046,7 @@ void pentium_device::device_start() void pentium_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4131,7 +4107,8 @@ void pentium_device::device_reset() void mediagx_device::device_start() { - i386_common_init(); + // probably 32 unified + i386_common_init(32); register_state_i386_x87(); build_x87_opcode_table(); @@ -4143,6 +4120,7 @@ void mediagx_device::device_start() void mediagx_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4194,7 +4172,8 @@ void mediagx_device::device_reset() void pentium_pro_device::device_start() { - i386_common_init(); + // 64 dtlb small, 32 itlb + i386_common_init(96); register_state_i386_x87(); build_x87_opcode_table(); @@ -4206,6 +4185,7 @@ void pentium_pro_device::device_start() void pentium_pro_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4267,7 +4247,8 @@ void pentium_pro_device::device_reset() void pentium_mmx_device::device_start() { - i386_common_init(); + // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large + i386_common_init(96); register_state_i386_x87(); build_x87_opcode_table(); @@ -4279,6 +4260,7 @@ void pentium_mmx_device::device_start() void pentium_mmx_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4338,7 +4320,8 @@ void pentium_mmx_device::device_reset() void pentium2_device::device_start() { - i386_common_init(); + // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large + i386_common_init(96); register_state_i386_x87(); build_x87_opcode_table(); @@ -4350,6 +4333,7 @@ void pentium2_device::device_start() void pentium2_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4403,7 +4387,8 @@ void pentium2_device::device_reset() void pentium3_device::device_start() { - i386_common_init(); + // 64 dtlb small, 8 dtlb large, 32 itlb small, 2 itlb large + i386_common_init(96); register_state_i386_x87_xmm(); build_x87_opcode_table(); @@ -4415,6 +4400,7 @@ void pentium3_device::device_start() void pentium3_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; @@ -4470,7 +4456,8 @@ void pentium3_device::device_reset() void pentium4_device::device_start() { - i386_common_init(); + // 128 dtlb, 64 itlb + i386_common_init(196); register_state_i386_x87_xmm(); build_x87_opcode_table(); @@ -4482,6 +4469,7 @@ void pentium4_device::device_start() void pentium4_device::device_reset() { zero_state(); + vtlb_flush_dynamic(m_vtlb); m_sreg[CS].selector = 0xf000; m_sreg[CS].base = 0xffff0000; diff --git a/src/devices/cpu/i386/i386.h b/src/devices/cpu/i386/i386.h index 8e64458f228..c9ef38b4280 100644 --- a/src/devices/cpu/i386/i386.h +++ b/src/devices/cpu/i386/i386.h @@ -8,7 +8,7 @@ #include "softfloat/milieu.h" #include "softfloat/softfloat.h" #include "debug/debugcpu.h" -#include "divtlb.h" +#include "cpu/vtlb.h" #define INPUT_LINE_A20 1 @@ -24,7 +24,7 @@ #define X86_NUM_CPUS 4 -class i386_device : public cpu_device, public device_vtlb_interface +class i386_device : public cpu_device { public: // construction/destruction @@ -270,6 +270,8 @@ struct I386_CALL_GATE UINT8 *m_cycle_table_pm; UINT8 *m_cycle_table_rm; + vtlb_state *m_vtlb; + bool m_smm; bool m_smi; bool m_smi_latched; @@ -333,7 +335,6 @@ struct I386_CALL_GATE inline UINT32 DEC32(UINT32 dst); inline void PUSH16(UINT16 value); inline void PUSH32(UINT32 value); - inline void PUSH32SEG(UINT32 value); inline void PUSH8(UINT8 value); inline UINT8 POP8(); inline UINT16 POP16(); @@ -1410,7 +1411,7 @@ struct I386_CALL_GATE void build_x87_opcode_table_df(); void build_x87_opcode_table(); void i386_postload(); - void i386_common_init(); + void i386_common_init(int tlbsize); void build_opcode_table(UINT32 features); void pentium_smi(); void zero_state(); diff --git a/src/devices/cpu/i386/i386op32.inc b/src/devices/cpu/i386/i386op32.inc index 89c7bab44b4..af5358e4bff 100644 --- a/src/devices/cpu/i386/i386op32.inc +++ b/src/devices/cpu/i386/i386op32.inc @@ -475,7 +475,7 @@ void i386_device::i386_call_abs32() // Opcode 0x9a } else { - PUSH32SEG(m_sreg[CS].selector ); + PUSH32(m_sreg[CS].selector ); PUSH32(m_eip ); m_sreg[CS].selector = ptr; m_performed_intersegment_jump = 1; @@ -1717,7 +1717,7 @@ void i386_device::i386_push_cs32() // Opcode 0x0e else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[CS].selector ); + PUSH32(m_sreg[CS].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -1731,7 +1731,7 @@ void i386_device::i386_push_ds32() // Opcode 0x1e else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[DS].selector ); + PUSH32(m_sreg[DS].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -1745,7 +1745,7 @@ void i386_device::i386_push_es32() // Opcode 0x06 else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[ES].selector ); + PUSH32(m_sreg[ES].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -1759,7 +1759,7 @@ void i386_device::i386_push_fs32() // Opcode 0x0f a0 else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[FS].selector ); + PUSH32(m_sreg[FS].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -1773,7 +1773,7 @@ void i386_device::i386_push_gs32() // Opcode 0x0f a8 else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[GS].selector ); + PUSH32(m_sreg[GS].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -1787,7 +1787,7 @@ void i386_device::i386_push_ss32() // Opcode 0x16 else offset = (REG16(SP) - 4) & 0xffff; if(i386_limit_check(SS,offset) == 0) - PUSH32SEG(m_sreg[SS].selector ); + PUSH32(m_sreg[SS].selector ); else FAULT(FAULT_SS,0) CYCLES(CYCLES_PUSH_SREG); @@ -2845,7 +2845,7 @@ void i386_device::i386_groupFF_32() // Opcode 0xff } else { - PUSH32SEG(m_sreg[CS].selector ); + PUSH32(m_sreg[CS].selector ); PUSH32(m_eip ); m_sreg[CS].selector = selector; m_performed_intersegment_jump = 1; diff --git a/src/devices/cpu/i386/i386ops.h b/src/devices/cpu/i386/i386ops.h index ccf89a8720d..2760b9cf410 100644 --- a/src/devices/cpu/i386/i386ops.h +++ b/src/devices/cpu/i386/i386ops.h @@ -297,7 +297,6 @@ const i386_device::X86_OPCODE i386_device::s_x86_opcode_table[] = { 0x03, OP_2BYTE|OP_I386, &i386_device::i386_lsl_r16_rm16, &i386_device::i386_lsl_r32_rm32, false}, { 0x06, OP_2BYTE|OP_I386, &i386_device::i386_clts, &i386_device::i386_clts, false}, { 0x07, OP_2BYTE|OP_I386, &i386_device::i386_loadall, &i386_device::i386_loadall, false}, - { 0x07, OP_2BYTE|OP_I486, &i386_device::i386_invalid, &i386_device::i386_invalid, false}, { 0x08, OP_2BYTE|OP_I486, &i386_device::i486_invd, &i386_device::i486_invd, false}, { 0x09, OP_2BYTE|OP_I486, &i386_device::i486_wbinvd, &i386_device::i486_wbinvd, false}, { 0x0B, OP_2BYTE|OP_PENTIUM, &i386_device::pentium_ud2, &i386_device::pentium_ud2, false}, diff --git a/src/devices/cpu/i386/i386ops.inc b/src/devices/cpu/i386/i386ops.inc index 2f13445c8be..dc237c98469 100644 --- a/src/devices/cpu/i386/i386ops.inc +++ b/src/devices/cpu/i386/i386ops.inc @@ -701,7 +701,7 @@ void i386_device::i386_mov_cr_r32() // Opcode 0x0f 22 case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 3: CYCLES(CYCLES_MOV_REG_CR3); - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); break; case 4: CYCLES(1); break; // TODO default: @@ -2504,66 +2504,7 @@ void i386_device::i386_mov_tr_r32() // Opcode 0x0f 26 void i386_device::i386_loadall() // Opcode 0x0f 0x07 (0x0f 0x05 on 80286), undocumented { - if(PROTECTED_MODE && (m_CPL != 0)) - FAULT(FAULT_GP,0) - UINT32 ea = i386_translate(ES, REG32(EDI), 0); - m_cr[0] = READ32(ea) & 0xfffeffff; // wp not supported on 386 - set_flags(READ32(ea + 0x04)); - m_eip = READ32(ea + 0x08); - REG32(EDI) = READ32(ea + 0x0c); - REG32(ESI) = READ32(ea + 0x10); - REG32(EBP) = READ32(ea + 0x14); - REG32(ESP) = READ32(ea + 0x18); - REG32(EBX) = READ32(ea + 0x1c); - REG32(EDX) = READ32(ea + 0x20); - REG32(ECX) = READ32(ea + 0x24); - REG32(EAX) = READ32(ea + 0x28); - m_dr[6] = READ32(ea + 0x2c); - m_dr[7] = READ32(ea + 0x30); - m_task.segment = READ16(ea + 0x34); - m_ldtr.segment = READ16(ea + 0x38); - m_sreg[GS].selector = READ16(ea + 0x3c); - m_sreg[FS].selector = READ16(ea + 0x40); - m_sreg[DS].selector = READ16(ea + 0x44); - m_sreg[SS].selector = READ16(ea + 0x48); - m_sreg[CS].selector = READ16(ea + 0x4c); - m_sreg[ES].selector = READ16(ea + 0x50); - m_task.flags = READ32(ea + 0x54) >> 8; - m_task.base = READ32(ea + 0x58); - m_task.limit = READ32(ea + 0x5c); - m_idtr.base = READ32(ea + 0x64); - m_idtr.limit = READ32(ea + 0x68); - m_gdtr.base = READ32(ea + 0x70); - m_gdtr.limit = READ32(ea + 0x74); - m_ldtr.flags = READ32(ea + 0x78) >> 8; - m_ldtr.base = READ32(ea + 0x7c); - m_ldtr.limit = READ32(ea + 0x80); - m_sreg[GS].flags = READ32(ea + 0x84) >> 8; - m_sreg[GS].base = READ32(ea + 0x88); - m_sreg[GS].limit = READ32(ea + 0x8c); - m_sreg[FS].flags = READ32(ea + 0x90) >> 8; - m_sreg[FS].base = READ32(ea + 0x94); - m_sreg[FS].limit = READ32(ea + 0x98); - m_sreg[DS].flags = READ32(ea + 0x9c) >> 8; - m_sreg[DS].base = READ32(ea + 0xa0); - m_sreg[DS].limit = READ32(ea + 0xa4); - m_sreg[SS].flags = READ32(ea + 0xa8) >> 8; - m_sreg[SS].base = READ32(ea + 0xac); - m_sreg[SS].limit = READ32(ea + 0xb0); - m_sreg[CS].flags = READ32(ea + 0xb4) >> 8; - m_sreg[CS].base = READ32(ea + 0xb8); - m_sreg[CS].limit = READ32(ea + 0xbc); - m_sreg[ES].flags = READ32(ea + 0xc0) >> 8; - m_sreg[ES].base = READ32(ea + 0xc4); - m_sreg[ES].limit = READ32(ea + 0xc8); - m_CPL = (m_sreg[SS].flags >> 5) & 3; // cpl == dpl of ss - - for(int i = 0; i < GS; i++) - { - m_sreg[i].valid = (m_sreg[i].flags & 0x80) ? true : false; - m_sreg[i].d = (m_sreg[i].flags & 0x4000) ? 1 : 0; - } - CHANGE_PC(m_eip); + fatalerror("i386: LOADALL unimplemented at %08X\n", m_pc - 1); } void i386_device::i386_invalid() diff --git a/src/devices/cpu/i386/i386priv.h b/src/devices/cpu/i386/i386priv.h index 0a471adfe36..9913d851fa2 100644 --- a/src/devices/cpu/i386/i386priv.h +++ b/src/devices/cpu/i386/i386priv.h @@ -486,7 +486,7 @@ int i386_device::translate_address(int pl, int type, UINT32 *address, UINT32 *er if(!(m_cr[0] & 0x80000000)) // Some (very few) old OS's won't work with this return TRUE; - const vtlb_entry *table = vtlb_table(); + const vtlb_entry *table = vtlb_table(m_vtlb); UINT32 index = *address >> 12; vtlb_entry entry = table[index]; if(type == TRANSLATE_FETCH) @@ -506,7 +506,7 @@ int i386_device::translate_address(int pl, int type, UINT32 *address, UINT32 *er *error |= 1; return FALSE; } - vtlb_dynload(index, *address, entry); + vtlb_dynload(m_vtlb, index, *address, entry); return TRUE; } if(!(entry & (1 << type))) @@ -557,7 +557,7 @@ UINT16 i386_device::FETCH16() UINT16 value; UINT32 address = m_pc, error; - if( !WORD_ALIGNED(address) ) { /* Unaligned read */ + if( address & 0x1 ) { /* Unaligned read */ value = (FETCH() << 0); value |= (FETCH() << 8); } else { @@ -575,7 +575,7 @@ UINT32 i386_device::FETCH32() UINT32 value; UINT32 address = m_pc, error; - if( !DWORD_ALIGNED(m_pc) ) { /* Unaligned read */ + if( m_pc & 0x3 ) { /* Unaligned read */ value = (FETCH() << 0); value |= (FETCH() << 8); value |= (FETCH() << 16); @@ -607,7 +607,7 @@ UINT16 i386_device::READ16(UINT32 ea) UINT16 value; UINT32 address = ea, error; - if( !WORD_ALIGNED(ea) ) { /* Unaligned read */ + if( ea & 0x1 ) { /* Unaligned read */ value = (READ8( address+0 ) << 0); value |= (READ8( address+1 ) << 8); } else { @@ -624,7 +624,7 @@ UINT32 i386_device::READ32(UINT32 ea) UINT32 value; UINT32 address = ea, error; - if( !DWORD_ALIGNED(ea) ) { /* Unaligned read */ + if( ea & 0x3 ) { /* Unaligned read */ value = (READ8( address+0 ) << 0); value |= (READ8( address+1 ) << 8); value |= (READ8( address+2 ) << 16), @@ -644,7 +644,7 @@ UINT64 i386_device::READ64(UINT32 ea) UINT64 value; UINT32 address = ea, error; - if( !QWORD_ALIGNED(ea) ) { /* Unaligned read */ + if( ea & 0x7 ) { /* Unaligned read */ value = (((UINT64) READ8( address+0 )) << 0); value |= (((UINT64) READ8( address+1 )) << 8); value |= (((UINT64) READ8( address+2 )) << 16); @@ -678,7 +678,7 @@ UINT16 i386_device::READ16PL0(UINT32 ea) UINT16 value; UINT32 address = ea, error; - if( !WORD_ALIGNED(ea) ) { /* Unaligned read */ + if( ea & 0x1 ) { /* Unaligned read */ value = (READ8PL0( address+0 ) << 0); value |= (READ8PL0( address+1 ) << 8); } else { @@ -696,7 +696,7 @@ UINT32 i386_device::READ32PL0(UINT32 ea) UINT32 value; UINT32 address = ea, error; - if( !DWORD_ALIGNED(ea) ) { /* Unaligned read */ + if( ea & 0x3 ) { /* Unaligned read */ value = (READ8PL0( address+0 ) << 0); value |= (READ8PL0( address+1 ) << 8); value |= (READ8PL0( address+2 ) << 16); @@ -732,7 +732,7 @@ void i386_device::WRITE16(UINT32 ea, UINT16 value) { UINT32 address = ea, error; - if( !WORD_ALIGNED(ea) ) { /* Unaligned write */ + if( ea & 0x1 ) { /* Unaligned write */ WRITE8( address+0, value & 0xff ); WRITE8( address+1, (value >> 8) & 0xff ); } else { @@ -747,7 +747,7 @@ void i386_device::WRITE32(UINT32 ea, UINT32 value) { UINT32 address = ea, error; - if( !DWORD_ALIGNED(ea) ) { /* Unaligned write */ + if( ea & 0x3 ) { /* Unaligned write */ WRITE8( address+0, value & 0xff ); WRITE8( address+1, (value >> 8) & 0xff ); WRITE8( address+2, (value >> 16) & 0xff ); @@ -765,7 +765,7 @@ void i386_device::WRITE64(UINT32 ea, UINT64 value) { UINT32 address = ea, error; - if( !QWORD_ALIGNED(ea) ) { /* Unaligned write */ + if( ea & 0x7 ) { /* Unaligned write */ WRITE8( address+0, value & 0xff ); WRITE8( address+1, (value >> 8) & 0xff ); WRITE8( address+2, (value >> 16) & 0xff ); @@ -1000,23 +1000,6 @@ void i386_device::PUSH32(UINT32 value) REG16(SP) = new_esp; } } - -void i386_device::PUSH32SEG(UINT32 value) -{ - UINT32 ea, new_esp; - if( STACK_32BIT ) { - new_esp = REG32(ESP) - 4; - ea = i386_translate(SS, new_esp, 1); - ((m_cpu_version & 0xf00) == 0x300) ? WRITE16(ea, value) : WRITE32(ea, value ); // 486 also? - REG32(ESP) = new_esp; - } else { - new_esp = (REG16(SP) - 4) & 0xffff; - ea = i386_translate(SS, new_esp, 1); - ((m_cpu_version & 0xf00) == 0x300) ? WRITE16(ea, value) : WRITE32(ea, value ); - REG16(SP) = new_esp; - } -} - void i386_device::PUSH8(UINT8 value) { if( m_operand_size ) { diff --git a/src/devices/cpu/i386/i486ops.inc b/src/devices/cpu/i386/i486ops.inc index 8be406692d4..d22f6c079c3 100644 --- a/src/devices/cpu/i386/i486ops.inc +++ b/src/devices/cpu/i386/i486ops.inc @@ -312,7 +312,7 @@ void i386_device::i486_group0F01_16() // Opcode 0x0f 01 } ea = GetEA(modrm,-1); CYCLES(25); // TODO: add to cycles.h - vtlb_flush_address(ea); + vtlb_flush_address(m_vtlb, ea); break; } default: @@ -430,7 +430,7 @@ void i386_device::i486_group0F01_32() // Opcode 0x0f 01 } ea = GetEA(modrm,-1); CYCLES(25); // TODO: add to cycles.h - vtlb_flush_address(ea); + vtlb_flush_address(m_vtlb, ea); break; } default: @@ -500,12 +500,12 @@ void i386_device::i486_mov_cr_r32() // Opcode 0x0f 22 case 0: CYCLES(CYCLES_MOV_REG_CR0); if((oldcr ^ m_cr[cr]) & 0x80010000) - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); break; case 2: CYCLES(CYCLES_MOV_REG_CR2); break; case 3: CYCLES(CYCLES_MOV_REG_CR3); - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); break; case 4: CYCLES(1); break; // TODO default: diff --git a/src/devices/cpu/i4004/i4004.cpp b/src/devices/cpu/i4004/i4004.cpp index 371074238c9..d4ba8891260 100644 --- a/src/devices/cpu/i4004/i4004.cpp +++ b/src/devices/cpu/i4004/i4004.cpp @@ -30,9 +30,7 @@ i4004_cpu_device::i4004_cpu_device(const machine_config &mconfig, const char *ta , m_io_config("io", ENDIANNESS_LITTLE, 8, 6, 0) , m_data_config("data", ENDIANNESS_LITTLE, 8, 12, 0), m_A(0), m_C(0), m_TEST(0), m_flags(0), m_program(nullptr), m_direct(nullptr), m_data(nullptr), m_io(nullptr), m_icount(0), m_pc_pos(0), m_addr_mask(0) { - m_program_config.m_is_octal = true; - m_io_config.m_is_octal = true; - m_data_config.m_is_octal = true; + m_is_octal = true; } diff --git a/src/devices/cpu/i8089/i8089.cpp b/src/devices/cpu/i8089/i8089.cpp index ade9e4f768b..22494cfdd2f 100644 --- a/src/devices/cpu/i8089/i8089.cpp +++ b/src/devices/cpu/i8089/i8089.cpp @@ -289,7 +289,7 @@ UINT16 i8089_device::read_word(bool space, offs_t address) UINT16 data; address_space *aspace = (space ? m_io : m_mem); - if (sysbus_width() && WORD_ALIGNED(address)) + if (sysbus_width() && !(address & 1)) { data = aspace->read_word(address); } @@ -311,7 +311,7 @@ void i8089_device::write_word(bool space, offs_t address, UINT16 data) { address_space *aspace = (space ? m_io : m_mem); - if (sysbus_width() && WORD_ALIGNED(address)) + if (sysbus_width() && !(address & 1)) { aspace->write_word(address, data); } diff --git a/src/devices/cpu/i86/i86.txt b/src/devices/cpu/i86/i86.txt index fb27b8526fe..39b54d6a8d0 100644 --- a/src/devices/cpu/i86/i86.txt +++ b/src/devices/cpu/i86/i86.txt @@ -29,7 +29,6 @@ mov sreg, doesnot disable until next operation is executed 8086/8088 --------- "mov cs, " causes unconditional jump! -0xd6 is salc (sbb al,al) as all other intel x86-16 and -32 cpus 80C86/80C88 ----------- @@ -37,10 +36,9 @@ mov sreg, doesnot disable until next operation is executed 80186/80188 ----------- -integrated pic, timer and dmac entirely incompatible with 8259, 825[3,4] and 82[3,5]7 +integrated pic8259, pit8253, dma8253 (but not at standard pc addresses) additional instructions -#BR/bound/int 5, #UD/illegal instruction/int 6, #NM/coprocessor unavailable/int 7 support -"mov cs, " ignored (likely causes int 6) +"mov cs, " ? shift count anded with 0x1f 80188 @@ -54,7 +52,6 @@ although it is based on 80186 instruction set, some behaviours follow 8086 8080 emulation mode "mov cs, " ignored shift count not anded (acts like 8086) -0xd6 is xlat alias NEC 70116 (V30) --------------- @@ -72,11 +69,11 @@ no 8080 emulation mode NEC V40 ------- -pinout, integrated peripherals 8259,54,37 clones at nonpc compatible addresses +pinout, integrated peripherals as 80186 NEC V50 ------- -pinout, integrated peripherals as v40 +pinout, integrated peripherals as 80188 NEC V33? -------- @@ -95,9 +92,9 @@ v30? emulation mode (without 8080 emulation mode) 80286 ----- -80186 with additional instructions but no peripherals +80186 with additional instructions 24 bit address bus, -protected mode selector/descriptor +protected mode 80386 and later --------------- diff --git a/src/devices/cpu/i960/i960.cpp b/src/devices/cpu/i960/i960.cpp index f754445379b..224b844387c 100644 --- a/src/devices/cpu/i960/i960.cpp +++ b/src/devices/cpu/i960/i960.cpp @@ -26,7 +26,7 @@ i960_cpu_device::i960_cpu_device(const machine_config &mconfig, const char *tag, UINT32 i960_cpu_device::i960_read_dword_unaligned(UINT32 address) { - if (!DWORD_ALIGNED(address)) + if (address & 3) return m_program->read_byte(address) | m_program->read_byte(address+1)<<8 | m_program->read_byte(address+2)<<16 | m_program->read_byte(address+3)<<24; else return m_program->read_dword(address); @@ -34,7 +34,7 @@ UINT32 i960_cpu_device::i960_read_dword_unaligned(UINT32 address) UINT16 i960_cpu_device::i960_read_word_unaligned(UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return m_program->read_byte(address) | m_program->read_byte(address+1)<<8; else return m_program->read_word(address); @@ -42,7 +42,7 @@ UINT16 i960_cpu_device::i960_read_word_unaligned(UINT32 address) void i960_cpu_device::i960_write_dword_unaligned(UINT32 address, UINT32 data) { - if (!DWORD_ALIGNED(address)) + if (address & 3) { m_program->write_byte(address, data & 0xff); m_program->write_byte(address+1, (data>>8)&0xff); @@ -57,7 +57,7 @@ void i960_cpu_device::i960_write_dword_unaligned(UINT32 address, UINT32 data) void i960_cpu_device::i960_write_word_unaligned(UINT32 address, UINT16 data) { - if (!WORD_ALIGNED(address)) + if (address & 1) { m_program->write_byte(address, data & 0xff); m_program->write_byte(address+1, (data>>8)&0xff); diff --git a/src/devices/cpu/m37710/m37710il.h b/src/devices/cpu/m37710/m37710il.h index eb79f0fddd6..ffc1aed0a7a 100644 --- a/src/devices/cpu/m37710/m37710il.h +++ b/src/devices/cpu/m37710/m37710il.h @@ -42,7 +42,7 @@ inline UINT32 m37710_cpu_device::m37710i_read_16_normal(UINT32 address) inline UINT32 m37710_cpu_device::m37710i_read_16_immediate(UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return m37710_read_8_immediate(address) | (m37710_read_8_immediate(address+1)<<8); else return m37710_read_16_immediate(address); @@ -65,7 +65,7 @@ inline void m37710_cpu_device::m37710i_write_16_direct(UINT32 address, UINT32 va inline UINT32 m37710_cpu_device::m37710i_read_24_normal(UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return m37710_read_8(address) | (m37710_read_16(address+1)<<8); else return m37710_read_16(address) | (m37710_read_8(address+2)<<16); @@ -73,7 +73,7 @@ inline UINT32 m37710_cpu_device::m37710i_read_24_normal(UINT32 address) inline UINT32 m37710_cpu_device::m37710i_read_24_immediate(UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return m37710_read_8_immediate(address) | (m37710_read_16_immediate(address+1)<<8); else return m37710_read_16_immediate(address) | (m37710_read_8_immediate(address+2)<<16); @@ -81,7 +81,7 @@ inline UINT32 m37710_cpu_device::m37710i_read_24_immediate(UINT32 address) inline UINT32 m37710_cpu_device::m37710i_read_24_direct(UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return m37710_read_8(address) | (m37710_read_16(address+1)<<8); else return m37710_read_16(address) | (m37710_read_8(address+2)<<16); diff --git a/src/devices/cpu/m6800/6800dasm.cpp b/src/devices/cpu/m6800/6800dasm.cpp index 2e94ef3b62d..49f908013cd 100644 --- a/src/devices/cpu/m6800/6800dasm.cpp +++ b/src/devices/cpu/m6800/6800dasm.cpp @@ -52,8 +52,7 @@ enum op_names { rts, sba, sbca, sbcb, sec, sev, sta, stb, _std, sei, sts, stx, suba, subb, subd, swi, wai, tab, tap, tba, tim, tpa, tst, tsta, - tstb, tsx, txs, asx1, asx2, xgdx, addx, adcx, - bitx + tstb, tsx, txs, asx1, asx2, xgdx, addx, adcx }; static const char *const op_name_str[] = { @@ -72,8 +71,7 @@ static const char *const op_name_str[] = { "rts", "sba", "sbca", "sbcb", "sec", "sev", "sta", "stb", "std", "sei", "sts", "stx", "suba", "subb", "subd", "swi", "wai", "tab", "tap", "tba", "tim", "tpa", "tst", "tsta", - "tstb", "tsx", "txs", "asx1", "asx2", "xgdx", "addx", "adcx", - "bitx" + "tstb", "tsx", "txs", "asx1", "asx2", "xgdx", "addx", "adcx" }; /* @@ -84,7 +82,7 @@ static const char *const op_name_str[] = { * 2 invalid opcode for 1:6800/6802/6808, 2:6801/6803, 4:HD63701 */ -static const UINT8 table[0x104][3] = { +static const UINT8 table[0x102][3] = { {ill, inh,7},{nop, inh,0},{ill, inh,7},{ill, inh,7},/* 00 */ {lsrd,inh,1},{asld,inh,1},{tap, inh,0},{tpa, inh,0}, {inx, inh,0},{dex, inh,0},{clv, inh,0},{sev, inh,0}, @@ -153,11 +151,7 @@ static const UINT8 table[0x104][3] = { /* extra instruction $fc for NSC-8105 */ {addx,ext,0}, /* extra instruction $ec for NSC-8105 */ - {adcx,imb,0}, - /* extra instruction $bb for NSC-8105 */ - {bitx,imx,0}, - /* extra instruction $b2 for NSC-8105 */ - {stx,imx,0} + {adcx,imb,0} }; /* some macros to keep things short */ @@ -194,8 +188,6 @@ static unsigned Dasm680x (int subtype, char *buf, unsigned pc, const UINT8 *opro /* and check for extra instruction */ if (code == 0xfc) code = 0x0100; if (code == 0xec) code = 0x0101; - if (code == 0x7b) code = 0x0102; - if (code == 0x71) code = 0x0103; } opcode = table[code][0]; diff --git a/src/devices/cpu/m6800/6800ops.inc b/src/devices/cpu/m6800/6800ops.inc index 078529d16ab..cf0360c7538 100644 --- a/src/devices/cpu/m6800/6800ops.inc +++ b/src/devices/cpu/m6800/6800ops.inc @@ -2073,12 +2073,11 @@ OP_HANDLER( ldd_ix ) } /* $ec ADCX immediate -**** NSC8105 only. Flags are a guess - copied from addb_im() */ -// actually this is ADDX, causes garbage in nightgal.cpp otherwise OP_HANDLER( adcx_im ) { UINT16 t,r; IMMBYTE(t); - r = X+t; + r = X+t+(CC&0x01); CLR_HNZVC; SET_FLAGS8(X,t,r); SET_H(X,t,r); @@ -2283,26 +2282,3 @@ OP_HANDLER( stx_ex ) EXTENDED; WM16(EAD,&m_x); } - -/* NSC8105 specific, guessed opcodes (tested by Night Gal Summer) */ -// $bb - $mask & [X + $disp8] -OP_HANDLER( btst_ix ) -{ - UINT8 val; - UINT8 mask = M_RDOP_ARG(PCD); - {EA=X+(M_RDOP_ARG(PCD+1));PC+=2;} - val = RM(EAD) & mask; - CLR_NZVC; SET_NZ8(val); -} - -// $b2 - assuming correct, store first byte to (X + $disp8) -OP_HANDLER( stx_nsc ) -{ - IMM8; - UINT8 val = RM(EAD); - IMM8; - EA = X + RM(EAD); - CLR_NZV; - SET_NZ8(val); - WM(EAD,val); -}
\ No newline at end of file diff --git a/src/devices/cpu/m6800/6800tbl.inc b/src/devices/cpu/m6800/6800tbl.inc index 10515e54bdc..38376dadd59 100644 --- a/src/devices/cpu/m6800/6800tbl.inc +++ b/src/devices/cpu/m6800/6800tbl.inc @@ -105,54 +105,30 @@ const m6800_cpu_device::op_func m6800_cpu_device::hd63701_insn[0x100] = { }; const m6800_cpu_device::op_func m6800_cpu_device::nsc8105_insn[0x100] = { -// 0 &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::nop, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::tap, &m6800_cpu_device::illegal,&m6800_cpu_device::tpa, -// 8 &m6800_cpu_device::inx, &m6800_cpu_device::clv, &m6800_cpu_device::dex, &m6800_cpu_device::sev, &m6800_cpu_device::clc, &m6800_cpu_device::cli, &m6800_cpu_device::sec, &m6800_cpu_device::sei, -// 10 &m6800_cpu_device::sba, &m6800_cpu_device::illegal,&m6800_cpu_device::cba, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::tab, &m6800_cpu_device::illegal,&m6800_cpu_device::tba, -// 18 &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::daa, &m6800_cpu_device::aba, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::illegal, -// 20 &m6800_cpu_device::bra, &m6800_cpu_device::bhi, &m6800_cpu_device::brn, &m6800_cpu_device::bls, &m6800_cpu_device::bcc, &m6800_cpu_device::bne, &m6800_cpu_device::bcs, &m6800_cpu_device::beq, -// 28 &m6800_cpu_device::bvc, &m6800_cpu_device::bpl, &m6800_cpu_device::bvs, &m6800_cpu_device::bmi, &m6800_cpu_device::bge, &m6800_cpu_device::bgt, &m6800_cpu_device::blt, &m6800_cpu_device::ble, -// 30 &m6800_cpu_device::tsx, &m6800_cpu_device::pula, &m6800_cpu_device::ins, &m6800_cpu_device::pulb, &m6800_cpu_device::des, &m6800_cpu_device::psha, &m6800_cpu_device::txs, &m6800_cpu_device::pshb, -// 38 &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::rts, &m6800_cpu_device::rti, &m6800_cpu_device::illegal,&m6800_cpu_device::wai, &m6800_cpu_device::illegal,&m6800_cpu_device::swi, -// 40 &m6800_cpu_device::suba_im,&m6800_cpu_device::sbca_im,&m6800_cpu_device::cmpa_im,&m6800_cpu_device::illegal,&m6800_cpu_device::anda_im,&m6800_cpu_device::lda_im, &m6800_cpu_device::bita_im,&m6800_cpu_device::sta_im, -// 48 &m6800_cpu_device::eora_im,&m6800_cpu_device::ora_im, &m6800_cpu_device::adca_im,&m6800_cpu_device::adda_im,&m6800_cpu_device::cmpx_im,&m6800_cpu_device::lds_im, &m6800_cpu_device::bsr, &m6800_cpu_device::sts_im, -// 50 &m6800_cpu_device::suba_di,&m6800_cpu_device::sbca_di,&m6800_cpu_device::cmpa_di,&m6800_cpu_device::illegal,&m6800_cpu_device::anda_di,&m6800_cpu_device::lda_di, &m6800_cpu_device::bita_di,&m6800_cpu_device::sta_di, -// 58 &m6800_cpu_device::eora_di,&m6800_cpu_device::ora_di, &m6800_cpu_device::adca_di,&m6800_cpu_device::adda_di,&m6800_cpu_device::cmpx_di,&m6800_cpu_device::lds_di, &m6800_cpu_device::jsr_di, &m6800_cpu_device::sts_di, -// 60 &m6800_cpu_device::suba_ix,&m6800_cpu_device::sbca_ix,&m6800_cpu_device::cmpa_ix,&m6800_cpu_device::illegal,&m6800_cpu_device::anda_ix,&m6800_cpu_device::lda_ix, &m6800_cpu_device::bita_ix,&m6800_cpu_device::sta_ix, -// 68 &m6800_cpu_device::eora_ix,&m6800_cpu_device::ora_ix, &m6800_cpu_device::adca_ix,&m6800_cpu_device::adda_ix,&m6800_cpu_device::cmpx_ix,&m6800_cpu_device::lds_ix, &m6800_cpu_device::jsr_ix, &m6800_cpu_device::sts_ix, -// 70 &m6800_cpu_device::suba_ex,&m6800_cpu_device::sbca_ex,&m6800_cpu_device::cmpa_ex,&m6800_cpu_device::illegal,&m6800_cpu_device::anda_ex,&m6800_cpu_device::lda_ex, &m6800_cpu_device::bita_ex,&m6800_cpu_device::sta_ex, -// 78 &m6800_cpu_device::eora_ex,&m6800_cpu_device::ora_ex, &m6800_cpu_device::adca_ex,&m6800_cpu_device::adda_ex,&m6800_cpu_device::cmpx_ex,&m6800_cpu_device::lds_ex, &m6800_cpu_device::jsr_ex, &m6800_cpu_device::sts_ex, -// 80 &m6800_cpu_device::nega, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::coma, &m6800_cpu_device::lsra, &m6800_cpu_device::rora, &m6800_cpu_device::illegal,&m6800_cpu_device::asra, -// 88 &m6800_cpu_device::asla, &m6800_cpu_device::deca, &m6800_cpu_device::rola, &m6800_cpu_device::illegal,&m6800_cpu_device::inca, &m6800_cpu_device::illegal,&m6800_cpu_device::tsta, &m6800_cpu_device::clra, -// 90 &m6800_cpu_device::negb, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::comb, &m6800_cpu_device::lsrb, &m6800_cpu_device::rorb, &m6800_cpu_device::illegal,&m6800_cpu_device::asrb, -// 98 &m6800_cpu_device::aslb, &m6800_cpu_device::decb, &m6800_cpu_device::rolb, &m6800_cpu_device::illegal,&m6800_cpu_device::incb, &m6800_cpu_device::illegal,&m6800_cpu_device::tstb, &m6800_cpu_device::clrb, -// a0 &m6800_cpu_device::neg_ix, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::com_ix, &m6800_cpu_device::lsr_ix, &m6800_cpu_device::ror_ix, &m6800_cpu_device::illegal,&m6800_cpu_device::asr_ix, -// a8 &m6800_cpu_device::asl_ix, &m6800_cpu_device::dec_ix, &m6800_cpu_device::rol_ix, &m6800_cpu_device::illegal,&m6800_cpu_device::inc_ix, &m6800_cpu_device::jmp_ix, &m6800_cpu_device::tst_ix, &m6800_cpu_device::clr_ix, -// b0 -&m6800_cpu_device::neg_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::stx_nsc,&m6800_cpu_device::com_ex, &m6800_cpu_device::lsr_ex, &m6800_cpu_device::ror_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::asr_ex, -// b8 -&m6800_cpu_device::asl_ex, &m6800_cpu_device::dec_ex, &m6800_cpu_device::rol_ex, &m6800_cpu_device::btst_ix,&m6800_cpu_device::inc_ex, &m6800_cpu_device::jmp_ex, &m6800_cpu_device::tst_ex, &m6800_cpu_device::clr_ex, +&m6800_cpu_device::neg_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::illegal,&m6800_cpu_device::com_ex, &m6800_cpu_device::lsr_ex, &m6800_cpu_device::ror_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::asr_ex, +&m6800_cpu_device::asl_ex, &m6800_cpu_device::dec_ex, &m6800_cpu_device::rol_ex, &m6800_cpu_device::illegal,&m6800_cpu_device::inc_ex, &m6800_cpu_device::jmp_ex, &m6800_cpu_device::tst_ex, &m6800_cpu_device::clr_ex, &m6800_cpu_device::subb_im,&m6800_cpu_device::sbcb_im,&m6800_cpu_device::cmpb_im,&m6800_cpu_device::illegal,&m6800_cpu_device::andb_im,&m6800_cpu_device::ldb_im, &m6800_cpu_device::bitb_im,&m6800_cpu_device::stb_im, &m6800_cpu_device::eorb_im,&m6800_cpu_device::orb_im, &m6800_cpu_device::adcb_im,&m6800_cpu_device::addb_im,&m6800_cpu_device::illegal,&m6800_cpu_device::ldx_im, &m6800_cpu_device::illegal,&m6800_cpu_device::stx_im, &m6800_cpu_device::subb_di,&m6800_cpu_device::sbcb_di,&m6800_cpu_device::cmpb_di,&m6800_cpu_device::illegal,&m6800_cpu_device::andb_di,&m6800_cpu_device::ldb_di, &m6800_cpu_device::bitb_di,&m6800_cpu_device::stb_di, diff --git a/src/devices/cpu/m6800/m6800.cpp b/src/devices/cpu/m6800/m6800.cpp index 730d7a1be4b..84d3b8d03e2 100644 --- a/src/devices/cpu/m6800/m6800.cpp +++ b/src/devices/cpu/m6800/m6800.cpp @@ -488,7 +488,7 @@ const UINT8 m6800_cpu_device::cycles_63701[256] = const UINT8 m6800_cpu_device::cycles_nsc8105[256] = { /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */ - /*0*/ 5,XX, 2,XX,XX, 2,XX, 2, 4, 2, 4, 2, 2, 2, 2, 2, + /*0*/ XX,XX, 2,XX,XX, 2,XX, 2, 4, 2, 4, 2, 2, 2, 2, 2, /*1*/ 2,XX, 2,XX,XX, 2,XX, 2,XX,XX, 2, 2,XX,XX,XX,XX, /*2*/ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, /*3*/ 4, 4, 4, 4, 4, 4, 4, 4,XX,XX, 5,10,XX, 9,XX,12, @@ -499,7 +499,7 @@ const UINT8 m6800_cpu_device::cycles_nsc8105[256] = /*8*/ 2,XX,XX, 2, 2, 2,XX, 2, 2, 2, 2,XX, 2,XX, 2, 2, /*9*/ 2,XX,XX, 2, 2, 2,XX, 2, 2, 2, 2,XX, 2,XX, 2, 2, /*A*/ 7,XX,XX, 7, 7, 7,XX, 7, 7, 7, 7,XX, 7, 4, 7, 7, - /*B*/ 6,XX,XX, 6, 6, 6,XX, 6, 6, 6, 6, 5, 6, 3, 6, 6, + /*B*/ 6,XX,XX, 6, 6, 6,XX, 6, 6, 6, 6,XX, 6, 3, 6, 6, /*C*/ 2, 2, 2,XX, 2, 2, 2, 3, 2, 2, 2, 2,XX, 3,XX, 4, /*D*/ 3, 3, 3,XX, 3, 3, 3, 4, 3, 3, 3, 3,XX, 4,XX, 5, /*E*/ 5, 5, 5,XX, 5, 5, 5, 6, 5, 5, 5, 5, 5, 6,XX, 7, diff --git a/src/devices/cpu/m6800/m6800.h b/src/devices/cpu/m6800/m6800.h index 82696a6ee43..bb6055e8ad0 100644 --- a/src/devices/cpu/m6800/m6800.h +++ b/src/devices/cpu/m6800/m6800.h @@ -426,8 +426,6 @@ protected: void cpx_im(); void cpx_ix(); void trap(); - void btst_ix(); - void stx_nsc(); }; diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp index aaa1db079cf..dc7e0b14a6f 100644 --- a/src/devices/cpu/m68000/m68kcpu.cpp +++ b/src/devices/cpu/m68000/m68kcpu.cpp @@ -1383,7 +1383,7 @@ UINT16 m68000_base_device::readword_d32_mmu(offs_t address) UINT32 address0 = pmmu_translate_addr(this, address); if (mmu_tmp_buserror_occurred) { return ~0; - } else if (WORD_ALIGNED(address)) { + } else if (!(address & 1)) { return m_space->read_word(address0); } else { UINT32 address1 = pmmu_translate_addr(this, address + 1); @@ -1396,7 +1396,7 @@ UINT16 m68000_base_device::readword_d32_mmu(offs_t address) } } - if (WORD_ALIGNED(address)) + if (!(address & 1)) return m_space->read_word(address); result = m_space->read_byte(address) << 8; return result | m_space->read_byte(address + 1); @@ -1410,7 +1410,7 @@ void m68000_base_device::writeword_d32_mmu(offs_t address, UINT16 data) UINT32 address0 = pmmu_translate_addr(this, address); if (mmu_tmp_buserror_occurred) { return; - } else if (WORD_ALIGNED(address)) { + } else if (!(address & 1)) { m_space->write_word(address0, data); return; } else { @@ -1425,7 +1425,7 @@ void m68000_base_device::writeword_d32_mmu(offs_t address, UINT16 data) } } - if (WORD_ALIGNED(address)) + if (!(address & 1)) { m_space->write_word(address, data); return; @@ -1447,13 +1447,13 @@ UINT32 m68000_base_device::readlong_d32_mmu(offs_t address) } else if ((address +3) & 0xfc) { // not at page boundary; use default code address = address0; - } else if (DWORD_ALIGNED(address)) { // 0 + } else if (!(address & 3)) { // 0 return m_space->read_dword(address0); } else { UINT32 address2 = pmmu_translate_addr(this, address+2); if (mmu_tmp_buserror_occurred) { return ~0; - } else if (WORD_ALIGNED(address)) { // 2 + } else if (!(address & 1)) { // 2 result = m_space->read_word(address0) << 16; return result | m_space->read_word(address2); } else { @@ -1470,9 +1470,9 @@ UINT32 m68000_base_device::readlong_d32_mmu(offs_t address) } } - if (DWORD_ALIGNED(address)) + if (!(address & 3)) return m_space->read_dword(address); - else if (WORD_ALIGNED(address)) + else if (!(address & 1)) { result = m_space->read_word(address) << 16; return result | m_space->read_word(address + 2); @@ -1493,14 +1493,14 @@ void m68000_base_device::writelong_d32_mmu(offs_t address, UINT32 data) } else if ((address +3) & 0xfc) { // not at page boundary; use default code address = address0; - } else if (DWORD_ALIGNED(address)) { // 0 + } else if (!(address & 3)) { // 0 m_space->write_dword(address0, data); return; } else { UINT32 address2 = pmmu_translate_addr(this, address+2); if (mmu_tmp_buserror_occurred) { return; - } else if (WORD_ALIGNED(address)) { // 2 + } else if (!(address & 1)) { // 2 m_space->write_word(address0, data >> 16); m_space->write_word(address2, data); return; @@ -1519,12 +1519,12 @@ void m68000_base_device::writelong_d32_mmu(offs_t address, UINT32 data) } } - if (DWORD_ALIGNED(address)) + if (!(address & 3)) { m_space->write_dword(address, data); return; } - else if (WORD_ALIGNED(address)) + else if (!(address & 1)) { m_space->write_word(address, data >> 16); m_space->write_word(address + 2, data); @@ -1594,7 +1594,7 @@ UINT16 m68000_base_device::readword_d32_hmmu(offs_t address) address = hmmu_translate_addr(this, address); } - if (WORD_ALIGNED(address)) + if (!(address & 1)) return m_space->read_word(address); result = m_space->read_byte(address) << 8; return result | m_space->read_byte(address + 1); @@ -1608,7 +1608,7 @@ void m68000_base_device::writeword_d32_hmmu(offs_t address, UINT16 data) address = hmmu_translate_addr(this, address); } - if (WORD_ALIGNED(address)) + if (!(address & 1)) { m_space->write_word(address, data); return; @@ -1627,9 +1627,9 @@ UINT32 m68000_base_device::readlong_d32_hmmu(offs_t address) address = hmmu_translate_addr(this, address); } - if (DWORD_ALIGNED(address)) + if (!(address & 3)) return m_space->read_dword(address); - else if (WORD_ALIGNED(address)) + else if (!(address & 1)) { result = m_space->read_word(address) << 16; return result | m_space->read_word(address + 2); @@ -1647,12 +1647,12 @@ void m68000_base_device::writelong_d32_hmmu(offs_t address, UINT32 data) address = hmmu_translate_addr(this, address); } - if (DWORD_ALIGNED(address)) + if (!(address & 3)) { m_space->write_dword(address, data); return; } - else if (WORD_ALIGNED(address)) + else if (!(address & 1)) { m_space->write_word(address, data >> 16); m_space->write_word(address + 2, data); diff --git a/src/devices/cpu/m68000/m68kcpu.h b/src/devices/cpu/m68000/m68kcpu.h index 7860298988f..5cec889e002 100644 --- a/src/devices/cpu/m68000/m68kcpu.h +++ b/src/devices/cpu/m68000/m68kcpu.h @@ -626,7 +626,7 @@ static inline unsigned int m68k_read_pcrelative_8(m68000_base_device *m68k, unsi static inline unsigned int m68k_read_pcrelative_16(m68000_base_device *m68k, unsigned int address) { - if (!WORD_ALIGNED(address)) + if(address & 1) return (m68k->readimm16(address-1) << 8) | (m68k->readimm16(address+1) >> 8); @@ -638,7 +638,7 @@ static inline unsigned int m68k_read_pcrelative_16(m68000_base_device *m68k, uns static inline unsigned int m68k_read_pcrelative_32(m68000_base_device *m68k, unsigned int address) { - if (!WORD_ALIGNED(address)) + if(address & 1) return (m68k->readimm16(address-1) << 24) | (m68k->readimm16(address+1) << 8) | diff --git a/src/devices/cpu/m68000/m68kmake.cpp b/src/devices/cpu/m68000/m68kmake.cpp index 941ae23f0aa..f36797d76ba 100644 --- a/src/devices/cpu/m68000/m68kmake.cpp +++ b/src/devices/cpu/m68000/m68kmake.cpp @@ -670,7 +670,7 @@ static opcode_struct* find_opcode(char* name, int size, char* spec_proc, char* s opcode_struct* op; - for(op = g_opcode_input_table;op->name[0] != 0;op++) + for(op = g_opcode_input_table;op->name != nullptr;op++) { if( strcmp(name, op->name) == 0 && (size == op->size) && diff --git a/src/devices/cpu/m68000/m68kops.cpp b/src/devices/cpu/m68000/m68kops.cpp new file mode 100644 index 00000000000..0505f863c73 --- /dev/null +++ b/src/devices/cpu/m68000/m68kops.cpp @@ -0,0 +1,34874 @@ +#include "emu.h" +#include "m68kcpu.h" +extern void m68040_fpu_op0(m68000_base_device *m68k); +extern void m68040_fpu_op1(m68000_base_device *m68k); +extern void m68881_mmu_ops(m68000_base_device *m68k); +extern void m68881_ftrap(m68000_base_device *m68k); + +/* ======================================================================== */ +/* ========================= INSTRUCTION HANDLERS ========================= */ +/* ======================================================================== */ + + +void m68000_base_device_ops::m68k_op_1010(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1010(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_1111(m68000_base_device* mc68kcpu) +{ + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_040fpu0_32(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->has_fpu) + { + m68040_fpu_op0(mc68kcpu); + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_040fpu1_32(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->has_fpu) + { + m68040_fpu_op1(mc68kcpu); + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_abcd_8_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_abcd_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_abcd_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_abcd_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_abcd_8_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pi7(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_A7_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pd7(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_16_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = AY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_32_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_add_8_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_8_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_16_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_add_32_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_adda_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY(mc68kcpu))); +} + + +void m68000_base_device_ops::m68k_op_adda_16_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY(mc68kcpu))); +} + + +void m68000_base_device_ops::m68k_op_adda_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_adda_32_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_adda_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_AI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_PI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_PD_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_DI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_IX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AW_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AL_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_PCDI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_PCIX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_adda_32_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + src); +} + + +void m68000_base_device_ops::m68k_op_addi_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addi_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addi_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addi_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addi_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addq_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addq_16_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1); +} + + +void m68000_base_device_ops::m68k_op_addq_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addq_32_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst + ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1); +} + + +void m68000_base_device_ops::m68k_op_addq_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addq_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_8_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addx_16_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addx_32_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_addx_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_8_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_16_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_16(mc68kcpu); + UINT32 ea = EA_AX_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_addx_32_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 ea = EA_AX_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_and_8_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_8_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_16_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_and_32_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_andi_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_andi_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_andi_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_andi_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) & OPER_I_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_andi_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_asr_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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); +} + + +void m68000_base_device_ops::m68k_op_asr_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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); +} + + +void m68000_base_device_ops::m68k_op_asr_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = *r_dst; + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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); +} + + +void m68000_base_device_ops::m68k_op_asr_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + if(shift < 8) + { + if(GET_MSB_8(src)) + res |= m68ki_shift_8_table[shift]; + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | res; + + (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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + if(shift < 16) + { + if(GET_MSB_16(src)) + res |= m68ki_shift_16_table[shift]; + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + + (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; +} + + +void m68000_base_device_ops::m68k_op_asr_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = *r_dst; + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asr_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_asl_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = *r_dst; + UINT32 res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_asl_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_asl_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = *r_dst; + UINT32 res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_asl_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; +} + + +void m68000_base_device_ops::m68k_op_bhi_16(m68000_base_device* mc68kcpu) +{ + if(COND_HI(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bls_16(m68000_base_device* mc68kcpu) +{ + if(COND_LS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bcc_16(m68000_base_device* mc68kcpu) +{ + if(COND_CC(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bcs_16(m68000_base_device* mc68kcpu) +{ + if(COND_CS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bne_16(m68000_base_device* mc68kcpu) +{ + if(COND_NE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_beq_16(m68000_base_device* mc68kcpu) +{ + if(COND_EQ(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bvc_16(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bvs_16(m68000_base_device* mc68kcpu) +{ + if(COND_VS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bpl_16(m68000_base_device* mc68kcpu) +{ + if(COND_PL(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bmi_16(m68000_base_device* mc68kcpu) +{ + if(COND_MI(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bge_16(m68000_base_device* mc68kcpu) +{ + if(COND_GE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_blt_16(m68000_base_device* mc68kcpu) +{ + if(COND_LT(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bgt_16(m68000_base_device* mc68kcpu) +{ + if(COND_GT(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_ble_16(m68000_base_device* mc68kcpu) +{ + if(COND_LE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_w; +} + + +void m68000_base_device_ops::m68k_op_bhi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_HI(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bls_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bcc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CC(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bcs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_CS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bne_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_NE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_beq_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_EQ(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bvc_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VC(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bvs_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_VS(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bpl_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_PL(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bmi_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_MI(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bge_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_blt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LT(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bgt_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_GT(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_ble_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(COND_LE(mc68kcpu)) + { + UINT32 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)->remaining_cycles -= (mc68kcpu)->cyc_bcc_notake_b; + } +} + + +void m68000_base_device_ops::m68k_op_bchg_32_r_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst ^= mask; +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_r_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_32_s_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst ^= mask; +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_ai(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_pi(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_pd(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_di(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_ix(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_aw(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bchg_8_s_al(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src ^ mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_32_r_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst &= ~mask; +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_r_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_32_s_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst &= ~mask; +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_ai(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_pi(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_pd(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_di(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_ix(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_aw(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bclr_8_s_al(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src & ~mask); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32* data = &DY(mc68kcpu); + UINT64 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<<offset); + (mc68kcpu)->not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data ^= mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfchg_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32* data = &DY(mc68kcpu); + UINT64 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<<offset); + (mc68kcpu)->not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data &= ~mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfclr_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT64 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfexts_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT64 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfextu_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 data; + UINT32 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<<offset); + + if((offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT64 data = DY(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfffo_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + INT32 local_offset; + UINT32 width = word2; + UINT32 data; + UINT32 bit; + UINT32 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<<local_offset); + + if((local_offset+width) > 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32* data = &DY(mc68kcpu); + UINT64 mask; + UINT64 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + UINT32 insert_long; + UINT32 insert_byte; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + UINT32 insert_long; + UINT32 insert_byte; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + UINT32 insert_long; + UINT32 insert_byte; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + UINT32 insert_long; + UINT32 insert_byte; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfins_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 insert_base = REG_D(mc68kcpu)[(word2>>12)&7]; + UINT32 insert_long; + UINT32 insert_byte; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32* data = &DY(mc68kcpu); + UINT64 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<<offset); + (mc68kcpu)->not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + *data |= mask; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bfset_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32* data = &DY(mc68kcpu); + UINT64 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<<offset); + (mc68kcpu)->not_z_flag = *data & mask; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::m68k_op_bftst_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + INT32 offset = (word2>>6)&31; + UINT32 width = word2; + UINT32 mask_base; + UINT32 data_long; + UINT32 mask_long; + UINT32 data_byte = 0; + UINT32 mask_byte = 0; + UINT32 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))<<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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::m68k_op_bra_16(m68000_base_device* mc68kcpu) +{ + UINT32 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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::m68k_op_bra_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; + 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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; + } +} + + +void m68000_base_device_ops::m68k_op_bset_32_r_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (DX(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst |= mask; +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_r_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 mask = 1 << (DX(mc68kcpu) & 7); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_32_s_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 0x1f); + + (mc68kcpu)->not_z_flag = *r_dst & mask; + *r_dst |= mask; +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_ai(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_pi(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_pd(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_di(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_ix(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_aw(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::m68k_op_bset_8_s_al(m68000_base_device* mc68kcpu) +{ + UINT32 mask = 1 << (OPER_I_8(mc68kcpu) & 7); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + + (mc68kcpu)->not_z_flag = src & mask; + m68ki_write_8((mc68kcpu), ea, src | mask); +} + + +void m68000_base_device_ops::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)); +} + + +void m68000_base_device_ops::m68k_op_bsr_16(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_bsr_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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)); + } +} + + +void m68000_base_device_ops::m68k_op_btst_32_r_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DY(mc68kcpu) & (1 << (DX(mc68kcpu) & 0x1f)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_ai(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_AI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_PI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pi7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_A7_PI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pd(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_PD_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pd7(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_A7_PD_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_di(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_DI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_ix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AY_IX_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_aw(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AW_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_al(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_AL_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pcdi(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_PCDI_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_pcix(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_PCIX_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_r_i(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = OPER_I_8(mc68kcpu) & (1 << (DX(mc68kcpu) & 7)); +} + + +void m68000_base_device_ops::m68k_op_btst_32_s_d(m68000_base_device* mc68kcpu) +{ + (mc68kcpu)->not_z_flag = DY(mc68kcpu) & (1 << (OPER_I_8(mc68kcpu) & 0x1f)); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_ai(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_AI_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pi(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_PI_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_A7_PI_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pd(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_PD_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_A7_PD_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_di(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_DI_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_ix(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AY_IX_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_aw(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AW_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_al(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_AL_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_PCDI_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::m68k_op_btst_8_s_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 bit = OPER_I_8(mc68kcpu) & 7; + + (mc68kcpu)->not_z_flag = OPER_PCIX_8(mc68kcpu) & (1 << bit); +} + + +void m68000_base_device_ops::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 ea = EA_AY_AI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_AY_DI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_AY_IX_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_AW_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_AL_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_PCDI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea = EA_PCIX_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + REG_PC(mc68kcpu) += 2; +(void)ea; /* just to avoid an 'unused variable' warning */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (callm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_pi7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_pd7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_8_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dest = m68ki_read_8((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_8((mc68kcpu), ea, MASK_OUT_ABOVE_8(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_16_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 dest = m68ki_read_16((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_16((mc68kcpu), ea, MASK_OUT_ABOVE_16(REG_D(mc68kcpu)[(word2 >> 6) & 7])); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 dest = m68ki_read_32((mc68kcpu), ea); + UINT32* compare = ®_D(mc68kcpu)[word2 & 7]; + UINT32 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)->remaining_cycles -= 3; + m68ki_write_32((mc68kcpu), ea, REG_D(mc68kcpu)[(word2 >> 6) & 7]); + } + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cas2_16(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_32(mc68kcpu); + UINT32* compare1 = ®_D(mc68kcpu)[(word2 >> 16) & 7]; + UINT32 ea1 = REG_DA(mc68kcpu)[(word2 >> 28) & 15]; + UINT32 dest1 = m68ki_read_16((mc68kcpu), ea1); + UINT32 res1 = dest1 - MASK_OUT_ABOVE_16(*compare1); + UINT32* compare2 = ®_D(mc68kcpu)[word2 & 7]; + UINT32 ea2 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 dest2 = m68ki_read_16((mc68kcpu), ea2); + UINT32 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)->remaining_cycles -= 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); +} + + +void m68000_base_device_ops::m68k_op_cas2_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_32(mc68kcpu); + UINT32* compare1 = ®_D(mc68kcpu)[(word2 >> 16) & 7]; + UINT32 ea1 = REG_DA(mc68kcpu)[(word2 >> 28) & 15]; + UINT32 dest1 = m68ki_read_32((mc68kcpu), ea1); + UINT32 res1 = dest1 - *compare1; + UINT32* compare2 = ®_D(mc68kcpu)[word2 & 7]; + UINT32 ea2 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 dest2 = m68ki_read_32((mc68kcpu), ea2); + UINT32 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)->remaining_cycles -= 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_d(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_ai(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_pi(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_pd(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_di(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_ix(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_aw(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_al(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_pcdi(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_pcix(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_16_i(m68000_base_device* mc68kcpu) +{ + INT32 src = MAKE_INT_16(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + INT32 src = MAKE_INT_32(DX(mc68kcpu)); + INT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_PCDI_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_8((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_PCIX_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_8((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_8_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xff; + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 lower_bound = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_PCDI_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_16((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_PCIX_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_16((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_16_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]&0xffff; + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 lower_bound = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_PCDI_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_32((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_PCIX_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_pcrel_32((mc68kcpu), ea); + UINT32 upper_bound = m68ki_read_pcrel_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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_chk2cmp2_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 compare = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 lower_bound = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_clr_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_cmp_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_AI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_DI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_IX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AW_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AL_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCDI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCIX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_8_i(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_a(m68000_base_device* mc68kcpu) +{ + UINT32 src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_AI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_DI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_IX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AW_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AL_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCDI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCIX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_16_i(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = DY(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_a(m68000_base_device* mc68kcpu) +{ + UINT32 src = AY(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_AI_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_DI_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_IX_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AW_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AL_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCDI_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCIX_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmp_32_i(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = DX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(DY(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_a(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(AY(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_16_i(m68000_base_device* mc68kcpu) +{ + UINT32 src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = DY(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_a(m68000_base_device* mc68kcpu) +{ + UINT32 src = AY(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_AI_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_DI_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_IX_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AW_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AL_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCDI_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_PCIX_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpa_32_i(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = AX(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AY_AI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AY_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AY_DI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AY_IX_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AW_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_AL_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_PCDI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_8_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = OPER_PCIX_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AY_AI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AY_PI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AY_PD_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AY_DI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AY_IX_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AW_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_AL_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_PCDI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_16_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = OPER_PCIX_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = DY(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AY_AI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AY_PI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AY_PD_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AY_DI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AY_IX_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AW_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_AL_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_PCDI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpi_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = OPER_PCIX_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_8_ax7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_8(mc68kcpu); + UINT32 dst = OPER_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_8_ay7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PI_8(mc68kcpu); + UINT32 dst = OPER_AX_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_8_axy7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PI_8(mc68kcpu); + UINT32 dst = OPER_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_8(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_8(mc68kcpu); + UINT32 dst = OPER_AX_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_16(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_16(mc68kcpu); + UINT32 dst = OPER_AX_PI_16(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cmpm_32(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PI_32(mc68kcpu); + UINT32 dst = OPER_AX_PI_32(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_cpgen_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type) && (mc68kcpu->has_fpu || 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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_ftrapcc_32(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->has_fpu) + { + m68881_ftrap(mc68kcpu); + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_dbt_16(m68000_base_device* mc68kcpu) +{ + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbf_16(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; +} + + +void m68000_base_device_ops::m68k_op_dbhi_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_HI(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbls_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LS(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbcc_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_CC(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbcs_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_CS(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbne_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_NE(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbeq_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_EQ(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbvc_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_VC(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbvs_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_VS(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbpl_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_PL(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbmi_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_MI(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbge_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_GE(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dblt_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LT(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dbgt_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_GT(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_dble_16(m68000_base_device* mc68kcpu) +{ + if(COND_NOT_LE(mc68kcpu)) + { + UINT32* r_dst = &DY(mc68kcpu); + UINT32 res = MASK_OUT_ABOVE_16(*r_dst - 1); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | res; + if(res != 0xffff) + { + UINT32 offset = OPER_I_16(mc68kcpu); + REG_PC(mc68kcpu) -= 2; + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_branch_16((mc68kcpu), offset); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_noexp; + return; + } + REG_PC(mc68kcpu) += 2; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_dbcc_f_exp; + return; + } + REG_PC(mc68kcpu) += 2; +} + + +void m68000_base_device_ops::m68k_op_divs_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(DY(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divs_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + INT32 src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + INT32 quotient; + INT32 remainder; + + if(src != 0) + { + if((UINT32)*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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divu_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_16(mc68kcpu); + + if(src != 0) + { + UINT32 quotient = *r_dst / src; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = DY(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AY_AI_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AY_PI_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AY_PD_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AY_DI_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AY_IX_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AW_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_AL_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_PCDI_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_PCIX_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_divl_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 divisor = OPER_I_32(mc68kcpu); + UINT64 dividend = 0; + UINT64 quotient = 0; + UINT64 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)((INT64)dividend / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)dividend % (INT64)((INT32)divisor)); + if((INT64)quotient != (INT64)((INT32)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)((INT64)((INT32)dividend) / (INT64)((INT32)divisor)); + remainder = (UINT64)((INT64)((INT32)dividend) % (INT64)((INT32)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); +} + + +void m68000_base_device_ops::m68k_op_eor_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eor_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_eori_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) ^ OPER_I_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_eori_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_exg_32_dd(m68000_base_device* mc68kcpu) +{ + UINT32* reg_a = &DX(mc68kcpu); + UINT32* reg_b = &DY(mc68kcpu); + UINT32 tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +void m68000_base_device_ops::m68k_op_exg_32_aa(m68000_base_device* mc68kcpu) +{ + UINT32* reg_a = &AX(mc68kcpu); + UINT32* reg_b = &AY(mc68kcpu); + UINT32 tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +void m68000_base_device_ops::m68k_op_exg_32_da(m68000_base_device* mc68kcpu) +{ + UINT32* reg_a = &DX(mc68kcpu); + UINT32* reg_b = &AY(mc68kcpu); + UINT32 tmp = *reg_a; + *reg_a = *reg_b; + *reg_b = tmp; +} + + +void m68000_base_device_ops::m68k_op_ext_16(m68000_base_device* mc68kcpu) +{ + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_ext_32(m68000_base_device* mc68kcpu) +{ + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_extb_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32* 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); +} + + +void m68000_base_device_ops::m68k_op_illegal(m68000_base_device* mc68kcpu) +{ + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::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)->remaining_cycles > 0) + (mc68kcpu)->remaining_cycles = 0; +} + + +void m68000_base_device_ops::m68k_op_jsr_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_jsr_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_lea_32_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_AI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_DI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AY_IX_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AW_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_AL_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_PCDI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_lea_32_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = EA_PCIX_32(mc68kcpu); +} + + +void m68000_base_device_ops::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))); +} + + +void m68000_base_device_ops::m68k_op_link_16(m68000_base_device* mc68kcpu) +{ + UINT32* 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))); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_link_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32* 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); +} + + +void m68000_base_device_ops::m68k_op_lsr_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsr_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = *r_dst; + UINT32 res = src >> shift; + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsr_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = *r_dst; + UINT32 res = src >> shift; + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsr_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsl_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = *r_dst; + UINT32 res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_lsl_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = MASK_OUT_ABOVE_8(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = MASK_OUT_ABOVE_16(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = DX(mc68kcpu) & 0x3f; + UINT32 src = *r_dst; + UINT32 res = MASK_OUT_ABOVE_32(src << shift); + + if(shift != 0) + { + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_lsl_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_d_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ai_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi7_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pi_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd7_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_pd_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_di_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_ix_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_aw_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_8_al_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_d_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ai_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pi_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_pd_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_di_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_ix_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_aw_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_16_al_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_d_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ai_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pi_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_pd_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_di_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_ix_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_aw_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_a(m68000_base_device* mc68kcpu) +{ + UINT32 res = AY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_ai(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_pi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_pd(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_di(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_ix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_aw(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_al(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCDI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_PCIX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move_32_al_i(m68000_base_device* mc68kcpu) +{ + UINT32 res = OPER_I_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_movea_16_d(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(DY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_a(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(AY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_pi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_pd(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AW_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_AL_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_16_i(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = MAKE_INT_16(OPER_I_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_movea_32_d(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = DY(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_a(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = AY(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_ai(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_AI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_pi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_PI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_pd(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_PD_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_di(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_DI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_ix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AY_IX_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_aw(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AW_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_al(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_AL_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_pcdi(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_PCDI_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_pcix(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_PCIX_32(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movea_32_i(m68000_base_device* mc68kcpu) +{ + AX(mc68kcpu) = OPER_I_32(mc68kcpu); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_d(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), DY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_ai(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_AI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_pi(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_PI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_pd(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_PD_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_di(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_DI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_ix(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AY_IX_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_aw(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AW_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_al(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_AL_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_pcdi(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_PCDI_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_pcix(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_PCIX_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_move_16_toc_i(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), OPER_I_16(mc68kcpu)); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AY_AI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AY_PI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AY_PD_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AY_DI_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AY_IX_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AW_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_move_16_frs_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_000((mc68kcpu)->cpu_type) || (mc68kcpu)->s_flag) /* NS990408 */ + { + UINT32 ea = EA_AL_16(mc68kcpu); + m68ki_write_16((mc68kcpu), ea, m68ki_get_sr(mc68kcpu)); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_ai(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_pi(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_pd(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_di(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_ix(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_aw(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_al(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_pcdi(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_pcix(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_16_tos_i(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_move_32_fru(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + AY(mc68kcpu) = REG_USP(mc68kcpu); + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_movec_32_cr(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + switch (word2 & 0xfff) + { + case 0x000: /* SFC */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->sfc; + return; + case 0x001: /* DFC */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->dfc; + return; + case 0x002: /* CACR */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->cacr; + return; + } + return; + case 0x800: /* USP */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = REG_USP(mc68kcpu); + return; + case 0x801: /* VBR */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->vbr; + return; + case 0x802: /* CAAR */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->caar; + return; + } + m68ki_exception_illegal(mc68kcpu); + break; + case 0x803: /* MSP */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->m_flag ? REG_SP(mc68kcpu) : REG_MSP(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x804: /* ISP */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = (mc68kcpu)->m_flag ? REG_ISP(mc68kcpu) : REG_SP(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x003: /* TC */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_tc; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x004: /* ITT0 (040+, ACR0 on ColdFire) */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_itt0; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_acr0; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x005: /* ITT1 (040+, ACR1 on ColdFire) */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_itt1; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_acr1; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x006: /* DTT0 */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_dtt0; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_acr2; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x007: /* DTT1 */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_dtt1; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_acr3; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x805: /* MMUSR */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_sr_040; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x806: /* URP */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_urp_aptr; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x807: /* SRP */ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = mc68kcpu->mmu_srp_aptr; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc00: // ROMBAR0 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc01: // ROMBAR1 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc04: // RAMBAR0 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc05: // RAMBAR1 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0c: // MPCR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0d: // EDRAMBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0e: // SECMBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0f: // MBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + default: + m68ki_exception_illegal(mc68kcpu); + return; + } + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movec_32_rc(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + switch (word2 & 0xfff) + { + case 0x000: /* SFC */ + (mc68kcpu)->sfc = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 7; + return; + case 0x001: /* DFC */ + (mc68kcpu)->dfc = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 7; + return; + case 0x002: /* CACR */ + /* Only EC020 and later have CACR */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* 68030 can write all bits except 5-7, 040 can write all */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + (mc68kcpu)->cacr = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + } + else if (CPU_TYPE_IS_030_PLUS((mc68kcpu)->cpu_type)) + { + (mc68kcpu)->cacr = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 0xff1f; + } + else + { + (mc68kcpu)->cacr = REG_DA(mc68kcpu)[(word2 >> 12) & 15] & 0x0f; + } + +// mc68kcpu->logerror("movec to cacr=%04x\n", (mc68kcpu)->cacr); + if ((mc68kcpu)->cacr & (M68K_CACR_CI | M68K_CACR_CEI)) + { + m68ki_ic_clear(mc68kcpu); + } + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x800: /* USP */ + REG_USP(mc68kcpu) = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + case 0x801: /* VBR */ + (mc68kcpu)->vbr = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + case 0x802: /* CAAR */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + (mc68kcpu)->caar = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x803: /* MSP */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + /* we are in supervisor mode so just check for M flag */ + if(!(mc68kcpu)->m_flag) + { + REG_MSP(mc68kcpu) = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + REG_SP(mc68kcpu) = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x804: /* ISP */ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + if(!(mc68kcpu)->m_flag) + { + REG_SP(mc68kcpu) = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + REG_ISP(mc68kcpu) = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x003: /* TC */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_tc = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + + if (mc68kcpu->mmu_tc & 0x8000) + { + mc68kcpu->pmmu_enabled = 1; + } + else + { + mc68kcpu->pmmu_enabled = 0; + } + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x004: /* ITT0 */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_itt0 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_acr0 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x005: /* ITT1 */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_itt1 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_acr1 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x006: /* DTT0 */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_dtt0 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_acr2 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x007: /* DTT1 */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_dtt1 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + else if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_acr3 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x805: /* MMUSR */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_sr_040 = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x806: /* URP */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_urp_aptr = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0x807: /* SRP */ + if (CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->mmu_srp_aptr = REG_DA(mc68kcpu)[(word2 >> 12) & 15]; + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc00: // ROMBAR0 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc01: // ROMBAR1 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc04: // RAMBAR0 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc05: // RAMBAR1 + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0c: // MPCR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0d: // EDRAMBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0e: // SECMBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + case 0xc0f: // MBAR + if(CPU_TYPE_IS_COLDFIRE((mc68kcpu)->cpu_type)) + { + /* TODO */ + return; + } + m68ki_exception_illegal(mc68kcpu); + return; + default: + m68ki_exception_illegal(mc68kcpu); + return; + } + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = AY(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = AY(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + m68ki_write_32((mc68kcpu), ea, REG_DA(mc68kcpu)[i]); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = AY(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_PCDI_16(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_PCIX_16(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_pcrel_16((mc68kcpu), ea))); + ea += 2; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_di(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_16_er_al(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_w; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = AY(mc68kcpu); + UINT32 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)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_PCDI_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_pcrel_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_PCIX_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_pcrel_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_di(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movem_32_er_al(m68000_base_device* mc68kcpu) +{ + UINT32 i = 0; + UINT32 register_list = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 count = 0; + + for(; i < 16; i++) + if(register_list & (1 << i)) + { + REG_DA(mc68kcpu)[i] = m68ki_read_32((mc68kcpu), ea); + ea += 4; + count++; + } + + (mc68kcpu)->remaining_cycles -= count<<(mc68kcpu)->cyc_movem_l; +} + + +void m68000_base_device_ops::m68k_op_movep_16_re(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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)); +} + + +void m68000_base_device_ops::m68k_op_movep_32_re(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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)); +} + + +void m68000_base_device_ops::m68k_op_movep_16_er(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8((mc68kcpu), ea) << 8) + m68ki_read_8((mc68kcpu), ea + 2)); +} + + +void m68000_base_device_ops::m68k_op_movep_32_er(m68000_base_device* mc68kcpu) +{ + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_moves_8_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_pi7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_pd7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_8_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_8_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_8(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_8_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_16_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_16_fc((mc68kcpu), ea, (mc68kcpu)->dfc, MASK_OUT_ABOVE_16(REG_DA(mc68kcpu)[(word2 >> 12) & 15])); + return; + } + if(BIT_F(word2)) /* Memory to address register */ + { + REG_A(mc68kcpu)[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc)); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to data register */ + REG_D(mc68kcpu)[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D(mc68kcpu)[(word2 >> 12) & 7]) | m68ki_read_16_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moves_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + if((mc68kcpu)->s_flag) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + if(BIT_B(word2)) /* Register to memory */ + { + m68ki_write_32_fc((mc68kcpu), ea, (mc68kcpu)->dfc, REG_DA(mc68kcpu)[(word2 >> 12) & 15]); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + /* Memory to register */ + REG_DA(mc68kcpu)[(word2 >> 12) & 15] = m68ki_read_32_fc((mc68kcpu), ea, (mc68kcpu)->sfc); + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + (mc68kcpu)->remaining_cycles -= 2; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_moveq_32(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_move16_32(m68000_base_device* mc68kcpu) +{ + UINT16 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_muls_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mulu_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_mull_32_d(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = DY(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_ai(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AY_AI_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_pi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AY_PI_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_pd(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AY_PD_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_di(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AY_DI_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_ix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AY_IX_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_aw(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AW_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_al(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_AL_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_PCDI_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_PCIX_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_mull_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 word2 = OPER_I_16(mc68kcpu); + UINT64 src = OPER_I_32(mc68kcpu); + UINT64 dst = REG_D(mc68kcpu)[(word2 >> 12) & 7]; + UINT64 res; + + (mc68kcpu)->c_flag = CFLAG_CLEAR; + + if(BIT_B(word2)) /* signed */ + { + res = (INT64)((INT32)src) * (INT64)((INT32)dst); + if(!BIT_A(word2)) + { + (mc68kcpu)->not_z_flag = MASK_OUT_ABOVE_32(res); + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->v_flag = ((INT64)res != (INT32)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); +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_nbcd_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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 */ +} + + +void m68000_base_device_ops::m68k_op_neg_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_neg_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_neg_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_neg_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_neg_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_negx_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_negx_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_negx_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_negx_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 src = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_nop(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ +} + + +void m68000_base_device_ops::m68k_op_not_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_not_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_er_i(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_er_i(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_er_i(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_8_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_16_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_or_32_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ori_16_toc(m68000_base_device* mc68kcpu) +{ + m68ki_set_ccr((mc68kcpu), m68ki_get_ccr(mc68kcpu) | OPER_I_16(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_ori_16_tos(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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); +} + + +void m68000_base_device_ops::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 src = DY(mc68kcpu) + OPER_I_16(mc68kcpu); + UINT32* r_dst = &DX(mc68kcpu); + + *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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 ea_src = EA_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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 ea_src = EA_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_pack_16_mm_axy7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 ea_src = EA_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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 ea_src = EA_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_pea_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_PCDI_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pea_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_PCIX_32(mc68kcpu); + + m68ki_push_32((mc68kcpu), ea); +} + + +void m68000_base_device_ops::m68k_op_pflusha_32(m68000_base_device* mc68kcpu) +{ + if ((CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu)) + { + mc68kcpu->logerror("68040: unhandled PFLUSHA (ir=%04x)\n", mc68kcpu->ir); + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_pflushan_32(m68000_base_device* mc68kcpu) +{ + if ((CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu)) + { + mc68kcpu->logerror("68040: unhandled PFLUSHAN (ir=%04x)\n", mc68kcpu->ir); + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_pmmu_32(m68000_base_device* mc68kcpu) +{ + if ((CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu)) + { + m68881_mmu_ops(mc68kcpu); + } + else + { + m68ki_exception_1111(mc68kcpu); + } +} + + +void m68000_base_device_ops::m68k_op_ptest_32(m68000_base_device* mc68kcpu) +{ + if ((CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) && ((mc68kcpu)->has_pmmu)) + { + mc68kcpu->logerror("68040: unhandled PTEST\n"); + return; + } + else + { + m68ki_exception_1111(mc68kcpu); + } +} + + +void m68000_base_device_ops::m68k_op_reset(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + if (!(mc68kcpu)->reset_instr_callback.isnull()) + ((mc68kcpu)->reset_instr_callback)(1); + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_reset; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_ror_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 shift = orig_shift & 7; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROR_8(src, shift); + + if(orig_shift != 0) + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROR_16(src, shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT64 src = *r_dst; + UINT32 res = ROR_32(src, shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 7; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROR_8(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 15; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROR_16(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 31; + UINT64 src = *r_dst; + UINT32 res = ROR_32(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_ror_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 shift = orig_shift & 7; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROL_8(src, shift); + + if(orig_shift != 0) + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROL_16(src, shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_rol_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT64 src = *r_dst; + UINT32 res = ROL_32(src, shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_rol_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 7; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROL_8(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 15; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = MASK_OUT_ABOVE_16(ROL_16(src, shift)); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_rol_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + UINT32 shift = orig_shift & 31; + UINT64 src = *r_dst; + UINT32 res = ROL_32(src, shift); + + if(orig_shift != 0) + { + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + *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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rol_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROR_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxr_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT64 src = *r_dst; + UINT64 res = src | (((UINT64)XFLAG_AS_1(mc68kcpu)) << 32); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 9; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROR_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 17; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROR_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxr_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 33; + UINT64 src = *r_dst; + UINT64 res = src | (((UINT64)XFLAG_AS_1(mc68kcpu)) << 32); + + res = ROR_33_64(res, shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_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; + 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxr_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_8_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROL_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxl_32_s(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 shift = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT64 src = *r_dst; + UINT64 res = src | (((UINT64)XFLAG_AS_1(mc68kcpu)) << 32); + + if(shift != 0) + (mc68kcpu)->remaining_cycles -= shift<<(mc68kcpu)->cyc_shift; + + 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_8_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 9; + UINT32 src = MASK_OUT_ABOVE_8(*r_dst); + UINT32 res = ROL_9(src | (XFLAG_AS_1(mc68kcpu) << 8), shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 17; + UINT32 src = MASK_OUT_ABOVE_16(*r_dst); + UINT32 res = ROL_17(src | (XFLAG_AS_1(mc68kcpu) << 16), shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_shift; + + (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; +} + + +void m68000_base_device_ops::m68k_op_roxl_32_r(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 orig_shift = DX(mc68kcpu) & 0x3f; + + if(orig_shift != 0) + { + UINT32 shift = orig_shift % 33; + UINT64 src = *r_dst; + UINT64 res = src | (((UINT64)XFLAG_AS_1(mc68kcpu)) << 32); + + res = ROL_33_64(res, shift); + + (mc68kcpu)->remaining_cycles -= orig_shift<<(mc68kcpu)->cyc_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; + 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_roxl_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = m68ki_read_16((mc68kcpu), ea); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_rtd_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_010_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_rte_32(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 new_sr; + UINT32 new_pc; + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_rtm_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_020_VARIANT((mc68kcpu)->cpu_type)) + { + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (rtm)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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)); +} + + +void m68000_base_device_ops::m68k_op_rts_32(m68000_base_device* mc68kcpu) +{ + m68ki_trace_t0(mc68kcpu); /* auto-disable (see m68kcpu.h) */ + m68ki_jump((mc68kcpu), m68ki_pull_32(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_sbcd_8_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sbcd_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sbcd_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sbcd_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sbcd_8_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_st_8_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) |= 0xff; +} + + +void m68000_base_device_ops::m68k_op_st_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_st_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), 0xff); +} + + +void m68000_base_device_ops::m68k_op_sf_8_d(m68000_base_device* mc68kcpu) +{ + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sf_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_sf_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_HI(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sls_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_scc_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_CC(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_scs_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_CS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sne_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_NE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_seq_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_EQ(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_svc_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_svs_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_VS(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_spl_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_PL(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_smi_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_MI(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sge_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_GE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_slt_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LT(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sgt_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_GT(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_sle_8_d(m68000_base_device* mc68kcpu) +{ + if(COND_LE(mc68kcpu)) + { + DY(mc68kcpu) |= 0xff; + (mc68kcpu)->remaining_cycles -= (mc68kcpu)->cyc_scc_r_true; + return; + } + DY(mc68kcpu) &= 0xffffff00; +} + + +void m68000_base_device_ops::m68k_op_shi_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_shi_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_HI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sls_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scc_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_CC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_scs_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_CS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sne_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_NE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_seq_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_EQ(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svc_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_VC(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_svs_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_VS(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_spl_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_PL(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_smi_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_MI(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sge_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_GE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_slt_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sgt_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_GT(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_ai(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_AI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_pi(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_pi7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_pd(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_PD_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_pd7(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_A7_PD_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_di(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_DI_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_ix(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AY_IX_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_aw(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AW_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_sle_8_al(m68000_base_device* mc68kcpu) +{ + m68ki_write_8((mc68kcpu), EA_AL_8(mc68kcpu), COND_LE(mc68kcpu) ? 0xff : 0); +} + + +void m68000_base_device_ops::m68k_op_stop(m68000_base_device* mc68kcpu) +{ + if((mc68kcpu)->s_flag) + { + UINT32 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)->remaining_cycles = 0; + return; + } + m68ki_exception_privilege_violation(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pi7(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_A7_PI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pd7(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(AY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_16_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = AY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_AI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_DI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AY_IX_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AW_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_AL_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCDI_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_PCIX_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_32_er_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_8_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DX(mc68kcpu)); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_16_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DX(mc68kcpu)); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_sub_32_re_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 src = DX(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_suba_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY(mc68kcpu))); +} + + +void m68000_base_device_ops::m68k_op_suba_16_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY(mc68kcpu))); +} + + +void m68000_base_device_ops::m68k_op_suba_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_AI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_PI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_PD_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_DI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AY_IX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AW_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_AL_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_PCDI_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_PCIX_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_16_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = MAKE_INT_16(OPER_I_16(mc68kcpu)); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_suba_32_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY(mc68kcpu)); +} + + +void m68000_base_device_ops::m68k_op_suba_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_AI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_PI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_PD_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_di(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_DI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AY_IX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AW_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_al(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_AL_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_pcdi(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_PCDI_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_pcix(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_PCIX_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_suba_32_i(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AX(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - src); +} + + +void m68000_base_device_ops::m68k_op_subi_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subi_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_8(mc68kcpu); + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subi_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_16(mc68kcpu); + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subi_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subi_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_I_32(mc68kcpu); + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subq_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subq_16_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - (((((mc68kcpu)->ir >> 9) - 1) & 7) + 1)); +} + + +void m68000_base_device_ops::m68k_op_subq_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_d(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DY(mc68kcpu); + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subq_32_a(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AY(mc68kcpu); + + *r_dst = MASK_OUT_ABOVE_32(*r_dst - (((((mc68kcpu)->ir >> 9) - 1) & 7) + 1)); +} + + +void m68000_base_device_ops::m68k_op_subq_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_AI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_DI_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AY_IX_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AW_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subq_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 src = ((((mc68kcpu)->ir >> 9) - 1) & 7) + 1; + UINT32 ea = EA_AL_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_8_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_8(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_8(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subx_16_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = MASK_OUT_ABOVE_16(DY(mc68kcpu)); + UINT32 dst = MASK_OUT_ABOVE_16(*r_dst); + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subx_32_rr(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &DX(mc68kcpu); + UINT32 src = DY(mc68kcpu); + UINT32 dst = *r_dst; + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_subx_8_mm_ax7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_8_mm_ay7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_8_mm_axy7(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_8_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_8(mc68kcpu); + UINT32 ea = EA_AX_PD_8(mc68kcpu); + UINT32 dst = m68ki_read_8((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_16_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_16(mc68kcpu); + UINT32 ea = EA_AX_PD_16(mc68kcpu); + UINT32 dst = m68ki_read_16((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_subx_32_mm(m68000_base_device* mc68kcpu) +{ + UINT32 src = OPER_AY_PD_32(mc68kcpu); + UINT32 ea = EA_AX_PD_32(mc68kcpu); + UINT32 dst = m68ki_read_32((mc68kcpu), ea); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_swap_32(m68000_base_device* mc68kcpu) +{ + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_tas_8_d(m68000_base_device* mc68kcpu) +{ + UINT32* 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; +} + + +void m68000_base_device_ops::m68k_op_tas_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_AI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_DI_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AY_IX_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AW_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tas_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 ea = EA_AL_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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 */ +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_trapf(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + return; + } + m68ki_exception_illegal(mc68kcpu); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::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); +} + + +void m68000_base_device_ops::m68k_op_trapv(m68000_base_device* mc68kcpu) +{ + if(COND_VC(mc68kcpu)) + { + return; + } + m68ki_exception_trap((mc68kcpu), EXCEPTION_TRAPV); /* HJB 990403 */ +} + + +void m68000_base_device_ops::m68k_op_tst_8_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_pi7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_pd7(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_8_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_8_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_8_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_16_d(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_a(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_16_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_16_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_16_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_16_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_32_d(m68000_base_device* mc68kcpu) +{ + UINT32 res = DY(mc68kcpu); + + (mc68kcpu)->n_flag = NFLAG_32(res); + (mc68kcpu)->not_z_flag = res; + (mc68kcpu)->v_flag = VFLAG_CLEAR; + (mc68kcpu)->c_flag = CFLAG_CLEAR; +} + + +void m68000_base_device_ops::m68k_op_tst_32_a(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_32_ai(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_pi(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_pd(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_di(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_ix(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_aw(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_al(m68000_base_device* mc68kcpu) +{ + UINT32 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; +} + + +void m68000_base_device_ops::m68k_op_tst_32_pcdi(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_32_pcix(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_tst_32_i(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_unlk_32_a7(m68000_base_device* mc68kcpu) +{ + REG_A(mc68kcpu)[7] = m68ki_read_32((mc68kcpu), REG_A(mc68kcpu)[7]); +} + + +void m68000_base_device_ops::m68k_op_unlk_32(m68000_base_device* mc68kcpu) +{ + UINT32* r_dst = &AY(mc68kcpu); + + REG_A(mc68kcpu)[7] = *r_dst; + *r_dst = m68ki_pull_32(mc68kcpu); +} + + +void m68000_base_device_ops::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 src = DY(mc68kcpu); + UINT32* 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); +} + + +void m68000_base_device_ops::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 src = OPER_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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 src = OPER_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_unpk_16_mm_axy7(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_EC020_PLUS((mc68kcpu)->cpu_type)) + { + UINT32 src = OPER_A7_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::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 src = OPER_AY_PD_8(mc68kcpu); + UINT32 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); +} + + +void m68000_base_device_ops::m68k_op_cinv_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + UINT16 ir = mc68kcpu->ir; + UINT8 cache = (ir >> 6) & 3; +// UINT8 scope = (ir >> 3) & 3; +// mc68kcpu->logerror("68040 %s: pc=%08x ir=%04x cache=%d scope=%d register=%d\n", ir & 0x0020 ? "cpush" : "cinv", REG_PPC(mc68kcpu), ir, cache, scope, ir & 7); + switch (cache) + { + case 2: + case 3: + // we invalidate/push the whole instruction cache + m68ki_ic_clear(mc68kcpu); + } + return; + } + m68ki_exception_1111(mc68kcpu); +} + + +void m68000_base_device_ops::m68k_op_cpush_32(m68000_base_device* mc68kcpu) +{ + if(CPU_TYPE_IS_040_PLUS((mc68kcpu)->cpu_type)) + { + mc68kcpu->logerror("%s at %08x: called unimplemented instruction %04x (cpush)\n", + (mc68kcpu)->tag(), REG_PC(mc68kcpu) - 2, (mc68kcpu)->ir); + return; + } + 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 */ +struct opcode_handler_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 table */ +static const opcode_handler_struct m68k_opcode_handler_table[] = +{ +/* function mask match 000 010 020 040 */ + + + {m68000_base_device_ops::m68k_op_1010, 0xf000, 0xa000, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_1111, 0xf000, 0xf000, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_moveq_32, 0xf100, 0x7000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cpbcc_32, 0xf180, 0xf080, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_cpgen_32, 0xf1c0, 0xf000, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_cpscc_32, 0xf1c0, 0xf040, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_pmmu_32, 0xfe00, 0xf000, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_bra_8, 0xff00, 0x6000, { 10, 10, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_bsr_8, 0xff00, 0x6100, { 18, 18, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_bhi_8, 0xff00, 0x6200, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bls_8, 0xff00, 0x6300, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcc_8, 0xff00, 0x6400, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcs_8, 0xff00, 0x6500, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bne_8, 0xff00, 0x6600, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_beq_8, 0xff00, 0x6700, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvc_8, 0xff00, 0x6800, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvs_8, 0xff00, 0x6900, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bpl_8, 0xff00, 0x6a00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bmi_8, 0xff00, 0x6b00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bge_8, 0xff00, 0x6c00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_blt_8, 0xff00, 0x6d00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bgt_8, 0xff00, 0x6e00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_ble_8, 0xff00, 0x6f00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_040fpu0_32, 0xff00, 0xf200, {255, 255, 0, 0, 0, 0, 255}}, + {m68000_base_device_ops::m68k_op_040fpu1_32, 0xff00, 0xf300, {255, 255, 0, 0, 0, 0, 255}}, + {m68000_base_device_ops::m68k_op_cinv_32, 0xff20, 0xf400, {255, 255, 255, 255, 16, 255, 255}}, + {m68000_base_device_ops::m68k_op_cpush_32, 0xff20, 0xf420, {255, 255, 255, 255, 16, 255, 255}}, + {m68000_base_device_ops::m68k_op_btst_32_r_d, 0xf1f8, 0x0100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movep_16_er, 0xf1f8, 0x0108, { 16, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_btst_8_r_ai, 0xf1f8, 0x0110, { 8, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pi, 0xf1f8, 0x0118, { 8, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pd, 0xf1f8, 0x0120, { 10, 10, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_di, 0xf1f8, 0x0128, { 12, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_ix, 0xf1f8, 0x0130, { 14, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bchg_32_r_d, 0xf1f8, 0x0140, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movep_32_er, 0xf1f8, 0x0148, { 24, 24, 18, 18, 18, 18, 18}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_ai, 0xf1f8, 0x0150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_pi, 0xf1f8, 0x0158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_pd, 0xf1f8, 0x0160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_di, 0xf1f8, 0x0168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_ix, 0xf1f8, 0x0170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bclr_32_r_d, 0xf1f8, 0x0180, { 10, 10, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movep_16_re, 0xf1f8, 0x0188, { 16, 16, 11, 11, 11, 11, 11}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_ai, 0xf1f8, 0x0190, { 12, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_pi, 0xf1f8, 0x0198, { 12, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_pd, 0xf1f8, 0x01a0, { 14, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_di, 0xf1f8, 0x01a8, { 16, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_ix, 0xf1f8, 0x01b0, { 18, 20, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bset_32_r_d, 0xf1f8, 0x01c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movep_32_re, 0xf1f8, 0x01c8, { 24, 24, 17, 17, 17, 17, 17}}, + {m68000_base_device_ops::m68k_op_bset_8_r_ai, 0xf1f8, 0x01d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_pi, 0xf1f8, 0x01d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_pd, 0xf1f8, 0x01e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_di, 0xf1f8, 0x01e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_ix, 0xf1f8, 0x01f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_d_d, 0xf1f8, 0x1000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_ai, 0xf1f8, 0x1010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_pi, 0xf1f8, 0x1018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_pd, 0xf1f8, 0x1020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_di, 0xf1f8, 0x1028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_ix, 0xf1f8, 0x1030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_8_ai_d, 0xf1f8, 0x1080, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_ai, 0xf1f8, 0x1090, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pi, 0xf1f8, 0x1098, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pd, 0xf1f8, 0x10a0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_di, 0xf1f8, 0x10a8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_ix, 0xf1f8, 0x10b0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_d, 0xf1f8, 0x10c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_ai, 0xf1f8, 0x10d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pi, 0xf1f8, 0x10d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pd, 0xf1f8, 0x10e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_di, 0xf1f8, 0x10e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_ix, 0xf1f8, 0x10f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pd_d, 0xf1f8, 0x1100, { 8, 8, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_ai, 0xf1f8, 0x1110, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pi, 0xf1f8, 0x1118, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pd, 0xf1f8, 0x1120, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_di, 0xf1f8, 0x1128, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_ix, 0xf1f8, 0x1130, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_d, 0xf1f8, 0x1140, { 12, 12, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_ai, 0xf1f8, 0x1150, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pi, 0xf1f8, 0x1158, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pd, 0xf1f8, 0x1160, { 18, 18, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_di, 0xf1f8, 0x1168, { 20, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_ix, 0xf1f8, 0x1170, { 22, 22, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_8_ix_d, 0xf1f8, 0x1180, { 14, 14, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_ai, 0xf1f8, 0x1190, { 18, 18, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pi, 0xf1f8, 0x1198, { 18, 18, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pd, 0xf1f8, 0x11a0, { 20, 20, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_di, 0xf1f8, 0x11a8, { 22, 22, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_ix, 0xf1f8, 0x11b0, { 24, 24, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_move_32_d_d, 0xf1f8, 0x2000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_a, 0xf1f8, 0x2008, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_ai, 0xf1f8, 0x2010, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_pi, 0xf1f8, 0x2018, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_pd, 0xf1f8, 0x2020, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_di, 0xf1f8, 0x2028, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_ix, 0xf1f8, 0x2030, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_d, 0xf1f8, 0x2040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_a, 0xf1f8, 0x2048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_ai, 0xf1f8, 0x2050, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_pi, 0xf1f8, 0x2058, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_pd, 0xf1f8, 0x2060, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_di, 0xf1f8, 0x2068, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_ix, 0xf1f8, 0x2070, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_32_ai_d, 0xf1f8, 0x2080, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_a, 0xf1f8, 0x2088, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_ai, 0xf1f8, 0x2090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_pi, 0xf1f8, 0x2098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_pd, 0xf1f8, 0x20a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_di, 0xf1f8, 0x20a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_ix, 0xf1f8, 0x20b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_d, 0xf1f8, 0x20c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_a, 0xf1f8, 0x20c8, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_ai, 0xf1f8, 0x20d0, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_pi, 0xf1f8, 0x20d8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_pd, 0xf1f8, 0x20e0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_di, 0xf1f8, 0x20e8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_ix, 0xf1f8, 0x20f0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pd_d, 0xf1f8, 0x2100, { 12, 14, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_a, 0xf1f8, 0x2108, { 12, 14, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_ai, 0xf1f8, 0x2110, { 20, 22, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_pi, 0xf1f8, 0x2118, { 20, 22, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_pd, 0xf1f8, 0x2120, { 22, 24, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_di, 0xf1f8, 0x2128, { 24, 26, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_ix, 0xf1f8, 0x2130, { 26, 28, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_d, 0xf1f8, 0x2140, { 16, 16, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_a, 0xf1f8, 0x2148, { 16, 16, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_ai, 0xf1f8, 0x2150, { 24, 24, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_pi, 0xf1f8, 0x2158, { 24, 24, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_pd, 0xf1f8, 0x2160, { 26, 26, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_di, 0xf1f8, 0x2168, { 28, 28, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_ix, 0xf1f8, 0x2170, { 30, 30, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_32_ix_d, 0xf1f8, 0x2180, { 18, 18, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_a, 0xf1f8, 0x2188, { 18, 18, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_ai, 0xf1f8, 0x2190, { 26, 26, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_pi, 0xf1f8, 0x2198, { 26, 26, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_pd, 0xf1f8, 0x21a0, { 28, 28, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_di, 0xf1f8, 0x21a8, { 30, 30, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_ix, 0xf1f8, 0x21b0, { 32, 32, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_move_16_d_d, 0xf1f8, 0x3000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_a, 0xf1f8, 0x3008, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_ai, 0xf1f8, 0x3010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_pi, 0xf1f8, 0x3018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_pd, 0xf1f8, 0x3020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_di, 0xf1f8, 0x3028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_ix, 0xf1f8, 0x3030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_d, 0xf1f8, 0x3040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_a, 0xf1f8, 0x3048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_ai, 0xf1f8, 0x3050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_pi, 0xf1f8, 0x3058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_pd, 0xf1f8, 0x3060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_di, 0xf1f8, 0x3068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_ix, 0xf1f8, 0x3070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_16_ai_d, 0xf1f8, 0x3080, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_a, 0xf1f8, 0x3088, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_ai, 0xf1f8, 0x3090, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_pi, 0xf1f8, 0x3098, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_pd, 0xf1f8, 0x30a0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_di, 0xf1f8, 0x30a8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_ix, 0xf1f8, 0x30b0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_d, 0xf1f8, 0x30c0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_a, 0xf1f8, 0x30c8, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_ai, 0xf1f8, 0x30d0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_pi, 0xf1f8, 0x30d8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_pd, 0xf1f8, 0x30e0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_di, 0xf1f8, 0x30e8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_ix, 0xf1f8, 0x30f0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pd_d, 0xf1f8, 0x3100, { 8, 8, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_a, 0xf1f8, 0x3108, { 8, 8, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_ai, 0xf1f8, 0x3110, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_pi, 0xf1f8, 0x3118, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_pd, 0xf1f8, 0x3120, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_di, 0xf1f8, 0x3128, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_ix, 0xf1f8, 0x3130, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_d, 0xf1f8, 0x3140, { 12, 12, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_a, 0xf1f8, 0x3148, { 12, 12, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_ai, 0xf1f8, 0x3150, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_pi, 0xf1f8, 0x3158, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_pd, 0xf1f8, 0x3160, { 18, 18, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_di, 0xf1f8, 0x3168, { 20, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_ix, 0xf1f8, 0x3170, { 22, 22, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_16_ix_d, 0xf1f8, 0x3180, { 14, 14, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_a, 0xf1f8, 0x3188, { 14, 14, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_ai, 0xf1f8, 0x3190, { 18, 18, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_pi, 0xf1f8, 0x3198, { 18, 18, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_pd, 0xf1f8, 0x31a0, { 20, 20, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_di, 0xf1f8, 0x31a8, { 22, 22, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_ix, 0xf1f8, 0x31b0, { 24, 24, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_chk_32_d, 0xf1f8, 0x4100, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_ai, 0xf1f8, 0x4110, {255, 255, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_pi, 0xf1f8, 0x4118, {255, 255, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_pd, 0xf1f8, 0x4120, {255, 255, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_di, 0xf1f8, 0x4128, {255, 255, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_ix, 0xf1f8, 0x4130, {255, 255, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_d, 0xf1f8, 0x4180, { 10, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_ai, 0xf1f8, 0x4190, { 14, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_pi, 0xf1f8, 0x4198, { 14, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_pd, 0xf1f8, 0x41a0, { 16, 14, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_di, 0xf1f8, 0x41a8, { 18, 16, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_ix, 0xf1f8, 0x41b0, { 20, 18, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_lea_32_ai, 0xf1f8, 0x41d0, { 4, 4, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_lea_32_di, 0xf1f8, 0x41e8, { 8, 8, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_lea_32_ix, 0xf1f8, 0x41f0, { 12, 12, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_addq_8_d, 0xf1f8, 0x5000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addq_8_ai, 0xf1f8, 0x5010, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_pi, 0xf1f8, 0x5018, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_pd, 0xf1f8, 0x5020, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_di, 0xf1f8, 0x5028, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_ix, 0xf1f8, 0x5030, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_d, 0xf1f8, 0x5040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addq_16_a, 0xf1f8, 0x5048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addq_16_ai, 0xf1f8, 0x5050, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_pi, 0xf1f8, 0x5058, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_pd, 0xf1f8, 0x5060, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_di, 0xf1f8, 0x5068, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_ix, 0xf1f8, 0x5070, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_d, 0xf1f8, 0x5080, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addq_32_a, 0xf1f8, 0x5088, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addq_32_ai, 0xf1f8, 0x5090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_pi, 0xf1f8, 0x5098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_pd, 0xf1f8, 0x50a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_di, 0xf1f8, 0x50a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_ix, 0xf1f8, 0x50b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_d, 0xf1f8, 0x5100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subq_8_ai, 0xf1f8, 0x5110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_pi, 0xf1f8, 0x5118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_pd, 0xf1f8, 0x5120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_di, 0xf1f8, 0x5128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_ix, 0xf1f8, 0x5130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_d, 0xf1f8, 0x5140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subq_16_a, 0xf1f8, 0x5148, { 8, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subq_16_ai, 0xf1f8, 0x5150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_pi, 0xf1f8, 0x5158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_pd, 0xf1f8, 0x5160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_di, 0xf1f8, 0x5168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_ix, 0xf1f8, 0x5170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_d, 0xf1f8, 0x5180, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subq_32_a, 0xf1f8, 0x5188, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subq_32_ai, 0xf1f8, 0x5190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_pi, 0xf1f8, 0x5198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_pd, 0xf1f8, 0x51a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_di, 0xf1f8, 0x51a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_ix, 0xf1f8, 0x51b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_or_8_er_d, 0xf1f8, 0x8000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_ai, 0xf1f8, 0x8010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_pi, 0xf1f8, 0x8018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_pd, 0xf1f8, 0x8020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_di, 0xf1f8, 0x8028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_ix, 0xf1f8, 0x8030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_d, 0xf1f8, 0x8040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_ai, 0xf1f8, 0x8050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_pi, 0xf1f8, 0x8058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_pd, 0xf1f8, 0x8060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_di, 0xf1f8, 0x8068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_ix, 0xf1f8, 0x8070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_d, 0xf1f8, 0x8080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_ai, 0xf1f8, 0x8090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_pi, 0xf1f8, 0x8098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_pd, 0xf1f8, 0x80a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_di, 0xf1f8, 0x80a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_ix, 0xf1f8, 0x80b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_divu_16_d, 0xf1f8, 0x80c0, {140, 108, 44, 44, 44, 44, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_ai, 0xf1f8, 0x80d0, {144, 112, 48, 48, 48, 48, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_pi, 0xf1f8, 0x80d8, {144, 112, 48, 48, 48, 48, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_pd, 0xf1f8, 0x80e0, {146, 114, 49, 49, 49, 49, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_di, 0xf1f8, 0x80e8, {148, 116, 49, 49, 49, 49, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_ix, 0xf1f8, 0x80f0, {150, 118, 51, 51, 51, 51, 44}}, + {m68000_base_device_ops::m68k_op_sbcd_8_rr, 0xf1f8, 0x8100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sbcd_8_mm, 0xf1f8, 0x8108, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_or_8_re_ai, 0xf1f8, 0x8110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_pi, 0xf1f8, 0x8118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_pd, 0xf1f8, 0x8120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_di, 0xf1f8, 0x8128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_ix, 0xf1f8, 0x8130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_pack_16_rr, 0xf1f8, 0x8140, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_pack_16_mm, 0xf1f8, 0x8148, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_or_16_re_ai, 0xf1f8, 0x8150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_16_re_pi, 0xf1f8, 0x8158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_16_re_pd, 0xf1f8, 0x8160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_16_re_di, 0xf1f8, 0x8168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_16_re_ix, 0xf1f8, 0x8170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_unpk_16_rr, 0xf1f8, 0x8180, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_unpk_16_mm, 0xf1f8, 0x8188, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_or_32_re_ai, 0xf1f8, 0x8190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_32_re_pi, 0xf1f8, 0x8198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_32_re_pd, 0xf1f8, 0x81a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_32_re_di, 0xf1f8, 0x81a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_32_re_ix, 0xf1f8, 0x81b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_divs_16_d, 0xf1f8, 0x81c0, {158, 122, 56, 56, 56, 56, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_ai, 0xf1f8, 0x81d0, {162, 126, 60, 60, 60, 60, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_pi, 0xf1f8, 0x81d8, {162, 126, 60, 60, 60, 60, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_pd, 0xf1f8, 0x81e0, {164, 128, 61, 61, 61, 61, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_di, 0xf1f8, 0x81e8, {166, 130, 61, 61, 61, 61, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_ix, 0xf1f8, 0x81f0, {168, 132, 63, 63, 63, 63, 56}}, + {m68000_base_device_ops::m68k_op_sub_8_er_d, 0xf1f8, 0x9000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_ai, 0xf1f8, 0x9010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pi, 0xf1f8, 0x9018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pd, 0xf1f8, 0x9020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_di, 0xf1f8, 0x9028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_ix, 0xf1f8, 0x9030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_d, 0xf1f8, 0x9040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_a, 0xf1f8, 0x9048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_ai, 0xf1f8, 0x9050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_pi, 0xf1f8, 0x9058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_pd, 0xf1f8, 0x9060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_di, 0xf1f8, 0x9068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_ix, 0xf1f8, 0x9070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_d, 0xf1f8, 0x9080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_a, 0xf1f8, 0x9088, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_ai, 0xf1f8, 0x9090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_pi, 0xf1f8, 0x9098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_pd, 0xf1f8, 0x90a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_di, 0xf1f8, 0x90a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_ix, 0xf1f8, 0x90b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_d, 0xf1f8, 0x90c0, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_a, 0xf1f8, 0x90c8, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_ai, 0xf1f8, 0x90d0, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_pi, 0xf1f8, 0x90d8, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_pd, 0xf1f8, 0x90e0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_di, 0xf1f8, 0x90e8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_ix, 0xf1f8, 0x90f0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_subx_8_rr, 0xf1f8, 0x9100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subx_8_mm, 0xf1f8, 0x9108, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_sub_8_re_ai, 0xf1f8, 0x9110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_pi, 0xf1f8, 0x9118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_pd, 0xf1f8, 0x9120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_di, 0xf1f8, 0x9128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_ix, 0xf1f8, 0x9130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subx_16_rr, 0xf1f8, 0x9140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subx_16_mm, 0xf1f8, 0x9148, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_sub_16_re_ai, 0xf1f8, 0x9150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_pi, 0xf1f8, 0x9158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_pd, 0xf1f8, 0x9160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_di, 0xf1f8, 0x9168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_ix, 0xf1f8, 0x9170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subx_32_rr, 0xf1f8, 0x9180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subx_32_mm, 0xf1f8, 0x9188, { 30, 30, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_sub_32_re_ai, 0xf1f8, 0x9190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_pi, 0xf1f8, 0x9198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_pd, 0xf1f8, 0x91a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_di, 0xf1f8, 0x91a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_ix, 0xf1f8, 0x91b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_suba_32_d, 0xf1f8, 0x91c0, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_a, 0xf1f8, 0x91c8, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_ai, 0xf1f8, 0x91d0, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_pi, 0xf1f8, 0x91d8, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_pd, 0xf1f8, 0x91e0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_di, 0xf1f8, 0x91e8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_ix, 0xf1f8, 0x91f0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_d, 0xf1f8, 0xb000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_ai, 0xf1f8, 0xb010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pi, 0xf1f8, 0xb018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pd, 0xf1f8, 0xb020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_di, 0xf1f8, 0xb028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_ix, 0xf1f8, 0xb030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_d, 0xf1f8, 0xb040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_a, 0xf1f8, 0xb048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_ai, 0xf1f8, 0xb050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_pi, 0xf1f8, 0xb058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_pd, 0xf1f8, 0xb060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_di, 0xf1f8, 0xb068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_ix, 0xf1f8, 0xb070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_d, 0xf1f8, 0xb080, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_a, 0xf1f8, 0xb088, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_ai, 0xf1f8, 0xb090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_pi, 0xf1f8, 0xb098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_pd, 0xf1f8, 0xb0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_di, 0xf1f8, 0xb0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_ix, 0xf1f8, 0xb0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmpa_16_d, 0xf1f8, 0xb0c0, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_a, 0xf1f8, 0xb0c8, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_ai, 0xf1f8, 0xb0d0, { 10, 10, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_pi, 0xf1f8, 0xb0d8, { 10, 10, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_pd, 0xf1f8, 0xb0e0, { 12, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_di, 0xf1f8, 0xb0e8, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_ix, 0xf1f8, 0xb0f0, { 16, 16, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_d, 0xf1f8, 0xb100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpm_8, 0xf1f8, 0xb108, { 12, 12, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_eor_8_ai, 0xf1f8, 0xb110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_pi, 0xf1f8, 0xb118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_pd, 0xf1f8, 0xb120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_di, 0xf1f8, 0xb128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_ix, 0xf1f8, 0xb130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_d, 0xf1f8, 0xb140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpm_16, 0xf1f8, 0xb148, { 12, 12, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_eor_16_ai, 0xf1f8, 0xb150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_pi, 0xf1f8, 0xb158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_pd, 0xf1f8, 0xb160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_di, 0xf1f8, 0xb168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_ix, 0xf1f8, 0xb170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_d, 0xf1f8, 0xb180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpm_32, 0xf1f8, 0xb188, { 20, 20, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_eor_32_ai, 0xf1f8, 0xb190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_pi, 0xf1f8, 0xb198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_pd, 0xf1f8, 0xb1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_di, 0xf1f8, 0xb1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_ix, 0xf1f8, 0xb1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_d, 0xf1f8, 0xb1c0, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_a, 0xf1f8, 0xb1c8, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_ai, 0xf1f8, 0xb1d0, { 14, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_pi, 0xf1f8, 0xb1d8, { 14, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_pd, 0xf1f8, 0xb1e0, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_di, 0xf1f8, 0xb1e8, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_ix, 0xf1f8, 0xb1f0, { 20, 20, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_and_8_er_d, 0xf1f8, 0xc000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_ai, 0xf1f8, 0xc010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_pi, 0xf1f8, 0xc018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_pd, 0xf1f8, 0xc020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_di, 0xf1f8, 0xc028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_ix, 0xf1f8, 0xc030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_d, 0xf1f8, 0xc040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_ai, 0xf1f8, 0xc050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_pi, 0xf1f8, 0xc058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_pd, 0xf1f8, 0xc060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_di, 0xf1f8, 0xc068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_ix, 0xf1f8, 0xc070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_d, 0xf1f8, 0xc080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_ai, 0xf1f8, 0xc090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_pi, 0xf1f8, 0xc098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_pd, 0xf1f8, 0xc0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_di, 0xf1f8, 0xc0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_ix, 0xf1f8, 0xc0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_mulu_16_d, 0xf1f8, 0xc0c0, { 54, 30, 27, 27, 27, 27, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_ai, 0xf1f8, 0xc0d0, { 58, 34, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_pi, 0xf1f8, 0xc0d8, { 58, 34, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_pd, 0xf1f8, 0xc0e0, { 60, 36, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_di, 0xf1f8, 0xc0e8, { 62, 38, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_ix, 0xf1f8, 0xc0f0, { 64, 40, 34, 34, 34, 34, 27}}, + {m68000_base_device_ops::m68k_op_abcd_8_rr, 0xf1f8, 0xc100, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_abcd_8_mm, 0xf1f8, 0xc108, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_and_8_re_ai, 0xf1f8, 0xc110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_pi, 0xf1f8, 0xc118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_pd, 0xf1f8, 0xc120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_di, 0xf1f8, 0xc128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_ix, 0xf1f8, 0xc130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_exg_32_dd, 0xf1f8, 0xc140, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_exg_32_aa, 0xf1f8, 0xc148, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_and_16_re_ai, 0xf1f8, 0xc150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_pi, 0xf1f8, 0xc158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_pd, 0xf1f8, 0xc160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_di, 0xf1f8, 0xc168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_ix, 0xf1f8, 0xc170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_exg_32_da, 0xf1f8, 0xc188, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_and_32_re_ai, 0xf1f8, 0xc190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_pi, 0xf1f8, 0xc198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_pd, 0xf1f8, 0xc1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_di, 0xf1f8, 0xc1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_ix, 0xf1f8, 0xc1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_muls_16_d, 0xf1f8, 0xc1c0, { 54, 32, 27, 27, 27, 27, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_ai, 0xf1f8, 0xc1d0, { 58, 36, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_pi, 0xf1f8, 0xc1d8, { 58, 36, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_pd, 0xf1f8, 0xc1e0, { 60, 38, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_di, 0xf1f8, 0xc1e8, { 62, 40, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_ix, 0xf1f8, 0xc1f0, { 64, 42, 34, 34, 34, 34, 27}}, + {m68000_base_device_ops::m68k_op_add_8_er_d, 0xf1f8, 0xd000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_ai, 0xf1f8, 0xd010, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_pi, 0xf1f8, 0xd018, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_pd, 0xf1f8, 0xd020, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_di, 0xf1f8, 0xd028, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_ix, 0xf1f8, 0xd030, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_d, 0xf1f8, 0xd040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_a, 0xf1f8, 0xd048, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_ai, 0xf1f8, 0xd050, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_pi, 0xf1f8, 0xd058, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_pd, 0xf1f8, 0xd060, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_di, 0xf1f8, 0xd068, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_ix, 0xf1f8, 0xd070, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_d, 0xf1f8, 0xd080, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_a, 0xf1f8, 0xd088, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_ai, 0xf1f8, 0xd090, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_pi, 0xf1f8, 0xd098, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_pd, 0xf1f8, 0xd0a0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_di, 0xf1f8, 0xd0a8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_ix, 0xf1f8, 0xd0b0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_d, 0xf1f8, 0xd0c0, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_a, 0xf1f8, 0xd0c8, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_ai, 0xf1f8, 0xd0d0, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_pi, 0xf1f8, 0xd0d8, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_pd, 0xf1f8, 0xd0e0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_di, 0xf1f8, 0xd0e8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_ix, 0xf1f8, 0xd0f0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_addx_8_rr, 0xf1f8, 0xd100, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addx_8_mm, 0xf1f8, 0xd108, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_add_8_re_ai, 0xf1f8, 0xd110, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_pi, 0xf1f8, 0xd118, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_pd, 0xf1f8, 0xd120, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_di, 0xf1f8, 0xd128, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_ix, 0xf1f8, 0xd130, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addx_16_rr, 0xf1f8, 0xd140, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addx_16_mm, 0xf1f8, 0xd148, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_add_16_re_ai, 0xf1f8, 0xd150, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_pi, 0xf1f8, 0xd158, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_pd, 0xf1f8, 0xd160, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_di, 0xf1f8, 0xd168, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_ix, 0xf1f8, 0xd170, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addx_32_rr, 0xf1f8, 0xd180, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addx_32_mm, 0xf1f8, 0xd188, { 30, 30, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_add_32_re_ai, 0xf1f8, 0xd190, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_pi, 0xf1f8, 0xd198, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_pd, 0xf1f8, 0xd1a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_di, 0xf1f8, 0xd1a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_ix, 0xf1f8, 0xd1b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_adda_32_d, 0xf1f8, 0xd1c0, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_a, 0xf1f8, 0xd1c8, { 8, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_ai, 0xf1f8, 0xd1d0, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_pi, 0xf1f8, 0xd1d8, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_pd, 0xf1f8, 0xd1e0, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_di, 0xf1f8, 0xd1e8, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_ix, 0xf1f8, 0xd1f0, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_asr_8_s, 0xf1f8, 0xe000, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_8_s, 0xf1f8, 0xe008, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxr_8_s, 0xf1f8, 0xe010, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_8_s, 0xf1f8, 0xe018, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asr_8_r, 0xf1f8, 0xe020, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_8_r, 0xf1f8, 0xe028, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxr_8_r, 0xf1f8, 0xe030, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_8_r, 0xf1f8, 0xe038, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asr_16_s, 0xf1f8, 0xe040, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_16_s, 0xf1f8, 0xe048, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxr_16_s, 0xf1f8, 0xe050, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_16_s, 0xf1f8, 0xe058, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asr_16_r, 0xf1f8, 0xe060, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_16_r, 0xf1f8, 0xe068, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxr_16_r, 0xf1f8, 0xe070, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_16_r, 0xf1f8, 0xe078, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asr_32_s, 0xf1f8, 0xe080, { 8, 8, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_32_s, 0xf1f8, 0xe088, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxr_32_s, 0xf1f8, 0xe090, { 8, 8, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_32_s, 0xf1f8, 0xe098, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asr_32_r, 0xf1f8, 0xe0a0, { 8, 8, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_lsr_32_r, 0xf1f8, 0xe0a8, { 8, 8, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxr_32_r, 0xf1f8, 0xe0b0, { 8, 8, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ror_32_r, 0xf1f8, 0xe0b8, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_8_s, 0xf1f8, 0xe100, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_8_s, 0xf1f8, 0xe108, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxl_8_s, 0xf1f8, 0xe110, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_8_s, 0xf1f8, 0xe118, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_8_r, 0xf1f8, 0xe120, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_8_r, 0xf1f8, 0xe128, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxl_8_r, 0xf1f8, 0xe130, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_8_r, 0xf1f8, 0xe138, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_16_s, 0xf1f8, 0xe140, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_16_s, 0xf1f8, 0xe148, { 6, 6, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxl_16_s, 0xf1f8, 0xe150, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_16_s, 0xf1f8, 0xe158, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_16_r, 0xf1f8, 0xe160, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_16_r, 0xf1f8, 0xe168, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxl_16_r, 0xf1f8, 0xe170, { 6, 6, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_16_r, 0xf1f8, 0xe178, { 6, 6, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_32_s, 0xf1f8, 0xe180, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_32_s, 0xf1f8, 0xe188, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_roxl_32_s, 0xf1f8, 0xe190, { 8, 8, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_32_s, 0xf1f8, 0xe198, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_asl_32_r, 0xf1f8, 0xe1a0, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_lsl_32_r, 0xf1f8, 0xe1a8, { 8, 8, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_roxl_32_r, 0xf1f8, 0xe1b0, { 8, 8, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_rol_32_r, 0xf1f8, 0xe1b8, { 8, 8, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_cpdbcc_32, 0xf1f8, 0xf048, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_cptrapcc_32, 0xf1f8, 0xf078, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_ptest_32, 0xffd8, 0xf548, {255, 255, 255, 255, 8, 255, 255}}, + {m68000_base_device_ops::m68k_op_rtm_32, 0xfff0, 0x06c0, {255, 255, 19, 19, 19, 19, 19}}, + {m68000_base_device_ops::m68k_op_trap, 0xfff0, 0x4e40, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pi7, 0xf1ff, 0x011f, { 8, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pd7, 0xf1ff, 0x0127, { 10, 10, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_aw, 0xf1ff, 0x0138, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_al, 0xf1ff, 0x0139, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pcdi, 0xf1ff, 0x013a, { 12, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_pcix, 0xf1ff, 0x013b, { 14, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_r_i, 0xf1ff, 0x013c, { 8, 8, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_pi7, 0xf1ff, 0x015f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_pd7, 0xf1ff, 0x0167, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_aw, 0xf1ff, 0x0178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_r_al, 0xf1ff, 0x0179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_pi7, 0xf1ff, 0x019f, { 12, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_pd7, 0xf1ff, 0x01a7, { 14, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_aw, 0xf1ff, 0x01b8, { 16, 18, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_r_al, 0xf1ff, 0x01b9, { 20, 22, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_pi7, 0xf1ff, 0x01df, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_pd7, 0xf1ff, 0x01e7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_aw, 0xf1ff, 0x01f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_r_al, 0xf1ff, 0x01f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_d_pi7, 0xf1ff, 0x101f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_pd7, 0xf1ff, 0x1027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_aw, 0xf1ff, 0x1038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_al, 0xf1ff, 0x1039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_pcdi, 0xf1ff, 0x103a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_pcix, 0xf1ff, 0x103b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_8_d_i, 0xf1ff, 0x103c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pi7, 0xf1ff, 0x109f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pd7, 0xf1ff, 0x10a7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_aw, 0xf1ff, 0x10b8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_al, 0xf1ff, 0x10b9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pcdi, 0xf1ff, 0x10ba, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_pcix, 0xf1ff, 0x10bb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_ai_i, 0xf1ff, 0x10bc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pi7, 0xf1ff, 0x10df, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pd7, 0xf1ff, 0x10e7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_aw, 0xf1ff, 0x10f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_al, 0xf1ff, 0x10f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pcdi, 0xf1ff, 0x10fa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_pcix, 0xf1ff, 0x10fb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi_i, 0xf1ff, 0x10fc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pi7, 0xf1ff, 0x111f, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pd7, 0xf1ff, 0x1127, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_aw, 0xf1ff, 0x1138, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_al, 0xf1ff, 0x1139, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pcdi, 0xf1ff, 0x113a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_pcix, 0xf1ff, 0x113b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd_i, 0xf1ff, 0x113c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pi7, 0xf1ff, 0x115f, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pd7, 0xf1ff, 0x1167, { 18, 18, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_aw, 0xf1ff, 0x1178, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_al, 0xf1ff, 0x1179, { 24, 24, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pcdi, 0xf1ff, 0x117a, { 20, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_pcix, 0xf1ff, 0x117b, { 22, 22, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_8_di_i, 0xf1ff, 0x117c, { 16, 16, 7, 7, 7, 7, 5}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pi7, 0xf1ff, 0x119f, { 18, 18, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pd7, 0xf1ff, 0x11a7, { 20, 20, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_aw, 0xf1ff, 0x11b8, { 22, 22, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_al, 0xf1ff, 0x11b9, { 26, 26, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pcdi, 0xf1ff, 0x11ba, { 22, 22, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_pcix, 0xf1ff, 0x11bb, { 24, 24, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_move_8_ix_i, 0xf1ff, 0x11bc, { 18, 18, 9, 9, 9, 9, 7}}, + {m68000_base_device_ops::m68k_op_move_32_d_aw, 0xf1ff, 0x2038, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_al, 0xf1ff, 0x2039, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_pcdi, 0xf1ff, 0x203a, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_pcix, 0xf1ff, 0x203b, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_32_d_i, 0xf1ff, 0x203c, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_aw, 0xf1ff, 0x2078, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_al, 0xf1ff, 0x2079, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_pcdi, 0xf1ff, 0x207a, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_pcix, 0xf1ff, 0x207b, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_movea_32_i, 0xf1ff, 0x207c, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_32_ai_aw, 0xf1ff, 0x20b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_al, 0xf1ff, 0x20b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_pcdi, 0xf1ff, 0x20ba, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_pcix, 0xf1ff, 0x20bb, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_ai_i, 0xf1ff, 0x20bc, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_aw, 0xf1ff, 0x20f8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_al, 0xf1ff, 0x20f9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_pcdi, 0xf1ff, 0x20fa, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_pcix, 0xf1ff, 0x20fb, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pi_i, 0xf1ff, 0x20fc, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_pd_aw, 0xf1ff, 0x2138, { 24, 26, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_al, 0xf1ff, 0x2139, { 28, 30, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_pcdi, 0xf1ff, 0x213a, { 24, 26, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_pcix, 0xf1ff, 0x213b, { 26, 28, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_32_pd_i, 0xf1ff, 0x213c, { 20, 22, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_aw, 0xf1ff, 0x2178, { 28, 28, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_al, 0xf1ff, 0x2179, { 32, 32, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_pcdi, 0xf1ff, 0x217a, { 28, 28, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_pcix, 0xf1ff, 0x217b, { 30, 30, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_32_di_i, 0xf1ff, 0x217c, { 24, 24, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_32_ix_aw, 0xf1ff, 0x21b8, { 30, 30, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_al, 0xf1ff, 0x21b9, { 34, 34, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_pcdi, 0xf1ff, 0x21ba, { 30, 30, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_pcix, 0xf1ff, 0x21bb, { 32, 32, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_move_32_ix_i, 0xf1ff, 0x21bc, { 26, 26, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_16_d_aw, 0xf1ff, 0x3038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_al, 0xf1ff, 0x3039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_pcdi, 0xf1ff, 0x303a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_pcix, 0xf1ff, 0x303b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_move_16_d_i, 0xf1ff, 0x303c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_aw, 0xf1ff, 0x3078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_al, 0xf1ff, 0x3079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_pcdi, 0xf1ff, 0x307a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_pcix, 0xf1ff, 0x307b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_movea_16_i, 0xf1ff, 0x307c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_move_16_ai_aw, 0xf1ff, 0x30b8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_al, 0xf1ff, 0x30b9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_pcdi, 0xf1ff, 0x30ba, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_pcix, 0xf1ff, 0x30bb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_ai_i, 0xf1ff, 0x30bc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_aw, 0xf1ff, 0x30f8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_al, 0xf1ff, 0x30f9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_pcdi, 0xf1ff, 0x30fa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_pcix, 0xf1ff, 0x30fb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pi_i, 0xf1ff, 0x30fc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_16_pd_aw, 0xf1ff, 0x3138, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_al, 0xf1ff, 0x3139, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_pcdi, 0xf1ff, 0x313a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_pcix, 0xf1ff, 0x313b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_16_pd_i, 0xf1ff, 0x313c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_aw, 0xf1ff, 0x3178, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_al, 0xf1ff, 0x3179, { 24, 24, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_pcdi, 0xf1ff, 0x317a, { 20, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_pcix, 0xf1ff, 0x317b, { 22, 22, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_16_di_i, 0xf1ff, 0x317c, { 16, 16, 7, 7, 7, 7, 5}}, + {m68000_base_device_ops::m68k_op_move_16_ix_aw, 0xf1ff, 0x31b8, { 22, 22, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_al, 0xf1ff, 0x31b9, { 26, 26, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_pcdi, 0xf1ff, 0x31ba, { 22, 22, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_pcix, 0xf1ff, 0x31bb, { 24, 24, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_move_16_ix_i, 0xf1ff, 0x31bc, { 18, 18, 9, 9, 9, 9, 7}}, + {m68000_base_device_ops::m68k_op_chk_32_aw, 0xf1ff, 0x4138, {255, 255, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_al, 0xf1ff, 0x4139, {255, 255, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_pcdi, 0xf1ff, 0x413a, {255, 255, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_pcix, 0xf1ff, 0x413b, {255, 255, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_chk_32_i, 0xf1ff, 0x413c, {255, 255, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_aw, 0xf1ff, 0x41b8, { 18, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_al, 0xf1ff, 0x41b9, { 22, 20, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_pcdi, 0xf1ff, 0x41ba, { 18, 16, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_pcix, 0xf1ff, 0x41bb, { 20, 18, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_chk_16_i, 0xf1ff, 0x41bc, { 14, 12, 10, 10, 10, 10, 8}}, + {m68000_base_device_ops::m68k_op_lea_32_aw, 0xf1ff, 0x41f8, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_lea_32_al, 0xf1ff, 0x41f9, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_lea_32_pcdi, 0xf1ff, 0x41fa, { 8, 8, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_lea_32_pcix, 0xf1ff, 0x41fb, { 12, 12, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_addq_8_pi7, 0xf1ff, 0x501f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_pd7, 0xf1ff, 0x5027, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_aw, 0xf1ff, 0x5038, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_8_al, 0xf1ff, 0x5039, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_aw, 0xf1ff, 0x5078, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_16_al, 0xf1ff, 0x5079, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_aw, 0xf1ff, 0x50b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addq_32_al, 0xf1ff, 0x50b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_pi7, 0xf1ff, 0x511f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_pd7, 0xf1ff, 0x5127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_aw, 0xf1ff, 0x5138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_8_al, 0xf1ff, 0x5139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_aw, 0xf1ff, 0x5178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_16_al, 0xf1ff, 0x5179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_aw, 0xf1ff, 0x51b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subq_32_al, 0xf1ff, 0x51b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_8_er_pi7, 0xf1ff, 0x801f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_pd7, 0xf1ff, 0x8027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_aw, 0xf1ff, 0x8038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_al, 0xf1ff, 0x8039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_pcdi, 0xf1ff, 0x803a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_pcix, 0xf1ff, 0x803b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_or_8_er_i, 0xf1ff, 0x803c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_aw, 0xf1ff, 0x8078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_al, 0xf1ff, 0x8079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_pcdi, 0xf1ff, 0x807a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_pcix, 0xf1ff, 0x807b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_or_16_er_i, 0xf1ff, 0x807c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_aw, 0xf1ff, 0x80b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_al, 0xf1ff, 0x80b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_pcdi, 0xf1ff, 0x80ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_pcix, 0xf1ff, 0x80bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_or_32_er_i, 0xf1ff, 0x80bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_divu_16_aw, 0xf1ff, 0x80f8, {148, 116, 48, 48, 48, 48, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_al, 0xf1ff, 0x80f9, {152, 120, 48, 48, 48, 48, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_pcdi, 0xf1ff, 0x80fa, {148, 116, 49, 49, 49, 49, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_pcix, 0xf1ff, 0x80fb, {150, 118, 51, 51, 51, 51, 44}}, + {m68000_base_device_ops::m68k_op_divu_16_i, 0xf1ff, 0x80fc, {144, 112, 46, 46, 46, 46, 44}}, + {m68000_base_device_ops::m68k_op_sbcd_8_mm_ay7, 0xf1ff, 0x810f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_or_8_re_pi7, 0xf1ff, 0x811f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_pd7, 0xf1ff, 0x8127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_aw, 0xf1ff, 0x8138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_8_re_al, 0xf1ff, 0x8139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_pack_16_mm_ay7, 0xf1ff, 0x814f, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_or_16_re_aw, 0xf1ff, 0x8178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_16_re_al, 0xf1ff, 0x8179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_unpk_16_mm_ay7, 0xf1ff, 0x818f, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_or_32_re_aw, 0xf1ff, 0x81b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_or_32_re_al, 0xf1ff, 0x81b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_divs_16_aw, 0xf1ff, 0x81f8, {166, 130, 60, 60, 60, 60, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_al, 0xf1ff, 0x81f9, {170, 134, 60, 60, 60, 60, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_pcdi, 0xf1ff, 0x81fa, {166, 130, 61, 61, 61, 61, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_pcix, 0xf1ff, 0x81fb, {168, 132, 63, 63, 63, 63, 56}}, + {m68000_base_device_ops::m68k_op_divs_16_i, 0xf1ff, 0x81fc, {162, 126, 58, 58, 58, 58, 56}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pi7, 0xf1ff, 0x901f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pd7, 0xf1ff, 0x9027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_aw, 0xf1ff, 0x9038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_al, 0xf1ff, 0x9039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pcdi, 0xf1ff, 0x903a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_pcix, 0xf1ff, 0x903b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_sub_8_er_i, 0xf1ff, 0x903c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_aw, 0xf1ff, 0x9078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_al, 0xf1ff, 0x9079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_pcdi, 0xf1ff, 0x907a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_pcix, 0xf1ff, 0x907b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_sub_16_er_i, 0xf1ff, 0x907c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_aw, 0xf1ff, 0x90b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_al, 0xf1ff, 0x90b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_pcdi, 0xf1ff, 0x90ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_pcix, 0xf1ff, 0x90bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_sub_32_er_i, 0xf1ff, 0x90bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_aw, 0xf1ff, 0x90f8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_al, 0xf1ff, 0x90f9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_pcdi, 0xf1ff, 0x90fa, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_pcix, 0xf1ff, 0x90fb, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_suba_16_i, 0xf1ff, 0x90fc, { 12, 12, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_subx_8_mm_ay7, 0xf1ff, 0x910f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_sub_8_re_pi7, 0xf1ff, 0x911f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_pd7, 0xf1ff, 0x9127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_aw, 0xf1ff, 0x9138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_8_re_al, 0xf1ff, 0x9139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_aw, 0xf1ff, 0x9178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_16_re_al, 0xf1ff, 0x9179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_aw, 0xf1ff, 0x91b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_sub_32_re_al, 0xf1ff, 0x91b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_suba_32_aw, 0xf1ff, 0x91f8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_al, 0xf1ff, 0x91f9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_pcdi, 0xf1ff, 0x91fa, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_pcix, 0xf1ff, 0x91fb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_suba_32_i, 0xf1ff, 0x91fc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pi7, 0xf1ff, 0xb01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pd7, 0xf1ff, 0xb027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_aw, 0xf1ff, 0xb038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_al, 0xf1ff, 0xb039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pcdi, 0xf1ff, 0xb03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_pcix, 0xf1ff, 0xb03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_8_i, 0xf1ff, 0xb03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_aw, 0xf1ff, 0xb078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_al, 0xf1ff, 0xb079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_pcdi, 0xf1ff, 0xb07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_pcix, 0xf1ff, 0xb07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_16_i, 0xf1ff, 0xb07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_aw, 0xf1ff, 0xb0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_al, 0xf1ff, 0xb0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_pcdi, 0xf1ff, 0xb0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_pcix, 0xf1ff, 0xb0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmp_32_i, 0xf1ff, 0xb0bc, { 14, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpa_16_aw, 0xf1ff, 0xb0f8, { 14, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_al, 0xf1ff, 0xb0f9, { 18, 18, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_pcdi, 0xf1ff, 0xb0fa, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_pcix, 0xf1ff, 0xb0fb, { 16, 16, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_16_i, 0xf1ff, 0xb0fc, { 10, 10, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_cmpm_8_ay7, 0xf1ff, 0xb10f, { 12, 12, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_eor_8_pi7, 0xf1ff, 0xb11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_pd7, 0xf1ff, 0xb127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_aw, 0xf1ff, 0xb138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_8_al, 0xf1ff, 0xb139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_aw, 0xf1ff, 0xb178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_16_al, 0xf1ff, 0xb179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_aw, 0xf1ff, 0xb1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eor_32_al, 0xf1ff, 0xb1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_aw, 0xf1ff, 0xb1f8, { 18, 18, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_al, 0xf1ff, 0xb1f9, { 22, 22, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_pcdi, 0xf1ff, 0xb1fa, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_pcix, 0xf1ff, 0xb1fb, { 20, 20, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_cmpa_32_i, 0xf1ff, 0xb1fc, { 14, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_8_er_pi7, 0xf1ff, 0xc01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_pd7, 0xf1ff, 0xc027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_aw, 0xf1ff, 0xc038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_al, 0xf1ff, 0xc039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_pcdi, 0xf1ff, 0xc03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_pcix, 0xf1ff, 0xc03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_and_8_er_i, 0xf1ff, 0xc03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_aw, 0xf1ff, 0xc078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_al, 0xf1ff, 0xc079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_pcdi, 0xf1ff, 0xc07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_pcix, 0xf1ff, 0xc07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_and_16_er_i, 0xf1ff, 0xc07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_aw, 0xf1ff, 0xc0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_al, 0xf1ff, 0xc0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_pcdi, 0xf1ff, 0xc0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_pcix, 0xf1ff, 0xc0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_and_32_er_i, 0xf1ff, 0xc0bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_mulu_16_aw, 0xf1ff, 0xc0f8, { 62, 38, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_al, 0xf1ff, 0xc0f9, { 66, 42, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_pcdi, 0xf1ff, 0xc0fa, { 62, 38, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_pcix, 0xf1ff, 0xc0fb, { 64, 40, 34, 34, 34, 34, 27}}, + {m68000_base_device_ops::m68k_op_mulu_16_i, 0xf1ff, 0xc0fc, { 58, 34, 29, 29, 29, 29, 27}}, + {m68000_base_device_ops::m68k_op_abcd_8_mm_ay7, 0xf1ff, 0xc10f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_and_8_re_pi7, 0xf1ff, 0xc11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_pd7, 0xf1ff, 0xc127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_aw, 0xf1ff, 0xc138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_8_re_al, 0xf1ff, 0xc139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_aw, 0xf1ff, 0xc178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_16_re_al, 0xf1ff, 0xc179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_aw, 0xf1ff, 0xc1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_and_32_re_al, 0xf1ff, 0xc1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_muls_16_aw, 0xf1ff, 0xc1f8, { 62, 40, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_al, 0xf1ff, 0xc1f9, { 66, 44, 31, 31, 31, 31, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_pcdi, 0xf1ff, 0xc1fa, { 62, 40, 32, 32, 32, 32, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_pcix, 0xf1ff, 0xc1fb, { 64, 42, 34, 34, 34, 34, 27}}, + {m68000_base_device_ops::m68k_op_muls_16_i, 0xf1ff, 0xc1fc, { 58, 36, 29, 29, 29, 29, 27}}, + {m68000_base_device_ops::m68k_op_add_8_er_pi7, 0xf1ff, 0xd01f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_pd7, 0xf1ff, 0xd027, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_aw, 0xf1ff, 0xd038, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_al, 0xf1ff, 0xd039, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_pcdi, 0xf1ff, 0xd03a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_pcix, 0xf1ff, 0xd03b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_add_8_er_i, 0xf1ff, 0xd03c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_aw, 0xf1ff, 0xd078, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_al, 0xf1ff, 0xd079, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_pcdi, 0xf1ff, 0xd07a, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_pcix, 0xf1ff, 0xd07b, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_add_16_er_i, 0xf1ff, 0xd07c, { 8, 8, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_aw, 0xf1ff, 0xd0b8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_al, 0xf1ff, 0xd0b9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_pcdi, 0xf1ff, 0xd0ba, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_pcix, 0xf1ff, 0xd0bb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_add_32_er_i, 0xf1ff, 0xd0bc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_aw, 0xf1ff, 0xd0f8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_al, 0xf1ff, 0xd0f9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_pcdi, 0xf1ff, 0xd0fa, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_pcix, 0xf1ff, 0xd0fb, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_adda_16_i, 0xf1ff, 0xd0fc, { 12, 12, 4, 4, 4, 4, 2}}, + {m68000_base_device_ops::m68k_op_addx_8_mm_ay7, 0xf1ff, 0xd10f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_add_8_re_pi7, 0xf1ff, 0xd11f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_pd7, 0xf1ff, 0xd127, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_aw, 0xf1ff, 0xd138, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_8_re_al, 0xf1ff, 0xd139, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_aw, 0xf1ff, 0xd178, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_16_re_al, 0xf1ff, 0xd179, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_aw, 0xf1ff, 0xd1b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_add_32_re_al, 0xf1ff, 0xd1b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_adda_32_aw, 0xf1ff, 0xd1f8, { 18, 18, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_al, 0xf1ff, 0xd1f9, { 22, 22, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_pcdi, 0xf1ff, 0xd1fa, { 18, 18, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_pcix, 0xf1ff, 0xd1fb, { 20, 20, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_adda_32_i, 0xf1ff, 0xd1fc, { 16, 14, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_ori_8_d, 0xfff8, 0x0000, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_ori_8_ai, 0xfff8, 0x0010, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_pi, 0xfff8, 0x0018, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_pd, 0xfff8, 0x0020, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_di, 0xfff8, 0x0028, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_ix, 0xfff8, 0x0030, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_d, 0xfff8, 0x0040, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_ori_16_ai, 0xfff8, 0x0050, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_pi, 0xfff8, 0x0058, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_pd, 0xfff8, 0x0060, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_di, 0xfff8, 0x0068, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_ix, 0xfff8, 0x0070, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_d, 0xfff8, 0x0080, { 16, 14, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_ori_32_ai, 0xfff8, 0x0090, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_pi, 0xfff8, 0x0098, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_pd, 0xfff8, 0x00a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_di, 0xfff8, 0x00a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_ix, 0xfff8, 0x00b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_ai, 0xfff8, 0x00d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_di, 0xfff8, 0x00e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_ix, 0xfff8, 0x00f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68000_base_device_ops::m68k_op_andi_8_d, 0xfff8, 0x0200, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_andi_8_ai, 0xfff8, 0x0210, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_pi, 0xfff8, 0x0218, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_pd, 0xfff8, 0x0220, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_di, 0xfff8, 0x0228, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_ix, 0xfff8, 0x0230, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_d, 0xfff8, 0x0240, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_andi_16_ai, 0xfff8, 0x0250, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_pi, 0xfff8, 0x0258, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_pd, 0xfff8, 0x0260, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_di, 0xfff8, 0x0268, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_ix, 0xfff8, 0x0270, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_d, 0xfff8, 0x0280, { 14, 14, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_andi_32_ai, 0xfff8, 0x0290, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_pi, 0xfff8, 0x0298, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_pd, 0xfff8, 0x02a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_di, 0xfff8, 0x02a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_ix, 0xfff8, 0x02b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_ai, 0xfff8, 0x02d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_di, 0xfff8, 0x02e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_ix, 0xfff8, 0x02f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68000_base_device_ops::m68k_op_subi_8_d, 0xfff8, 0x0400, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subi_8_ai, 0xfff8, 0x0410, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_pi, 0xfff8, 0x0418, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_pd, 0xfff8, 0x0420, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_di, 0xfff8, 0x0428, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_ix, 0xfff8, 0x0430, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_d, 0xfff8, 0x0440, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subi_16_ai, 0xfff8, 0x0450, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_pi, 0xfff8, 0x0458, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_pd, 0xfff8, 0x0460, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_di, 0xfff8, 0x0468, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_ix, 0xfff8, 0x0470, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_d, 0xfff8, 0x0480, { 16, 14, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_subi_32_ai, 0xfff8, 0x0490, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_pi, 0xfff8, 0x0498, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_pd, 0xfff8, 0x04a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_di, 0xfff8, 0x04a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_ix, 0xfff8, 0x04b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_ai, 0xfff8, 0x04d0, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_di, 0xfff8, 0x04e8, {255, 255, 23, 23, 23, 23, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_ix, 0xfff8, 0x04f0, {255, 255, 25, 25, 25, 25, 18}}, + {m68000_base_device_ops::m68k_op_addi_8_d, 0xfff8, 0x0600, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addi_8_ai, 0xfff8, 0x0610, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_pi, 0xfff8, 0x0618, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_pd, 0xfff8, 0x0620, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_di, 0xfff8, 0x0628, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_ix, 0xfff8, 0x0630, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_d, 0xfff8, 0x0640, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addi_16_ai, 0xfff8, 0x0650, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_pi, 0xfff8, 0x0658, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_pd, 0xfff8, 0x0660, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_di, 0xfff8, 0x0668, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_ix, 0xfff8, 0x0670, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_d, 0xfff8, 0x0680, { 16, 14, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_addi_32_ai, 0xfff8, 0x0690, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_pi, 0xfff8, 0x0698, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_pd, 0xfff8, 0x06a0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_di, 0xfff8, 0x06a8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_ix, 0xfff8, 0x06b0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_callm_32_ai, 0xfff8, 0x06d0, {255, 255, 64, 64, 64, 64, 60}}, + {m68000_base_device_ops::m68k_op_callm_32_di, 0xfff8, 0x06e8, {255, 255, 65, 65, 65, 65, 60}}, + {m68000_base_device_ops::m68k_op_callm_32_ix, 0xfff8, 0x06f0, {255, 255, 67, 67, 67, 67, 60}}, + {m68000_base_device_ops::m68k_op_btst_32_s_d, 0xfff8, 0x0800, { 10, 10, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_ai, 0xfff8, 0x0810, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pi, 0xfff8, 0x0818, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pd, 0xfff8, 0x0820, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_di, 0xfff8, 0x0828, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_ix, 0xfff8, 0x0830, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bchg_32_s_d, 0xfff8, 0x0840, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_ai, 0xfff8, 0x0850, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_pi, 0xfff8, 0x0858, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_pd, 0xfff8, 0x0860, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_di, 0xfff8, 0x0868, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_ix, 0xfff8, 0x0870, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bclr_32_s_d, 0xfff8, 0x0880, { 14, 14, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_ai, 0xfff8, 0x0890, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_pi, 0xfff8, 0x0898, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_pd, 0xfff8, 0x08a0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_di, 0xfff8, 0x08a8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_ix, 0xfff8, 0x08b0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bset_32_s_d, 0xfff8, 0x08c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_ai, 0xfff8, 0x08d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_pi, 0xfff8, 0x08d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_pd, 0xfff8, 0x08e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_di, 0xfff8, 0x08e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_ix, 0xfff8, 0x08f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_d, 0xfff8, 0x0a00, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_eori_8_ai, 0xfff8, 0x0a10, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_pi, 0xfff8, 0x0a18, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_pd, 0xfff8, 0x0a20, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_di, 0xfff8, 0x0a28, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_ix, 0xfff8, 0x0a30, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_d, 0xfff8, 0x0a40, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_eori_16_ai, 0xfff8, 0x0a50, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_pi, 0xfff8, 0x0a58, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_pd, 0xfff8, 0x0a60, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_di, 0xfff8, 0x0a68, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_ix, 0xfff8, 0x0a70, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_d, 0xfff8, 0x0a80, { 16, 14, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_eori_32_ai, 0xfff8, 0x0a90, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_pi, 0xfff8, 0x0a98, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_pd, 0xfff8, 0x0aa0, { 30, 30, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_di, 0xfff8, 0x0aa8, { 32, 32, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_ix, 0xfff8, 0x0ab0, { 34, 34, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_cas_8_ai, 0xfff8, 0x0ad0, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_pi, 0xfff8, 0x0ad8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_pd, 0xfff8, 0x0ae0, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_di, 0xfff8, 0x0ae8, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_ix, 0xfff8, 0x0af0, {255, 255, 19, 19, 19, 19, 12}}, + {m68000_base_device_ops::m68k_op_cmpi_8_d, 0xfff8, 0x0c00, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_ai, 0xfff8, 0x0c10, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pi, 0xfff8, 0x0c18, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pd, 0xfff8, 0x0c20, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_di, 0xfff8, 0x0c28, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_ix, 0xfff8, 0x0c30, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_d, 0xfff8, 0x0c40, { 8, 8, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_ai, 0xfff8, 0x0c50, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_pi, 0xfff8, 0x0c58, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_pd, 0xfff8, 0x0c60, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_di, 0xfff8, 0x0c68, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_ix, 0xfff8, 0x0c70, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_d, 0xfff8, 0x0c80, { 14, 12, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_ai, 0xfff8, 0x0c90, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_pi, 0xfff8, 0x0c98, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_pd, 0xfff8, 0x0ca0, { 22, 22, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_di, 0xfff8, 0x0ca8, { 24, 24, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_ix, 0xfff8, 0x0cb0, { 26, 26, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_cas_16_ai, 0xfff8, 0x0cd0, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_16_pi, 0xfff8, 0x0cd8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_16_pd, 0xfff8, 0x0ce0, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_16_di, 0xfff8, 0x0ce8, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_16_ix, 0xfff8, 0x0cf0, {255, 255, 19, 19, 19, 19, 12}}, + {m68000_base_device_ops::m68k_op_moves_8_ai, 0xfff8, 0x0e10, {255, 18, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_pi, 0xfff8, 0x0e18, {255, 18, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_pd, 0xfff8, 0x0e20, {255, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_di, 0xfff8, 0x0e28, {255, 26, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_ix, 0xfff8, 0x0e30, {255, 30, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_ai, 0xfff8, 0x0e50, {255, 18, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_pi, 0xfff8, 0x0e58, {255, 18, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_pd, 0xfff8, 0x0e60, {255, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_di, 0xfff8, 0x0e68, {255, 26, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_ix, 0xfff8, 0x0e70, {255, 30, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_ai, 0xfff8, 0x0e90, {255, 22, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_pi, 0xfff8, 0x0e98, {255, 22, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_pd, 0xfff8, 0x0ea0, {255, 28, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_di, 0xfff8, 0x0ea8, {255, 32, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_ix, 0xfff8, 0x0eb0, {255, 36, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_cas_32_ai, 0xfff8, 0x0ed0, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_32_pi, 0xfff8, 0x0ed8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_32_pd, 0xfff8, 0x0ee0, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_32_di, 0xfff8, 0x0ee8, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_32_ix, 0xfff8, 0x0ef0, {255, 255, 19, 19, 19, 19, 12}}, + {m68000_base_device_ops::m68k_op_move_8_aw_d, 0xfff8, 0x11c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_ai, 0xfff8, 0x11d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pi, 0xfff8, 0x11d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pd, 0xfff8, 0x11e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_di, 0xfff8, 0x11e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_ix, 0xfff8, 0x11f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_al_d, 0xfff8, 0x13c0, { 16, 16, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_ai, 0xfff8, 0x13d0, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_pi, 0xfff8, 0x13d8, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_pd, 0xfff8, 0x13e0, { 22, 22, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_di, 0xfff8, 0x13e8, { 24, 24, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_ix, 0xfff8, 0x13f0, { 26, 26, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_d, 0xfff8, 0x1ec0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_ai, 0xfff8, 0x1ed0, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pi, 0xfff8, 0x1ed8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pd, 0xfff8, 0x1ee0, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_di, 0xfff8, 0x1ee8, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_ix, 0xfff8, 0x1ef0, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_d, 0xfff8, 0x1f00, { 8, 8, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_ai, 0xfff8, 0x1f10, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pi, 0xfff8, 0x1f18, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pd, 0xfff8, 0x1f20, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_di, 0xfff8, 0x1f28, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_ix, 0xfff8, 0x1f30, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_32_aw_d, 0xfff8, 0x21c0, { 16, 16, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_a, 0xfff8, 0x21c8, { 16, 16, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_ai, 0xfff8, 0x21d0, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_pi, 0xfff8, 0x21d8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_pd, 0xfff8, 0x21e0, { 26, 26, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_di, 0xfff8, 0x21e8, { 28, 28, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_ix, 0xfff8, 0x21f0, { 30, 30, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_al_d, 0xfff8, 0x23c0, { 20, 20, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_a, 0xfff8, 0x23c8, { 20, 20, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_ai, 0xfff8, 0x23d0, { 28, 28, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_pi, 0xfff8, 0x23d8, { 28, 28, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_pd, 0xfff8, 0x23e0, { 30, 30, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_di, 0xfff8, 0x23e8, { 32, 32, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_ix, 0xfff8, 0x23f0, { 34, 34, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_move_16_aw_d, 0xfff8, 0x31c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_a, 0xfff8, 0x31c8, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_ai, 0xfff8, 0x31d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_pi, 0xfff8, 0x31d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_pd, 0xfff8, 0x31e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_di, 0xfff8, 0x31e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_ix, 0xfff8, 0x31f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_al_d, 0xfff8, 0x33c0, { 16, 16, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_a, 0xfff8, 0x33c8, { 16, 16, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_ai, 0xfff8, 0x33d0, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_pi, 0xfff8, 0x33d8, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_pd, 0xfff8, 0x33e0, { 22, 22, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_di, 0xfff8, 0x33e8, { 24, 24, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_ix, 0xfff8, 0x33f0, { 26, 26, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_negx_8_d, 0xfff8, 0x4000, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_negx_8_ai, 0xfff8, 0x4010, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_pi, 0xfff8, 0x4018, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_pd, 0xfff8, 0x4020, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_di, 0xfff8, 0x4028, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_ix, 0xfff8, 0x4030, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_d, 0xfff8, 0x4040, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_negx_16_ai, 0xfff8, 0x4050, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_pi, 0xfff8, 0x4058, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_pd, 0xfff8, 0x4060, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_di, 0xfff8, 0x4068, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_ix, 0xfff8, 0x4070, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_d, 0xfff8, 0x4080, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_negx_32_ai, 0xfff8, 0x4090, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_pi, 0xfff8, 0x4098, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_pd, 0xfff8, 0x40a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_di, 0xfff8, 0x40a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_ix, 0xfff8, 0x40b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frs_d, 0xfff8, 0x40c0, { 6, 4, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_ai, 0xfff8, 0x40d0, { 12, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_pi, 0xfff8, 0x40d8, { 12, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_pd, 0xfff8, 0x40e0, { 14, 14, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_di, 0xfff8, 0x40e8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_ix, 0xfff8, 0x40f0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_clr_8_d, 0xfff8, 0x4200, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_clr_8_ai, 0xfff8, 0x4210, { 12, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_pi, 0xfff8, 0x4218, { 12, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_pd, 0xfff8, 0x4220, { 14, 10, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_di, 0xfff8, 0x4228, { 16, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_ix, 0xfff8, 0x4230, { 18, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_d, 0xfff8, 0x4240, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_clr_16_ai, 0xfff8, 0x4250, { 12, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_pi, 0xfff8, 0x4258, { 12, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_pd, 0xfff8, 0x4260, { 14, 10, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_di, 0xfff8, 0x4268, { 16, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_ix, 0xfff8, 0x4270, { 18, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_d, 0xfff8, 0x4280, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_clr_32_ai, 0xfff8, 0x4290, { 20, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_pi, 0xfff8, 0x4298, { 20, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_pd, 0xfff8, 0x42a0, { 22, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_di, 0xfff8, 0x42a8, { 24, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_ix, 0xfff8, 0x42b0, { 26, 20, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_d, 0xfff8, 0x42c0, {255, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_ai, 0xfff8, 0x42d0, {255, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_pi, 0xfff8, 0x42d8, {255, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_pd, 0xfff8, 0x42e0, {255, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_di, 0xfff8, 0x42e8, {255, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_ix, 0xfff8, 0x42f0, {255, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_d, 0xfff8, 0x4400, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_neg_8_ai, 0xfff8, 0x4410, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_pi, 0xfff8, 0x4418, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_pd, 0xfff8, 0x4420, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_di, 0xfff8, 0x4428, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_ix, 0xfff8, 0x4430, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_d, 0xfff8, 0x4440, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_neg_16_ai, 0xfff8, 0x4450, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_pi, 0xfff8, 0x4458, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_pd, 0xfff8, 0x4460, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_di, 0xfff8, 0x4468, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_ix, 0xfff8, 0x4470, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_d, 0xfff8, 0x4480, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_neg_32_ai, 0xfff8, 0x4490, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_pi, 0xfff8, 0x4498, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_pd, 0xfff8, 0x44a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_di, 0xfff8, 0x44a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_ix, 0xfff8, 0x44b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_d, 0xfff8, 0x44c0, { 12, 12, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_ai, 0xfff8, 0x44d0, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_pi, 0xfff8, 0x44d8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_pd, 0xfff8, 0x44e0, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_di, 0xfff8, 0x44e8, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_ix, 0xfff8, 0x44f0, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_not_8_d, 0xfff8, 0x4600, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_not_8_ai, 0xfff8, 0x4610, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_8_pi, 0xfff8, 0x4618, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_8_pd, 0xfff8, 0x4620, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_8_di, 0xfff8, 0x4628, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_8_ix, 0xfff8, 0x4630, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_not_16_d, 0xfff8, 0x4640, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_not_16_ai, 0xfff8, 0x4650, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_16_pi, 0xfff8, 0x4658, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_16_pd, 0xfff8, 0x4660, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_16_di, 0xfff8, 0x4668, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_16_ix, 0xfff8, 0x4670, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_not_32_d, 0xfff8, 0x4680, { 6, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_not_32_ai, 0xfff8, 0x4690, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_32_pi, 0xfff8, 0x4698, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_32_pd, 0xfff8, 0x46a0, { 22, 22, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_32_di, 0xfff8, 0x46a8, { 24, 24, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_32_ix, 0xfff8, 0x46b0, { 26, 26, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_tos_d, 0xfff8, 0x46c0, { 12, 12, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_ai, 0xfff8, 0x46d0, { 16, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_pi, 0xfff8, 0x46d8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_pd, 0xfff8, 0x46e0, { 18, 18, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_di, 0xfff8, 0x46e8, { 20, 20, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_ix, 0xfff8, 0x46f0, { 22, 22, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_nbcd_8_d, 0xfff8, 0x4800, { 6, 6, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_link_32, 0xfff8, 0x4808, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_ai, 0xfff8, 0x4810, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_pi, 0xfff8, 0x4818, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_pd, 0xfff8, 0x4820, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_di, 0xfff8, 0x4828, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_ix, 0xfff8, 0x4830, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_swap_32, 0xfff8, 0x4840, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_bkpt, 0xfff8, 0x4848, {255, 10, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_pea_32_ai, 0xfff8, 0x4850, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_pea_32_di, 0xfff8, 0x4868, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_pea_32_ix, 0xfff8, 0x4870, { 20, 20, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_ext_16, 0xfff8, 0x4880, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movem_16_re_ai, 0xfff8, 0x4890, { 8, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_movem_16_re_pd, 0xfff8, 0x48a0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movem_16_re_di, 0xfff8, 0x48a8, { 12, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_movem_16_re_ix, 0xfff8, 0x48b0, { 14, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_ext_32, 0xfff8, 0x48c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_ai, 0xfff8, 0x48d0, { 8, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_pd, 0xfff8, 0x48e0, { 8, 8, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_di, 0xfff8, 0x48e8, { 12, 12, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_ix, 0xfff8, 0x48f0, { 14, 14, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_extb_32, 0xfff8, 0x49c0, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_tst_8_d, 0xfff8, 0x4a00, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_ai, 0xfff8, 0x4a10, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_pi, 0xfff8, 0x4a18, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_pd, 0xfff8, 0x4a20, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_di, 0xfff8, 0x4a28, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_ix, 0xfff8, 0x4a30, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_d, 0xfff8, 0x4a40, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_a, 0xfff8, 0x4a48, {255, 255, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_ai, 0xfff8, 0x4a50, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_pi, 0xfff8, 0x4a58, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_pd, 0xfff8, 0x4a60, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_di, 0xfff8, 0x4a68, { 12, 12, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_ix, 0xfff8, 0x4a70, { 14, 14, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_d, 0xfff8, 0x4a80, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_a, 0xfff8, 0x4a88, {255, 255, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_ai, 0xfff8, 0x4a90, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_pi, 0xfff8, 0x4a98, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_pd, 0xfff8, 0x4aa0, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_di, 0xfff8, 0x4aa8, { 16, 16, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_ix, 0xfff8, 0x4ab0, { 18, 18, 9, 9, 9, 9, 2}}, + {m68000_base_device_ops::m68k_op_tas_8_d, 0xfff8, 0x4ac0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_tas_8_ai, 0xfff8, 0x4ad0, { 18, 18, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_pi, 0xfff8, 0x4ad8, { 18, 18, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_pd, 0xfff8, 0x4ae0, { 20, 20, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_di, 0xfff8, 0x4ae8, { 22, 22, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_ix, 0xfff8, 0x4af0, { 24, 24, 19, 19, 19, 19, 12}}, + {m68000_base_device_ops::m68k_op_mull_32_d, 0xfff8, 0x4c00, {255, 255, 43, 43, 43, 43, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_ai, 0xfff8, 0x4c10, {255, 255, 47, 47, 47, 47, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_pi, 0xfff8, 0x4c18, {255, 255, 47, 47, 47, 47, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_pd, 0xfff8, 0x4c20, {255, 255, 48, 48, 48, 48, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_di, 0xfff8, 0x4c28, {255, 255, 48, 48, 48, 48, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_ix, 0xfff8, 0x4c30, {255, 255, 50, 50, 50, 50, 43}}, + {m68000_base_device_ops::m68k_op_divl_32_d, 0xfff8, 0x4c40, {255, 255, 84, 84, 84, 84, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_ai, 0xfff8, 0x4c50, {255, 255, 88, 88, 88, 88, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_pi, 0xfff8, 0x4c58, {255, 255, 88, 88, 88, 88, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_pd, 0xfff8, 0x4c60, {255, 255, 89, 89, 89, 89, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_di, 0xfff8, 0x4c68, {255, 255, 89, 89, 89, 89, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_ix, 0xfff8, 0x4c70, {255, 255, 91, 91, 91, 91, 84}}, + {m68000_base_device_ops::m68k_op_movem_16_er_ai, 0xfff8, 0x4c90, { 12, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_16_er_pi, 0xfff8, 0x4c98, { 12, 12, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_movem_16_er_di, 0xfff8, 0x4ca8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_movem_16_er_ix, 0xfff8, 0x4cb0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_ai, 0xfff8, 0x4cd0, { 12, 12, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_pi, 0xfff8, 0x4cd8, { 12, 12, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_di, 0xfff8, 0x4ce8, { 16, 16, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_ix, 0xfff8, 0x4cf0, { 18, 18, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_link_16, 0xfff8, 0x4e50, { 16, 16, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_unlk_32, 0xfff8, 0x4e58, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_move_32_tou, 0xfff8, 0x4e60, { 4, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_move_32_fru, 0xfff8, 0x4e68, { 4, 6, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_jsr_32_ai, 0xfff8, 0x4e90, { 16, 16, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jsr_32_di, 0xfff8, 0x4ea8, { 18, 18, 5, 5, 5, 5, 0}}, + {m68000_base_device_ops::m68k_op_jsr_32_ix, 0xfff8, 0x4eb0, { 22, 22, 7, 7, 7, 7, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_ai, 0xfff8, 0x4ed0, { 8, 8, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_di, 0xfff8, 0x4ee8, { 10, 10, 5, 5, 5, 5, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_ix, 0xfff8, 0x4ef0, { 14, 14, 7, 7, 7, 7, 0}}, + {m68000_base_device_ops::m68k_op_st_8_d, 0xfff8, 0x50c0, { 6, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbt_16, 0xfff8, 0x50c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_st_8_ai, 0xfff8, 0x50d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_st_8_pi, 0xfff8, 0x50d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_st_8_pd, 0xfff8, 0x50e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_st_8_di, 0xfff8, 0x50e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_st_8_ix, 0xfff8, 0x50f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_d, 0xfff8, 0x51c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbf_16, 0xfff8, 0x51c8, { 12, 12, 6, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sf_8_ai, 0xfff8, 0x51d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_pi, 0xfff8, 0x51d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_pd, 0xfff8, 0x51e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_di, 0xfff8, 0x51e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_ix, 0xfff8, 0x51f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_d, 0xfff8, 0x52c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbhi_16, 0xfff8, 0x52c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_ai, 0xfff8, 0x52d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_pi, 0xfff8, 0x52d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_pd, 0xfff8, 0x52e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_di, 0xfff8, 0x52e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_ix, 0xfff8, 0x52f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_d, 0xfff8, 0x53c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbls_16, 0xfff8, 0x53c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_ai, 0xfff8, 0x53d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_pi, 0xfff8, 0x53d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_pd, 0xfff8, 0x53e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_di, 0xfff8, 0x53e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_ix, 0xfff8, 0x53f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_d, 0xfff8, 0x54c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbcc_16, 0xfff8, 0x54c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_ai, 0xfff8, 0x54d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_pi, 0xfff8, 0x54d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_pd, 0xfff8, 0x54e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_di, 0xfff8, 0x54e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_ix, 0xfff8, 0x54f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_d, 0xfff8, 0x55c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbcs_16, 0xfff8, 0x55c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_ai, 0xfff8, 0x55d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_pi, 0xfff8, 0x55d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_pd, 0xfff8, 0x55e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_di, 0xfff8, 0x55e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_ix, 0xfff8, 0x55f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_d, 0xfff8, 0x56c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbne_16, 0xfff8, 0x56c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_ai, 0xfff8, 0x56d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_pi, 0xfff8, 0x56d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_pd, 0xfff8, 0x56e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_di, 0xfff8, 0x56e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_ix, 0xfff8, 0x56f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_d, 0xfff8, 0x57c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbeq_16, 0xfff8, 0x57c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_ai, 0xfff8, 0x57d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_pi, 0xfff8, 0x57d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_pd, 0xfff8, 0x57e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_di, 0xfff8, 0x57e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_ix, 0xfff8, 0x57f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_d, 0xfff8, 0x58c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbvc_16, 0xfff8, 0x58c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_ai, 0xfff8, 0x58d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_pi, 0xfff8, 0x58d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_pd, 0xfff8, 0x58e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_di, 0xfff8, 0x58e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_ix, 0xfff8, 0x58f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_d, 0xfff8, 0x59c0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbvs_16, 0xfff8, 0x59c8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_ai, 0xfff8, 0x59d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_pi, 0xfff8, 0x59d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_pd, 0xfff8, 0x59e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_di, 0xfff8, 0x59e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_ix, 0xfff8, 0x59f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_d, 0xfff8, 0x5ac0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbpl_16, 0xfff8, 0x5ac8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_ai, 0xfff8, 0x5ad0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_pi, 0xfff8, 0x5ad8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_pd, 0xfff8, 0x5ae0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_di, 0xfff8, 0x5ae8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_ix, 0xfff8, 0x5af0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_d, 0xfff8, 0x5bc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbmi_16, 0xfff8, 0x5bc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_ai, 0xfff8, 0x5bd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_pi, 0xfff8, 0x5bd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_pd, 0xfff8, 0x5be0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_di, 0xfff8, 0x5be8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_ix, 0xfff8, 0x5bf0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_d, 0xfff8, 0x5cc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbge_16, 0xfff8, 0x5cc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_ai, 0xfff8, 0x5cd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_pi, 0xfff8, 0x5cd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_pd, 0xfff8, 0x5ce0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_di, 0xfff8, 0x5ce8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_ix, 0xfff8, 0x5cf0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_d, 0xfff8, 0x5dc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dblt_16, 0xfff8, 0x5dc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_ai, 0xfff8, 0x5dd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_pi, 0xfff8, 0x5dd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_pd, 0xfff8, 0x5de0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_di, 0xfff8, 0x5de8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_ix, 0xfff8, 0x5df0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_d, 0xfff8, 0x5ec0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dbgt_16, 0xfff8, 0x5ec8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_ai, 0xfff8, 0x5ed0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_pi, 0xfff8, 0x5ed8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_pd, 0xfff8, 0x5ee0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_di, 0xfff8, 0x5ee8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_ix, 0xfff8, 0x5ef0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_d, 0xfff8, 0x5fc0, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_dble_16, 0xfff8, 0x5fc8, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_ai, 0xfff8, 0x5fd0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_pi, 0xfff8, 0x5fd8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_pd, 0xfff8, 0x5fe0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_di, 0xfff8, 0x5fe8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_ix, 0xfff8, 0x5ff0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_sbcd_8_mm_ax7, 0xfff8, 0x8f08, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_pack_16_mm_ax7, 0xfff8, 0x8f48, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_unpk_16_mm_ax7, 0xfff8, 0x8f88, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_subx_8_mm_ax7, 0xfff8, 0x9f08, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_cmpm_8_ax7, 0xfff8, 0xbf08, { 12, 12, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_abcd_8_mm_ax7, 0xfff8, 0xcf08, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_addx_8_mm_ax7, 0xfff8, 0xdf08, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_asr_16_ai, 0xfff8, 0xe0d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_asr_16_pi, 0xfff8, 0xe0d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_asr_16_pd, 0xfff8, 0xe0e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_asr_16_di, 0xfff8, 0xe0e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_asr_16_ix, 0xfff8, 0xe0f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_asl_16_ai, 0xfff8, 0xe1d0, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_asl_16_pi, 0xfff8, 0xe1d8, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_asl_16_pd, 0xfff8, 0xe1e0, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_asl_16_di, 0xfff8, 0xe1e8, { 16, 16, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_asl_16_ix, 0xfff8, 0xe1f0, { 18, 18, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_lsr_16_ai, 0xfff8, 0xe2d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsr_16_pi, 0xfff8, 0xe2d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsr_16_pd, 0xfff8, 0xe2e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_lsr_16_di, 0xfff8, 0xe2e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_lsr_16_ix, 0xfff8, 0xe2f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_ai, 0xfff8, 0xe3d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_pi, 0xfff8, 0xe3d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_pd, 0xfff8, 0xe3e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_di, 0xfff8, 0xe3e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_ix, 0xfff8, 0xe3f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_ai, 0xfff8, 0xe4d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_pi, 0xfff8, 0xe4d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_pd, 0xfff8, 0xe4e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_di, 0xfff8, 0xe4e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_ix, 0xfff8, 0xe4f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_ai, 0xfff8, 0xe5d0, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_pi, 0xfff8, 0xe5d8, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_pd, 0xfff8, 0xe5e0, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_di, 0xfff8, 0xe5e8, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_ix, 0xfff8, 0xe5f0, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_ror_16_ai, 0xfff8, 0xe6d0, { 12, 12, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_ror_16_pi, 0xfff8, 0xe6d8, { 12, 12, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_ror_16_pd, 0xfff8, 0xe6e0, { 14, 14, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_ror_16_di, 0xfff8, 0xe6e8, { 16, 16, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_ror_16_ix, 0xfff8, 0xe6f0, { 18, 18, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_ai, 0xfff8, 0xe7d0, { 12, 12, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_pi, 0xfff8, 0xe7d8, { 12, 12, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_pd, 0xfff8, 0xe7e0, { 14, 14, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_di, 0xfff8, 0xe7e8, { 16, 16, 12, 12, 12, 12, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_ix, 0xfff8, 0xe7f0, { 18, 18, 14, 14, 14, 14, 7}}, + {m68000_base_device_ops::m68k_op_bftst_32_d, 0xfff8, 0xe8c0, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bftst_32_ai, 0xfff8, 0xe8d0, {255, 255, 17, 17, 17, 17, 13}}, + {m68000_base_device_ops::m68k_op_bftst_32_di, 0xfff8, 0xe8e8, {255, 255, 18, 18, 18, 18, 13}}, + {m68000_base_device_ops::m68k_op_bftst_32_ix, 0xfff8, 0xe8f0, {255, 255, 20, 20, 20, 20, 13}}, + {m68000_base_device_ops::m68k_op_bfextu_32_d, 0xfff8, 0xe9c0, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_bfextu_32_ai, 0xfff8, 0xe9d0, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfextu_32_di, 0xfff8, 0xe9e8, {255, 255, 20, 20, 20, 20, 15}}, + {m68000_base_device_ops::m68k_op_bfextu_32_ix, 0xfff8, 0xe9f0, {255, 255, 22, 22, 22, 22, 15}}, + {m68000_base_device_ops::m68k_op_bfchg_32_d, 0xfff8, 0xeac0, {255, 255, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_bfchg_32_ai, 0xfff8, 0xead0, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfchg_32_di, 0xfff8, 0xeae8, {255, 255, 25, 25, 25, 25, 20}}, + {m68000_base_device_ops::m68k_op_bfchg_32_ix, 0xfff8, 0xeaf0, {255, 255, 27, 27, 27, 27, 20}}, + {m68000_base_device_ops::m68k_op_bfexts_32_d, 0xfff8, 0xebc0, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_bfexts_32_ai, 0xfff8, 0xebd0, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfexts_32_di, 0xfff8, 0xebe8, {255, 255, 20, 20, 20, 20, 15}}, + {m68000_base_device_ops::m68k_op_bfexts_32_ix, 0xfff8, 0xebf0, {255, 255, 22, 22, 22, 22, 15}}, + {m68000_base_device_ops::m68k_op_bfclr_32_d, 0xfff8, 0xecc0, {255, 255, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_bfclr_32_ai, 0xfff8, 0xecd0, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfclr_32_di, 0xfff8, 0xece8, {255, 255, 25, 25, 25, 25, 20}}, + {m68000_base_device_ops::m68k_op_bfclr_32_ix, 0xfff8, 0xecf0, {255, 255, 27, 27, 27, 27, 20}}, + {m68000_base_device_ops::m68k_op_bfffo_32_d, 0xfff8, 0xedc0, {255, 255, 18, 18, 18, 18, 18}}, + {m68000_base_device_ops::m68k_op_bfffo_32_ai, 0xfff8, 0xedd0, {255, 255, 32, 32, 32, 32, 28}}, + {m68000_base_device_ops::m68k_op_bfffo_32_di, 0xfff8, 0xede8, {255, 255, 33, 33, 33, 33, 28}}, + {m68000_base_device_ops::m68k_op_bfffo_32_ix, 0xfff8, 0xedf0, {255, 255, 35, 35, 35, 35, 28}}, + {m68000_base_device_ops::m68k_op_bfset_32_d, 0xfff8, 0xeec0, {255, 255, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_bfset_32_ai, 0xfff8, 0xeed0, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfset_32_di, 0xfff8, 0xeee8, {255, 255, 25, 25, 25, 25, 20}}, + {m68000_base_device_ops::m68k_op_bfset_32_ix, 0xfff8, 0xeef0, {255, 255, 27, 27, 27, 27, 20}}, + {m68000_base_device_ops::m68k_op_bfins_32_d, 0xfff8, 0xefc0, {255, 255, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_bfins_32_ai, 0xfff8, 0xefd0, {255, 255, 21, 21, 21, 21, 17}}, + {m68000_base_device_ops::m68k_op_bfins_32_di, 0xfff8, 0xefe8, {255, 255, 22, 22, 22, 22, 17}}, + {m68000_base_device_ops::m68k_op_bfins_32_ix, 0xfff8, 0xeff0, {255, 255, 24, 24, 24, 24, 17}}, + {m68000_base_device_ops::m68k_op_ftrapcc_32, 0xfff8, 0xf278, {255, 255, 4, 4, 255, 255, 255}}, + {m68000_base_device_ops::m68k_op_pflushan_32, 0xfff8, 0xf510, {255, 255, 255, 255, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_pflusha_32, 0xfff8, 0xf518, {255, 255, 255, 255, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_move16_32, 0xfff8, 0xf620, {255, 255, 255, 255, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_pi7, 0xffff, 0x001f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_pd7, 0xffff, 0x0027, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_aw, 0xffff, 0x0038, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_8_al, 0xffff, 0x0039, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_toc, 0xffff, 0x003c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ori_16_aw, 0xffff, 0x0078, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_al, 0xffff, 0x0079, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_16_tos, 0xffff, 0x007c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_ori_32_aw, 0xffff, 0x00b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_ori_32_al, 0xffff, 0x00b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_aw, 0xffff, 0x00f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_al, 0xffff, 0x00f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_pcdi, 0xffff, 0x00fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_8_pcix, 0xffff, 0x00fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_andi_8_pi7, 0xffff, 0x021f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_pd7, 0xffff, 0x0227, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_aw, 0xffff, 0x0238, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_8_al, 0xffff, 0x0239, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_toc, 0xffff, 0x023c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_andi_16_aw, 0xffff, 0x0278, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_al, 0xffff, 0x0279, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_16_tos, 0xffff, 0x027c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_andi_32_aw, 0xffff, 0x02b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_andi_32_al, 0xffff, 0x02b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_aw, 0xffff, 0x02f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_al, 0xffff, 0x02f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_pcdi, 0xffff, 0x02fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_16_pcix, 0xffff, 0x02fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_subi_8_pi7, 0xffff, 0x041f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_pd7, 0xffff, 0x0427, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_aw, 0xffff, 0x0438, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_8_al, 0xffff, 0x0439, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_aw, 0xffff, 0x0478, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_16_al, 0xffff, 0x0479, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_aw, 0xffff, 0x04b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_subi_32_al, 0xffff, 0x04b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_aw, 0xffff, 0x04f8, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_al, 0xffff, 0x04f9, {255, 255, 22, 22, 22, 22, 18}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_pcdi, 0xffff, 0x04fa, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_chk2cmp2_32_pcix, 0xffff, 0x04fb, {255, 255, 23, 23, 23, 23, 23}}, + {m68000_base_device_ops::m68k_op_addi_8_pi7, 0xffff, 0x061f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_pd7, 0xffff, 0x0627, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_aw, 0xffff, 0x0638, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_8_al, 0xffff, 0x0639, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_aw, 0xffff, 0x0678, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_16_al, 0xffff, 0x0679, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_aw, 0xffff, 0x06b8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_addi_32_al, 0xffff, 0x06b9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_callm_32_aw, 0xffff, 0x06f8, {255, 255, 64, 64, 64, 64, 60}}, + {m68000_base_device_ops::m68k_op_callm_32_al, 0xffff, 0x06f9, {255, 255, 64, 64, 64, 64, 60}}, + {m68000_base_device_ops::m68k_op_callm_32_pcdi, 0xffff, 0x06fa, {255, 255, 65, 65, 65, 65, 60}}, + {m68000_base_device_ops::m68k_op_callm_32_pcix, 0xffff, 0x06fb, {255, 255, 67, 67, 67, 67, 60}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pi7, 0xffff, 0x081f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pd7, 0xffff, 0x0827, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_aw, 0xffff, 0x0838, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_al, 0xffff, 0x0839, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pcdi, 0xffff, 0x083a, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_btst_8_s_pcix, 0xffff, 0x083b, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_pi7, 0xffff, 0x085f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_pd7, 0xffff, 0x0867, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_aw, 0xffff, 0x0878, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bchg_8_s_al, 0xffff, 0x0879, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_pi7, 0xffff, 0x089f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_pd7, 0xffff, 0x08a7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_aw, 0xffff, 0x08b8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bclr_8_s_al, 0xffff, 0x08b9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_pi7, 0xffff, 0x08df, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_pd7, 0xffff, 0x08e7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_aw, 0xffff, 0x08f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_bset_8_s_al, 0xffff, 0x08f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_pi7, 0xffff, 0x0a1f, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_pd7, 0xffff, 0x0a27, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_aw, 0xffff, 0x0a38, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_8_al, 0xffff, 0x0a39, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_toc, 0xffff, 0x0a3c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_eori_16_aw, 0xffff, 0x0a78, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_al, 0xffff, 0x0a79, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_16_tos, 0xffff, 0x0a7c, { 20, 16, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_eori_32_aw, 0xffff, 0x0ab8, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_eori_32_al, 0xffff, 0x0ab9, { 36, 36, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_cas_8_pi7, 0xffff, 0x0adf, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_pd7, 0xffff, 0x0ae7, {255, 255, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_aw, 0xffff, 0x0af8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_8_al, 0xffff, 0x0af9, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pi7, 0xffff, 0x0c1f, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pd7, 0xffff, 0x0c27, { 14, 14, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_aw, 0xffff, 0x0c38, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_al, 0xffff, 0x0c39, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pcdi, 0xffff, 0x0c3a, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_cmpi_8_pcix, 0xffff, 0x0c3b, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_cmpi_16_aw, 0xffff, 0x0c78, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_al, 0xffff, 0x0c79, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_16_pcdi, 0xffff, 0x0c7a, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_cmpi_16_pcix, 0xffff, 0x0c7b, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_cmpi_32_aw, 0xffff, 0x0cb8, { 24, 24, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_al, 0xffff, 0x0cb9, { 28, 28, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_cmpi_32_pcdi, 0xffff, 0x0cba, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_cmpi_32_pcix, 0xffff, 0x0cbb, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_cas_16_aw, 0xffff, 0x0cf8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_16_al, 0xffff, 0x0cf9, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas2_16, 0xffff, 0x0cfc, {255, 255, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_moves_8_pi7, 0xffff, 0x0e1f, {255, 18, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_pd7, 0xffff, 0x0e27, {255, 20, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_aw, 0xffff, 0x0e38, {255, 26, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_8_al, 0xffff, 0x0e39, {255, 30, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_aw, 0xffff, 0x0e78, {255, 26, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_16_al, 0xffff, 0x0e79, {255, 30, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_aw, 0xffff, 0x0eb8, {255, 32, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_moves_32_al, 0xffff, 0x0eb9, {255, 36, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_cas_32_aw, 0xffff, 0x0ef8, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas_32_al, 0xffff, 0x0ef9, {255, 255, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_cas2_32, 0xffff, 0x0efc, {255, 255, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pi7, 0xffff, 0x11df, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pd7, 0xffff, 0x11e7, { 18, 18, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_aw, 0xffff, 0x11f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_al, 0xffff, 0x11f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pcdi, 0xffff, 0x11fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_pcix, 0xffff, 0x11fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_aw_i, 0xffff, 0x11fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_8_al_pi7, 0xffff, 0x13df, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_pd7, 0xffff, 0x13e7, { 22, 22, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_aw, 0xffff, 0x13f8, { 24, 24, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_al, 0xffff, 0x13f9, { 28, 28, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_pcdi, 0xffff, 0x13fa, { 24, 24, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_pcix, 0xffff, 0x13fb, { 26, 26, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_move_8_al_i, 0xffff, 0x13fc, { 20, 20, 8, 8, 8, 8, 6}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pi7, 0xffff, 0x1edf, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pd7, 0xffff, 0x1ee7, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_aw, 0xffff, 0x1ef8, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_al, 0xffff, 0x1ef9, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pcdi, 0xffff, 0x1efa, { 16, 16, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_pcix, 0xffff, 0x1efb, { 18, 18, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pi7_i, 0xffff, 0x1efc, { 12, 12, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pi7, 0xffff, 0x1f1f, { 12, 12, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pd7, 0xffff, 0x1f27, { 14, 14, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_aw, 0xffff, 0x1f38, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_al, 0xffff, 0x1f39, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pcdi, 0xffff, 0x1f3a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_pcix, 0xffff, 0x1f3b, { 18, 18, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_move_8_pd7_i, 0xffff, 0x1f3c, { 12, 12, 7, 7, 7, 7, 5}}, + {m68000_base_device_ops::m68k_op_move_32_aw_aw, 0xffff, 0x21f8, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_al, 0xffff, 0x21f9, { 32, 32, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_pcdi, 0xffff, 0x21fa, { 28, 28, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_pcix, 0xffff, 0x21fb, { 30, 30, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_32_aw_i, 0xffff, 0x21fc, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_32_al_aw, 0xffff, 0x23f8, { 32, 32, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_al, 0xffff, 0x23f9, { 36, 36, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_pcdi, 0xffff, 0x23fa, { 32, 32, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_pcix, 0xffff, 0x23fb, { 34, 34, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_move_32_al_i, 0xffff, 0x23fc, { 28, 28, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_16_aw_aw, 0xffff, 0x31f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_al, 0xffff, 0x31f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_pcdi, 0xffff, 0x31fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_pcix, 0xffff, 0x31fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_aw_i, 0xffff, 0x31fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_move_16_al_aw, 0xffff, 0x33f8, { 24, 24, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_al, 0xffff, 0x33f9, { 28, 28, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_pcdi, 0xffff, 0x33fa, { 24, 24, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_pcix, 0xffff, 0x33fb, { 26, 26, 13, 13, 13, 13, 6}}, + {m68000_base_device_ops::m68k_op_move_16_al_i, 0xffff, 0x33fc, { 20, 20, 8, 8, 8, 8, 6}}, + {m68000_base_device_ops::m68k_op_negx_8_pi7, 0xffff, 0x401f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_pd7, 0xffff, 0x4027, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_aw, 0xffff, 0x4038, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_8_al, 0xffff, 0x4039, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_aw, 0xffff, 0x4078, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_16_al, 0xffff, 0x4079, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_aw, 0xffff, 0x40b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_negx_32_al, 0xffff, 0x40b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frs_aw, 0xffff, 0x40f8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_frs_al, 0xffff, 0x40f9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_clr_8_pi7, 0xffff, 0x421f, { 12, 8, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_pd7, 0xffff, 0x4227, { 14, 10, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_aw, 0xffff, 0x4238, { 16, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_8_al, 0xffff, 0x4239, { 20, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_aw, 0xffff, 0x4278, { 16, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_16_al, 0xffff, 0x4279, { 20, 14, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_aw, 0xffff, 0x42b8, { 24, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_clr_32_al, 0xffff, 0x42b9, { 28, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_aw, 0xffff, 0x42f8, {255, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_frc_al, 0xffff, 0x42f9, {255, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_pi7, 0xffff, 0x441f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_pd7, 0xffff, 0x4427, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_aw, 0xffff, 0x4438, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_8_al, 0xffff, 0x4439, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_aw, 0xffff, 0x4478, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_16_al, 0xffff, 0x4479, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_aw, 0xffff, 0x44b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_neg_32_al, 0xffff, 0x44b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_aw, 0xffff, 0x44f8, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_al, 0xffff, 0x44f9, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_pcdi, 0xffff, 0x44fa, { 20, 20, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_pcix, 0xffff, 0x44fb, { 22, 22, 11, 11, 11, 11, 4}}, + {m68000_base_device_ops::m68k_op_move_16_toc_i, 0xffff, 0x44fc, { 16, 16, 6, 6, 6, 6, 4}}, + {m68000_base_device_ops::m68k_op_not_8_pi7, 0xffff, 0x461f, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_8_pd7, 0xffff, 0x4627, { 14, 14, 9, 9, 9, 9, 4}}, + {m68000_base_device_ops::m68k_op_not_8_aw, 0xffff, 0x4638, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_8_al, 0xffff, 0x4639, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_16_aw, 0xffff, 0x4678, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_16_al, 0xffff, 0x4679, { 20, 20, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_32_aw, 0xffff, 0x46b8, { 24, 24, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_not_32_al, 0xffff, 0x46b9, { 28, 28, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_move_16_tos_aw, 0xffff, 0x46f8, { 20, 20, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_al, 0xffff, 0x46f9, { 24, 24, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_pcdi, 0xffff, 0x46fa, { 20, 20, 13, 13, 13, 13, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_pcix, 0xffff, 0x46fb, { 22, 22, 15, 15, 15, 15, 8}}, + {m68000_base_device_ops::m68k_op_move_16_tos_i, 0xffff, 0x46fc, { 16, 16, 10, 10, 10, 10, 8}}, + {m68000_base_device_ops::m68k_op_link_32_a7, 0xffff, 0x480f, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_pi7, 0xffff, 0x481f, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_pd7, 0xffff, 0x4827, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_aw, 0xffff, 0x4838, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_nbcd_8_al, 0xffff, 0x4839, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_pea_32_aw, 0xffff, 0x4878, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_pea_32_al, 0xffff, 0x4879, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_pea_32_pcdi, 0xffff, 0x487a, { 16, 16, 10, 10, 10, 10, 5}}, + {m68000_base_device_ops::m68k_op_pea_32_pcix, 0xffff, 0x487b, { 20, 20, 12, 12, 12, 12, 5}}, + {m68000_base_device_ops::m68k_op_movem_16_re_aw, 0xffff, 0x48b8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_movem_16_re_al, 0xffff, 0x48b9, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_aw, 0xffff, 0x48f8, { 12, 12, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_movem_32_re_al, 0xffff, 0x48f9, { 16, 16, 8, 8, 8, 8, 4}}, + {m68000_base_device_ops::m68k_op_tst_8_pi7, 0xffff, 0x4a1f, { 8, 8, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_pd7, 0xffff, 0x4a27, { 10, 10, 7, 7, 7, 7, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_aw, 0xffff, 0x4a38, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_al, 0xffff, 0x4a39, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_8_pcdi, 0xffff, 0x4a3a, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_tst_8_pcix, 0xffff, 0x4a3b, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_tst_8_i, 0xffff, 0x4a3c, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_tst_16_aw, 0xffff, 0x4a78, { 12, 12, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_al, 0xffff, 0x4a79, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_16_pcdi, 0xffff, 0x4a7a, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_tst_16_pcix, 0xffff, 0x4a7b, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_tst_16_i, 0xffff, 0x4a7c, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_tst_32_aw, 0xffff, 0x4ab8, { 16, 16, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_al, 0xffff, 0x4ab9, { 20, 20, 6, 6, 6, 6, 2}}, + {m68000_base_device_ops::m68k_op_tst_32_pcdi, 0xffff, 0x4aba, {255, 255, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_tst_32_pcix, 0xffff, 0x4abb, {255, 255, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_tst_32_i, 0xffff, 0x4abc, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_tas_8_pi7, 0xffff, 0x4adf, { 18, 18, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_pd7, 0xffff, 0x4ae7, { 20, 20, 17, 17, 17, 17, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_aw, 0xffff, 0x4af8, { 22, 22, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_tas_8_al, 0xffff, 0x4af9, { 26, 26, 16, 16, 16, 16, 12}}, + {m68000_base_device_ops::m68k_op_illegal, 0xffff, 0x4afc, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_mull_32_aw, 0xffff, 0x4c38, {255, 255, 47, 47, 47, 47, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_al, 0xffff, 0x4c39, {255, 255, 47, 47, 47, 47, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_pcdi, 0xffff, 0x4c3a, {255, 255, 48, 48, 48, 48, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_pcix, 0xffff, 0x4c3b, {255, 255, 50, 50, 50, 50, 43}}, + {m68000_base_device_ops::m68k_op_mull_32_i, 0xffff, 0x4c3c, {255, 255, 47, 47, 47, 47, 43}}, + {m68000_base_device_ops::m68k_op_divl_32_aw, 0xffff, 0x4c78, {255, 255, 88, 88, 88, 88, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_al, 0xffff, 0x4c79, {255, 255, 88, 88, 88, 88, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_pcdi, 0xffff, 0x4c7a, {255, 255, 89, 89, 89, 89, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_pcix, 0xffff, 0x4c7b, {255, 255, 91, 91, 91, 91, 84}}, + {m68000_base_device_ops::m68k_op_divl_32_i, 0xffff, 0x4c7c, {255, 255, 88, 88, 88, 88, 84}}, + {m68000_base_device_ops::m68k_op_movem_16_er_aw, 0xffff, 0x4cb8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_16_er_al, 0xffff, 0x4cb9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_16_er_pcdi, 0xffff, 0x4cba, { 16, 16, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_movem_16_er_pcix, 0xffff, 0x4cbb, { 18, 18, 11, 11, 11, 11, 11}}, + {m68000_base_device_ops::m68k_op_movem_32_er_aw, 0xffff, 0x4cf8, { 16, 16, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_al, 0xffff, 0x4cf9, { 20, 20, 12, 12, 12, 12, 8}}, + {m68000_base_device_ops::m68k_op_movem_32_er_pcdi, 0xffff, 0x4cfa, { 16, 16, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_movem_32_er_pcix, 0xffff, 0x4cfb, { 18, 18, 11, 11, 11, 11, 11}}, + {m68000_base_device_ops::m68k_op_link_16_a7, 0xffff, 0x4e57, { 16, 16, 5, 5, 5, 5, 5}}, + {m68000_base_device_ops::m68k_op_unlk_32_a7, 0xffff, 0x4e5f, { 12, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_reset, 0xffff, 0x4e70, { 0, 0, 0, 0, 0, 0, 0}}, + {m68000_base_device_ops::m68k_op_nop, 0xffff, 0x4e71, { 4, 4, 2, 2, 2, 2, 2}}, + {m68000_base_device_ops::m68k_op_stop, 0xffff, 0x4e72, { 4, 4, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_rte_32, 0xffff, 0x4e73, { 20, 24, 20, 20, 20, 20, 20}}, + {m68000_base_device_ops::m68k_op_rtd_32, 0xffff, 0x4e74, {255, 16, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_rts_32, 0xffff, 0x4e75, { 16, 16, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_trapv, 0xffff, 0x4e76, { 4, 4, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_rtr_32, 0xffff, 0x4e77, { 20, 20, 14, 14, 14, 14, 14}}, + {m68000_base_device_ops::m68k_op_movec_32_cr, 0xffff, 0x4e7a, {255, 12, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_movec_32_rc, 0xffff, 0x4e7b, {255, 10, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_jsr_32_aw, 0xffff, 0x4eb8, { 18, 18, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jsr_32_al, 0xffff, 0x4eb9, { 20, 20, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jsr_32_pcdi, 0xffff, 0x4eba, { 18, 18, 5, 5, 5, 5, 0}}, + {m68000_base_device_ops::m68k_op_jsr_32_pcix, 0xffff, 0x4ebb, { 22, 22, 7, 7, 7, 7, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_aw, 0xffff, 0x4ef8, { 10, 10, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_al, 0xffff, 0x4ef9, { 12, 12, 4, 4, 4, 4, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_pcdi, 0xffff, 0x4efa, { 10, 10, 5, 5, 5, 5, 0}}, + {m68000_base_device_ops::m68k_op_jmp_32_pcix, 0xffff, 0x4efb, { 14, 14, 7, 7, 7, 7, 0}}, + {m68000_base_device_ops::m68k_op_st_8_pi7, 0xffff, 0x50df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_st_8_pd7, 0xffff, 0x50e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_st_8_aw, 0xffff, 0x50f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_st_8_al, 0xffff, 0x50f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapt_16, 0xffff, 0x50fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapt_32, 0xffff, 0x50fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapt, 0xffff, 0x50fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sf_8_pi7, 0xffff, 0x51df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_pd7, 0xffff, 0x51e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_aw, 0xffff, 0x51f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sf_8_al, 0xffff, 0x51f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapf_16, 0xffff, 0x51fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapf_32, 0xffff, 0x51fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapf, 0xffff, 0x51fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_shi_8_pi7, 0xffff, 0x52df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_pd7, 0xffff, 0x52e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_aw, 0xffff, 0x52f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_shi_8_al, 0xffff, 0x52f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_traphi_16, 0xffff, 0x52fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_traphi_32, 0xffff, 0x52fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_traphi, 0xffff, 0x52fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sls_8_pi7, 0xffff, 0x53df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_pd7, 0xffff, 0x53e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_aw, 0xffff, 0x53f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sls_8_al, 0xffff, 0x53f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapls_16, 0xffff, 0x53fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapls_32, 0xffff, 0x53fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapls, 0xffff, 0x53fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_scc_8_pi7, 0xffff, 0x54df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_pd7, 0xffff, 0x54e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_aw, 0xffff, 0x54f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scc_8_al, 0xffff, 0x54f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapcc_16, 0xffff, 0x54fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapcc_32, 0xffff, 0x54fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapcc, 0xffff, 0x54fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_scs_8_pi7, 0xffff, 0x55df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_pd7, 0xffff, 0x55e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_aw, 0xffff, 0x55f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_scs_8_al, 0xffff, 0x55f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapcs_16, 0xffff, 0x55fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapcs_32, 0xffff, 0x55fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapcs, 0xffff, 0x55fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sne_8_pi7, 0xffff, 0x56df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_pd7, 0xffff, 0x56e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_aw, 0xffff, 0x56f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sne_8_al, 0xffff, 0x56f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapne_16, 0xffff, 0x56fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapne_32, 0xffff, 0x56fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapne, 0xffff, 0x56fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_seq_8_pi7, 0xffff, 0x57df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_pd7, 0xffff, 0x57e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_aw, 0xffff, 0x57f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_seq_8_al, 0xffff, 0x57f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapeq_16, 0xffff, 0x57fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapeq_32, 0xffff, 0x57fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapeq, 0xffff, 0x57fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_svc_8_pi7, 0xffff, 0x58df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_pd7, 0xffff, 0x58e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_aw, 0xffff, 0x58f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svc_8_al, 0xffff, 0x58f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapvc_16, 0xffff, 0x58fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapvc_32, 0xffff, 0x58fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapvc, 0xffff, 0x58fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_svs_8_pi7, 0xffff, 0x59df, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_pd7, 0xffff, 0x59e7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_aw, 0xffff, 0x59f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_svs_8_al, 0xffff, 0x59f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapvs_16, 0xffff, 0x59fa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapvs_32, 0xffff, 0x59fb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapvs, 0xffff, 0x59fc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_spl_8_pi7, 0xffff, 0x5adf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_pd7, 0xffff, 0x5ae7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_aw, 0xffff, 0x5af8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_spl_8_al, 0xffff, 0x5af9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trappl_16, 0xffff, 0x5afa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trappl_32, 0xffff, 0x5afb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trappl, 0xffff, 0x5afc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_smi_8_pi7, 0xffff, 0x5bdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_pd7, 0xffff, 0x5be7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_aw, 0xffff, 0x5bf8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_smi_8_al, 0xffff, 0x5bf9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapmi_16, 0xffff, 0x5bfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapmi_32, 0xffff, 0x5bfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapmi, 0xffff, 0x5bfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sge_8_pi7, 0xffff, 0x5cdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_pd7, 0xffff, 0x5ce7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_aw, 0xffff, 0x5cf8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sge_8_al, 0xffff, 0x5cf9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapge_16, 0xffff, 0x5cfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapge_32, 0xffff, 0x5cfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapge, 0xffff, 0x5cfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_slt_8_pi7, 0xffff, 0x5ddf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_pd7, 0xffff, 0x5de7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_aw, 0xffff, 0x5df8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_slt_8_al, 0xffff, 0x5df9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_traplt_16, 0xffff, 0x5dfa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_traplt_32, 0xffff, 0x5dfb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_traplt, 0xffff, 0x5dfc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sgt_8_pi7, 0xffff, 0x5edf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_pd7, 0xffff, 0x5ee7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_aw, 0xffff, 0x5ef8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sgt_8_al, 0xffff, 0x5ef9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_trapgt_16, 0xffff, 0x5efa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_trapgt_32, 0xffff, 0x5efb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_trapgt, 0xffff, 0x5efc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_sle_8_pi7, 0xffff, 0x5fdf, { 12, 12, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_pd7, 0xffff, 0x5fe7, { 14, 14, 11, 11, 11, 11, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_aw, 0xffff, 0x5ff8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_sle_8_al, 0xffff, 0x5ff9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_traple_16, 0xffff, 0x5ffa, {255, 255, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_traple_32, 0xffff, 0x5ffb, {255, 255, 8, 8, 8, 8, 8}}, + {m68000_base_device_ops::m68k_op_traple, 0xffff, 0x5ffc, {255, 255, 4, 4, 4, 4, 4}}, + {m68000_base_device_ops::m68k_op_bra_16, 0xffff, 0x6000, { 10, 10, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_bra_32, 0xffff, 0x60ff, { 10, 10, 10, 10, 10, 10, 10}}, + {m68000_base_device_ops::m68k_op_bsr_16, 0xffff, 0x6100, { 18, 18, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_bsr_32, 0xffff, 0x61ff, { 18, 18, 7, 7, 7, 7, 7}}, + {m68000_base_device_ops::m68k_op_bhi_16, 0xffff, 0x6200, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bhi_32, 0xffff, 0x62ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bls_16, 0xffff, 0x6300, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bls_32, 0xffff, 0x63ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcc_16, 0xffff, 0x6400, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcc_32, 0xffff, 0x64ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcs_16, 0xffff, 0x6500, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bcs_32, 0xffff, 0x65ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bne_16, 0xffff, 0x6600, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bne_32, 0xffff, 0x66ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_beq_16, 0xffff, 0x6700, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_beq_32, 0xffff, 0x67ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvc_16, 0xffff, 0x6800, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvc_32, 0xffff, 0x68ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvs_16, 0xffff, 0x6900, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bvs_32, 0xffff, 0x69ff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bpl_16, 0xffff, 0x6a00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bpl_32, 0xffff, 0x6aff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bmi_16, 0xffff, 0x6b00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bmi_32, 0xffff, 0x6bff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bge_16, 0xffff, 0x6c00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bge_32, 0xffff, 0x6cff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_blt_16, 0xffff, 0x6d00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_blt_32, 0xffff, 0x6dff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bgt_16, 0xffff, 0x6e00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_bgt_32, 0xffff, 0x6eff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_ble_16, 0xffff, 0x6f00, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_ble_32, 0xffff, 0x6fff, { 10, 10, 6, 6, 6, 6, 6}}, + {m68000_base_device_ops::m68k_op_sbcd_8_mm_axy7, 0xffff, 0x8f0f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_pack_16_mm_axy7, 0xffff, 0x8f4f, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_unpk_16_mm_axy7, 0xffff, 0x8f8f, {255, 255, 13, 13, 13, 13, 13}}, + {m68000_base_device_ops::m68k_op_subx_8_mm_axy7, 0xffff, 0x9f0f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_cmpm_8_axy7, 0xffff, 0xbf0f, { 12, 12, 9, 9, 9, 9, 9}}, + {m68000_base_device_ops::m68k_op_abcd_8_mm_axy7, 0xffff, 0xcf0f, { 18, 18, 16, 16, 16, 16, 16}}, + {m68000_base_device_ops::m68k_op_addx_8_mm_axy7, 0xffff, 0xdf0f, { 18, 18, 12, 12, 12, 12, 12}}, + {m68000_base_device_ops::m68k_op_asr_16_aw, 0xffff, 0xe0f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_asr_16_al, 0xffff, 0xe0f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_asl_16_aw, 0xffff, 0xe1f8, { 16, 16, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_asl_16_al, 0xffff, 0xe1f9, { 20, 20, 10, 10, 10, 10, 6}}, + {m68000_base_device_ops::m68k_op_lsr_16_aw, 0xffff, 0xe2f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsr_16_al, 0xffff, 0xe2f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_aw, 0xffff, 0xe3f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_lsl_16_al, 0xffff, 0xe3f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_aw, 0xffff, 0xe4f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxr_16_al, 0xffff, 0xe4f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_aw, 0xffff, 0xe5f8, { 16, 16, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_roxl_16_al, 0xffff, 0xe5f9, { 20, 20, 9, 9, 9, 9, 5}}, + {m68000_base_device_ops::m68k_op_ror_16_aw, 0xffff, 0xe6f8, { 16, 16, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_ror_16_al, 0xffff, 0xe6f9, { 20, 20, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_aw, 0xffff, 0xe7f8, { 16, 16, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_rol_16_al, 0xffff, 0xe7f9, { 20, 20, 11, 11, 11, 11, 7}}, + {m68000_base_device_ops::m68k_op_bftst_32_aw, 0xffff, 0xe8f8, {255, 255, 17, 17, 17, 17, 13}}, + {m68000_base_device_ops::m68k_op_bftst_32_al, 0xffff, 0xe8f9, {255, 255, 17, 17, 17, 17, 13}}, + {m68000_base_device_ops::m68k_op_bftst_32_pcdi, 0xffff, 0xe8fa, {255, 255, 18, 18, 18, 18, 13}}, + {m68000_base_device_ops::m68k_op_bftst_32_pcix, 0xffff, 0xe8fb, {255, 255, 20, 20, 20, 20, 13}}, + {m68000_base_device_ops::m68k_op_bfextu_32_aw, 0xffff, 0xe9f8, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfextu_32_al, 0xffff, 0xe9f9, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfextu_32_pcdi, 0xffff, 0xe9fa, {255, 255, 20, 20, 20, 20, 15}}, + {m68000_base_device_ops::m68k_op_bfextu_32_pcix, 0xffff, 0xe9fb, {255, 255, 22, 22, 22, 22, 15}}, + {m68000_base_device_ops::m68k_op_bfchg_32_aw, 0xffff, 0xeaf8, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfchg_32_al, 0xffff, 0xeaf9, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfexts_32_aw, 0xffff, 0xebf8, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfexts_32_al, 0xffff, 0xebf9, {255, 255, 19, 19, 19, 19, 15}}, + {m68000_base_device_ops::m68k_op_bfexts_32_pcdi, 0xffff, 0xebfa, {255, 255, 20, 20, 20, 20, 15}}, + {m68000_base_device_ops::m68k_op_bfexts_32_pcix, 0xffff, 0xebfb, {255, 255, 22, 22, 22, 22, 15}}, + {m68000_base_device_ops::m68k_op_bfclr_32_aw, 0xffff, 0xecf8, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfclr_32_al, 0xffff, 0xecf9, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfffo_32_aw, 0xffff, 0xedf8, {255, 255, 32, 32, 32, 32, 28}}, + {m68000_base_device_ops::m68k_op_bfffo_32_al, 0xffff, 0xedf9, {255, 255, 32, 32, 32, 32, 28}}, + {m68000_base_device_ops::m68k_op_bfffo_32_pcdi, 0xffff, 0xedfa, {255, 255, 33, 33, 33, 33, 28}}, + {m68000_base_device_ops::m68k_op_bfffo_32_pcix, 0xffff, 0xedfb, {255, 255, 35, 35, 35, 35, 28}}, + {m68000_base_device_ops::m68k_op_bfset_32_aw, 0xffff, 0xeef8, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfset_32_al, 0xffff, 0xeef9, {255, 255, 24, 24, 24, 24, 20}}, + {m68000_base_device_ops::m68k_op_bfins_32_aw, 0xffff, 0xeff8, {255, 255, 21, 21, 21, 21, 17}}, + {m68000_base_device_ops::m68k_op_bfins_32_al, 0xffff, 0xeff9, {255, 255, 21, 21, 21, 21, 17}}, + {nullptr, 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; i<NUM_CPU_TYPES; i++) + if(s->cycles[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;k<NUM_CPU_TYPES;k++) + { + m68ki_instruction_jump_table[k][i] = m68000_base_device_ops::m68k_op_illegal; + m68ki_cycles[k][i] = 0; + } + } + + ostruct = m68k_opcode_handler_table; + while(ostruct->mask != 0xff00) + { + for(i = 0;i < 0x10000;i++) + { + if((i & ostruct->mask) == ostruct->match) + m68ki_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) + { + fatalerror("m68ki_build_opcode_table: unhandled opcode mask %x (match %x), m68k core will not function!\n", ostruct->mask, ostruct->match); + } +} + + +/* ======================================================================== */ +/* ============================== END OF FILE ============================= */ +/* ======================================================================== */ diff --git a/src/devices/cpu/m68000/m68kops.h b/src/devices/cpu/m68000/m68kops.h new file mode 100644 index 00000000000..3f936f646f2 --- /dev/null +++ b/src/devices/cpu/m68000/m68kops.h @@ -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 --git a/src/devices/cpu/m68000/makefile b/src/devices/cpu/m68000/makefile index be25a067a78..12b29fa267a 100644 --- a/src/devices/cpu/m68000/makefile +++ b/src/devices/cpu/m68000/makefile @@ -8,30 +8,24 @@ ifeq ($(OS),os2) EXE := .exe endif -ifndef verbose - SILENT = @ -endif -CC = gcc -CXX = g++ - .PHONY: all clean -all : m68kmake$(EXE) m68kops.cpp +all : m68kmake$(EXE) m68kops.c clean clean: @echo Cleaning... -@rm -f m68kmake$(EXE) -@rm -f m68kmake.o - -@rm -f m68kops.* -m68kmake.o: m68kmake.cpp - $(SILENT) $(CC) -x c++ -std=c++11 -o "$@" -c "$<" +m68kmake.o: m68kmake.c + @echo $(notdir $<) + @gcc -x c++ -std=gnu++98 -o "$@" -c "$<" m68kmake$(EXE) : m68kmake.o @echo Linking $@... - $(SILENT) $(CXX) -lstdc++ $^ -o $@ + @g++ -lstdc++ $^ -o $@ -m68kops.cpp: m68kmake$(EXE) m68k_in.cpp +m68kops.c: m68kmake$(EXE) m68k_in.c @echo Generating M68K source files... - $(SILENT) ./m68kmake$(EXE) . m68k_in.cpp + @m68kmake$(EXE) . m68k_in.c diff --git a/src/devices/cpu/mips/mips3.cpp b/src/devices/cpu/mips/mips3.cpp index 711b9c3edf4..f4747b7304c 100644 --- a/src/devices/cpu/mips/mips3.cpp +++ b/src/devices/cpu/mips/mips3.cpp @@ -120,10 +120,8 @@ const device_type RM7000BE = &device_creator<rm7000be_device>; const device_type RM7000LE = &device_creator<rm7000le_device>; -// VR4300 and VR5432 have 4 fewer PFN bits, and only 32 TLB entries mips3_device::mips3_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, mips3_flavor flavor, endianness_t endianness) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, __FILE__) - , device_vtlb_interface(mconfig, *this, AS_PROGRAM) , m_program_config("program", endianness, 32, 32, 0, 32, MIPS3_MIN_PAGE_SHIFT) , m_flavor(flavor) , m_core(nullptr) @@ -136,6 +134,7 @@ mips3_device::mips3_device(const machine_config &mconfig, device_type type, cons , m_ll_value(0) , m_lld_value(0) , m_badcop_value(0) + , m_tlb_table(nullptr) , m_lwl(endianness == ENDIANNESS_BIG ? &mips3_device::lwl_be : &mips3_device::lwl_le) , m_lwr(endianness == ENDIANNESS_BIG ? &mips3_device::lwr_be : &mips3_device::lwr_le) , m_swl(endianness == ENDIANNESS_BIG ? &mips3_device::swl_be : &mips3_device::swl_le) @@ -145,13 +144,14 @@ mips3_device::mips3_device(const machine_config &mconfig, device_type type, cons , m_sdl(endianness == ENDIANNESS_BIG ? &mips3_device::sdl_be : &mips3_device::sdl_le) , m_sdr(endianness == ENDIANNESS_BIG ? &mips3_device::sdr_be : &mips3_device::sdr_le) , c_system_clock(0) - , m_pfnmask(flavor == MIPS3_TYPE_VR4300 ? 0x000fffff : 0x00ffffff) - , m_tlbentries(flavor == MIPS3_TYPE_VR4300 ? 32 : MIPS3_MAX_TLB_ENTRIES) + , m_pfnmask(0) + , m_tlbentries(0) , m_bigendian(endianness == ENDIANNESS_BIG) , m_byte_xor(m_bigendian ? BYTE4_XOR_BE(0) : BYTE4_XOR_LE(0)) , m_word_xor(m_bigendian ? WORD_XOR_BE(0) : WORD_XOR_LE(0)) , c_icache_size(0) , c_dcache_size(0) + , m_vtlb(nullptr) , m_fastram_select(0) , m_debugger_temp(0) , m_cache(CACHE_SIZE + sizeof(internal_mips3_state)) @@ -190,14 +190,17 @@ mips3_device::mips3_device(const machine_config &mconfig, device_type type, cons } memset(m_fastram, 0, sizeof(m_fastram)); memset(m_hotspot, 0, sizeof(m_hotspot)); - - // configure the virtual TLB - set_vtlb_fixed_entries(2 * m_tlbentries + 2); } void mips3_device::device_stop() { + if (m_vtlb != nullptr) + { + vtlb_free(m_vtlb); + m_vtlb = nullptr; + } + if (m_drcfe != nullptr) { m_drcfe = nullptr; @@ -328,12 +331,28 @@ void mips3_device::device_start() m_program = &space(AS_PROGRAM); m_direct = &m_program->direct(); + /* configure flavor-specific parameters */ + m_pfnmask = 0x00ffffff; + m_tlbentries = MIPS3_MAX_TLB_ENTRIES; + + /* VR4300 and VR5432 have 4 fewer PFN bits, and only 32 TLB entries */ + if (m_flavor == MIPS3_TYPE_VR4300) + { + m_pfnmask = 0x000fffff; + m_tlbentries = 32; + } + /* set up the endianness */ m_program->accessors(m_memory); + /* allocate the virtual TLB */ + m_vtlb = vtlb_alloc(this, AS_PROGRAM, 2 * m_tlbentries + 2, 0); + /* allocate a timer for the compare interrupt */ m_compare_int_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(mips3_device::compare_int_callback), this)); + m_tlb_table = vtlb_table(m_vtlb); + UINT32 flags = 0; /* initialize the UML generator */ m_drcuml = std::make_unique<drcuml_state>(*this, m_cache, flags, 8, 32, 2); @@ -931,13 +950,13 @@ void mips3_device::device_reset() entry->entry_hi = 0xffffffff; entry->entry_lo[0] = 0xfffffff8; entry->entry_lo[1] = 0xfffffff8; - vtlb_load(2 * tlbindex + 0, 0, 0, 0); - vtlb_load(2 * tlbindex + 1, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 0, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 1, 0, 0, 0); } /* load the fixed TLB range */ - vtlb_load(2 * m_tlbentries + 0, (0xa0000000 - 0x80000000) >> MIPS3_MIN_PAGE_SHIFT, 0x80000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); - vtlb_load(2 * m_tlbentries + 1, (0xc0000000 - 0xa0000000) >> MIPS3_MIN_PAGE_SHIFT, 0xa0000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); + vtlb_load(m_vtlb, 2 * m_tlbentries + 0, (0xa0000000 - 0x80000000) >> MIPS3_MIN_PAGE_SHIFT, 0x80000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); + vtlb_load(m_vtlb, 2 * m_tlbentries + 1, (0xc0000000 - 0xa0000000) >> MIPS3_MIN_PAGE_SHIFT, 0xa0000000, 0x00000000 | VTLB_READ_ALLOWED | VTLB_WRITE_ALLOWED | VTLB_FETCH_ALLOWED | VTLB_FLAG_VALID); m_core->mode = (MODE_KERNEL << 1) | 0; m_cache_dirty = TRUE; @@ -950,7 +969,7 @@ bool mips3_device::memory_translate(address_spacenum spacenum, int intention, of /* only applies to the program address space */ if (spacenum == AS_PROGRAM) { - const vtlb_entry *table = vtlb_table(); + const vtlb_entry *table = vtlb_table(m_vtlb); vtlb_entry entry = table[address >> MIPS3_MIN_PAGE_SHIFT]; if ((entry & (1 << (intention & (TRANSLATE_TYPE_MASK | TRANSLATE_USER_MASK)))) == 0) return false; @@ -979,7 +998,7 @@ offs_t mips3_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *op inline bool mips3_device::RBYTE(offs_t address, UINT32 *result) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1012,7 +1031,7 @@ inline bool mips3_device::RBYTE(offs_t address, UINT32 *result) inline bool mips3_device::RHALF(offs_t address, UINT32 *result) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1045,7 +1064,7 @@ inline bool mips3_device::RHALF(offs_t address, UINT32 *result) inline bool mips3_device::RWORD(offs_t address, UINT32 *result) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1078,7 +1097,7 @@ inline bool mips3_device::RWORD(offs_t address, UINT32 *result) inline bool mips3_device::RWORD_MASKED(offs_t address, UINT32 *result, UINT32 mem_mask) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { *result = (*m_memory.read_dword_masked)(*m_program, (tlbval & ~0xfff) | (address & 0xfff), mem_mask); @@ -1101,7 +1120,7 @@ inline bool mips3_device::RWORD_MASKED(offs_t address, UINT32 *result, UINT32 me inline bool mips3_device::RDOUBLE(offs_t address, UINT64 *result) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { *result = (*m_memory.read_qword)(*m_program, (tlbval & ~0xfff) | (address & 0xfff)); @@ -1124,7 +1143,7 @@ inline bool mips3_device::RDOUBLE(offs_t address, UINT64 *result) inline bool mips3_device::RDOUBLE_MASKED(offs_t address, UINT64 *result, UINT64 mem_mask) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_READ_ALLOWED) { *result = (*m_memory.read_qword_masked)(*m_program, (tlbval & ~0xfff) | (address & 0xfff), mem_mask); @@ -1147,7 +1166,7 @@ inline bool mips3_device::RDOUBLE_MASKED(offs_t address, UINT64 *result, UINT64 inline void mips3_device::WBYTE(offs_t address, UINT8 data) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1181,7 +1200,7 @@ inline void mips3_device::WBYTE(offs_t address, UINT8 data) inline void mips3_device::WHALF(offs_t address, UINT16 data) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1215,7 +1234,7 @@ inline void mips3_device::WHALF(offs_t address, UINT16 data) inline void mips3_device::WWORD(offs_t address, UINT32 data) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { const UINT32 tlbaddress = (tlbval & ~0xfff) | (address & 0xfff); @@ -1249,7 +1268,7 @@ inline void mips3_device::WWORD(offs_t address, UINT32 data) inline void mips3_device::WWORD_MASKED(offs_t address, UINT32 data, UINT32 mem_mask) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { (*m_memory.write_dword_masked)(*m_program, (tlbval & ~0xfff) | (address & 0xfff), data, mem_mask); @@ -1273,7 +1292,7 @@ inline void mips3_device::WWORD_MASKED(offs_t address, UINT32 data, UINT32 mem_m inline void mips3_device::WDOUBLE(offs_t address, UINT64 data) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { (*m_memory.write_qword)(*m_program, (tlbval & ~0xfff) | (address & 0xfff), data); @@ -1297,7 +1316,7 @@ inline void mips3_device::WDOUBLE(offs_t address, UINT64 data) inline void mips3_device::WDOUBLE_MASKED(offs_t address, UINT64 data, UINT64 mem_mask) { - const UINT32 tlbval = vtlb_table()[address >> 12]; + const UINT32 tlbval = m_tlb_table[address >> 12]; if (tlbval & VTLB_WRITE_ALLOWED) { (*m_memory.write_qword_masked)(*m_program, (tlbval & ~0xfff) | (address & 0xfff), data, mem_mask); diff --git a/src/devices/cpu/mips/mips3.h b/src/devices/cpu/mips/mips3.h index 1715861bb89..9e0de9ed419 100644 --- a/src/devices/cpu/mips/mips3.h +++ b/src/devices/cpu/mips/mips3.h @@ -15,7 +15,7 @@ #define __MIPS3_H__ -#include "divtlb.h" +#include "cpu/vtlb.h" #include "cpu/drcfe.h" #include "cpu/drcuml.h" #include "cpu/drcumlsh.h" @@ -245,7 +245,7 @@ struct compiler_state class mips3_frontend; -class mips3_device : public cpu_device, public device_vtlb_interface +class mips3_device : public cpu_device { friend class mips3_frontend; @@ -355,6 +355,7 @@ private: UINT32 m_ll_value; UINT64 m_lld_value; UINT32 m_badcop_value; + const vtlb_entry *m_tlb_table; /* endian-dependent load/store */ typedef void (mips3_device::*loadstore_func)(UINT32 op); @@ -388,6 +389,7 @@ private: size_t c_dcache_size; /* MMU */ + vtlb_state * m_vtlb; mips3_tlb_entry m_tlb[MIPS3_MAX_TLB_ENTRIES]; /* fast RAM */ diff --git a/src/devices/cpu/mips/mips3com.cpp b/src/devices/cpu/mips/mips3com.cpp index 2fcf8de1844..bcd6f6f349a 100644 --- a/src/devices/cpu/mips/mips3com.cpp +++ b/src/devices/cpu/mips/mips3com.cpp @@ -325,8 +325,8 @@ void mips3_device::tlb_map_entry(int tlbindex) /* the ASID doesn't match the current ASID, and if the page isn't global, unmap it from the TLB */ if (!tlb_entry_matches_asid(entry, current_asid) && !tlb_entry_is_global(entry)) { - vtlb_load(2 * tlbindex + 0, 0, 0, 0); - vtlb_load(2 * tlbindex + 1, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 0, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 1, 0, 0, 0); return; } @@ -334,8 +334,8 @@ void mips3_device::tlb_map_entry(int tlbindex) vpn = ((entry->entry_hi >> 13) & 0x07ffffff) << 1; if (vpn >= (1 << (MIPS3_MAX_PADDR_SHIFT - MIPS3_MIN_PAGE_SHIFT))) { - vtlb_load(2 * tlbindex + 0, 0, 0, 0); - vtlb_load(2 * tlbindex + 1, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 0, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + 1, 0, 0, 0); return; } @@ -369,9 +369,9 @@ void mips3_device::tlb_map_entry(int tlbindex) /* load the virtual TLB with the corresponding entries */ if ((effvpn + count) <= (0x80000000 >> MIPS3_MIN_PAGE_SHIFT) || effvpn >= (0xc0000000 >> MIPS3_MIN_PAGE_SHIFT)) - vtlb_load(2 * tlbindex + which, count, effvpn << MIPS3_MIN_PAGE_SHIFT, (pfn << MIPS3_MIN_PAGE_SHIFT) | flags); + vtlb_load(m_vtlb, 2 * tlbindex + which, count, effvpn << MIPS3_MIN_PAGE_SHIFT, (pfn << MIPS3_MIN_PAGE_SHIFT) | flags); else - vtlb_load(2 * tlbindex + which, 0, 0, 0); + vtlb_load(m_vtlb, 2 * tlbindex + which, 0, 0, 0); } } diff --git a/src/devices/cpu/mips/mips3com.h b/src/devices/cpu/mips/mips3com.h index 20facae78d0..86d7f0c7a05 100644 --- a/src/devices/cpu/mips/mips3com.h +++ b/src/devices/cpu/mips/mips3com.h @@ -14,6 +14,7 @@ #define __MIPS3COM_H__ #include "mips3.h" +#include "cpu/vtlb.h" /*************************************************************************** diff --git a/src/devices/cpu/mips/mips3drc.cpp b/src/devices/cpu/mips/mips3drc.cpp index 7b6da3a1626..4e6e9771a38 100644 --- a/src/devices/cpu/mips/mips3drc.cpp +++ b/src/devices/cpu/mips/mips3drc.cpp @@ -667,7 +667,7 @@ void mips3_device::static_generate_tlb_mismatch() UML_RECOVER(block, I0, MAPVAR_PC); // recover i0,PC UML_MOV(block, mem(&m_core->pc), I0); // mov <pc>,i0 UML_SHR(block, I1, I0, 12); // shr i1,i0,12 - UML_LOAD(block, I1, (void *)vtlb_table(), I1, SIZE_DWORD, SCALE_x4);// load i1,[vtlb_table],i1,dword + UML_LOAD(block, I1, (void *)vtlb_table(m_vtlb), I1, SIZE_DWORD, SCALE_x4);// load i1,[vtlb_table],i1,dword if (PRINTF_MMU) { static const char text[] = "TLB mismatch @ %08X (ent=%08X)\n"; @@ -839,7 +839,7 @@ void mips3_device::static_generate_memory_accessor(int mode, int size, int iswri /* general case: assume paging and perform a translation */ UML_SHR(block, I3, I0, 12); // shr i3,i0,12 - UML_LOAD(block, I3, (void *)vtlb_table(), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb_table],i3,dword + UML_LOAD(block, I3, (void *)vtlb_table(m_vtlb), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb_table],i3,dword UML_TEST(block, I3, iswrite ? VTLB_WRITE_ALLOWED : VTLB_READ_ALLOWED);// test i3,iswrite ? VTLB_WRITE_ALLOWED : VTLB_READ_ALLOWED UML_JMPc(block, COND_Z, tlbmiss = label++); // jmp tlbmiss,z UML_ROLINS(block, I0, I3, 0, 0xfffff000); // rolins i0,i3,0,0xfffff000 @@ -1226,7 +1226,7 @@ void mips3_device::generate_sequence_instruction(drcuml_block *block, compiler_s /* validate our TLB entry at this PC; if we fail, we need to handle it */ if ((desc->flags & OPFLAG_VALIDATE_TLB) && (desc->pc < 0x80000000 || desc->pc >= 0xc0000000)) { - const vtlb_entry *tlbtable = vtlb_table(); + const vtlb_entry *tlbtable = vtlb_table(m_vtlb); /* if we currently have a valid TLB read entry, we just verify */ if (tlbtable[desc->pc >> 12] & VTLB_FETCH_ALLOWED) diff --git a/src/devices/cpu/pdp1/pdp1.cpp b/src/devices/cpu/pdp1/pdp1.cpp index d7a9ad008fb..cbb43535d7f 100644 --- a/src/devices/cpu/pdp1/pdp1.cpp +++ b/src/devices/cpu/pdp1/pdp1.cpp @@ -384,7 +384,7 @@ pdp1_device::pdp1_device(const machine_config &mconfig, const char *tag, device_ : cpu_device(mconfig, PDP1, "PDP1", tag, owner, clock, "pdp1_cpu", __FILE__) , m_program_config("program", ENDIANNESS_BIG, 32, 18, 0) { - m_program_config.m_is_octal = true; + m_is_octal = true; } diff --git a/src/devices/cpu/pdp1/tx0.cpp b/src/devices/cpu/pdp1/tx0.cpp index 8e5b41776a0..3a4fd7f1fb1 100644 --- a/src/devices/cpu/pdp1/tx0.cpp +++ b/src/devices/cpu/pdp1/tx0.cpp @@ -61,7 +61,7 @@ tx0_device::tx0_device(const machine_config &mconfig, device_type type, const ch , m_sel_handler(*this) , m_io_reset_callback(*this) { - m_program_config.m_is_octal = true; + m_is_octal = true; } tx0_8kw_device::tx0_8kw_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) diff --git a/src/devices/cpu/powerpc/ppc.h b/src/devices/cpu/powerpc/ppc.h index 450b4ca2257..5e40ee88249 100644 --- a/src/devices/cpu/powerpc/ppc.h +++ b/src/devices/cpu/powerpc/ppc.h @@ -14,7 +14,7 @@ #ifndef __PPC_H__ #define __PPC_H__ -#include "divtlb.h" +#include "cpu/vtlb.h" #include "cpu/drcfe.h" #include "cpu/drcuml.h" #include "cpu/drcumlsh.h" @@ -171,7 +171,7 @@ enum class ppc_frontend; -class ppc_device : public cpu_device, public device_vtlb_interface +class ppc_device : public cpu_device { friend class ppc_frontend; @@ -462,6 +462,9 @@ protected: UINT32 m_sebr; UINT32 m_ser; + /* MMU */ + vtlb_state *m_vtlb; + /* architectural distinctions */ powerpc_flavor m_flavor; UINT32 m_cap; diff --git a/src/devices/cpu/powerpc/ppccom.cpp b/src/devices/cpu/powerpc/ppccom.cpp index a9a26b29a5c..9036ff2c794 100644 --- a/src/devices/cpu/powerpc/ppccom.cpp +++ b/src/devices/cpu/powerpc/ppccom.cpp @@ -209,11 +209,11 @@ const device_type PPC405GP = &device_creator<ppc405gp_device>; ppc_device::ppc_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, int address_bits, int data_bits, powerpc_flavor flavor, UINT32 cap, UINT32 tb_divisor, address_map_constructor internal_map) : cpu_device(mconfig, type, name, tag, owner, clock, shortname, __FILE__) - , device_vtlb_interface(mconfig, *this, AS_PROGRAM) , m_program_config("program", ENDIANNESS_BIG, data_bits, address_bits, 0, internal_map) , c_bus_frequency(0) , m_core(nullptr) , m_bus_freq_multiplier(1) + , m_vtlb(nullptr) , m_flavor(flavor) , m_cap(cap) , m_tb_divisor(tb_divisor) @@ -224,11 +224,6 @@ ppc_device::ppc_device(const machine_config &mconfig, device_type type, const ch { m_program_config.m_logaddr_width = 32; m_program_config.m_page_shift = POWERPC_MIN_PAGE_SHIFT; - - // configure the virtual TLB - set_vtlb_dynamic_entries(POWERPC_TLB_ENTRIES); - if (m_cap & PPCCAP_603_MMU) - set_vtlb_fixed_entries(PPC603_FIXED_TLB_ENTRIES); } //ppc403_device::ppc403_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) @@ -713,6 +708,9 @@ void ppc_device::device_start() if (!(m_cap & PPCCAP_4XX) && space_config()->m_endianness != ENDIANNESS_NATIVE) m_codexor = 4; + /* allocate the virtual TLB */ + m_vtlb = vtlb_alloc(this, AS_PROGRAM, (m_cap & PPCCAP_603_MMU) ? PPC603_FIXED_TLB_ENTRIES : 0, POWERPC_TLB_ENTRIES); + /* allocate a timer for the compare interrupt */ if ((m_cap & PPCCAP_OEA) && (m_tb_divisor)) m_decrementer_int_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(ppc_device::decrementer_int_callback), this)); @@ -1150,6 +1148,9 @@ void ppc_device::state_string_export(const device_state_entry &entry, std::strin void ppc_device::device_stop() { + if (m_vtlb != nullptr) + vtlb_free(m_vtlb); + m_vtlb = nullptr; } @@ -1198,11 +1199,12 @@ void ppc_device::device_reset() m_core->irq_pending = 0; /* flush the TLB */ + vtlb_flush_dynamic(m_vtlb); if (m_cap & PPCCAP_603_MMU) { for (int tlbindex = 0; tlbindex < PPC603_FIXED_TLB_ENTRIES; tlbindex++) { - vtlb_load(tlbindex, 0, 0, 0); + vtlb_load(m_vtlb, tlbindex, 0, 0, 0); } } @@ -1383,7 +1385,7 @@ UINT32 ppc_device::ppccom_translate_address_internal(int intention, offs_t &addr /* if we're simulating the 603 MMU, fill in the data and stop here */ if (m_cap & PPCCAP_603_MMU) { - UINT32 entry = vtlb_table()[address >> 12]; + UINT32 entry = vtlb_table(m_vtlb)[address >> 12]; m_core->mmu603_cmp = 0x80000000 | ((segreg & 0xffffff) << 7) | (0 << 6) | ((address >> 22) & 0x3f); m_core->mmu603_hash[0] = hashbase | ((hash << 6) & hashmask); m_core->mmu603_hash[1] = hashbase | ((~hash << 6) & hashmask); @@ -1463,7 +1465,7 @@ bool ppc_device::memory_translate(address_spacenum spacenum, int intention, offs void ppc_device::ppccom_tlb_fill() { - vtlb_fill(m_core->param0, m_core->param1); + vtlb_fill(m_vtlb, m_core->param0, m_core->param1); } @@ -1474,7 +1476,7 @@ void ppc_device::ppccom_tlb_fill() void ppc_device::ppccom_tlb_flush() { - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); } @@ -1490,7 +1492,7 @@ void ppc_device::ppccom_tlb_flush() void ppc_device::ppccom_execute_tlbie() { - vtlb_flush_address(m_core->param0); + vtlb_flush_address(m_vtlb, m_core->param0); } @@ -1501,7 +1503,7 @@ void ppc_device::ppccom_execute_tlbie() void ppc_device::ppccom_execute_tlbia() { - vtlb_flush_dynamic(); + vtlb_flush_dynamic(m_vtlb); } @@ -1528,7 +1530,7 @@ void ppc_device::ppccom_execute_tlbl() flags |= VTLB_FETCH_ALLOWED; /* load the entry */ - vtlb_load(entrynum, 1, address, (m_core->spr[SPR603_RPA] & 0xfffff000) | flags); + vtlb_load(m_vtlb, entrynum, 1, address, (m_core->spr[SPR603_RPA] & 0xfffff000) | flags); } diff --git a/src/devices/cpu/powerpc/ppcdrc.cpp b/src/devices/cpu/powerpc/ppcdrc.cpp index 35b984d240d..ed502d344de 100644 --- a/src/devices/cpu/powerpc/ppcdrc.cpp +++ b/src/devices/cpu/powerpc/ppcdrc.cpp @@ -743,11 +743,11 @@ void ppc_device::static_generate_tlb_mismatch() UML_HANDLE(block, *m_tlb_mismatch); // handle tlb_mismatch UML_RECOVER(block, I0, MAPVAR_PC); // recover i0,PC UML_SHR(block, I1, I0, 12); // shr i1,i0,12 - UML_LOAD(block, I2, (void *)vtlb_table(), I1, SIZE_DWORD, SCALE_x4); // load i2,[vtlb],i1,dword + UML_LOAD(block, I2, (void *)vtlb_table(m_vtlb), I1, SIZE_DWORD, SCALE_x4); // load i2,[vtlb],i1,dword UML_MOV(block, mem(&m_core->param0), I0); // mov [param0],i0 UML_MOV(block, mem(&m_core->param1), TRANSLATE_FETCH); // mov [param1],TRANSLATE_FETCH UML_CALLC(block, (c_function)cfunc_ppccom_tlb_fill, this); // callc tlbfill,ppc - UML_LOAD(block, I1, (void *)vtlb_table(), I1, SIZE_DWORD, SCALE_x4); // load i1,[vtlb],i1,dword + UML_LOAD(block, I1, (void *)vtlb_table(m_vtlb), I1, SIZE_DWORD, SCALE_x4); // load i1,[vtlb],i1,dword UML_TEST(block, I1, VTLB_FETCH_ALLOWED); // test i1,VTLB_FETCH_ALLOWED UML_JMPc(block, COND_Z, isi = label++); // jmp isi,z UML_CMP(block, I2, 0); // cmp i2,0 @@ -1021,7 +1021,7 @@ void ppc_device::static_generate_memory_accessor(int mode, int size, int iswrite if (((m_cap & PPCCAP_OEA) && (mode & MODE_DATA_TRANSLATION)) || (iswrite && (m_cap & PPCCAP_4XX) && (mode & MODE_PROTECTION))) { UML_SHR(block, I3, I0, 12); // shr i3,i0,12 - UML_LOAD(block, I3, (void *)vtlb_table(), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb],i3,dword + UML_LOAD(block, I3, (void *)vtlb_table(m_vtlb), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb],i3,dword UML_TEST(block, I3, (UINT64)1 << translate_type); // test i3,1 << translate_type UML_JMPc(block, COND_Z, tlbmiss = label++); // jmp tlbmiss,z UML_LABEL(block, tlbreturn = label++); // tlbreturn: @@ -1338,7 +1338,7 @@ void ppc_device::static_generate_memory_accessor(int mode, int size, int iswrite UML_MOV(block, mem(&m_core->param1), translate_type); // mov [param1],translate_type UML_CALLC(block, (c_function)cfunc_ppccom_tlb_fill, this); // callc tlbfill,ppc UML_SHR(block, I3, I0, 12); // shr i3,i0,12 - UML_LOAD(block, I3, (void *)vtlb_table(), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb],i3,dword + UML_LOAD(block, I3, (void *)vtlb_table(m_vtlb), I3, SIZE_DWORD, SCALE_x4);// load i3,[vtlb],i3,dword UML_TEST(block, I3, (UINT64)1 << translate_type); // test i3,1 << translate_type UML_JMPc(block, COND_NZ, tlbreturn); // jmp tlbreturn,nz @@ -1703,7 +1703,7 @@ void ppc_device::generate_sequence_instruction(drcuml_block *block, compiler_sta /* validate our TLB entry at this PC; if we fail, we need to handle it */ if ((desc->flags & OPFLAG_VALIDATE_TLB) && (m_core->mode & MODE_DATA_TRANSLATION)) { - const vtlb_entry *tlbtable = vtlb_table(); + const vtlb_entry *tlbtable = vtlb_table(m_vtlb); /* if we currently have a valid TLB read entry, we just verify */ if (tlbtable[desc->pc >> 12] != 0) diff --git a/src/devices/cpu/se3208/se3208.cpp b/src/devices/cpu/se3208/se3208.cpp index 45c4c38cc86..011cc103909 100644 --- a/src/devices/cpu/se3208/se3208.cpp +++ b/src/devices/cpu/se3208/se3208.cpp @@ -54,22 +54,27 @@ se3208_device::se3208_device(const machine_config &mconfig, const char *tag, dev UINT32 se3208_device::read_dword_unaligned(address_space &space, UINT32 address) { - if (DWORD_ALIGNED(address)) - return space.read_dword(address); - else + switch (address & 3) { - osd_printf_debug("%08x: dword READ unaligned %08x\n", m_PC, address); + case 0: + return space.read_dword(address); + case 1: + case 2: + case 3: + printf("%08x: dword READ unaligned %08x\n", m_PC, address); #if ALLOW_UNALIGNED_DWORD_ACCESS return space.read_byte(address) | space.read_byte(address + 1) << 8 | space.read_byte(address + 2) << 16 | space.read_byte(address + 3) << 24; #else return 0; #endif } + + return 0; } UINT16 se3208_device::read_word_unaligned(address_space &space, UINT32 address) { - if (!WORD_ALIGNED(address)) + if (address & 1) return space.read_byte(address) | space.read_byte(address+1)<<8; else return space.read_word(address); @@ -77,24 +82,31 @@ UINT16 se3208_device::read_word_unaligned(address_space &space, UINT32 address) void se3208_device::write_dword_unaligned(address_space &space, UINT32 address, UINT32 data) { - if (DWORD_ALIGNED(address)) - space.write_dword(address, data); - else + switch (address & 3) { + case 0: + space.write_dword(address, data); + break; + + case 1: + case 2: + case 3: #if ALLOW_UNALIGNED_DWORD_ACCESS space.write_byte(address, data & 0xff); space.write_byte(address + 1, (data >> 8) & 0xff); space.write_byte(address + 2, (data >> 16) & 0xff); space.write_byte(address + 3, (data >> 24) & 0xff); #endif - osd_printf_debug("%08x: dword WRITE unaligned %08x\n", m_PC, address); + printf("%08x: dword WRITE unaligned %08x\n", m_PC, address); + + break; } } void se3208_device::write_word_unaligned(address_space &space, UINT32 address, UINT16 data) { - if (!WORD_ALIGNED(address)) + if (address & 1) { space.write_byte(address, data & 0xff); space.write_byte(address+1, (data>>8)&0xff); diff --git a/src/devices/cpu/t11/t11.cpp b/src/devices/cpu/t11/t11.cpp index 5e32e2081f5..72c2e80c91b 100644 --- a/src/devices/cpu/t11/t11.cpp +++ b/src/devices/cpu/t11/t11.cpp @@ -49,7 +49,7 @@ t11_device::t11_device(const machine_config &mconfig, device_type type, const ch , m_program_config("program", ENDIANNESS_LITTLE, 16, 16, 0) , c_initial_mode(0) { - m_program_config.m_is_octal = true; + m_is_octal = true; memset(m_reg, 0x00, sizeof(m_reg)); memset(&m_psw, 0x00, sizeof(m_psw)); } @@ -59,7 +59,7 @@ t11_device::t11_device(const machine_config &mconfig, const char *tag, device_t , m_program_config("program", ENDIANNESS_LITTLE, 16, 16, 0) , c_initial_mode(0) { - m_program_config.m_is_octal = true; + m_is_octal = true; memset(m_reg, 0x00, sizeof(m_reg)); memset(&m_psw, 0x00, sizeof(m_psw)); } diff --git a/src/devices/cpu/vtlb.cpp b/src/devices/cpu/vtlb.cpp new file mode 100644 index 00000000000..4c9a9a2f311 --- /dev/null +++ b/src/devices/cpu/vtlb.cpp @@ -0,0 +1,310 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + vtlb.c + + Generic virtual TLB implementation. + +***************************************************************************/ + +#include "emu.h" +#include "vtlb.h" + + + +/*************************************************************************** + DEBUGGING +***************************************************************************/ + +#define PRINTF_TLB (0) + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +/* VTLB state */ +struct vtlb_state +{ + cpu_device * cpudevice; /* CPU device */ + address_spacenum space; /* address space */ + int dynamic; /* number of dynamic entries */ + int fixed; /* number of fixed entries */ + int dynindex; /* index of next dynamic entry */ + int pageshift; /* bits to shift to get page index */ + int addrwidth; /* logical address bus width */ + std::vector<offs_t> live; /* array of live entries by table index */ + std::vector<int> fixedpages; /* number of pages each fixed entry covers */ + std::vector<vtlb_entry> table; /* table of entries by address */ +}; + + + +/*************************************************************************** + INITIALIZATION/TEARDOWN +***************************************************************************/ + +/*------------------------------------------------- + vtlb_alloc - allocate a new VTLB for the + given CPU +-------------------------------------------------*/ + +vtlb_state *vtlb_alloc(device_t *cpu, address_spacenum space, int fixed_entries, int dynamic_entries) +{ + vtlb_state *vtlb; + + /* allocate memory for the core structure */ + vtlb = auto_alloc_clear(cpu->machine(), <vtlb_state>()); + + /* fill in CPU information */ + vtlb->cpudevice = downcast<cpu_device *>(cpu); + vtlb->space = space; + vtlb->dynamic = dynamic_entries; + vtlb->fixed = fixed_entries; + const address_space_config *spaceconfig = device_get_space_config(*cpu, space); + assert(spaceconfig != nullptr); + vtlb->pageshift = spaceconfig->m_page_shift; + vtlb->addrwidth = spaceconfig->m_logaddr_width; + + /* validate CPU information */ + assert((1 << vtlb->pageshift) > VTLB_FLAGS_MASK); + assert(vtlb->addrwidth > vtlb->pageshift); + + /* allocate the entry array */ + vtlb->live.resize(fixed_entries + dynamic_entries); + memset(&vtlb->live[0], 0, vtlb->live.size()*sizeof(vtlb->live[0])); + cpu->save_item(NAME(vtlb->live)); + + /* allocate the lookup table */ + vtlb->table.resize((size_t) 1 << (vtlb->addrwidth - vtlb->pageshift)); + memset(&vtlb->table[0], 0, vtlb->table.size()*sizeof(vtlb->table[0])); + cpu->save_item(NAME(vtlb->table)); + + /* allocate the fixed page count array */ + if (fixed_entries > 0) + { + vtlb->fixedpages.resize(fixed_entries); + memset(&vtlb->fixedpages[0], 0, fixed_entries*sizeof(vtlb->fixedpages[0])); + cpu->save_item(NAME(vtlb->fixedpages)); + } + return vtlb; +} + + +/*------------------------------------------------- + vtlb_free - free an allocated VTLB +-------------------------------------------------*/ + +void vtlb_free(vtlb_state *vtlb) +{ + auto_free(vtlb->cpudevice->machine(), vtlb); +} + + + +/*************************************************************************** + FILLING +***************************************************************************/ + +/*------------------------------------------------- + vtlb_fill - rcalled by the CPU core in + response to an unmapped access +-------------------------------------------------*/ + +int vtlb_fill(vtlb_state *vtlb, offs_t address, int intention) +{ + offs_t tableindex = address >> vtlb->pageshift; + vtlb_entry entry = vtlb->table[tableindex]; + offs_t taddress; + + if (PRINTF_TLB) + printf("vtlb_fill: %08X(%X) ... ", address, intention); + + /* should not be called here if the entry is in the table already */ +// assert((entry & (1 << intention)) == 0); + + /* if we have no dynamic entries, we always fail */ + if (vtlb->dynamic == 0) + { + if (PRINTF_TLB) + printf("failed: no dynamic entries\n"); + return FALSE; + } + + /* ask the CPU core to translate for us */ + taddress = address; + if (!vtlb->cpudevice->translate(vtlb->space, intention, taddress)) + { + if (PRINTF_TLB) + printf("failed: no translation\n"); + return FALSE; + } + + /* if this is the first successful translation for this address, allocate a new entry */ + if ((entry & VTLB_FLAGS_MASK) == 0) + { + int liveindex = vtlb->dynindex++ % vtlb->dynamic; + + /* if an entry already exists at this index, free it */ + if (vtlb->live[liveindex] != 0) + vtlb->table[vtlb->live[liveindex] - 1] = 0; + + /* claim this new entry */ + vtlb->live[liveindex] = tableindex + 1; + + /* form a new blank entry */ + entry = (taddress >> vtlb->pageshift) << vtlb->pageshift; + entry |= VTLB_FLAG_VALID; + + if (PRINTF_TLB) + printf("success (%08X), new entry\n", taddress); + } + + /* otherwise, ensure that different intentions do not produce different addresses */ + else + { + assert((entry >> vtlb->pageshift) == (taddress >> vtlb->pageshift)); + assert(entry & VTLB_FLAG_VALID); + + if (PRINTF_TLB) + printf("success (%08X), existing entry\n", taddress); + } + + /* add the intention to the list of valid intentions and store */ + entry |= 1 << (intention & (TRANSLATE_TYPE_MASK | TRANSLATE_USER_MASK)); + vtlb->table[tableindex] = entry; + return TRUE; +} + + +/*------------------------------------------------- + vtlb_load - load a fixed VTLB entry +-------------------------------------------------*/ + +void vtlb_load(vtlb_state *vtlb, int entrynum, int numpages, offs_t address, vtlb_entry value) +{ + offs_t tableindex = address >> vtlb->pageshift; + int liveindex = vtlb->dynamic + entrynum; + int pagenum; + + /* must be in range */ + assert(entrynum >= 0 && entrynum < vtlb->fixed); + + if (PRINTF_TLB) + printf("vtlb_load %d for %d pages at %08X == %08X\n", entrynum, numpages, address, value); + + /* if an entry already exists at this index, free it */ + if (vtlb->live[liveindex] != 0) + { + int pagecount = vtlb->fixedpages[entrynum]; + int oldtableindex = vtlb->live[liveindex] - 1; + for (pagenum = 0; pagenum < pagecount; pagenum++) + vtlb->table[oldtableindex + pagenum] = 0; + } + + /* claim this new entry */ + vtlb->live[liveindex] = tableindex + 1; + + /* store the raw value, making sure the "fixed" flag is set */ + value |= VTLB_FLAG_FIXED; + vtlb->fixedpages[entrynum] = numpages; + for (pagenum = 0; pagenum < numpages; pagenum++) + vtlb->table[tableindex + pagenum] = value + (pagenum << vtlb->pageshift); +} + +/*------------------------------------------------- + vtlb_dynload - load a dynamic VTLB entry +-------------------------------------------------*/ + +void vtlb_dynload(vtlb_state *vtlb, UINT32 index, offs_t address, vtlb_entry value) +{ + vtlb_entry entry = vtlb->table[index]; + + if (vtlb->dynamic == 0) + { + if (PRINTF_TLB) + printf("failed: no dynamic entries\n"); + return; + } + + int liveindex = vtlb->dynindex++ % vtlb->dynamic; + /* is entry already live? */ + if (!(entry & VTLB_FLAG_VALID)) + { + /* if an entry already exists at this index, free it */ + if (vtlb->live[liveindex] != 0) + vtlb->table[vtlb->live[liveindex] - 1] = 0; + + /* claim this new entry */ + vtlb->live[liveindex] = index + 1; + } + /* form a new blank entry */ + entry = (address >> vtlb->pageshift) << vtlb->pageshift; + entry |= VTLB_FLAG_VALID | value; + + if (PRINTF_TLB) + printf("success (%08X), new entry\n", address); + + vtlb->table[index] = entry; +} + +/*************************************************************************** + FLUSHING +***************************************************************************/ + +/*------------------------------------------------- + vtlb_flush_dynamic - flush all knowledge + from the dynamic part of the VTLB +-------------------------------------------------*/ + +void vtlb_flush_dynamic(vtlb_state *vtlb) +{ + int liveindex; + + if (PRINTF_TLB) + printf("vtlb_flush_dynamic\n"); + + /* loop over live entries and release them from the table */ + for (liveindex = 0; liveindex < vtlb->dynamic; liveindex++) + if (vtlb->live[liveindex] != 0) + { + offs_t tableindex = vtlb->live[liveindex] - 1; + vtlb->table[tableindex] = 0; + vtlb->live[liveindex] = 0; + } +} + + +/*------------------------------------------------- + vtlb_flush_address - flush knowledge of a + particular address from the VTLB +-------------------------------------------------*/ + +void vtlb_flush_address(vtlb_state *vtlb, offs_t address) +{ + offs_t tableindex = address >> vtlb->pageshift; + + if (PRINTF_TLB) + printf("vtlb_flush_address %08X\n", address); + + /* free the entry in the table; for speed, we leave the entry in the live array */ + vtlb->table[tableindex] = 0; +} + + + +/*************************************************************************** + ACCESSORS +***************************************************************************/ + +/*------------------------------------------------- + vtlb_table - return a pointer to the base of + the linear VTLB lookup table +-------------------------------------------------*/ + +const vtlb_entry *vtlb_table(vtlb_state *vtlb) +{ + return &vtlb->table[0]; +} diff --git a/src/devices/cpu/vtlb.h b/src/devices/cpu/vtlb.h new file mode 100644 index 00000000000..f63a0ac50f6 --- /dev/null +++ b/src/devices/cpu/vtlb.h @@ -0,0 +1,88 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + vtlb.h + + Generic virtual TLB implementation. + +***************************************************************************/ + +#pragma once + +#ifndef __VTLB_H__ +#define __VTLB_H__ + + + +/*************************************************************************** + CONSTANTS +***************************************************************************/ + +#define VTLB_FLAGS_MASK 0xff + +#define VTLB_READ_ALLOWED 0x01 /* (1 << TRANSLATE_READ) */ +#define VTLB_WRITE_ALLOWED 0x02 /* (1 << TRANSLATE_WRITE) */ +#define VTLB_FETCH_ALLOWED 0x04 /* (1 << TRANSLATE_FETCH) */ +#define VTLB_FLAG_VALID 0x08 +#define VTLB_USER_READ_ALLOWED 0x10 /* (1 << TRANSLATE_READ_USER) */ +#define VTLB_USER_WRITE_ALLOWED 0x20 /* (1 << TRANSLATE_WRITE_USER) */ +#define VTLB_USER_FETCH_ALLOWED 0x40 /* (1 << TRANSLATE_FETCH_USER) */ +#define VTLB_FLAG_FIXED 0x80 + + + +/*************************************************************************** + TYPE DEFINITIONS +***************************************************************************/ + +/* represents an entry in the VTLB */ +typedef UINT32 vtlb_entry; + + +/* opaque structure describing VTLB state */ +struct vtlb_state; + + + +/*************************************************************************** + FUNCTION PROTOTYPES +***************************************************************************/ + + +/* ----- initialization/teardown ----- */ + +/* allocate a new VTLB for the given CPU */ +vtlb_state *vtlb_alloc(device_t *cpu, address_spacenum space, int fixed_entries, int dynamic_entries); + +/* free an allocated VTLB */ +void vtlb_free(vtlb_state *vtlb); + + +/* ----- filling ----- */ + +/* called by the CPU core in response to an unmapped access */ +int vtlb_fill(vtlb_state *vtlb, offs_t address, int intention); + +/* load a fixed VTLB entry */ +void vtlb_load(vtlb_state *vtlb, int entrynum, int numpages, offs_t address, vtlb_entry value); + +/* load a dynamic VTLB entry */ +void vtlb_dynload(vtlb_state *vtlb, UINT32 index, offs_t address, vtlb_entry value); + +/* ----- flushing ----- */ + +/* flush all knowledge from the dynamic part of the VTLB */ +void vtlb_flush_dynamic(vtlb_state *vtlb); + +/* flush knowledge of a particular address from the VTLB */ +void vtlb_flush_address(vtlb_state *vtlb, offs_t address); + + +/* ----- accessors ----- */ + +/* return a pointer to the base of the linear VTLB lookup table */ +const vtlb_entry *vtlb_table(vtlb_state *vtlb); + + +#endif /* __VTLB_H__ */ diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp index e798a1153b2..345ea4334bf 100644 --- a/src/devices/cpu/z80/z80.cpp +++ b/src/devices/cpu/z80/z80.cpp @@ -10,7 +10,6 @@ * - 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 @@ -3125,27 +3124,6 @@ OP(op,fe) { cp(arg()); OP(op,ff) { rst(0x38); } /* RST 7 */ -void z80_device::take_nmi() -{ - /* there isn't a valid previous program counter */ - PRVPC = -1; - - /* Check if processor was halted */ - leave_halt(); - -#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; -} - void z80_device::take_interrupt() { int irq_vector; @@ -3228,11 +3206,6 @@ void z80_device::take_interrupt() m_icount -= 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 nsc800_device::take_interrupt_nsc800() @@ -3266,11 +3239,6 @@ void nsc800_device::take_interrupt_nsc800() m_icount -= m_cc_op[0xff] + 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 } /**************************************************************************** @@ -3506,25 +3474,44 @@ void nsc800_device::device_reset() } /**************************************************************************** - * Execute 'cycles' T-states. + * Execute 'cycles' T-states. Return number of T-states really executed ****************************************************************************/ void z80_device::execute_run() { + /* check for NMIs on the way in; they can only be set externally */ + /* via timers, and can't be dynamically enabled, so it is safe */ + /* to just check here */ + if (m_nmi_pending) + { + LOG(("Z80 '%s' take NMI\n", tag())); + PRVPC = -1; /* there isn't a valid previous program counter */ + leave_halt(); /* Check if processor was halted */ + +#if HAS_LDAIR_QUIRK + /* reset parity flag after LD A,I or LD A,R */ + if (m_after_ldair) F &= ~PF; +#endif + m_after_ldair = FALSE; + + m_iff1 = 0; + push(m_pc); + PCD = 0x0066; + WZ=PCD; + m_icount -= 11; + m_nmi_pending = FALSE; + } + do { - if (m_wait_state) + /* check for IRQs before each instruction */ + if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) { - // stalled - m_icount = 0; - return; - } - - // check for interrupts before each instruction - if (m_nmi_pending) - take_nmi(); - else if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) +#if HAS_LDAIR_QUIRK + /* reset parity flag after LD A,I or LD A,R */ + if (m_after_ldair) F &= ~PF; +#endif take_interrupt(); - + } m_after_ei = FALSE; m_after_ldair = FALSE; @@ -3537,25 +3524,34 @@ void z80_device::execute_run() void nsc800_device::execute_run() { - do + /* check for NMIs on the way in; they can only be set externally */ + /* via timers, and can't be dynamically enabled, so it is safe */ + /* to just check here */ + if (m_nmi_pending) { - if (m_wait_state) - { - // stalled - m_icount = 0; - return; - } + LOG(("Z80 '%s' take NMI\n", tag())); + PRVPC = -1; /* there isn't a valid previous program counter */ + leave_halt(); /* Check if processor was halted */ + + m_iff1 = 0; + push(m_pc); + PCD = 0x0066; + WZ=PCD; + m_icount -= 11; + m_nmi_pending = FALSE; + } - // check for interrupts before each instruction - if (m_nmi_pending) - take_nmi(); - else if ((m_nsc800_irq_state[NSC800_RSTA] != CLEAR_LINE || m_nsc800_irq_state[NSC800_RSTB] != CLEAR_LINE || m_nsc800_irq_state[NSC800_RSTC] != CLEAR_LINE) && m_iff1 && !m_after_ei) + do + { + /* check for NSC800 IRQs line RSTA, RSTB, RSTC */ + if ((m_nsc800_irq_state[NSC800_RSTA] != CLEAR_LINE || m_nsc800_irq_state[NSC800_RSTB] != CLEAR_LINE || m_nsc800_irq_state[NSC800_RSTC] != CLEAR_LINE) && m_iff1 && !m_after_ei) take_interrupt_nsc800(); - else if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) + + /* check for IRQs before each instruction */ + if (m_irq_state != CLEAR_LINE && m_iff1 && !m_after_ei) take_interrupt(); m_after_ei = FALSE; - m_after_ldair = FALSE; PRVPC = PCD; debugger_instruction_hook(this, PCD); @@ -3591,9 +3587,6 @@ void z80_device::execute_set_input(int inputnum, int state) case Z80_INPUT_LINE_WAIT: m_wait_state = state; break; - - default: - break; } } @@ -3601,6 +3594,17 @@ void nsc800_device::execute_set_input(int inputnum, int state) { switch (inputnum) { + case Z80_INPUT_LINE_BUSRQ: + m_busrq_state = state; + break; + + case INPUT_LINE_NMI: + /* mark an NMI pending on the rising edge */ + if (m_nmi_state == CLEAR_LINE && state != CLEAR_LINE) + m_nmi_pending = TRUE; + m_nmi_state = state; + break; + case NSC800_RSTA: m_nsc800_irq_state[NSC800_RSTA] = state; break; @@ -3613,8 +3617,17 @@ void nsc800_device::execute_set_input(int inputnum, int state) m_nsc800_irq_state[NSC800_RSTC] = state; break; - default: - z80_device::execute_set_input(inputnum, state); + case INPUT_LINE_IRQ0: + /* update the IRQ state via the daisy chain */ + m_irq_state = state; + if (m_daisy.present()) + m_irq_state = m_daisy.update_irq_state(); + + /* the main execute loop will take the interrupt */ + break; + + case Z80_INPUT_LINE_WAIT: + m_wait_state = state; break; } } @@ -3737,3 +3750,10 @@ nsc800_device::nsc800_device(const machine_config &mconfig, const char *tag, dev } const device_type NSC800 = &device_creator<nsc800_device>; + + + +WRITE_LINE_MEMBER( z80_device::irq_line ) +{ + set_input_line( INPUT_LINE_IRQ0, state ); +} diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h index 38cc207347e..c523f101a24 100644 --- a/src/devices/cpu/z80/z80.h +++ b/src/devices/cpu/z80/z80.h @@ -19,7 +19,6 @@ enum NSC800_RSTB, NSC800_RSTC, Z80_INPUT_LINE_WAIT, - Z80_INPUT_LINE_BOGUSWAIT, /* WAIT pin implementation used to be nonexistent, please remove this when all drivers are updated with Z80_INPUT_LINE_WAIT */ Z80_INPUT_LINE_BUSRQ }; @@ -42,6 +41,8 @@ class z80_device : public cpu_device public: z80_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + DECLARE_WRITE_LINE_MEMBER( irq_line ); + void z80_set_cycle_tables(const UINT8 *op, const UINT8 *cb, const UINT8 *ed, const UINT8 *xy, const UINT8 *xycb, const UINT8 *ex); template<class _Object> static devcb_base &set_irqack_cb(device_t &device, _Object object) { return downcast<z80_device &>(device).m_irqack_cb.set_callback(object); } template<class _Object> static devcb_base &set_refresh_cb(device_t &device, _Object object) { return downcast<z80_device &>(device).m_refresh_cb.set_callback(object); } @@ -237,7 +238,6 @@ protected: void ei(); void take_interrupt(); - void take_nmi(); // address spaces const address_space_config m_program_config; diff --git a/src/devices/imagedev/floppy.cpp b/src/devices/imagedev/floppy.cpp index cb7e184f811..2d6eb4d5460 100644 --- a/src/devices/imagedev/floppy.cpp +++ b/src/devices/imagedev/floppy.cpp @@ -933,7 +933,7 @@ UINT32 floppy_image_device::get_variant() const ui_menu *floppy_image_device::get_selection_menu(running_machine &machine, render_container *container) { - return global_alloc_clear<ui_menu_control_floppy_image>(machine, container, this); + return auto_alloc_clear(machine, <ui_menu_control_floppy_image>(machine, container, this)); } ui_menu_control_floppy_image::ui_menu_control_floppy_image(running_machine &machine, render_container *container, device_image_interface *_image) : ui_menu_control_device_image(machine, container, _image) @@ -1010,7 +1010,7 @@ void ui_menu_control_floppy_image::hook_load(std::string filename, bool softlist can_in_place = false; } submenu_result = -1; - ui_menu::stack_push(global_alloc_clear<ui_menu_select_rw>(machine(), container, can_in_place, &submenu_result)); + ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_rw>(machine(), container, can_in_place, &submenu_result))); state = SELECT_RW; } @@ -1036,7 +1036,7 @@ void ui_menu_control_floppy_image::handle() format_array[total_usable++] = i; } submenu_result = -1; - ui_menu::stack_push(global_alloc_clear<ui_menu_select_format>(machine(), container, format_array, ext_match, total_usable, &submenu_result)); + ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_select_format>(machine(), container, format_array, ext_match, total_usable, &submenu_result))); state = SELECT_FORMAT; break; @@ -1073,7 +1073,7 @@ void ui_menu_control_floppy_image::handle() break; case ui_menu_select_rw::WRITE_OTHER: - ui_menu::stack_push(global_alloc_clear<ui_menu_file_create>(machine(), container, image, current_directory, current_file, &create_ok)); + ui_menu::stack_push(auto_alloc_clear(machine(), <ui_menu_file_create>(machine(), container, image, current_directory, current_file, &create_ok))); state = CHECK_CREATE; break; diff --git a/src/devices/machine/com8116.cpp b/src/devices/machine/com8116.cpp index f5c177fef62..46a0ce83986 100644 --- a/src/devices/machine/com8116.cpp +++ b/src/devices/machine/com8116.cpp @@ -25,59 +25,17 @@ // device type definition const device_type COM8116 = &device_creator<com8116_device>; -// Parts with T after the number do not have an internal oscillator and require an external clock source -// The SMC/COM 5xxx parts are all dual 5v/12v parts, while the 8xxx parts are 5v only -// SMC/COM5016(T) with no dash, aka 'STD' part on the datasheet -// Also COM8116(T)/8126(T)/8136(T)/8146(T) and Synertek sy2661-3 and GI AY-5-8116(T)-000 and GI AY-5-8136(T)-000 and WD WD-1943-00 (aka WD8136-00) -// SMC/COM8156(T) is the same chip but clocked twice as fast and 32x clocks per baud instead of 16x -// baud rates are 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200 const int com8116_device::divisors_16X_5_0688MHz[] = { 6336, 4224, 2880, 2355, 2112, 1056, 528, 264, 176, 158, 132, 88, 66, 44, 33, 16 }; -// SMC/COM8116-003 -// from http://www.vintagecomputer.net/fjkraan/comp/divcomp/doc/SMC_BaudGen.pdf page 283 (pdf page 20) -// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 9600, 19200 -const int com8116_device::divisors_16X_6_01835MHz[] = - { 7523, 5015, 3420, 2797, 2508, 1881, 1254, 627, 313, 209, 188, 157, 104, 78, 39, 20 }; - -// SMC/COM5016(T)-5 and WD WD-1943-05; Synertek SY2661-1 and 2 are NOT the same as this despite using same clock speed, see below -// SMC/COM8156(T)-5 is the same chip but clocked twice as fast and 32x clocks per baud instead of 16x -// baud rates are 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200 const int com8116_device::divisors_16X_4_9152MHz[] = { 6144, 4096, 2793, 2284, 2048, 1024, 512, 256, 171, 154, 128, 85, 64, 43, 32, 16 }; -// SMC/COM5016(T)-6 and WD WD-1943-06 -// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600, 19200 const int com8116_device::divisors_32X_5_0688MHz[] = { 3168, 2112, 1440, 1177, 1056, 792, 528, 264, 132, 88, 66, 44, 33, 22, 16, 8 }; -// SMC/COM5016(T)-013 (from http://bitsavers.informatik.uni-stuttgart.de/pdf/dec/terminal/vt100/EK-VT100-TM-003_VT100_Technical_Manual_Jul82.pdf page 4-27 (pdf page 78)) -// and from http://www.vintagecomputer.net/fjkraan/comp/divcomp/doc/SMC_BaudGen.pdf page 283 (pdf page 20) -// SMC/COM5106-013A is the same chip clocked twice as fast, but with 32x clocks per baud instead of 16x -// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 9600, 19200 -const int com8116_device::divisors_16X_2_7648MHz[] = - { 3456, 2304, 1571, 1285, 1152, 864, 576, 288, 144, 96, 86, 72, 48, 36, 18, 9 }; - -// SMC/COM5026(T)-030 (non-standard serial rates, from http://bitsavers.informatik.uni-stuttgart.de/pdf/standardMicrosystems/_dataBooks/1979_StandardMicrosystems.pdf page 135) -const int com8116_device::divisors_16X_5_0688MHz_030[] = - { 731, 733, 735, 737, 741, 743, 745, 751, 6970, 5569, 5433, 4752, 4269, 1920, 1584, 301 }; - -// SMC/COM5036(T)-080 (from http://bitsavers.informatik.uni-stuttgart.de/pdf/standardMicrosystems/_dataBooks/1979_StandardMicrosystems.pdf page 135) -const int com8116_device::divisors_16X_4_6080MHz[] = - { 5760, 3840, 2618, 2141, 1920, 960, 480, 240, 160, 144, 120, 80, 60, 40, 30, 15 }; - -// COM8046 combines the -6 and STD tables into one device as a 32-entry table - -// Synertek SY2661-1 (from http://bitsavers.informatik.uni-stuttgart.de/pdf/synertek/_dataBooks/Synertek_1981-1982_Data_Catalog.pdf page 3-40 (pdf page 139)) -// baud rates are 50, 75, 110, 134.5, 150, 200, 300, 600, 1050, 1200, 1800, 2000, 2400, 4800, 9600, 19200 -const int com8116_device::divisors_16X_4_9152MHz_SY2661_1[] = - { 6144, 4096, 2793, 2284, 2048, 1536, 1024, 512, 292, 256, 171, 154, 128, 64, 32, 16 }; -// Synertek SY2661-2 (from http://bitsavers.informatik.uni-stuttgart.de/pdf/synertek/_dataBooks/Synertek_1981-1982_Data_Catalog.pdf page 3-40 (pdf page 139)) -// baud rates are 45.5, 50, 75, 110, 134.5, 150, 300, 600, 1200, 1800, 2000, 2400, 4800, 9600, 19200, 38400 -const int com8116_device::divisors_16X_4_9152MHz_SY2661_2[] = - { 6752, 6144, 4096, 2793, 2284, 2048, 1024, 512, 256, 171, 154, 128, 64, 32, 16, 8 }; //************************************************************************** // LIVE DEVICE diff --git a/src/devices/machine/com8116.h b/src/devices/machine/com8116.h index 614be491318..119f40d4b3d 100644 --- a/src/devices/machine/com8116.h +++ b/src/devices/machine/com8116.h @@ -63,14 +63,8 @@ public: DECLARE_WRITE8_MEMBER( stt_w ); static const int divisors_16X_5_0688MHz[]; - static const int divisors_16X_6_01835MHz[]; static const int divisors_16X_4_9152MHz[]; static const int divisors_32X_5_0688MHz[]; - static const int divisors_16X_2_7648MHz[]; - static const int divisors_16X_5_0688MHz_030[]; - static const int divisors_16X_4_6080MHz[]; - static const int divisors_16X_4_9152MHz_SY2661_1[]; - static const int divisors_16X_4_9152MHz_SY2661_2[]; protected: // device-level overrides diff --git a/src/devices/machine/corvushd.cpp b/src/devices/machine/corvushd.cpp index 08536344849..558851c0b7a 100644 --- a/src/devices/machine/corvushd.cpp +++ b/src/devices/machine/corvushd.cpp @@ -874,7 +874,7 @@ UINT8 corvus_hdc_t::corvus_read_firmware_block(UINT8 head, UINT8 sector) { // Status of command // UINT8 corvus_hdc_t::corvus_write_firmware_block(UINT8 head, UINT8 sector, UINT8 *buffer) { - UINT16 relative_sector; // Relative sector on drive for Physical Write + UINT16 relative_sector; // Relative sector on drive for Physical Read UINT8 status; relative_sector = head * m_sectors_per_track + sector; diff --git a/src/devices/machine/dmac.cpp b/src/devices/machine/dmac.cpp index ba1167eb2d5..34992fc4f5c 100644 --- a/src/devices/machine/dmac.cpp +++ b/src/devices/machine/dmac.cpp @@ -145,8 +145,6 @@ void dmac_device::check_interrupts() // any interrupts pending? if (m_istr & ISTR_INT_MASK) m_istr |= ISTR_INT_P; - else - m_istr &= ~ISTR_INT_P; } else m_istr &= ~ISTR_INT_P; @@ -204,19 +202,18 @@ READ16_MEMBER( dmac_device::register_read ) case 0x48: case 0x49: + case 0x50: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5e: + case 0x5f: data = m_scsi_read_handler(offset); if (VERBOSE) - logerror("%s('%s'): read scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); - - break; - - case 0x50: - case 0x51: - case 0x52: - case 0x53: - if (VERBOSE) - logerror("%s('%s'): read xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + logerror("%s('%s'): read scsi data @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); break; @@ -309,20 +306,20 @@ WRITE16_MEMBER( dmac_device::register_write ) case 0x48: case 0x49: + case 0x50: + case 0x58: + case 0x59: + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5e: + case 0x5f: if (VERBOSE) - logerror("%s('%s'): write scsi register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); + logerror("%s('%s'): write scsi data @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); m_scsi_write_handler(offset, data, 0xff); break; - case 0x50: - case 0x51: - case 0x52: - case 0x53: - if (VERBOSE) - logerror("%s('%s'): write xt register @ %02x %04x [mask = %04x]\n", shortname(), basetag(), offset, data, mem_mask); - break; - case 0x70: if (VERBOSE) logerror("%s('%s'): write dma start strobe %04x [mask = %04x]\n", shortname(), basetag(), data, mem_mask); diff --git a/src/devices/machine/dmac.h b/src/devices/machine/dmac.h index 8580b4c86ab..2d86c427013 100644 --- a/src/devices/machine/dmac.h +++ b/src/devices/machine/dmac.h @@ -128,7 +128,7 @@ private: ISTR_FE_FLG = 0x001 // fifo-empty flag }; - static const int ISTR_INT_MASK = 0x1ec; + static const int ISTR_INT_MASK = 0x1fc; // callbacks devcb_write_line m_cfgout_handler; diff --git a/src/devices/machine/hp_taco.cpp b/src/devices/machine/hp_taco.cpp deleted file mode 100644 index 76203d31ee3..00000000000 --- a/src/devices/machine/hp_taco.cpp +++ /dev/null @@ -1,1467 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:F. Ulivi -/********************************************************************* - - hp_taco.cpp - - HP TApe COntroller (5006-3012) - -*********************************************************************/ - -// This device has been reverse engineered entirely through documents & study of HP software. -// I had no access to the real device to experiment. -// Available documentation on the internal working of TACO chip is close to nothing. The best -// I could find is [1] (see below) where all that's described is a (too) brief summary of registers and little else. -// In other words, no description of the commands that can be issued to TACO chips. -// So, my main source of information was the careful study of HP software, especially the 9845 system test ROM (09845-66520). -// The second half of this ROM holds a comprehensive set of tape drive tests. -// The main shortcomings of my approach are: -// * I could indentify only those TACO commands that are actually used by the software. I managed -// to identify 17 out of 32 possible commands. The purpose of the rest of commands is anyone's guess. -// * I could only guess the behavior of TACO chips in corner cases (especially behavior in various error/abnormal -// conditions) -// -// Documentation I used: -// [1] HP, manual 64940-90905, may 80 rev. - Model 64940A tape control & drive service manual -// [2] US patent 4,075,679 describing HP9825 system (this system had a discrete implementation of tape controller). The -// firmware listing was quite useful in identifying sequences of commands (for example how to find a specific sector etc.). -// [3] http://www.hp9845.net site -// [4] April 1978 issue of HP Journal. There is a one-page summary of TACO chip on page 20. - -// This is an overview of the TACO/CPU interface. -// -// Reg. | R/W | Content -// ===================== -// R4 | R/W | Data register: words read/written to/from tape pass through this register -// R5 | R/W | Command and status register (see below) -// R6 | R/W | Tachometer register. Writing it sets a pulse counter that counts up on either tachometer pulses or IRGs, depending -// | | on command. When the counter rolls over from 0xffff to 0 it typically ends the command. It's not clear to me -// | | what value could be read from this register, if it's just the same value that was written last time or the internal -// | | counter or something else entirely. -// R7 | R | Checksum register. Reading it clears it. -// R7 | W | Timing register. It controls somehow the encoding and decoding of bits. For now I completely ignore it because its -// | | content it's totally unknown to me. It seems safe to do so, anyway. I can see that it's always set to 0x661d before -// | | writing to tape and to 0x0635 before reading. -// -// Format of TACO command/status register (R5) -// Bit R/W Content -// =============== -// 15 RW Tape direction (1 = forward) -// 14..10 RW Command (see the "enum" below) -// 9 RW ? Drive ON according to [1], the actual use seems to be selection of gap length -// 8 RW ? Size of gaps according to [1], N/U in my opinion -// 7 RW Speed of tape (1 = 90 ips, 0 = 22 ips) -// 6 RW Option bit for various commands -// 5 R Current track (1 = B) -// 4 R Gap detected (1) -// 3 R Write protection (1) -// 2 R Servo failure (1) -// 1 R Cartridge out (1) -// 0 R Hole detected (1) - -// Here's a summary of the on-tape format of HP9845 systems. -// * A tape has two independent tracks (A & B). -// * Each track holds 426 sectors. -// * Each sector has an header and 256 bytes of payload (see below) -// * Sectors are separated by gaps of uniform magnetization called IRGs (Inter-Record Gaps) -// * The basic unit of data I/O are 16-bit words -// * Bits are encoded by different distances between magnetic flux reversals -// * The structure of tracks is: -// - Begin of tape holes -// - The deadzone: 350x 0xffff words -// - 1" of IRG -// - Sector #0 (track A) or #426 (track B) -// - 1" of IRG (2.5" on track A) -// - Sector #1 (track A) or #427 (track B) -// - 1" of IRG -// - Sector #2 (track A) or #428 (track B) -// - ...and so on up to sector #425/#851 -// - 6" of final gap -// - Non-recorded tape -// - End of tape holes -// * Sector #0 is not used -// * Sectors #1 and #2 hold the first copy of tape directory -// * Sectors #3 and #4 hold the second/backup copy of tape directory -// * User data are stored starting from sector #5 -// * There is no "fragmentation" map (like file allocation table in FAT filesystem): a file -// spanning more than 1 sector always occupy a single block of contiguous sectors. -// -// A sector is structured like this: -// Word 0: Invisible preamble word (always 0). Preamble comes from 9825, don't know if it's -// actually there in TACO encoding. I assumed it is. -// Word 1: Format/sector in use and other unidentified bits. -// Word 2: Sector number -// Word 3: Sector length and other bits -// Word 4: Checksum (sum of words 1..3) -// Words 5..132: Payload -// Word 133: Checksum (sum of words 5..132) -// -// Physical encoding of words is borrowed from 9825 as I wasn't able -// to gather any info on the actual encoding of TACO chips. -// This is how 9825 encodes words on tape: -// - the unit of encoding are 16-bit words -// - each word is encoded from MSB to LSB -// - each word has an extra invisible "1" encoded at the end -// - tape is read/written at slow speed only (21.98 ips) -// - a 0 is encoded with a distance between flux reversals of 1/35200 s -// (giving a maximum density of about 1600 reversals per inch) -// - a 1 is encoded with a distance that's 1.75 times that of a 0 -// -// This driver is based on the following model of the actual TACO/tape system: -// * Tape immediately reaches working speed (no spin-up time) -// * Inversion of tape direction and change of speed are immediate as well -// * Time & distance to stop the tape are modeled, though. Firmware is upset by -// a tape with null braking time/distance. -// * Speed of tape is exceptionally accurate. Real tape was controlled by a closed loop -// with something like 1% accuracy on speed. -// * Storage is modeled by one "map" data structure per track. Each map maps the tape position -// to the 16-bit word stored at that position. Gaps are modeled by lack of data in the map. -// There is no model of the physical encoding of bits (except to compute how long each word -// is on tape). -// * Read threshold is ignored. Real tapes could be read with either a low or high threshold. -// * "Flag" bit is used as a busy/ready signal in real TACO. Here I assumed the device is -// always ready, so Flag is always active. -// * I tried to fill the (many) gaps on chip behavior with "sensible" solutions. I could only -// validate my solutions by running the original firmware in MAME, though (no real hw at hand). -// -// TODOs/issues: -// * Some code cleanup -// * Handling of tape holes seems to be wrong: test "C" of test ROM only works partially -// * Find out what is read from register R6 -// * Handle device_image_interface::call_display to show state of tape -// * Find more info on TACO chips (does anyone with a working 9845 or access to internal HP docs want to -// help me here, please?) -// -#include "emu.h" -#include "hp_taco.h" - -// Debugging -#define VERBOSE 1 -#define LOG(x) do { if (VERBOSE) logerror x; } while (0) -#define VERBOSE_0 0 -#define LOG_0(x) do { if (VERBOSE_0) logerror x; } while (0) - -// Macros to clear/set single bits -#define BIT_MASK(n) (1U << (n)) -#define BIT_CLR(w , n) ((w) &= ~BIT_MASK(n)) -#define BIT_SET(w , n) ((w) |= BIT_MASK(n)) - -// Timers -enum { - TAPE_TMR_ID, - HOLE_TMR_ID -}; - -// Constants -#define CMD_REG_MASK 0xffc0 // Command register mask -#define STATUS_REG_MASK 0x003f // Status register mask -#define TACH_TICKS_PER_INCH 968 // Tachometer pulses per inch of tape movement -#define TAPE_POS_FRACT 1024 // 10 bits of fractional part in tape_pos_t -#define ONE_INCH_POS (TACH_TICKS_PER_INCH * TAPE_POS_FRACT) // Value in tape_pos_t representing 1 inch of tape -#define TACH_FREQ_SLOW 21276 // Tachometer pulse frequency for slow speed (21.98 ips) -#define TACH_FREQ_FAST 87196 // Tachometer pulse frequency for fast speed (90.08 ips) -#define TAPE_LENGTH ((140 * 12 + 72 * 2) * ONE_INCH_POS) // Tape length: 140 ft of usable tape + 72" of punched tape at either end -#define TAPE_INIT_POS (80 * ONE_INCH_POS) // Initial tape position: 80" from beginning (just past the punched part) -#define ZERO_BIT_LEN 619 // Length of 0 bits at slow tape speed: 1/(35200 Hz) -#define ONE_BIT_LEN 1083 // Length of 1 bits at slow tape speed: 1.75 times ZERO_BIT_LEN -#define QUICK_CMD_USEC 25 // usec for "quick" command execution -#define FAST_BRAKE_MSEC 73 // Braking time from fast speed to stop (2 ips) in msec (deceleration is 1200 in/s^2) -#define SLOW_BRAKE_MSEC 17 // Braking time from slow speed to stop in msec -#define FAST_BRAKE_DIST 3350450 // Braking distance at fast speed (~3.38 in) -#define SLOW_BRAKE_DIST 197883 // Braking distance at slow speed (~0.2 in) -#define PREAMBLE_WORD 0 // Value of preamble word -#define END_GAP_LENGTH (6 * ONE_INCH_POS) // Length of final gap: 6" -#define MIN_IRG_LENGTH ((tape_pos_t)(0.2 * ONE_INCH_POS)) // Minimum length of IRGs: 0.2" (from 9825, not sure about value in TACO) -#define NULL_TAPE_POS ((tape_pos_t)-1) // Special value for invalid/unknown tape position -#define NO_DATA_GAP (17 * ONE_BIT_LEN) // Minimum gap size to detect end of data: length of longest word (0xffff) -#define FILE_MAGIC 0x4f434154 // Magic value at start of image file: "TACO" - -// Parts of command register -#define CMD_CODE(reg) \ - (((reg) >> 10) & 0x1f) -#define DIR_FWD(reg) \ - (BIT(reg , 15)) -#define SPEED_FAST(reg) \ - (BIT(reg , 7)) -#define CMD_OPT(reg) \ - (BIT(reg , 6)) -#define UNKNOWN_B9(reg) \ - (BIT(reg , 9)) -#define DIR_FWD_MASK BIT_MASK(15) // Direction = forward -#define SPEED_FAST_MASK BIT_MASK(7) // Speed = fast - -// Commands -enum { - CMD_INDTA_INGAP, // 00: scan for data first then for gap - CMD_UNK_01, // 01: unknown - CMD_FINAL_GAP, // 02: write final gap - CMD_INIT_WRITE, // 03: write words for tape formatting - CMD_STOP, // 04: stop - CMD_UNK_05, // 05: unknown - CMD_SET_TRACK, // 06: set A/B track - CMD_UNK_07, // 07: unknown - CMD_UNK_08, // 08: unknown - CMD_UNK_09, // 09: unknown - CMD_MOVE, // 0a: move tape - CMD_UNK_0b, // 0b: unknown - CMD_INGAP_MOVE, // 0c: scan for gap then move a bit further (used to gain some margin when inverting tape movement) - CMD_UNK_0d, // 0d: unknown - CMD_CLEAR, // 0e: clear errors/unlatch status bits - CMD_UNK_0f, // 0f: unknown - CMD_NOT_INDTA, // 10: scan for end of data - CMD_UNK_11, // 11: unknown - CMD_UNK_12, // 12: unknown - CMD_UNK_13, // 13: unknown - CMD_UNK_14, // 14: unknown - CMD_UNK_15, // 15: unknown - CMD_WRITE_IRG, // 16: write inter-record gap - CMD_UNK_17, // 17: unknown - CMD_SCAN_RECORDS, // 18: scan records (count IRGs) - CMD_RECORD_WRITE, // 19: write record words - CMD_MOVE_INDTA, // 1a: move then scan for data - CMD_UNK_1b, // 1b: unknown (for now it seems harmless to handle it as NOP) - CMD_DELTA_MOVE_HOLE, // 1c: move tape a given distance, intr at end or first hole found (whichever comes first) - CMD_START_READ, // 1d: start record reading - CMD_DELTA_MOVE_IRG, // 1e: move tape a given distance, detect gaps in parallel - CMD_END_READ // 1f: stop reading -}; - -// Bits of status register -#define STATUS_HOLE_BIT 0 // Hole detected -#define STATUS_CART_OUT_BIT 1 // Cartridge out -#define STATUS_SFAIL_BIT 2 // Servo failure -#define STATUS_WPR_BIT 3 // Write protection -#define STATUS_GAP_BIT 4 // Gap detected -#define STATUS_TRACKB_BIT 5 // Track B selected -#define STATUS_CART_OUT_MASK BIT_MASK(STATUS_CART_OUT_BIT) // Cartridge out -#define STATUS_WPR_MASK BIT_MASK(STATUS_WPR_BIT) // Write protection -#define STATUS_ERR_MASK (STATUS_CART_OUT_MASK) // Mask of errors in status reg. - -// *** Position of tape holes *** -// At beginning of tape: -// *START* -// |<-----24"----->|<---12"--->|<---12"--->|<-----24"----->| -// O O O O O O O -// |<->| |<->| |<->| -// 0.218" 0.218" 0.218" -// At end of tape: -// *END* -// |<-----24"----->|<---12"--->|<---12"--->|<-----24"----->| -// O O O O -// -static const hp_taco_device::tape_pos_t tape_holes[] = { - (hp_taco_device::tape_pos_t)(23.891 * ONE_INCH_POS), // 24 - 0.218 / 2 - (hp_taco_device::tape_pos_t)(24.109 * ONE_INCH_POS), // 24 + 0.218 / 2 - (hp_taco_device::tape_pos_t)(35.891 * ONE_INCH_POS), // 36 - 0.218 / 2 - (hp_taco_device::tape_pos_t)(36.109 * ONE_INCH_POS), // 36 + 0.218 / 2 - (hp_taco_device::tape_pos_t)(47.891 * ONE_INCH_POS), // 48 - 0.218 / 2 - (hp_taco_device::tape_pos_t)(48.109 * ONE_INCH_POS), // 48 + 0.218 / 2 - 72 * ONE_INCH_POS, // 72 - 1752 * ONE_INCH_POS, // 1752 - 1776 * ONE_INCH_POS, // 1776 - 1788 * ONE_INCH_POS, // 1788 - 1800 * ONE_INCH_POS // 1800 -}; - -// Device type definition -const device_type HP_TACO = &device_creator<hp_taco_device>; - -// Constructors -hp_taco_device::hp_taco_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname) - : device_t(mconfig, type, name, tag, owner, clock, shortname, __FILE__), - device_image_interface(mconfig , *this), - m_irq_handler(*this), - m_flg_handler(*this), - m_sts_handler(*this), - m_tape_pos(TAPE_INIT_POS), - m_image_dirty(false) -{ - clear_state(); -} - -hp_taco_device::hp_taco_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, HP_TACO, "HP TACO", tag, owner, clock, "TACO", __FILE__), - device_image_interface(mconfig , *this), - m_irq_handler(*this), - m_flg_handler(*this), - m_sts_handler(*this), - m_tape_pos(TAPE_INIT_POS), - m_image_dirty(false) -{ - clear_state(); -} - -WRITE16_MEMBER(hp_taco_device::reg_w) -{ - LOG_0(("wr R%u = %04x\n", 4 + offset , data)); - - // Any I/O activity clears IRQ - irq_w(false); - - switch (offset) { - case 0: - // Data register - m_data_reg = data; - m_data_reg_full = true; - break; - - case 1: - // Command register - start_cmd_exec(data & CMD_REG_MASK); - break; - - case 2: - // Tachometer register - m_tach_reg = data; - break; - - case 3: - // Timing register - m_timing_reg = data; - break; - } -} - -READ16_MEMBER(hp_taco_device::reg_r) -{ - UINT16 res = 0; - - // Any I/O activity clears IRQ - irq_w(false); - - switch (offset) { - case 0: - // Data register - res = m_data_reg; - break; - - case 1: - // Command & status register - res = (m_cmd_reg & CMD_REG_MASK) | (m_status_reg & STATUS_REG_MASK); - break; - - case 2: - // Tachometer register - res = m_tach_reg; - break; - - case 3: - // Checksum register: it clears when read - res = m_checksum_reg; - m_checksum_reg = 0; - break; - } - - LOG_0(("rd R%u = %04x\n", 4 + offset , res)); - - return res; -} - -READ_LINE_MEMBER(hp_taco_device::flg_r) -{ - return m_flg; -} - -READ_LINE_MEMBER(hp_taco_device::sts_r) -{ - return m_sts; -} - -// device_config_complete -void hp_taco_device::device_config_complete() -{ - LOG(("device_config_complete")); - update_names(); -} - -// device_start -void hp_taco_device::device_start() -{ - LOG(("device_start")); - m_irq_handler.resolve_safe(); - m_flg_handler.resolve_safe(); - m_sts_handler.resolve_safe(); - - save_item(NAME(m_data_reg)); - save_item(NAME(m_data_reg_full)); - save_item(NAME(m_cmd_reg)); - save_item(NAME(m_cmd_state)); - save_item(NAME(m_status_reg)); - save_item(NAME(m_tach_reg)); - save_item(NAME(m_checksum_reg)); - save_item(NAME(m_timing_reg)); - save_item(NAME(m_irq)); - save_item(NAME(m_flg)); - save_item(NAME(m_sts)); - save_item(NAME(m_tape_pos)); - save_item(NAME(m_start_time)); - save_item(NAME(m_tape_fwd)); - save_item(NAME(m_tape_fast)); - save_item(NAME(m_image_dirty)); - save_item(NAME(m_tape_wr)); - save_item(NAME(m_rw_pos)); - save_item(NAME(m_next_word)); - save_item(NAME(m_rd_it_valid)); - save_item(NAME(m_gap_detect_start)); - - m_tape_timer = timer_alloc(TAPE_TMR_ID); - m_hole_timer = timer_alloc(HOLE_TMR_ID); -} - -// device_stop -void hp_taco_device::device_stop() -{ -} - -// device_reset -void hp_taco_device::device_reset() -{ - LOG(("device_reset")); - clear_state(); - - m_irq = false; - m_flg = true; - - m_irq_handler(false); - m_flg_handler(true); - set_error(false); -} - -void hp_taco_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) -{ - if (CMD_CODE(m_cmd_reg) != CMD_STOP) { - update_tape_pos(); - } - - switch (id) { - case TAPE_TMR_ID: - LOG_0(("Tape tmr @%g\n" , machine().time().as_double())); - - tape_pos_t length; - - switch (CMD_CODE(m_cmd_reg)) { - case CMD_INDTA_INGAP: - if (m_cmd_state == 0) { - m_cmd_state = 1; - tape_pos_t target = m_tape_pos; - if (next_n_gap(target, 1, MIN_IRG_LENGTH)) { - m_tape_timer->adjust(time_to_target(target)); - } - return; - } - break; - - case CMD_RECORD_WRITE: - if (m_cmd_state == 0) { - if (m_rd_it->second == PREAMBLE_WORD) { - LOG_0(("Got preamble\n")); - m_cmd_state = 1; - // m_rw_pos already at correct position - m_tape_timer->adjust(fetch_next_wr_word()); - break; - } else { - adv_res_t res = adv_it(m_rd_it); - if (res != ADV_NO_MORE_DATA) { - m_tape_timer->adjust(time_to_rd_next_word(m_rw_pos)); - } - // No IRQ - return; - } - } - // Intentional fall-through - case CMD_INIT_WRITE: - write_word(m_rw_pos , m_next_word , length); - pos_offset(m_rw_pos , length); - // Just to be sure.. - m_tape_pos = m_rw_pos; - m_tape_timer->adjust(fetch_next_wr_word()); - break; - - case CMD_STOP: - move_tape_pos(m_tape_fast ? FAST_BRAKE_DIST : SLOW_BRAKE_DIST); - stop_tape(); - break; - - case CMD_INGAP_MOVE: - if (m_cmd_state == 0) { - m_cmd_state = 1; - m_tape_timer->adjust(time_to_tach_pulses()); - return; - } - break; - - case CMD_FINAL_GAP: - case CMD_WRITE_IRG: - write_gap(m_rw_pos , m_tape_pos); - m_hole_timer->reset(); - break; - - case CMD_SCAN_RECORDS: - if (m_cmd_state == 0) { - m_cmd_state = 1; - tape_pos_t target = m_tape_pos; - if (next_n_gap(target, 0x10000U - m_tach_reg, MIN_IRG_LENGTH)) { - LOG_0(("%u gaps @%d\n" , 0x10000U - m_tach_reg, target)); - m_tape_timer->adjust(time_to_target(target)); - } - return; - } else { - m_hole_timer->reset(); - } - break; - - case CMD_MOVE_INDTA: - if (m_cmd_state == 0) { - if (next_data(m_rd_it , m_tape_pos , true)) { - m_cmd_state = 1; - m_tape_timer->adjust(time_to_target(farthest_end(m_rd_it))); - } - // No IRQ - return; - } - // m_cmd_state == 1 -> IRQ & cmd end - break; - - case CMD_DELTA_MOVE_HOLE: - case CMD_DELTA_MOVE_IRG: - // Interrupt at end of movement - m_hole_timer->reset(); - break; - - case CMD_START_READ: - { - bool set_intr = true; - // Just to be sure.. - m_tape_pos = m_rw_pos; - if (m_cmd_state == 0) { - set_intr = false; - if (m_rd_it->second == PREAMBLE_WORD) { - m_cmd_state = 1; - } - LOG_0(("Got preamble\n")); - } else { - m_data_reg = m_rd_it->second; - m_checksum_reg += m_data_reg; - LOG_0(("RD %04x\n" , m_data_reg)); - } - adv_res_t res = adv_it(m_rd_it); - LOG_0(("adv_it %d\n" , res)); - if (res == ADV_NO_MORE_DATA) { - m_rd_it_valid = false; - } else { - if (res == ADV_DISCONT_DATA) { - // Hit a gap, restart preamble search - m_cmd_state = 0; - } - m_tape_timer->adjust(time_to_rd_next_word(m_rw_pos)); - } - if (!set_intr) { - return; - } - } - break; - - case CMD_END_READ: - { - m_tape_pos = m_rw_pos; - // Note: checksum is not updated - m_data_reg = m_rd_it->second; - LOG_0(("Final RD %04x\n" , m_data_reg)); - adv_res_t res = adv_it(m_rd_it); - if (res == ADV_NO_MORE_DATA) { - m_rd_it_valid = false; - } - m_hole_timer->reset(); - } - break; - - default: - // Other commands: just raise irq - break; - } - irq_w(true); - break; - - case HOLE_TMR_ID: - LOG_0(("Hole tmr @%g\n" , machine().time().as_double())); - - BIT_SET(m_status_reg , STATUS_HOLE_BIT); - - switch (CMD_CODE(m_cmd_reg)) { - case CMD_FINAL_GAP: - case CMD_WRITE_IRG: - write_gap(m_rw_pos , m_tape_pos); - m_rw_pos = m_tape_pos; - break; - - case CMD_SCAN_RECORDS: - case CMD_DELTA_MOVE_HOLE: - // Cmds 18 & 1c are terminated at first hole - m_tape_timer->reset(); - irq_w(true); - // No reloading of hole timer - return; - - case CMD_DELTA_MOVE_IRG: - // TODO: update r6 - m_hole_timer->adjust(time_to_next_hole()); - // No IRQ at holes - return; - - case CMD_START_READ: - case CMD_END_READ: - set_error(true); - break; - - default: - // Other cmds: default processing (update tape pos, set IRQ, schedule timer for next hole) - break; - } - - irq_w(true); - m_hole_timer->adjust(time_to_next_hole()); - break; - - default: - break; - } -} - -void hp_taco_device::clear_state(void) -{ - m_data_reg = 0; - m_data_reg_full = false; - m_cmd_reg = 0; - m_status_reg = 0; - m_tach_reg = 0; - m_checksum_reg = 0; - m_timing_reg = 0; - m_cmd_state = 0; - // m_tape_pos is not reset, tape stays where it is - m_start_time = attotime::never; - m_tape_fwd = false; - m_tape_fast = false; - // m_image_dirty is not touched - m_tape_wr = false; - m_rw_pos = 0; - m_next_word = 0; - m_rd_it_valid = false; - m_gap_detect_start = NULL_TAPE_POS; - - set_tape_present(false); - set_tape_present(is_loaded()); -} - -void hp_taco_device::irq_w(bool state) -{ - if (state != m_irq) { - m_irq = state; - m_irq_handler(state); - LOG_0(("IRQ = %d\n" , state)); - } -} - -void hp_taco_device::set_error(bool state) -{ - m_sts = !state; - m_sts_handler(m_sts); - LOG_0(("error = %d\n" , state)); -} - -unsigned hp_taco_device::speed_to_tick_freq(void) const -{ - return m_tape_fast ? TACH_FREQ_FAST * TAPE_POS_FRACT : TACH_FREQ_SLOW * TAPE_POS_FRACT; -} - -bool hp_taco_device::pos_offset(tape_pos_t& pos , tape_pos_t offset) const -{ - if (offset == 0) { - return true; - } - - if (!m_tape_fwd) { - offset = -offset; - } - - pos += offset; - - // In real life tape would unspool.. - if (pos > TAPE_LENGTH) { - pos = TAPE_LENGTH; - return false; - } else if (pos < 0) { - pos = 0; - return false; - } else { - return true; - } -} - -void hp_taco_device::move_tape_pos(tape_pos_t delta_pos) -{ - tape_pos_t tape_start_pos = m_tape_pos; - if (!pos_offset(m_tape_pos , delta_pos)) { - LOG(("Tape unspooled!\n")); - } - m_start_time = machine().time(); - LOG_0(("Tape pos = %u\n" , m_tape_pos)); - if (any_hole(tape_start_pos , m_tape_pos)) { - // Crossed one or more holes - BIT_SET(m_status_reg , STATUS_HOLE_BIT); - } -} - -void hp_taco_device::update_tape_pos(void) -{ - if (m_start_time.is_never()) { - // Tape not moving - return; - } - - attotime delta_time(machine().time() - m_start_time); - LOG_0(("delta_time = %g\n" , delta_time.as_double())); - // How many tachometer ticks has the tape moved? - tape_pos_t delta_tach = (tape_pos_t)(delta_time.as_ticks(speed_to_tick_freq())); - LOG_0(("delta_tach = %u\n" , delta_tach)); - - move_tape_pos(delta_tach); - - // Gap detection - bool gap_detected = false; - if (m_gap_detect_start != NULL_TAPE_POS && abs(m_gap_detect_start - m_tape_pos) >= MIN_IRG_LENGTH) { - tape_pos_t tmp = m_tape_pos; - pos_offset(tmp , -MIN_IRG_LENGTH); - gap_detected = just_gap(tmp , m_tape_pos); - } - if (gap_detected) { - BIT_SET(m_status_reg, STATUS_GAP_BIT); - } else { - BIT_CLR(m_status_reg, STATUS_GAP_BIT); - } -} - -void hp_taco_device::ensure_a_lt_b(tape_pos_t& a , tape_pos_t& b) -{ - if (a > b) { - // Ensure A always comes before B - tape_pos_t tmp; - tmp = a; - a = b; - b = tmp; - } -} - -// Is there any hole in a given section of tape? -bool hp_taco_device::any_hole(tape_pos_t tape_pos_a , tape_pos_t tape_pos_b) -{ - ensure_a_lt_b(tape_pos_a , tape_pos_b); - - for (tape_pos_t hole : tape_holes) { - if (tape_pos_a < hole && tape_pos_b >= hole) { - return true; - } - } - - return false; -} - -// Position of next hole tape will reach in a given direction -hp_taco_device::tape_pos_t hp_taco_device::next_hole(void) const -{ - if (m_tape_fwd) { - for (tape_pos_t hole : tape_holes) { - if (hole > m_tape_pos) { - LOG_0(("next hole fwd @%u = %u\n" , m_tape_pos , hole)); - return hole; - } - } - // No more holes: will hit end of tape - return TAPE_LENGTH; - } else { - for (int i = (sizeof(tape_holes) / sizeof(tape_holes[ 0 ])) - 1; i >= 0; i--) { - if (tape_holes[ i ] < m_tape_pos) { - LOG_0(("next hole rev @%u = %u\n" , m_tape_pos , tape_holes[ i ])); - return tape_holes[ i ]; - } - } - // No more holes: will hit start of tape - return 0; - } -} - -attotime hp_taco_device::time_to_distance(tape_pos_t distance) const -{ - // +1 for rounding - return attotime::from_ticks(distance + 1 , speed_to_tick_freq()); -} - -attotime hp_taco_device::time_to_target(tape_pos_t target) const -{ - return time_to_distance(abs(target - m_tape_pos)); -} - -bool hp_taco_device::start_tape_cmd(UINT16 cmd_reg , UINT16 must_be_1 , UINT16 must_be_0) -{ - m_cmd_reg = cmd_reg; - - UINT16 to_be_tested = (m_cmd_reg & CMD_REG_MASK) | (m_status_reg & STATUS_REG_MASK); - // Bits in STATUS_ERR_MASK must always be 0 - must_be_0 |= STATUS_ERR_MASK; - - // It's not an error if the error state is already set (sts false) - if (((to_be_tested & (must_be_1 | must_be_0)) ^ must_be_1) != 0) { - set_error(true); - return false; - } else { - bool prev_tape_wr = m_tape_wr; - bool prev_tape_fwd = m_tape_fwd; - bool prev_tape_fast = m_tape_fast; - bool not_moving = m_start_time.is_never(); - - m_start_time = machine().time(); - m_tape_wr = (must_be_0 & STATUS_WPR_MASK) != 0; - m_tape_fwd = DIR_FWD(m_cmd_reg); - m_tape_fast = SPEED_FAST(m_cmd_reg); - // TODO: remove? - BIT_CLR(m_status_reg, STATUS_HOLE_BIT); - - if (m_tape_wr) { - // Write command: disable gap detector - m_gap_detect_start = NULL_TAPE_POS; - BIT_CLR(m_status_reg, STATUS_GAP_BIT); - m_image_dirty = true; - } else if (not_moving || prev_tape_wr != m_tape_wr || prev_tape_fwd != m_tape_fwd || prev_tape_fast != m_tape_fast) { - // Tape started right now, switched from writing to reading, direction changed or speed changed: (re)start gap detector - m_gap_detect_start = m_tape_pos; - BIT_CLR(m_status_reg, STATUS_GAP_BIT); - } - return true; - } -} - -void hp_taco_device::stop_tape(void) -{ - m_start_time = attotime::never; - m_gap_detect_start = NULL_TAPE_POS; -} - -hp_taco_device::tape_track_t& hp_taco_device::current_track(void) -{ - return m_tracks[ BIT(m_status_reg , STATUS_TRACKB_BIT) ]; -} - -// Return physical length of a 16-bit word on tape -hp_taco_device::tape_pos_t hp_taco_device::word_length(tape_word_t w) -{ - unsigned zeros , ones; - - // pop count of w - ones = (w & 0x5555) + ((w >> 1) & 0x5555); - ones = (ones & 0x3333) + ((ones >> 2) & 0x3333); - ones = (ones & 0x0f0f) + ((ones >> 4) & 0x0f0f); - ones = (ones & 0x00ff) + ((ones >> 8) & 0x00ff); - - zeros = 16 - ones; - - return zeros * ZERO_BIT_LEN + (ones + 1) * ONE_BIT_LEN; -} - -hp_taco_device::tape_pos_t hp_taco_device::word_end_pos(const tape_track_t::iterator& it) -{ - return it->first + word_length(it->second); -} - -void hp_taco_device::adjust_it(tape_track_t& track , tape_track_t::iterator& it , tape_pos_t pos) -{ - if (it != track.begin()) { - it--; - if (word_end_pos(it) <= pos) { - it++; - } - } -} - -// Write a word on current tape track -void hp_taco_device::write_word(tape_pos_t start , tape_word_t word , tape_pos_t& length) -{ - tape_track_t& track = current_track(); - tape_track_t::iterator it_low = track.lower_bound(start); - adjust_it(track , it_low , start); - length = word_length(word); - tape_pos_t end_pos = start + length; - tape_track_t::iterator it_high = track.lower_bound(end_pos); - - track.erase(it_low , it_high); - - track.insert(it_high , std::make_pair(start, word)); - LOG_0(("WR %04x @ T%u:%u\n" , word , BIT(m_status_reg , STATUS_TRACKB_BIT) , start)); -} - -// Write a gap on current track -void hp_taco_device::write_gap(tape_pos_t a , tape_pos_t b) -{ - ensure_a_lt_b(a , b); - tape_track_t& track = current_track(); - tape_track_t::iterator it_low = track.lower_bound(a); - adjust_it(track , it_low , a); - tape_track_t::iterator it_high = track.lower_bound(b); - - track.erase(it_low, it_high); - - LOG_0(("GAP on T%u:[%u,%u)\n" , BIT(m_status_reg , STATUS_TRACKB_BIT) , a , b)); -} - -bool hp_taco_device::just_gap(tape_pos_t a , tape_pos_t b) -{ - ensure_a_lt_b(a , b); - tape_track_t& track = current_track(); - tape_track_t::iterator it_low = track.lower_bound(a); - tape_track_t::iterator it_high = track.lower_bound(b); - - adjust_it(track, it_low, a); - - return it_low == it_high; -} - -hp_taco_device::tape_pos_t hp_taco_device::farthest_end(const tape_track_t::iterator& it) const -{ - if (m_tape_fwd) { - return word_end_pos(it); - } else { - return it->first; - } -} - -bool hp_taco_device::next_data(tape_track_t::iterator& it , tape_pos_t pos , bool inclusive) -{ - tape_track_t& track = current_track(); - it = track.lower_bound(pos); - if (m_tape_fwd) { - if (inclusive) { - adjust_it(track, it, pos); - } - return it != track.end(); - } else { - // Never more than 2 iterations - do { - if (it == track.begin()) { - it = track.end(); - return false; - } - it--; - } while (!inclusive && word_end_pos(it) > pos); - return true; - } -} - -hp_taco_device::adv_res_t hp_taco_device::adv_it(tape_track_t::iterator& it) -{ - tape_track_t& track = current_track(); - if (m_tape_fwd) { - tape_pos_t prev_pos = word_end_pos(it); - it++; - if (it == track.end()) { - return ADV_NO_MORE_DATA; - } else { - adv_res_t res = prev_pos == it->first ? ADV_CONT_DATA : ADV_DISCONT_DATA; - return res; - } - } else { - if (it == track.begin()) { - it = track.end(); - return ADV_NO_MORE_DATA; - } else { - tape_pos_t prev_pos = it->first; - it--; - return prev_pos == word_end_pos(it) ? ADV_CONT_DATA : ADV_DISCONT_DATA; - } - } -} - -attotime hp_taco_device::fetch_next_wr_word(void) -{ - if (m_data_reg_full) { - m_next_word = m_data_reg; - m_data_reg_full = false; - LOG_0(("next %04x (DR)\n" , m_next_word)); - } else { - // When data register is empty, write checksum word - m_next_word = m_checksum_reg; - LOG_0(("next %04x (CS)\n" , m_next_word)); - } - // Update checksum with new word - m_checksum_reg += m_next_word; - - return time_to_distance(word_length(m_next_word)); -} - -attotime hp_taco_device::time_to_rd_next_word(tape_pos_t& word_rd_pos) -{ - if (m_rd_it_valid) { - word_rd_pos = farthest_end(m_rd_it); - return time_to_target(word_rd_pos); - } else { - return attotime::never; - } -} - -/** - * Scan for next "n_gaps" gaps - * - * @param[in,out] pos Start position on input, start of gap on output - * @param it Pointer to data word where scan is to start - * @param n_gaps Number of gaps to scan - * @param min_gap Minimum gap size - * - * @return true if n_gaps gaps are found - */ -bool hp_taco_device::next_n_gap(tape_pos_t& pos , tape_track_t::iterator it , unsigned n_gaps , tape_pos_t min_gap) -{ - tape_track_t& track = current_track(); - bool done = false; - tape_track_t::iterator prev_it; - - if (m_tape_fwd) { - tape_pos_t next_pos; - - while (1) { - if (it == track.end()) { - next_pos = TAPE_LENGTH; - done = true; - } else { - next_pos = it->first; - } - if (((next_pos - pos) >= min_gap && --n_gaps == 0) || done) { - break; - } - adv_res_t adv_res; - do { - prev_it = it; - adv_res = adv_it(it); - } while (adv_res == ADV_CONT_DATA); - pos = word_end_pos(prev_it); - } - } else { - tape_pos_t next_pos; - - while (1) { - if (it == track.end()) { - next_pos = 0; - done = true; - } else { - next_pos = word_end_pos(it); - } - if (((pos - next_pos) >= min_gap && --n_gaps == 0) || done) { - break; - } - adv_res_t adv_res; - do { - prev_it = it; - adv_res = adv_it(it); - } while (adv_res == ADV_CONT_DATA); - pos = prev_it->first; - } - } - - // Set "pos" where minimum gap size is met - pos_offset(pos , min_gap); - - return n_gaps == 0; -} - -bool hp_taco_device::next_n_gap(tape_pos_t& pos , unsigned n_gaps , tape_pos_t min_gap) -{ - tape_track_t::iterator it; - // First align with next data - next_data(it, pos, true); - // Then scan for n_gaps - return next_n_gap(pos, it, n_gaps, min_gap); -} - -void hp_taco_device::clear_tape(void) -{ - for (unsigned track_n = 0; track_n < 2; track_n++) { - m_tracks[ track_n ].clear(); - } -} - -void hp_taco_device::dump_sequence(tape_track_t::const_iterator it_start , unsigned n_words) -{ - if (n_words) { - UINT32 tmp32; - UINT16 tmp16; - - tmp32 = n_words; - fwrite(&tmp32 , sizeof(tmp32)); - tmp32 = it_start->first; - fwrite(&tmp32 , sizeof(tmp32)); - - for (unsigned i = 0; i < n_words; i++) { - tmp16 = it_start->second; - fwrite(&tmp16 , sizeof(tmp16)); - it_start++; - } - } -} - -void hp_taco_device::save_tape(void) -{ - UINT32 tmp32; - - fseek(0, SEEK_SET); - - tmp32 = FILE_MAGIC; - fwrite(&tmp32 , sizeof(tmp32)); - - for (unsigned track_n = 0; track_n < 2; track_n++) { - const tape_track_t& track = m_tracks[ track_n ]; - tape_pos_t next_pos = (tape_pos_t)-1; - unsigned n_words = 0; - tape_track_t::const_iterator it_start; - for (tape_track_t::const_iterator it = track.cbegin(); it != track.cend(); it++) { - if (it->first != next_pos) { - dump_sequence(it_start , n_words); - it_start = it; - n_words = 0; - } - next_pos = it->first + word_length(it->second); - n_words++; - } - dump_sequence(it_start , n_words); - // End of track - tmp32 = (UINT32)-1; - fwrite(&tmp32 , sizeof(tmp32)); - } -} - -bool hp_taco_device::load_track(tape_track_t& track) -{ - UINT32 tmp32; - - track.clear(); - - while (1) { - if (fread(&tmp32 , sizeof(tmp32)) != sizeof(tmp32)) { - return false; - } - - if (tmp32 == (UINT32)-1) { - return true; - } - - unsigned n_words = tmp32; - - if (fread(&tmp32 , sizeof(tmp32)) != sizeof(tmp32)) { - return false; - } - - tape_pos_t pos = (tape_pos_t)tmp32; - - for (unsigned i = 0; i < n_words; i++) { - UINT16 tmp16; - - if (fread(&tmp16 , sizeof(tmp16)) != sizeof(tmp16)) { - return false; - } - - track.insert(std::make_pair(pos , tmp16)); - pos += word_length(tmp16); - } - } -} - -bool hp_taco_device::load_tape(void) -{ - UINT32 magic; - - if (fread(&magic , sizeof(magic)) != sizeof(magic) || - magic != FILE_MAGIC) { - return false; - } - - for (unsigned track_n = 0; track_n < 2; track_n++) { - if (!load_track(m_tracks[ track_n ])) { - LOG(("load_tape failed")); - clear_tape(); - return false; - } - } - - LOG(("load_tape done\n")); - return true; -} - -void hp_taco_device::set_tape_present(bool present) -{ - if (present) { - if (is_readonly()) { - BIT_SET(m_status_reg, STATUS_WPR_BIT); - } else { - BIT_CLR(m_status_reg, STATUS_WPR_BIT); - } - // STATUS_CART_OUT_BIT is reset by CMD_CLEAR - } else { - BIT_SET(m_status_reg, STATUS_CART_OUT_BIT); - BIT_SET(m_status_reg, STATUS_WPR_BIT); - } -} - -attotime hp_taco_device::time_to_next_hole(void) const -{ - return time_to_target(next_hole()); -} - -attotime hp_taco_device::time_to_tach_pulses(void) const -{ - return time_to_distance((tape_pos_t)(0x10000U - m_tach_reg) * TAPE_POS_FRACT); -} - -void hp_taco_device::start_cmd_exec(UINT16 new_cmd_reg) -{ - LOG(("Cmd = %02x\n" , CMD_CODE(new_cmd_reg))); - - update_tape_pos(); - - attotime cmd_duration = attotime::never; - attotime time_to_hole = attotime::never; - - unsigned new_cmd_code = CMD_CODE(new_cmd_reg); - - if (new_cmd_code != CMD_START_READ && - new_cmd_code != CMD_END_READ && - new_cmd_code != CMD_CLEAR) { - m_rd_it_valid = false; - } - - switch (new_cmd_code) { - case CMD_INDTA_INGAP: - // Errors: CART OUT,FAST SPEED - if (start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - m_cmd_state = 0; - if (next_data(m_rd_it , m_tape_pos , true)) { - cmd_duration = time_to_target(farthest_end(m_rd_it)); - } - } - break; - - case CMD_FINAL_GAP: - // Errors: WP,CART OUT - if (start_tape_cmd(new_cmd_reg , 0 , STATUS_WPR_MASK)) { - m_rw_pos = m_tape_pos; - cmd_duration = time_to_distance(END_GAP_LENGTH); - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_CLEAR: - set_error(false); - BIT_CLR(m_status_reg, STATUS_HOLE_BIT); - BIT_CLR(m_status_reg, STATUS_CART_OUT_BIT); - BIT_CLR(m_status_reg, STATUS_WPR_BIT); - set_tape_present(is_loaded()); - // This is a special command: it doesn't raise IRQ at completion and it - // doesn't replace current command - return; - - case CMD_NOT_INDTA: - // Errors: CART OUT,FAST SPEED - if (start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - tape_pos_t target = m_tape_pos; - if (next_n_gap(target, 1, NO_DATA_GAP)) { - LOG_0(("End of data @%d\n" , target)); - cmd_duration = time_to_target(target); - } - // Holes detected? - } - break; - - case CMD_INIT_WRITE: - // Errors: WP,CART OUT,fast speed,reverse - if (start_tape_cmd(new_cmd_reg , DIR_FWD_MASK , STATUS_WPR_MASK | SPEED_FAST_MASK)) { - m_next_word = PREAMBLE_WORD; - m_rw_pos = m_tape_pos; - cmd_duration = time_to_distance(word_length(m_next_word)); - } - break; - - case CMD_STOP: - if (CMD_CODE(m_cmd_reg) != CMD_STOP) { - if (m_start_time.is_never()) { - // Tape is already stopped - cmd_duration = attotime::from_usec(QUICK_CMD_USEC); - } else { - // Start braking timer - cmd_duration = attotime::from_msec(m_tape_fast ? FAST_BRAKE_MSEC : SLOW_BRAKE_MSEC); - } - m_cmd_reg = new_cmd_reg; - } else { - // TODO: check if ok - return; - } - break; - - case CMD_SET_TRACK: - // Don't know if this command really starts the tape or not (probably it doesn't) - if (start_tape_cmd(new_cmd_reg , 0 , 0)) { - // When b9 is 0, set track A/B - // When b9 is 1, ignore command (in TACO chip it has an unknown purpose) - if (!UNKNOWN_B9(new_cmd_reg)) { - if (CMD_OPT(new_cmd_reg)) { - BIT_SET(m_status_reg, STATUS_TRACKB_BIT); - } else { - BIT_CLR(m_status_reg, STATUS_TRACKB_BIT); - } - } - cmd_duration = attotime::from_usec(QUICK_CMD_USEC); - } - break; - - case CMD_MOVE: - if (start_tape_cmd(new_cmd_reg , 0 , 0)) { - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_INGAP_MOVE: - // Errors: CART OUT,FAST SPEED - if (start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - m_cmd_state = 0; - tape_pos_t target = m_tape_pos; - if (next_n_gap(target, 1, MIN_IRG_LENGTH)) { - LOG_0(("IRG @%d\n" , target)); - cmd_duration = time_to_target(target); - } - // Holes detected? - } - break; - - case CMD_WRITE_IRG: - // Errors: WP,CART OUT - if (start_tape_cmd(new_cmd_reg , 0 , STATUS_WPR_MASK)) { - m_rw_pos = m_tape_pos; - cmd_duration = time_to_tach_pulses(); - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_SCAN_RECORDS: - // Errors: CART OUT - if (start_tape_cmd(new_cmd_reg , 0 , 0)) { - m_cmd_state = 0; - if (next_data(m_rd_it , m_tape_pos , true)) { - cmd_duration = time_to_target(farthest_end(m_rd_it)); - } - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_RECORD_WRITE: - // Errors: WP,CART OUT,fast speed,reverse - if (start_tape_cmd(new_cmd_reg , DIR_FWD_MASK , STATUS_WPR_MASK | SPEED_FAST_MASK)) { - // Search for preamble first - m_cmd_state = 0; - m_rd_it_valid = next_data(m_rd_it , m_tape_pos , false); - cmd_duration = time_to_rd_next_word(m_rw_pos); - // Holes detected? - } - break; - - case CMD_MOVE_INDTA: - // Errors: CART OUT,FAST SPEED - if (start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - m_cmd_state = 0; - cmd_duration = time_to_tach_pulses(); - // Holes detected? - } - break; - - case CMD_UNK_1b: - if (start_tape_cmd(new_cmd_reg , 0 , 0)) { - // Unknown purpose, but make it a NOP (it's used in "T" test of test ROM) - cmd_duration = attotime::from_usec(QUICK_CMD_USEC); - } - break; - - case CMD_DELTA_MOVE_HOLE: - case CMD_DELTA_MOVE_IRG: - if (start_tape_cmd(new_cmd_reg , 0 , 0)) { - cmd_duration = time_to_tach_pulses(); - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_START_READ: - // Yes, you can read tape backwards: test "C" does that! - // Because of this DIR_FWD_MASK is not in the "must be 1" mask. - if (start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - // TODO: check anche m_rw_pos sforato - if (!m_rd_it_valid) { - // Search for preamble first - m_cmd_state = 0; - m_rd_it_valid = next_data(m_rd_it , m_tape_pos , false); - } - - cmd_duration = time_to_rd_next_word(m_rw_pos); - time_to_hole = time_to_next_hole(); - } - break; - - case CMD_END_READ: - // This command only makes sense after CMD_START_READ - if (CMD_CODE(m_cmd_reg) == CMD_START_READ && m_cmd_state == 1 && - start_tape_cmd(new_cmd_reg , 0 , SPEED_FAST_MASK)) { - LOG_0(("END_READ %d\n" , m_rd_it_valid)); - cmd_duration = time_to_rd_next_word(m_rw_pos); - time_to_hole = time_to_next_hole(); - } - break; - - default: - LOG(("Unrecognized command\n")); - break; - } - - m_tape_timer->adjust(cmd_duration); - m_hole_timer->adjust(time_to_hole); -} - -bool hp_taco_device::call_load() -{ - LOG(("call_load %d\n" , has_been_created())); - if (has_been_created()) { - clear_tape(); - save_tape(); - } else if (!load_tape()) { - seterror(IMAGE_ERROR_INVALIDIMAGE , "Wrong format"); - set_tape_present(false); - return IMAGE_INIT_FAIL; - } - - m_image_dirty = false; - - set_tape_present(true); - return IMAGE_INIT_PASS; -} - -bool hp_taco_device::call_create(int format_type, option_resolution *format_options) -{ - LOG(("call_create %d\n" , has_been_created())); - return call_load(); -} - -void hp_taco_device::call_unload() -{ - LOG(("call_unload dirty=%d\n" , m_image_dirty)); - if (m_image_dirty) { - save_tape(); - m_image_dirty = false; - } - - clear_tape(); - set_tape_present(false); -} - -const char *hp_taco_device::file_extensions() const -{ - return "hti"; -} diff --git a/src/devices/machine/hp_taco.h b/src/devices/machine/hp_taco.h deleted file mode 100644 index c8b794c79a2..00000000000 --- a/src/devices/machine/hp_taco.h +++ /dev/null @@ -1,169 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:F. Ulivi -/********************************************************************* - - hp_taco.h - - HP TApe COntroller (5006-3012) - -*********************************************************************/ - -#ifndef __HP_TACO_H__ -#define __HP_TACO_H__ - -#include <map> - -#define MCFG_TACO_IRQ_HANDLER(_devcb) \ - devcb = &hp_taco_device::set_irq_handler(*device , DEVCB_##_devcb); - -#define MCFG_TACO_FLG_HANDLER(_devcb) \ - devcb = &hp_taco_device::set_flg_handler(*device , DEVCB_##_devcb); - -#define MCFG_TACO_STS_HANDLER(_devcb) \ - devcb = &hp_taco_device::set_sts_handler(*device , DEVCB_##_devcb); - -class hp_taco_device : public device_t , - public device_image_interface -{ -public: - // construction/destruction - hp_taco_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname); - hp_taco_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // static configuration helpers - template<class _Object> static devcb_base &set_irq_handler(device_t &device, _Object object) { return downcast<hp_taco_device &>(device).m_irq_handler.set_callback(object); } - template<class _Object> static devcb_base &set_flg_handler(device_t &device, _Object object) { return downcast<hp_taco_device &>(device).m_flg_handler.set_callback(object); } - template<class _Object> static devcb_base &set_sts_handler(device_t &device, _Object object) { return downcast<hp_taco_device &>(device).m_sts_handler.set_callback(object); } - - // Register read/write - DECLARE_WRITE16_MEMBER(reg_w); - DECLARE_READ16_MEMBER(reg_r); - - // Flag & status read - DECLARE_READ_LINE_MEMBER(flg_r); - DECLARE_READ_LINE_MEMBER(sts_r); - - // device_image_interface overrides - virtual bool call_load() override; - virtual bool call_create(int format_type, option_resolution *format_options) override; - virtual void call_unload() override; - virtual iodevice_t image_type() const override { return IO_MAGTAPE; } - virtual bool is_readable() const override { return true; } - virtual bool is_writeable() const override { return true; } - virtual bool is_creatable() const override { return true; } - virtual bool must_be_loaded() const override { return false; } - virtual bool is_reset_on_load() const override { return false; } - virtual const char *file_extensions() const override; - virtual const option_guide *create_option_guide() const override { return nullptr; } - - // Tape position, 1 unit = 1 inch / (968 * 1024) - typedef INT32 tape_pos_t; - - // Words stored on tape - typedef UINT16 tape_word_t; - -protected: - // device-level overrides - virtual void device_config_complete() override; - virtual void device_start() override; - virtual void device_stop() override; - virtual void device_reset() override; - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - -private: - // Storage of tracks: mapping from a tape position to word stored there - typedef std::map<tape_pos_t , tape_word_t> tape_track_t; - - devcb_write_line m_irq_handler; - devcb_write_line m_flg_handler; - devcb_write_line m_sts_handler; - - // Registers - UINT16 m_data_reg; - bool m_data_reg_full; - UINT16 m_cmd_reg; - UINT16 m_status_reg; - UINT16 m_tach_reg; - UINT16 m_checksum_reg; - UINT16 m_timing_reg; - - // State - bool m_irq; - bool m_flg; - bool m_sts; - UINT8 m_cmd_state; - - // Tape position & motion - tape_pos_t m_tape_pos; - attotime m_start_time; // Tape moving if != never - bool m_tape_fwd; - bool m_tape_fast; - - // Timers - emu_timer *m_tape_timer; - emu_timer *m_hole_timer; - - // Content of tape tracks - tape_track_t m_tracks[ 2 ]; - bool m_image_dirty; - - // Reading & writing - bool m_tape_wr; - tape_pos_t m_rw_pos; - UINT16 m_next_word; - tape_track_t::iterator m_rd_it; - bool m_rd_it_valid; - - // Gap detection - tape_pos_t m_gap_detect_start; - - typedef enum { - ADV_NO_MORE_DATA, - ADV_CONT_DATA, - ADV_DISCONT_DATA - } adv_res_t; - - void clear_state(void); - void irq_w(bool state); - void set_error(bool state); - unsigned speed_to_tick_freq(void) const; - bool pos_offset(tape_pos_t& pos , tape_pos_t offset) const; - void move_tape_pos(tape_pos_t delta_pos); - void update_tape_pos(void); - static void ensure_a_lt_b(tape_pos_t& a , tape_pos_t& b); - static bool any_hole(tape_pos_t tape_pos_a , tape_pos_t tape_pos_b); - tape_pos_t next_hole(void) const; - attotime time_to_distance(tape_pos_t distance) const; - attotime time_to_target(tape_pos_t target) const; - bool start_tape_cmd(UINT16 cmd_reg , UINT16 must_be_1 , UINT16 must_be_0); - void start_tape(UINT16 cmd_reg); - void stop_tape(void); - tape_track_t& current_track(void); - static tape_pos_t word_length(tape_word_t w); - static tape_pos_t word_end_pos(const tape_track_t::iterator& it); - static void adjust_it(tape_track_t& track , tape_track_t::iterator& it , tape_pos_t pos); - void write_word(tape_pos_t start , tape_word_t word , tape_pos_t& length); - void write_gap(tape_pos_t a , tape_pos_t b); - bool just_gap(tape_pos_t a , tape_pos_t b); - tape_pos_t farthest_end(const tape_track_t::iterator& it) const; - bool next_data(tape_track_t::iterator& it , tape_pos_t pos , bool inclusive); - adv_res_t adv_it(tape_track_t::iterator& it); - attotime fetch_next_wr_word(void); - attotime time_to_rd_next_word(tape_pos_t& word_rd_pos); - bool next_n_gap(tape_pos_t& pos , tape_track_t::iterator it , unsigned n_gaps , tape_pos_t min_gap); - bool next_n_gap(tape_pos_t& pos , unsigned n_gaps , tape_pos_t min_gap); - void clear_tape(void); - void dump_sequence(tape_track_t::const_iterator it_start , unsigned n_words); - void save_tape(void); - bool load_track(tape_track_t& track); - bool load_tape(void); - void set_tape_present(bool present); - attotime time_to_next_hole(void) const; - attotime time_to_tach_pulses(void) const; - void start_cmd_exec(UINT16 new_cmd_reg); -}; - -// device type definition -extern const device_type HP_TACO; - -#endif /* __HP_TACO_H__ */ diff --git a/src/devices/machine/i8271.cpp b/src/devices/machine/i8271.cpp index dfd098a5f82..cd8c0faf5bf 100644 --- a/src/devices/machine/i8271.cpp +++ b/src/devices/machine/i8271.cpp @@ -88,7 +88,6 @@ void i8271_device::soft_reset() flopi[i].live = false; flopi[i].ready = get_ready(i); } - hdl_cb(false); set_irq(false); set_drq(false); command_pos = 0; @@ -888,7 +887,6 @@ void i8271_device::command_end(floppy_info &fi, bool data_completion) { logerror("%s: command done (%s) - %02x\n", tag(), data_completion ? "data" : "seek", rr); fi.main_state = fi.sub_state = IDLE; - idle_icnt = 0; main_phase = PHASE_RESULT; set_irq(true); } @@ -983,7 +981,6 @@ void i8271_device::seek_continue(floppy_info &fi) void i8271_device::read_data_start(floppy_info &fi) { fi.main_state = READ_DATA; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; logerror("%s: command read%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n", @@ -1013,7 +1010,6 @@ void i8271_device::read_data_start(floppy_info &fi) void i8271_device::scan_start(floppy_info &fi) { fi.main_state = SCAN_DATA; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; logerror("%s: command scan%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n", @@ -1045,7 +1041,6 @@ void i8271_device::scan_start(floppy_info &fi) void i8271_device::verify_data_start(floppy_info &fi) { fi.main_state = VERIFY_DATA; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; logerror("%s: command verify%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n", @@ -1103,7 +1098,6 @@ void i8271_device::read_data_continue(floppy_info &fi) return; case SEEK_WAIT_STEP_TIME_DONE: - hdl_cb(true); do { if(fi.pcn > command[1]) fi.pcn--; @@ -1187,9 +1181,7 @@ void i8271_device::read_data_continue(floppy_info &fi) void i8271_device::write_data_start(floppy_info &fi) { fi.main_state = WRITE_DATA; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; - logerror("%s: command write%s data%s cmd=%02x crn=(%d, %d, %d) len=%02x rate=%d\n", tag(), command[0] & 0x04 ? " deleted" : "", @@ -1246,7 +1238,6 @@ void i8271_device::write_data_continue(floppy_info &fi) return; case SEEK_WAIT_STEP_TIME_DONE: - hdl_cb(true); do { if(fi.pcn > command[1]) fi.pcn--; @@ -1320,7 +1311,6 @@ int i8271_device::calc_sector_size(UINT8 size) void i8271_device::format_track_start(floppy_info &fi) { fi.main_state = FORMAT_TRACK; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; logerror("%s: command format track c=%02x n=%02x sc=%02x gap3=%02x gap5=%02x gap1=%02x\n", @@ -1374,7 +1364,6 @@ void i8271_device::format_track_continue(floppy_info &fi) return; case SEEK_WAIT_STEP_TIME_DONE: - hdl_cb(true); do { if(fi.pcn > command[1]) fi.pcn--; @@ -1413,7 +1402,6 @@ void i8271_device::format_track_continue(floppy_info &fi) void i8271_device::read_id_start(floppy_info &fi) { fi.main_state = READ_ID; - hdl_cb(true); fi.sub_state = HEAD_LOAD_DONE; logerror("%s: command read id, rate=%d\n", @@ -1469,7 +1457,6 @@ void i8271_device::read_id_continue(floppy_info &fi) return; case SEEK_WAIT_STEP_TIME_DONE: - hdl_cb(true); do { if(fi.pcn > command[1]) fi.pcn--; @@ -1566,13 +1553,6 @@ void i8271_device::index_callback(floppy_image_device *floppy, int state) continue; } - if (fi.main_state == IDLE) { - idle_icnt++; - if (icnt != 0x0f && idle_icnt >= icnt) { - hdl_cb(false); - } - } - switch(fi.sub_state) { case IDLE: case SEEK_MOVE: diff --git a/src/devices/machine/i8271.h b/src/devices/machine/i8271.h index 5c63393a43f..e4409bed389 100644 --- a/src/devices/machine/i8271.h +++ b/src/devices/machine/i8271.h @@ -215,7 +215,6 @@ private: UINT8 srate, hset, icnt, hload; int sector_size; int cur_rate; - int idle_icnt; static std::string tts(attotime t); std::string ttsn(); diff --git a/src/devices/machine/k033906.cpp b/src/devices/machine/k033906.cpp index d9953d2864f..bd32fef29f1 100644 --- a/src/devices/machine/k033906.cpp +++ b/src/devices/machine/k033906.cpp @@ -33,7 +33,7 @@ k033906_device::k033906_device(const machine_config &mconfig, const char *tag, d void k033906_device::device_start() { - m_voodoo = (voodoo_device*)machine().device(m_voodoo_tag); + m_voodoo = machine().device(m_voodoo_tag); m_reg_set = 0; @@ -95,7 +95,7 @@ void k033906_device::reg_w(int reg, UINT32 data) case 0x10: // initEnable { - m_voodoo->voodoo_set_init_enable(data); + voodoo_set_init_enable(m_voodoo, data); break; } diff --git a/src/devices/machine/k033906.h b/src/devices/machine/k033906.h index 438cc5796ab..aa2c685df99 100644 --- a/src/devices/machine/k033906.h +++ b/src/devices/machine/k033906.h @@ -12,7 +12,7 @@ #define __K033906_H__ #include "emu.h" -#include "video/voodoo.h" + /*************************************************************************** @@ -58,7 +58,7 @@ private: int m_reg_set; // 1 = access reg / 0 = access ram const char *m_voodoo_tag; - voodoo_device *m_voodoo; + device_t *m_voodoo; UINT32 m_reg[256]; UINT32 m_ram[32768]; diff --git a/src/devices/machine/pic8259.cpp b/src/devices/machine/pic8259.cpp index 3064e212850..40fe6fd916c 100644 --- a/src/devices/machine/pic8259.cpp +++ b/src/devices/machine/pic8259.cpp @@ -133,10 +133,7 @@ UINT32 pic8259_device::acknowledge() } } } - logerror("Spurious IRQ\n"); - if(m_is_x86) - return m_base + 7; - return 0xcd0000 + (m_vector_addr_high << 8) + m_vector_addr_low + (7 << (3-m_vector_size)); + return 0; } diff --git a/src/devices/machine/ram.cpp b/src/devices/machine/ram.cpp index 7dd8f9250a4..92728b55303 100644 --- a/src/devices/machine/ram.cpp +++ b/src/devices/machine/ram.cpp @@ -1,5 +1,5 @@ -// license: BSD-3-Clause -// copyright-holders: Dirk Best +// license:GPL-2.0+ +// copyright-holders:Dirk Best /************************************************************************* RAM device @@ -23,6 +23,8 @@ // device type definition const device_type RAM = &device_creator<ram_device>; + + //------------------------------------------------- // ram_device - constructor //------------------------------------------------- @@ -36,6 +38,8 @@ ram_device::ram_device(const machine_config &mconfig, const char *tag, device_t m_default_value = 0xCD; } + + //------------------------------------------------- // device_start - device-specific startup //------------------------------------------------- @@ -64,6 +68,7 @@ void ram_device::device_start() save_item(NAME(m_pointer)); } + //------------------------------------------------- // device_validity_check - device-specific validity // checks @@ -166,6 +171,8 @@ void ram_device::device_validity_check(validity_checker &valid) const } } + + //------------------------------------------------- // parse_string - convert a ram string to an // integer value @@ -203,6 +210,8 @@ UINT32 ram_device::parse_string(const char *s) return ram; } + + //------------------------------------------------- // default_size //------------------------------------------------- diff --git a/src/devices/machine/ram.h b/src/devices/machine/ram.h index 5140309f825..7d3f054895f 100644 --- a/src/devices/machine/ram.h +++ b/src/devices/machine/ram.h @@ -1,5 +1,5 @@ -// license: BSD-3-Clause -// copyright-holders: Dirk Best +// license:GPL-2.0+ +// copyright-holders:Dirk Best /************************************************************************* RAM device diff --git a/src/devices/sound/votrax.h b/src/devices/sound/votrax.h index 471a42873f9..540f2b5feb1 100644 --- a/src/devices/sound/votrax.h +++ b/src/devices/sound/votrax.h @@ -42,7 +42,7 @@ public: // writers DECLARE_WRITE8_MEMBER( write ); DECLARE_WRITE8_MEMBER( inflection_w ); - DECLARE_READ_LINE_MEMBER( request ) { m_stream->update(); return m_request_state; } + DECLARE_READ_LINE_MEMBER( request ) { return m_request_state; } protected: // device-level overrides diff --git a/src/devices/video/ef9364.cpp b/src/devices/video/ef9364.cpp deleted file mode 100644 index b850f05d531..00000000000 --- a/src/devices/video/ef9364.cpp +++ /dev/null @@ -1,359 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Jean-Francois DEL NERO - -/********************************************************************* - - ef9364.cpp - - Thomson EF9364 / Sescosem SFF96364 video controller emulator code - - This circuit is a simple black and white 8x8 character generator. - It display 64 columns * 16 rows text page. - It is able to do automatic text scrolling, page erase. - The characters font is stored into an external 1KB EPROM. - - To see how to use this driver, have a look to the Goupil machine - driver (goupil.cpp). - If you have any question or remark, don't hesitate to contact me - at the email present on this website : http://hxc2001.free.fr/ - - 01/20/2016 - Jean-Francois DEL NERO -*********************************************************************/ - -#include "emu.h" -#include "ef9364.h" - -// devices -const device_type EF9364 = &device_creator<ef9364_device>; - -//------------------------------------------------- -// default address map -//------------------------------------------------- -static ADDRESS_MAP_START( ef9364, AS_0, 8, ef9364_device ) - AM_RANGE(0x00000, ( ( EF9364_TXTPLANE_MAX_SIZE * EF9364_MAX_TXTPLANES ) - 1 ) ) AM_RAM -ADDRESS_MAP_END - -//------------------------------------------------- -// memory_space_config - return a description of -// any address spaces owned by this device -//------------------------------------------------- - -const address_space_config *ef9364_device::memory_space_config(address_spacenum spacenum) const -{ - return (spacenum == AS_0) ? &m_space_config : NULL; -} - -//************************************************************************** -// INLINE HELPERS -//************************************************************************** - -//************************************************************************** -// live device -//************************************************************************** - -//------------------------------------------------- -// ef9364_device - constructor -//------------------------------------------------- - -ef9364_device::ef9364_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : - device_t(mconfig, EF9364, "EF9364", tag, owner, clock, "ef9364", __FILE__), - device_memory_interface(mconfig, *this), - device_video_interface(mconfig, *this), - m_space_config("textram", ENDIANNESS_LITTLE, 8, 12, 0, nullptr, *ADDRESS_MAP_NAME(ef9364)), - m_palette(*this) -{ - clock_freq = clock; -} - -//------------------------------------------------- -// static_set_palette_tag: Set the tag of the -// palette device -//------------------------------------------------- - -void ef9364_device::static_set_palette_tag(device_t &device, const char *tag) -{ - downcast<ef9364_device &>(device).m_palette.set_tag(tag); -} - -//------------------------------------------------- -// static_set_nb_of_pages: Set the number of hardware pages -//------------------------------------------------- - -void ef9364_device::static_set_nb_of_pages(device_t &device, int nb_of_pages ) -{ - if( nb_of_pages > 0 && nb_of_pages <= 8 ) - { - downcast<ef9364_device &>(device).nb_of_pages = nb_of_pages; - } -} - -//------------------------------------------------- -// set_color_entry: Set the color value -// into the palette -//------------------------------------------------- - -void ef9364_device::set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b ) -{ - if( index < 2 ) - { - palette[index] = rgb_t(r, g, b); - } - else - { - logerror("Invalid EF9364 Palette entry : %02x\n", index); - } -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void ef9364_device::device_start() -{ - m_textram = &space(0); - m_charset = region(); - - bitplane_xres = EF9364_NB_OF_COLUMNS*8; - bitplane_yres = EF9364_NB_OF_ROWS*(8+4); - - vsync_scanline_pos = 250; - - // Default palette : Black and white - palette[0] = rgb_t(0, 0, 0); - palette[1] = rgb_t(255, 255, 255); - - m_screen_out.allocate( bitplane_xres, m_screen->height() ); - - cursor_cnt = 0; - cursor_state = 0; - - save_item(NAME(m_border)); - - save_item(NAME(m_screen_out)); -} - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void ef9364_device::device_reset() -{ - int i; - - x_curs_pos = 0; - y_curs_pos = 0; - - char_latch = 0x00; - - for(i=0;i<EF9364_NB_OF_COLUMNS * EF9364_NB_OF_ROWS * nb_of_pages;i++) - { - m_textram->write_byte ( i , 0x7F ); - } - - memset(m_border, 0, sizeof(m_border)); - - m_screen_out.fill(0); - - set_video_mode(); -} - -//------------------------------------------------- -// set_video_mode: Set output screen format -//------------------------------------------------- - -void ef9364_device::set_video_mode(void) -{ - UINT16 new_width = bitplane_xres; - - if (m_screen->width() != new_width) - { - rectangle visarea = m_screen->visible_area(); - visarea.max_x = new_width - 1; - - m_screen->configure(new_width, m_screen->height(), visarea, m_screen->frame_period().attoseconds()); - } - - //border color - memset(m_border, 0, sizeof(m_border)); -} - -//------------------------------------------------- -// draw_border: Draw the left and right borders -// ( No border for the moment ;) ) -//------------------------------------------------- - -void ef9364_device::draw_border(UINT16 line) -{ -} - -//------------------------------------------------- -// screen_update: Framebuffer video ouput -//------------------------------------------------- - -UINT32 ef9364_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - int x,y,r; - unsigned char c; - - for( r = 0 ; r < EF9364_NB_OF_ROWS ; r++ ) - { - for( y = 0 ; y < 8 ; y++ ) - { - for( x = 0 ; x < EF9364_NB_OF_COLUMNS * 8 ; x++ ) - { - if( ( ( x >> 3 ) != x_curs_pos ) || ( r != y_curs_pos ) || !cursor_state) - { - c = m_textram->read_byte( ( r * EF9364_NB_OF_COLUMNS ) + ( x>>3 ) ); - - if( m_charset->u8(((c&0x7F)<<3) + y ) & (0x80>>(x&7)) ) - m_screen_out.pix32((r*12)+y, x) = palette[1]; - else - m_screen_out.pix32((r*12)+y, x) = palette[0]; - } - else - { - if(y != 7) - m_screen_out.pix32((r*12)+y, x) = palette[0]; - else - m_screen_out.pix32((r*12)+y, x) = palette[1]; - } - } - } - } - - cursor_cnt = (cursor_cnt + 1) % 13; - if(!cursor_cnt) - cursor_state ^= 1; - - copybitmap(bitmap, m_screen_out, 0, 0, 0, 0, cliprect); - return 0; -} - -//------------------------------------------------- -// update_scanline: Scanline callback -//------------------------------------------------- - -void ef9364_device::update_scanline(UINT16 scanline) -{ - if (scanline == vsync_scanline_pos) - { - // vsync - } - - if (scanline == 0) - { - draw_border(0); - } -} - -//------------------------------------------------- -// data_w: Registers write access callback -//------------------------------------------------- - -void ef9364_device::command_w(UINT8 cmd) -{ - int x,y,i,j; - - switch( cmd&7 ) - { - case 0x0: // Page Erase & Cursor home - for( y=0 ; y < EF9364_NB_OF_ROWS ; y++ ) - { - for( x=0 ; x < EF9364_NB_OF_COLUMNS ; x++ ) - { - m_textram->write_byte ( y * EF9364_NB_OF_COLUMNS + x , 0x7F ); - } - } - x_curs_pos = 0; - y_curs_pos = 0; - break; - - case 0x1: // Erase to end of the line and return cursor - for( ; x_curs_pos < EF9364_NB_OF_COLUMNS ; x_curs_pos++ ) - { - m_textram->write_byte ( y_curs_pos * EF9364_NB_OF_COLUMNS + x_curs_pos , 0x7F ); - } - x_curs_pos = 0; - break; - - case 0x2: // Line feed - y_curs_pos++; - if( y_curs_pos >= EF9364_NB_OF_ROWS ) - { - // Scroll - for( j = 1 ; j < EF9364_NB_OF_ROWS ; j++ ) - { - for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ ) - { - m_textram->write_byte ( (j-1) * EF9364_NB_OF_COLUMNS + i , m_textram->read_byte ( j * EF9364_NB_OF_COLUMNS + i ) ); - } - } - // Erase last line - for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ ) - { - m_textram->write_byte ( ( EF9364_NB_OF_ROWS - 1 ) * EF9364_NB_OF_COLUMNS + i , 0x7F ); - } - - y_curs_pos = EF9364_NB_OF_ROWS - 1; - } - break; - - case 0x3: // Nop - - break; - - case 0x4: // Cursor left - if(x_curs_pos) - x_curs_pos--; - break; - - case 0x5: // Erasure of cursor Line. - for( x = 0 ; x < EF9364_NB_OF_COLUMNS ; x++ ) - { - m_textram->write_byte ( y_curs_pos * EF9364_NB_OF_COLUMNS + x , 0x7F ); - } - break; - - case 0x6: // Cursor up - if(y_curs_pos) - y_curs_pos--; - break; - - case 0x7: // Write char - if(cmd&0x8) - m_textram->write_byte ( y_curs_pos * EF9364_NB_OF_COLUMNS + x_curs_pos , char_latch ); - - x_curs_pos++; - if( x_curs_pos >= EF9364_NB_OF_COLUMNS ) - { - x_curs_pos=0; - y_curs_pos++; - if( y_curs_pos >= EF9364_NB_OF_ROWS ) - { - // Scroll - for( j = 1 ; j < EF9364_NB_OF_ROWS ; j++ ) - { - for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ ) - { - m_textram->write_byte ( (j-1) * EF9364_NB_OF_COLUMNS + i , m_textram->read_byte ( j * EF9364_NB_OF_COLUMNS + i ) ); - } - } - // Erase last line - for( i = 0 ; i < EF9364_NB_OF_COLUMNS ; i++ ) - { - m_textram->write_byte ( ( EF9364_NB_OF_ROWS - 1 ) * EF9364_NB_OF_COLUMNS + i , 0x7F ); - } - - y_curs_pos = EF9364_NB_OF_ROWS - 1; - } - } - break; - - } -} - -void ef9364_device::char_latch_w(UINT8 data) -{ - char_latch = data; -} diff --git a/src/devices/video/ef9364.h b/src/devices/video/ef9364.h deleted file mode 100644 index 1519d817196..00000000000 --- a/src/devices/video/ef9364.h +++ /dev/null @@ -1,104 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Jean-Francois DEL NERO -/********************************************************************* - - ef9364.h - - Thomson EF9364 video controller - -*********************************************************************/ - -#pragma once - -#ifndef __EF9364_H__ -#define __EF9364_H__ - -#define EF9364_NB_OF_COLUMNS 64 -#define EF9364_NB_OF_ROWS 16 - -#define EF9364_TXTPLANE_MAX_SIZE ( EF9364_NB_OF_COLUMNS * EF9364_NB_OF_ROWS ) -#define EF9364_MAX_TXTPLANES 2 - -#define MCFG_EF9364_PALETTE(_palette_tag) \ - ef9364_device::static_set_palette_tag(*device, "^" _palette_tag); - -#define MCFG_EF9364_PAGES_CNT(_pages_number) \ - ef9364_device::static_set_nb_of_pages(*device,_pages_number); - -#define MCFG_EF9364_IRQ_HANDLER(_devcb) \ - devcb = &ef9364_device::set_irq_handler(*device, DEVCB_##_devcb); - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> ef9364_device - -class ef9364_device : public device_t, - public device_memory_interface, - public device_video_interface -{ -public: - // construction/destruction - ef9364_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // static configuration - static void static_set_palette_tag(device_t &device, const char *tag); - static void static_set_nb_of_pages(device_t &device, int nb_bitplanes ); - - // device interface - - void update_scanline(UINT16 scanline); - void set_color_entry( int index, UINT8 r, UINT8 g, UINT8 b ); - - UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - void char_latch_w(UINT8 data); - void command_w(UINT8 cmd); - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - - // device_config_memory_interface overrides - virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const override; - - // address space configurations - const address_space_config m_space_config; - - // inline helper - -private: - void screen_scanning( int force_clear ); - void set_video_mode(void); - void draw_border(UINT16 line); - - // internal state - - memory_region *m_charset; - address_space *m_textram; - - UINT8 x_curs_pos; - UINT8 y_curs_pos; - UINT8 char_latch; - - UINT8 m_border[80]; //border color - - rgb_t palette[2]; - int nb_of_pages; - int bitplane_xres; - int bitplane_yres; - int vsync_scanline_pos; - int cursor_cnt; - int cursor_state; - - UINT32 clock_freq; - bitmap_rgb32 m_screen_out; - - required_device<palette_device> m_palette; -}; - -// device type definition -extern const device_type EF9364; - -#endif diff --git a/src/devices/video/ef9365.cpp b/src/devices/video/ef9365.cpp index 5f81d7f45b5..f923cfd0813 100644 --- a/src/devices/video/ef9365.cpp +++ b/src/devices/video/ef9365.cpp @@ -938,7 +938,7 @@ void ef9365_device::screen_scanning( int force_clear ) void ef9365_device::ef9365_exec(UINT8 cmd) { int tmp_delta_x,tmp_delta_y; - int busy_cycles = 0; + int busy_cycles; m_state = 0; if( ( cmd>>4 ) == 0 ) diff --git a/src/devices/video/i82730.cpp b/src/devices/video/i82730.cpp index 8cd78863df3..d344c7006ef 100644 --- a/src/devices/video/i82730.cpp +++ b/src/devices/video/i82730.cpp @@ -128,7 +128,7 @@ UINT16 i82730_device::read_word(offs_t address) { UINT16 data; - if (sysbus_16bit() && WORD_ALIGNED(address)) + if (sysbus_16bit() && !(address & 1)) { data = m_program->read_word(address); } @@ -148,7 +148,7 @@ void i82730_device::write_byte(offs_t address, UINT8 data) void i82730_device::write_word(offs_t address, UINT16 data) { - if (sysbus_16bit() && WORD_ALIGNED(address)) + if (sysbus_16bit() && !(address & 1)) { m_program->write_word(address, data); } diff --git a/src/devices/video/jangou_blitter.cpp b/src/devices/video/jangou_blitter.cpp deleted file mode 100644 index e2acdb37ca1..00000000000 --- a/src/devices/video/jangou_blitter.cpp +++ /dev/null @@ -1,194 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese -/*************************************************************************** - - Jangou Custom Blitter Chip, codename "???" (name scratched afaik) - - device emulation by Angelo Salese, from original jangou.cpp implementation - by Angelo Salese, David Haywood and Phil Bennett. - - TODO: - - BLTFLIP mechanism; - - clean-ups; - -***************************************************************************/ - -#include "emu.h" -#include "jangou_blitter.h" - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - -// device type definition -const device_type JANGOU_BLITTER = &device_creator<jangou_blitter_device>; - - -//************************************************************************** -// LIVE DEVICE -//************************************************************************** - -//------------------------------------------------- -// jangou_blitter_device - constructor -//------------------------------------------------- - -jangou_blitter_device::jangou_blitter_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) - : device_t(mconfig, JANGOU_BLITTER, "Jangou Blitter Custom Chip", tag, owner, clock, "jangou_blitter", __FILE__) -{ -} - - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void jangou_blitter_device::device_start() -{ - memory_region *devregion = machine().root_device().memregion("gfx"); - m_gfxrom = devregion->base(); - if (m_gfxrom == nullptr) - fatalerror("JANGOU_BLITTER: \"gfx\" memory base not found"); - m_gfxrommask = devregion->bytes()-1; - - save_item(NAME(m_pen_data)); - save_item(NAME(m_blit_data)); - save_item(NAME(m_blit_buffer)); -} - - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void jangou_blitter_device::device_reset() -{ - memset(m_blit_data, 0, ARRAY_LENGTH(m_blit_data)); - memset(m_pen_data, 0, ARRAY_LENGTH(m_pen_data)); - m_bltflip = false; -} - - -//************************************************************************** -// READ/WRITE HANDLERS -//************************************************************************** - -// TODO: inline these -UINT8 jangou_blitter_device::gfx_nibble( UINT32 niboffset ) -{ - if (niboffset & 1) - return (m_gfxrom[(niboffset >> 1) & m_gfxrommask] & 0xf0) >> 4; - else - return (m_gfxrom[(niboffset >> 1) & m_gfxrommask] & 0x0f); -} - -void jangou_blitter_device::plot_gfx_pixel( UINT8 pix, int x, int y ) -{ - if (y < 0 || y >= 256) - return; - if (x < 0 || x >= 256) - return; - - if (x & 1) - m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0x0f) | ((pix << 4) & 0xf0); - else - m_blit_buffer[(y * 256) + (x >> 1)] = (m_blit_buffer[(y * 256) + (x >> 1)] & 0xf0) | (pix & 0x0f); -} - -WRITE8_MEMBER( jangou_blitter_device::process_w ) -{ - int src, x, y, h, w, flipx; - m_blit_data[offset] = data; - - if (offset == 5) - { - int count = 0; - int xcount, ycount; - - w = (m_blit_data[4] & 0xff) + 1; - h = (m_blit_data[5] & 0xff) + 1; - src = ((m_blit_data[1] << 8)|(m_blit_data[0] << 0)); - src |= (m_blit_data[6] & 3) << 16; - x = (m_blit_data[2] & 0xff); - y = (m_blit_data[3] & 0xff); - - #if 0 - if(m_bltflip == true) - { - printf("%02x %02x %02x %02x %02x %02x %02x\n", m_blit_data[0], m_blit_data[1], m_blit_data[2],m_blit_data[3], m_blit_data[4], m_blit_data[5],m_blit_data[6]); - printf("=>"); - for(int i=0;i<0x10;i++) - printf("%02x ",m_pen_data[i]); - printf("\n"); - } - #endif - // lowest bit of src controls flipping / draw direction? - flipx = (m_blit_data[0] & 1); - - if (!flipx) - src += (w * h) - 1; - else - src -= (w * h) - 1; - - - for (ycount = 0; ycount < h; ycount++) - { - for(xcount = 0; xcount < w; xcount++) - { - int drawx = (x + xcount) & 0xff; - int drawy = (y + ycount) & 0xff; - UINT8 dat = gfx_nibble(src + count); - UINT8 cur_pen = m_pen_data[dat & 0x0f]; - - //dat = cur_pen_lo | (cur_pen_hi << 4); - - if ((cur_pen & 0xff) != 0) - plot_gfx_pixel(cur_pen, drawx, drawy); - - if (!flipx) - count--; - else - count++; - } - } - - //UINT32 new_src = src + count; - - // update source and height after blitter operation - // TODO: Jangou doesn't agree with this, later HW? - #if 0 - m_blit_data[0] = new_src & 0xfe; - m_blit_data[1] = new_src >> 8; - m_blit_data[5] = 0; - m_blit_data[6] = new_src >> 16; - #endif - m_bltflip = false; - } -} - -// Sexy Gal swaps around upper src address -WRITE8_MEMBER( jangou_blitter_device::alt_process_w ) -{ - const UINT8 translate_addr[7] = { 0, 1, 6, 2, 3, 4, 5 }; - - process_w(space,translate_addr[offset],data); -} - -WRITE8_MEMBER( jangou_blitter_device::vregs_w ) -{ - // bit 5 set by Jangou, left-over? - m_pen_data[offset] = data & 0x0f; -} - -WRITE8_MEMBER( jangou_blitter_device::bltflip_w ) -{ - // TODO: unsure about how this works, Charles says it swaps the nibble but afaik it's used for CPU tiles in Night Gal Summer/Sexy Gal and they seems fine? - // Maybe flipx is actually bltflip for later HW? - m_bltflip = true; -} - -READ_LINE_MEMBER( jangou_blitter_device::status_r ) -{ - return false; -} diff --git a/src/devices/video/jangou_blitter.h b/src/devices/video/jangou_blitter.h deleted file mode 100644 index 7a39172e7ca..00000000000 --- a/src/devices/video/jangou_blitter.h +++ /dev/null @@ -1,71 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Angelo Salese -/*************************************************************************** - -Template for skeleton device - -***************************************************************************/ - -#pragma once - -#ifndef __JANGOU_BLITTERDEV_H__ -#define __JANGOU_BLITTERDEV_H__ - - - -//************************************************************************** -// INTERFACE CONFIGURATION MACROS -//************************************************************************** - -#define MCFG_JANGOU_BLITTER_ADD(_tag,_freq) \ - MCFG_DEVICE_ADD(_tag, JANGOU_BLITTER, _freq) - -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** - -// ======================> jangou_blitter_device - -class jangou_blitter_device : public device_t -{ -public: - // construction/destruction - jangou_blitter_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); - - // I/O operations - DECLARE_WRITE8_MEMBER( process_w ); - DECLARE_WRITE8_MEMBER( alt_process_w ); - DECLARE_WRITE8_MEMBER( vregs_w ); - DECLARE_WRITE8_MEMBER( bltflip_w ); - DECLARE_READ_LINE_MEMBER( status_r ); - - UINT8 m_blit_buffer[256 * 256]; - -protected: - // device-level overrides - virtual void device_start() override; - virtual void device_reset() override; - -private: - void plot_gfx_pixel( UINT8 pix, int x, int y ); - UINT8 gfx_nibble( UINT32 niboffset ); - UINT8 m_pen_data[0x10]; - UINT8 m_blit_data[7]; - UINT8 *m_gfxrom; - UINT32 m_gfxrommask; - bool m_bltflip; -}; - - -// device type definition -extern const device_type JANGOU_BLITTER; - - - -//************************************************************************** -// GLOBAL VARIABLES -//************************************************************************** - - - -#endif diff --git a/src/devices/video/mc6845.cpp b/src/devices/video/mc6845.cpp index 04e7c967869..57813f574ab 100644 --- a/src/devices/video/mc6845.cpp +++ b/src/devices/video/mc6845.cpp @@ -553,8 +553,7 @@ void mc6845_device::recompute_parameters(bool postload) m_hsync_off_pos = hsync_off_pos; m_vsync_on_pos = vsync_on_pos; m_vsync_off_pos = vsync_off_pos; - if (!postload) // set m_line_counter to 0 on normal operation, but not on postload - m_line_counter = 0; + m_line_counter = 0; } } diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp index 32d4d2c3c63..23548f1ecd7 100644 --- a/src/devices/video/upd7220.cpp +++ b/src/devices/video/upd7220.cpp @@ -71,8 +71,7 @@ enum COMMAND_LPRD, COMMAND_DMAR, COMMAND_DMAW, - COMMAND_5A, - COMMAND_05 + COMMAND_5A }; enum @@ -94,7 +93,6 @@ enum #define UPD7220_COMMAND_CCHAR 0x4b #define UPD7220_COMMAND_START 0x6b #define UPD7220_COMMAND_BCTRL 0x0c // & 0xfe -#define UPD7220_COMMAND_05 0x05 #define UPD7220_COMMAND_ZOOM 0x46 #define UPD7220_COMMAND_CURS 0x49 #define UPD7220_COMMAND_PRAM 0x70 // & 0xf0 @@ -1051,7 +1049,6 @@ int upd7220_device::translate_command(UINT8 data) case UPD7220_COMMAND_CURD: command = COMMAND_CURD; break; case UPD7220_COMMAND_LPRD: command = COMMAND_LPRD; break; case UPD7220_COMMAND_5A: command = COMMAND_5A; break; - case UPD7220_COMMAND_05: command = COMMAND_05; break; default: switch (data & 0xfe) { @@ -1229,10 +1226,6 @@ void upd7220_device::process_fifo() //LOG(("uPD7220 '%s' DE: 1\n", tag())); break; - case COMMAND_05: - m_de = 0; - break; - case COMMAND_BCTRL: /* display blanking control */ m_de = m_cr & 0x01; diff --git a/src/devices/video/vooddefs.h b/src/devices/video/vooddefs.h index 5bef9d4cc8e..e394946d445 100644 --- a/src/devices/video/vooddefs.h +++ b/src/devices/video/vooddefs.h @@ -9,6 +9,1349 @@ ***************************************************************************/ +/************************************* + * + * Misc. constants + * + *************************************/ + +/* enumeration describing reasons we might be stalled */ +enum +{ + NOT_STALLED = 0, + STALLED_UNTIL_FIFO_LWM, + STALLED_UNTIL_FIFO_EMPTY +}; + + + +// Use old table lookup versus straight double divide +#define USE_FAST_RECIP 0 + +/* maximum number of TMUs */ +#define MAX_TMU 2 + +/* accumulate operations less than this number of clocks */ +#define ACCUMULATE_THRESHOLD 0 + +/* number of clocks to set up a triangle (just a guess) */ +#define TRIANGLE_SETUP_CLOCKS 100 + +/* maximum number of rasterizers */ +#define MAX_RASTERIZERS 1024 + +/* size of the rasterizer hash table */ +#define RASTER_HASH_SIZE 97 + +/* flags for LFB writes */ +#define LFB_RGB_PRESENT 1 +#define LFB_ALPHA_PRESENT 2 +#define LFB_DEPTH_PRESENT 4 +#define LFB_DEPTH_PRESENT_MSW 8 + +/* flags for the register access array */ +#define REGISTER_READ 0x01 /* reads are allowed */ +#define REGISTER_WRITE 0x02 /* writes are allowed */ +#define REGISTER_PIPELINED 0x04 /* writes are pipelined */ +#define REGISTER_FIFO 0x08 /* writes go to FIFO */ +#define REGISTER_WRITETHRU 0x10 /* writes are valid even for CMDFIFO */ + +/* shorter combinations to make the table smaller */ +#define REG_R (REGISTER_READ) +#define REG_W (REGISTER_WRITE) +#define REG_WT (REGISTER_WRITE | REGISTER_WRITETHRU) +#define REG_RW (REGISTER_READ | REGISTER_WRITE) +#define REG_RWT (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU) +#define REG_RP (REGISTER_READ | REGISTER_PIPELINED) +#define REG_WP (REGISTER_WRITE | REGISTER_PIPELINED) +#define REG_RWP (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED) +#define REG_RWPT (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU) +#define REG_RF (REGISTER_READ | REGISTER_FIFO) +#define REG_WF (REGISTER_WRITE | REGISTER_FIFO) +#define REG_RWF (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO) +#define REG_RPF (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO) +#define REG_WPF (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) +#define REG_RWPF (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) + +/* lookup bits is the log2 of the size of the reciprocal/log table */ +#define RECIPLOG_LOOKUP_BITS 9 + +/* input precision is how many fraction bits the input value has; this is a 64-bit number */ +#define RECIPLOG_INPUT_PREC 32 + +/* lookup precision is how many fraction bits each table entry contains */ +#define RECIPLOG_LOOKUP_PREC 22 + +/* output precision is how many fraction bits the result should have */ +#define RECIP_OUTPUT_PREC 15 +#define LOG_OUTPUT_PREC 8 + + + +/************************************* + * + * Register constants + * + *************************************/ + +/* Codes to the right: + R = readable + W = writeable + P = pipelined + F = goes to FIFO +*/ + +/* 0x000 */ +#define status (0x000/4) /* R P */ +#define intrCtrl (0x004/4) /* RW P -- Voodoo2/Banshee only */ +#define vertexAx (0x008/4) /* W PF */ +#define vertexAy (0x00c/4) /* W PF */ +#define vertexBx (0x010/4) /* W PF */ +#define vertexBy (0x014/4) /* W PF */ +#define vertexCx (0x018/4) /* W PF */ +#define vertexCy (0x01c/4) /* W PF */ +#define startR (0x020/4) /* W PF */ +#define startG (0x024/4) /* W PF */ +#define startB (0x028/4) /* W PF */ +#define startZ (0x02c/4) /* W PF */ +#define startA (0x030/4) /* W PF */ +#define startS (0x034/4) /* W PF */ +#define startT (0x038/4) /* W PF */ +#define startW (0x03c/4) /* W PF */ + +/* 0x040 */ +#define dRdX (0x040/4) /* W PF */ +#define dGdX (0x044/4) /* W PF */ +#define dBdX (0x048/4) /* W PF */ +#define dZdX (0x04c/4) /* W PF */ +#define dAdX (0x050/4) /* W PF */ +#define dSdX (0x054/4) /* W PF */ +#define dTdX (0x058/4) /* W PF */ +#define dWdX (0x05c/4) /* W PF */ +#define dRdY (0x060/4) /* W PF */ +#define dGdY (0x064/4) /* W PF */ +#define dBdY (0x068/4) /* W PF */ +#define dZdY (0x06c/4) /* W PF */ +#define dAdY (0x070/4) /* W PF */ +#define dSdY (0x074/4) /* W PF */ +#define dTdY (0x078/4) /* W PF */ +#define dWdY (0x07c/4) /* W PF */ + +/* 0x080 */ +#define triangleCMD (0x080/4) /* W PF */ +#define fvertexAx (0x088/4) /* W PF */ +#define fvertexAy (0x08c/4) /* W PF */ +#define fvertexBx (0x090/4) /* W PF */ +#define fvertexBy (0x094/4) /* W PF */ +#define fvertexCx (0x098/4) /* W PF */ +#define fvertexCy (0x09c/4) /* W PF */ +#define fstartR (0x0a0/4) /* W PF */ +#define fstartG (0x0a4/4) /* W PF */ +#define fstartB (0x0a8/4) /* W PF */ +#define fstartZ (0x0ac/4) /* W PF */ +#define fstartA (0x0b0/4) /* W PF */ +#define fstartS (0x0b4/4) /* W PF */ +#define fstartT (0x0b8/4) /* W PF */ +#define fstartW (0x0bc/4) /* W PF */ + +/* 0x0c0 */ +#define fdRdX (0x0c0/4) /* W PF */ +#define fdGdX (0x0c4/4) /* W PF */ +#define fdBdX (0x0c8/4) /* W PF */ +#define fdZdX (0x0cc/4) /* W PF */ +#define fdAdX (0x0d0/4) /* W PF */ +#define fdSdX (0x0d4/4) /* W PF */ +#define fdTdX (0x0d8/4) /* W PF */ +#define fdWdX (0x0dc/4) /* W PF */ +#define fdRdY (0x0e0/4) /* W PF */ +#define fdGdY (0x0e4/4) /* W PF */ +#define fdBdY (0x0e8/4) /* W PF */ +#define fdZdY (0x0ec/4) /* W PF */ +#define fdAdY (0x0f0/4) /* W PF */ +#define fdSdY (0x0f4/4) /* W PF */ +#define fdTdY (0x0f8/4) /* W PF */ +#define fdWdY (0x0fc/4) /* W PF */ + +/* 0x100 */ +#define ftriangleCMD (0x100/4) /* W PF */ +#define fbzColorPath (0x104/4) /* RW PF */ +#define fogMode (0x108/4) /* RW PF */ +#define alphaMode (0x10c/4) /* RW PF */ +#define fbzMode (0x110/4) /* RW F */ +#define lfbMode (0x114/4) /* RW F */ +#define clipLeftRight (0x118/4) /* RW F */ +#define clipLowYHighY (0x11c/4) /* RW F */ +#define nopCMD (0x120/4) /* W F */ +#define fastfillCMD (0x124/4) /* W F */ +#define swapbufferCMD (0x128/4) /* W F */ +#define fogColor (0x12c/4) /* W F */ +#define zaColor (0x130/4) /* W F */ +#define chromaKey (0x134/4) /* W F */ +#define chromaRange (0x138/4) /* W F -- Voodoo2/Banshee only */ +#define userIntrCMD (0x13c/4) /* W F -- Voodoo2/Banshee only */ + +/* 0x140 */ +#define stipple (0x140/4) /* RW F */ +#define color0 (0x144/4) /* RW F */ +#define color1 (0x148/4) /* RW F */ +#define fbiPixelsIn (0x14c/4) /* R */ +#define fbiChromaFail (0x150/4) /* R */ +#define fbiZfuncFail (0x154/4) /* R */ +#define fbiAfuncFail (0x158/4) /* R */ +#define fbiPixelsOut (0x15c/4) /* R */ +#define fogTable (0x160/4) /* W F */ + +/* 0x1c0 */ +#define cmdFifoBaseAddr (0x1e0/4) /* RW -- Voodoo2 only */ +#define cmdFifoBump (0x1e4/4) /* RW -- Voodoo2 only */ +#define cmdFifoRdPtr (0x1e8/4) /* RW -- Voodoo2 only */ +#define cmdFifoAMin (0x1ec/4) /* RW -- Voodoo2 only */ +#define colBufferAddr (0x1ec/4) /* RW -- Banshee only */ +#define cmdFifoAMax (0x1f0/4) /* RW -- Voodoo2 only */ +#define colBufferStride (0x1f0/4) /* RW -- Banshee only */ +#define cmdFifoDepth (0x1f4/4) /* RW -- Voodoo2 only */ +#define auxBufferAddr (0x1f4/4) /* RW -- Banshee only */ +#define cmdFifoHoles (0x1f8/4) /* RW -- Voodoo2 only */ +#define auxBufferStride (0x1f8/4) /* RW -- Banshee only */ + +/* 0x200 */ +#define fbiInit4 (0x200/4) /* RW -- Voodoo/Voodoo2 only */ +#define clipLeftRight1 (0x200/4) /* RW -- Banshee only */ +#define vRetrace (0x204/4) /* R -- Voodoo/Voodoo2 only */ +#define clipTopBottom1 (0x204/4) /* RW -- Banshee only */ +#define backPorch (0x208/4) /* RW -- Voodoo/Voodoo2 only */ +#define videoDimensions (0x20c/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit0 (0x210/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit1 (0x214/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit2 (0x218/4) /* RW -- Voodoo/Voodoo2 only */ +#define fbiInit3 (0x21c/4) /* RW -- Voodoo/Voodoo2 only */ +#define hSync (0x220/4) /* W -- Voodoo/Voodoo2 only */ +#define vSync (0x224/4) /* W -- Voodoo/Voodoo2 only */ +#define clutData (0x228/4) /* W F -- Voodoo/Voodoo2 only */ +#define dacData (0x22c/4) /* W -- Voodoo/Voodoo2 only */ +#define maxRgbDelta (0x230/4) /* W -- Voodoo/Voodoo2 only */ +#define hBorder (0x234/4) /* W -- Voodoo2 only */ +#define vBorder (0x238/4) /* W -- Voodoo2 only */ +#define borderColor (0x23c/4) /* W -- Voodoo2 only */ + +/* 0x240 */ +#define hvRetrace (0x240/4) /* R -- Voodoo2 only */ +#define fbiInit5 (0x244/4) /* RW -- Voodoo2 only */ +#define fbiInit6 (0x248/4) /* RW -- Voodoo2 only */ +#define fbiInit7 (0x24c/4) /* RW -- Voodoo2 only */ +#define swapPending (0x24c/4) /* W -- Banshee only */ +#define leftOverlayBuf (0x250/4) /* W -- Banshee only */ +#define rightOverlayBuf (0x254/4) /* W -- Banshee only */ +#define fbiSwapHistory (0x258/4) /* R -- Voodoo2/Banshee only */ +#define fbiTrianglesOut (0x25c/4) /* R -- Voodoo2/Banshee only */ +#define sSetupMode (0x260/4) /* W PF -- Voodoo2/Banshee only */ +#define sVx (0x264/4) /* W PF -- Voodoo2/Banshee only */ +#define sVy (0x268/4) /* W PF -- Voodoo2/Banshee only */ +#define sARGB (0x26c/4) /* W PF -- Voodoo2/Banshee only */ +#define sRed (0x270/4) /* W PF -- Voodoo2/Banshee only */ +#define sGreen (0x274/4) /* W PF -- Voodoo2/Banshee only */ +#define sBlue (0x278/4) /* W PF -- Voodoo2/Banshee only */ +#define sAlpha (0x27c/4) /* W PF -- Voodoo2/Banshee only */ + +/* 0x280 */ +#define sVz (0x280/4) /* W PF -- Voodoo2/Banshee only */ +#define sWb (0x284/4) /* W PF -- Voodoo2/Banshee only */ +#define sWtmu0 (0x288/4) /* W PF -- Voodoo2/Banshee only */ +#define sS_W0 (0x28c/4) /* W PF -- Voodoo2/Banshee only */ +#define sT_W0 (0x290/4) /* W PF -- Voodoo2/Banshee only */ +#define sWtmu1 (0x294/4) /* W PF -- Voodoo2/Banshee only */ +#define sS_Wtmu1 (0x298/4) /* W PF -- Voodoo2/Banshee only */ +#define sT_Wtmu1 (0x29c/4) /* W PF -- Voodoo2/Banshee only */ +#define sDrawTriCMD (0x2a0/4) /* W PF -- Voodoo2/Banshee only */ +#define sBeginTriCMD (0x2a4/4) /* W PF -- Voodoo2/Banshee only */ + +/* 0x2c0 */ +#define bltSrcBaseAddr (0x2c0/4) /* RW PF -- Voodoo2 only */ +#define bltDstBaseAddr (0x2c4/4) /* RW PF -- Voodoo2 only */ +#define bltXYStrides (0x2c8/4) /* RW PF -- Voodoo2 only */ +#define bltSrcChromaRange (0x2cc/4) /* RW PF -- Voodoo2 only */ +#define bltDstChromaRange (0x2d0/4) /* RW PF -- Voodoo2 only */ +#define bltClipX (0x2d4/4) /* RW PF -- Voodoo2 only */ +#define bltClipY (0x2d8/4) /* RW PF -- Voodoo2 only */ +#define bltSrcXY (0x2e0/4) /* RW PF -- Voodoo2 only */ +#define bltDstXY (0x2e4/4) /* RW PF -- Voodoo2 only */ +#define bltSize (0x2e8/4) /* RW PF -- Voodoo2 only */ +#define bltRop (0x2ec/4) /* RW PF -- Voodoo2 only */ +#define bltColor (0x2f0/4) /* RW PF -- Voodoo2 only */ +#define bltCommand (0x2f8/4) /* RW PF -- Voodoo2 only */ +#define bltData (0x2fc/4) /* W PF -- Voodoo2 only */ + +/* 0x300 */ +#define textureMode (0x300/4) /* W PF */ +#define tLOD (0x304/4) /* W PF */ +#define tDetail (0x308/4) /* W PF */ +#define texBaseAddr (0x30c/4) /* W PF */ +#define texBaseAddr_1 (0x310/4) /* W PF */ +#define texBaseAddr_2 (0x314/4) /* W PF */ +#define texBaseAddr_3_8 (0x318/4) /* W PF */ +#define trexInit0 (0x31c/4) /* W F -- Voodoo/Voodoo2 only */ +#define trexInit1 (0x320/4) /* W F */ +#define nccTable (0x324/4) /* W F */ + + + +// 2D registers +#define banshee2D_clip0Min (0x008/4) +#define banshee2D_clip0Max (0x00c/4) +#define banshee2D_dstBaseAddr (0x010/4) +#define banshee2D_dstFormat (0x014/4) +#define banshee2D_srcColorkeyMin (0x018/4) +#define banshee2D_srcColorkeyMax (0x01c/4) +#define banshee2D_dstColorkeyMin (0x020/4) +#define banshee2D_dstColorkeyMax (0x024/4) +#define banshee2D_bresError0 (0x028/4) +#define banshee2D_bresError1 (0x02c/4) +#define banshee2D_rop (0x030/4) +#define banshee2D_srcBaseAddr (0x034/4) +#define banshee2D_commandExtra (0x038/4) +#define banshee2D_lineStipple (0x03c/4) +#define banshee2D_lineStyle (0x040/4) +#define banshee2D_pattern0Alias (0x044/4) +#define banshee2D_pattern1Alias (0x048/4) +#define banshee2D_clip1Min (0x04c/4) +#define banshee2D_clip1Max (0x050/4) +#define banshee2D_srcFormat (0x054/4) +#define banshee2D_srcSize (0x058/4) +#define banshee2D_srcXY (0x05c/4) +#define banshee2D_colorBack (0x060/4) +#define banshee2D_colorFore (0x064/4) +#define banshee2D_dstSize (0x068/4) +#define banshee2D_dstXY (0x06c/4) +#define banshee2D_command (0x070/4) + + +/************************************* + * + * Alias map of the first 64 + * registers when remapped + * + *************************************/ + +static const UINT8 register_alias_map[0x40] = +{ + status, 0x004/4, vertexAx, vertexAy, + vertexBx, vertexBy, vertexCx, vertexCy, + startR, dRdX, dRdY, startG, + dGdX, dGdY, startB, dBdX, + dBdY, startZ, dZdX, dZdY, + startA, dAdX, dAdY, startS, + dSdX, dSdY, startT, dTdX, + dTdY, startW, dWdX, dWdY, + + triangleCMD,0x084/4, fvertexAx, fvertexAy, + fvertexBx, fvertexBy, fvertexCx, fvertexCy, + fstartR, fdRdX, fdRdY, fstartG, + fdGdX, fdGdY, fstartB, fdBdX, + fdBdY, fstartZ, fdZdX, fdZdY, + fstartA, fdAdX, fdAdY, fstartS, + fdSdX, fdSdY, fstartT, fdTdX, + fdTdY, fstartW, fdWdX, fdWdY +}; + + + +/************************************* + * + * Table of per-register access rights + * + *************************************/ + +static const UINT8 voodoo_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, 0, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, 0, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, 0, 0, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x200 */ + REG_RW, REG_R, REG_RW, REG_RW, + REG_RW, REG_RW, REG_RW, REG_RW, + REG_W, REG_W, REG_W, REG_W, + REG_W, 0, 0, 0, + + /* 0x240 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x280 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + +static const UINT8 voodoo2_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, REG_RWPT, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_RWT, REG_RWT, REG_RWT, REG_RWT, + REG_RWT, REG_RWT, REG_RWT, REG_RW, + + /* 0x200 */ + REG_RWT, REG_R, REG_RWT, REG_RWT, + REG_RWT, REG_RWT, REG_RWT, REG_RWT, + REG_WT, REG_WT, REG_WF, REG_WT, + REG_WT, REG_WT, REG_WT, REG_WT, + + /* 0x240 */ + REG_R, REG_RWT, REG_RWT, REG_RWT, + 0, 0, REG_R, REG_R, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x280 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWPF, REG_RWPF, REG_RWPF, REG_WPF, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + +static const UINT8 banshee_register_access[0x100] = +{ + /* 0x000 */ + REG_RP, REG_RWPT, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x040 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x080 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x0c0 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x100 */ + REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, + REG_RWF, REG_RWF, REG_RWF, REG_RWF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x140 */ + REG_RWF, REG_RWF, REG_RWF, REG_R, + REG_R, REG_R, REG_R, REG_R, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x180 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x1c0 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + 0, 0, 0, REG_RWF, + REG_RWF, REG_RWF, REG_RWF, 0, + + /* 0x200 */ + REG_RWF, REG_RWF, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x240 */ + 0, 0, 0, REG_WT, + REG_RWF, REG_RWF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_R, REG_R, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + + /* 0x280 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, 0, 0, + 0, 0, 0, 0, + + /* 0x2c0 */ + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + 0, 0, 0, 0, + + /* 0x300 */ + REG_WPF, REG_WPF, REG_WPF, REG_WPF, + REG_WPF, REG_WPF, REG_WPF, 0, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x340 */ + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + REG_WF, REG_WF, REG_WF, REG_WF, + + /* 0x380 */ + REG_WF +}; + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const voodoo_reg_name[] = +{ + /* 0x000 */ + "status", "{intrCtrl}", "vertexAx", "vertexAy", + "vertexBx", "vertexBy", "vertexCx", "vertexCy", + "startR", "startG", "startB", "startZ", + "startA", "startS", "startT", "startW", + /* 0x040 */ + "dRdX", "dGdX", "dBdX", "dZdX", + "dAdX", "dSdX", "dTdX", "dWdX", + "dRdY", "dGdY", "dBdY", "dZdY", + "dAdY", "dSdY", "dTdY", "dWdY", + /* 0x080 */ + "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", + "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", + "fstartR", "fstartG", "fstartB", "fstartZ", + "fstartA", "fstartS", "fstartT", "fstartW", + /* 0x0c0 */ + "fdRdX", "fdGdX", "fdBdX", "fdZdX", + "fdAdX", "fdSdX", "fdTdX", "fdWdX", + "fdRdY", "fdGdY", "fdBdY", "fdZdY", + "fdAdY", "fdSdY", "fdTdY", "fdWdY", + /* 0x100 */ + "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", + "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", + "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", + "zaColor", "chromaKey", "{chromaRange}","{userIntrCMD}", + /* 0x140 */ + "stipple", "color0", "color1", "fbiPixelsIn", + "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", + "fogTable160", "fogTable164", "fogTable168", "fogTable16c", + "fogTable170", "fogTable174", "fogTable178", "fogTable17c", + /* 0x180 */ + "fogTable180", "fogTable184", "fogTable188", "fogTable18c", + "fogTable190", "fogTable194", "fogTable198", "fogTable19c", + "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", + "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", + /* 0x1c0 */ + "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", + "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", + "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}", + "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc", + /* 0x200 */ + "fbiInit4", "vRetrace", "backPorch", "videoDimensions", + "fbiInit0", "fbiInit1", "fbiInit2", "fbiInit3", + "hSync", "vSync", "clutData", "dacData", + "maxRgbDelta", "{hBorder}", "{vBorder}", "{borderColor}", + /* 0x240 */ + "{hvRetrace}", "{fbiInit5}", "{fbiInit6}", "{fbiInit7}", + "reserved250", "reserved254", "{fbiSwapHistory}","{fbiTrianglesOut}", + "{sSetupMode}", "{sVx}", "{sVy}", "{sARGB}", + "{sRed}", "{sGreen}", "{sBlue}", "{sAlpha}", + /* 0x280 */ + "{sVz}", "{sWb}", "{sWtmu0}", "{sS/Wtmu0}", + "{sT/Wtmu0}", "{sWtmu1}", "{sS/Wtmu1}", "{sT/Wtmu1}", + "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac", + "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", + /* 0x2c0 */ + "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}", + "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc", + "{bltSrcXY}", "{bltDstXY}", "{bltSize}", "{bltRop}", + "{bltColor}", "reserved2f4", "{bltCommand}", "{bltData}", + /* 0x300 */ + "textureMode", "tLOD", "tDetail", "texBaseAddr", + "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0", + "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", + "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", + /* 0x340 */ + "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", + "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", + "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", + "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", + /* 0x380 */ + "nccTable1.B" +}; + + +static const char *const banshee_reg_name[] = +{ + /* 0x000 */ + "status", "intrCtrl", "vertexAx", "vertexAy", + "vertexBx", "vertexBy", "vertexCx", "vertexCy", + "startR", "startG", "startB", "startZ", + "startA", "startS", "startT", "startW", + /* 0x040 */ + "dRdX", "dGdX", "dBdX", "dZdX", + "dAdX", "dSdX", "dTdX", "dWdX", + "dRdY", "dGdY", "dBdY", "dZdY", + "dAdY", "dSdY", "dTdY", "dWdY", + /* 0x080 */ + "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", + "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", + "fstartR", "fstartG", "fstartB", "fstartZ", + "fstartA", "fstartS", "fstartT", "fstartW", + /* 0x0c0 */ + "fdRdX", "fdGdX", "fdBdX", "fdZdX", + "fdAdX", "fdSdX", "fdTdX", "fdWdX", + "fdRdY", "fdGdY", "fdBdY", "fdZdY", + "fdAdY", "fdSdY", "fdTdY", "fdWdY", + /* 0x100 */ + "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", + "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", + "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", + "zaColor", "chromaKey", "chromaRange", "userIntrCMD", + /* 0x140 */ + "stipple", "color0", "color1", "fbiPixelsIn", + "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", + "fogTable160", "fogTable164", "fogTable168", "fogTable16c", + "fogTable170", "fogTable174", "fogTable178", "fogTable17c", + /* 0x180 */ + "fogTable180", "fogTable184", "fogTable188", "fogTable18c", + "fogTable190", "fogTable194", "fogTable198", "fogTable19c", + "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", + "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", + /* 0x1c0 */ + "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", + "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", + "reserved1e0", "reserved1e4", "reserved1e8", "colBufferAddr", + "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc", + /* 0x200 */ + "clipLeftRight1","clipTopBottom1","reserved208","reserved20c", + "reserved210", "reserved214", "reserved218", "reserved21c", + "reserved220", "reserved224", "reserved228", "reserved22c", + "reserved230", "reserved234", "reserved238", "reserved23c", + /* 0x240 */ + "reserved240", "reserved244", "reserved248", "swapPending", + "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut", + "sSetupMode", "sVx", "sVy", "sARGB", + "sRed", "sGreen", "sBlue", "sAlpha", + /* 0x280 */ + "sVz", "sWb", "sWtmu0", "sS/Wtmu0", + "sT/Wtmu0", "sWtmu1", "sS/Wtmu1", "sT/Wtmu1", + "sDrawTriCMD", "sBeginTriCMD", "reserved2a8", "reserved2ac", + "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", + /* 0x2c0 */ + "reserved2c0", "reserved2c4", "reserved2c8", "reserved2cc", + "reserved2d0", "reserved2d4", "reserved2d8", "reserved2dc", + "reserved2e0", "reserved2e4", "reserved2e8", "reserved2ec", + "reserved2f0", "reserved2f4", "reserved2f8", "reserved2fc", + /* 0x300 */ + "textureMode", "tLOD", "tDetail", "texBaseAddr", + "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c", + "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", + "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", + /* 0x340 */ + "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", + "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", + "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", + "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", + /* 0x380 */ + "nccTable1.B" +}; + + + +/************************************* + * + * Voodoo Banshee I/O space registers + * + *************************************/ + +/* 0x000 */ +#define io_status (0x000/4) /* */ +#define io_pciInit0 (0x004/4) /* */ +#define io_sipMonitor (0x008/4) /* */ +#define io_lfbMemoryConfig (0x00c/4) /* */ +#define io_miscInit0 (0x010/4) /* */ +#define io_miscInit1 (0x014/4) /* */ +#define io_dramInit0 (0x018/4) /* */ +#define io_dramInit1 (0x01c/4) /* */ +#define io_agpInit (0x020/4) /* */ +#define io_tmuGbeInit (0x024/4) /* */ +#define io_vgaInit0 (0x028/4) /* */ +#define io_vgaInit1 (0x02c/4) /* */ +#define io_dramCommand (0x030/4) /* */ +#define io_dramData (0x034/4) /* */ + +/* 0x040 */ +#define io_pllCtrl0 (0x040/4) /* */ +#define io_pllCtrl1 (0x044/4) /* */ +#define io_pllCtrl2 (0x048/4) /* */ +#define io_dacMode (0x04c/4) /* */ +#define io_dacAddr (0x050/4) /* */ +#define io_dacData (0x054/4) /* */ +#define io_rgbMaxDelta (0x058/4) /* */ +#define io_vidProcCfg (0x05c/4) /* */ +#define io_hwCurPatAddr (0x060/4) /* */ +#define io_hwCurLoc (0x064/4) /* */ +#define io_hwCurC0 (0x068/4) /* */ +#define io_hwCurC1 (0x06c/4) /* */ +#define io_vidInFormat (0x070/4) /* */ +#define io_vidInStatus (0x074/4) /* */ +#define io_vidSerialParallelPort (0x078/4) /* */ +#define io_vidInXDecimDeltas (0x07c/4) /* */ + +/* 0x080 */ +#define io_vidInDecimInitErrs (0x080/4) /* */ +#define io_vidInYDecimDeltas (0x084/4) /* */ +#define io_vidPixelBufThold (0x088/4) /* */ +#define io_vidChromaMin (0x08c/4) /* */ +#define io_vidChromaMax (0x090/4) /* */ +#define io_vidCurrentLine (0x094/4) /* */ +#define io_vidScreenSize (0x098/4) /* */ +#define io_vidOverlayStartCoords (0x09c/4) /* */ +#define io_vidOverlayEndScreenCoord (0x0a0/4) /* */ +#define io_vidOverlayDudx (0x0a4/4) /* */ +#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4) /* */ +#define io_vidOverlayDvdy (0x0ac/4) /* */ +#define io_vgab0 (0x0b0/4) /* */ +#define io_vgab4 (0x0b4/4) /* */ +#define io_vgab8 (0x0b8/4) /* */ +#define io_vgabc (0x0bc/4) /* */ + +/* 0x0c0 */ +#define io_vgac0 (0x0c0/4) /* */ +#define io_vgac4 (0x0c4/4) /* */ +#define io_vgac8 (0x0c8/4) /* */ +#define io_vgacc (0x0cc/4) /* */ +#define io_vgad0 (0x0d0/4) /* */ +#define io_vgad4 (0x0d4/4) /* */ +#define io_vgad8 (0x0d8/4) /* */ +#define io_vgadc (0x0dc/4) /* */ +#define io_vidOverlayDvdyOffset (0x0e0/4) /* */ +#define io_vidDesktopStartAddr (0x0e4/4) /* */ +#define io_vidDesktopOverlayStride (0x0e8/4) /* */ +#define io_vidInAddr0 (0x0ec/4) /* */ +#define io_vidInAddr1 (0x0f0/4) /* */ +#define io_vidInAddr2 (0x0f4/4) /* */ +#define io_vidInStride (0x0f8/4) /* */ +#define io_vidCurrOverlayStartAddr (0x0fc/4) /* */ + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const banshee_io_reg_name[] = +{ + /* 0x000 */ + "status", "pciInit0", "sipMonitor", "lfbMemoryConfig", + "miscInit0", "miscInit1", "dramInit0", "dramInit1", + "agpInit", "tmuGbeInit", "vgaInit0", "vgaInit1", + "dramCommand", "dramData", "reserved38", "reserved3c", + + /* 0x040 */ + "pllCtrl0", "pllCtrl1", "pllCtrl2", "dacMode", + "dacAddr", "dacData", "rgbMaxDelta", "vidProcCfg", + "hwCurPatAddr", "hwCurLoc", "hwCurC0", "hwCurC1", + "vidInFormat", "vidInStatus", "vidSerialParallelPort","vidInXDecimDeltas", + + /* 0x080 */ + "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin", + "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords", + "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy", + "vga[b0]", "vga[b4]", "vga[b8]", "vga[bc]", + + /* 0x0c0 */ + "vga[c0]", "vga[c4]", "vga[c8]", "vga[cc]", + "vga[d0]", "vga[d4]", "vga[d8]", "vga[dc]", + "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0", + "vidInAddr1", "vidInAddr2", "vidInStride", "vidCurrOverlayStartAddr" +}; + + + +/************************************* + * + * Voodoo Banshee AGP space registers + * + *************************************/ + +/* 0x000 */ +#define agpReqSize (0x000/4) /* */ +#define agpHostAddressLow (0x004/4) /* */ +#define agpHostAddressHigh (0x008/4) /* */ +#define agpGraphicsAddress (0x00c/4) /* */ +#define agpGraphicsStride (0x010/4) /* */ +#define agpMoveCMD (0x014/4) /* */ +#define cmdBaseAddr0 (0x020/4) /* */ +#define cmdBaseSize0 (0x024/4) /* */ +#define cmdBump0 (0x028/4) /* */ +#define cmdRdPtrL0 (0x02c/4) /* */ +#define cmdRdPtrH0 (0x030/4) /* */ +#define cmdAMin0 (0x034/4) /* */ +#define cmdAMax0 (0x03c/4) /* */ + +/* 0x040 */ +#define cmdFifoDepth0 (0x044/4) /* */ +#define cmdHoleCnt0 (0x048/4) /* */ +#define cmdBaseAddr1 (0x050/4) /* */ +#define cmdBaseSize1 (0x054/4) /* */ +#define cmdBump1 (0x058/4) /* */ +#define cmdRdPtrL1 (0x05c/4) /* */ +#define cmdRdPtrH1 (0x060/4) /* */ +#define cmdAMin1 (0x064/4) /* */ +#define cmdAMax1 (0x06c/4) /* */ +#define cmdFifoDepth1 (0x074/4) /* */ +#define cmdHoleCnt1 (0x078/4) /* */ + +/* 0x080 */ +#define cmdFifoThresh (0x080/4) /* */ +#define cmdHoleInt (0x084/4) /* */ + +/* 0x100 */ +#define yuvBaseAddress (0x100/4) /* */ +#define yuvStride (0x104/4) /* */ +#define crc1 (0x120/4) /* */ +#define crc2 (0x130/4) /* */ + + + +/************************************* + * + * Register string table for debug + * + *************************************/ + +static const char *const banshee_agp_reg_name[] = +{ + /* 0x000 */ + "agpReqSize", "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress", + "agpGraphicsStride","agpMoveCMD","reserved18", "reserved1c", + "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0", "cmdRdPtrL0", + "cmdRdPtrH0", "cmdAMin0", "reserved38", "cmdAMax0", + + /* 0x040 */ + "reserved40", "cmdFifoDepth0","cmdHoleCnt0", "reserved4c", + "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1", "cmdRdPtrL1", + "cmdRdPtrH1", "cmdAMin1", "reserved68", "cmdAMax1", + "reserved70", "cmdFifoDepth1","cmdHoleCnt1", "reserved7c", + + /* 0x080 */ + "cmdFifoThresh","cmdHoleInt", "reserved88", "reserved8c", + "reserved90", "reserved94", "reserved98", "reserved9c", + "reserveda0", "reserveda4", "reserveda8", "reservedac", + "reservedb0", "reservedb4", "reservedb8", "reservedbc", + + /* 0x0c0 */ + "reservedc0", "reservedc4", "reservedc8", "reservedcc", + "reservedd0", "reservedd4", "reservedd8", "reserveddc", + "reservede0", "reservede4", "reservede8", "reservedec", + "reservedf0", "reservedf4", "reservedf8", "reservedfc", + + /* 0x100 */ + "yuvBaseAddress","yuvStride", "reserved108", "reserved10c", + "reserved110", "reserved114", "reserved118", "reserved11c", + "crc1", "reserved124", "reserved128", "reserved12c", + "crc2", "reserved134", "reserved138", "reserved13c" +}; + + + +/************************************* + * + * Dithering tables + * + *************************************/ + +static const UINT8 dither_matrix_4x4[16] = +{ + 0, 8, 2, 10, + 12, 4, 14, 6, + 3, 11, 1, 9, + 15, 7, 13, 5 +}; + +static const UINT8 dither_matrix_2x2[16] = +{ + 2, 10, 2, 10, + 14, 6, 14, 6, + 2, 10, 2, 10, + 14, 6, 14, 6 +}; + + + +/************************************* + * + * Macros for extracting pixels + * + *************************************/ + +#define EXTRACT_565_TO_888(val, a, b, c) \ + (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ + (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03); \ + (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); +#define EXTRACT_x555_TO_888(val, a, b, c) \ + (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07); \ + (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07); \ + (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); +#define EXTRACT_555x_TO_888(val, a, b, c) \ + (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ + (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07); \ + (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07); +#define EXTRACT_1555_TO_8888(val, a, b, c, d) \ + (a) = ((INT16)(val) >> 15) & 0xff; \ + EXTRACT_x555_TO_888(val, b, c, d) +#define EXTRACT_5551_TO_8888(val, a, b, c, d) \ + EXTRACT_555x_TO_888(val, a, b, c) \ + (d) = ((val) & 0x0001) ? 0xff : 0x00; +#define EXTRACT_x888_TO_888(val, a, b, c) \ + (a) = ((val) >> 16) & 0xff; \ + (b) = ((val) >> 8) & 0xff; \ + (c) = ((val) >> 0) & 0xff; +#define EXTRACT_888x_TO_888(val, a, b, c) \ + (a) = ((val) >> 24) & 0xff; \ + (b) = ((val) >> 16) & 0xff; \ + (c) = ((val) >> 8) & 0xff; +#define EXTRACT_8888_TO_8888(val, a, b, c, d) \ + (a) = ((val) >> 24) & 0xff; \ + (b) = ((val) >> 16) & 0xff; \ + (c) = ((val) >> 8) & 0xff; \ + (d) = ((val) >> 0) & 0xff; +#define EXTRACT_4444_TO_8888(val, a, b, c, d) \ + (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f); \ + (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f); \ + (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f); \ + (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f); +#define EXTRACT_332_TO_888(val, a, b, c) \ + (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \ + (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \ + (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03); + + +/************************************* + * + * Misc. macros + * + *************************************/ + +/* macro for clamping a value between minimum and maximum values */ +#define CLAMP(val,min,max) do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0) + +/* macro to compute the base 2 log for LOD calculations */ +#define LOGB2(x) (log((double)(x)) / log(2.0)) + + + +/************************************* + * + * Macros for extracting bitfields + * + *************************************/ + +#define INITEN_ENABLE_HW_INIT(val) (((val) >> 0) & 1) +#define INITEN_ENABLE_PCI_FIFO(val) (((val) >> 1) & 1) +#define INITEN_REMAP_INIT_TO_DAC(val) (((val) >> 2) & 1) +#define INITEN_ENABLE_SNOOP0(val) (((val) >> 4) & 1) +#define INITEN_SNOOP0_MEMORY_MATCH(val) (((val) >> 5) & 1) +#define INITEN_SNOOP0_READWRITE_MATCH(val) (((val) >> 6) & 1) +#define INITEN_ENABLE_SNOOP1(val) (((val) >> 7) & 1) +#define INITEN_SNOOP1_MEMORY_MATCH(val) (((val) >> 8) & 1) +#define INITEN_SNOOP1_READWRITE_MATCH(val) (((val) >> 9) & 1) +#define INITEN_SLI_BUS_OWNER(val) (((val) >> 10) & 1) +#define INITEN_SLI_ODD_EVEN(val) (((val) >> 11) & 1) +#define INITEN_SECONDARY_REV_ID(val) (((val) >> 12) & 0xf) /* voodoo 2 only */ +#define INITEN_MFCTR_FAB_ID(val) (((val) >> 16) & 0xf) /* voodoo 2 only */ +#define INITEN_ENABLE_PCI_INTERRUPT(val) (((val) >> 20) & 1) /* voodoo 2 only */ +#define INITEN_PCI_INTERRUPT_TIMEOUT(val) (((val) >> 21) & 1) /* voodoo 2 only */ +#define INITEN_ENABLE_NAND_TREE_TEST(val) (((val) >> 22) & 1) /* voodoo 2 only */ +#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1) /* voodoo 2 only */ +#define INITEN_SLI_SNOOP_ADDRESS(val) (((val) >> 24) & 0xff) /* voodoo 2 only */ + +#define FBZCP_CC_RGBSELECT(val) (((val) >> 0) & 3) +#define FBZCP_CC_ASELECT(val) (((val) >> 2) & 3) +#define FBZCP_CC_LOCALSELECT(val) (((val) >> 4) & 1) +#define FBZCP_CCA_LOCALSELECT(val) (((val) >> 5) & 3) +#define FBZCP_CC_LOCALSELECT_OVERRIDE(val) (((val) >> 7) & 1) +#define FBZCP_CC_ZERO_OTHER(val) (((val) >> 8) & 1) +#define FBZCP_CC_SUB_CLOCAL(val) (((val) >> 9) & 1) +#define FBZCP_CC_MSELECT(val) (((val) >> 10) & 7) +#define FBZCP_CC_REVERSE_BLEND(val) (((val) >> 13) & 1) +#define FBZCP_CC_ADD_ACLOCAL(val) (((val) >> 14) & 3) +#define FBZCP_CC_INVERT_OUTPUT(val) (((val) >> 16) & 1) +#define FBZCP_CCA_ZERO_OTHER(val) (((val) >> 17) & 1) +#define FBZCP_CCA_SUB_CLOCAL(val) (((val) >> 18) & 1) +#define FBZCP_CCA_MSELECT(val) (((val) >> 19) & 7) +#define FBZCP_CCA_REVERSE_BLEND(val) (((val) >> 22) & 1) +#define FBZCP_CCA_ADD_ACLOCAL(val) (((val) >> 23) & 3) +#define FBZCP_CCA_INVERT_OUTPUT(val) (((val) >> 25) & 1) +#define FBZCP_CCA_SUBPIXEL_ADJUST(val) (((val) >> 26) & 1) +#define FBZCP_TEXTURE_ENABLE(val) (((val) >> 27) & 1) +#define FBZCP_RGBZW_CLAMP(val) (((val) >> 28) & 1) /* voodoo 2 only */ +#define FBZCP_ANTI_ALIAS(val) (((val) >> 29) & 1) /* voodoo 2 only */ + +#define ALPHAMODE_ALPHATEST(val) (((val) >> 0) & 1) +#define ALPHAMODE_ALPHAFUNCTION(val) (((val) >> 1) & 7) +#define ALPHAMODE_ALPHABLEND(val) (((val) >> 4) & 1) +#define ALPHAMODE_ANTIALIAS(val) (((val) >> 5) & 1) +#define ALPHAMODE_SRCRGBBLEND(val) (((val) >> 8) & 15) +#define ALPHAMODE_DSTRGBBLEND(val) (((val) >> 12) & 15) +#define ALPHAMODE_SRCALPHABLEND(val) (((val) >> 16) & 15) +#define ALPHAMODE_DSTALPHABLEND(val) (((val) >> 20) & 15) +#define ALPHAMODE_ALPHAREF(val) (((val) >> 24) & 0xff) + +#define FOGMODE_ENABLE_FOG(val) (((val) >> 0) & 1) +#define FOGMODE_FOG_ADD(val) (((val) >> 1) & 1) +#define FOGMODE_FOG_MULT(val) (((val) >> 2) & 1) +#define FOGMODE_FOG_ZALPHA(val) (((val) >> 3) & 3) +#define FOGMODE_FOG_CONSTANT(val) (((val) >> 5) & 1) +#define FOGMODE_FOG_DITHER(val) (((val) >> 6) & 1) /* voodoo 2 only */ +#define FOGMODE_FOG_ZONES(val) (((val) >> 7) & 1) /* voodoo 2 only */ + +#define FBZMODE_ENABLE_CLIPPING(val) (((val) >> 0) & 1) +#define FBZMODE_ENABLE_CHROMAKEY(val) (((val) >> 1) & 1) +#define FBZMODE_ENABLE_STIPPLE(val) (((val) >> 2) & 1) +#define FBZMODE_WBUFFER_SELECT(val) (((val) >> 3) & 1) +#define FBZMODE_ENABLE_DEPTHBUF(val) (((val) >> 4) & 1) +#define FBZMODE_DEPTH_FUNCTION(val) (((val) >> 5) & 7) +#define FBZMODE_ENABLE_DITHERING(val) (((val) >> 8) & 1) +#define FBZMODE_RGB_BUFFER_MASK(val) (((val) >> 9) & 1) +#define FBZMODE_AUX_BUFFER_MASK(val) (((val) >> 10) & 1) +#define FBZMODE_DITHER_TYPE(val) (((val) >> 11) & 1) +#define FBZMODE_STIPPLE_PATTERN(val) (((val) >> 12) & 1) +#define FBZMODE_ENABLE_ALPHA_MASK(val) (((val) >> 13) & 1) +#define FBZMODE_DRAW_BUFFER(val) (((val) >> 14) & 3) +#define FBZMODE_ENABLE_DEPTH_BIAS(val) (((val) >> 16) & 1) +#define FBZMODE_Y_ORIGIN(val) (((val) >> 17) & 1) +#define FBZMODE_ENABLE_ALPHA_PLANES(val) (((val) >> 18) & 1) +#define FBZMODE_ALPHA_DITHER_SUBTRACT(val) (((val) >> 19) & 1) +#define FBZMODE_DEPTH_SOURCE_COMPARE(val) (((val) >> 20) & 1) +#define FBZMODE_DEPTH_FLOAT_SELECT(val) (((val) >> 21) & 1) /* voodoo 2 only */ + +#define LFBMODE_WRITE_FORMAT(val) (((val) >> 0) & 0xf) +#define LFBMODE_WRITE_BUFFER_SELECT(val) (((val) >> 4) & 3) +#define LFBMODE_READ_BUFFER_SELECT(val) (((val) >> 6) & 3) +#define LFBMODE_ENABLE_PIXEL_PIPELINE(val) (((val) >> 8) & 1) +#define LFBMODE_RGBA_LANES(val) (((val) >> 9) & 3) +#define LFBMODE_WORD_SWAP_WRITES(val) (((val) >> 11) & 1) +#define LFBMODE_BYTE_SWIZZLE_WRITES(val) (((val) >> 12) & 1) +#define LFBMODE_Y_ORIGIN(val) (((val) >> 13) & 1) +#define LFBMODE_WRITE_W_SELECT(val) (((val) >> 14) & 1) +#define LFBMODE_WORD_SWAP_READS(val) (((val) >> 15) & 1) +#define LFBMODE_BYTE_SWIZZLE_READS(val) (((val) >> 16) & 1) + +#define CHROMARANGE_BLUE_EXCLUSIVE(val) (((val) >> 24) & 1) +#define CHROMARANGE_GREEN_EXCLUSIVE(val) (((val) >> 25) & 1) +#define CHROMARANGE_RED_EXCLUSIVE(val) (((val) >> 26) & 1) +#define CHROMARANGE_UNION_MODE(val) (((val) >> 27) & 1) +#define CHROMARANGE_ENABLE(val) (((val) >> 28) & 1) + +#define FBIINIT0_VGA_PASSTHRU(val) (((val) >> 0) & 1) +#define FBIINIT0_GRAPHICS_RESET(val) (((val) >> 1) & 1) +#define FBIINIT0_FIFO_RESET(val) (((val) >> 2) & 1) +#define FBIINIT0_SWIZZLE_REG_WRITES(val) (((val) >> 3) & 1) +#define FBIINIT0_STALL_PCIE_FOR_HWM(val) (((val) >> 4) & 1) +#define FBIINIT0_PCI_FIFO_LWM(val) (((val) >> 6) & 0x1f) +#define FBIINIT0_LFB_TO_MEMORY_FIFO(val) (((val) >> 11) & 1) +#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1) +#define FBIINIT0_ENABLE_MEMORY_FIFO(val) (((val) >> 13) & 1) +#define FBIINIT0_MEMORY_FIFO_HWM(val) (((val) >> 14) & 0x7ff) +#define FBIINIT0_MEMORY_FIFO_BURST(val) (((val) >> 25) & 0x3f) + +#define FBIINIT1_PCI_DEV_FUNCTION(val) (((val) >> 0) & 1) +#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1) +#define FBIINIT1_MULTI_SST1(val) (((val) >> 2) & 1) /* not on voodoo 2 */ +#define FBIINIT1_ENABLE_LFB(val) (((val) >> 3) & 1) +#define FBIINIT1_X_VIDEO_TILES(val) (((val) >> 4) & 0xf) +#define FBIINIT1_VIDEO_TIMING_RESET(val) (((val) >> 8) & 1) +#define FBIINIT1_SOFTWARE_OVERRIDE(val) (((val) >> 9) & 1) +#define FBIINIT1_SOFTWARE_HSYNC(val) (((val) >> 10) & 1) +#define FBIINIT1_SOFTWARE_VSYNC(val) (((val) >> 11) & 1) +#define FBIINIT1_SOFTWARE_BLANK(val) (((val) >> 12) & 1) +#define FBIINIT1_DRIVE_VIDEO_TIMING(val) (((val) >> 13) & 1) +#define FBIINIT1_DRIVE_VIDEO_BLANK(val) (((val) >> 14) & 1) +#define FBIINIT1_DRIVE_VIDEO_SYNC(val) (((val) >> 15) & 1) +#define FBIINIT1_DRIVE_VIDEO_DCLK(val) (((val) >> 16) & 1) +#define FBIINIT1_VIDEO_TIMING_VCLK(val) (((val) >> 17) & 1) +#define FBIINIT1_VIDEO_CLK_2X_DELAY(val) (((val) >> 18) & 3) +#define FBIINIT1_VIDEO_TIMING_SOURCE(val) (((val) >> 20) & 3) +#define FBIINIT1_ENABLE_24BPP_OUTPUT(val) (((val) >> 22) & 1) +#define FBIINIT1_ENABLE_SLI(val) (((val) >> 23) & 1) +#define FBIINIT1_X_VIDEO_TILES_BIT5(val) (((val) >> 24) & 1) /* voodoo 2 only */ +#define FBIINIT1_ENABLE_EDGE_FILTER(val) (((val) >> 25) & 1) +#define FBIINIT1_INVERT_VID_CLK_2X(val) (((val) >> 26) & 1) +#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val) (((val) >> 27) & 3) +#define FBIINIT1_VID_CLK_DELAY(val) (((val) >> 29) & 3) +#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1) + +#define FBIINIT2_DISABLE_DITHER_SUB(val) (((val) >> 0) & 1) +#define FBIINIT2_DRAM_BANKING(val) (((val) >> 1) & 1) +#define FBIINIT2_ENABLE_TRIPLE_BUF(val) (((val) >> 4) & 1) +#define FBIINIT2_ENABLE_FAST_RAS_READ(val) (((val) >> 5) & 1) +#define FBIINIT2_ENABLE_GEN_DRAM_OE(val) (((val) >> 6) & 1) +#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1) +#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1) +#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3) +#define FBIINIT2_VIDEO_BUFFER_OFFSET(val) (((val) >> 11) & 0x1ff) +#define FBIINIT2_ENABLE_DRAM_BANKING(val) (((val) >> 20) & 1) +#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1) +#define FBIINIT2_ENABLE_DRAM_REFRESH(val) (((val) >> 22) & 1) +#define FBIINIT2_REFRESH_LOAD_VALUE(val) (((val) >> 23) & 0x1ff) + +#define FBIINIT3_TRI_REGISTER_REMAP(val) (((val) >> 0) & 1) +#define FBIINIT3_VIDEO_FIFO_THRESH(val) (((val) >> 1) & 0x1f) +#define FBIINIT3_DISABLE_TMUS(val) (((val) >> 6) & 1) +#define FBIINIT3_FBI_MEMORY_TYPE(val) (((val) >> 8) & 7) +#define FBIINIT3_VGA_PASS_RESET_VAL(val) (((val) >> 11) & 1) +#define FBIINIT3_HARDCODE_PCI_BASE(val) (((val) >> 12) & 1) +#define FBIINIT3_FBI2TREX_DELAY(val) (((val) >> 13) & 0xf) +#define FBIINIT3_TREX2FBI_DELAY(val) (((val) >> 17) & 0x1f) +#define FBIINIT3_YORIGIN_SUBTRACT(val) (((val) >> 22) & 0x3ff) + +#define FBIINIT4_PCI_READ_WAITS(val) (((val) >> 0) & 1) +#define FBIINIT4_ENABLE_LFB_READAHEAD(val) (((val) >> 1) & 1) +#define FBIINIT4_MEMORY_FIFO_LWM(val) (((val) >> 2) & 0x3f) +#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff) +#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val) (((val) >> 18) & 0x3ff) +#define FBIINIT4_VIDEO_CLOCKING_DELAY(val) (((val) >> 29) & 7) /* voodoo 2 only */ + +#define FBIINIT5_DISABLE_PCI_STOP(val) (((val) >> 0) & 1) /* voodoo 2 only */ +#define FBIINIT5_PCI_SLAVE_SPEED(val) (((val) >> 1) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_17_OUTPUT(val) (((val) >> 3) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_18_OUTPUT(val) (((val) >> 4) & 1) /* voodoo 2 only */ +#define FBIINIT5_GENERIC_STRAPPING(val) (((val) >> 5) & 0xf) /* voodoo 2 only */ +#define FBIINIT5_BUFFER_ALLOCATION(val) (((val) >> 9) & 3) /* voodoo 2 only */ +#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val) (((val) >> 11) & 1) /* voodoo 2 only */ +#define FBIINIT5_DRIVE_DAC_DATA_16(val) (((val) >> 12) & 1) /* voodoo 2 only */ +#define FBIINIT5_VCLK_INPUT_SELECT(val) (((val) >> 13) & 1) /* voodoo 2 only */ +#define FBIINIT5_MULTI_CVG_DETECT(val) (((val) >> 14) & 1) /* voodoo 2 only */ +#define FBIINIT5_SYNC_RETRACE_READS(val) (((val) >> 15) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1) /* voodoo 2 only */ +#define FBIINIT5_DOUBLE_HORIZ(val) (((val) >> 20) & 1) /* voodoo 2 only */ +#define FBIINIT5_DOUBLE_VERT(val) (((val) >> 21) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_16BIT_GAMMA(val) (((val) >> 22) & 1) /* voodoo 2 only */ +#define FBIINIT5_INVERT_DAC_HSYNC(val) (((val) >> 23) & 1) /* voodoo 2 only */ +#define FBIINIT5_INVERT_DAC_VSYNC(val) (((val) >> 24) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_24BIT_DACDATA(val) (((val) >> 25) & 1) /* voodoo 2 only */ +#define FBIINIT5_ENABLE_INTERLACING(val) (((val) >> 26) & 1) /* voodoo 2 only */ +#define FBIINIT5_DAC_DATA_18_CONTROL(val) (((val) >> 27) & 1) /* voodoo 2 only */ +#define FBIINIT5_RASTERIZER_UNIT_MODE(val) (((val) >> 30) & 3) /* voodoo 2 only */ + +#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7) /* voodoo 2 only */ +#define FBIINIT6_WINDOW_DRAG_COUNTER(val) (((val) >> 3) & 0x1f) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNC_MASTER(val) (((val) >> 8) & 1) /* voodoo 2 only */ +#define FBIINIT6_DAC_DATA_22_OUTPUT(val) (((val) >> 9) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_DATA_23_OUTPUT(val) (((val) >> 11) & 3) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNCIN_OUTPUT(val) (((val) >> 13) & 3) /* voodoo 2 only */ +#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val) (((val) >> 15) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_RD_OUTPUT(val) (((val) >> 17) & 3) /* voodoo 2 only */ +#define FBIINIT6_DAC_WR_OUTPUT(val) (((val) >> 19) & 3) /* voodoo 2 only */ +#define FBIINIT6_PCI_FIFO_LWM_RDY(val) (((val) >> 21) & 0x7f) /* voodoo 2 only */ +#define FBIINIT6_VGA_PASS_N_OUTPUT(val) (((val) >> 28) & 3) /* voodoo 2 only */ +#define FBIINIT6_X_VIDEO_TILES_BIT0(val) (((val) >> 30) & 1) /* voodoo 2 only */ + +#define FBIINIT7_GENERIC_STRAPPING(val) (((val) >> 0) & 0xff) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_ENABLE(val) (((val) >> 8) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_MEMORY_STORE(val) (((val) >> 9) & 1) /* voodoo 2 only */ +#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_READ_THRESH(val) (((val) >> 11) & 0x1f) /* voodoo 2 only */ +#define FBIINIT7_SYNC_CMDFIFO_WRITES(val) (((val) >> 16) & 1) /* voodoo 2 only */ +#define FBIINIT7_SYNC_CMDFIFO_READS(val) (((val) >> 17) & 1) /* voodoo 2 only */ +#define FBIINIT7_RESET_PCI_PACKER(val) (((val) >> 18) & 1) /* voodoo 2 only */ +#define FBIINIT7_ENABLE_CHROMA_STUFF(val) (((val) >> 19) & 1) /* voodoo 2 only */ +#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val) (((val) >> 20) & 0x7f) /* voodoo 2 only */ +#define FBIINIT7_ENABLE_TEXTURE_BURST(val) (((val) >> 27) & 1) /* voodoo 2 only */ + +#define TEXMODE_ENABLE_PERSPECTIVE(val) (((val) >> 0) & 1) +#define TEXMODE_MINIFICATION_FILTER(val) (((val) >> 1) & 1) +#define TEXMODE_MAGNIFICATION_FILTER(val) (((val) >> 2) & 1) +#define TEXMODE_CLAMP_NEG_W(val) (((val) >> 3) & 1) +#define TEXMODE_ENABLE_LOD_DITHER(val) (((val) >> 4) & 1) +#define TEXMODE_NCC_TABLE_SELECT(val) (((val) >> 5) & 1) +#define TEXMODE_CLAMP_S(val) (((val) >> 6) & 1) +#define TEXMODE_CLAMP_T(val) (((val) >> 7) & 1) +#define TEXMODE_FORMAT(val) (((val) >> 8) & 0xf) +#define TEXMODE_TC_ZERO_OTHER(val) (((val) >> 12) & 1) +#define TEXMODE_TC_SUB_CLOCAL(val) (((val) >> 13) & 1) +#define TEXMODE_TC_MSELECT(val) (((val) >> 14) & 7) +#define TEXMODE_TC_REVERSE_BLEND(val) (((val) >> 17) & 1) +#define TEXMODE_TC_ADD_ACLOCAL(val) (((val) >> 18) & 3) +#define TEXMODE_TC_INVERT_OUTPUT(val) (((val) >> 20) & 1) +#define TEXMODE_TCA_ZERO_OTHER(val) (((val) >> 21) & 1) +#define TEXMODE_TCA_SUB_CLOCAL(val) (((val) >> 22) & 1) +#define TEXMODE_TCA_MSELECT(val) (((val) >> 23) & 7) +#define TEXMODE_TCA_REVERSE_BLEND(val) (((val) >> 26) & 1) +#define TEXMODE_TCA_ADD_ACLOCAL(val) (((val) >> 27) & 3) +#define TEXMODE_TCA_INVERT_OUTPUT(val) (((val) >> 29) & 1) +#define TEXMODE_TRILINEAR(val) (((val) >> 30) & 1) +#define TEXMODE_SEQ_8_DOWNLD(val) (((val) >> 31) & 1) + +#define TEXLOD_LODMIN(val) (((val) >> 0) & 0x3f) +#define TEXLOD_LODMAX(val) (((val) >> 6) & 0x3f) +#define TEXLOD_LODBIAS(val) (((val) >> 12) & 0x3f) +#define TEXLOD_LOD_ODD(val) (((val) >> 18) & 1) +#define TEXLOD_LOD_TSPLIT(val) (((val) >> 19) & 1) +#define TEXLOD_LOD_S_IS_WIDER(val) (((val) >> 20) & 1) +#define TEXLOD_LOD_ASPECT(val) (((val) >> 21) & 3) +#define TEXLOD_LOD_ZEROFRAC(val) (((val) >> 23) & 1) +#define TEXLOD_TMULTIBASEADDR(val) (((val) >> 24) & 1) +#define TEXLOD_TDATA_SWIZZLE(val) (((val) >> 25) & 1) +#define TEXLOD_TDATA_SWAP(val) (((val) >> 26) & 1) +#define TEXLOD_TDIRECT_WRITE(val) (((val) >> 27) & 1) /* Voodoo 2 only */ + +#define TEXDETAIL_DETAIL_MAX(val) (((val) >> 0) & 0xff) +#define TEXDETAIL_DETAIL_BIAS(val) (((val) >> 8) & 0x3f) +#define TEXDETAIL_DETAIL_SCALE(val) (((val) >> 14) & 7) +#define TEXDETAIL_RGB_MIN_FILTER(val) (((val) >> 17) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_RGB_MAG_FILTER(val) (((val) >> 18) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_ALPHA_MIN_FILTER(val) (((val) >> 19) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */ +#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */ + +#define TREXINIT_SEND_TMU_CONFIG(val) (((val) >> 18) & 1) /************************************* @@ -21,6 +1364,377 @@ struct voodoo_state; struct poly_extra_data; +struct rgba +{ +#ifdef LSB_FIRST + UINT8 b, g, r, a; +#else + UINT8 a, r, g, b; +#endif +}; + + +union voodoo_reg +{ + INT32 i; + UINT32 u; + float f; + rgba rgb; +}; + + +typedef voodoo_reg rgb_union; + + +struct voodoo_stats +{ + UINT8 lastkey; /* last key state */ + UINT8 display; /* display stats? */ + INT32 swaps; /* total swaps */ + INT32 stalls; /* total stalls */ + INT32 total_triangles; /* total triangles */ + INT32 total_pixels_in; /* total pixels in */ + INT32 total_pixels_out; /* total pixels out */ + INT32 total_chroma_fail; /* total chroma fail */ + INT32 total_zfunc_fail; /* total z func fail */ + INT32 total_afunc_fail; /* total a func fail */ + INT32 total_clipped; /* total clipped */ + INT32 total_stippled; /* total stippled */ + INT32 lfb_writes; /* LFB writes */ + INT32 lfb_reads; /* LFB reads */ + INT32 reg_writes; /* register writes */ + INT32 reg_reads; /* register reads */ + INT32 tex_writes; /* texture writes */ + INT32 texture_mode[16]; /* 16 different texture modes */ + UINT8 render_override; /* render override */ + char buffer[1024]; /* string */ +}; + + +/* note that this structure is an even 64 bytes long */ +struct stats_block +{ + INT32 pixels_in; /* pixels in statistic */ + INT32 pixels_out; /* pixels out statistic */ + INT32 chroma_fail; /* chroma test fail statistic */ + INT32 zfunc_fail; /* z function test fail statistic */ + INT32 afunc_fail; /* alpha function test fail statistic */ + INT32 clip_fail; /* clipping fail statistic */ + INT32 stipple_count; /* stipple statistic */ + INT32 filler[64/4 - 7]; /* pad this structure to 64 bytes */ +}; + + +struct fifo_state +{ + UINT32 * base; /* base of the FIFO */ + INT32 size; /* size of the FIFO */ + INT32 in; /* input pointer */ + INT32 out; /* output pointer */ +}; + + +struct cmdfifo_info +{ + UINT8 enable; /* enabled? */ + UINT8 count_holes; /* count holes? */ + UINT32 base; /* base address in framebuffer RAM */ + UINT32 end; /* end address in framebuffer RAM */ + UINT32 rdptr; /* current read pointer */ + UINT32 amin; /* minimum address */ + UINT32 amax; /* maximum address */ + UINT32 depth; /* current depth */ + UINT32 holes; /* number of holes */ +}; + + +struct pci_state +{ + fifo_state fifo; /* PCI FIFO */ + UINT32 init_enable; /* initEnable value */ + UINT8 stall_state; /* state of the system if we're stalled */ + UINT8 op_pending; /* true if an operation is pending */ + attotime op_end_time; /* time when the pending operation ends */ + emu_timer * continue_timer; /* timer to use to continue processing */ + UINT32 fifo_mem[64*2]; /* memory backing the PCI FIFO */ +}; + + +struct ncc_table +{ + UINT8 dirty; /* is the texel lookup dirty? */ + voodoo_reg * reg; /* pointer to our registers */ + INT32 ir[4], ig[4], ib[4]; /* I values for R,G,B */ + INT32 qr[4], qg[4], qb[4]; /* Q values for R,G,B */ + INT32 y[16]; /* Y values */ + rgb_t * palette; /* pointer to associated RGB palette */ + rgb_t * palettea; /* pointer to associated ARGB palette */ + rgb_t texel[256]; /* texel lookup */ +}; + + +struct tmu_state +{ + UINT8 * ram; /* pointer to our RAM */ + UINT32 mask; /* mask to apply to pointers */ + voodoo_reg * reg; /* pointer to our register base */ + UINT32 regdirty; /* true if the LOD/mode/base registers have changed */ + + UINT32 texaddr_mask; /* mask for texture address */ + UINT8 texaddr_shift; /* shift for texture address */ + + INT64 starts, startt; /* starting S,T (14.18) */ + INT64 startw; /* starting W (2.30) */ + INT64 dsdx, dtdx; /* delta S,T per X */ + INT64 dwdx; /* delta W per X */ + INT64 dsdy, dtdy; /* delta S,T per Y */ + INT64 dwdy; /* delta W per Y */ + + INT32 lodmin, lodmax; /* min, max LOD values */ + INT32 lodbias; /* LOD bias */ + UINT32 lodmask; /* mask of available LODs */ + UINT32 lodoffset[9]; /* offset of texture base for each LOD */ + INT32 detailmax; /* detail clamp */ + INT32 detailbias; /* detail bias */ + UINT8 detailscale; /* detail scale */ + + UINT32 wmask; /* mask for the current texture width */ + UINT32 hmask; /* mask for the current texture height */ + + UINT32 bilinear_mask; /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */ + + ncc_table ncc[2]; /* two NCC tables */ + + rgb_t * lookup; /* currently selected lookup */ + rgb_t * texel[16]; /* texel lookups for each format */ + + rgb_t palette[256]; /* palette lookup table */ + rgb_t palettea[256]; /* palette+alpha lookup table */ +}; + + +struct tmu_shared_state +{ + rgb_t rgb332[256]; /* RGB 3-3-2 lookup table */ + rgb_t alpha8[256]; /* alpha 8-bit lookup table */ + rgb_t int8[256]; /* intensity 8-bit lookup table */ + rgb_t ai44[256]; /* alpha, intensity 4-4 lookup table */ + + rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */ + rgb_t argb1555[65536]; /* ARGB 1-5-5-5 lookup table */ + rgb_t argb4444[65536]; /* ARGB 4-4-4-4 lookup table */ +}; + + +struct setup_vertex +{ + float x, y; /* X, Y coordinates */ + float a, r, g, b; /* A, R, G, B values */ + float z, wb; /* Z and broadcast W values */ + float w0, s0, t0; /* W, S, T for TMU 0 */ + float w1, s1, t1; /* W, S, T for TMU 1 */ +}; + + +struct fbi_state +{ + UINT8 * ram; /* pointer to frame buffer RAM */ + UINT32 mask; /* mask to apply to pointers */ + UINT32 rgboffs[3]; /* word offset to 3 RGB buffers */ + UINT32 auxoffs; /* word offset to 1 aux buffer */ + + UINT8 frontbuf; /* front buffer index */ + UINT8 backbuf; /* back buffer index */ + UINT8 swaps_pending; /* number of pending swaps */ + UINT8 video_changed; /* did the frontbuffer video change? */ + + UINT32 yorigin; /* Y origin subtract value */ + UINT32 lfb_base; /* base of LFB in memory */ + UINT8 lfb_stride; /* stride of LFB accesses in bits */ + + UINT32 width; /* width of current frame buffer */ + UINT32 height; /* height of current frame buffer */ + UINT32 xoffs; /* horizontal offset (back porch) */ + UINT32 yoffs; /* vertical offset (back porch) */ + UINT32 vsyncscan; /* vertical sync scanline */ + UINT32 rowpixels; /* pixels per row */ + UINT32 tile_width; /* width of video tiles */ + UINT32 tile_height; /* height of video tiles */ + UINT32 x_tiles; /* number of tiles in the X direction */ + + emu_timer * vblank_timer; /* VBLANK timer */ + UINT8 vblank; /* VBLANK state */ + UINT8 vblank_count; /* number of VBLANKs since last swap */ + UINT8 vblank_swap_pending; /* a swap is pending, waiting for a vblank */ + UINT8 vblank_swap; /* swap when we hit this count */ + UINT8 vblank_dont_swap; /* don't actually swap when we hit this point */ + + /* triangle setup info */ + UINT8 cheating_allowed; /* allow cheating? */ + INT32 sign; /* triangle sign */ + INT16 ax, ay; /* vertex A x,y (12.4) */ + INT16 bx, by; /* vertex B x,y (12.4) */ + INT16 cx, cy; /* vertex C x,y (12.4) */ + INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ + INT32 startz; /* starting Z (20.12) */ + INT64 startw; /* starting W (16.32) */ + INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ + INT32 dzdx; /* delta Z per X */ + INT64 dwdx; /* delta W per X */ + INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ + INT32 dzdy; /* delta Z per Y */ + INT64 dwdy; /* delta W per Y */ + + stats_block lfb_stats; /* LFB-access statistics */ + + UINT8 sverts; /* number of vertices ready */ + setup_vertex svert[3]; /* 3 setup vertices */ + + fifo_state fifo; /* framebuffer memory fifo */ + cmdfifo_info cmdfifo[2]; /* command FIFOs */ + + UINT8 fogblend[64]; /* 64-entry fog table */ + UINT8 fogdelta[64]; /* 64-entry fog table */ + UINT8 fogdelta_mask; /* mask for for delta (0xff for V1, 0xfc for V2) */ + + rgb_t pen[65536]; /* mapping from pixels to pens */ + rgb_t clut[512]; /* clut gamma data */ + UINT8 clut_dirty; /* do we need to recompute? */ +}; + + +struct dac_state +{ + UINT8 reg[8]; /* 8 registers */ + UINT8 read_result; /* pending read result */ +}; + + +struct raster_info +{ + raster_info * next; /* pointer to next entry with the same hash */ + poly_draw_scanline_func callback; /* callback pointer */ + UINT8 is_generic; /* TRUE if this is one of the generic rasterizers */ + UINT8 display; /* display index */ + UINT32 hits; /* how many hits (pixels) we've used this for */ + UINT32 polys; /* how many polys we've used this for */ + UINT32 eff_color_path; /* effective fbzColorPath value */ + UINT32 eff_alpha_mode; /* effective alphaMode value */ + UINT32 eff_fog_mode; /* effective fogMode value */ + UINT32 eff_fbz_mode; /* effective fbzMode value */ + UINT32 eff_tex_mode_0; /* effective textureMode value for TMU #0 */ + UINT32 eff_tex_mode_1; /* effective textureMode value for TMU #1 */ + UINT32 hash; +}; + + +struct poly_extra_data +{ + voodoo_state * state; /* pointer back to the voodoo state */ + raster_info * info; /* pointer to rasterizer information */ + + INT16 ax, ay; /* vertex A x,y (12.4) */ + INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ + INT32 startz; /* starting Z (20.12) */ + INT64 startw; /* starting W (16.32) */ + INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ + INT32 dzdx; /* delta Z per X */ + INT64 dwdx; /* delta W per X */ + INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ + INT32 dzdy; /* delta Z per Y */ + INT64 dwdy; /* delta W per Y */ + + INT64 starts0, startt0; /* starting S,T (14.18) */ + INT64 startw0; /* starting W (2.30) */ + INT64 ds0dx, dt0dx; /* delta S,T per X */ + INT64 dw0dx; /* delta W per X */ + INT64 ds0dy, dt0dy; /* delta S,T per Y */ + INT64 dw0dy; /* delta W per Y */ + INT32 lodbase0; /* used during rasterization */ + + INT64 starts1, startt1; /* starting S,T (14.18) */ + INT64 startw1; /* starting W (2.30) */ + INT64 ds1dx, dt1dx; /* delta S,T per X */ + INT64 dw1dx; /* delta W per X */ + INT64 ds1dy, dt1dy; /* delta S,T per Y */ + INT64 dw1dy; /* delta W per Y */ + INT32 lodbase1; /* used during rasterization */ + + UINT16 dither[16]; /* dither matrix, for fastfill */ +}; + + +struct banshee_info +{ + UINT32 io[0x40]; /* I/O registers */ + UINT32 agp[0x80]; /* AGP registers */ + UINT8 vga[0x20]; /* VGA registers */ + UINT8 crtc[0x27]; /* VGA CRTC registers */ + UINT8 seq[0x05]; /* VGA sequencer registers */ + UINT8 gc[0x05]; /* VGA graphics controller registers */ + UINT8 att[0x15]; /* VGA attribute registers */ + UINT8 attff; /* VGA attribute flip-flop */ + + UINT32 blt_regs[0x20]; /* 2D Blitter registers */ + UINT32 blt_dst_base; + UINT32 blt_dst_x; + UINT32 blt_dst_y; + UINT32 blt_dst_width; + UINT32 blt_dst_height; + UINT32 blt_dst_stride; + UINT32 blt_dst_bpp; + UINT32 blt_cmd; + UINT32 blt_src_base; + UINT32 blt_src_x; + UINT32 blt_src_y; + UINT32 blt_src_width; + UINT32 blt_src_height; + UINT32 blt_src_stride; + UINT32 blt_src_bpp; +}; + + +struct voodoo_state +{ + UINT8 index; /* index of board */ + voodoo_device *device; /* pointer to our containing device */ + screen_device *screen; /* the screen we are acting on */ + device_t *cpu; /* the CPU we interact with */ + UINT8 type; /* type of system */ + UINT8 chipmask; /* mask for which chips are available */ + UINT32 freq; /* operating frequency */ + attoseconds_t attoseconds_per_cycle; /* attoseconds per cycle */ + UINT32 extra_cycles; /* extra cycles not yet accounted for */ + int trigger; /* trigger used for stalling */ + + voodoo_reg reg[0x400]; /* raw registers */ + const UINT8 * regaccess; /* register access array */ + const char *const * regnames; /* register names array */ + UINT8 alt_regmap; /* enable alternate register map? */ + + pci_state pci; /* PCI state */ + dac_state dac; /* DAC state */ + + fbi_state fbi; /* FBI states */ + tmu_state tmu[MAX_TMU]; /* TMU states */ + tmu_shared_state tmushare; /* TMU shared state */ + banshee_info banshee; /* Banshee state */ + + legacy_poly_manager * poly; /* polygon manager */ + stats_block * thread_stats; /* per-thread statistics */ + + voodoo_stats stats; /* internal statistics */ + + offs_t last_status_pc; /* PC of last status description (for logging) */ + UINT32 last_status_value; /* value of last status read (for logging) */ + + int next_rasterizer; /* next rasterizer index */ + raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */ + raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */ + + bool send_config; + UINT32 tmu_config; +}; @@ -631,16 +2345,16 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_device *vd, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor) +static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_state *v, stats_block *stats, UINT32 fbzModeReg, rgbaint_t rgbaIntColor) { if (FBZMODE_ENABLE_CHROMAKEY(fbzModeReg)) { rgb_union color; color.u = (rgbaIntColor.get_a()<<24) | (rgbaIntColor.get_r()<<16) | (rgbaIntColor.get_g()<<8) | rgbaIntColor.get_b(); /* non-range version */ - if (!CHROMARANGE_ENABLE(vd->reg[chromaRange].u)) + if (!CHROMARANGE_ENABLE(v->reg[chromaRange].u)) { - if (((color.u ^ vd->reg[chromaKey].u) & 0xffffff) == 0) + if (((color.u ^ v->reg[chromaKey].u) & 0xffffff) == 0) { stats->chroma_fail++; return false; @@ -654,30 +2368,30 @@ static inline bool ATTR_FORCE_INLINE chromaKeyTest(voodoo_device *vd, stats_bloc int results; /* check blue */ - low = vd->reg[chromaKey].rgb.b; - high = vd->reg[chromaRange].rgb.b; + low = v->reg[chromaKey].rgb.b; + high = v->reg[chromaRange].rgb.b; test = color.rgb.b; results = (test >= low && test <= high); - results ^= CHROMARANGE_BLUE_EXCLUSIVE(vd->reg[chromaRange].u); + results ^= CHROMARANGE_BLUE_EXCLUSIVE(v->reg[chromaRange].u); results <<= 1; /* check green */ - low = vd->reg[chromaKey].rgb.g; - high = vd->reg[chromaRange].rgb.g; + low = v->reg[chromaKey].rgb.g; + high = v->reg[chromaRange].rgb.g; test = color.rgb.g; results |= (test >= low && test <= high); - results ^= CHROMARANGE_GREEN_EXCLUSIVE(vd->reg[chromaRange].u); + results ^= CHROMARANGE_GREEN_EXCLUSIVE(v->reg[chromaRange].u); results <<= 1; /* check red */ - low = vd->reg[chromaKey].rgb.r; - high = vd->reg[chromaRange].rgb.r; + low = v->reg[chromaKey].rgb.r; + high = v->reg[chromaRange].rgb.r; test = color.rgb.r; results |= (test >= low && test <= high); - results ^= CHROMARANGE_RED_EXCLUSIVE(vd->reg[chromaRange].u); + results ^= CHROMARANGE_RED_EXCLUSIVE(v->reg[chromaRange].u); /* final result */ - if (CHROMARANGE_UNION_MODE(vd->reg[chromaRange].u)) + if (CHROMARANGE_UNION_MODE(v->reg[chromaRange].u)) { if (results != 0) { @@ -806,11 +2520,11 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_device *vd, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha) +static inline bool ATTR_FORCE_INLINE alphaTest(voodoo_state *v, stats_block *stats, UINT32 alphaModeReg, UINT8 alpha) { if (ALPHAMODE_ALPHATEST(alphaModeReg)) { - UINT8 alpharef = vd->reg[alphaMode].rgb.a; + UINT8 alpharef = v->reg[alphaMode].rgb.a; switch (ALPHAMODE_ALPHAFUNCTION(alphaModeReg)) { case 0: /* alphaOP = never */ @@ -1353,7 +3067,7 @@ do } \ while (0) -static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogModeReg, UINT32 fbzCpReg, INT32 x, const UINT8 *dither4, INT32 fogDepth, +static inline void ATTR_FORCE_INLINE applyFogging(voodoo_state *v, UINT32 fogModeReg, UINT32 fbzCpReg, INT32 x, const UINT8 *dither4, INT32 fogDepth, rgbaint_t &color, INT32 iterz, INT64 iterw, UINT8 itera) { if (FOGMODE_ENABLE_FOG(fogModeReg)) @@ -1361,7 +3075,7 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogM UINT32 color_alpha = color.get_a(); /* constant fog bypasses everything else */ - rgbaint_t fogColorLocal(vd->reg[fogColor].u); + rgbaint_t fogColorLocal(v->reg[fogColor].u); if (FOGMODE_FOG_CONSTANT(fogModeReg)) { @@ -1405,11 +3119,11 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogM { case 0: /* fog table */ { - INT32 delta = vd->fbi.fogdelta[fogDepth >> 10]; + INT32 delta = v->fbi.fogdelta[fogDepth >> 10]; INT32 deltaval; /* perform the multiply against lower 8 bits of wfloat */ - deltaval = (delta & vd->fbi.fogdelta_mask) * + deltaval = (delta & v->fbi.fogdelta_mask) * ((fogDepth >> 2) & 0xff); /* fog zones allow for negating this value */ @@ -1423,7 +3137,7 @@ static inline void ATTR_FORCE_INLINE applyFogging(voodoo_device *vd, UINT32 fogM deltaval >>= 4; /* add to the blending factor */ - fogblend = vd->fbi.fogblend[fogDepth >> 10] + deltaval; + fogblend = v->fbi.fogblend[fogDepth >> 10] + deltaval; break; } @@ -1828,7 +3542,7 @@ while (0) * *************************************/ -#define PIXEL_PIPELINE_BEGIN(vd, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) \ +#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) \ do \ { \ INT32 depthval, wfloat, fogdepth, biasdepth; \ @@ -1845,10 +3559,10 @@ do /* rotate mode */ \ if (FBZMODE_STIPPLE_PATTERN(FBZMODE) == 0) \ { \ - vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31);\ - if ((vd->reg[stipple].u & 0x80000000) == 0) \ + (VV)->reg[stipple].u = ((VV)->reg[stipple].u << 1) | ((VV)->reg[stipple].u >> 31);\ + if (((VV)->reg[stipple].u & 0x80000000) == 0) \ { \ - vd->stats.total_stippled++; \ + (VV)->stats.total_stippled++; \ goto skipdrawdepth; \ } \ } \ @@ -1857,9 +3571,9 @@ do else \ { \ int stipple_index = (((YY) & 3) << 3) | (~(XX) & 7); \ - if (((vd->reg[stipple].u >> stipple_index) & 1) == 0) \ + if ((((VV)->reg[stipple].u >> stipple_index) & 1) == 0) \ { \ - vd->stats.total_stippled++; \ + (VV)->stats.total_stippled++; \ goto skipdrawdepth; \ } \ } \ @@ -1883,7 +3597,7 @@ do /* add the bias for fog selection*/ \ if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE)) \ { \ - fogdepth += (INT16)vd->reg[zaColor].u; \ + fogdepth += (INT16)(VV)->reg[zaColor].u; \ CLAMP(fogdepth, 0, 0xffff); \ } \ \ @@ -1914,12 +3628,12 @@ do biasdepth = depthval; \ if (FBZMODE_ENABLE_DEPTH_BIAS(FBZMODE)) \ { \ - biasdepth += (INT16)vd->reg[zaColor].u; \ + biasdepth += (INT16)(VV)->reg[zaColor].u; \ CLAMP(biasdepth, 0, 0xffff); \ } -#define DEPTH_TEST(vd, STATS, XX, FBZMODE) \ +#define DEPTH_TEST(VV, STATS, XX, FBZMODE) \ do \ { \ /* handle depth buffer testing */ \ @@ -1932,7 +3646,7 @@ do if (FBZMODE_DEPTH_SOURCE_COMPARE(FBZMODE) == 0) \ depthsource = biasdepth; \ else \ - depthsource = (UINT16)vd->reg[zaColor].u; \ + depthsource = (UINT16)(VV)->reg[zaColor].u; \ \ /* test against the depth buffer */ \ switch (FBZMODE_DEPTH_FUNCTION(FBZMODE)) \ @@ -2072,11 +3786,11 @@ static inline bool ATTR_FORCE_INLINE depthTest(UINT16 zaColorReg, stats_block *s return true; } -#define PIXEL_PIPELINE_END(vd, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \ +#define PIXEL_PIPELINE_END(VV, STATS, DITHER, DITHER4, DITHER_LOOKUP, XX, dest, depth, FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, ITERZ, ITERW, ITERAXXX) \ \ /* perform fogging */ \ preFog.set(color); \ - applyFogging(vd, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \ + applyFogging(VV, FOGMODE, FBZCOLORPATH, XX, DITHER4, fogdepth, color, ITERZ, ITERW, ITERAXXX.get_a()); \ /* perform alpha blending */ \ alphaBlend(FBZMODE, ALPHAMODE, XX, DITHER, dest[XX], depth, preFog, color); \ a = color.get_a(); r = color.get_r(); g = color.get_g(); b = color.get_b(); \ @@ -2407,7 +4121,7 @@ do } \ while (0) -static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE, +static inline bool ATTR_FORCE_INLINE combineColor(voodoo_state *VV, stats_block *STATS, UINT32 FBZCOLORPATH, UINT32 FBZMODE, UINT32 ALPHAMODE, rgbaint_t TEXELARGB, INT32 ITERZ, INT64 ITERW, rgbaint_t &srcColor) { rgbaint_t c_other; @@ -2425,7 +4139,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block break; case 2: /* color1 RGB */ - c_other.set(vd->reg[color1].u); + c_other.set((VV)->reg[color1].u); break; default: /* reserved - voodoo3 framebufferRGB */ @@ -2434,9 +4148,9 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block } /* handle chroma key */ - if (!chromaKeyTest(vd, STATS, FBZMODE, c_other)) + if (!chromaKeyTest(VV, STATS, FBZMODE, c_other)) return false; - //APPLY_CHROMAKEY(vd->m_vds, STATS, FBZMODE, c_other); + //APPLY_CHROMAKEY(VV, STATS, FBZMODE, c_other); /* compute a_other */ switch (FBZCP_CC_ASELECT(FBZCOLORPATH)) @@ -2450,7 +4164,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block break; case 2: /* color1 alpha */ - c_other.set_a(vd->reg[color1].rgb.a); + c_other.set_a((VV)->reg[color1].rgb.a); break; default: /* reserved */ @@ -2461,7 +4175,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block /* handle alpha mask */ if (!alphaMaskTest(STATS, FBZMODE, c_other.get_a())) return false; - //APPLY_ALPHAMASK(vd->m_vds, STATS, FBZMODE, c_other.rgb.a); + //APPLY_ALPHAMASK(VV, STATS, FBZMODE, c_other.rgb.a); /* compute c_local */ @@ -2470,14 +4184,14 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block if (FBZCP_CC_LOCALSELECT(FBZCOLORPATH) == 0) /* iterated RGB */ c_local.set(srcColor); else /* color0 RGB */ - c_local.set(vd->reg[color0].u); + c_local.set((VV)->reg[color0].u); } else { if (!(TEXELARGB.get_a() & 0x80)) /* iterated RGB */ c_local.set(srcColor); else /* color0 RGB */ - c_local.set(vd->reg[color0].u); + c_local.set((VV)->reg[color0].u); } /* compute a_local */ @@ -2489,7 +4203,7 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block break; case 1: /* color0 alpha */ - c_local.set_a(vd->reg[color0].rgb.a); + c_local.set_a((VV)->reg[color0].rgb.a); break; case 2: /* clamped iterated Z[27:20] */ @@ -2641,9 +4355,9 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block /* handle alpha test */ - if (!alphaTest(vd, STATS, ALPHAMODE, srcColor.get_a())) + if (!alphaTest(VV, STATS, ALPHAMODE, srcColor.get_a())) return false; - //APPLY_ALPHATEST(vd->m_vds, STATS, ALPHAMODE, color.rgb.a); + //APPLY_ALPHATEST(VV, STATS, ALPHAMODE, color.rgb.a); return true; } @@ -2658,11 +4372,11 @@ static inline bool ATTR_FORCE_INLINE combineColor(voodoo_device *vd, stats_block #define RASTERIZER(name, TMUS, FBZCOLORPATH, FBZMODE, ALPHAMODE, FOGMODE, TEXMODE0, TEXMODE1) \ \ -void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \ +static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) \ { \ const poly_extra_data *extra = (const poly_extra_data *)extradata; \ - voodoo_device *vd = extra->device; \ - stats_block *stats = &vd->thread_stats[threadid]; \ + voodoo_state *v = extra->state; \ + stats_block *stats = &v->thread_stats[threadid]; \ DECLARE_DITHER_POINTERS; \ INT32 startx = extent->startx; \ INT32 stopx = extent->stopx; \ @@ -2680,7 +4394,7 @@ void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *ex /* determine the screen Y */ \ scry = y; \ if (FBZMODE_Y_ORIGIN(FBZMODE)) \ - scry = (vd->fbi.yorigin - y) & 0x3ff; \ + scry = (v->fbi.yorigin - y) & 0x3ff; \ \ /* compute dithering */ \ COMPUTE_DITHER_POINTERS(FBZMODE, y); \ @@ -2691,8 +4405,8 @@ void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *ex INT32 tempclip; \ \ /* Y clipping buys us the whole scanline */ \ - if (scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) || \ - scry >= (vd->reg[clipLowYHighY].u & 0x3ff)) \ + if (scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) || \ + scry >= (v->reg[clipLowYHighY].u & 0x3ff)) \ { \ stats->pixels_in += stopx - startx; \ stats->clip_fail += stopx - startx; \ @@ -2700,25 +4414,25 @@ void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *ex } \ \ /* X clipping */ \ - tempclip = (vd->reg[clipLeftRight].u >> 16) & 0x3ff; \ + tempclip = (v->reg[clipLeftRight].u >> 16) & 0x3ff; \ if (startx < tempclip) \ { \ stats->pixels_in += tempclip - startx; \ - vd->stats.total_clipped += tempclip - startx; \ + v->stats.total_clipped += tempclip - startx; \ startx = tempclip; \ } \ - tempclip = vd->reg[clipLeftRight].u & 0x3ff; \ + tempclip = v->reg[clipLeftRight].u & 0x3ff; \ if (stopx >= tempclip) \ { \ stats->pixels_in += stopx - tempclip; \ - vd->stats.total_clipped += stopx - tempclip; \ + v->stats.total_clipped += stopx - tempclip; \ stopx = tempclip - 1; \ } \ } \ \ /* get pointers to the target buffer and depth buffer */ \ - dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels; \ - depth = (vd->fbi.auxoffs != ~0) ? ((UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels) : NULL; \ + dest = (UINT16 *)destbase + scry * v->fbi.rowpixels; \ + depth = (v->fbi.auxoffs != ~0) ? ((UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels) : NULL; \ \ /* compute the starting parameters */ \ dx = startx - (extra->ax >> 4); \ @@ -2751,46 +4465,46 @@ void voodoo_device::raster_##name(void *destbase, INT32 y, const poly_extent *ex rgbaint_t color, preFog; \ \ /* pixel pipeline part 1 handles depth setup and stippling */ \ - PIXEL_PIPELINE_BEGIN(vd, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \ + PIXEL_PIPELINE_BEGIN(v, stats, x, y, FBZCOLORPATH, FBZMODE, iterz, iterw); \ /* depth testing */ \ - if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \ + if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], FBZMODE, biasdepth)) \ goto skipdrawdepth; \ \ /* run the texture pipeline on TMU1 to produce a value in texel */ \ /* note that they set LOD min to 8 to "disable" a TMU */ \ - if (TMUS >= 2 && vd->tmu[1].lodmin < (8 << 8)) { \ + if (TMUS >= 2 && v->tmu[1].lodmin < (8 << 8)) { \ INT32 tmp; \ const rgbaint_t texelZero(0); \ - texel = genTexture(&vd->tmu[1], x, dither4, TEXMODE1, vd->tmu[1].lookup, extra->lodbase1, \ + texel = genTexture(&v->tmu[1], x, dither4, TEXMODE1, v->tmu[1].lookup, extra->lodbase1, \ iters1, itert1, iterw1, tmp); \ - texel = combineTexture(&vd->tmu[1], TEXMODE1, texel, texelZero, tmp); \ + texel = combineTexture(&v->tmu[1], TEXMODE1, texel, texelZero, tmp); \ } \ /* run the texture pipeline on TMU0 to produce a final */ \ /* result in texel */ \ /* note that they set LOD min to 8 to "disable" a TMU */ \ - if (TMUS >= 1 && vd->tmu[0].lodmin < (8 << 8)) \ + if (TMUS >= 1 && v->tmu[0].lodmin < (8 << 8)) \ { \ - if (!vd->send_config) \ + if (!v->send_config) \ { \ INT32 lod0; \ rgbaint_t texelT0; \ - texelT0 = genTexture(&vd->tmu[0], x, dither4, TEXMODE0, vd->tmu[0].lookup, extra->lodbase0, \ + texelT0 = genTexture(&v->tmu[0], x, dither4, TEXMODE0, v->tmu[0].lookup, extra->lodbase0, \ iters0, itert0, iterw0, lod0); \ - texel = combineTexture(&vd->tmu[0], TEXMODE0, texelT0, texel, lod0); \ + texel = combineTexture(&v->tmu[0], TEXMODE0, texelT0, texel, lod0); \ } \ else \ { \ - texel.set(vd->tmu_config); \ + texel.set(v->tmu_config); \ } \ } \ \ /* colorpath pipeline selects source colors and does blending */ \ color = clampARGB(iterargb, FBZCOLORPATH); \ - if (!combineColor(vd, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \ + if (!combineColor(v, stats, FBZCOLORPATH, FBZMODE, ALPHAMODE, texel, iterz, iterw, color)) \ goto skipdrawdepth; \ \ /* pixel pipeline part 2 handles fog, alpha, and final output */ \ - PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth, \ + PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, \ FBZMODE, FBZCOLORPATH, ALPHAMODE, FOGMODE, \ iterz, iterw, iterargb); \ \ diff --git a/src/devices/video/voodoo.cpp b/src/devices/video/voodoo.cpp index 7fe0b94a007..4304b5ebf32 100644 --- a/src/devices/video/voodoo.cpp +++ b/src/devices/video/voodoo.cpp @@ -143,7 +143,7 @@ bits(7:4) and bit(24)), X, and Y: #include "emu.h" - +#include "video/polylgcy.h" #include "video/rgbutil.h" #include "voodoo.h" #include "vooddefs.h" @@ -194,6 +194,50 @@ UINT32 voodoo_reciplog[(2 << RECIPLOG_LOOKUP_BITS) + 2]; +/************************************* + * + * Prototypes + * + *************************************/ + +static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem); +static void init_tmu_shared(tmu_shared_state *s); +static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem); +static void soft_reset(voodoo_state *v); +static void recompute_video_memory(voodoo_state *v); +static void check_stalled_cpu(voodoo_state *v, attotime current_time); +static void flush_fifos(voodoo_state *v, attotime current_time); +static TIMER_CALLBACK( stall_cpu_callback ); +static void stall_cpu(voodoo_state *v, int state, attotime current_time); +static TIMER_CALLBACK( vblank_callback ); +static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data); +static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask); +static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask); +static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data); +static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data); + +/* command handlers */ +static INT32 fastfill(voodoo_state *v); +static INT32 swapbuffer(voodoo_state *v, UINT32 data); +static INT32 triangle(voodoo_state *v); +static INT32 begin_triangle(voodoo_state *v); +static INT32 draw_triangle(voodoo_state *v); + +/* triangle helpers */ +static INT32 setup_and_draw_triangle(voodoo_state *v); +static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount); + +/* rasterizer management */ +static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo); +static raster_info *find_rasterizer(voodoo_state *v, int texcount); +static void dump_rasterizer_stats(voodoo_state *v); + +/* generic rasterizers */ +static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); +static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); +static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); +static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); + /************************************* @@ -218,7 +262,7 @@ UINT32 voodoo_reciplog[(2 << RECIPLOG_LOOKUP_BITS) + 2]; *************************************/ #define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \ - { NULL, voodoo_device::raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 }, + { NULL, raster_##fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1, FALSE, 0, 0, 0, fbzcp, alpha, fog, fbz, tex0, tex1 }, static const raster_info predef_raster_table[] = { @@ -234,84 +278,100 @@ static const raster_info predef_raster_table[] = INLINE FUNCTIONS ***************************************************************************/ +/*------------------------------------------------- + get_safe_token - makes sure that the passed + in device is, in fact, a voodoo device +-------------------------------------------------*/ + +static inline voodoo_state *get_safe_token(device_t *device) +{ + assert(device != nullptr); + assert((device->type() == VOODOO_1) || (device->type() == VOODOO_2) || (device->type() == VOODOO_BANSHEE) || (device->type() == VOODOO_3)); + + return (voodoo_state *)downcast<voodoo_device *>(device)->token(); +} + + + /************************************* * * Video update * *************************************/ -int voodoo_device::voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect) +int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - int changed = fbi.video_changed; - int drawbuf = fbi.frontbuf; + voodoo_state *v = get_safe_token(device); + int changed = v->fbi.video_changed; + int drawbuf = v->fbi.frontbuf; int statskey; int x, y; /* reset the video changed flag */ - fbi.video_changed = FALSE; + v->fbi.video_changed = FALSE; /* if we are blank, just fill with black */ - if (vd_type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(reg[fbiInit1].u)) + if (v->type <= TYPE_VOODOO_2 && FBIINIT1_SOFTWARE_BLANK(v->reg[fbiInit1].u)) { bitmap.fill(0, cliprect); return changed; } /* if the CLUT is dirty, recompute the pens array */ - if (fbi.clut_dirty) + if (v->fbi.clut_dirty) { UINT8 rtable[32], gtable[64], btable[32]; /* Voodoo/Voodoo-2 have an internal 33-entry CLUT */ - if (vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { /* kludge: some of the Midway games write 0 to the last entry when they obviously mean FF */ - if ((fbi.clut[32] & 0xffffff) == 0 && (fbi.clut[31] & 0xffffff) != 0) - fbi.clut[32] = 0x20ffffff; + if ((v->fbi.clut[32] & 0xffffff) == 0 && (v->fbi.clut[31] & 0xffffff) != 0) + v->fbi.clut[32] = 0x20ffffff; /* compute the R/G/B pens first */ for (x = 0; x < 32; x++) { /* treat X as a 5-bit value, scale up to 8 bits, and linear interpolate for red/blue */ y = (x << 3) | (x >> 2); - rtable[x] = (fbi.clut[y >> 3].r() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3; - btable[x] = (fbi.clut[y >> 3].b() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3; + rtable[x] = (v->fbi.clut[y >> 3].r() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].r() * (y & 7)) >> 3; + btable[x] = (v->fbi.clut[y >> 3].b() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].b() * (y & 7)) >> 3; /* treat X as a 6-bit value with LSB=0, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 0; y = (y << 2) | (y >> 4); - gtable[x*2+0] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; + gtable[x*2+0] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 1; y = (y << 2) | (y >> 4); - gtable[x*2+1] = (fbi.clut[y >> 3].g() * (8 - (y & 7)) + fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; + gtable[x*2+1] = (v->fbi.clut[y >> 3].g() * (8 - (y & 7)) + v->fbi.clut[(y >> 3) + 1].g() * (y & 7)) >> 3; } } /* Banshee and later have a 512-entry CLUT that can be bypassed */ else { - int which = (banshee.io[io_vidProcCfg] >> 13) & 1; - int bypass = (banshee.io[io_vidProcCfg] >> 11) & 1; + int which = (v->banshee.io[io_vidProcCfg] >> 13) & 1; + int bypass = (v->banshee.io[io_vidProcCfg] >> 11) & 1; /* compute R/G/B pens first */ for (x = 0; x < 32; x++) { /* treat X as a 5-bit value, scale up to 8 bits */ y = (x << 3) | (x >> 2); - rtable[x] = bypass ? y : fbi.clut[which * 256 + y].r(); - btable[x] = bypass ? y : fbi.clut[which * 256 + y].b(); + rtable[x] = bypass ? y : v->fbi.clut[which * 256 + y].r(); + btable[x] = bypass ? y : v->fbi.clut[which * 256 + y].b(); /* treat X as a 6-bit value with LSB=0, scale up to 8 bits */ y = (x * 2) + 0; y = (y << 2) | (y >> 4); - gtable[x*2+0] = bypass ? y : fbi.clut[which * 256 + y].g(); + gtable[x*2+0] = bypass ? y : v->fbi.clut[which * 256 + y].g(); /* treat X as a 6-bit value with LSB=1, scale up to 8 bits, and linear interpolate */ y = (x * 2) + 1; y = (y << 2) | (y >> 4); - gtable[x*2+1] = bypass ? y : fbi.clut[which * 256 + y].g(); + gtable[x*2+1] = bypass ? y : v->fbi.clut[which * 256 + y].g(); } } @@ -321,45 +381,45 @@ int voodoo_device::voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect int r = rtable[(x >> 11) & 0x1f]; int g = gtable[(x >> 5) & 0x3f]; int b = btable[x & 0x1f]; - fbi.pen[x] = rgb_t(r, g, b); + v->fbi.pen[x] = rgb_t(r, g, b); } /* no longer dirty */ - fbi.clut_dirty = FALSE; + v->fbi.clut_dirty = FALSE; changed = TRUE; } /* debugging! */ - if (machine().input().code_pressed(KEYCODE_L)) - drawbuf = fbi.backbuf; + if (device->machine().input().code_pressed(KEYCODE_L)) + drawbuf = v->fbi.backbuf; /* copy from the current front buffer */ for (y = cliprect.min_y; y <= cliprect.max_y; y++) - if (y >= fbi.yoffs) + if (y >= v->fbi.yoffs) { - UINT16 *src = (UINT16 *)(fbi.ram + fbi.rgboffs[drawbuf]) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs; + UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[drawbuf]) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; UINT32 *dst = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) - dst[x] = fbi.pen[src[x]]; + dst[x] = v->fbi.pen[src[x]]; } /* update stats display */ - statskey = (machine().input().code_pressed(KEYCODE_BACKSLASH) != 0); - if (statskey && statskey != stats.lastkey) - stats.display = !stats.display; - stats.lastkey = statskey; + statskey = (device->machine().input().code_pressed(KEYCODE_BACKSLASH) != 0); + if (statskey && statskey != v->stats.lastkey) + v->stats.display = !v->stats.display; + v->stats.lastkey = statskey; /* display stats */ - if (stats.display) - popmessage(stats.buffer, 0, 0); + if (v->stats.display) + device->popmessage(v->stats.buffer, 0, 0); /* update render override */ - stats.render_override = machine().input().code_pressed(KEYCODE_ENTER); - if (DEBUG_DEPTH && stats.render_override) + v->stats.render_override = device->machine().input().code_pressed(KEYCODE_ENTER); + if (DEBUG_DEPTH && v->stats.render_override) { for (y = cliprect.min_y; y <= cliprect.max_y; y++) { - UINT16 *src = (UINT16 *)(fbi.ram + fbi.auxoffs) + (y - fbi.yoffs) * fbi.rowpixels - fbi.xoffs; + UINT16 *src = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + (y - v->fbi.yoffs) * v->fbi.rowpixels - v->fbi.xoffs; UINT32 *dst = &bitmap.pix32(y); for (x = cliprect.min_x; x <= cliprect.max_x; x++) dst[x] = ((src[x] << 8) & 0xff0000) | ((src[x] >> 0) & 0xff00) | ((src[x] >> 8) & 0xff); @@ -376,27 +436,26 @@ int voodoo_device::voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect * *************************************/ - -int voodoo_device::voodoo_get_type() +int voodoo_get_type(device_t *device) { - voodoo_device *vd = this; - return vd->vd_type; + voodoo_state *v = get_safe_token(device); + return v->type; } -int voodoo_device::voodoo_is_stalled() +int voodoo_is_stalled(device_t *device) { - voodoo_device *vd = this; - return (vd->pci.stall_state != NOT_STALLED); + voodoo_state *v = get_safe_token(device); + return (v->pci.stall_state != NOT_STALLED); } -void voodoo_device::voodoo_set_init_enable(UINT32 newval) +void voodoo_set_init_enable(device_t *device, UINT32 newval) { - voodoo_device *vd = this; - vd->pci.init_enable = newval; + voodoo_state *v = get_safe_token(device); + v->pci.init_enable = newval; if (LOG_REGISTERS) - logerror("VOODOO.%d.REG:initEnable write = %08X\n", vd->index, newval); + device->logerror("VOODOO.%d.REG:initEnable write = %08X\n", v->index, newval); } @@ -407,7 +466,7 @@ void voodoo_device::voodoo_set_init_enable(UINT32 newval) * *************************************/ -void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int fbmem) +static void init_fbi(voodoo_state *v, fbi_state *f, void *memory, int fbmem) { int pen; @@ -425,20 +484,20 @@ void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int f /* init the pens */ f->clut_dirty = TRUE; - if (vd->vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { for (pen = 0; pen < 32; pen++) - vd->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen)); - vd->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff); + v->fbi.clut[pen] = rgb_t(pen, pal5bit(pen), pal5bit(pen), pal5bit(pen)); + v->fbi.clut[32] = rgb_t(32,0xff,0xff,0xff); } else { for (pen = 0; pen < 512; pen++) - vd->fbi.clut[pen] = rgb_t(pen,pen,pen); + v->fbi.clut[pen] = rgb_t(pen,pen,pen); } /* allocate a VBLANK timer */ - f->vblank_timer = vd->device->machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::vblank_callback),vd), vd); + f->vblank_timer = v->device->machine().scheduler().timer_alloc(FUNC(vblank_callback), v); f->vblank = FALSE; /* initialize the memory FIFO */ @@ -446,11 +505,11 @@ void voodoo_device::init_fbi(voodoo_device* vd,fbi_state *f, void *memory, int f f->fifo.size = f->fifo.in = f->fifo.out = 0; /* set the fog delta mask */ - f->fogdelta_mask = (vd->vd_type < TYPE_VOODOO_2) ? 0xff : 0xfc; + f->fogdelta_mask = (v->type < TYPE_VOODOO_2) ? 0xff : 0xfc; } -void voodoo_device::init_tmu_shared(tmu_shared_state *s) +static void init_tmu_shared(tmu_shared_state *s) { int val; @@ -495,14 +554,14 @@ void voodoo_device::init_tmu_shared(tmu_shared_state *s) } -void voodoo_device::init_tmu(voodoo_device* vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem) +static void init_tmu(voodoo_state *v, tmu_state *t, voodoo_reg *reg, void *memory, int tmem) { /* allocate texture RAM */ t->ram = (UINT8 *)memory; t->mask = tmem - 1; t->reg = reg; t->regdirty = TRUE; - t->bilinear_mask = (vd->vd_type >= TYPE_VOODOO_2) ? 0xff : 0xf0; + t->bilinear_mask = (v->type >= TYPE_VOODOO_2) ? 0xff : 0xf0; /* mark the NCC tables dirty and configure their registers */ t->ncc[0].dirty = t->ncc[1].dirty = TRUE; @@ -510,31 +569,31 @@ void voodoo_device::init_tmu(voodoo_device* vd, tmu_state *t, voodoo_reg *reg, v t->ncc[1].reg = &t->reg[nccTable+12]; /* create pointers to all the tables */ - t->texel[0] = vd->tmushare.rgb332; + t->texel[0] = v->tmushare.rgb332; t->texel[1] = t->ncc[0].texel; - t->texel[2] = vd->tmushare.alpha8; - t->texel[3] = vd->tmushare.int8; - t->texel[4] = vd->tmushare.ai44; + t->texel[2] = v->tmushare.alpha8; + t->texel[3] = v->tmushare.int8; + t->texel[4] = v->tmushare.ai44; t->texel[5] = t->palette; - t->texel[6] = (vd->vd_type >= TYPE_VOODOO_2) ? t->palettea : nullptr; + t->texel[6] = (v->type >= TYPE_VOODOO_2) ? t->palettea : nullptr; t->texel[7] = nullptr; - t->texel[8] = vd->tmushare.rgb332; + t->texel[8] = v->tmushare.rgb332; t->texel[9] = t->ncc[0].texel; - t->texel[10] = vd->tmushare.rgb565; - t->texel[11] = vd->tmushare.argb1555; - t->texel[12] = vd->tmushare.argb4444; - t->texel[13] = vd->tmushare.int8; + t->texel[10] = v->tmushare.rgb565; + t->texel[11] = v->tmushare.argb1555; + t->texel[12] = v->tmushare.argb4444; + t->texel[13] = v->tmushare.int8; t->texel[14] = t->palette; t->texel[15] = nullptr; t->lookup = t->texel[0]; /* attach the palette to NCC table 0 */ t->ncc[0].palette = t->palette; - if (vd->vd_type >= TYPE_VOODOO_2) + if (v->type >= TYPE_VOODOO_2) t->ncc[0].palettea = t->palettea; /* set up texture address calculations */ - if (vd->vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { t->texaddr_mask = 0x0fffff; t->texaddr_shift = 3; @@ -547,180 +606,181 @@ void voodoo_device::init_tmu(voodoo_device* vd, tmu_state *t, voodoo_reg *reg, v } -void voodoo_device::voodoo_postload(voodoo_device *vd) +static void voodoo_postload(voodoo_state *v) { int index, subindex; - vd->fbi.clut_dirty = TRUE; - for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++) + v->fbi.clut_dirty = TRUE; + for (index = 0; index < ARRAY_LENGTH(v->tmu); index++) { - vd->tmu[index].regdirty = TRUE; - for (subindex = 0; subindex < ARRAY_LENGTH(vd->tmu[index].ncc); subindex++) - vd->tmu[index].ncc[subindex].dirty = TRUE; + v->tmu[index].regdirty = TRUE; + for (subindex = 0; subindex < ARRAY_LENGTH(v->tmu[index].ncc); subindex++) + v->tmu[index].ncc[subindex].dirty = TRUE; } /* recompute video memory to get the FBI FIFO base recomputed */ - if (vd->vd_type <= TYPE_VOODOO_2) - recompute_video_memory(vd); + if (v->type <= TYPE_VOODOO_2) + recompute_video_memory(v); } -static void init_save_state(voodoo_device *vd) +static void init_save_state(device_t *device) { + voodoo_state *v = get_safe_token(device); int index, subindex; - vd->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_device::voodoo_postload), vd)); + device->machine().save().register_postload(save_prepost_delegate(FUNC(voodoo_postload), v)); /* register states: core */ - vd->save_item(NAME(vd->extra_cycles)); - vd->save_pointer(NAME(&vd->reg[0].u), ARRAY_LENGTH(vd->reg)); - vd->save_item(NAME(vd->alt_regmap)); + device->save_item(NAME(v->extra_cycles)); + device->save_pointer(NAME(&v->reg[0].u), ARRAY_LENGTH(v->reg)); + device->save_item(NAME(v->alt_regmap)); /* register states: pci */ - vd->save_item(NAME(vd->pci.fifo.in)); - vd->save_item(NAME(vd->pci.fifo.out)); - vd->save_item(NAME(vd->pci.init_enable)); - vd->save_item(NAME(vd->pci.stall_state)); - vd->save_item(NAME(vd->pci.op_pending)); - vd->save_item(NAME(vd->pci.op_end_time)); - vd->save_item(NAME(vd->pci.fifo_mem)); + device->save_item(NAME(v->pci.fifo.in)); + device->save_item(NAME(v->pci.fifo.out)); + device->save_item(NAME(v->pci.init_enable)); + device->save_item(NAME(v->pci.stall_state)); + device->save_item(NAME(v->pci.op_pending)); + device->save_item(NAME(v->pci.op_end_time)); + device->save_item(NAME(v->pci.fifo_mem)); /* register states: dac */ - vd->save_item(NAME(vd->dac.reg)); - vd->save_item(NAME(vd->dac.read_result)); + device->save_item(NAME(v->dac.reg)); + device->save_item(NAME(v->dac.read_result)); /* register states: fbi */ - vd->save_pointer(NAME(vd->fbi.ram), vd->fbi.mask + 1); - vd->save_item(NAME(vd->fbi.rgboffs)); - vd->save_item(NAME(vd->fbi.auxoffs)); - vd->save_item(NAME(vd->fbi.frontbuf)); - vd->save_item(NAME(vd->fbi.backbuf)); - vd->save_item(NAME(vd->fbi.swaps_pending)); - vd->save_item(NAME(vd->fbi.video_changed)); - vd->save_item(NAME(vd->fbi.yorigin)); - vd->save_item(NAME(vd->fbi.lfb_base)); - vd->save_item(NAME(vd->fbi.lfb_stride)); - vd->save_item(NAME(vd->fbi.width)); - vd->save_item(NAME(vd->fbi.height)); - vd->save_item(NAME(vd->fbi.xoffs)); - vd->save_item(NAME(vd->fbi.yoffs)); - vd->save_item(NAME(vd->fbi.vsyncscan)); - vd->save_item(NAME(vd->fbi.rowpixels)); - vd->save_item(NAME(vd->fbi.vblank)); - vd->save_item(NAME(vd->fbi.vblank_count)); - vd->save_item(NAME(vd->fbi.vblank_swap_pending)); - vd->save_item(NAME(vd->fbi.vblank_swap)); - vd->save_item(NAME(vd->fbi.vblank_dont_swap)); - vd->save_item(NAME(vd->fbi.cheating_allowed)); - vd->save_item(NAME(vd->fbi.sign)); - vd->save_item(NAME(vd->fbi.ax)); - vd->save_item(NAME(vd->fbi.ay)); - vd->save_item(NAME(vd->fbi.bx)); - vd->save_item(NAME(vd->fbi.by)); - vd->save_item(NAME(vd->fbi.cx)); - vd->save_item(NAME(vd->fbi.cy)); - vd->save_item(NAME(vd->fbi.startr)); - vd->save_item(NAME(vd->fbi.startg)); - vd->save_item(NAME(vd->fbi.startb)); - vd->save_item(NAME(vd->fbi.starta)); - vd->save_item(NAME(vd->fbi.startz)); - vd->save_item(NAME(vd->fbi.startw)); - vd->save_item(NAME(vd->fbi.drdx)); - vd->save_item(NAME(vd->fbi.dgdx)); - vd->save_item(NAME(vd->fbi.dbdx)); - vd->save_item(NAME(vd->fbi.dadx)); - vd->save_item(NAME(vd->fbi.dzdx)); - vd->save_item(NAME(vd->fbi.dwdx)); - vd->save_item(NAME(vd->fbi.drdy)); - vd->save_item(NAME(vd->fbi.dgdy)); - vd->save_item(NAME(vd->fbi.dbdy)); - vd->save_item(NAME(vd->fbi.dady)); - vd->save_item(NAME(vd->fbi.dzdy)); - vd->save_item(NAME(vd->fbi.dwdy)); - vd->save_item(NAME(vd->fbi.lfb_stats.pixels_in)); - vd->save_item(NAME(vd->fbi.lfb_stats.pixels_out)); - vd->save_item(NAME(vd->fbi.lfb_stats.chroma_fail)); - vd->save_item(NAME(vd->fbi.lfb_stats.zfunc_fail)); - vd->save_item(NAME(vd->fbi.lfb_stats.afunc_fail)); - vd->save_item(NAME(vd->fbi.lfb_stats.clip_fail)); - vd->save_item(NAME(vd->fbi.lfb_stats.stipple_count)); - vd->save_item(NAME(vd->fbi.sverts)); - for (index = 0; index < ARRAY_LENGTH(vd->fbi.svert); index++) + device->save_pointer(NAME(v->fbi.ram), v->fbi.mask + 1); + device->save_item(NAME(v->fbi.rgboffs)); + device->save_item(NAME(v->fbi.auxoffs)); + device->save_item(NAME(v->fbi.frontbuf)); + device->save_item(NAME(v->fbi.backbuf)); + device->save_item(NAME(v->fbi.swaps_pending)); + device->save_item(NAME(v->fbi.video_changed)); + device->save_item(NAME(v->fbi.yorigin)); + device->save_item(NAME(v->fbi.lfb_base)); + device->save_item(NAME(v->fbi.lfb_stride)); + device->save_item(NAME(v->fbi.width)); + device->save_item(NAME(v->fbi.height)); + device->save_item(NAME(v->fbi.xoffs)); + device->save_item(NAME(v->fbi.yoffs)); + device->save_item(NAME(v->fbi.vsyncscan)); + device->save_item(NAME(v->fbi.rowpixels)); + device->save_item(NAME(v->fbi.vblank)); + device->save_item(NAME(v->fbi.vblank_count)); + device->save_item(NAME(v->fbi.vblank_swap_pending)); + device->save_item(NAME(v->fbi.vblank_swap)); + device->save_item(NAME(v->fbi.vblank_dont_swap)); + device->save_item(NAME(v->fbi.cheating_allowed)); + device->save_item(NAME(v->fbi.sign)); + device->save_item(NAME(v->fbi.ax)); + device->save_item(NAME(v->fbi.ay)); + device->save_item(NAME(v->fbi.bx)); + device->save_item(NAME(v->fbi.by)); + device->save_item(NAME(v->fbi.cx)); + device->save_item(NAME(v->fbi.cy)); + device->save_item(NAME(v->fbi.startr)); + device->save_item(NAME(v->fbi.startg)); + device->save_item(NAME(v->fbi.startb)); + device->save_item(NAME(v->fbi.starta)); + device->save_item(NAME(v->fbi.startz)); + device->save_item(NAME(v->fbi.startw)); + device->save_item(NAME(v->fbi.drdx)); + device->save_item(NAME(v->fbi.dgdx)); + device->save_item(NAME(v->fbi.dbdx)); + device->save_item(NAME(v->fbi.dadx)); + device->save_item(NAME(v->fbi.dzdx)); + device->save_item(NAME(v->fbi.dwdx)); + device->save_item(NAME(v->fbi.drdy)); + device->save_item(NAME(v->fbi.dgdy)); + device->save_item(NAME(v->fbi.dbdy)); + device->save_item(NAME(v->fbi.dady)); + device->save_item(NAME(v->fbi.dzdy)); + device->save_item(NAME(v->fbi.dwdy)); + device->save_item(NAME(v->fbi.lfb_stats.pixels_in)); + device->save_item(NAME(v->fbi.lfb_stats.pixels_out)); + device->save_item(NAME(v->fbi.lfb_stats.chroma_fail)); + device->save_item(NAME(v->fbi.lfb_stats.zfunc_fail)); + device->save_item(NAME(v->fbi.lfb_stats.afunc_fail)); + device->save_item(NAME(v->fbi.lfb_stats.clip_fail)); + device->save_item(NAME(v->fbi.lfb_stats.stipple_count)); + device->save_item(NAME(v->fbi.sverts)); + for (index = 0; index < ARRAY_LENGTH(v->fbi.svert); index++) { - vd->save_item(NAME(vd->fbi.svert[index].x), index); - vd->save_item(NAME(vd->fbi.svert[index].y), index); - vd->save_item(NAME(vd->fbi.svert[index].a), index); - vd->save_item(NAME(vd->fbi.svert[index].r), index); - vd->save_item(NAME(vd->fbi.svert[index].g), index); - vd->save_item(NAME(vd->fbi.svert[index].b), index); - vd->save_item(NAME(vd->fbi.svert[index].z), index); - vd->save_item(NAME(vd->fbi.svert[index].wb), index); - vd->save_item(NAME(vd->fbi.svert[index].w0), index); - vd->save_item(NAME(vd->fbi.svert[index].s0), index); - vd->save_item(NAME(vd->fbi.svert[index].t0), index); - vd->save_item(NAME(vd->fbi.svert[index].w1), index); - vd->save_item(NAME(vd->fbi.svert[index].s1), index); - vd->save_item(NAME(vd->fbi.svert[index].t1), index); + device->save_item(NAME(v->fbi.svert[index].x), index); + device->save_item(NAME(v->fbi.svert[index].y), index); + device->save_item(NAME(v->fbi.svert[index].a), index); + device->save_item(NAME(v->fbi.svert[index].r), index); + device->save_item(NAME(v->fbi.svert[index].g), index); + device->save_item(NAME(v->fbi.svert[index].b), index); + device->save_item(NAME(v->fbi.svert[index].z), index); + device->save_item(NAME(v->fbi.svert[index].wb), index); + device->save_item(NAME(v->fbi.svert[index].w0), index); + device->save_item(NAME(v->fbi.svert[index].s0), index); + device->save_item(NAME(v->fbi.svert[index].t0), index); + device->save_item(NAME(v->fbi.svert[index].w1), index); + device->save_item(NAME(v->fbi.svert[index].s1), index); + device->save_item(NAME(v->fbi.svert[index].t1), index); } - vd->save_item(NAME(vd->fbi.fifo.size)); - vd->save_item(NAME(vd->fbi.fifo.in)); - vd->save_item(NAME(vd->fbi.fifo.out)); - for (index = 0; index < ARRAY_LENGTH(vd->fbi.cmdfifo); index++) + device->save_item(NAME(v->fbi.fifo.size)); + device->save_item(NAME(v->fbi.fifo.in)); + device->save_item(NAME(v->fbi.fifo.out)); + for (index = 0; index < ARRAY_LENGTH(v->fbi.cmdfifo); index++) { - vd->save_item(NAME(vd->fbi.cmdfifo[index].enable), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].count_holes), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].base), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].end), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].rdptr), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].amin), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].amax), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].depth), index); - vd->save_item(NAME(vd->fbi.cmdfifo[index].holes), index); + device->save_item(NAME(v->fbi.cmdfifo[index].enable), index); + device->save_item(NAME(v->fbi.cmdfifo[index].count_holes), index); + device->save_item(NAME(v->fbi.cmdfifo[index].base), index); + device->save_item(NAME(v->fbi.cmdfifo[index].end), index); + device->save_item(NAME(v->fbi.cmdfifo[index].rdptr), index); + device->save_item(NAME(v->fbi.cmdfifo[index].amin), index); + device->save_item(NAME(v->fbi.cmdfifo[index].amax), index); + device->save_item(NAME(v->fbi.cmdfifo[index].depth), index); + device->save_item(NAME(v->fbi.cmdfifo[index].holes), index); } - vd->save_item(NAME(vd->fbi.fogblend)); - vd->save_item(NAME(vd->fbi.fogdelta)); - vd->save_item(NAME(vd->fbi.clut)); + device->save_item(NAME(v->fbi.fogblend)); + device->save_item(NAME(v->fbi.fogdelta)); + device->save_item(NAME(v->fbi.clut)); /* register states: tmu */ - for (index = 0; index < ARRAY_LENGTH(vd->tmu); index++) + for (index = 0; index < ARRAY_LENGTH(v->tmu); index++) { - tmu_state *tmu = &vd->tmu[index]; + tmu_state *tmu = &v->tmu[index]; if (tmu->ram == nullptr) continue; - if (tmu->ram != vd->fbi.ram) - vd->save_pointer(NAME(tmu->ram), tmu->mask + 1, index); - vd->save_item(NAME(tmu->starts), index); - vd->save_item(NAME(tmu->startt), index); - vd->save_item(NAME(tmu->startw), index); - vd->save_item(NAME(tmu->dsdx), index); - vd->save_item(NAME(tmu->dtdx), index); - vd->save_item(NAME(tmu->dwdx), index); - vd->save_item(NAME(tmu->dsdy), index); - vd->save_item(NAME(tmu->dtdy), index); - vd->save_item(NAME(tmu->dwdy), index); + if (tmu->ram != v->fbi.ram) + device->save_pointer(NAME(tmu->ram), tmu->mask + 1, index); + device->save_item(NAME(tmu->starts), index); + device->save_item(NAME(tmu->startt), index); + device->save_item(NAME(tmu->startw), index); + device->save_item(NAME(tmu->dsdx), index); + device->save_item(NAME(tmu->dtdx), index); + device->save_item(NAME(tmu->dwdx), index); + device->save_item(NAME(tmu->dsdy), index); + device->save_item(NAME(tmu->dtdy), index); + device->save_item(NAME(tmu->dwdy), index); for (subindex = 0; subindex < ARRAY_LENGTH(tmu->ncc); subindex++) { - vd->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex); - vd->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].ir), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].ig), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].ib), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].qr), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].qg), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].qb), index * ARRAY_LENGTH(tmu->ncc) + subindex); + device->save_item(NAME(tmu->ncc[subindex].y), index * ARRAY_LENGTH(tmu->ncc) + subindex); } } /* register states: banshee */ - if (vd->vd_type >= TYPE_VOODOO_BANSHEE) + if (v->type >= TYPE_VOODOO_BANSHEE) { - vd->save_item(NAME(vd->banshee.io)); - vd->save_item(NAME(vd->banshee.agp)); - vd->save_item(NAME(vd->banshee.vga)); - vd->save_item(NAME(vd->banshee.crtc)); - vd->save_item(NAME(vd->banshee.seq)); - vd->save_item(NAME(vd->banshee.gc)); - vd->save_item(NAME(vd->banshee.att)); - vd->save_item(NAME(vd->banshee.attff)); + device->save_item(NAME(v->banshee.io)); + device->save_item(NAME(v->banshee.agp)); + device->save_item(NAME(v->banshee.vga)); + device->save_item(NAME(v->banshee.crtc)); + device->save_item(NAME(v->banshee.seq)); + device->save_item(NAME(v->banshee.gc)); + device->save_item(NAME(v->banshee.att)); + device->save_item(NAME(v->banshee.attff)); } } @@ -732,27 +792,27 @@ static void init_save_state(voodoo_device *vd) * *************************************/ -static void accumulate_statistics(voodoo_device *vd, const stats_block *stats) +static void accumulate_statistics(voodoo_state *v, const stats_block *stats) { /* apply internal voodoo statistics */ - vd->reg[fbiPixelsIn].u += stats->pixels_in; - vd->reg[fbiPixelsOut].u += stats->pixels_out; - vd->reg[fbiChromaFail].u += stats->chroma_fail; - vd->reg[fbiZfuncFail].u += stats->zfunc_fail; - vd->reg[fbiAfuncFail].u += stats->afunc_fail; + v->reg[fbiPixelsIn].u += stats->pixels_in; + v->reg[fbiPixelsOut].u += stats->pixels_out; + v->reg[fbiChromaFail].u += stats->chroma_fail; + v->reg[fbiZfuncFail].u += stats->zfunc_fail; + v->reg[fbiAfuncFail].u += stats->afunc_fail; /* apply emulation statistics */ - vd->stats.total_pixels_in += stats->pixels_in; - vd->stats.total_pixels_out += stats->pixels_out; - vd->stats.total_chroma_fail += stats->chroma_fail; - vd->stats.total_zfunc_fail += stats->zfunc_fail; - vd->stats.total_afunc_fail += stats->afunc_fail; - vd->stats.total_clipped += stats->clip_fail; - vd->stats.total_stippled += stats->stipple_count; + v->stats.total_pixels_in += stats->pixels_in; + v->stats.total_pixels_out += stats->pixels_out; + v->stats.total_chroma_fail += stats->chroma_fail; + v->stats.total_zfunc_fail += stats->zfunc_fail; + v->stats.total_afunc_fail += stats->afunc_fail; + v->stats.total_clipped += stats->clip_fail; + v->stats.total_stippled += stats->stipple_count; } -static void update_statistics(voodoo_device *vd, int accumulate) +static void update_statistics(voodoo_state *v, int accumulate) { int threadnum; @@ -760,14 +820,14 @@ static void update_statistics(voodoo_device *vd, int accumulate) for (threadnum = 0; threadnum < WORK_MAX_THREADS; threadnum++) { if (accumulate) - accumulate_statistics(vd, &vd->thread_stats[threadnum]); - memset(&vd->thread_stats[threadnum], 0, sizeof(vd->thread_stats[threadnum])); + accumulate_statistics(v, &v->thread_stats[threadnum]); + memset(&v->thread_stats[threadnum], 0, sizeof(v->thread_stats[threadnum])); } /* accumulate/reset statistics from the LFB */ if (accumulate) - accumulate_statistics(vd, &vd->fbi.lfb_stats); - memset(&vd->fbi.lfb_stats, 0, sizeof(vd->fbi.lfb_stats)); + accumulate_statistics(v, &v->fbi.lfb_stats); + memset(&v->fbi.lfb_stats, 0, sizeof(v->fbi.lfb_stats)); } @@ -778,208 +838,210 @@ static void update_statistics(voodoo_device *vd, int accumulate) * *************************************/ -void voodoo_device::swap_buffers(voodoo_device *vd) +static void swap_buffers(voodoo_state *v) { int count; - if (LOG_VBLANK_SWAP) vd->device->logerror("--- swap_buffers @ %d\n", vd->screen->vpos()); + if (LOG_VBLANK_SWAP) v->device->logerror("--- swap_buffers @ %d\n", v->screen->vpos()); /* force a partial update */ - vd->screen->update_partial(vd->screen->vpos()); - vd->fbi.video_changed = TRUE; + v->screen->update_partial(v->screen->vpos()); + v->fbi.video_changed = TRUE; /* keep a history of swap intervals */ - count = vd->fbi.vblank_count; + count = v->fbi.vblank_count; if (count > 15) count = 15; - vd->reg[fbiSwapHistory].u = (vd->reg[fbiSwapHistory].u << 4) | count; + v->reg[fbiSwapHistory].u = (v->reg[fbiSwapHistory].u << 4) | count; /* rotate the buffers */ - if (vd->vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { - if (vd->vd_type < TYPE_VOODOO_2 || !vd->fbi.vblank_dont_swap) + if (v->type < TYPE_VOODOO_2 || !v->fbi.vblank_dont_swap) { - if (vd->fbi.rgboffs[2] == ~0) + if (v->fbi.rgboffs[2] == ~0) { - vd->fbi.frontbuf = 1 - vd->fbi.frontbuf; - vd->fbi.backbuf = 1 - vd->fbi.frontbuf; + v->fbi.frontbuf = 1 - v->fbi.frontbuf; + v->fbi.backbuf = 1 - v->fbi.frontbuf; } else { - vd->fbi.frontbuf = (vd->fbi.frontbuf + 1) % 3; - vd->fbi.backbuf = (vd->fbi.frontbuf + 1) % 3; + v->fbi.frontbuf = (v->fbi.frontbuf + 1) % 3; + v->fbi.backbuf = (v->fbi.frontbuf + 1) % 3; } } } else - vd->fbi.rgboffs[0] = vd->reg[leftOverlayBuf].u & vd->fbi.mask & ~0x0f; + v->fbi.rgboffs[0] = v->reg[leftOverlayBuf].u & v->fbi.mask & ~0x0f; /* decrement the pending count and reset our state */ - if (vd->fbi.swaps_pending) - vd->fbi.swaps_pending--; - vd->fbi.vblank_count = 0; - vd->fbi.vblank_swap_pending = FALSE; + if (v->fbi.swaps_pending) + v->fbi.swaps_pending--; + v->fbi.vblank_count = 0; + v->fbi.vblank_swap_pending = FALSE; /* reset the last_op_time to now and start processing the next command */ - if (vd->pci.op_pending) + if (v->pci.op_pending) { - vd->pci.op_end_time = vd->device->machine().time(); - flush_fifos(vd, vd->pci.op_end_time); + v->pci.op_end_time = v->device->machine().time(); + flush_fifos(v, v->pci.op_end_time); } /* we may be able to unstall now */ - if (vd->pci.stall_state != NOT_STALLED) - check_stalled_cpu(vd, vd->device->machine().time()); + if (v->pci.stall_state != NOT_STALLED) + check_stalled_cpu(v, v->device->machine().time()); /* periodically log rasterizer info */ - vd->stats.swaps++; - if (LOG_RASTERIZERS && vd->stats.swaps % 1000 == 0) - dump_rasterizer_stats(vd); + v->stats.swaps++; + if (LOG_RASTERIZERS && v->stats.swaps % 1000 == 0) + dump_rasterizer_stats(v); /* update the statistics (debug) */ - if (vd->stats.display) + if (v->stats.display) { - const rectangle &visible_area = vd->screen->visible_area(); + const rectangle &visible_area = v->screen->visible_area(); int screen_area = visible_area.width() * visible_area.height(); - char *statsptr = vd->stats.buffer; + char *statsptr = v->stats.buffer; int pixelcount; int i; - update_statistics(vd, TRUE); - pixelcount = vd->stats.total_pixels_out; + update_statistics(v, TRUE); + pixelcount = v->stats.total_pixels_out; - statsptr += sprintf(statsptr, "Swap:%6d\n", vd->stats.swaps); - statsptr += sprintf(statsptr, "Hist:%08X\n", vd->reg[fbiSwapHistory].u); - statsptr += sprintf(statsptr, "Stal:%6d\n", vd->stats.stalls); + statsptr += sprintf(statsptr, "Swap:%6d\n", v->stats.swaps); + statsptr += sprintf(statsptr, "Hist:%08X\n", v->reg[fbiSwapHistory].u); + statsptr += sprintf(statsptr, "Stal:%6d\n", v->stats.stalls); statsptr += sprintf(statsptr, "Rend:%6d%%\n", pixelcount * 100 / screen_area); - statsptr += sprintf(statsptr, "Poly:%6d\n", vd->stats.total_triangles); - statsptr += sprintf(statsptr, "PxIn:%6d\n", vd->stats.total_pixels_in); - statsptr += sprintf(statsptr, "POut:%6d\n", vd->stats.total_pixels_out); - statsptr += sprintf(statsptr, "Clip:%6d\n", vd->stats.total_clipped); - statsptr += sprintf(statsptr, "Stip:%6d\n", vd->stats.total_stippled); - statsptr += sprintf(statsptr, "Chro:%6d\n", vd->stats.total_chroma_fail); - statsptr += sprintf(statsptr, "ZFun:%6d\n", vd->stats.total_zfunc_fail); - statsptr += sprintf(statsptr, "AFun:%6d\n", vd->stats.total_afunc_fail); - statsptr += sprintf(statsptr, "RegW:%6d\n", vd->stats.reg_writes); - statsptr += sprintf(statsptr, "RegR:%6d\n", vd->stats.reg_reads); - statsptr += sprintf(statsptr, "LFBW:%6d\n", vd->stats.lfb_writes); - statsptr += sprintf(statsptr, "LFBR:%6d\n", vd->stats.lfb_reads); - statsptr += sprintf(statsptr, "TexW:%6d\n", vd->stats.tex_writes); + statsptr += sprintf(statsptr, "Poly:%6d\n", v->stats.total_triangles); + statsptr += sprintf(statsptr, "PxIn:%6d\n", v->stats.total_pixels_in); + statsptr += sprintf(statsptr, "POut:%6d\n", v->stats.total_pixels_out); + statsptr += sprintf(statsptr, "Clip:%6d\n", v->stats.total_clipped); + statsptr += sprintf(statsptr, "Stip:%6d\n", v->stats.total_stippled); + statsptr += sprintf(statsptr, "Chro:%6d\n", v->stats.total_chroma_fail); + statsptr += sprintf(statsptr, "ZFun:%6d\n", v->stats.total_zfunc_fail); + statsptr += sprintf(statsptr, "AFun:%6d\n", v->stats.total_afunc_fail); + statsptr += sprintf(statsptr, "RegW:%6d\n", v->stats.reg_writes); + statsptr += sprintf(statsptr, "RegR:%6d\n", v->stats.reg_reads); + statsptr += sprintf(statsptr, "LFBW:%6d\n", v->stats.lfb_writes); + statsptr += sprintf(statsptr, "LFBR:%6d\n", v->stats.lfb_reads); + statsptr += sprintf(statsptr, "TexW:%6d\n", v->stats.tex_writes); statsptr += sprintf(statsptr, "TexM:"); for (i = 0; i < 16; i++) - if (vd->stats.texture_mode[i]) + if (v->stats.texture_mode[i]) *statsptr++ = "0123456789ABCDEF"[i]; *statsptr = 0; } /* update statistics */ - vd->stats.stalls = 0; - vd->stats.total_triangles = 0; - vd->stats.total_pixels_in = 0; - vd->stats.total_pixels_out = 0; - vd->stats.total_chroma_fail = 0; - vd->stats.total_zfunc_fail = 0; - vd->stats.total_afunc_fail = 0; - vd->stats.total_clipped = 0; - vd->stats.total_stippled = 0; - vd->stats.reg_writes = 0; - vd->stats.reg_reads = 0; - vd->stats.lfb_writes = 0; - vd->stats.lfb_reads = 0; - vd->stats.tex_writes = 0; - memset(vd->stats.texture_mode, 0, sizeof(vd->stats.texture_mode)); + v->stats.stalls = 0; + v->stats.total_triangles = 0; + v->stats.total_pixels_in = 0; + v->stats.total_pixels_out = 0; + v->stats.total_chroma_fail = 0; + v->stats.total_zfunc_fail = 0; + v->stats.total_afunc_fail = 0; + v->stats.total_clipped = 0; + v->stats.total_stippled = 0; + v->stats.reg_writes = 0; + v->stats.reg_reads = 0; + v->stats.lfb_writes = 0; + v->stats.lfb_reads = 0; + v->stats.tex_writes = 0; + memset(v->stats.texture_mode, 0, sizeof(v->stats.texture_mode)); } -static void adjust_vblank_timer(voodoo_device *vd) +static void adjust_vblank_timer(voodoo_state *v) { - attotime vblank_period = vd->screen->time_until_pos(vd->fbi.vsyncscan); + attotime vblank_period = v->screen->time_until_pos(v->fbi.vsyncscan); /* if zero, adjust to next frame, otherwise we may get stuck in an infinite loop */ if (vblank_period == attotime::zero) - vblank_period = vd->screen->frame_period(); - vd->fbi.vblank_timer->adjust(vblank_period); + vblank_period = v->screen->frame_period(); + v->fbi.vblank_timer->adjust(vblank_period); } -TIMER_CALLBACK_MEMBER( voodoo_device::vblank_off_callback ) +static TIMER_CALLBACK( vblank_off_callback ) { - if (LOG_VBLANK_SWAP) device->logerror("--- vblank end\n"); + voodoo_state *v = (voodoo_state *)ptr; + + if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank end\n"); /* set internal state and call the client */ - fbi.vblank = FALSE; + v->fbi.vblank = FALSE; // TODO: Vblank IRQ enable is VOODOO3 only? - if (vd_type >= TYPE_VOODOO_3) + if (v->type >= TYPE_VOODOO_3) { - if (reg[intrCtrl].u & 0x8) // call IRQ handler if VSYNC interrupt (falling) is enabled + if (v->reg[intrCtrl].u & 0x8) // call IRQ handler if VSYNC interrupt (falling) is enabled { - reg[intrCtrl].u |= 0x200; // VSYNC int (falling) active + v->reg[intrCtrl].u |= 0x200; // VSYNC int (falling) active - if (!device->m_vblank.isnull()) - device->m_vblank(FALSE); + if (!v->device->m_vblank.isnull()) + v->device->m_vblank(FALSE); } } else { - if (!device->m_vblank.isnull()) - device->m_vblank(FALSE); + if (!v->device->m_vblank.isnull()) + v->device->m_vblank(FALSE); } /* go to the end of the next frame */ - adjust_vblank_timer(this); + adjust_vblank_timer(v); } -TIMER_CALLBACK_MEMBER( voodoo_device::vblank_callback ) +static TIMER_CALLBACK( vblank_callback ) { - if (LOG_VBLANK_SWAP) device->logerror("--- vblank start\n"); + voodoo_state *v = (voodoo_state *)ptr; + + if (LOG_VBLANK_SWAP) v->device->logerror("--- vblank start\n"); /* flush the pipes */ - if (pci.op_pending) + if (v->pci.op_pending) { - if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush begin\n"); - flush_fifos(this, machine().time()); - if (LOG_VBLANK_SWAP) device->logerror("---- vblank flush end\n"); + if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush begin\n"); + flush_fifos(v, machine.time()); + if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank flush end\n"); } /* increment the count */ - fbi.vblank_count++; - if (fbi.vblank_count > 250) - fbi.vblank_count = 250; - if (LOG_VBLANK_SWAP) device->logerror("---- vblank count = %d", fbi.vblank_count); - if (fbi.vblank_swap_pending) - if (LOG_VBLANK_SWAP) device->logerror(" (target=%d)", fbi.vblank_swap); - if (LOG_VBLANK_SWAP) device->logerror("\n"); + v->fbi.vblank_count++; + if (v->fbi.vblank_count > 250) + v->fbi.vblank_count = 250; + if (LOG_VBLANK_SWAP) v->device->logerror("---- vblank count = %d", v->fbi.vblank_count); + if (v->fbi.vblank_swap_pending) + if (LOG_VBLANK_SWAP) v->device->logerror(" (target=%d)", v->fbi.vblank_swap); + if (LOG_VBLANK_SWAP) v->device->logerror("\n"); /* if we're past the swap count, do the swap */ - if (fbi.vblank_swap_pending && fbi.vblank_count >= fbi.vblank_swap) - swap_buffers(this); + if (v->fbi.vblank_swap_pending && v->fbi.vblank_count >= v->fbi.vblank_swap) + swap_buffers(v); /* set a timer for the next off state */ - machine().scheduler().timer_set(screen->time_until_pos(0), timer_expired_delegate(FUNC(voodoo_device::vblank_off_callback),this), 0, this); - - + machine.scheduler().timer_set(v->screen->time_until_pos(0), FUNC(vblank_off_callback), 0, v); /* set internal state and call the client */ - fbi.vblank = TRUE; + v->fbi.vblank = TRUE; // TODO: Vblank IRQ enable is VOODOO3 only? - if (vd_type >= TYPE_VOODOO_3) + if (v->type >= TYPE_VOODOO_3) { - if (reg[intrCtrl].u & 0x4) // call IRQ handler if VSYNC interrupt (rising) is enabled + if (v->reg[intrCtrl].u & 0x4) // call IRQ handler if VSYNC interrupt (rising) is enabled { - reg[intrCtrl].u |= 0x100; // VSYNC int (rising) active + v->reg[intrCtrl].u |= 0x100; // VSYNC int (rising) active - if (!device->m_vblank.isnull()) - device->m_vblank(TRUE); + if (!v->device->m_vblank.isnull()) + v->device->m_vblank(TRUE); } } else { - if (!device->m_vblank.isnull()) - device->m_vblank(TRUE); + if (!v->device->m_vblank.isnull()) + v->device->m_vblank(TRUE); } } @@ -991,23 +1053,23 @@ TIMER_CALLBACK_MEMBER( voodoo_device::vblank_callback ) * *************************************/ -static void reset_counters(voodoo_device *vd) +static void reset_counters(voodoo_state *v) { - update_statistics(vd, FALSE); - vd->reg[fbiPixelsIn].u = 0; - vd->reg[fbiChromaFail].u = 0; - vd->reg[fbiZfuncFail].u = 0; - vd->reg[fbiAfuncFail].u = 0; - vd->reg[fbiPixelsOut].u = 0; + update_statistics(v, FALSE); + v->reg[fbiPixelsIn].u = 0; + v->reg[fbiChromaFail].u = 0; + v->reg[fbiZfuncFail].u = 0; + v->reg[fbiAfuncFail].u = 0; + v->reg[fbiPixelsOut].u = 0; } -void voodoo_device::soft_reset(voodoo_device *vd) +static void soft_reset(voodoo_state *v) { - reset_counters(vd); - vd->reg[fbiTrianglesOut].u = 0; - fifo_reset(&vd->fbi.fifo); - fifo_reset(&vd->pci.fifo); + reset_counters(v); + v->reg[fbiTrianglesOut].u = 0; + fifo_reset(&v->fbi.fifo); + fifo_reset(&v->pci.fifo); } @@ -1018,103 +1080,103 @@ void voodoo_device::soft_reset(voodoo_device *vd) * *************************************/ -void voodoo_device::recompute_video_memory(voodoo_device *vd) +static void recompute_video_memory(voodoo_state *v) { - UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(vd->reg[fbiInit2].u); - UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(vd->reg[fbiInit4].u); - UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(vd->reg[fbiInit4].u); + UINT32 buffer_pages = FBIINIT2_VIDEO_BUFFER_OFFSET(v->reg[fbiInit2].u); + UINT32 fifo_start_page = FBIINIT4_MEMORY_FIFO_START_ROW(v->reg[fbiInit4].u); + UINT32 fifo_last_page = FBIINIT4_MEMORY_FIFO_STOP_ROW(v->reg[fbiInit4].u); UINT32 memory_config; int buf; /* memory config is determined differently between V1 and V2 */ - memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(vd->reg[fbiInit2].u); - if (vd->vd_type == TYPE_VOODOO_2 && memory_config == 0) - memory_config = FBIINIT5_BUFFER_ALLOCATION(vd->reg[fbiInit5].u); + memory_config = FBIINIT2_ENABLE_TRIPLE_BUF(v->reg[fbiInit2].u); + if (v->type == TYPE_VOODOO_2 && memory_config == 0) + memory_config = FBIINIT5_BUFFER_ALLOCATION(v->reg[fbiInit5].u); /* tiles are 64x16/32; x_tiles specifies how many half-tiles */ - vd->fbi.tile_width = (vd->vd_type == TYPE_VOODOO_1) ? 64 : 32; - vd->fbi.tile_height = (vd->vd_type == TYPE_VOODOO_1) ? 16 : 32; - vd->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(vd->reg[fbiInit1].u); - if (vd->vd_type == TYPE_VOODOO_2) + v->fbi.tile_width = (v->type == TYPE_VOODOO_1) ? 64 : 32; + v->fbi.tile_height = (v->type == TYPE_VOODOO_1) ? 16 : 32; + v->fbi.x_tiles = FBIINIT1_X_VIDEO_TILES(v->reg[fbiInit1].u); + if (v->type == TYPE_VOODOO_2) { - vd->fbi.x_tiles = (vd->fbi.x_tiles << 1) | - (FBIINIT1_X_VIDEO_TILES_BIT5(vd->reg[fbiInit1].u) << 5) | - (FBIINIT6_X_VIDEO_TILES_BIT0(vd->reg[fbiInit6].u)); + v->fbi.x_tiles = (v->fbi.x_tiles << 1) | + (FBIINIT1_X_VIDEO_TILES_BIT5(v->reg[fbiInit1].u) << 5) | + (FBIINIT6_X_VIDEO_TILES_BIT0(v->reg[fbiInit6].u)); } - vd->fbi.rowpixels = vd->fbi.tile_width * vd->fbi.x_tiles; + v->fbi.rowpixels = v->fbi.tile_width * v->fbi.x_tiles; -// logerror("VOODOO.%d.VIDMEM: buffer_pages=%X fifo=%X-%X tiles=%X rowpix=%d\n", vd->index, buffer_pages, fifo_start_page, fifo_last_page, vd->fbi.x_tiles, vd->fbi.rowpixels); +// logerror("VOODOO.%d.VIDMEM: buffer_pages=%X fifo=%X-%X tiles=%X rowpix=%d\n", v->index, buffer_pages, fifo_start_page, fifo_last_page, v->fbi.x_tiles, v->fbi.rowpixels); /* first RGB buffer always starts at 0 */ - vd->fbi.rgboffs[0] = 0; + v->fbi.rgboffs[0] = 0; /* second RGB buffer starts immediately afterwards */ - vd->fbi.rgboffs[1] = buffer_pages * 0x1000; + v->fbi.rgboffs[1] = buffer_pages * 0x1000; /* remaining buffers are based on the config */ switch (memory_config) { case 3: /* reserved */ - vd->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", vd->index); + v->device->logerror("VOODOO.%d.ERROR:Unexpected memory configuration in recompute_video_memory!\n", v->index); case 0: /* 2 color buffers, 1 aux buffer */ - vd->fbi.rgboffs[2] = ~0; - vd->fbi.auxoffs = 2 * buffer_pages * 0x1000; + v->fbi.rgboffs[2] = ~0; + v->fbi.auxoffs = 2 * buffer_pages * 0x1000; break; case 1: /* 3 color buffers, 0 aux buffers */ - vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; - vd->fbi.auxoffs = ~0; + v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; + v->fbi.auxoffs = ~0; break; case 2: /* 3 color buffers, 1 aux buffers */ - vd->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; - vd->fbi.auxoffs = 3 * buffer_pages * 0x1000; + v->fbi.rgboffs[2] = 2 * buffer_pages * 0x1000; + v->fbi.auxoffs = 3 * buffer_pages * 0x1000; break; } /* clamp the RGB buffers to video memory */ for (buf = 0; buf < 3; buf++) - if (vd->fbi.rgboffs[buf] != ~0 && vd->fbi.rgboffs[buf] > vd->fbi.mask) - vd->fbi.rgboffs[buf] = vd->fbi.mask; + if (v->fbi.rgboffs[buf] != ~0 && v->fbi.rgboffs[buf] > v->fbi.mask) + v->fbi.rgboffs[buf] = v->fbi.mask; /* clamp the aux buffer to video memory */ - if (vd->fbi.auxoffs != ~0 && vd->fbi.auxoffs > vd->fbi.mask) - vd->fbi.auxoffs = vd->fbi.mask; + if (v->fbi.auxoffs != ~0 && v->fbi.auxoffs > v->fbi.mask) + v->fbi.auxoffs = v->fbi.mask; /* osd_printf_debug("rgb[0] = %08X rgb[1] = %08X rgb[2] = %08X aux = %08X\n", - vd->fbi.rgboffs[0], vd->fbi.rgboffs[1], vd->fbi.rgboffs[2], vd->fbi.auxoffs);*/ + v->fbi.rgboffs[0], v->fbi.rgboffs[1], v->fbi.rgboffs[2], v->fbi.auxoffs);*/ /* compute the memory FIFO location and size */ - if (fifo_last_page > vd->fbi.mask / 0x1000) - fifo_last_page = vd->fbi.mask / 0x1000; + if (fifo_last_page > v->fbi.mask / 0x1000) + fifo_last_page = v->fbi.mask / 0x1000; /* is it valid and enabled? */ - if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) + if (fifo_start_page <= fifo_last_page && FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) { - vd->fbi.fifo.base = (UINT32 *)(vd->fbi.ram + fifo_start_page * 0x1000); - vd->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4; - if (vd->fbi.fifo.size > 65536*2) - vd->fbi.fifo.size = 65536*2; + v->fbi.fifo.base = (UINT32 *)(v->fbi.ram + fifo_start_page * 0x1000); + v->fbi.fifo.size = (fifo_last_page + 1 - fifo_start_page) * 0x1000 / 4; + if (v->fbi.fifo.size > 65536*2) + v->fbi.fifo.size = 65536*2; } /* if not, disable the FIFO */ else { - vd->fbi.fifo.base = nullptr; - vd->fbi.fifo.size = 0; + v->fbi.fifo.base = nullptr; + v->fbi.fifo.size = 0; } /* reset the FIFO */ - fifo_reset(&vd->fbi.fifo); + fifo_reset(&v->fbi.fifo); /* reset our front/back buffers if they are out of range */ - if (vd->fbi.rgboffs[2] == ~0) + if (v->fbi.rgboffs[2] == ~0) { - if (vd->fbi.frontbuf == 2) - vd->fbi.frontbuf = 0; - if (vd->fbi.backbuf == 2) - vd->fbi.backbuf = 0; + if (v->fbi.frontbuf == 2) + v->fbi.frontbuf = 0; + if (v->fbi.backbuf == 2) + v->fbi.backbuf = 0; } } @@ -1414,9 +1476,9 @@ static inline INT32 prepare_tmu(tmu_state *t) * *************************************/ -static int cmdfifo_compute_expected_depth(voodoo_device *vd, cmdfifo_info *f) +static int cmdfifo_compute_expected_depth(voodoo_state *v, cmdfifo_info *f) { - UINT32 *fifobase = (UINT32 *)vd->fbi.ram; + UINT32 *fifobase = (UINT32 *)v->fbi.ram; UINT32 readptr = f->rdptr; UINT32 command = fifobase[readptr / 4]; int i, count = 0; @@ -1554,9 +1616,9 @@ static int cmdfifo_compute_expected_depth(voodoo_device *vd, cmdfifo_info *f) * *************************************/ -UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) +static UINT32 cmdfifo_execute(voodoo_state *v, cmdfifo_info *f) { - UINT32 *fifobase = (UINT32 *)vd->fbi.ram; + UINT32 *fifobase = (UINT32 *)v->fbi.ram; UINT32 readptr = f->rdptr; UINT32 *src = &fifobase[readptr / 4]; UINT32 command = *src++; @@ -1587,26 +1649,26 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) switch ((command >> 3) & 7) { case 0: /* NOP */ - if (LOG_CMDFIFO) vd->device->logerror(" NOP\n"); + if (LOG_CMDFIFO) v->device->logerror(" NOP\n"); break; case 1: /* JSR */ - if (LOG_CMDFIFO) vd->device->logerror(" JSR $%06X\n", target); + if (LOG_CMDFIFO) v->device->logerror(" JSR $%06X\n", target); osd_printf_debug("JSR in CMDFIFO!\n"); src = &fifobase[target / 4]; break; case 2: /* RET */ - if (LOG_CMDFIFO) vd->device->logerror(" RET $%06X\n", target); + if (LOG_CMDFIFO) v->device->logerror(" RET $%06X\n", target); fatalerror("RET in CMDFIFO!\n"); case 3: /* JMP LOCAL FRAME BUFFER */ - if (LOG_CMDFIFO) vd->device->logerror(" JMP LOCAL FRAMEBUF $%06X\n", target); + if (LOG_CMDFIFO) v->device->logerror(" JMP LOCAL FRAMEBUF $%06X\n", target); src = &fifobase[target / 4]; break; case 4: /* JMP AGP */ - if (LOG_CMDFIFO) vd->device->logerror(" JMP AGP $%06X\n", target); + if (LOG_CMDFIFO) v->device->logerror(" JMP AGP $%06X\n", target); fatalerror("JMP AGP in CMDFIFO!\n"); src = &fifobase[target / 4]; break; @@ -1634,16 +1696,16 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) inc = (command >> 15) & 1; target = (command >> 3) & 0xfff; - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 1: count=%d inc=%d reg=%04X\n", count, inc, target); - if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) + if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) { // Banshee/Voodoo3 2D register writes /* loop over all registers and write them one at a time */ for (i = 0; i < count; i++, target += inc) { - cycles += banshee_2d_w(vd, target & 0xff, *src); + cycles += banshee_2d_w(v, target & 0xff, *src); //logerror(" 2d reg: %03x = %08X\n", target & 0x7ff, *src); src++; } @@ -1652,7 +1714,7 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) { /* loop over all registers and write them one at a time */ for (i = 0; i < count; i++, target += inc) - cycles += register_w(vd, target, *src++); + cycles += register_w(v, target, *src++); } break; @@ -1665,12 +1727,12 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) 1 31:0 = Data word */ case 2: - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 2: mask=%X\n", (command >> 3) & 0x1ffffff); /* loop over all registers and write them one at a time */ for (i = 3; i <= 31; i++) if (command & (1 << i)) - cycles += register_w(vd, banshee2D_clip0Min + (i - 3), *src++); + cycles += register_w(v, banshee2D_clip0Min + (i - 3), *src++); break; /* @@ -1702,10 +1764,10 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) count = (command >> 6) & 15; code = (command >> 3) & 7; - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 3: count=%d code=%d mask=%03X smode=%02X pc=%d\n", count, code, (command >> 10) & 0xfff, (command >> 22) & 0x3f, (command >> 28) & 1); /* copy relevant bits into the setup mode register */ - vd->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000); + v->reg[sSetupMode].u = ((command >> 10) & 0xff) | ((command >> 6) & 0xf0000); /* loop over triangles */ for (i = 0; i < count; i++) @@ -1772,8 +1834,8 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) /* for a series of individual triangles, initialize all the verts */ if ((code == 1 && i == 0) || (code == 0 && i % 3 == 0)) { - vd->fbi.sverts = 1; - vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2] = svert; + v->fbi.sverts = 1; + v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2] = svert; } /* otherwise, add this to the list */ @@ -1781,15 +1843,15 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) { /* for strip mode, shuffle vertex 1 down to 0 */ if (!(command & (1 << 22))) - vd->fbi.svert[0] = vd->fbi.svert[1]; + v->fbi.svert[0] = v->fbi.svert[1]; /* copy 2 down to 1 and add our new one regardless */ - vd->fbi.svert[1] = vd->fbi.svert[2]; - vd->fbi.svert[2] = svert; + v->fbi.svert[1] = v->fbi.svert[2]; + v->fbi.svert[2] = svert; /* if we have enough, draw */ - if (++vd->fbi.sverts >= 3) - cycles += setup_and_draw_triangle(vd); + if (++v->fbi.sverts >= 3) + cycles += setup_and_draw_triangle(v); } } @@ -1812,9 +1874,9 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) /* extract parameters */ target = (command >> 3) & 0xfff; - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 4: mask=%X reg=%04X pad=%d\n", (command >> 15) & 0x3fff, target, command >> 29); - if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) + if (v->type >= TYPE_VOODOO_BANSHEE && (target & 0x800)) { // Banshee/Voodoo3 2D register writes @@ -1824,7 +1886,7 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) { if (command & (1 << i)) { - cycles += banshee_2d_w(vd, target + (i - 15), *src); + cycles += banshee_2d_w(v, target + (i - 15), *src); //logerror(" 2d reg: %03x = %08X\n", target & 0x7ff, *src); src++; } @@ -1835,7 +1897,7 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) /* loop over all registers and write them one at a time */ for (i = 15; i <= 28; i++) if (command & (1 << i)) - cycles += register_w(vd, target + (i - 15), *src++); + cycles += register_w(v, target + (i - 15), *src++); } /* account for the extra dummy words */ @@ -1866,17 +1928,17 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) { case 0: // Linear FB { - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: FB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); UINT32 addr = target * 4; for (i=0; i < count; i++) { UINT32 data = *src++; - vd->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data); - vd->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8); - vd->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16); - vd->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24); + v->fbi.ram[BYTE_XOR_LE(addr + 0)] = (UINT8)(data); + v->fbi.ram[BYTE_XOR_LE(addr + 1)] = (UINT8)(data >> 8); + v->fbi.ram[BYTE_XOR_LE(addr + 2)] = (UINT8)(data >> 16); + v->fbi.ram[BYTE_XOR_LE(addr + 3)] = (UINT8)(data >> 24); addr += 4; } @@ -1884,11 +1946,11 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) } case 2: // 3D LFB { - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: 3D LFB count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); /* loop over words */ for (i = 0; i < count; i++) - cycles += lfb_w(vd, target++, *src++, 0xffffffff); + cycles += lfb_w(v, target++, *src++, 0xffffffff); break; } @@ -1909,11 +1971,11 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) case 3: // Texture Port { - if (LOG_CMDFIFO) vd->device->logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); + if (LOG_CMDFIFO) v->device->logerror(" PACKET TYPE 5: textureRAM count=%d dest=%08X bd2=%X bdN=%X\n", count, target, (command >> 26) & 15, (command >> 22) & 15); /* loop over words */ for (i = 0; i < count; i++) - cycles += texture_w(vd, target++, *src++); + cycles += texture_w(v, target++, *src++); break; } @@ -1939,7 +2001,7 @@ UINT32 voodoo_device::cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f) * *************************************/ -INT32 voodoo_device::cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f) +static INT32 cmdfifo_execute_if_ready(voodoo_state *v, cmdfifo_info *f) { int needed_depth; int cycles; @@ -1949,12 +2011,12 @@ INT32 voodoo_device::cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f return -1; /* see if we have enough for the current command */ - needed_depth = cmdfifo_compute_expected_depth(vd, f); + needed_depth = cmdfifo_compute_expected_depth(v, f); if (f->depth < needed_depth) return -1; /* execute */ - cycles = cmdfifo_execute(vd, f); + cycles = cmdfifo_execute(v, f); f->depth -= needed_depth; return cycles; } @@ -1967,12 +2029,12 @@ INT32 voodoo_device::cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f * *************************************/ -void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data) +static void cmdfifo_w(voodoo_state *v, cmdfifo_info *f, offs_t offset, UINT32 data) { UINT32 addr = f->base + offset * 4; - UINT32 *fifobase = (UINT32 *)vd->fbi.ram; + UINT32 *fifobase = (UINT32 *)v->fbi.ram; - if (LOG_CMDFIFO_VERBOSE) vd->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data); + if (LOG_CMDFIFO_VERBOSE) v->device->logerror("CMDFIFO_w(%04X) = %08X\n", offset, data); /* write the data */ if (addr < f->end) @@ -1992,7 +2054,7 @@ void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, else if (addr < f->amin) { if (f->holes != 0) - vd->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n", + v->device->logerror("Unexpected CMDFIFO: AMin=%08X AMax=%08X Holes=%d WroteTo:%08X\n", f->amin, f->amax, f->holes, addr); //f->amin = f->amax = addr; f->holes += (addr - f->base) / 4; @@ -2022,17 +2084,17 @@ void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, } /* execute if we can */ - if (!vd->pci.op_pending) + if (!v->pci.op_pending) { - INT32 cycles = cmdfifo_execute_if_ready(vd, f); + INT32 cycles = cmdfifo_execute_if_ready(v, f); if (cycles > 0) { - vd->pci.op_pending = TRUE; - vd->pci.op_end_time = vd->device->machine().time() + attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle); + v->pci.op_pending = TRUE; + v->pci.op_end_time = v->device->machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", vd->index, - vd->device->machine().time().seconds(), (UINT32)(vd->device->machine().time().attoseconds() >> 32), (UINT32)vd->device->machine().time().attoseconds(), - vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds()); + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index, + v->device->machine().time().seconds(), (UINT32)(v->device->machine().time().attoseconds() >> 32), (UINT32)v->device->machine().time().attoseconds(), + v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); } } } @@ -2046,83 +2108,83 @@ void voodoo_device::cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, * *************************************/ -TIMER_CALLBACK_MEMBER( voodoo_device::stall_cpu_callback ) +static TIMER_CALLBACK( stall_cpu_callback ) { - check_stalled_cpu(this, machine().time()); + check_stalled_cpu((voodoo_state *)ptr, machine.time()); } -void voodoo_device::check_stalled_cpu(voodoo_device* vd, attotime current_time) +static void check_stalled_cpu(voodoo_state *v, attotime current_time) { int resume = FALSE; /* flush anything we can */ - if (vd->pci.op_pending) - flush_fifos(vd, current_time); + if (v->pci.op_pending) + flush_fifos(v, current_time); /* if we're just stalled until the LWM is passed, see if we're ok now */ - if (vd->pci.stall_state == STALLED_UNTIL_FIFO_LWM) + if (v->pci.stall_state == STALLED_UNTIL_FIFO_LWM) { /* if there's room in the memory FIFO now, we can proceed */ - if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) { - if (fifo_items(&vd->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(vd->reg[fbiInit0].u)) + if (fifo_items(&v->fbi.fifo) < 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u)) resume = TRUE; } - else if (fifo_space(&vd->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(vd->reg[fbiInit0].u)) + else if (fifo_space(&v->pci.fifo) > 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u)) resume = TRUE; } /* if we're stalled until the FIFOs are empty, check now */ - else if (vd->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY) + else if (v->pci.stall_state == STALLED_UNTIL_FIFO_EMPTY) { - if (FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u)) { - if (fifo_empty(&vd->fbi.fifo) && fifo_empty(&vd->pci.fifo)) + if (fifo_empty(&v->fbi.fifo) && fifo_empty(&v->pci.fifo)) resume = TRUE; } - else if (fifo_empty(&vd->pci.fifo)) + else if (fifo_empty(&v->pci.fifo)) resume = TRUE; } /* resume if necessary */ - if (resume || !vd->pci.op_pending) + if (resume || !v->pci.op_pending) { - if (LOG_FIFO) vd->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", vd->index); - vd->pci.stall_state = NOT_STALLED; + if (LOG_FIFO) v->device->logerror("VOODOO.%d.FIFO:Stall condition cleared; resuming\n", v->index); + v->pci.stall_state = NOT_STALLED; /* either call the callback, or trigger the trigger */ - if (!vd->device->m_stall.isnull()) - vd->device->m_stall(FALSE); + if (!v->device->m_stall.isnull()) + v->device->m_stall(FALSE); else - vd->device->machine().scheduler().trigger(vd->trigger); + v->device->machine().scheduler().trigger(v->trigger); } /* if not, set a timer for the next one */ else { - vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time); + v->pci.continue_timer->adjust(v->pci.op_end_time - current_time); } } -void voodoo_device::stall_cpu(voodoo_device *vd, int state, attotime current_time) +static void stall_cpu(voodoo_state *v, int state, attotime current_time) { /* sanity check */ - if (!vd->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n"); + if (!v->pci.op_pending) fatalerror("FIFOs not empty, no op pending!\n"); /* set the state and update statistics */ - vd->pci.stall_state = state; - vd->stats.stalls++; + v->pci.stall_state = state; + v->stats.stalls++; /* either call the callback, or spin the CPU */ - if (!vd->device->m_stall.isnull()) - vd->device->m_stall(TRUE); + if (!v->device->m_stall.isnull()) + v->device->m_stall(TRUE); else - vd->cpu->execute().spin_until_trigger(vd->trigger); + v->cpu->execute().spin_until_trigger(v->trigger); /* set a timer to clear the stall */ - vd->pci.continue_timer->adjust(vd->pci.op_end_time - current_time); + v->pci.continue_timer->adjust(v->pci.op_end_time - current_time); } @@ -2133,7 +2195,7 @@ void voodoo_device::stall_cpu(voodoo_device *vd, int state, attotime current_tim * *************************************/ -INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) +static INT32 register_w(voodoo_state *v, offs_t offset, UINT32 data) { UINT32 origdata = data; INT32 cycles = 0; @@ -2142,24 +2204,24 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) UINT8 chips; /* statistics */ - vd->stats.reg_writes++; + v->stats.reg_writes++; /* determine which chips we are addressing */ chips = (offset >> 8) & 0xf; if (chips == 0) chips = 0xf; - chips &= vd->chipmask; + chips &= v->chipmask; /* the first 64 registers can be aliased differently */ - if ((offset & 0x800c0) == 0x80000 && vd->alt_regmap) + if ((offset & 0x800c0) == 0x80000 && v->alt_regmap) regnum = register_alias_map[offset & 0x3f]; else regnum = offset & 0xff; /* first make sure this register is readable */ - if (!(vd->regaccess[regnum] & REGISTER_WRITE)) + if (!(v->regaccess[regnum] & REGISTER_WRITE)) { - vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", vd->index, vd->regnames[regnum]); + v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to write %s\n", v->index, v->regnames[regnum]); return 0; } @@ -2170,227 +2232,227 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case fvertexAx: data = float_to_int32(data, 4); case vertexAx: - if (chips & 1) vd->fbi.ax = (INT16)data; + if (chips & 1) v->fbi.ax = (INT16)data; break; case fvertexAy: data = float_to_int32(data, 4); case vertexAy: - if (chips & 1) vd->fbi.ay = (INT16)data; + if (chips & 1) v->fbi.ay = (INT16)data; break; case fvertexBx: data = float_to_int32(data, 4); case vertexBx: - if (chips & 1) vd->fbi.bx = (INT16)data; + if (chips & 1) v->fbi.bx = (INT16)data; break; case fvertexBy: data = float_to_int32(data, 4); case vertexBy: - if (chips & 1) vd->fbi.by = (INT16)data; + if (chips & 1) v->fbi.by = (INT16)data; break; case fvertexCx: data = float_to_int32(data, 4); case vertexCx: - if (chips & 1) vd->fbi.cx = (INT16)data; + if (chips & 1) v->fbi.cx = (INT16)data; break; case fvertexCy: data = float_to_int32(data, 4); case vertexCy: - if (chips & 1) vd->fbi.cy = (INT16)data; + if (chips & 1) v->fbi.cy = (INT16)data; break; /* RGB data is 12.12 formatted fixed point */ case fstartR: data = float_to_int32(data, 12); case startR: - if (chips & 1) vd->fbi.startr = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.startr = (INT32)(data << 8) >> 8; break; case fstartG: data = float_to_int32(data, 12); case startG: - if (chips & 1) vd->fbi.startg = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.startg = (INT32)(data << 8) >> 8; break; case fstartB: data = float_to_int32(data, 12); case startB: - if (chips & 1) vd->fbi.startb = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.startb = (INT32)(data << 8) >> 8; break; case fstartA: data = float_to_int32(data, 12); case startA: - if (chips & 1) vd->fbi.starta = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.starta = (INT32)(data << 8) >> 8; break; case fdRdX: data = float_to_int32(data, 12); case dRdX: - if (chips & 1) vd->fbi.drdx = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.drdx = (INT32)(data << 8) >> 8; break; case fdGdX: data = float_to_int32(data, 12); case dGdX: - if (chips & 1) vd->fbi.dgdx = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dgdx = (INT32)(data << 8) >> 8; break; case fdBdX: data = float_to_int32(data, 12); case dBdX: - if (chips & 1) vd->fbi.dbdx = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dbdx = (INT32)(data << 8) >> 8; break; case fdAdX: data = float_to_int32(data, 12); case dAdX: - if (chips & 1) vd->fbi.dadx = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dadx = (INT32)(data << 8) >> 8; break; case fdRdY: data = float_to_int32(data, 12); case dRdY: - if (chips & 1) vd->fbi.drdy = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.drdy = (INT32)(data << 8) >> 8; break; case fdGdY: data = float_to_int32(data, 12); case dGdY: - if (chips & 1) vd->fbi.dgdy = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dgdy = (INT32)(data << 8) >> 8; break; case fdBdY: data = float_to_int32(data, 12); case dBdY: - if (chips & 1) vd->fbi.dbdy = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dbdy = (INT32)(data << 8) >> 8; break; case fdAdY: data = float_to_int32(data, 12); case dAdY: - if (chips & 1) vd->fbi.dady = (INT32)(data << 8) >> 8; + if (chips & 1) v->fbi.dady = (INT32)(data << 8) >> 8; break; /* Z data is 20.12 formatted fixed point */ case fstartZ: data = float_to_int32(data, 12); case startZ: - if (chips & 1) vd->fbi.startz = (INT32)data; + if (chips & 1) v->fbi.startz = (INT32)data; break; case fdZdX: data = float_to_int32(data, 12); case dZdX: - if (chips & 1) vd->fbi.dzdx = (INT32)data; + if (chips & 1) v->fbi.dzdx = (INT32)data; break; case fdZdY: data = float_to_int32(data, 12); case dZdY: - if (chips & 1) vd->fbi.dzdy = (INT32)data; + if (chips & 1) v->fbi.dzdy = (INT32)data; break; /* S,T data is 14.18 formatted fixed point, converted to 16.32 internally */ case fstartS: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].starts = data64; - if (chips & 4) vd->tmu[1].starts = data64; + if (chips & 2) v->tmu[0].starts = data64; + if (chips & 4) v->tmu[1].starts = data64; break; case startS: - if (chips & 2) vd->tmu[0].starts = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].starts = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].starts = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].starts = (INT64)(INT32)data << 14; break; case fstartT: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].startt = data64; - if (chips & 4) vd->tmu[1].startt = data64; + if (chips & 2) v->tmu[0].startt = data64; + if (chips & 4) v->tmu[1].startt = data64; break; case startT: - if (chips & 2) vd->tmu[0].startt = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].startt = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].startt = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].startt = (INT64)(INT32)data << 14; break; case fdSdX: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].dsdx = data64; - if (chips & 4) vd->tmu[1].dsdx = data64; + if (chips & 2) v->tmu[0].dsdx = data64; + if (chips & 4) v->tmu[1].dsdx = data64; break; case dSdX: - if (chips & 2) vd->tmu[0].dsdx = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].dsdx = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].dsdx = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].dsdx = (INT64)(INT32)data << 14; break; case fdTdX: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].dtdx = data64; - if (chips & 4) vd->tmu[1].dtdx = data64; + if (chips & 2) v->tmu[0].dtdx = data64; + if (chips & 4) v->tmu[1].dtdx = data64; break; case dTdX: - if (chips & 2) vd->tmu[0].dtdx = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].dtdx = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].dtdx = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].dtdx = (INT64)(INT32)data << 14; break; case fdSdY: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].dsdy = data64; - if (chips & 4) vd->tmu[1].dsdy = data64; + if (chips & 2) v->tmu[0].dsdy = data64; + if (chips & 4) v->tmu[1].dsdy = data64; break; case dSdY: - if (chips & 2) vd->tmu[0].dsdy = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].dsdy = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].dsdy = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].dsdy = (INT64)(INT32)data << 14; break; case fdTdY: data64 = float_to_int64(data, 32); - if (chips & 2) vd->tmu[0].dtdy = data64; - if (chips & 4) vd->tmu[1].dtdy = data64; + if (chips & 2) v->tmu[0].dtdy = data64; + if (chips & 4) v->tmu[1].dtdy = data64; break; case dTdY: - if (chips & 2) vd->tmu[0].dtdy = (INT64)(INT32)data << 14; - if (chips & 4) vd->tmu[1].dtdy = (INT64)(INT32)data << 14; + if (chips & 2) v->tmu[0].dtdy = (INT64)(INT32)data << 14; + if (chips & 4) v->tmu[1].dtdy = (INT64)(INT32)data << 14; break; /* W data is 2.30 formatted fixed point, converted to 16.32 internally */ case fstartW: data64 = float_to_int64(data, 32); - if (chips & 1) vd->fbi.startw = data64; - if (chips & 2) vd->tmu[0].startw = data64; - if (chips & 4) vd->tmu[1].startw = data64; + if (chips & 1) v->fbi.startw = data64; + if (chips & 2) v->tmu[0].startw = data64; + if (chips & 4) v->tmu[1].startw = data64; break; case startW: - if (chips & 1) vd->fbi.startw = (INT64)(INT32)data << 2; - if (chips & 2) vd->tmu[0].startw = (INT64)(INT32)data << 2; - if (chips & 4) vd->tmu[1].startw = (INT64)(INT32)data << 2; + if (chips & 1) v->fbi.startw = (INT64)(INT32)data << 2; + if (chips & 2) v->tmu[0].startw = (INT64)(INT32)data << 2; + if (chips & 4) v->tmu[1].startw = (INT64)(INT32)data << 2; break; case fdWdX: data64 = float_to_int64(data, 32); - if (chips & 1) vd->fbi.dwdx = data64; - if (chips & 2) vd->tmu[0].dwdx = data64; - if (chips & 4) vd->tmu[1].dwdx = data64; + if (chips & 1) v->fbi.dwdx = data64; + if (chips & 2) v->tmu[0].dwdx = data64; + if (chips & 4) v->tmu[1].dwdx = data64; break; case dWdX: - if (chips & 1) vd->fbi.dwdx = (INT64)(INT32)data << 2; - if (chips & 2) vd->tmu[0].dwdx = (INT64)(INT32)data << 2; - if (chips & 4) vd->tmu[1].dwdx = (INT64)(INT32)data << 2; + if (chips & 1) v->fbi.dwdx = (INT64)(INT32)data << 2; + if (chips & 2) v->tmu[0].dwdx = (INT64)(INT32)data << 2; + if (chips & 4) v->tmu[1].dwdx = (INT64)(INT32)data << 2; break; case fdWdY: data64 = float_to_int64(data, 32); - if (chips & 1) vd->fbi.dwdy = data64; - if (chips & 2) vd->tmu[0].dwdy = data64; - if (chips & 4) vd->tmu[1].dwdy = data64; + if (chips & 1) v->fbi.dwdy = data64; + if (chips & 2) v->tmu[0].dwdy = data64; + if (chips & 4) v->tmu[1].dwdy = data64; break; case dWdY: - if (chips & 1) vd->fbi.dwdy = (INT64)(INT32)data << 2; - if (chips & 2) vd->tmu[0].dwdy = (INT64)(INT32)data << 2; - if (chips & 4) vd->tmu[1].dwdy = (INT64)(INT32)data << 2; + if (chips & 1) v->fbi.dwdy = (INT64)(INT32)data << 2; + if (chips & 2) v->tmu[0].dwdy = (INT64)(INT32)data << 2; + if (chips & 4) v->tmu[1].dwdy = (INT64)(INT32)data << 2; break; /* setup bits */ @@ -2398,114 +2460,114 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) if (chips & 1) { rgb_t rgbdata(data); - vd->reg[sAlpha].f = rgbdata.a(); - vd->reg[sRed].f = rgbdata.r(); - vd->reg[sGreen].f = rgbdata.g(); - vd->reg[sBlue].f = rgbdata.b(); + v->reg[sAlpha].f = rgbdata.a(); + v->reg[sRed].f = rgbdata.r(); + v->reg[sGreen].f = rgbdata.g(); + v->reg[sBlue].f = rgbdata.b(); } break; /* mask off invalid bits for different cards */ case fbzColorPath: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type < TYPE_VOODOO_2) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type < TYPE_VOODOO_2) data &= 0x0fffffff; - if (chips & 1) vd->reg[fbzColorPath].u = data; + if (chips & 1) v->reg[fbzColorPath].u = data; break; case fbzMode: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type < TYPE_VOODOO_2) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type < TYPE_VOODOO_2) data &= 0x001fffff; - if (chips & 1) vd->reg[fbzMode].u = data; + if (chips & 1) v->reg[fbzMode].u = data; break; case fogMode: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type < TYPE_VOODOO_2) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type < TYPE_VOODOO_2) data &= 0x0000003f; - if (chips & 1) vd->reg[fogMode].u = data; + if (chips & 1) v->reg[fogMode].u = data; break; /* triangle drawing */ case triangleCMD: - vd->fbi.cheating_allowed = (vd->fbi.ax != 0 || vd->fbi.ay != 0 || vd->fbi.bx > 50 || vd->fbi.by != 0 || vd->fbi.cx != 0 || vd->fbi.cy > 50); - vd->fbi.sign = data; - cycles = triangle(vd); + v->fbi.cheating_allowed = (v->fbi.ax != 0 || v->fbi.ay != 0 || v->fbi.bx > 50 || v->fbi.by != 0 || v->fbi.cx != 0 || v->fbi.cy > 50); + v->fbi.sign = data; + cycles = triangle(v); break; case ftriangleCMD: - vd->fbi.cheating_allowed = TRUE; - vd->fbi.sign = data; - cycles = triangle(vd); + v->fbi.cheating_allowed = TRUE; + v->fbi.sign = data; + cycles = triangle(v); break; case sBeginTriCMD: - cycles = begin_triangle(vd); + cycles = begin_triangle(v); break; case sDrawTriCMD: - cycles = draw_triangle(vd); + cycles = draw_triangle(v); break; /* other commands */ case nopCMD: - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); if (data & 1) - reset_counters(vd); + reset_counters(v); if (data & 2) - vd->reg[fbiTrianglesOut].u = 0; + v->reg[fbiTrianglesOut].u = 0; break; case fastfillCMD: - cycles = fastfill(vd); + cycles = fastfill(v); break; case swapbufferCMD: - poly_wait(vd->poly, vd->regnames[regnum]); - cycles = swapbuffer(vd, data); + poly_wait(v->poly, v->regnames[regnum]); + cycles = swapbuffer(v, data); break; case userIntrCMD: - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); //fatalerror("userIntrCMD\n"); - vd->reg[intrCtrl].u |= 0x1800; - vd->reg[intrCtrl].u &= ~0x80000000; + v->reg[intrCtrl].u |= 0x1800; + v->reg[intrCtrl].u &= ~0x80000000; // TODO: rename vblank_client for less confusion? - if (!vd->device->m_vblank.isnull()) - vd->device->m_vblank(TRUE); + if (!v->device->m_vblank.isnull()) + v->device->m_vblank(TRUE); break; /* gamma table access -- Voodoo/Voodoo2 only */ case clutData: - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) + if (v->type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(vd->poly, vd->regnames[regnum]); - if (!FBIINIT1_VIDEO_TIMING_RESET(vd->reg[fbiInit1].u)) + poly_wait(v->poly, v->regnames[regnum]); + if (!FBIINIT1_VIDEO_TIMING_RESET(v->reg[fbiInit1].u)) { int index = data >> 24; if (index <= 32) { - vd->fbi.clut[index] = data; - vd->fbi.clut_dirty = TRUE; + v->fbi.clut[index] = data; + v->fbi.clut_dirty = TRUE; } } else - vd->device->logerror("clutData ignored because video timing reset = 1\n"); + v->device->logerror("clutData ignored because video timing reset = 1\n"); } break; /* external DAC access -- Voodoo/Voodoo2 only */ case dacData: - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) + if (v->type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); if (!(data & 0x800)) - dacdata_w(&vd->dac, (data >> 8) & 7, data & 0xff); + dacdata_w(&v->dac, (data >> 8) & 7, data & 0xff); else - dacdata_r(&vd->dac, (data >> 8) & 7); + dacdata_r(&v->dac, (data >> 8) & 7); } break; @@ -2514,35 +2576,35 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case vSync: case backPorch: case videoDimensions: - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1)) + if (v->type <= TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(vd->poly, vd->regnames[regnum]); - vd->reg[regnum].u = data; - if (vd->reg[hSync].u != 0 && vd->reg[vSync].u != 0 && vd->reg[videoDimensions].u != 0) + poly_wait(v->poly, v->regnames[regnum]); + v->reg[regnum].u = data; + if (v->reg[hSync].u != 0 && v->reg[vSync].u != 0 && v->reg[videoDimensions].u != 0) { int hvis, vvis, htotal, vtotal, hbp, vbp; - attoseconds_t refresh = vd->screen->frame_period().attoseconds(); + attoseconds_t refresh = v->screen->frame_period().attoseconds(); attoseconds_t stdperiod, medperiod, vgaperiod; attoseconds_t stddiff, meddiff, vgadiff; rectangle visarea; - if (vd->vd_type == TYPE_VOODOO_2) + if (v->type == TYPE_VOODOO_2) { - htotal = ((vd->reg[hSync].u >> 16) & 0x7ff) + 1 + (vd->reg[hSync].u & 0x1ff) + 1; - vtotal = ((vd->reg[vSync].u >> 16) & 0x1fff) + (vd->reg[vSync].u & 0x1fff); - hvis = vd->reg[videoDimensions].u & 0x7ff; - vvis = (vd->reg[videoDimensions].u >> 16) & 0x7ff; - hbp = (vd->reg[backPorch].u & 0x1ff) + 2; - vbp = (vd->reg[backPorch].u >> 16) & 0x1ff; + htotal = ((v->reg[hSync].u >> 16) & 0x7ff) + 1 + (v->reg[hSync].u & 0x1ff) + 1; + vtotal = ((v->reg[vSync].u >> 16) & 0x1fff) + (v->reg[vSync].u & 0x1fff); + hvis = v->reg[videoDimensions].u & 0x7ff; + vvis = (v->reg[videoDimensions].u >> 16) & 0x7ff; + hbp = (v->reg[backPorch].u & 0x1ff) + 2; + vbp = (v->reg[backPorch].u >> 16) & 0x1ff; } else { - htotal = ((vd->reg[hSync].u >> 16) & 0x3ff) + 1 + (vd->reg[hSync].u & 0xff) + 1; - vtotal = ((vd->reg[vSync].u >> 16) & 0xfff) + (vd->reg[vSync].u & 0xfff); - hvis = vd->reg[videoDimensions].u & 0x3ff; - vvis = (vd->reg[videoDimensions].u >> 16) & 0x3ff; - hbp = (vd->reg[backPorch].u & 0xff) + 2; - vbp = (vd->reg[backPorch].u >> 16) & 0xff; + htotal = ((v->reg[hSync].u >> 16) & 0x3ff) + 1 + (v->reg[hSync].u & 0xff) + 1; + vtotal = ((v->reg[vSync].u >> 16) & 0xfff) + (v->reg[vSync].u & 0xfff); + hvis = v->reg[videoDimensions].u & 0x3ff; + vvis = (v->reg[videoDimensions].u >> 16) & 0x3ff; + hbp = (v->reg[backPorch].u & 0xff) + 2; + vbp = (v->reg[backPorch].u >> 16) & 0xff; } /* create a new visarea */ @@ -2566,61 +2628,61 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) if (vgadiff < 0) vgadiff = -vgadiff; osd_printf_debug("hSync=%08X vSync=%08X backPorch=%08X videoDimensions=%08X\n", - vd->reg[hSync].u, vd->reg[vSync].u, vd->reg[backPorch].u, vd->reg[videoDimensions].u); + v->reg[hSync].u, v->reg[vSync].u, v->reg[backPorch].u, v->reg[videoDimensions].u); osd_printf_debug("Horiz: %d-%d (%d total) Vert: %d-%d (%d total) -- ", visarea.min_x, visarea.max_x, htotal, visarea.min_y, visarea.max_y, vtotal); /* configure the screen based on which one matches the closest */ if (stddiff < meddiff && stddiff < vgadiff) { - vd->screen->configure(htotal, vtotal, visarea, stdperiod); + v->screen->configure(htotal, vtotal, visarea, stdperiod); osd_printf_debug("Standard resolution, %f Hz\n", ATTOSECONDS_TO_HZ(stdperiod)); } else if (meddiff < vgadiff) { - vd->screen->configure(htotal, vtotal, visarea, medperiod); + v->screen->configure(htotal, vtotal, visarea, medperiod); osd_printf_debug("Medium resolution, %f Hz\n", ATTOSECONDS_TO_HZ(medperiod)); } else { - vd->screen->configure(htotal, vtotal, visarea, vgaperiod); + v->screen->configure(htotal, vtotal, visarea, vgaperiod); osd_printf_debug("VGA resolution, %f Hz\n", ATTOSECONDS_TO_HZ(vgaperiod)); } /* configure the new framebuffer info */ - vd->fbi.width = hvis; - vd->fbi.height = vvis; - vd->fbi.xoffs = hbp; - vd->fbi.yoffs = vbp; - vd->fbi.vsyncscan = (vd->reg[vSync].u >> 16) & 0xfff; + v->fbi.width = hvis; + v->fbi.height = vvis; + v->fbi.xoffs = hbp; + v->fbi.yoffs = vbp; + v->fbi.vsyncscan = (v->reg[vSync].u >> 16) & 0xfff; /* recompute the time of VBLANK */ - adjust_vblank_timer(vd); + adjust_vblank_timer(v); /* if changing dimensions, update video memory layout */ if (regnum == videoDimensions) - recompute_video_memory(vd); + recompute_video_memory(v); } } break; /* fbiInit0 can only be written if initEnable says we can -- Voodoo/Voodoo2 only */ case fbiInit0: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) { - vd->reg[fbiInit0].u = data; + v->reg[fbiInit0].u = data; if (FBIINIT0_GRAPHICS_RESET(data)) - soft_reset(vd); + soft_reset(v); if (FBIINIT0_FIFO_RESET(data)) - fifo_reset(&vd->pci.fifo); - recompute_video_memory(vd); + fifo_reset(&v->pci.fifo); + recompute_video_memory(v); } break; /* fbiInit5-7 are Voodoo 2-only; ignore them on anything else */ case fbiInit5: case fbiInit6: - if (vd->vd_type < TYPE_VOODOO_2) + if (v->type < TYPE_VOODOO_2) break; /* else fall through... */ @@ -2629,94 +2691,94 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case fbiInit1: case fbiInit2: case fbiInit4: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) { - vd->reg[regnum].u = data; - recompute_video_memory(vd); - vd->fbi.video_changed = TRUE; + v->reg[regnum].u = data; + recompute_video_memory(v); + v->fbi.video_changed = TRUE; } break; case fbiInit3: - poly_wait(vd->poly, vd->regnames[regnum]); - if (vd->vd_type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) + poly_wait(v->poly, v->regnames[regnum]); + if (v->type <= TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) { - vd->reg[regnum].u = data; - vd->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data); - vd->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(vd->reg[fbiInit3].u); - recompute_video_memory(vd); + v->reg[regnum].u = data; + v->alt_regmap = FBIINIT3_TRI_REGISTER_REMAP(data); + v->fbi.yorigin = FBIINIT3_YORIGIN_SUBTRACT(v->reg[fbiInit3].u); + recompute_video_memory(v); } break; case fbiInit7: /* case swapPending: -- Banshee */ - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(vd->pci.init_enable)) + if (v->type == TYPE_VOODOO_2 && (chips & 1) && INITEN_ENABLE_HW_INIT(v->pci.init_enable)) { - poly_wait(vd->poly, vd->regnames[regnum]); - vd->reg[regnum].u = data; - vd->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data); - vd->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data); + poly_wait(v->poly, v->regnames[regnum]); + v->reg[regnum].u = data; + v->fbi.cmdfifo[0].enable = FBIINIT7_CMDFIFO_ENABLE(data); + v->fbi.cmdfifo[0].count_holes = !FBIINIT7_DISABLE_CMDFIFO_HOLES(data); } - else if (vd->vd_type >= TYPE_VOODOO_BANSHEE) - vd->fbi.swaps_pending++; + else if (v->type >= TYPE_VOODOO_BANSHEE) + v->fbi.swaps_pending++; break; /* cmdFifo -- Voodoo2 only */ case cmdFifoBaseAddr: - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + if (v->type == TYPE_VOODOO_2 && (chips & 1)) { - poly_wait(vd->poly, vd->regnames[regnum]); - vd->reg[regnum].u = data; - vd->fbi.cmdfifo[0].base = (data & 0x3ff) << 12; - vd->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12; + poly_wait(v->poly, v->regnames[regnum]); + v->reg[regnum].u = data; + v->fbi.cmdfifo[0].base = (data & 0x3ff) << 12; + v->fbi.cmdfifo[0].end = (((data >> 16) & 0x3ff) + 1) << 12; } break; case cmdFifoBump: - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) + if (v->type == TYPE_VOODOO_2 && (chips & 1)) fatalerror("cmdFifoBump\n"); break; case cmdFifoRdPtr: - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) - vd->fbi.cmdfifo[0].rdptr = data; + if (v->type == TYPE_VOODOO_2 && (chips & 1)) + v->fbi.cmdfifo[0].rdptr = data; break; case cmdFifoAMin: /* case colBufferAddr: -- Banshee */ - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) - vd->fbi.cmdfifo[0].amin = data; - else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) - vd->fbi.rgboffs[1] = data & vd->fbi.mask & ~0x0f; + if (v->type == TYPE_VOODOO_2 && (chips & 1)) + v->fbi.cmdfifo[0].amin = data; + else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + v->fbi.rgboffs[1] = data & v->fbi.mask & ~0x0f; break; case cmdFifoAMax: /* case colBufferStride: -- Banshee */ - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) - vd->fbi.cmdfifo[0].amax = data; - else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + if (v->type == TYPE_VOODOO_2 && (chips & 1)) + v->fbi.cmdfifo[0].amax = data; + else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) { if (data & 0x8000) - vd->fbi.rowpixels = (data & 0x7f) << 6; + v->fbi.rowpixels = (data & 0x7f) << 6; else - vd->fbi.rowpixels = (data & 0x3fff) >> 1; + v->fbi.rowpixels = (data & 0x3fff) >> 1; } break; case cmdFifoDepth: /* case auxBufferAddr: -- Banshee */ - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) - vd->fbi.cmdfifo[0].depth = data; - else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) - vd->fbi.auxoffs = data & vd->fbi.mask & ~0x0f; + if (v->type == TYPE_VOODOO_2 && (chips & 1)) + v->fbi.cmdfifo[0].depth = data; + else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + v->fbi.auxoffs = data & v->fbi.mask & ~0x0f; break; case cmdFifoHoles: /* case auxBufferStride: -- Banshee */ - if (vd->vd_type == TYPE_VOODOO_2 && (chips & 1)) - vd->fbi.cmdfifo[0].holes = data; - else if (vd->vd_type >= TYPE_VOODOO_BANSHEE && (chips & 1)) + if (v->type == TYPE_VOODOO_2 && (chips & 1)) + v->fbi.cmdfifo[0].holes = data; + else if (v->type >= TYPE_VOODOO_BANSHEE && (chips & 1)) { int rowpixels; @@ -2724,7 +2786,7 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) rowpixels = (data & 0x7f) << 6; else rowpixels = (data & 0x3fff) >> 1; - if (vd->fbi.rowpixels != rowpixels) + if (v->fbi.rowpixels != rowpixels) fatalerror("aux buffer stride differs from color buffer stride\n"); } break; @@ -2742,9 +2804,9 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case nccTable+9: case nccTable+10: case nccTable+11: - poly_wait(vd->poly, vd->regnames[regnum]); - if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[0], regnum - nccTable, data); - if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[0], regnum - nccTable, data); + poly_wait(v->poly, v->regnames[regnum]); + if (chips & 2) ncc_table_write(&v->tmu[0].ncc[0], regnum - nccTable, data); + if (chips & 4) ncc_table_write(&v->tmu[1].ncc[0], regnum - nccTable, data); break; case nccTable+12: @@ -2759,9 +2821,9 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case nccTable+21: case nccTable+22: case nccTable+23: - poly_wait(vd->poly, vd->regnames[regnum]); - if (chips & 2) ncc_table_write(&vd->tmu[0].ncc[1], regnum - (nccTable+12), data); - if (chips & 4) ncc_table_write(&vd->tmu[1].ncc[1], regnum - (nccTable+12), data); + poly_wait(v->poly, v->regnames[regnum]); + if (chips & 2) ncc_table_write(&v->tmu[0].ncc[1], regnum - (nccTable+12), data); + if (chips & 4) ncc_table_write(&v->tmu[1].ncc[1], regnum - (nccTable+12), data); break; /* fogTable entries are processed and expanded immediately */ @@ -2797,14 +2859,14 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case fogTable+29: case fogTable+30: case fogTable+31: - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); if (chips & 1) { int base = 2 * (regnum - fogTable); - vd->fbi.fogdelta[base + 0] = (data >> 0) & 0xff; - vd->fbi.fogblend[base + 0] = (data >> 8) & 0xff; - vd->fbi.fogdelta[base + 1] = (data >> 16) & 0xff; - vd->fbi.fogblend[base + 1] = (data >> 24) & 0xff; + v->fbi.fogdelta[base + 0] = (data >> 0) & 0xff; + v->fbi.fogblend[base + 0] = (data >> 8) & 0xff; + v->fbi.fogdelta[base + 1] = (data >> 16) & 0xff; + v->fbi.fogblend[base + 1] = (data >> 24) & 0xff; } break; @@ -2816,22 +2878,22 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case texBaseAddr_1: case texBaseAddr_2: case texBaseAddr_3_8: - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); if (chips & 2) { - vd->tmu[0].reg[regnum].u = data; - vd->tmu[0].regdirty = TRUE; + v->tmu[0].reg[regnum].u = data; + v->tmu[0].regdirty = TRUE; } if (chips & 4) { - vd->tmu[1].reg[regnum].u = data; - vd->tmu[1].regdirty = TRUE; + v->tmu[1].reg[regnum].u = data; + v->tmu[1].regdirty = TRUE; } break; case trexInit1: /* send tmu config data to the frame buffer */ - vd->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0); + v->send_config = (TREXINIT_SEND_TMU_CONFIG(data) > 0); goto default_case; /* these registers are referenced in the renderer; we must wait for pending work before changing */ @@ -2845,25 +2907,25 @@ INT32 voodoo_device::register_w(voodoo_device *vd, offs_t offset, UINT32 data) case color0: case clipLowYHighY: case clipLeftRight: - poly_wait(vd->poly, vd->regnames[regnum]); + poly_wait(v->poly, v->regnames[regnum]); /* fall through to default implementation */ /* by default, just feed the data to the chips */ default: default_case: - if (chips & 1) vd->reg[0x000 + regnum].u = data; - if (chips & 2) vd->reg[0x100 + regnum].u = data; - if (chips & 4) vd->reg[0x200 + regnum].u = data; - if (chips & 8) vd->reg[0x300 + regnum].u = data; + if (chips & 1) v->reg[0x000 + regnum].u = data; + if (chips & 2) v->reg[0x100 + regnum].u = data; + if (chips & 4) v->reg[0x200 + regnum].u = data; + if (chips & 8) v->reg[0x300 + regnum].u = data; break; } if (LOG_REGISTERS) { if (regnum < fvertexAx || regnum > fdWdY) - vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, origdata); + v->device->logerror("VOODOO.%d.REG:%s(%d) write = %08X\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, origdata); else - vd->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", vd->index, (regnum < 0x384/4) ? vd->regnames[regnum] : "oob", chips, (double) u2f(origdata)); + v->device->logerror("VOODOO.%d.REG:%s(%d) write = %f\n", v->index, (regnum < 0x384/4) ? v->regnames[regnum] : "oob", chips, (double) u2f(origdata)); } return cycles; @@ -2876,25 +2938,25 @@ default_case: * Voodoo LFB writes * *************************************/ -INT32 voodoo_device::lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask) -{ +static INT32 lfb_direct_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) +{ UINT16 *dest; UINT32 destmax; int x, y; UINT32 bufoffs; /* statistics */ - vd->stats.lfb_writes++; + v->stats.lfb_writes++; /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u)) { data = FLIPENDIAN_INT32(data); mem_mask = FLIPENDIAN_INT32(mem_mask); } /* word swapping */ - if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u)) { data = (data << 16) | (data >> 16); mem_mask = (mem_mask << 16) | (mem_mask >> 16); @@ -2904,26 +2966,25 @@ INT32 voodoo_device::lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, // For direct lfb access just write the data /* compute X,Y */ offset <<= 1; - x = offset & ((1 << vd->fbi.lfb_stride) - 1); - y = (offset >> vd->fbi.lfb_stride); - dest = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4); - destmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2; - bufoffs = y * vd->fbi.rowpixels + x; + x = offset & ((1 << v->fbi.lfb_stride) - 1); + y = (offset >> v->fbi.lfb_stride); + dest = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4); + destmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2; + bufoffs = y * v->fbi.rowpixels + x; if (bufoffs >= destmax) { - vd->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data); + v->device->logerror("lfb_direct_w: Buffer offset out of bounds x=%i y=%i offset=%08X bufoffs=%08X data=%08X\n", x, y, offset, (UINT32) bufoffs, data); return 0; } if (ACCESSING_BITS_0_15) dest[bufoffs + 0] = data&0xffff; if (ACCESSING_BITS_16_31) dest[bufoffs + 1] = data>>16; - if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", vd->index, x, y, data, mem_mask); + if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write direct (%d,%d) = %08X & %08X\n", v->index, x, y, data, mem_mask); return 0; } -INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 mem_mask) +static INT32 lfb_w(voodoo_state *v, offs_t offset, UINT32 data, UINT32 mem_mask) { - UINT16 *dest, *depth; UINT32 destmax, depthmax; int sr[2], sg[2], sb[2], sa[2], sw[2]; @@ -2931,28 +2992,28 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 int pix, destbuf; /* statistics */ - vd->stats.lfb_writes++; + v->stats.lfb_writes++; /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_WRITES(vd->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_WRITES(v->reg[lfbMode].u)) { data = FLIPENDIAN_INT32(data); mem_mask = FLIPENDIAN_INT32(mem_mask); } /* word swapping */ - if (LFBMODE_WORD_SWAP_WRITES(vd->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_WRITES(v->reg[lfbMode].u)) { data = (data << 16) | (data >> 16); mem_mask = (mem_mask << 16) | (mem_mask >> 16); } /* extract default depth and alpha values */ - sw[0] = sw[1] = vd->reg[zaColor].u & 0xffff; - sa[0] = sa[1] = vd->reg[zaColor].u >> 24; + sw[0] = sw[1] = v->reg[zaColor].u & 0xffff; + sa[0] = sa[1] = v->reg[zaColor].u >> 24; /* first extract A,R,G,B from the data */ - switch (LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(vd->reg[lfbMode].u)) + switch (LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u) + 16 * LFBMODE_RGBA_LANES(v->reg[lfbMode].u)) { case 16*0 + 0: /* ARGB, 16-bit RGB 5-6-5 */ case 16*2 + 0: /* RGBA, 16-bit RGB 5-6-5 */ @@ -3119,13 +3180,13 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 break; default: /* reserved */ - vd->device->logerror("lfb_w: Unknown format\n"); + v->device->logerror("lfb_w: Unknown format\n"); return 0; } /* compute X,Y */ - x = offset & ((1 << vd->fbi.lfb_stride) - 1); - y = (offset >> vd->fbi.lfb_stride) & 0x3ff; + x = offset & ((1 << v->fbi.lfb_stride) - 1); + y = (offset >> v->fbi.lfb_stride) & 0x3ff; /* adjust the mask based on which half of the data is written */ if (!ACCESSING_BITS_0_15) @@ -3134,47 +3195,47 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 mask &= ~(0xf0 + LFB_DEPTH_PRESENT_MSW); /* select the target buffer */ - destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(vd->reg[lfbMode].u); + destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_WRITE_BUFFER_SELECT(v->reg[lfbMode].u); switch (destbuf) { case 0: /* front buffer */ - dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); - destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2; - vd->fbi.video_changed = TRUE; + dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); + destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2; + v->fbi.video_changed = TRUE; break; case 1: /* back buffer */ - dest = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); - destmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2; + dest = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); + destmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2; break; default: /* reserved */ return 0; } - depth = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs); - depthmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2; + depth = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs); + depthmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2; /* simple case: no pipeline */ - if (!LFBMODE_ENABLE_PIXEL_PIPELINE(vd->reg[lfbMode].u)) + if (!LFBMODE_ENABLE_PIXEL_PIPELINE(v->reg[lfbMode].u)) { DECLARE_DITHER_POINTERS_NO_DITHER_VAR; UINT32 bufoffs; - if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask); + if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write raw mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask); /* determine the screen Y */ scry = y; - if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u)) - scry = (vd->fbi.yorigin - y) & 0x3ff; + if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u)) + scry = (v->fbi.yorigin - y) & 0x3ff; /* advance pointers to the proper row */ - bufoffs = scry * vd->fbi.rowpixels + x; + bufoffs = scry * v->fbi.rowpixels + x; /* compute dithering */ - COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y); /* wait for any outstanding work to finish */ - poly_wait(vd->poly, "LFB Write"); + poly_wait(v->poly, "LFB Write"); /* loop over up to two pixels */ for (pix = 0; mask; pix++) @@ -3186,7 +3247,7 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 if ((mask & LFB_RGB_PRESENT) && bufoffs < destmax) { /* apply dithering and write to the screen */ - APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]); + APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, sr[pix], sg[pix], sb[pix]); dest[bufoffs] = (sr[pix] << 11) | (sg[pix] << 5) | sb[pix]; } @@ -3194,16 +3255,16 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 if (depth && bufoffs < depthmax) { /* write to the alpha buffer */ - if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u)) + if ((mask & LFB_ALPHA_PRESENT) && FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u)) depth[bufoffs] = sa[pix]; /* write to the depth buffer */ - if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(vd->reg[fbzMode].u)) + if ((mask & (LFB_DEPTH_PRESENT | LFB_DEPTH_PRESENT_MSW)) && !FBZMODE_ENABLE_ALPHA_PLANES(v->reg[fbzMode].u)) depth[bufoffs] = sw[pix]; } /* track pixel writes to the frame buffer regardless of mask */ - vd->reg[fbiPixelsOut].u++; + v->reg[fbiPixelsOut].u++; } /* advance our pointers */ @@ -3218,20 +3279,20 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 { DECLARE_DITHER_POINTERS; - if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", vd->index, LFBMODE_WRITE_FORMAT(vd->reg[lfbMode].u), x, y, data, mem_mask); + if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:write pipelined mode %X (%d,%d) = %08X & %08X\n", v->index, LFBMODE_WRITE_FORMAT(v->reg[lfbMode].u), x, y, data, mem_mask); /* determine the screen Y */ scry = y; - if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u)) - scry = (vd->fbi.yorigin - y) & 0x3ff; + if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u)) + scry = (v->fbi.yorigin - y) & 0x3ff; /* advance pointers to the proper row */ - dest += scry * vd->fbi.rowpixels; + dest += scry * v->fbi.rowpixels; if (depth) - depth += scry * vd->fbi.rowpixels; + depth += scry * v->fbi.rowpixels; /* compute dithering */ - COMPUTE_DITHER_POINTERS(vd->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS(v->reg[fbzMode].u, y); /* loop over up to two pixels */ for (pix = 0; mask; pix++) @@ -3239,10 +3300,10 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 /* make sure we care about this pixel */ if (mask & 0x0f) { - stats_block *stats = &vd->fbi.lfb_stats; + stats_block *stats = &v->fbi.lfb_stats; INT64 iterw; - if (LFBMODE_WRITE_W_SELECT(vd->reg[lfbMode].u)) { - iterw = (UINT32) vd->reg[zaColor].u << 16; + if (LFBMODE_WRITE_W_SELECT(v->reg[lfbMode].u)) { + iterw = (UINT32) v->reg[zaColor].u << 16; } else { // The most significant fractional bits of 16.32 W are set to z iterw = (UINT32) sw[pix] << 16; @@ -3250,12 +3311,12 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 INT32 iterz = sw[pix] << 12; /* apply clipping */ - if (FBZMODE_ENABLE_CLIPPING(vd->reg[fbzMode].u)) + if (FBZMODE_ENABLE_CLIPPING(v->reg[fbzMode].u)) { - if (x < ((vd->reg[clipLeftRight].u >> 16) & 0x3ff) || - x >= (vd->reg[clipLeftRight].u & 0x3ff) || - scry < ((vd->reg[clipLowYHighY].u >> 16) & 0x3ff) || - scry >= (vd->reg[clipLowYHighY].u & 0x3ff)) + if (x < ((v->reg[clipLeftRight].u >> 16) & 0x3ff) || + x >= (v->reg[clipLeftRight].u & 0x3ff) || + scry < ((v->reg[clipLowYHighY].u >> 16) & 0x3ff) || + scry >= (v->reg[clipLowYHighY].u & 0x3ff)) { stats->pixels_in++; stats->clip_fail++; @@ -3268,7 +3329,7 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 /* pixel pipeline part 1 handles depth testing and stippling */ - //PIXEL_PIPELINE_BEGIN(v, stats, x, y, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, iterz, iterw); + //PIXEL_PIPELINE_BEGIN(v, stats, x, y, v->reg[fbzColorPath].u, v->reg[fbzMode].u, iterz, iterw); // Start PIXEL_PIPE_BEGIN copy //#define PIXEL_PIPELINE_BEGIN(VV, STATS, XX, YY, FBZCOLORPATH, FBZMODE, ITERZ, ITERW) INT32 fogdepth, biasdepth; @@ -3280,15 +3341,15 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 /* note that for perf reasons, we assume the caller has done clipping */ /* handle stippling */ - if (FBZMODE_ENABLE_STIPPLE(vd->reg[fbzMode].u)) + if (FBZMODE_ENABLE_STIPPLE(v->reg[fbzMode].u)) { /* rotate mode */ - if (FBZMODE_STIPPLE_PATTERN(vd->reg[fbzMode].u) == 0) + if (FBZMODE_STIPPLE_PATTERN(v->reg[fbzMode].u) == 0) { - vd->reg[stipple].u = (vd->reg[stipple].u << 1) | (vd->reg[stipple].u >> 31); - if ((vd->reg[stipple].u & 0x80000000) == 0) + v->reg[stipple].u = (v->reg[stipple].u << 1) | (v->reg[stipple].u >> 31); + if ((v->reg[stipple].u & 0x80000000) == 0) { - vd->stats.total_stippled++; + v->stats.total_stippled++; goto skipdrawdepth; } } @@ -3297,9 +3358,9 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 else { int stipple_index = ((y & 3) << 3) | (~x & 7); - if (((vd->reg[stipple].u >> stipple_index) & 1) == 0) + if (((v->reg[stipple].u >> stipple_index) & 1) == 0) { - vd->stats.total_stippled++; + v->stats.total_stippled++; goto nextpixel; } } @@ -3311,29 +3372,29 @@ INT32 voodoo_device::lfb_w(voodoo_device* vd, offs_t offset, UINT32 data, UINT32 /* Perform depth testing */ - if (!depthTest((UINT16) vd->reg[zaColor].u, stats, depth[x], vd->reg[fbzMode].u, biasdepth)) + if (!depthTest((UINT16) v->reg[zaColor].u, stats, depth[x], v->reg[fbzMode].u, biasdepth)) goto nextpixel; /* use the RGBA we stashed above */ color.set(sa[pix], sr[pix], sg[pix], sb[pix]); /* handle chroma key */ - if (!chromaKeyTest(vd, stats, vd->reg[fbzMode].u, color)) + if (!chromaKeyTest(v, stats, v->reg[fbzMode].u, color)) goto nextpixel; /* handle alpha mask */ - if (!alphaMaskTest(stats, vd->reg[fbzMode].u, color.get_a())) + if (!alphaMaskTest(stats, v->reg[fbzMode].u, color.get_a())) goto nextpixel; /* handle alpha test */ - if (!alphaTest(vd, stats, vd->reg[alphaMode].u, color.get_a())) + if (!alphaTest(v, stats, v->reg[alphaMode].u, color.get_a())) goto nextpixel; /* wait for any outstanding work to finish */ - poly_wait(vd->poly, "LFB Write"); + poly_wait(v->poly, "LFB Write"); /* pixel pipeline part 2 handles color combine, fog, alpha, and final output */ - PIXEL_PIPELINE_END(vd, stats, dither, dither4, dither_lookup, x, dest, depth, - vd->reg[fbzMode].u, vd->reg[fbzColorPath].u, vd->reg[alphaMode].u, vd->reg[fogMode].u, + PIXEL_PIPELINE_END(v, stats, dither, dither4, dither_lookup, x, dest, depth, + v->reg[fbzMode].u, v->reg[fbzColorPath].u, v->reg[alphaMode].u, v->reg[fogMode].u, iterz, iterw, iterargb) {}; nextpixel: /* advance our pointers */ @@ -3353,24 +3414,24 @@ nextpixel: * *************************************/ -INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) +static INT32 texture_w(voodoo_state *v, offs_t offset, UINT32 data) { int tmunum = (offset >> 19) & 0x03; tmu_state *t; /* statistics */ - vd->stats.tex_writes++; + v->stats.tex_writes++; /* point to the right TMU */ - if (!(vd->chipmask & (2 << tmunum))) + if (!(v->chipmask & (2 << tmunum))) return 0; - t = &vd->tmu[tmunum]; + t = &v->tmu[tmunum]; if (TEXLOD_TDIRECT_WRITE(t->reg[tLOD].u)) fatalerror("Texture direct write!\n"); /* wait for any outstanding work to finish */ - poly_wait(vd->poly, "Texture write"); + poly_wait(v->poly, "Texture write"); /* update texture info if dirty */ if (t->regdirty) @@ -3390,13 +3451,13 @@ INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) UINT8 *dest; /* extract info */ - if (vd->vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { lod = (offset >> 15) & 0x0f; tt = (offset >> 7) & 0xff; /* old code has a bit about how this is broken in gauntleg unless we always look at TMU0 */ - if (TEXMODE_SEQ_8_DOWNLD(vd->tmu[0].reg/*t->reg*/[textureMode].u)) + if (TEXMODE_SEQ_8_DOWNLD(v->tmu[0].reg/*t->reg*/[textureMode].u)) ts = (offset << 2) & 0xfc; else ts = (offset << 1) & 0xfc; @@ -3409,13 +3470,13 @@ INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) tbaseaddr = t->lodoffset[lod]; tbaseaddr += tt * ((t->wmask >> lod) + 1) + ts; - if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); + if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); } else { tbaseaddr = t->lodoffset[0] + offset*4; - if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data); + if (LOG_TEXTURE_RAM) v->device->logerror("Texture 8-bit w: offset=%X data=%08X\n", offset*4, data); } /* write the four bytes in little-endian order */ @@ -3435,7 +3496,7 @@ INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) UINT16 *dest; /* extract info */ - if (vd->vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { lod = (offset >> 15) & 0x0f; tt = (offset >> 7) & 0xff; @@ -3449,13 +3510,13 @@ INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) tbaseaddr = t->lodoffset[lod]; tbaseaddr += 2 * (tt * ((t->wmask >> lod) + 1) + ts); - if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); + if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: lod=%d s=%d t=%d data=%08X\n", lod, ts, tt, data); } else { tbaseaddr = t->lodoffset[0] + offset*4; - if (LOG_TEXTURE_RAM) vd->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data); + if (LOG_TEXTURE_RAM) v->device->logerror("Texture 16-bit w: offset=%X data=%08X\n", offset*4, data); } /* write the two words in little-endian order */ @@ -3477,7 +3538,7 @@ INT32 voodoo_device::texture_w(voodoo_device *vd, offs_t offset, UINT32 data) * *************************************/ -void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) +static void flush_fifos(voodoo_state *v, attotime current_time) { static UINT8 in_flush; @@ -3486,14 +3547,14 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) return; in_flush = TRUE; - if (!vd->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n"); + if (!v->pci.op_pending) fatalerror("flush_fifos called with no pending operation\n"); - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index, - vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(), + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos start -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index, + v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(), current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds()); /* loop while we still have cycles to burn */ - while (vd->pci.op_end_time <= current_time) + while (v->pci.op_end_time <= current_time) { INT32 extra_cycles = 0; INT32 cycles; @@ -3506,27 +3567,27 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) UINT32 data; /* we might be in CMDFIFO mode */ - if (vd->fbi.cmdfifo[0].enable) + if (v->fbi.cmdfifo[0].enable) { /* if we don't have anything to execute, we're done for now */ - cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[0]); + cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[0]); if (cycles == -1) { - vd->pci.op_pending = FALSE; + v->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index); + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index); return; } } - else if (vd->fbi.cmdfifo[1].enable) + else if (v->fbi.cmdfifo[1].enable) { /* if we don't have anything to execute, we're done for now */ - cycles = cmdfifo_execute_if_ready(vd, &vd->fbi.cmdfifo[1]); + cycles = cmdfifo_execute_if_ready(v, &v->fbi.cmdfifo[1]); if (cycles == -1) { - vd->pci.op_pending = FALSE; + v->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", vd->index); + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- CMDFIFO empty\n", v->index); return; } } @@ -3535,15 +3596,15 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) else { /* choose which FIFO to read from */ - if (!fifo_empty(&vd->fbi.fifo)) - fifo = &vd->fbi.fifo; - else if (!fifo_empty(&vd->pci.fifo)) - fifo = &vd->pci.fifo; + if (!fifo_empty(&v->fbi.fifo)) + fifo = &v->fbi.fifo; + else if (!fifo_empty(&v->pci.fifo)) + fifo = &v->pci.fifo; else { - vd->pci.op_pending = FALSE; + v->pci.op_pending = FALSE; in_flush = FALSE; - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", vd->index); + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- FIFOs empty\n", v->index); return; } @@ -3553,9 +3614,9 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) /* target the appropriate location */ if ((address & (0xc00000/4)) == 0) - cycles = register_w(vd, address, data); + cycles = register_w(v, address, data); else if (address & (0x800000/4)) - cycles = texture_w(vd, address, data); + cycles = texture_w(v, address, data); else { UINT32 mem_mask = 0xffffffff; @@ -3567,7 +3628,7 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) mem_mask &= 0xffff0000; address &= 0xffffff; - cycles = lfb_w(vd, address, data, mem_mask); + cycles = lfb_w(v, address, data, mem_mask); } } @@ -3584,15 +3645,15 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) cycles += extra_cycles; /* account for those cycles */ - vd->pci.op_end_time += attotime(0, (attoseconds_t)cycles * vd->attoseconds_per_cycle); + v->pci.op_end_time += attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", vd->index, - vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds(), + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:update -- pending=%d.%08X%08X cur=%d.%08X%08X\n", v->index, + v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds(), current_time.seconds(), (UINT32)(current_time.attoseconds() >> 32), (UINT32)current_time.attoseconds()); } - if (LOG_FIFO_VERBOSE) vd->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", vd->index, - vd->pci.op_end_time.seconds(), (UINT32)(vd->pci.op_end_time.attoseconds() >> 32), (UINT32)vd->pci.op_end_time.attoseconds()); + if (LOG_FIFO_VERBOSE) v->device->logerror("VOODOO.%d.FIFO:flush_fifos end -- pending command complete at %d.%08X%08X\n", v->index, + v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); in_flush = FALSE; } @@ -3608,17 +3669,18 @@ void voodoo_device::flush_fifos(voodoo_device *vd, attotime current_time) WRITE32_MEMBER( voodoo_device::voodoo_w ) { + voodoo_state *v = get_safe_token(this); int stall = FALSE; g_profiler.start(PROFILER_USER1); /* should not be getting accesses while stalled */ - if (pci.stall_state != NOT_STALLED) + if (v->pci.stall_state != NOT_STALLED) logerror("voodoo_w while stalled!\n"); /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); /* special handling for registers */ if ((offset & 0xc00000/4) == 0) @@ -3626,10 +3688,10 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) UINT8 access; /* some special stuff for Voodoo 2 */ - if (vd_type >= TYPE_VOODOO_2) + if (v->type >= TYPE_VOODOO_2) { /* we might be in CMDFIFO mode */ - if (FBIINIT7_CMDFIFO_ENABLE(reg[fbiInit7].u)) + if (FBIINIT7_CMDFIFO_ENABLE(v->reg[fbiInit7].u)) { /* if bit 21 is set, we're writing to the FIFO */ if (offset & 0x200000/4) @@ -3637,20 +3699,20 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* check for byte swizzling (bit 18) */ if (offset & 0x40000/4) data = FLIPENDIAN_INT32(data); - cmdfifo_w(this, &fbi.cmdfifo[0], offset & 0xffff, data); + cmdfifo_w(v, &v->fbi.cmdfifo[0], offset & 0xffff, data); g_profiler.stop(); return; } /* we're a register access; but only certain ones are allowed */ - access = regaccess[offset & 0xff]; + access = v->regaccess[offset & 0xff]; if (!(access & REGISTER_WRITETHRU)) { /* track swap buffers regardless */ if ((offset & 0xff) == swapbufferCMD) - fbi.swaps_pending++; + v->fbi.swaps_pending++; - logerror("Ignoring write to %s in CMDFIFO mode\n", regnames[offset & 0xff]); + logerror("Ignoring write to %s in CMDFIFO mode\n", v->regnames[offset & 0xff]); g_profiler.stop(); return; } @@ -3663,7 +3725,7 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* check the access behavior; note that the table works even if the */ /* alternate mapping is used */ - access = regaccess[offset & 0xff]; + access = v->regaccess[offset & 0xff]; /* ignore if writes aren't allowed */ if (!(access & REGISTER_WRITE)) @@ -3678,31 +3740,31 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) /* track swap buffers */ if ((offset & 0xff) == swapbufferCMD) - fbi.swaps_pending++; + v->fbi.swaps_pending++; } /* if we don't have anything pending, or if FIFOs are disabled, just execute */ - if (!pci.op_pending || !INITEN_ENABLE_PCI_FIFO(pci.init_enable)) + if (!v->pci.op_pending || !INITEN_ENABLE_PCI_FIFO(v->pci.init_enable)) { int cycles; /* target the appropriate location */ if ((offset & (0xc00000/4)) == 0) - cycles = register_w(this, offset, data); + cycles = register_w(v, offset, data); else if (offset & (0x800000/4)) - cycles = texture_w(this, offset, data); + cycles = texture_w(v, offset, data); else - cycles = lfb_w(this, offset, data, mem_mask); + cycles = lfb_w(v, offset, data, mem_mask); /* if we ended up with cycles, mark the operation pending */ if (cycles) { - pci.op_pending = TRUE; - pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * attoseconds_per_cycle); + v->pci.op_pending = TRUE; + v->pci.op_end_time = machine().time() + attotime(0, (attoseconds_t)cycles * v->attoseconds_per_cycle); - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", index, + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:direct write start at %d.%08X%08X end at %d.%08X%08X\n", v->index, machine().time().seconds(), (UINT32)(machine().time().attoseconds() >> 32), (UINT32)machine().time().attoseconds(), - pci.op_end_time.seconds(), (UINT32)(pci.op_end_time.attoseconds() >> 32), (UINT32)pci.op_end_time.attoseconds()); + v->pci.op_end_time.seconds(), (UINT32)(v->pci.op_end_time.attoseconds() >> 32), (UINT32)v->pci.op_end_time.attoseconds()); } g_profiler.stop(); return; @@ -3718,56 +3780,56 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) } /* if there's room in the PCI FIFO, add there */ - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", this, offset, data); - if (!fifo_full(&pci.fifo)) + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w adding to PCI FIFO @ %08X=%08X\n", v->index, offset, data); + if (!fifo_full(&v->pci.fifo)) { - fifo_add(&pci.fifo, offset); - fifo_add(&pci.fifo, data); + fifo_add(&v->pci.fifo, offset); + fifo_add(&v->pci.fifo, data); } else fatalerror("PCI FIFO full\n"); /* handle flushing to the memory FIFO */ - if (FBIINIT0_ENABLE_MEMORY_FIFO(reg[fbiInit0].u) && - fifo_space(&pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(reg[fbiInit4].u)) + if (FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) && + fifo_space(&v->pci.fifo) <= 2 * FBIINIT4_MEMORY_FIFO_LWM(v->reg[fbiInit4].u)) { UINT8 valid[4]; /* determine which types of data can go to the memory FIFO */ valid[0] = TRUE; - valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(reg[fbiInit0].u); - valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(reg[fbiInit0].u); + valid[1] = FBIINIT0_LFB_TO_MEMORY_FIFO(v->reg[fbiInit0].u); + valid[2] = valid[3] = FBIINIT0_TEXMEM_TO_MEMORY_FIFO(v->reg[fbiInit0].u); /* flush everything we can */ - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", index); - while (!fifo_empty(&pci.fifo) && valid[(fifo_peek(&pci.fifo) >> 22) & 3]) + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w moving PCI FIFO to memory FIFO\n", v->index); + while (!fifo_empty(&v->pci.fifo) && valid[(fifo_peek(&v->pci.fifo) >> 22) & 3]) { - fifo_add(&fbi.fifo, fifo_remove(&pci.fifo)); - fifo_add(&fbi.fifo, fifo_remove(&pci.fifo)); + fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo)); + fifo_add(&v->fbi.fifo, fifo_remove(&v->pci.fifo)); } /* if we're above the HWM as a result, stall */ - if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) && - fifo_items(&fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(reg[fbiInit0].u)) + if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) && + fifo_items(&v->fbi.fifo) >= 2 * 32 * FBIINIT0_MEMORY_FIFO_HWM(v->reg[fbiInit0].u)) { - if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", index); - stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time()); + if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit memory FIFO HWM -- stalling\n", v->index); + stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time()); } } /* if we're at the LWM for the PCI FIFO, stall */ - if (FBIINIT0_STALL_PCIE_FOR_HWM(reg[fbiInit0].u) && - fifo_space(&pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(reg[fbiInit0].u)) + if (FBIINIT0_STALL_PCIE_FOR_HWM(v->reg[fbiInit0].u) && + fifo_space(&v->pci.fifo) <= 2 * FBIINIT0_PCI_FIFO_LWM(v->reg[fbiInit0].u)) { - if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", index); - stall_cpu(this, STALLED_UNTIL_FIFO_LWM, machine().time()); + if (LOG_FIFO) logerror("VOODOO.%d.FIFO:voodoo_w hit PCI FIFO free LWM -- stalling\n", v->index); + stall_cpu(v, STALLED_UNTIL_FIFO_LWM, machine().time()); } /* if we weren't ready, and this is a non-FIFO access, stall until the FIFOs are clear */ if (stall) { - if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", index); - stall_cpu(this, STALLED_UNTIL_FIFO_EMPTY, machine().time()); + if (LOG_FIFO_VERBOSE) logerror("VOODOO.%d.FIFO:voodoo_w wrote non-FIFO register -- stalling until clear\n", v->index); + stall_cpu(v, STALLED_UNTIL_FIFO_EMPTY, machine().time()); } g_profiler.stop(); @@ -3781,71 +3843,70 @@ WRITE32_MEMBER( voodoo_device::voodoo_w ) * *************************************/ -static UINT32 register_r(voodoo_device *vd, offs_t offset) +static UINT32 register_r(voodoo_state *v, offs_t offset) { - int regnum = offset & 0xff; UINT32 result; /* statistics */ - vd->stats.reg_reads++; + v->stats.reg_reads++; /* first make sure this register is readable */ - if (!(vd->regaccess[regnum] & REGISTER_READ)) + if (!(v->regaccess[regnum] & REGISTER_READ)) { - vd->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", vd->index, regnum < 225 ? vd->regnames[regnum] : "unknown register"); + v->device->logerror("VOODOO.%d.ERROR:Invalid attempt to read %s\n", v->index, regnum < 225 ? v->regnames[regnum] : "unknown register"); return 0xffffffff; } /* default result is the FBI register value */ - result = vd->reg[regnum].u; + result = v->reg[regnum].u; /* some registers are dynamic; compute them */ switch (regnum) { - case vdstatus: + case status: /* start with a blank slate */ result = 0; /* bits 5:0 are the PCI FIFO free space */ - if (fifo_empty(&vd->pci.fifo)) + if (fifo_empty(&v->pci.fifo)) result |= 0x3f << 0; else { - int temp = fifo_space(&vd->pci.fifo)/2; + int temp = fifo_space(&v->pci.fifo)/2; if (temp > 0x3f) temp = 0x3f; result |= temp << 0; } /* bit 6 is the vertical retrace */ - result |= vd->fbi.vblank << 6; + result |= v->fbi.vblank << 6; /* bit 7 is FBI graphics engine busy */ - if (vd->pci.op_pending) + if (v->pci.op_pending) result |= 1 << 7; /* bit 8 is TREX busy */ - if (vd->pci.op_pending) + if (v->pci.op_pending) result |= 1 << 8; /* bit 9 is overall busy */ - if (vd->pci.op_pending) + if (v->pci.op_pending) result |= 1 << 9; /* Banshee is different starting here */ - if (vd->vd_type < TYPE_VOODOO_BANSHEE) + if (v->type < TYPE_VOODOO_BANSHEE) { /* bits 11:10 specifies which buffer is visible */ - result |= vd->fbi.frontbuf << 10; + result |= v->fbi.frontbuf << 10; /* bits 27:12 indicate memory FIFO freespace */ - if (!FBIINIT0_ENABLE_MEMORY_FIFO(vd->reg[fbiInit0].u) || fifo_empty(&vd->fbi.fifo)) + if (!FBIINIT0_ENABLE_MEMORY_FIFO(v->reg[fbiInit0].u) || fifo_empty(&v->fbi.fifo)) result |= 0xffff << 12; else { - int temp = fifo_space(&vd->fbi.fifo)/2; + int temp = fifo_space(&v->fbi.fifo)/2; if (temp > 0xffff) temp = 0xffff; result |= temp << 12; @@ -3856,38 +3917,38 @@ static UINT32 register_r(voodoo_device *vd, offs_t offset) /* bit 10 is 2D busy */ /* bit 11 is cmd FIFO 0 busy */ - if (vd->fbi.cmdfifo[0].enable && vd->fbi.cmdfifo[0].depth > 0) + if (v->fbi.cmdfifo[0].enable && v->fbi.cmdfifo[0].depth > 0) result |= 1 << 11; /* bit 12 is cmd FIFO 1 busy */ - if (vd->fbi.cmdfifo[1].enable && vd->fbi.cmdfifo[1].depth > 0) + if (v->fbi.cmdfifo[1].enable && v->fbi.cmdfifo[1].depth > 0) result |= 1 << 12; } /* bits 30:28 are the number of pending swaps */ - if (vd->fbi.swaps_pending > 7) + if (v->fbi.swaps_pending > 7) result |= 7 << 28; else - result |= vd->fbi.swaps_pending << 28; + result |= v->fbi.swaps_pending << 28; /* bit 31 is not used */ /* eat some cycles since people like polling here */ - if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000); + if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000); break; /* bit 2 of the initEnable register maps this to dacRead */ case fbiInit2: - if (INITEN_REMAP_INIT_TO_DAC(vd->pci.init_enable)) - result = vd->dac.read_result; + if (INITEN_REMAP_INIT_TO_DAC(v->pci.init_enable)) + result = v->dac.read_result; break; /* return the current scanline for now */ case vRetrace: /* eat some cycles since people like polling here */ - if (EAT_CYCLES) vd->cpu->execute().eat_cycles(10); - result = vd->screen->vpos(); + if (EAT_CYCLES) v->cpu->execute().eat_cycles(10); + result = v->screen->vpos(); break; /* reserved area in the TMU read by the Vegas startup sequence */ @@ -3898,26 +3959,26 @@ static UINT32 register_r(voodoo_device *vd, offs_t offset) /* cmdFifo -- Voodoo2 only */ case cmdFifoRdPtr: - result = vd->fbi.cmdfifo[0].rdptr; + result = v->fbi.cmdfifo[0].rdptr; /* eat some cycles since people like polling here */ - if (EAT_CYCLES) vd->cpu->execute().eat_cycles(1000); + if (EAT_CYCLES) v->cpu->execute().eat_cycles(1000); break; case cmdFifoAMin: - result = vd->fbi.cmdfifo[0].amin; + result = v->fbi.cmdfifo[0].amin; break; case cmdFifoAMax: - result = vd->fbi.cmdfifo[0].amax; + result = v->fbi.cmdfifo[0].amax; break; case cmdFifoDepth: - result = vd->fbi.cmdfifo[0].depth; + result = v->fbi.cmdfifo[0].depth; break; case cmdFifoHoles: - result = vd->fbi.cmdfifo[0].holes; + result = v->fbi.cmdfifo[0].holes; break; /* all counters are 24-bit only */ @@ -3926,9 +3987,9 @@ static UINT32 register_r(voodoo_device *vd, offs_t offset) case fbiZfuncFail: case fbiAfuncFail: case fbiPixelsOut: - update_statistics(vd, TRUE); + update_statistics(v, TRUE); case fbiTrianglesOut: - result = vd->reg[regnum].u & 0xffffff; + result = v->reg[regnum].u & 0xffffff; break; } @@ -3937,19 +3998,19 @@ static UINT32 register_r(voodoo_device *vd, offs_t offset) int logit = TRUE; /* don't log multiple identical status reads from the same address */ - if (regnum == vdstatus) + if (regnum == status) { - offs_t pc = vd->cpu->safe_pc(); - if (pc == vd->last_status_pc && result == vd->last_status_value) + offs_t pc = v->cpu->safe_pc(); + if (pc == v->last_status_pc && result == v->last_status_value) logit = FALSE; - vd->last_status_pc = pc; - vd->last_status_value = result; + v->last_status_pc = pc; + v->last_status_value = result; } if (regnum == cmdFifoRdPtr) logit = FALSE; if (logit) - vd->device->logerror("VOODOO.%d.REG:%s read = %08X\n", vd->index, vd->regnames[regnum], result); + v->device->logerror("VOODOO.%d.REG:%s read = %08X\n", v->index, v->regnames[regnum], result); } return result; @@ -3963,7 +4024,7 @@ static UINT32 register_r(voodoo_device *vd, offs_t offset) * *************************************/ -static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d) +static UINT32 lfb_r(voodoo_state *v, offs_t offset, bool lfb_3d) { UINT16 *buffer; UINT32 bufmax; @@ -3972,34 +4033,34 @@ static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d) int x, y, scry, destbuf; /* statistics */ - vd->stats.lfb_reads++; + v->stats.lfb_reads++; /* compute X,Y */ offset <<= 1; - x = offset & ((1 << vd->fbi.lfb_stride) - 1); - y = (offset >> vd->fbi.lfb_stride); + x = offset & ((1 << v->fbi.lfb_stride) - 1); + y = (offset >> v->fbi.lfb_stride); /* select the target buffer */ if (lfb_3d) { y &= 0x3ff; - destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(vd->reg[lfbMode].u); + destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : LFBMODE_READ_BUFFER_SELECT(v->reg[lfbMode].u); switch (destbuf) { case 0: /* front buffer */ - buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); - bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.frontbuf]) / 2; + buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); + bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.frontbuf]) / 2; break; case 1: /* back buffer */ - buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); - bufmax = (vd->fbi.mask + 1 - vd->fbi.rgboffs[vd->fbi.backbuf]) / 2; + buffer = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); + bufmax = (v->fbi.mask + 1 - v->fbi.rgboffs[v->fbi.backbuf]) / 2; break; case 2: /* aux buffer */ - if (vd->fbi.auxoffs == ~0) + if (v->fbi.auxoffs == ~0) return 0xffffffff; - buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs); - bufmax = (vd->fbi.mask + 1 - vd->fbi.auxoffs) / 2; + buffer = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs); + bufmax = (v->fbi.mask + 1 - v->fbi.auxoffs) / 2; break; default: /* reserved */ @@ -4008,37 +4069,37 @@ static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d) /* determine the screen Y */ scry = y; - if (LFBMODE_Y_ORIGIN(vd->reg[lfbMode].u)) - scry = (vd->fbi.yorigin - y) & 0x3ff; + if (LFBMODE_Y_ORIGIN(v->reg[lfbMode].u)) + scry = (v->fbi.yorigin - y) & 0x3ff; } else { // Direct lfb access - buffer = (UINT16 *)(vd->fbi.ram + vd->fbi.lfb_base*4); - bufmax = (vd->fbi.mask + 1 - vd->fbi.lfb_base*4) / 2; + buffer = (UINT16 *)(v->fbi.ram + v->fbi.lfb_base*4); + bufmax = (v->fbi.mask + 1 - v->fbi.lfb_base*4) / 2; scry = y; } /* advance pointers to the proper row */ - bufoffs = scry * vd->fbi.rowpixels + x; + bufoffs = scry * v->fbi.rowpixels + x; if (bufoffs >= bufmax) { - vd->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs); + v->device->logerror("LFB_R: Buffer offset out of bounds x=%i y=%i lfb_3d=%i offset=%08X bufoffs=%08X\n", x, y, lfb_3d, offset, (UINT32) bufoffs); return 0xffffffff; } /* wait for any outstanding work to finish */ - poly_wait(vd->poly, "LFB read"); + poly_wait(v->poly, "LFB read"); /* compute the data */ data = buffer[bufoffs + 0] | (buffer[bufoffs + 1] << 16); /* word swapping */ - if (LFBMODE_WORD_SWAP_READS(vd->reg[lfbMode].u)) + if (LFBMODE_WORD_SWAP_READS(v->reg[lfbMode].u)) data = (data << 16) | (data >> 16); /* byte swizzling */ - if (LFBMODE_BYTE_SWIZZLE_READS(vd->reg[lfbMode].u)) + if (LFBMODE_BYTE_SWIZZLE_READS(v->reg[lfbMode].u)) data = FLIPENDIAN_INT32(data); - if (LOG_LFB) vd->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", vd->index, x, y, data); + if (LOG_LFB) v->device->logerror("VOODOO.%d.LFB:read (%d,%d) = %08X\n", v->index, x, y, data); return data; } @@ -4053,16 +4114,17 @@ static UINT32 lfb_r(voodoo_device *vd, offs_t offset, bool lfb_3d) READ32_MEMBER( voodoo_device::voodoo_r ) { + voodoo_state *v = get_safe_token(this); /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); /* target the appropriate location */ if (!(offset & (0xc00000/4))) - return register_r(this, offset); + return register_r(v, offset); else if (!(offset & (0x800000/4))) - return lfb_r(this, offset, true); + return lfb_r(v, offset, true); return 0xffffffff; } @@ -4078,6 +4140,7 @@ READ32_MEMBER( voodoo_device::voodoo_r ) READ32_MEMBER( voodoo_banshee_device::banshee_agp_r ) { + voodoo_state *v = get_safe_token(this); UINT32 result; offset &= 0x1ff/4; @@ -4086,63 +4149,64 @@ READ32_MEMBER( voodoo_banshee_device::banshee_agp_r ) switch (offset) { case cmdRdPtrL0: - result = fbi.cmdfifo[0].rdptr; + result = v->fbi.cmdfifo[0].rdptr; break; case cmdAMin0: - result = fbi.cmdfifo[0].amin; + result = v->fbi.cmdfifo[0].amin; break; case cmdAMax0: - result = fbi.cmdfifo[0].amax; + result = v->fbi.cmdfifo[0].amax; break; case cmdFifoDepth0: - result = fbi.cmdfifo[0].depth; + result = v->fbi.cmdfifo[0].depth; break; case cmdHoleCnt0: - result = fbi.cmdfifo[0].holes; + result = v->fbi.cmdfifo[0].holes; break; case cmdRdPtrL1: - result = fbi.cmdfifo[1].rdptr; + result = v->fbi.cmdfifo[1].rdptr; break; case cmdAMin1: - result = fbi.cmdfifo[1].amin; + result = v->fbi.cmdfifo[1].amin; break; case cmdAMax1: - result = fbi.cmdfifo[1].amax; + result = v->fbi.cmdfifo[1].amax; break; case cmdFifoDepth1: - result = fbi.cmdfifo[1].depth; + result = v->fbi.cmdfifo[1].depth; break; case cmdHoleCnt1: - result = fbi.cmdfifo[1].holes; + result = v->fbi.cmdfifo[1].holes; break; default: - result = banshee.agp[offset]; + result = v->banshee.agp[offset]; break; } if (LOG_REGISTERS) - logerror("%s:banshee_r(AGP:%s)\n", device->machine().describe_context(), banshee_agp_reg_name[offset]); + logerror("%s:banshee_r(AGP:%s)\n", v->device->machine().describe_context(), banshee_agp_reg_name[offset]); return result; } READ32_MEMBER( voodoo_banshee_device::banshee_r ) { + voodoo_state *v = get_safe_token(this); UINT32 result = 0xffffffff; /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); if (offset < 0x80000/4) result = banshee_io_r(space, offset, mem_mask); @@ -4151,7 +4215,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) else if (offset < 0x200000/4) logerror("%s:banshee_r(2D:%X)\n", machine().describe_context(), (offset*4) & 0xfffff); else if (offset < 0x600000/4) - result = register_r(this, offset & 0x1fffff/4); + result = register_r(v, offset & 0x1fffff/4); else if (offset < 0x800000/4) logerror("%s:banshee_r(TEX0:%X)\n", machine().describe_context(), (offset*4) & 0x1fffff); else if (offset < 0xa00000/4) @@ -4162,7 +4226,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) logerror("%s:banshee_r(YUV:%X)\n", machine().describe_context(), (offset*4) & 0x3fffff); else if (offset < 0x2000000/4) { - result = lfb_r(this, offset & 0xffffff/4, true); + result = lfb_r(v, offset & 0xffffff/4, true); } else { logerror("%s:banshee_r(%X) Access out of bounds\n", machine().describe_context(), offset*4); } @@ -4172,26 +4236,27 @@ READ32_MEMBER( voodoo_banshee_device::banshee_r ) READ32_MEMBER( voodoo_banshee_device::banshee_fb_r ) { + voodoo_state *v = get_safe_token(this); UINT32 result = 0xffffffff; /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); - if (offset < fbi.lfb_base) + if (offset < v->fbi.lfb_base) { #if LOG_LFB logerror("%s:banshee_fb_r(%X)\n", machine().describe_context(), offset*4); #endif - if (offset*4 <= fbi.mask) - result = ((UINT32 *)fbi.ram)[offset]; + if (offset*4 <= v->fbi.mask) + result = ((UINT32 *)v->fbi.ram)[offset]; else logerror("%s:banshee_fb_r(%X) Access out of bounds\n", machine().describe_context(), offset*4); } else { if (LOG_LFB) - logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - fbi.lfb_base, fbi.lfb_base); - result = lfb_r(this, offset - fbi.lfb_base, false); + logerror("%s:banshee_fb_r(%X) to lfb_r: %08X lfb_base=%08X\n", machine().describe_context(), offset*4, offset - v->fbi.lfb_base, v->fbi.lfb_base); + result = lfb_r(v, offset - v->fbi.lfb_base, false); } return result; } @@ -4199,6 +4264,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_fb_r ) READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) { + voodoo_state *v = get_safe_token(this); UINT8 result = 0xff; offset &= 0x1f; @@ -4208,10 +4274,10 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) { /* attribute access */ case 0x3c0: - if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att)) - result = banshee.att[banshee.vga[0x3c1 & 0x1f]]; + if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att)) + result = v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f]); + logerror("%s:banshee_att_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f]); break; /* Input status 0 */ @@ -4229,41 +4295,41 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) /* Sequencer access */ case 0x3c5: - if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq)) - result = banshee.seq[banshee.vga[0x3c4 & 0x1f]]; + if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq)) + result = v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f]); + logerror("%s:banshee_seq_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f]); break; /* Feature control */ case 0x3ca: - result = banshee.vga[0x3da & 0x1f]; - banshee.attff = 0; + result = v->banshee.vga[0x3da & 0x1f]; + v->banshee.attff = 0; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; /* Miscellaneous output */ case 0x3cc: - result = banshee.vga[0x3c2 & 0x1f]; + result = v->banshee.vga[0x3c2 & 0x1f]; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; /* Graphics controller access */ case 0x3cf: - if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc)) - result = banshee.gc[banshee.vga[0x3ce & 0x1f]]; + if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc)) + result = v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f]); + logerror("%s:banshee_gc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f]); break; /* CRTC access */ case 0x3d5: - if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc)) - result = banshee.crtc[banshee.vga[0x3d4 & 0x1f]]; + if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc)) + result = v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]]; if (LOG_REGISTERS) - logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f]); + logerror("%s:banshee_crtc_r(%X)\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f]); break; /* Input status 1 */ @@ -4283,7 +4349,7 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) break; default: - result = banshee.vga[offset]; + result = v->banshee.vga[offset]; if (LOG_REGISTERS) logerror("%s:banshee_vga_r(%X)\n", machine().describe_context(), 0x300+offset); break; @@ -4294,6 +4360,7 @@ READ8_MEMBER( voodoo_banshee_device::banshee_vga_r ) READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) { + voodoo_state *v = get_safe_token(this); UINT32 result; offset &= 0xff/4; @@ -4302,13 +4369,13 @@ READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) switch (offset) { case io_status: - result = register_r(this, 0); + result = register_r(v, 0); break; case io_dacData: - result = fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset]; + result = v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset]; if (LOG_REGISTERS) - logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff); + logerror("%s:banshee_dac_r(%X)\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff); break; case io_vgab0: case io_vgab4: case io_vgab8: case io_vgabc: @@ -4326,7 +4393,7 @@ READ32_MEMBER( voodoo_banshee_device::banshee_io_r ) break; default: - result = banshee.io[offset]; + result = v->banshee.io[offset]; if (LOG_REGISTERS) logerror("%s:banshee_io_r(%s)\n", machine().describe_context(), banshee_io_reg_name[offset]); break; @@ -4342,9 +4409,9 @@ READ32_MEMBER( voodoo_banshee_device::banshee_rom_r ) return 0xffffffff; } -static void blit_2d(voodoo_device *vd, UINT32 data) +static void blit_2d(voodoo_state *v, UINT32 data) { - switch (vd->banshee.blt_cmd) + switch (v->banshee.blt_cmd) { case 0: // NOP - wait for idle { @@ -4367,46 +4434,46 @@ static void blit_2d(voodoo_device *vd, UINT32 data) case 3: // Host-to-screen blit { - UINT32 addr = vd->banshee.blt_dst_base; + UINT32 addr = v->banshee.blt_dst_base; - addr += (vd->banshee.blt_dst_y * vd->banshee.blt_dst_stride) + (vd->banshee.blt_dst_x * vd->banshee.blt_dst_bpp); + addr += (v->banshee.blt_dst_y * v->banshee.blt_dst_stride) + (v->banshee.blt_dst_x * v->banshee.blt_dst_bpp); #if LOG_BANSHEE_2D - logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, vd->banshee.blt_dst_x, vd->banshee.blt_dst_y); + logerror(" blit_2d:host_to_screen: %08x -> %08x, %d, %d\n", data, addr, v->banshee.blt_dst_x, v->banshee.blt_dst_y); #endif - switch (vd->banshee.blt_dst_bpp) + switch (v->banshee.blt_dst_bpp) { case 1: - vd->fbi.ram[addr+0] = data & 0xff; - vd->fbi.ram[addr+1] = (data >> 8) & 0xff; - vd->fbi.ram[addr+2] = (data >> 16) & 0xff; - vd->fbi.ram[addr+3] = (data >> 24) & 0xff; - vd->banshee.blt_dst_x += 4; + v->fbi.ram[addr+0] = data & 0xff; + v->fbi.ram[addr+1] = (data >> 8) & 0xff; + v->fbi.ram[addr+2] = (data >> 16) & 0xff; + v->fbi.ram[addr+3] = (data >> 24) & 0xff; + v->banshee.blt_dst_x += 4; break; case 2: - vd->fbi.ram[addr+1] = data & 0xff; - vd->fbi.ram[addr+0] = (data >> 8) & 0xff; - vd->fbi.ram[addr+3] = (data >> 16) & 0xff; - vd->fbi.ram[addr+2] = (data >> 24) & 0xff; - vd->banshee.blt_dst_x += 2; + v->fbi.ram[addr+1] = data & 0xff; + v->fbi.ram[addr+0] = (data >> 8) & 0xff; + v->fbi.ram[addr+3] = (data >> 16) & 0xff; + v->fbi.ram[addr+2] = (data >> 24) & 0xff; + v->banshee.blt_dst_x += 2; break; case 3: - vd->banshee.blt_dst_x += 1; + v->banshee.blt_dst_x += 1; break; case 4: - vd->fbi.ram[addr+3] = data & 0xff; - vd->fbi.ram[addr+2] = (data >> 8) & 0xff; - vd->fbi.ram[addr+1] = (data >> 16) & 0xff; - vd->fbi.ram[addr+0] = (data >> 24) & 0xff; - vd->banshee.blt_dst_x += 1; + v->fbi.ram[addr+3] = data & 0xff; + v->fbi.ram[addr+2] = (data >> 8) & 0xff; + v->fbi.ram[addr+1] = (data >> 16) & 0xff; + v->fbi.ram[addr+0] = (data >> 24) & 0xff; + v->banshee.blt_dst_x += 1; break; } - if (vd->banshee.blt_dst_x >= vd->banshee.blt_dst_width) + if (v->banshee.blt_dst_x >= v->banshee.blt_dst_width) { - vd->banshee.blt_dst_x = 0; - vd->banshee.blt_dst_y++; + v->banshee.blt_dst_x = 0; + v->banshee.blt_dst_y++; } break; } @@ -4433,12 +4500,12 @@ static void blit_2d(voodoo_device *vd, UINT32 data) default: { - fatalerror("blit_2d: unknown command %d\n", vd->banshee.blt_cmd); + fatalerror("blit_2d: unknown command %d\n", v->banshee.blt_cmd); } } } -INT32 voodoo_device::banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data) +static INT32 banshee_2d_w(voodoo_state *v, offs_t offset, UINT32 data) { switch (offset) { @@ -4447,152 +4514,152 @@ INT32 voodoo_device::banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data) logerror(" 2D:command: cmd %d, ROP0 %02X\n", data & 0xf, data >> 24); #endif - vd->banshee.blt_src_x = vd->banshee.blt_regs[banshee2D_srcXY] & 0xfff; - vd->banshee.blt_src_y = (vd->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff; - vd->banshee.blt_src_base = vd->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff; - vd->banshee.blt_src_stride = vd->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff; - vd->banshee.blt_src_width = vd->banshee.blt_regs[banshee2D_srcSize] & 0xfff; - vd->banshee.blt_src_height = (vd->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff; + v->banshee.blt_src_x = v->banshee.blt_regs[banshee2D_srcXY] & 0xfff; + v->banshee.blt_src_y = (v->banshee.blt_regs[banshee2D_srcXY] >> 16) & 0xfff; + v->banshee.blt_src_base = v->banshee.blt_regs[banshee2D_srcBaseAddr] & 0xffffff; + v->banshee.blt_src_stride = v->banshee.blt_regs[banshee2D_srcFormat] & 0x3fff; + v->banshee.blt_src_width = v->banshee.blt_regs[banshee2D_srcSize] & 0xfff; + v->banshee.blt_src_height = (v->banshee.blt_regs[banshee2D_srcSize] >> 16) & 0xfff; - switch ((vd->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf) + switch ((v->banshee.blt_regs[banshee2D_srcFormat] >> 16) & 0xf) { - case 1: vd->banshee.blt_src_bpp = 1; break; - case 3: vd->banshee.blt_src_bpp = 2; break; - case 4: vd->banshee.blt_src_bpp = 3; break; - case 5: vd->banshee.blt_src_bpp = 4; break; - case 8: vd->banshee.blt_src_bpp = 2; break; - case 9: vd->banshee.blt_src_bpp = 2; break; - default: vd->banshee.blt_src_bpp = 1; break; + case 1: v->banshee.blt_src_bpp = 1; break; + case 3: v->banshee.blt_src_bpp = 2; break; + case 4: v->banshee.blt_src_bpp = 3; break; + case 5: v->banshee.blt_src_bpp = 4; break; + case 8: v->banshee.blt_src_bpp = 2; break; + case 9: v->banshee.blt_src_bpp = 2; break; + default: v->banshee.blt_src_bpp = 1; break; } - vd->banshee.blt_dst_x = vd->banshee.blt_regs[banshee2D_dstXY] & 0xfff; - vd->banshee.blt_dst_y = (vd->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff; - vd->banshee.blt_dst_base = vd->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff; - vd->banshee.blt_dst_stride = vd->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff; - vd->banshee.blt_dst_width = vd->banshee.blt_regs[banshee2D_dstSize] & 0xfff; - vd->banshee.blt_dst_height = (vd->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff; + v->banshee.blt_dst_x = v->banshee.blt_regs[banshee2D_dstXY] & 0xfff; + v->banshee.blt_dst_y = (v->banshee.blt_regs[banshee2D_dstXY] >> 16) & 0xfff; + v->banshee.blt_dst_base = v->banshee.blt_regs[banshee2D_dstBaseAddr] & 0xffffff; + v->banshee.blt_dst_stride = v->banshee.blt_regs[banshee2D_dstFormat] & 0x3fff; + v->banshee.blt_dst_width = v->banshee.blt_regs[banshee2D_dstSize] & 0xfff; + v->banshee.blt_dst_height = (v->banshee.blt_regs[banshee2D_dstSize] >> 16) & 0xfff; - switch ((vd->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7) + switch ((v->banshee.blt_regs[banshee2D_dstFormat] >> 16) & 0x7) { - case 1: vd->banshee.blt_dst_bpp = 1; break; - case 3: vd->banshee.blt_dst_bpp = 2; break; - case 4: vd->banshee.blt_dst_bpp = 3; break; - case 5: vd->banshee.blt_dst_bpp = 4; break; - default: vd->banshee.blt_dst_bpp = 1; break; + case 1: v->banshee.blt_dst_bpp = 1; break; + case 3: v->banshee.blt_dst_bpp = 2; break; + case 4: v->banshee.blt_dst_bpp = 3; break; + case 5: v->banshee.blt_dst_bpp = 4; break; + default: v->banshee.blt_dst_bpp = 1; break; } - vd->banshee.blt_cmd = data & 0xf; + v->banshee.blt_cmd = data & 0xf; break; case banshee2D_colorBack: #if LOG_BANSHEE_2D logerror(" 2D:colorBack: %08X\n", data); #endif - vd->banshee.blt_regs[banshee2D_colorBack] = data; + v->banshee.blt_regs[banshee2D_colorBack] = data; break; case banshee2D_colorFore: #if LOG_BANSHEE_2D logerror(" 2D:colorFore: %08X\n", data); #endif - vd->banshee.blt_regs[banshee2D_colorFore] = data; + v->banshee.blt_regs[banshee2D_colorFore] = data; break; case banshee2D_srcBaseAddr: #if LOG_BANSHEE_2D logerror(" 2D:srcBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled"); #endif - vd->banshee.blt_regs[banshee2D_srcBaseAddr] = data; + v->banshee.blt_regs[banshee2D_srcBaseAddr] = data; break; case banshee2D_dstBaseAddr: #if LOG_BANSHEE_2D logerror(" 2D:dstBaseAddr: %08X, %s\n", data & 0xffffff, data & 0x80000000 ? "tiled" : "non-tiled"); #endif - vd->banshee.blt_regs[banshee2D_dstBaseAddr] = data; + v->banshee.blt_regs[banshee2D_dstBaseAddr] = data; break; case banshee2D_srcSize: #if LOG_BANSHEE_2D logerror(" 2D:srcSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_srcSize] = data; + v->banshee.blt_regs[banshee2D_srcSize] = data; break; case banshee2D_dstSize: #if LOG_BANSHEE_2D logerror(" 2D:dstSize: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_dstSize] = data; + v->banshee.blt_regs[banshee2D_dstSize] = data; break; case banshee2D_srcXY: #if LOG_BANSHEE_2D logerror(" 2D:srcXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_srcXY] = data; + v->banshee.blt_regs[banshee2D_srcXY] = data; break; case banshee2D_dstXY: #if LOG_BANSHEE_2D logerror(" 2D:dstXY: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_dstXY] = data; + v->banshee.blt_regs[banshee2D_dstXY] = data; break; case banshee2D_srcFormat: #if LOG_BANSHEE_2D logerror(" 2D:srcFormat: str %d, fmt %d, packing %d\n", data & 0x3fff, (data >> 16) & 0xf, (data >> 22) & 0x3); #endif - vd->banshee.blt_regs[banshee2D_srcFormat] = data; + v->banshee.blt_regs[banshee2D_srcFormat] = data; break; case banshee2D_dstFormat: #if LOG_BANSHEE_2D logerror(" 2D:dstFormat: str %d, fmt %d\n", data & 0x3fff, (data >> 16) & 0xf); #endif - vd->banshee.blt_regs[banshee2D_dstFormat] = data; + v->banshee.blt_regs[banshee2D_dstFormat] = data; break; case banshee2D_clip0Min: #if LOG_BANSHEE_2D logerror(" 2D:clip0Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_clip0Min] = data; + v->banshee.blt_regs[banshee2D_clip0Min] = data; break; case banshee2D_clip0Max: #if LOG_BANSHEE_2D logerror(" 2D:clip0Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_clip0Max] = data; + v->banshee.blt_regs[banshee2D_clip0Max] = data; break; case banshee2D_clip1Min: #if LOG_BANSHEE_2D logerror(" 2D:clip1Min: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_clip1Min] = data; + v->banshee.blt_regs[banshee2D_clip1Min] = data; break; case banshee2D_clip1Max: #if LOG_BANSHEE_2D logerror(" 2D:clip1Max: %d, %d\n", data & 0xfff, (data >> 16) & 0xfff); #endif - vd->banshee.blt_regs[banshee2D_clip1Max] = data; + v->banshee.blt_regs[banshee2D_clip1Max] = data; break; case banshee2D_rop: #if LOG_BANSHEE_2D logerror(" 2D:rop: %d, %d, %d\n", data & 0xff, (data >> 8) & 0xff, (data >> 16) & 0xff); #endif - vd->banshee.blt_regs[banshee2D_rop] = data; + v->banshee.blt_regs[banshee2D_rop] = data; break; default: if (offset >= 0x20 && offset < 0x40) { - blit_2d(vd, data); + blit_2d(v, data); } else if (offset >= 0x40 && offset < 0x80) { @@ -4610,85 +4677,86 @@ INT32 voodoo_device::banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data) WRITE32_MEMBER( voodoo_banshee_device::banshee_agp_w ) { + voodoo_state *v = get_safe_token(this); offset &= 0x1ff/4; /* switch off the offset */ switch (offset) { case cmdBaseAddr0: - COMBINE_DATA(&banshee.agp[offset]); - fbi.cmdfifo[0].base = (data & 0xffffff) << 12; - fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); + COMBINE_DATA(&v->banshee.agp[offset]); + v->fbi.cmdfifo[0].base = (data & 0xffffff) << 12; + v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); break; case cmdBaseSize0: - COMBINE_DATA(&banshee.agp[offset]); - fbi.cmdfifo[0].end = fbi.cmdfifo[0].base + (((banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); - fbi.cmdfifo[0].enable = (data >> 8) & 1; - fbi.cmdfifo[0].count_holes = (~data >> 10) & 1; + COMBINE_DATA(&v->banshee.agp[offset]); + v->fbi.cmdfifo[0].end = v->fbi.cmdfifo[0].base + (((v->banshee.agp[cmdBaseSize0] & 0xff) + 1) << 12); + v->fbi.cmdfifo[0].enable = (data >> 8) & 1; + v->fbi.cmdfifo[0].count_holes = (~data >> 10) & 1; break; case cmdBump0: fatalerror("cmdBump0\n"); case cmdRdPtrL0: - fbi.cmdfifo[0].rdptr = data; + v->fbi.cmdfifo[0].rdptr = data; break; case cmdAMin0: - fbi.cmdfifo[0].amin = data; + v->fbi.cmdfifo[0].amin = data; break; case cmdAMax0: - fbi.cmdfifo[0].amax = data; + v->fbi.cmdfifo[0].amax = data; break; case cmdFifoDepth0: - fbi.cmdfifo[0].depth = data; + v->fbi.cmdfifo[0].depth = data; break; case cmdHoleCnt0: - fbi.cmdfifo[0].holes = data; + v->fbi.cmdfifo[0].holes = data; break; case cmdBaseAddr1: - COMBINE_DATA(&banshee.agp[offset]); - fbi.cmdfifo[1].base = (data & 0xffffff) << 12; - fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); + COMBINE_DATA(&v->banshee.agp[offset]); + v->fbi.cmdfifo[1].base = (data & 0xffffff) << 12; + v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); break; case cmdBaseSize1: - COMBINE_DATA(&banshee.agp[offset]); - fbi.cmdfifo[1].end = fbi.cmdfifo[1].base + (((banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); - fbi.cmdfifo[1].enable = (data >> 8) & 1; - fbi.cmdfifo[1].count_holes = (~data >> 10) & 1; + COMBINE_DATA(&v->banshee.agp[offset]); + v->fbi.cmdfifo[1].end = v->fbi.cmdfifo[1].base + (((v->banshee.agp[cmdBaseSize1] & 0xff) + 1) << 12); + v->fbi.cmdfifo[1].enable = (data >> 8) & 1; + v->fbi.cmdfifo[1].count_holes = (~data >> 10) & 1; break; case cmdBump1: fatalerror("cmdBump1\n"); case cmdRdPtrL1: - fbi.cmdfifo[1].rdptr = data; + v->fbi.cmdfifo[1].rdptr = data; break; case cmdAMin1: - fbi.cmdfifo[1].amin = data; + v->fbi.cmdfifo[1].amin = data; break; case cmdAMax1: - fbi.cmdfifo[1].amax = data; + v->fbi.cmdfifo[1].amax = data; break; case cmdFifoDepth1: - fbi.cmdfifo[1].depth = data; + v->fbi.cmdfifo[1].depth = data; break; case cmdHoleCnt1: - fbi.cmdfifo[1].holes = data; + v->fbi.cmdfifo[1].holes = data; break; default: - COMBINE_DATA(&banshee.agp[offset]); + COMBINE_DATA(&v->banshee.agp[offset]); break; } @@ -4699,10 +4767,11 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_agp_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) { + voodoo_state *v = get_safe_token(this); /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); if (offset < 0x80000/4) banshee_io_w(space, offset, data, mem_mask); @@ -4711,7 +4780,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) else if (offset < 0x200000/4) logerror("%s:banshee_w(2D:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0xfffff, data, mem_mask); else if (offset < 0x600000/4) - register_w(this, offset & 0x1fffff/4, data); + register_w(v, offset & 0x1fffff/4, data); else if (offset < 0x800000/4) logerror("%s:banshee_w(TEX0:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x1fffff, data, mem_mask); else if (offset < 0xa00000/4) @@ -4722,7 +4791,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) logerror("%s:banshee_w(YUV:%X) = %08X & %08X\n", machine().describe_context(), (offset*4) & 0x3fffff, data, mem_mask); else if (offset < 0x2000000/4) { - lfb_w(this, offset & 0xffffff/4, data, mem_mask); + lfb_w(v, offset & 0xffffff/4, data, mem_mask); } else { logerror("%s:banshee_w Address out of range %08X = %08X & %08X\n", machine().describe_context(), (offset*4), data, mem_mask); } @@ -4731,22 +4800,23 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_fb_w ) { + voodoo_state *v = get_safe_token(this); UINT32 addr = offset*4; /* if we have something pending, flush the FIFOs up to the current time */ - if (pci.op_pending) - flush_fifos(this, machine().time()); + if (v->pci.op_pending) + flush_fifos(v, machine().time()); - if (offset < fbi.lfb_base) + if (offset < v->fbi.lfb_base) { - if (fbi.cmdfifo[0].enable && addr >= fbi.cmdfifo[0].base && addr < fbi.cmdfifo[0].end) - cmdfifo_w(this, &fbi.cmdfifo[0], (addr - fbi.cmdfifo[0].base) / 4, data); - else if (fbi.cmdfifo[1].enable && addr >= fbi.cmdfifo[1].base && addr < fbi.cmdfifo[1].end) - cmdfifo_w(this, &fbi.cmdfifo[1], (addr - fbi.cmdfifo[1].base) / 4, data); + if (v->fbi.cmdfifo[0].enable && addr >= v->fbi.cmdfifo[0].base && addr < v->fbi.cmdfifo[0].end) + cmdfifo_w(v, &v->fbi.cmdfifo[0], (addr - v->fbi.cmdfifo[0].base) / 4, data); + else if (v->fbi.cmdfifo[1].enable && addr >= v->fbi.cmdfifo[1].base && addr < v->fbi.cmdfifo[1].end) + cmdfifo_w(v, &v->fbi.cmdfifo[1], (addr - v->fbi.cmdfifo[1].base) / 4, data); else { - if (offset*4 <= fbi.mask) - COMBINE_DATA(&((UINT32 *)fbi.ram)[offset]); + if (offset*4 <= v->fbi.mask) + COMBINE_DATA(&((UINT32 *)v->fbi.ram)[offset]); else logerror("%s:banshee_fb_w Out of bounds (%X) = %08X & %08X\n", machine().describe_context(), offset*4, data, mem_mask); #if LOG_LFB @@ -4755,12 +4825,13 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_fb_w ) } } else - lfb_direct_w(this, offset - fbi.lfb_base, data, mem_mask); + lfb_direct_w(v, offset - v->fbi.lfb_base, data, mem_mask); } WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) { + voodoo_state *v = get_safe_token(this); offset &= 0x1f; /* switch off the offset */ @@ -4769,48 +4840,48 @@ WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) /* attribute access */ case 0x3c0: case 0x3c1: - if (banshee.attff == 0) + if (v->banshee.attff == 0) { - banshee.vga[0x3c1 & 0x1f] = data; + v->banshee.vga[0x3c1 & 0x1f] = data; if (LOG_REGISTERS) logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data); } else { - if (banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(banshee.att)) - banshee.att[banshee.vga[0x3c1 & 0x1f]] = data; + if (v->banshee.vga[0x3c1 & 0x1f] < ARRAY_LENGTH(v->banshee.att)) + v->banshee.att[v->banshee.vga[0x3c1 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c1 & 0x1f], data); + logerror("%s:banshee_att_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c1 & 0x1f], data); } - banshee.attff ^= 1; + v->banshee.attff ^= 1; break; /* Sequencer access */ case 0x3c5: - if (banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(banshee.seq)) - banshee.seq[banshee.vga[0x3c4 & 0x1f]] = data; + if (v->banshee.vga[0x3c4 & 0x1f] < ARRAY_LENGTH(v->banshee.seq)) + v->banshee.seq[v->banshee.vga[0x3c4 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3c4 & 0x1f], data); + logerror("%s:banshee_seq_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3c4 & 0x1f], data); break; /* Graphics controller access */ case 0x3cf: - if (banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(banshee.gc)) - banshee.gc[banshee.vga[0x3ce & 0x1f]] = data; + if (v->banshee.vga[0x3ce & 0x1f] < ARRAY_LENGTH(v->banshee.gc)) + v->banshee.gc[v->banshee.vga[0x3ce & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3ce & 0x1f], data); + logerror("%s:banshee_gc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3ce & 0x1f], data); break; /* CRTC access */ case 0x3d5: - if (banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(banshee.crtc)) - banshee.crtc[banshee.vga[0x3d4 & 0x1f]] = data; + if (v->banshee.vga[0x3d4 & 0x1f] < ARRAY_LENGTH(v->banshee.crtc)) + v->banshee.crtc[v->banshee.vga[0x3d4 & 0x1f]] = data; if (LOG_REGISTERS) - logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), banshee.vga[0x3d4 & 0x1f], data); + logerror("%s:banshee_crtc_w(%X) = %02X\n", machine().describe_context(), v->banshee.vga[0x3d4 & 0x1f], data); break; default: - banshee.vga[offset] = data; + v->banshee.vga[offset] = data; if (LOG_REGISTERS) logerror("%s:banshee_vga_w(%X) = %02X\n", machine().describe_context(), 0x3c0+offset, data); break; @@ -4820,72 +4891,73 @@ WRITE8_MEMBER( voodoo_banshee_device::banshee_vga_w ) WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) { + voodoo_state *v = get_safe_token(this); UINT32 old; offset &= 0xff/4; - old = banshee.io[offset]; + old = v->banshee.io[offset]; /* switch off the offset */ switch (offset) { case io_vidProcCfg: - COMBINE_DATA(&banshee.io[offset]); - if ((banshee.io[offset] ^ old) & 0x2800) - fbi.clut_dirty = TRUE; + COMBINE_DATA(&v->banshee.io[offset]); + if ((v->banshee.io[offset] ^ old) & 0x2800) + v->fbi.clut_dirty = TRUE; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; case io_dacData: - COMBINE_DATA(&banshee.io[offset]); - if (banshee.io[offset] != fbi.clut[banshee.io[io_dacAddr] & 0x1ff]) + COMBINE_DATA(&v->banshee.io[offset]); + if (v->banshee.io[offset] != v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff]) { - fbi.clut[banshee.io[io_dacAddr] & 0x1ff] = banshee.io[offset]; - fbi.clut_dirty = TRUE; + v->fbi.clut[v->banshee.io[io_dacAddr] & 0x1ff] = v->banshee.io[offset]; + v->fbi.clut_dirty = TRUE; } if (LOG_REGISTERS) - logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), banshee.io[io_dacAddr] & 0x1ff, data, mem_mask); + logerror("%s:banshee_dac_w(%X) = %08X & %08X\n", machine().describe_context(), v->banshee.io[io_dacAddr] & 0x1ff, data, mem_mask); break; case io_miscInit0: - COMBINE_DATA(&banshee.io[offset]); - fbi.yorigin = (data >> 18) & 0xfff; + COMBINE_DATA(&v->banshee.io[offset]); + v->fbi.yorigin = (data >> 18) & 0xfff; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; case io_vidScreenSize: if (data & 0xfff) - fbi.width = data & 0xfff; + v->fbi.width = data & 0xfff; if (data & 0xfff000) - fbi.height = (data >> 12) & 0xfff; + v->fbi.height = (data >> 12) & 0xfff; /* fall through */ case io_vidOverlayDudx: case io_vidOverlayDvdy: { /* warning: this is a hack for now! We should really compute the screen size */ /* from the CRTC registers */ - COMBINE_DATA(&banshee.io[offset]); + COMBINE_DATA(&v->banshee.io[offset]); - int width = fbi.width; - int height = fbi.height; + int width = v->fbi.width; + int height = v->fbi.height; - if (banshee.io[io_vidOverlayDudx] != 0) - width = (fbi.width * banshee.io[io_vidOverlayDudx]) / 1048576; - if (banshee.io[io_vidOverlayDvdy] != 0) - height = (fbi.height * banshee.io[io_vidOverlayDvdy]) / 1048576; + if (v->banshee.io[io_vidOverlayDudx] != 0) + width = (v->fbi.width * v->banshee.io[io_vidOverlayDudx]) / 1048576; + if (v->banshee.io[io_vidOverlayDvdy] != 0) + height = (v->fbi.height * v->banshee.io[io_vidOverlayDvdy]) / 1048576; - screen->set_visible_area(0, width - 1, 0, height - 1); + v->screen->set_visible_area(0, width - 1, 0, height - 1); - adjust_vblank_timer(this); + adjust_vblank_timer(v); if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; } case io_lfbMemoryConfig: - fbi.lfb_base = (data & 0x1fff) << (12-2); - fbi.lfb_stride = ((data >> 13) & 7) + 9; + v->fbi.lfb_base = (data & 0x1fff) << (12-2); + v->fbi.lfb_stride = ((data >> 13) & 7) + 9; if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; @@ -4904,7 +4976,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) break; default: - COMBINE_DATA(&banshee.io[offset]); + COMBINE_DATA(&v->banshee.io[offset]); if (LOG_REGISTERS) logerror("%s:banshee_io_w(%s) = %08X & %08X\n", machine().describe_context(), banshee_io_reg_name[offset], data, mem_mask); break; @@ -4923,6 +4995,7 @@ WRITE32_MEMBER( voodoo_banshee_device::banshee_io_w ) void voodoo_device::common_start_voodoo(UINT8 type) { + voodoo_state *v = get_safe_token(this); const raster_info *info; void *fbmem, *tmumem[2]; UINT32 tmumem0, tmumem1; @@ -4934,17 +5007,17 @@ void voodoo_device::common_start_voodoo(UINT8 type) assert(m_fbmem > 0); /* store a pointer back to the device */ - device = this; - vd_type = type; + v->device = this; + v->type = type; /* copy config data */ - freq = clock(); - device->m_vblank.resolve(); - device->m_stall.resolve(); + v->freq = clock(); + v->device->m_vblank.resolve(); + v->device->m_stall.resolve(); /* create a multiprocessor work queue */ - poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0); - thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS); + v->poly = poly_alloc(machine(), 64, sizeof(poly_extra_data), 0); + v->thread_stats = auto_alloc_array(machine(), stats_block, WORK_MAX_THREADS); /* create a table of precomputed 1/n and log2(n) values */ /* n ranges from 1.0000 to 2.0000 */ @@ -4975,38 +5048,38 @@ void voodoo_device::common_start_voodoo(UINT8 type) } } - tmu_config = 0x11; // revision 1 + v->tmu_config = 0x11; // revision 1 /* configure type-specific values */ - switch (vd_type) + switch (v->type) { case TYPE_VOODOO_1: - regaccess = voodoo_register_access; - regnames = voodoo_reg_name; - alt_regmap = 0; - fbi.lfb_stride = 10; + v->regaccess = voodoo_register_access; + v->regnames = voodoo_reg_name; + v->alt_regmap = 0; + v->fbi.lfb_stride = 10; break; case TYPE_VOODOO_2: - regaccess = voodoo2_register_access; - regnames = voodoo_reg_name; - alt_regmap = 0; - fbi.lfb_stride = 10; - tmu_config |= 0x800; + v->regaccess = voodoo2_register_access; + v->regnames = voodoo_reg_name; + v->alt_regmap = 0; + v->fbi.lfb_stride = 10; + v->tmu_config |= 0x800; break; case TYPE_VOODOO_BANSHEE: - regaccess = banshee_register_access; - regnames = banshee_reg_name; - alt_regmap = 1; - fbi.lfb_stride = 11; + v->regaccess = banshee_register_access; + v->regnames = banshee_reg_name; + v->alt_regmap = 1; + v->fbi.lfb_stride = 11; break; case TYPE_VOODOO_3: - regaccess = banshee_register_access; - regnames = banshee_reg_name; - alt_regmap = 1; - fbi.lfb_stride = 11; + v->regaccess = banshee_register_access; + v->regnames = banshee_reg_name; + v->alt_regmap = 1; + v->fbi.lfb_stride = 11; break; default: @@ -5015,41 +5088,41 @@ void voodoo_device::common_start_voodoo(UINT8 type) /* set the type, and initialize the chip mask */ device_iterator iter(machine().root_device()); - index = 0; + v->index = 0; for (device_t *scan = iter.first(); scan != nullptr; scan = iter.next()) if (scan->type() == this->type()) { if (scan == this) break; - index++; + v->index++; } - screen = downcast<screen_device *>(machine().device(m_screen)); - assert_always(screen != nullptr, "Unable to find screen attached to voodoo"); - cpu = machine().device(m_cputag); - assert_always(cpu != nullptr, "Unable to find CPU attached to voodoo"); + v->screen = downcast<screen_device *>(machine().device(m_screen)); + assert_always(v->screen != nullptr, "Unable to find screen attached to voodoo"); + v->cpu = machine().device(m_cputag); + assert_always(v->cpu != nullptr, "Unable to find CPU attached to voodoo"); if (m_tmumem1 != 0) - tmu_config |= 0xc0; // two TMUs + v->tmu_config |= 0xc0; // two TMUs - chipmask = 0x01; - attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / freq; - trigger = 51324 + index; + v->chipmask = 0x01; + v->attoseconds_per_cycle = ATTOSECONDS_PER_SECOND / v->freq; + v->trigger = 51324 + v->index; /* build the rasterizer table */ for (info = predef_raster_table; info->callback; info++) - add_rasterizer(this, info); + add_rasterizer(v, info); /* set up the PCI FIFO */ - pci.fifo.base = pci.fifo_mem; - pci.fifo.size = 64*2; - pci.fifo.in = pci.fifo.out = 0; - pci.stall_state = NOT_STALLED; - pci.continue_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(voodoo_device::stall_cpu_callback),this), nullptr); - + v->pci.fifo.base = v->pci.fifo_mem; + v->pci.fifo.size = 64*2; + v->pci.fifo.in = v->pci.fifo.out = 0; + v->pci.stall_state = NOT_STALLED; + v->pci.continue_timer = machine().scheduler().timer_alloc(FUNC(stall_cpu_callback), v); + /* allocate memory */ tmumem0 = m_tmumem0; tmumem1 = m_tmumem1; - if (vd_type <= TYPE_VOODOO_2) + if (v->type <= TYPE_VOODOO_2) { /* separate FB/TMU memory */ fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20); @@ -5061,47 +5134,47 @@ void voodoo_device::common_start_voodoo(UINT8 type) /* shared memory */ tmumem[0] = tmumem[1] = fbmem = auto_alloc_array(machine(), UINT8, m_fbmem << 20); tmumem0 = m_fbmem; - if (vd_type == TYPE_VOODOO_3) + if (v->type == TYPE_VOODOO_3) tmumem1 = m_fbmem; } /* set up frame buffer */ - init_fbi(this, &fbi, fbmem, m_fbmem << 20); + init_fbi(v, &v->fbi, fbmem, m_fbmem << 20); /* build shared TMU tables */ - init_tmu_shared(&tmushare); + init_tmu_shared(&v->tmushare); /* set up the TMUs */ - init_tmu(this, &tmu[0], ®[0x100], tmumem[0], tmumem0 << 20); - chipmask |= 0x02; + init_tmu(v, &v->tmu[0], &v->reg[0x100], tmumem[0], tmumem0 << 20); + v->chipmask |= 0x02; if (tmumem1 != 0) { - init_tmu(this, &tmu[1], ®[0x200], tmumem[1], tmumem1 << 20); - chipmask |= 0x04; - tmu_config |= 0x40; + init_tmu(v, &v->tmu[1], &v->reg[0x200], tmumem[1], tmumem1 << 20); + v->chipmask |= 0x04; + v->tmu_config |= 0x40; } /* initialize some registers */ - memset(reg, 0, sizeof(reg)); - pci.init_enable = 0; - reg[fbiInit0].u = (1 << 4) | (0x10 << 6); - reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20); - reg[fbiInit2].u = (1 << 6) | (0x100 << 23); - reg[fbiInit3].u = (2 << 13) | (0xf << 17); - reg[fbiInit4].u = (1 << 0); + memset(v->reg, 0, sizeof(v->reg)); + v->pci.init_enable = 0; + v->reg[fbiInit0].u = (1 << 4) | (0x10 << 6); + v->reg[fbiInit1].u = (1 << 1) | (1 << 8) | (1 << 12) | (2 << 20); + v->reg[fbiInit2].u = (1 << 6) | (0x100 << 23); + v->reg[fbiInit3].u = (2 << 13) | (0xf << 17); + v->reg[fbiInit4].u = (1 << 0); /* initialize banshee registers */ - memset(banshee.io, 0, sizeof(banshee.io)); - banshee.io[io_pciInit0] = 0x01800040; - banshee.io[io_sipMonitor] = 0x40000000; - banshee.io[io_lfbMemoryConfig] = 0x000a2200; - banshee.io[io_dramInit0] = 0x00579d29; - banshee.io[io_dramInit0] |= 0x08000000; // Konami Viper expects 16MBit SGRAMs - banshee.io[io_dramInit1] = 0x00f02200; - banshee.io[io_tmuGbeInit] = 0x00000bfb; + memset(v->banshee.io, 0, sizeof(v->banshee.io)); + v->banshee.io[io_pciInit0] = 0x01800040; + v->banshee.io[io_sipMonitor] = 0x40000000; + v->banshee.io[io_lfbMemoryConfig] = 0x000a2200; + v->banshee.io[io_dramInit0] = 0x00579d29; + v->banshee.io[io_dramInit0] |= 0x08000000; // Konami Viper expects 16MBit SGRAMs + v->banshee.io[io_dramInit1] = 0x00f02200; + v->banshee.io[io_tmuGbeInit] = 0x00000bfb; /* do a soft reset to reset everything else */ - soft_reset(this); + soft_reset(v); /* register for save states */ init_save_state(this); @@ -5118,12 +5191,12 @@ void voodoo_device::common_start_voodoo(UINT8 type) command -------------------------------------------------*/ -INT32 voodoo_device::fastfill(voodoo_device *vd) +static INT32 fastfill(voodoo_state *v) { - int sx = (vd->reg[clipLeftRight].u >> 16) & 0x3ff; - int ex = (vd->reg[clipLeftRight].u >> 0) & 0x3ff; - int sy = (vd->reg[clipLowYHighY].u >> 16) & 0x3ff; - int ey = (vd->reg[clipLowYHighY].u >> 0) & 0x3ff; + int sx = (v->reg[clipLeftRight].u >> 16) & 0x3ff; + int ex = (v->reg[clipLeftRight].u >> 0) & 0x3ff; + int sy = (v->reg[clipLowYHighY].u >> 16) & 0x3ff; + int ey = (v->reg[clipLowYHighY].u >> 0) & 0x3ff; poly_extent extents[64]; UINT16 dithermatrix[16]; UINT16 *drawbuf = nullptr; @@ -5131,22 +5204,22 @@ INT32 voodoo_device::fastfill(voodoo_device *vd) int extnum, x, y; /* if we're not clearing either, take no time */ - if (!FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u)) + if (!FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u) && !FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u)) return 0; /* are we clearing the RGB buffer? */ - if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u)) + if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u)) { /* determine the draw buffer */ - int destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u); + int destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u); switch (destbuf) { case 0: /* front buffer */ - drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); + drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); break; case 1: /* back buffer */ - drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); + drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); break; default: /* reserved */ @@ -5157,14 +5230,14 @@ INT32 voodoo_device::fastfill(voodoo_device *vd) for (y = 0; y < 4; y++) { DECLARE_DITHER_POINTERS_NO_DITHER_VAR; - COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(vd->reg[fbzMode].u, y); + COMPUTE_DITHER_POINTERS_NO_DITHER_VAR(v->reg[fbzMode].u, y); for (x = 0; x < 4; x++) { - int r = vd->reg[color1].rgb.r; - int g = vd->reg[color1].rgb.g; - int b = vd->reg[color1].rgb.b; + int r = v->reg[color1].rgb.r; + int g = v->reg[color1].rgb.g; + int b = v->reg[color1].rgb.b; - APPLY_DITHER(vd->reg[fbzMode].u, x, dither_lookup, r, g, b); + APPLY_DITHER(v->reg[fbzMode].u, x, dither_lookup, r, g, b); dithermatrix[y*4 + x] = (r << 11) | (g << 5) | b; } } @@ -5179,13 +5252,13 @@ INT32 voodoo_device::fastfill(voodoo_device *vd) /* iterate over blocks of extents */ for (y = sy; y < ey; y += ARRAY_LENGTH(extents)) { - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly); + poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly); int count = MIN(ey - y, ARRAY_LENGTH(extents)); - extra->device= vd; + extra->state = v; memcpy(extra->dither, dithermatrix, sizeof(extra->dither)); - pixels += poly_render_triangle_custom(vd->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents); + pixels += poly_render_triangle_custom(v->poly, drawbuf, global_cliprect, raster_fastfill, y, count, extents); } /* 2 pixels per clock */ @@ -5198,23 +5271,23 @@ INT32 voodoo_device::fastfill(voodoo_device *vd) command -------------------------------------------------*/ -INT32 voodoo_device::swapbuffer(voodoo_device* vd, UINT32 data) +static INT32 swapbuffer(voodoo_state *v, UINT32 data) { /* set the don't swap value for Voodoo 2 */ - vd->fbi.vblank_swap_pending = TRUE; - vd->fbi.vblank_swap = (data >> 1) & 0xff; - vd->fbi.vblank_dont_swap = (data >> 9) & 1; + v->fbi.vblank_swap_pending = TRUE; + v->fbi.vblank_swap = (data >> 1) & 0xff; + v->fbi.vblank_dont_swap = (data >> 9) & 1; /* if we're not syncing to the retrace, process the command immediately */ if (!(data & 1)) { - swap_buffers(vd); + swap_buffers(v); return 0; } /* determine how many cycles to wait; we deliberately overshoot here because */ /* the final count gets updated on the VBLANK */ - return (vd->fbi.vblank_swap + 1) * vd->freq / 30; + return (v->fbi.vblank_swap + 1) * v->freq / 30; } @@ -5223,7 +5296,7 @@ INT32 voodoo_device::swapbuffer(voodoo_device* vd, UINT32 data) command -------------------------------------------------*/ -INT32 voodoo_device::triangle(voodoo_device *vd) +static INT32 triangle(voodoo_state *v) { int texcount; UINT16 *drawbuf; @@ -5234,58 +5307,58 @@ INT32 voodoo_device::triangle(voodoo_device *vd) /* determine the number of TMUs involved */ texcount = 0; - if (!FBIINIT3_DISABLE_TMUS(vd->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(vd->reg[fbzColorPath].u)) + if (!FBIINIT3_DISABLE_TMUS(v->reg[fbiInit3].u) && FBZCP_TEXTURE_ENABLE(v->reg[fbzColorPath].u)) { texcount = 1; - if (vd->chipmask & 0x04) + if (v->chipmask & 0x04) texcount = 2; } /* perform subpixel adjustments */ - if (FBZCP_CCA_SUBPIXEL_ADJUST(vd->reg[fbzColorPath].u)) + if (FBZCP_CCA_SUBPIXEL_ADJUST(v->reg[fbzColorPath].u)) { - INT32 dx = 8 - (vd->fbi.ax & 15); - INT32 dy = 8 - (vd->fbi.ay & 15); + INT32 dx = 8 - (v->fbi.ax & 15); + INT32 dy = 8 - (v->fbi.ay & 15); /* adjust iterated R,G,B,A and W/Z */ - vd->fbi.startr += (dy * vd->fbi.drdy + dx * vd->fbi.drdx) >> 4; - vd->fbi.startg += (dy * vd->fbi.dgdy + dx * vd->fbi.dgdx) >> 4; - vd->fbi.startb += (dy * vd->fbi.dbdy + dx * vd->fbi.dbdx) >> 4; - vd->fbi.starta += (dy * vd->fbi.dady + dx * vd->fbi.dadx) >> 4; - vd->fbi.startw += (dy * vd->fbi.dwdy + dx * vd->fbi.dwdx) >> 4; - vd->fbi.startz += mul_32x32_shift(dy, vd->fbi.dzdy, 4) + mul_32x32_shift(dx, vd->fbi.dzdx, 4); + v->fbi.startr += (dy * v->fbi.drdy + dx * v->fbi.drdx) >> 4; + v->fbi.startg += (dy * v->fbi.dgdy + dx * v->fbi.dgdx) >> 4; + v->fbi.startb += (dy * v->fbi.dbdy + dx * v->fbi.dbdx) >> 4; + v->fbi.starta += (dy * v->fbi.dady + dx * v->fbi.dadx) >> 4; + v->fbi.startw += (dy * v->fbi.dwdy + dx * v->fbi.dwdx) >> 4; + v->fbi.startz += mul_32x32_shift(dy, v->fbi.dzdy, 4) + mul_32x32_shift(dx, v->fbi.dzdx, 4); /* adjust iterated W/S/T for TMU 0 */ if (texcount >= 1) { - vd->tmu[0].startw += (dy * vd->tmu[0].dwdy + dx * vd->tmu[0].dwdx) >> 4; - vd->tmu[0].starts += (dy * vd->tmu[0].dsdy + dx * vd->tmu[0].dsdx) >> 4; - vd->tmu[0].startt += (dy * vd->tmu[0].dtdy + dx * vd->tmu[0].dtdx) >> 4; + v->tmu[0].startw += (dy * v->tmu[0].dwdy + dx * v->tmu[0].dwdx) >> 4; + v->tmu[0].starts += (dy * v->tmu[0].dsdy + dx * v->tmu[0].dsdx) >> 4; + v->tmu[0].startt += (dy * v->tmu[0].dtdy + dx * v->tmu[0].dtdx) >> 4; /* adjust iterated W/S/T for TMU 1 */ if (texcount >= 2) { - vd->tmu[1].startw += (dy * vd->tmu[1].dwdy + dx * vd->tmu[1].dwdx) >> 4; - vd->tmu[1].starts += (dy * vd->tmu[1].dsdy + dx * vd->tmu[1].dsdx) >> 4; - vd->tmu[1].startt += (dy * vd->tmu[1].dtdy + dx * vd->tmu[1].dtdx) >> 4; + v->tmu[1].startw += (dy * v->tmu[1].dwdy + dx * v->tmu[1].dwdx) >> 4; + v->tmu[1].starts += (dy * v->tmu[1].dsdy + dx * v->tmu[1].dsdx) >> 4; + v->tmu[1].startt += (dy * v->tmu[1].dtdy + dx * v->tmu[1].dtdx) >> 4; } } } /* wait for any outstanding work to finish */ -// poly_wait(vd->poly, "triangle"); +// poly_wait(v->poly, "triangle"); /* determine the draw buffer */ - destbuf = (vd->vd_type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(vd->reg[fbzMode].u); + destbuf = (v->type >= TYPE_VOODOO_BANSHEE) ? 1 : FBZMODE_DRAW_BUFFER(v->reg[fbzMode].u); switch (destbuf) { case 0: /* front buffer */ - drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.frontbuf]); - vd->fbi.video_changed = TRUE; + drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.frontbuf]); + v->fbi.video_changed = TRUE; break; case 1: /* back buffer */ - drawbuf = (UINT16 *)(vd->fbi.ram + vd->fbi.rgboffs[vd->fbi.backbuf]); + drawbuf = (UINT16 *)(v->fbi.ram + v->fbi.rgboffs[v->fbi.backbuf]); break; default: /* reserved */ @@ -5293,18 +5366,18 @@ INT32 voodoo_device::triangle(voodoo_device *vd) } /* find a rasterizer that matches our current state */ - pixels = triangle_create_work_item(vd, drawbuf, texcount); + pixels = triangle_create_work_item(v, drawbuf, texcount); /* update stats */ - vd->reg[fbiTrianglesOut].u++; + v->reg[fbiTrianglesOut].u++; /* update stats */ - vd->stats.total_triangles++; + v->stats.total_triangles++; g_profiler.stop(); /* 1 pixel per clock, plus some setup time */ - if (LOG_REGISTERS) vd->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels); + if (LOG_REGISTERS) v->device->logerror("cycles = %d\n", TRIANGLE_SETUP_CLOCKS + pixels); return TRIANGLE_SETUP_CLOCKS + pixels; } @@ -5314,28 +5387,28 @@ INT32 voodoo_device::triangle(voodoo_device *vd) command -------------------------------------------------*/ -INT32 voodoo_device::begin_triangle(voodoo_device *vd) +static INT32 begin_triangle(voodoo_state *v) { - setup_vertex *sv = &vd->fbi.svert[2]; + setup_vertex *sv = &v->fbi.svert[2]; /* extract all the data from registers */ - sv->x = vd->reg[sVx].f; - sv->y = vd->reg[sVy].f; - sv->wb = vd->reg[sWb].f; - sv->w0 = vd->reg[sWtmu0].f; - sv->s0 = vd->reg[sS_W0].f; - sv->t0 = vd->reg[sT_W0].f; - sv->w1 = vd->reg[sWtmu1].f; - sv->s1 = vd->reg[sS_Wtmu1].f; - sv->t1 = vd->reg[sT_Wtmu1].f; - sv->a = vd->reg[sAlpha].f; - sv->r = vd->reg[sRed].f; - sv->g = vd->reg[sGreen].f; - sv->b = vd->reg[sBlue].f; + sv->x = v->reg[sVx].f; + sv->y = v->reg[sVy].f; + sv->wb = v->reg[sWb].f; + sv->w0 = v->reg[sWtmu0].f; + sv->s0 = v->reg[sS_W0].f; + sv->t0 = v->reg[sT_W0].f; + sv->w1 = v->reg[sWtmu1].f; + sv->s1 = v->reg[sS_Wtmu1].f; + sv->t1 = v->reg[sT_Wtmu1].f; + sv->a = v->reg[sAlpha].f; + sv->r = v->reg[sRed].f; + sv->g = v->reg[sGreen].f; + sv->b = v->reg[sBlue].f; /* spread it across all three verts and reset the count */ - vd->fbi.svert[0] = vd->fbi.svert[1] = vd->fbi.svert[2]; - vd->fbi.sverts = 1; + v->fbi.svert[0] = v->fbi.svert[1] = v->fbi.svert[2]; + v->fbi.sverts = 1; return 0; } @@ -5346,36 +5419,36 @@ INT32 voodoo_device::begin_triangle(voodoo_device *vd) command -------------------------------------------------*/ -INT32 voodoo_device::draw_triangle(voodoo_device *vd) +static INT32 draw_triangle(voodoo_state *v) { - setup_vertex *sv = &vd->fbi.svert[2]; + setup_vertex *sv = &v->fbi.svert[2]; int cycles = 0; /* for strip mode, shuffle vertex 1 down to 0 */ - if (!(vd->reg[sSetupMode].u & (1 << 16))) - vd->fbi.svert[0] = vd->fbi.svert[1]; + if (!(v->reg[sSetupMode].u & (1 << 16))) + v->fbi.svert[0] = v->fbi.svert[1]; /* copy 2 down to 1 regardless */ - vd->fbi.svert[1] = vd->fbi.svert[2]; + v->fbi.svert[1] = v->fbi.svert[2]; /* extract all the data from registers */ - sv->x = vd->reg[sVx].f; - sv->y = vd->reg[sVy].f; - sv->wb = vd->reg[sWb].f; - sv->w0 = vd->reg[sWtmu0].f; - sv->s0 = vd->reg[sS_W0].f; - sv->t0 = vd->reg[sT_W0].f; - sv->w1 = vd->reg[sWtmu1].f; - sv->s1 = vd->reg[sS_Wtmu1].f; - sv->t1 = vd->reg[sT_Wtmu1].f; - sv->a = vd->reg[sAlpha].f; - sv->r = vd->reg[sRed].f; - sv->g = vd->reg[sGreen].f; - sv->b = vd->reg[sBlue].f; + sv->x = v->reg[sVx].f; + sv->y = v->reg[sVy].f; + sv->wb = v->reg[sWb].f; + sv->w0 = v->reg[sWtmu0].f; + sv->s0 = v->reg[sS_W0].f; + sv->t0 = v->reg[sT_W0].f; + sv->w1 = v->reg[sWtmu1].f; + sv->s1 = v->reg[sS_Wtmu1].f; + sv->t1 = v->reg[sT_Wtmu1].f; + sv->a = v->reg[sAlpha].f; + sv->r = v->reg[sRed].f; + sv->g = v->reg[sGreen].f; + sv->b = v->reg[sBlue].f; /* if we have enough verts, go ahead and draw */ - if (++vd->fbi.sverts >= 3) - cycles = setup_and_draw_triangle(vd); + if (++v->fbi.sverts >= 3) + cycles = setup_and_draw_triangle(v); return cycles; } @@ -5391,32 +5464,32 @@ INT32 voodoo_device::draw_triangle(voodoo_device *vd) parameters and render the triangle -------------------------------------------------*/ -INT32 voodoo_device::setup_and_draw_triangle(voodoo_device *vd) +static INT32 setup_and_draw_triangle(voodoo_state *v) { float dx1, dy1, dx2, dy2; float divisor, tdiv; /* grab the X/Ys at least */ - vd->fbi.ax = (INT16)(vd->fbi.svert[0].x * 16.0f); - vd->fbi.ay = (INT16)(vd->fbi.svert[0].y * 16.0f); - vd->fbi.bx = (INT16)(vd->fbi.svert[1].x * 16.0f); - vd->fbi.by = (INT16)(vd->fbi.svert[1].y * 16.0f); - vd->fbi.cx = (INT16)(vd->fbi.svert[2].x * 16.0f); - vd->fbi.cy = (INT16)(vd->fbi.svert[2].y * 16.0f); + v->fbi.ax = (INT16)(v->fbi.svert[0].x * 16.0f); + v->fbi.ay = (INT16)(v->fbi.svert[0].y * 16.0f); + v->fbi.bx = (INT16)(v->fbi.svert[1].x * 16.0f); + v->fbi.by = (INT16)(v->fbi.svert[1].y * 16.0f); + v->fbi.cx = (INT16)(v->fbi.svert[2].x * 16.0f); + v->fbi.cy = (INT16)(v->fbi.svert[2].y * 16.0f); /* compute the divisor */ - divisor = 1.0f / ((vd->fbi.svert[0].x - vd->fbi.svert[1].x) * (vd->fbi.svert[0].y - vd->fbi.svert[2].y) - - (vd->fbi.svert[0].x - vd->fbi.svert[2].x) * (vd->fbi.svert[0].y - vd->fbi.svert[1].y)); + divisor = 1.0f / ((v->fbi.svert[0].x - v->fbi.svert[1].x) * (v->fbi.svert[0].y - v->fbi.svert[2].y) - + (v->fbi.svert[0].x - v->fbi.svert[2].x) * (v->fbi.svert[0].y - v->fbi.svert[1].y)); /* backface culling */ - if (vd->reg[sSetupMode].u & 0x20000) + if (v->reg[sSetupMode].u & 0x20000) { - int culling_sign = (vd->reg[sSetupMode].u >> 18) & 1; + int culling_sign = (v->reg[sSetupMode].u >> 18) & 1; int divisor_sign = (divisor < 0); /* if doing strips and ping pong is enabled, apply the ping pong */ - if ((vd->reg[sSetupMode].u & 0x90000) == 0x00000) - culling_sign ^= (vd->fbi.sverts - 3) & 1; + if ((v->reg[sSetupMode].u & 0x90000) == 0x00000) + culling_sign ^= (v->fbi.sverts - 3) & 1; /* if our sign matches the culling sign, we're done for */ if (divisor_sign == culling_sign) @@ -5424,92 +5497,92 @@ INT32 voodoo_device::setup_and_draw_triangle(voodoo_device *vd) } /* compute the dx/dy values */ - dx1 = vd->fbi.svert[0].y - vd->fbi.svert[2].y; - dx2 = vd->fbi.svert[0].y - vd->fbi.svert[1].y; - dy1 = vd->fbi.svert[0].x - vd->fbi.svert[1].x; - dy2 = vd->fbi.svert[0].x - vd->fbi.svert[2].x; + dx1 = v->fbi.svert[0].y - v->fbi.svert[2].y; + dx2 = v->fbi.svert[0].y - v->fbi.svert[1].y; + dy1 = v->fbi.svert[0].x - v->fbi.svert[1].x; + dy2 = v->fbi.svert[0].x - v->fbi.svert[2].x; /* set up R,G,B */ tdiv = divisor * 4096.0f; - if (vd->reg[sSetupMode].u & (1 << 0)) + if (v->reg[sSetupMode].u & (1 << 0)) { - vd->fbi.startr = (INT32)(vd->fbi.svert[0].r * 4096.0f); - vd->fbi.drdx = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dx1 - (vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dx2) * tdiv); - vd->fbi.drdy = (INT32)(((vd->fbi.svert[0].r - vd->fbi.svert[2].r) * dy1 - (vd->fbi.svert[0].r - vd->fbi.svert[1].r) * dy2) * tdiv); - vd->fbi.startg = (INT32)(vd->fbi.svert[0].g * 4096.0f); - vd->fbi.dgdx = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dx1 - (vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dx2) * tdiv); - vd->fbi.dgdy = (INT32)(((vd->fbi.svert[0].g - vd->fbi.svert[2].g) * dy1 - (vd->fbi.svert[0].g - vd->fbi.svert[1].g) * dy2) * tdiv); - vd->fbi.startb = (INT32)(vd->fbi.svert[0].b * 4096.0f); - vd->fbi.dbdx = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dx1 - (vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dx2) * tdiv); - vd->fbi.dbdy = (INT32)(((vd->fbi.svert[0].b - vd->fbi.svert[2].b) * dy1 - (vd->fbi.svert[0].b - vd->fbi.svert[1].b) * dy2) * tdiv); + v->fbi.startr = (INT32)(v->fbi.svert[0].r * 4096.0f); + v->fbi.drdx = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[1].r) * dx1 - (v->fbi.svert[0].r - v->fbi.svert[2].r) * dx2) * tdiv); + v->fbi.drdy = (INT32)(((v->fbi.svert[0].r - v->fbi.svert[2].r) * dy1 - (v->fbi.svert[0].r - v->fbi.svert[1].r) * dy2) * tdiv); + v->fbi.startg = (INT32)(v->fbi.svert[0].g * 4096.0f); + v->fbi.dgdx = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[1].g) * dx1 - (v->fbi.svert[0].g - v->fbi.svert[2].g) * dx2) * tdiv); + v->fbi.dgdy = (INT32)(((v->fbi.svert[0].g - v->fbi.svert[2].g) * dy1 - (v->fbi.svert[0].g - v->fbi.svert[1].g) * dy2) * tdiv); + v->fbi.startb = (INT32)(v->fbi.svert[0].b * 4096.0f); + v->fbi.dbdx = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[1].b) * dx1 - (v->fbi.svert[0].b - v->fbi.svert[2].b) * dx2) * tdiv); + v->fbi.dbdy = (INT32)(((v->fbi.svert[0].b - v->fbi.svert[2].b) * dy1 - (v->fbi.svert[0].b - v->fbi.svert[1].b) * dy2) * tdiv); } /* set up alpha */ - if (vd->reg[sSetupMode].u & (1 << 1)) + if (v->reg[sSetupMode].u & (1 << 1)) { - vd->fbi.starta = (INT32)(vd->fbi.svert[0].a * 4096.0f); - vd->fbi.dadx = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dx1 - (vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dx2) * tdiv); - vd->fbi.dady = (INT32)(((vd->fbi.svert[0].a - vd->fbi.svert[2].a) * dy1 - (vd->fbi.svert[0].a - vd->fbi.svert[1].a) * dy2) * tdiv); + v->fbi.starta = (INT32)(v->fbi.svert[0].a * 4096.0f); + v->fbi.dadx = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[1].a) * dx1 - (v->fbi.svert[0].a - v->fbi.svert[2].a) * dx2) * tdiv); + v->fbi.dady = (INT32)(((v->fbi.svert[0].a - v->fbi.svert[2].a) * dy1 - (v->fbi.svert[0].a - v->fbi.svert[1].a) * dy2) * tdiv); } /* set up Z */ - if (vd->reg[sSetupMode].u & (1 << 2)) + if (v->reg[sSetupMode].u & (1 << 2)) { - vd->fbi.startz = (INT32)(vd->fbi.svert[0].z * 4096.0f); - vd->fbi.dzdx = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dx1 - (vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dx2) * tdiv); - vd->fbi.dzdy = (INT32)(((vd->fbi.svert[0].z - vd->fbi.svert[2].z) * dy1 - (vd->fbi.svert[0].z - vd->fbi.svert[1].z) * dy2) * tdiv); + v->fbi.startz = (INT32)(v->fbi.svert[0].z * 4096.0f); + v->fbi.dzdx = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[1].z) * dx1 - (v->fbi.svert[0].z - v->fbi.svert[2].z) * dx2) * tdiv); + v->fbi.dzdy = (INT32)(((v->fbi.svert[0].z - v->fbi.svert[2].z) * dy1 - (v->fbi.svert[0].z - v->fbi.svert[1].z) * dy2) * tdiv); } /* set up Wb */ tdiv = divisor * 65536.0f * 65536.0f; - if (vd->reg[sSetupMode].u & (1 << 3)) + if (v->reg[sSetupMode].u & (1 << 3)) { - vd->fbi.startw = vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].wb * 65536.0f * 65536.0f); - vd->fbi.dwdx = vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dx1 - (vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dx2) * tdiv; - vd->fbi.dwdy = vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].wb - vd->fbi.svert[2].wb) * dy1 - (vd->fbi.svert[0].wb - vd->fbi.svert[1].wb) * dy2) * tdiv; + v->fbi.startw = v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].wb * 65536.0f * 65536.0f); + v->fbi.dwdx = v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dx1 - (v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dx2) * tdiv; + v->fbi.dwdy = v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].wb - v->fbi.svert[2].wb) * dy1 - (v->fbi.svert[0].wb - v->fbi.svert[1].wb) * dy2) * tdiv; } /* set up W0 */ - if (vd->reg[sSetupMode].u & (1 << 4)) + if (v->reg[sSetupMode].u & (1 << 4)) { - vd->tmu[0].startw = vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w0 * 65536.0f * 65536.0f); - vd->tmu[0].dwdx = vd->tmu[1].dwdx = ((vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dx1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dx2) * tdiv; - vd->tmu[0].dwdy = vd->tmu[1].dwdy = ((vd->fbi.svert[0].w0 - vd->fbi.svert[2].w0) * dy1 - (vd->fbi.svert[0].w0 - vd->fbi.svert[1].w0) * dy2) * tdiv; + v->tmu[0].startw = v->tmu[1].startw = (INT64)(v->fbi.svert[0].w0 * 65536.0f * 65536.0f); + v->tmu[0].dwdx = v->tmu[1].dwdx = ((v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dx1 - (v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dx2) * tdiv; + v->tmu[0].dwdy = v->tmu[1].dwdy = ((v->fbi.svert[0].w0 - v->fbi.svert[2].w0) * dy1 - (v->fbi.svert[0].w0 - v->fbi.svert[1].w0) * dy2) * tdiv; } /* set up S0,T0 */ - if (vd->reg[sSetupMode].u & (1 << 5)) + if (v->reg[sSetupMode].u & (1 << 5)) { - vd->tmu[0].starts = vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s0 * 65536.0f * 65536.0f); - vd->tmu[0].dsdx = vd->tmu[1].dsdx = ((vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dx1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dx2) * tdiv; - vd->tmu[0].dsdy = vd->tmu[1].dsdy = ((vd->fbi.svert[0].s0 - vd->fbi.svert[2].s0) * dy1 - (vd->fbi.svert[0].s0 - vd->fbi.svert[1].s0) * dy2) * tdiv; - vd->tmu[0].startt = vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t0 * 65536.0f * 65536.0f); - vd->tmu[0].dtdx = vd->tmu[1].dtdx = ((vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dx1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dx2) * tdiv; - vd->tmu[0].dtdy = vd->tmu[1].dtdy = ((vd->fbi.svert[0].t0 - vd->fbi.svert[2].t0) * dy1 - (vd->fbi.svert[0].t0 - vd->fbi.svert[1].t0) * dy2) * tdiv; + v->tmu[0].starts = v->tmu[1].starts = (INT64)(v->fbi.svert[0].s0 * 65536.0f * 65536.0f); + v->tmu[0].dsdx = v->tmu[1].dsdx = ((v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dx1 - (v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dx2) * tdiv; + v->tmu[0].dsdy = v->tmu[1].dsdy = ((v->fbi.svert[0].s0 - v->fbi.svert[2].s0) * dy1 - (v->fbi.svert[0].s0 - v->fbi.svert[1].s0) * dy2) * tdiv; + v->tmu[0].startt = v->tmu[1].startt = (INT64)(v->fbi.svert[0].t0 * 65536.0f * 65536.0f); + v->tmu[0].dtdx = v->tmu[1].dtdx = ((v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dx1 - (v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dx2) * tdiv; + v->tmu[0].dtdy = v->tmu[1].dtdy = ((v->fbi.svert[0].t0 - v->fbi.svert[2].t0) * dy1 - (v->fbi.svert[0].t0 - v->fbi.svert[1].t0) * dy2) * tdiv; } /* set up W1 */ - if (vd->reg[sSetupMode].u & (1 << 6)) + if (v->reg[sSetupMode].u & (1 << 6)) { - vd->tmu[1].startw = (INT64)(vd->fbi.svert[0].w1 * 65536.0f * 65536.0f); - vd->tmu[1].dwdx = ((vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dx1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dx2) * tdiv; - vd->tmu[1].dwdy = ((vd->fbi.svert[0].w1 - vd->fbi.svert[2].w1) * dy1 - (vd->fbi.svert[0].w1 - vd->fbi.svert[1].w1) * dy2) * tdiv; + v->tmu[1].startw = (INT64)(v->fbi.svert[0].w1 * 65536.0f * 65536.0f); + v->tmu[1].dwdx = ((v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dx1 - (v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dx2) * tdiv; + v->tmu[1].dwdy = ((v->fbi.svert[0].w1 - v->fbi.svert[2].w1) * dy1 - (v->fbi.svert[0].w1 - v->fbi.svert[1].w1) * dy2) * tdiv; } /* set up S1,T1 */ - if (vd->reg[sSetupMode].u & (1 << 7)) + if (v->reg[sSetupMode].u & (1 << 7)) { - vd->tmu[1].starts = (INT64)(vd->fbi.svert[0].s1 * 65536.0f * 65536.0f); - vd->tmu[1].dsdx = ((vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dx1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dx2) * tdiv; - vd->tmu[1].dsdy = ((vd->fbi.svert[0].s1 - vd->fbi.svert[2].s1) * dy1 - (vd->fbi.svert[0].s1 - vd->fbi.svert[1].s1) * dy2) * tdiv; - vd->tmu[1].startt = (INT64)(vd->fbi.svert[0].t1 * 65536.0f * 65536.0f); - vd->tmu[1].dtdx = ((vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dx1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dx2) * tdiv; - vd->tmu[1].dtdy = ((vd->fbi.svert[0].t1 - vd->fbi.svert[2].t1) * dy1 - (vd->fbi.svert[0].t1 - vd->fbi.svert[1].t1) * dy2) * tdiv; + v->tmu[1].starts = (INT64)(v->fbi.svert[0].s1 * 65536.0f * 65536.0f); + v->tmu[1].dsdx = ((v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dx1 - (v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dx2) * tdiv; + v->tmu[1].dsdy = ((v->fbi.svert[0].s1 - v->fbi.svert[2].s1) * dy1 - (v->fbi.svert[0].s1 - v->fbi.svert[1].s1) * dy2) * tdiv; + v->tmu[1].startt = (INT64)(v->fbi.svert[0].t1 * 65536.0f * 65536.0f); + v->tmu[1].dtdx = ((v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dx1 - (v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dx2) * tdiv; + v->tmu[1].dtdy = ((v->fbi.svert[0].t1 - v->fbi.svert[2].t1) * dy1 - (v->fbi.svert[0].t1 - v->fbi.svert[1].t1) * dy2) * tdiv; } /* draw the triangle */ - vd->fbi.cheating_allowed = 1; - return triangle(vd); + v->fbi.cheating_allowed = 1; + return triangle(v); } @@ -5518,82 +5591,81 @@ INT32 voodoo_device::setup_and_draw_triangle(voodoo_device *vd) setup and create the work item -------------------------------------------------*/ -INT32 voodoo_device::triangle_create_work_item(voodoo_device* vd, UINT16 *drawbuf, int texcount) +static INT32 triangle_create_work_item(voodoo_state *v, UINT16 *drawbuf, int texcount) { - poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(vd->poly); - - raster_info *info = find_rasterizer(vd, texcount); + poly_extra_data *extra = (poly_extra_data *)poly_get_extra_data(v->poly); + raster_info *info = find_rasterizer(v, texcount); poly_vertex vert[3]; /* fill in the vertex data */ - vert[0].x = (float)vd->fbi.ax * (1.0f / 16.0f); - vert[0].y = (float)vd->fbi.ay * (1.0f / 16.0f); - vert[1].x = (float)vd->fbi.bx * (1.0f / 16.0f); - vert[1].y = (float)vd->fbi.by * (1.0f / 16.0f); - vert[2].x = (float)vd->fbi.cx * (1.0f / 16.0f); - vert[2].y = (float)vd->fbi.cy * (1.0f / 16.0f); + vert[0].x = (float)v->fbi.ax * (1.0f / 16.0f); + vert[0].y = (float)v->fbi.ay * (1.0f / 16.0f); + vert[1].x = (float)v->fbi.bx * (1.0f / 16.0f); + vert[1].y = (float)v->fbi.by * (1.0f / 16.0f); + vert[2].x = (float)v->fbi.cx * (1.0f / 16.0f); + vert[2].y = (float)v->fbi.cy * (1.0f / 16.0f); /* fill in the extra data */ - extra->device = vd; + extra->state = v; extra->info = info; /* fill in triangle parameters */ - extra->ax = vd->fbi.ax; - extra->ay = vd->fbi.ay; - extra->startr = vd->fbi.startr; - extra->startg = vd->fbi.startg; - extra->startb = vd->fbi.startb; - extra->starta = vd->fbi.starta; - extra->startz = vd->fbi.startz; - extra->startw = vd->fbi.startw; - extra->drdx = vd->fbi.drdx; - extra->dgdx = vd->fbi.dgdx; - extra->dbdx = vd->fbi.dbdx; - extra->dadx = vd->fbi.dadx; - extra->dzdx = vd->fbi.dzdx; - extra->dwdx = vd->fbi.dwdx; - extra->drdy = vd->fbi.drdy; - extra->dgdy = vd->fbi.dgdy; - extra->dbdy = vd->fbi.dbdy; - extra->dady = vd->fbi.dady; - extra->dzdy = vd->fbi.dzdy; - extra->dwdy = vd->fbi.dwdy; + extra->ax = v->fbi.ax; + extra->ay = v->fbi.ay; + extra->startr = v->fbi.startr; + extra->startg = v->fbi.startg; + extra->startb = v->fbi.startb; + extra->starta = v->fbi.starta; + extra->startz = v->fbi.startz; + extra->startw = v->fbi.startw; + extra->drdx = v->fbi.drdx; + extra->dgdx = v->fbi.dgdx; + extra->dbdx = v->fbi.dbdx; + extra->dadx = v->fbi.dadx; + extra->dzdx = v->fbi.dzdx; + extra->dwdx = v->fbi.dwdx; + extra->drdy = v->fbi.drdy; + extra->dgdy = v->fbi.dgdy; + extra->dbdy = v->fbi.dbdy; + extra->dady = v->fbi.dady; + extra->dzdy = v->fbi.dzdy; + extra->dwdy = v->fbi.dwdy; /* fill in texture 0 parameters */ if (texcount > 0) { - extra->starts0 = vd->tmu[0].starts; - extra->startt0 = vd->tmu[0].startt; - extra->startw0 = vd->tmu[0].startw; - extra->ds0dx = vd->tmu[0].dsdx; - extra->dt0dx = vd->tmu[0].dtdx; - extra->dw0dx = vd->tmu[0].dwdx; - extra->ds0dy = vd->tmu[0].dsdy; - extra->dt0dy = vd->tmu[0].dtdy; - extra->dw0dy = vd->tmu[0].dwdy; - extra->lodbase0 = prepare_tmu(&vd->tmu[0]); - vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[0].reg[textureMode].u)]++; + extra->starts0 = v->tmu[0].starts; + extra->startt0 = v->tmu[0].startt; + extra->startw0 = v->tmu[0].startw; + extra->ds0dx = v->tmu[0].dsdx; + extra->dt0dx = v->tmu[0].dtdx; + extra->dw0dx = v->tmu[0].dwdx; + extra->ds0dy = v->tmu[0].dsdy; + extra->dt0dy = v->tmu[0].dtdy; + extra->dw0dy = v->tmu[0].dwdy; + extra->lodbase0 = prepare_tmu(&v->tmu[0]); + v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[0].reg[textureMode].u)]++; /* fill in texture 1 parameters */ if (texcount > 1) { - extra->starts1 = vd->tmu[1].starts; - extra->startt1 = vd->tmu[1].startt; - extra->startw1 = vd->tmu[1].startw; - extra->ds1dx = vd->tmu[1].dsdx; - extra->dt1dx = vd->tmu[1].dtdx; - extra->dw1dx = vd->tmu[1].dwdx; - extra->ds1dy = vd->tmu[1].dsdy; - extra->dt1dy = vd->tmu[1].dtdy; - extra->dw1dy = vd->tmu[1].dwdy; - extra->lodbase1 = prepare_tmu(&vd->tmu[1]); - vd->stats.texture_mode[TEXMODE_FORMAT(vd->tmu[1].reg[textureMode].u)]++; + extra->starts1 = v->tmu[1].starts; + extra->startt1 = v->tmu[1].startt; + extra->startw1 = v->tmu[1].startw; + extra->ds1dx = v->tmu[1].dsdx; + extra->dt1dx = v->tmu[1].dtdx; + extra->dw1dx = v->tmu[1].dwdx; + extra->ds1dy = v->tmu[1].dsdy; + extra->dt1dy = v->tmu[1].dtdy; + extra->dw1dy = v->tmu[1].dwdy; + extra->lodbase1 = prepare_tmu(&v->tmu[1]); + v->stats.texture_mode[TEXMODE_FORMAT(v->tmu[1].reg[textureMode].u)]++; } } /* farm the rasterization out to other threads */ info->polys++; - return poly_render_triangle(vd->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]); + return poly_render_triangle(v->poly, drawbuf, global_cliprect, info->callback, 0, &vert[0], &vert[1], &vert[2]); } @@ -5607,12 +5679,12 @@ INT32 voodoo_device::triangle_create_work_item(voodoo_device* vd, UINT16 *drawbu hash table -------------------------------------------------*/ -raster_info *voodoo_device::add_rasterizer(voodoo_device *vd, const raster_info *cinfo) +static raster_info *add_rasterizer(voodoo_state *v, const raster_info *cinfo) { - raster_info *info = &vd->rasterizer[vd->next_rasterizer++]; + raster_info *info = &v->rasterizer[v->next_rasterizer++]; int hash = compute_raster_hash(cinfo); - assert_always(vd->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!"); + assert_always(v->next_rasterizer <= MAX_RASTERIZERS, "Out of space for new rasterizers!"); /* make a copy of the info */ *info = *cinfo; @@ -5623,8 +5695,8 @@ raster_info *voodoo_device::add_rasterizer(voodoo_device *vd, const raster_info info->hash = hash; /* hook us into the hash table */ - info->next = vd->raster_hash[hash]; - vd->raster_hash[hash] = info; + info->next = v->raster_hash[hash]; + v->raster_hash[hash] = info; if (LOG_RASTERIZERS) printf("Adding rasterizer @ %p : cp=%08X am=%08X %08X fbzM=%08X tm0=%08X tm1=%08X (hash=%d)\n", @@ -5642,25 +5714,25 @@ raster_info *voodoo_device::add_rasterizer(voodoo_device *vd, const raster_info it, creating a new one if necessary -------------------------------------------------*/ -raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount) +static raster_info *find_rasterizer(voodoo_state *v, int texcount) { raster_info *info, *prev = nullptr; raster_info curinfo; int hash; /* build an info struct with all the parameters */ - curinfo.eff_color_path = normalize_color_path(vd->reg[fbzColorPath].u); - curinfo.eff_alpha_mode = normalize_alpha_mode(vd->reg[alphaMode].u); - curinfo.eff_fog_mode = normalize_fog_mode(vd->reg[fogMode].u); - curinfo.eff_fbz_mode = normalize_fbz_mode(vd->reg[fbzMode].u); - curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(vd->tmu[0].reg[textureMode].u) : 0xffffffff; - curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(vd->tmu[1].reg[textureMode].u) : 0xffffffff; + curinfo.eff_color_path = normalize_color_path(v->reg[fbzColorPath].u); + curinfo.eff_alpha_mode = normalize_alpha_mode(v->reg[alphaMode].u); + curinfo.eff_fog_mode = normalize_fog_mode(v->reg[fogMode].u); + curinfo.eff_fbz_mode = normalize_fbz_mode(v->reg[fbzMode].u); + curinfo.eff_tex_mode_0 = (texcount >= 1) ? normalize_tex_mode(v->tmu[0].reg[textureMode].u) : 0xffffffff; + curinfo.eff_tex_mode_1 = (texcount >= 2) ? normalize_tex_mode(v->tmu[1].reg[textureMode].u) : 0xffffffff; /* compute the hash */ hash = compute_raster_hash(&curinfo); /* find the appropriate hash entry */ - for (info = vd->raster_hash[hash]; info; prev = info, info = info->next) + for (info = v->raster_hash[hash]; info; prev = info, info = info->next) if (info->eff_color_path == curinfo.eff_color_path && info->eff_alpha_mode == curinfo.eff_alpha_mode && info->eff_fog_mode == curinfo.eff_fog_mode && @@ -5672,8 +5744,8 @@ raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount) if (prev) { prev->next = info->next; - info->next = vd->raster_hash[hash]; - vd->raster_hash[hash] = info; + info->next = v->raster_hash[hash]; + v->raster_hash[hash] = info; } /* return the result */ @@ -5689,7 +5761,7 @@ raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount) curinfo.next = nullptr; curinfo.hash = hash; - return add_rasterizer(vd, &curinfo); + return add_rasterizer(v, &curinfo); } @@ -5698,7 +5770,7 @@ raster_info *voodoo_device::find_rasterizer(voodoo_device *vd, int texcount) the current rasterizer usage patterns -------------------------------------------------*/ -void voodoo_device::dump_rasterizer_stats(voodoo_device *vd) +static void dump_rasterizer_stats(voodoo_state *v) { static UINT8 display_index; raster_info *cur, *best; @@ -5714,7 +5786,7 @@ void voodoo_device::dump_rasterizer_stats(voodoo_device *vd) /* find the highest entry */ for (hash = 0; hash < RASTER_HASH_SIZE; hash++) - for (cur = vd->raster_hash[hash]; cur; cur = cur->next) + for (cur = v->raster_hash[hash]; cur; cur = cur->next) if (cur->display != display_index && (best == nullptr || cur->hits > best->hits)) best = cur; @@ -5750,10 +5822,12 @@ voodoo_device::voodoo_device(const machine_config &mconfig, device_type type, co m_vblank(*this), m_stall(*this) { + m_token = global_alloc_clear<voodoo_state>(); } voodoo_device::~voodoo_device() { + global_free(m_token); } //------------------------------------------------- @@ -5772,7 +5846,8 @@ void voodoo_device::device_config_complete() void voodoo_device::device_reset() { - soft_reset(this); + voodoo_state *v = get_safe_token(this); + soft_reset(v); } //------------------------------------------------- @@ -5781,9 +5856,11 @@ void voodoo_device::device_reset() void voodoo_device::device_stop() { + voodoo_state *v = get_safe_token(this); + /* release the work queue, ensuring all work is finished */ - if (poly != nullptr) - poly_free(poly); + if (v->poly != nullptr) + poly_free(v->poly); } @@ -5870,26 +5947,26 @@ void voodoo_3_device::device_start() implementation of the 'fastfill' command -------------------------------------------------*/ -void voodoo_device::raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) +static void raster_fastfill(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid) { const poly_extra_data *extra = (const poly_extra_data *)extradata; - voodoo_device* vd = extra->device; - stats_block *stats = &vd->thread_stats[threadid]; + voodoo_state *v = extra->state; + stats_block *stats = &v->thread_stats[threadid]; INT32 startx = extent->startx; INT32 stopx = extent->stopx; int scry, x; /* determine the screen Y */ scry = y; - if (FBZMODE_Y_ORIGIN(vd->reg[fbzMode].u)) - scry = (vd->fbi.yorigin - y) & 0x3ff; + if (FBZMODE_Y_ORIGIN(v->reg[fbzMode].u)) + scry = (v->fbi.yorigin - y) & 0x3ff; /* fill this RGB row */ - if (FBZMODE_RGB_BUFFER_MASK(vd->reg[fbzMode].u)) + if (FBZMODE_RGB_BUFFER_MASK(v->reg[fbzMode].u)) { const UINT16 *ditherow = &extra->dither[(y & 3) * 4]; UINT64 expanded = *(UINT64 *)ditherow; - UINT16 *dest = (UINT16 *)destbase + scry * vd->fbi.rowpixels; + UINT16 *dest = (UINT16 *)destbase + scry * v->fbi.rowpixels; for (x = startx; x < stopx && (x & 3) != 0; x++) dest[x] = ditherow[x & 3]; @@ -5901,11 +5978,11 @@ void voodoo_device::raster_fastfill(void *destbase, INT32 y, const poly_extent * } /* fill this dest buffer row */ - if (FBZMODE_AUX_BUFFER_MASK(vd->reg[fbzMode].u) && vd->fbi.auxoffs != ~0) + if (FBZMODE_AUX_BUFFER_MASK(v->reg[fbzMode].u) && v->fbi.auxoffs != ~0) { - UINT16 color = vd->reg[zaColor].u; + UINT16 color = v->reg[zaColor].u; UINT64 expanded = ((UINT64)color << 48) | ((UINT64)color << 32) | (color << 16) | color; - UINT16 *dest = (UINT16 *)(vd->fbi.ram + vd->fbi.auxoffs) + scry * vd->fbi.rowpixels; + UINT16 *dest = (UINT16 *)(v->fbi.ram + v->fbi.auxoffs) + scry * v->fbi.rowpixels; for (x = startx; x < stopx && (x & 3) != 0; x++) dest[x] = color; @@ -5921,21 +5998,21 @@ void voodoo_device::raster_fastfill(void *destbase, INT32 y, const poly_extent * generic_0tmu - generic rasterizer for 0 TMUs -------------------------------------------------*/ -RASTERIZER(generic_0tmu, 0, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, - vd->reg[fogMode].u, 0, 0) +RASTERIZER(generic_0tmu, 0, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, + v->reg[fogMode].u, 0, 0) /*------------------------------------------------- generic_1tmu - generic rasterizer for 1 TMU -------------------------------------------------*/ -RASTERIZER(generic_1tmu, 1, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, - vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, 0) +RASTERIZER(generic_1tmu, 1, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, + v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, 0) /*------------------------------------------------- generic_2tmu - generic rasterizer for 2 TMUs -------------------------------------------------*/ -RASTERIZER(generic_2tmu, 2, vd->reg[fbzColorPath].u, vd->reg[fbzMode].u, vd->reg[alphaMode].u, - vd->reg[fogMode].u, vd->tmu[0].reg[textureMode].u, vd->tmu[1].reg[textureMode].u) +RASTERIZER(generic_2tmu, 2, v->reg[fbzColorPath].u, v->reg[fbzMode].u, v->reg[alphaMode].u, + v->reg[fogMode].u, v->tmu[0].reg[textureMode].u, v->tmu[1].reg[textureMode].u) diff --git a/src/devices/video/voodoo.h b/src/devices/video/voodoo.h index 1dc1a4a59ec..3d92f17f86a 100644 --- a/src/devices/video/voodoo.h +++ b/src/devices/video/voodoo.h @@ -11,1694 +11,9 @@ #ifndef __VOODOO_H__ #define __VOODOO_H__ -#include "video/polylgcy.h" - #pragma once -/************************************* - * - * Misc. constants - * - *************************************/ - -/* enumeration describing reasons we might be stalled */ -enum -{ - NOT_STALLED = 0, - STALLED_UNTIL_FIFO_LWM, - STALLED_UNTIL_FIFO_EMPTY -}; - - - -// Use old table lookup versus straight double divide -#define USE_FAST_RECIP 0 - -/* maximum number of TMUs */ -#define MAX_TMU 2 - -/* accumulate operations less than this number of clocks */ -#define ACCUMULATE_THRESHOLD 0 - -/* number of clocks to set up a triangle (just a guess) */ -#define TRIANGLE_SETUP_CLOCKS 100 - -/* maximum number of rasterizers */ -#define MAX_RASTERIZERS 1024 - -/* size of the rasterizer hash table */ -#define RASTER_HASH_SIZE 97 - -/* flags for LFB writes */ -#define LFB_RGB_PRESENT 1 -#define LFB_ALPHA_PRESENT 2 -#define LFB_DEPTH_PRESENT 4 -#define LFB_DEPTH_PRESENT_MSW 8 - -/* flags for the register access array */ -#define REGISTER_READ 0x01 /* reads are allowed */ -#define REGISTER_WRITE 0x02 /* writes are allowed */ -#define REGISTER_PIPELINED 0x04 /* writes are pipelined */ -#define REGISTER_FIFO 0x08 /* writes go to FIFO */ -#define REGISTER_WRITETHRU 0x10 /* writes are valid even for CMDFIFO */ - -/* shorter combinations to make the table smaller */ -#define REG_R (REGISTER_READ) -#define REG_W (REGISTER_WRITE) -#define REG_WT (REGISTER_WRITE | REGISTER_WRITETHRU) -#define REG_RW (REGISTER_READ | REGISTER_WRITE) -#define REG_RWT (REGISTER_READ | REGISTER_WRITE | REGISTER_WRITETHRU) -#define REG_RP (REGISTER_READ | REGISTER_PIPELINED) -#define REG_WP (REGISTER_WRITE | REGISTER_PIPELINED) -#define REG_RWP (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED) -#define REG_RWPT (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_WRITETHRU) -#define REG_RF (REGISTER_READ | REGISTER_FIFO) -#define REG_WF (REGISTER_WRITE | REGISTER_FIFO) -#define REG_RWF (REGISTER_READ | REGISTER_WRITE | REGISTER_FIFO) -#define REG_RPF (REGISTER_READ | REGISTER_PIPELINED | REGISTER_FIFO) -#define REG_WPF (REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) -#define REG_RWPF (REGISTER_READ | REGISTER_WRITE | REGISTER_PIPELINED | REGISTER_FIFO) - -/* lookup bits is the log2 of the size of the reciprocal/log table */ -#define RECIPLOG_LOOKUP_BITS 9 - -/* input precision is how many fraction bits the input value has; this is a 64-bit number */ -#define RECIPLOG_INPUT_PREC 32 - -/* lookup precision is how many fraction bits each table entry contains */ -#define RECIPLOG_LOOKUP_PREC 22 - -/* output precision is how many fraction bits the result should have */ -#define RECIP_OUTPUT_PREC 15 -#define LOG_OUTPUT_PREC 8 - - - -/************************************* - * - * Register constants - * - *************************************/ - -/* Codes to the right: - R = readable - W = writeable - P = pipelined - F = goes to FIFO -*/ - -/* 0x000 */ -#define vdstatus (0x000/4) /* R P */ -#define intrCtrl (0x004/4) /* RW P -- Voodoo2/Banshee only */ -#define vertexAx (0x008/4) /* W PF */ -#define vertexAy (0x00c/4) /* W PF */ -#define vertexBx (0x010/4) /* W PF */ -#define vertexBy (0x014/4) /* W PF */ -#define vertexCx (0x018/4) /* W PF */ -#define vertexCy (0x01c/4) /* W PF */ -#define startR (0x020/4) /* W PF */ -#define startG (0x024/4) /* W PF */ -#define startB (0x028/4) /* W PF */ -#define startZ (0x02c/4) /* W PF */ -#define startA (0x030/4) /* W PF */ -#define startS (0x034/4) /* W PF */ -#define startT (0x038/4) /* W PF */ -#define startW (0x03c/4) /* W PF */ - -/* 0x040 */ -#define dRdX (0x040/4) /* W PF */ -#define dGdX (0x044/4) /* W PF */ -#define dBdX (0x048/4) /* W PF */ -#define dZdX (0x04c/4) /* W PF */ -#define dAdX (0x050/4) /* W PF */ -#define dSdX (0x054/4) /* W PF */ -#define dTdX (0x058/4) /* W PF */ -#define dWdX (0x05c/4) /* W PF */ -#define dRdY (0x060/4) /* W PF */ -#define dGdY (0x064/4) /* W PF */ -#define dBdY (0x068/4) /* W PF */ -#define dZdY (0x06c/4) /* W PF */ -#define dAdY (0x070/4) /* W PF */ -#define dSdY (0x074/4) /* W PF */ -#define dTdY (0x078/4) /* W PF */ -#define dWdY (0x07c/4) /* W PF */ - -/* 0x080 */ -#define triangleCMD (0x080/4) /* W PF */ -#define fvertexAx (0x088/4) /* W PF */ -#define fvertexAy (0x08c/4) /* W PF */ -#define fvertexBx (0x090/4) /* W PF */ -#define fvertexBy (0x094/4) /* W PF */ -#define fvertexCx (0x098/4) /* W PF */ -#define fvertexCy (0x09c/4) /* W PF */ -#define fstartR (0x0a0/4) /* W PF */ -#define fstartG (0x0a4/4) /* W PF */ -#define fstartB (0x0a8/4) /* W PF */ -#define fstartZ (0x0ac/4) /* W PF */ -#define fstartA (0x0b0/4) /* W PF */ -#define fstartS (0x0b4/4) /* W PF */ -#define fstartT (0x0b8/4) /* W PF */ -#define fstartW (0x0bc/4) /* W PF */ - -/* 0x0c0 */ -#define fdRdX (0x0c0/4) /* W PF */ -#define fdGdX (0x0c4/4) /* W PF */ -#define fdBdX (0x0c8/4) /* W PF */ -#define fdZdX (0x0cc/4) /* W PF */ -#define fdAdX (0x0d0/4) /* W PF */ -#define fdSdX (0x0d4/4) /* W PF */ -#define fdTdX (0x0d8/4) /* W PF */ -#define fdWdX (0x0dc/4) /* W PF */ -#define fdRdY (0x0e0/4) /* W PF */ -#define fdGdY (0x0e4/4) /* W PF */ -#define fdBdY (0x0e8/4) /* W PF */ -#define fdZdY (0x0ec/4) /* W PF */ -#define fdAdY (0x0f0/4) /* W PF */ -#define fdSdY (0x0f4/4) /* W PF */ -#define fdTdY (0x0f8/4) /* W PF */ -#define fdWdY (0x0fc/4) /* W PF */ - -/* 0x100 */ -#define ftriangleCMD (0x100/4) /* W PF */ -#define fbzColorPath (0x104/4) /* RW PF */ -#define fogMode (0x108/4) /* RW PF */ -#define alphaMode (0x10c/4) /* RW PF */ -#define fbzMode (0x110/4) /* RW F */ -#define lfbMode (0x114/4) /* RW F */ -#define clipLeftRight (0x118/4) /* RW F */ -#define clipLowYHighY (0x11c/4) /* RW F */ -#define nopCMD (0x120/4) /* W F */ -#define fastfillCMD (0x124/4) /* W F */ -#define swapbufferCMD (0x128/4) /* W F */ -#define fogColor (0x12c/4) /* W F */ -#define zaColor (0x130/4) /* W F */ -#define chromaKey (0x134/4) /* W F */ -#define chromaRange (0x138/4) /* W F -- Voodoo2/Banshee only */ -#define userIntrCMD (0x13c/4) /* W F -- Voodoo2/Banshee only */ - -/* 0x140 */ -#define stipple (0x140/4) /* RW F */ -#define color0 (0x144/4) /* RW F */ -#define color1 (0x148/4) /* RW F */ -#define fbiPixelsIn (0x14c/4) /* R */ -#define fbiChromaFail (0x150/4) /* R */ -#define fbiZfuncFail (0x154/4) /* R */ -#define fbiAfuncFail (0x158/4) /* R */ -#define fbiPixelsOut (0x15c/4) /* R */ -#define fogTable (0x160/4) /* W F */ - -/* 0x1c0 */ -#define cmdFifoBaseAddr (0x1e0/4) /* RW -- Voodoo2 only */ -#define cmdFifoBump (0x1e4/4) /* RW -- Voodoo2 only */ -#define cmdFifoRdPtr (0x1e8/4) /* RW -- Voodoo2 only */ -#define cmdFifoAMin (0x1ec/4) /* RW -- Voodoo2 only */ -#define colBufferAddr (0x1ec/4) /* RW -- Banshee only */ -#define cmdFifoAMax (0x1f0/4) /* RW -- Voodoo2 only */ -#define colBufferStride (0x1f0/4) /* RW -- Banshee only */ -#define cmdFifoDepth (0x1f4/4) /* RW -- Voodoo2 only */ -#define auxBufferAddr (0x1f4/4) /* RW -- Banshee only */ -#define cmdFifoHoles (0x1f8/4) /* RW -- Voodoo2 only */ -#define auxBufferStride (0x1f8/4) /* RW -- Banshee only */ - -/* 0x200 */ -#define fbiInit4 (0x200/4) /* RW -- Voodoo/Voodoo2 only */ -#define clipLeftRight1 (0x200/4) /* RW -- Banshee only */ -#define vRetrace (0x204/4) /* R -- Voodoo/Voodoo2 only */ -#define clipTopBottom1 (0x204/4) /* RW -- Banshee only */ -#define backPorch (0x208/4) /* RW -- Voodoo/Voodoo2 only */ -#define videoDimensions (0x20c/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit0 (0x210/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit1 (0x214/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit2 (0x218/4) /* RW -- Voodoo/Voodoo2 only */ -#define fbiInit3 (0x21c/4) /* RW -- Voodoo/Voodoo2 only */ -#define hSync (0x220/4) /* W -- Voodoo/Voodoo2 only */ -#define vSync (0x224/4) /* W -- Voodoo/Voodoo2 only */ -#define clutData (0x228/4) /* W F -- Voodoo/Voodoo2 only */ -#define dacData (0x22c/4) /* W -- Voodoo/Voodoo2 only */ -#define maxRgbDelta (0x230/4) /* W -- Voodoo/Voodoo2 only */ -#define hBorder (0x234/4) /* W -- Voodoo2 only */ -#define vBorder (0x238/4) /* W -- Voodoo2 only */ -#define borderColor (0x23c/4) /* W -- Voodoo2 only */ - -/* 0x240 */ -#define hvRetrace (0x240/4) /* R -- Voodoo2 only */ -#define fbiInit5 (0x244/4) /* RW -- Voodoo2 only */ -#define fbiInit6 (0x248/4) /* RW -- Voodoo2 only */ -#define fbiInit7 (0x24c/4) /* RW -- Voodoo2 only */ -#define swapPending (0x24c/4) /* W -- Banshee only */ -#define leftOverlayBuf (0x250/4) /* W -- Banshee only */ -#define rightOverlayBuf (0x254/4) /* W -- Banshee only */ -#define fbiSwapHistory (0x258/4) /* R -- Voodoo2/Banshee only */ -#define fbiTrianglesOut (0x25c/4) /* R -- Voodoo2/Banshee only */ -#define sSetupMode (0x260/4) /* W PF -- Voodoo2/Banshee only */ -#define sVx (0x264/4) /* W PF -- Voodoo2/Banshee only */ -#define sVy (0x268/4) /* W PF -- Voodoo2/Banshee only */ -#define sARGB (0x26c/4) /* W PF -- Voodoo2/Banshee only */ -#define sRed (0x270/4) /* W PF -- Voodoo2/Banshee only */ -#define sGreen (0x274/4) /* W PF -- Voodoo2/Banshee only */ -#define sBlue (0x278/4) /* W PF -- Voodoo2/Banshee only */ -#define sAlpha (0x27c/4) /* W PF -- Voodoo2/Banshee only */ - -/* 0x280 */ -#define sVz (0x280/4) /* W PF -- Voodoo2/Banshee only */ -#define sWb (0x284/4) /* W PF -- Voodoo2/Banshee only */ -#define sWtmu0 (0x288/4) /* W PF -- Voodoo2/Banshee only */ -#define sS_W0 (0x28c/4) /* W PF -- Voodoo2/Banshee only */ -#define sT_W0 (0x290/4) /* W PF -- Voodoo2/Banshee only */ -#define sWtmu1 (0x294/4) /* W PF -- Voodoo2/Banshee only */ -#define sS_Wtmu1 (0x298/4) /* W PF -- Voodoo2/Banshee only */ -#define sT_Wtmu1 (0x29c/4) /* W PF -- Voodoo2/Banshee only */ -#define sDrawTriCMD (0x2a0/4) /* W PF -- Voodoo2/Banshee only */ -#define sBeginTriCMD (0x2a4/4) /* W PF -- Voodoo2/Banshee only */ - -/* 0x2c0 */ -#define bltSrcBaseAddr (0x2c0/4) /* RW PF -- Voodoo2 only */ -#define bltDstBaseAddr (0x2c4/4) /* RW PF -- Voodoo2 only */ -#define bltXYStrides (0x2c8/4) /* RW PF -- Voodoo2 only */ -#define bltSrcChromaRange (0x2cc/4) /* RW PF -- Voodoo2 only */ -#define bltDstChromaRange (0x2d0/4) /* RW PF -- Voodoo2 only */ -#define bltClipX (0x2d4/4) /* RW PF -- Voodoo2 only */ -#define bltClipY (0x2d8/4) /* RW PF -- Voodoo2 only */ -#define bltSrcXY (0x2e0/4) /* RW PF -- Voodoo2 only */ -#define bltDstXY (0x2e4/4) /* RW PF -- Voodoo2 only */ -#define bltSize (0x2e8/4) /* RW PF -- Voodoo2 only */ -#define bltRop (0x2ec/4) /* RW PF -- Voodoo2 only */ -#define bltColor (0x2f0/4) /* RW PF -- Voodoo2 only */ -#define bltCommand (0x2f8/4) /* RW PF -- Voodoo2 only */ -#define bltData (0x2fc/4) /* W PF -- Voodoo2 only */ - -/* 0x300 */ -#define textureMode (0x300/4) /* W PF */ -#define tLOD (0x304/4) /* W PF */ -#define tDetail (0x308/4) /* W PF */ -#define texBaseAddr (0x30c/4) /* W PF */ -#define texBaseAddr_1 (0x310/4) /* W PF */ -#define texBaseAddr_2 (0x314/4) /* W PF */ -#define texBaseAddr_3_8 (0x318/4) /* W PF */ -#define trexInit0 (0x31c/4) /* W F -- Voodoo/Voodoo2 only */ -#define trexInit1 (0x320/4) /* W F */ -#define nccTable (0x324/4) /* W F */ - - - -// 2D registers -#define banshee2D_clip0Min (0x008/4) -#define banshee2D_clip0Max (0x00c/4) -#define banshee2D_dstBaseAddr (0x010/4) -#define banshee2D_dstFormat (0x014/4) -#define banshee2D_srcColorkeyMin (0x018/4) -#define banshee2D_srcColorkeyMax (0x01c/4) -#define banshee2D_dstColorkeyMin (0x020/4) -#define banshee2D_dstColorkeyMax (0x024/4) -#define banshee2D_bresError0 (0x028/4) -#define banshee2D_bresError1 (0x02c/4) -#define banshee2D_rop (0x030/4) -#define banshee2D_srcBaseAddr (0x034/4) -#define banshee2D_commandExtra (0x038/4) -#define banshee2D_lineStipple (0x03c/4) -#define banshee2D_lineStyle (0x040/4) -#define banshee2D_pattern0Alias (0x044/4) -#define banshee2D_pattern1Alias (0x048/4) -#define banshee2D_clip1Min (0x04c/4) -#define banshee2D_clip1Max (0x050/4) -#define banshee2D_srcFormat (0x054/4) -#define banshee2D_srcSize (0x058/4) -#define banshee2D_srcXY (0x05c/4) -#define banshee2D_colorBack (0x060/4) -#define banshee2D_colorFore (0x064/4) -#define banshee2D_dstSize (0x068/4) -#define banshee2D_dstXY (0x06c/4) -#define banshee2D_command (0x070/4) - - -/************************************* - * - * Alias map of the first 64 - * registers when remapped - * - *************************************/ - -static const UINT8 register_alias_map[0x40] = -{ - vdstatus, 0x004/4, vertexAx, vertexAy, - vertexBx, vertexBy, vertexCx, vertexCy, - startR, dRdX, dRdY, startG, - dGdX, dGdY, startB, dBdX, - dBdY, startZ, dZdX, dZdY, - startA, dAdX, dAdY, startS, - dSdX, dSdY, startT, dTdX, - dTdY, startW, dWdX, dWdY, - - triangleCMD,0x084/4, fvertexAx, fvertexAy, - fvertexBx, fvertexBy, fvertexCx, fvertexCy, - fstartR, fdRdX, fdRdY, fstartG, - fdGdX, fdGdY, fstartB, fdBdX, - fdBdY, fstartZ, fdZdX, fdZdY, - fstartA, fdAdX, fdAdY, fstartS, - fdSdX, fdSdY, fstartT, fdTdX, - fdTdY, fstartW, fdWdX, fdWdY -}; - - - -/************************************* - * - * Table of per-register access rights - * - *************************************/ - -static const UINT8 voodoo_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, 0, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, 0, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, 0, 0, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x200 */ - REG_RW, REG_R, REG_RW, REG_RW, - REG_RW, REG_RW, REG_RW, REG_RW, - REG_W, REG_W, REG_W, REG_W, - REG_W, 0, 0, 0, - - /* 0x240 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x280 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - -static const UINT8 voodoo2_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, REG_RWPT, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_RWT, REG_RWT, REG_RWT, REG_RWT, - REG_RWT, REG_RWT, REG_RWT, REG_RW, - - /* 0x200 */ - REG_RWT, REG_R, REG_RWT, REG_RWT, - REG_RWT, REG_RWT, REG_RWT, REG_RWT, - REG_WT, REG_WT, REG_WF, REG_WT, - REG_WT, REG_WT, REG_WT, REG_WT, - - /* 0x240 */ - REG_R, REG_RWT, REG_RWT, REG_RWT, - 0, 0, REG_R, REG_R, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x280 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWPF, REG_RWPF, REG_RWPF, REG_WPF, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - -static const UINT8 banshee_register_access[0x100] = -{ - /* 0x000 */ - REG_RP, REG_RWPT, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x040 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x080 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x0c0 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x100 */ - REG_WPF, REG_RWPF, REG_RWPF, REG_RWPF, - REG_RWF, REG_RWF, REG_RWF, REG_RWF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x140 */ - REG_RWF, REG_RWF, REG_RWF, REG_R, - REG_R, REG_R, REG_R, REG_R, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x180 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x1c0 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - 0, 0, 0, REG_RWF, - REG_RWF, REG_RWF, REG_RWF, 0, - - /* 0x200 */ - REG_RWF, REG_RWF, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x240 */ - 0, 0, 0, REG_WT, - REG_RWF, REG_RWF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_R, REG_R, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - - /* 0x280 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, 0, 0, - 0, 0, 0, 0, - - /* 0x2c0 */ - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - 0, 0, 0, 0, - - /* 0x300 */ - REG_WPF, REG_WPF, REG_WPF, REG_WPF, - REG_WPF, REG_WPF, REG_WPF, 0, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x340 */ - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - REG_WF, REG_WF, REG_WF, REG_WF, - - /* 0x380 */ - REG_WF -}; - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const voodoo_reg_name[] = -{ - /* 0x000 */ - "status", "{intrCtrl}", "vertexAx", "vertexAy", - "vertexBx", "vertexBy", "vertexCx", "vertexCy", - "startR", "startG", "startB", "startZ", - "startA", "startS", "startT", "startW", - /* 0x040 */ - "dRdX", "dGdX", "dBdX", "dZdX", - "dAdX", "dSdX", "dTdX", "dWdX", - "dRdY", "dGdY", "dBdY", "dZdY", - "dAdY", "dSdY", "dTdY", "dWdY", - /* 0x080 */ - "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", - "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", - "fstartR", "fstartG", "fstartB", "fstartZ", - "fstartA", "fstartS", "fstartT", "fstartW", - /* 0x0c0 */ - "fdRdX", "fdGdX", "fdBdX", "fdZdX", - "fdAdX", "fdSdX", "fdTdX", "fdWdX", - "fdRdY", "fdGdY", "fdBdY", "fdZdY", - "fdAdY", "fdSdY", "fdTdY", "fdWdY", - /* 0x100 */ - "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", - "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", - "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", - "zaColor", "chromaKey", "{chromaRange}","{userIntrCMD}", - /* 0x140 */ - "stipple", "color0", "color1", "fbiPixelsIn", - "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", - "fogTable160", "fogTable164", "fogTable168", "fogTable16c", - "fogTable170", "fogTable174", "fogTable178", "fogTable17c", - /* 0x180 */ - "fogTable180", "fogTable184", "fogTable188", "fogTable18c", - "fogTable190", "fogTable194", "fogTable198", "fogTable19c", - "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", - "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", - /* 0x1c0 */ - "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", - "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", - "{cmdFifoBaseAddr}","{cmdFifoBump}","{cmdFifoRdPtr}","{cmdFifoAMin}", - "{cmdFifoAMax}","{cmdFifoDepth}","{cmdFifoHoles}","reserved1fc", - /* 0x200 */ - "fbiInit4", "vRetrace", "backPorch", "videoDimensions", - "fbiInit0", "fbiInit1", "fbiInit2", "fbiInit3", - "hSync", "vSync", "clutData", "dacData", - "maxRgbDelta", "{hBorder}", "{vBorder}", "{borderColor}", - /* 0x240 */ - "{hvRetrace}", "{fbiInit5}", "{fbiInit6}", "{fbiInit7}", - "reserved250", "reserved254", "{fbiSwapHistory}","{fbiTrianglesOut}", - "{sSetupMode}", "{sVx}", "{sVy}", "{sARGB}", - "{sRed}", "{sGreen}", "{sBlue}", "{sAlpha}", - /* 0x280 */ - "{sVz}", "{sWb}", "{sWtmu0}", "{sS/Wtmu0}", - "{sT/Wtmu0}", "{sWtmu1}", "{sS/Wtmu1}", "{sT/Wtmu1}", - "{sDrawTriCMD}","{sBeginTriCMD}","reserved2a8", "reserved2ac", - "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", - /* 0x2c0 */ - "{bltSrcBaseAddr}","{bltDstBaseAddr}","{bltXYStrides}","{bltSrcChromaRange}", - "{bltDstChromaRange}","{bltClipX}","{bltClipY}","reserved2dc", - "{bltSrcXY}", "{bltDstXY}", "{bltSize}", "{bltRop}", - "{bltColor}", "reserved2f4", "{bltCommand}", "{bltData}", - /* 0x300 */ - "textureMode", "tLOD", "tDetail", "texBaseAddr", - "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","trexInit0", - "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", - "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", - /* 0x340 */ - "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", - "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", - "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", - "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", - /* 0x380 */ - "nccTable1.B" -}; - - -static const char *const banshee_reg_name[] = -{ - /* 0x000 */ - "status", "intrCtrl", "vertexAx", "vertexAy", - "vertexBx", "vertexBy", "vertexCx", "vertexCy", - "startR", "startG", "startB", "startZ", - "startA", "startS", "startT", "startW", - /* 0x040 */ - "dRdX", "dGdX", "dBdX", "dZdX", - "dAdX", "dSdX", "dTdX", "dWdX", - "dRdY", "dGdY", "dBdY", "dZdY", - "dAdY", "dSdY", "dTdY", "dWdY", - /* 0x080 */ - "triangleCMD", "reserved084", "fvertexAx", "fvertexAy", - "fvertexBx", "fvertexBy", "fvertexCx", "fvertexCy", - "fstartR", "fstartG", "fstartB", "fstartZ", - "fstartA", "fstartS", "fstartT", "fstartW", - /* 0x0c0 */ - "fdRdX", "fdGdX", "fdBdX", "fdZdX", - "fdAdX", "fdSdX", "fdTdX", "fdWdX", - "fdRdY", "fdGdY", "fdBdY", "fdZdY", - "fdAdY", "fdSdY", "fdTdY", "fdWdY", - /* 0x100 */ - "ftriangleCMD", "fbzColorPath", "fogMode", "alphaMode", - "fbzMode", "lfbMode", "clipLeftRight","clipLowYHighY", - "nopCMD", "fastfillCMD", "swapbufferCMD","fogColor", - "zaColor", "chromaKey", "chromaRange", "userIntrCMD", - /* 0x140 */ - "stipple", "color0", "color1", "fbiPixelsIn", - "fbiChromaFail","fbiZfuncFail", "fbiAfuncFail", "fbiPixelsOut", - "fogTable160", "fogTable164", "fogTable168", "fogTable16c", - "fogTable170", "fogTable174", "fogTable178", "fogTable17c", - /* 0x180 */ - "fogTable180", "fogTable184", "fogTable188", "fogTable18c", - "fogTable190", "fogTable194", "fogTable198", "fogTable19c", - "fogTable1a0", "fogTable1a4", "fogTable1a8", "fogTable1ac", - "fogTable1b0", "fogTable1b4", "fogTable1b8", "fogTable1bc", - /* 0x1c0 */ - "fogTable1c0", "fogTable1c4", "fogTable1c8", "fogTable1cc", - "fogTable1d0", "fogTable1d4", "fogTable1d8", "fogTable1dc", - "reserved1e0", "reserved1e4", "reserved1e8", "colBufferAddr", - "colBufferStride","auxBufferAddr","auxBufferStride","reserved1fc", - /* 0x200 */ - "clipLeftRight1","clipTopBottom1","reserved208","reserved20c", - "reserved210", "reserved214", "reserved218", "reserved21c", - "reserved220", "reserved224", "reserved228", "reserved22c", - "reserved230", "reserved234", "reserved238", "reserved23c", - /* 0x240 */ - "reserved240", "reserved244", "reserved248", "swapPending", - "leftOverlayBuf","rightOverlayBuf","fbiSwapHistory","fbiTrianglesOut", - "sSetupMode", "sVx", "sVy", "sARGB", - "sRed", "sGreen", "sBlue", "sAlpha", - /* 0x280 */ - "sVz", "sWb", "sWtmu0", "sS/Wtmu0", - "sT/Wtmu0", "sWtmu1", "sS/Wtmu1", "sT/Wtmu1", - "sDrawTriCMD", "sBeginTriCMD", "reserved2a8", "reserved2ac", - "reserved2b0", "reserved2b4", "reserved2b8", "reserved2bc", - /* 0x2c0 */ - "reserved2c0", "reserved2c4", "reserved2c8", "reserved2cc", - "reserved2d0", "reserved2d4", "reserved2d8", "reserved2dc", - "reserved2e0", "reserved2e4", "reserved2e8", "reserved2ec", - "reserved2f0", "reserved2f4", "reserved2f8", "reserved2fc", - /* 0x300 */ - "textureMode", "tLOD", "tDetail", "texBaseAddr", - "texBaseAddr_1","texBaseAddr_2","texBaseAddr_3_8","reserved31c", - "trexInit1", "nccTable0.0", "nccTable0.1", "nccTable0.2", - "nccTable0.3", "nccTable0.4", "nccTable0.5", "nccTable0.6", - /* 0x340 */ - "nccTable0.7", "nccTable0.8", "nccTable0.9", "nccTable0.A", - "nccTable0.B", "nccTable1.0", "nccTable1.1", "nccTable1.2", - "nccTable1.3", "nccTable1.4", "nccTable1.5", "nccTable1.6", - "nccTable1.7", "nccTable1.8", "nccTable1.9", "nccTable1.A", - /* 0x380 */ - "nccTable1.B" -}; - - - -/************************************* - * - * Voodoo Banshee I/O space registers - * - *************************************/ - -/* 0x000 */ -#define io_status (0x000/4) /* */ -#define io_pciInit0 (0x004/4) /* */ -#define io_sipMonitor (0x008/4) /* */ -#define io_lfbMemoryConfig (0x00c/4) /* */ -#define io_miscInit0 (0x010/4) /* */ -#define io_miscInit1 (0x014/4) /* */ -#define io_dramInit0 (0x018/4) /* */ -#define io_dramInit1 (0x01c/4) /* */ -#define io_agpInit (0x020/4) /* */ -#define io_tmuGbeInit (0x024/4) /* */ -#define io_vgaInit0 (0x028/4) /* */ -#define io_vgaInit1 (0x02c/4) /* */ -#define io_dramCommand (0x030/4) /* */ -#define io_dramData (0x034/4) /* */ - -/* 0x040 */ -#define io_pllCtrl0 (0x040/4) /* */ -#define io_pllCtrl1 (0x044/4) /* */ -#define io_pllCtrl2 (0x048/4) /* */ -#define io_dacMode (0x04c/4) /* */ -#define io_dacAddr (0x050/4) /* */ -#define io_dacData (0x054/4) /* */ -#define io_rgbMaxDelta (0x058/4) /* */ -#define io_vidProcCfg (0x05c/4) /* */ -#define io_hwCurPatAddr (0x060/4) /* */ -#define io_hwCurLoc (0x064/4) /* */ -#define io_hwCurC0 (0x068/4) /* */ -#define io_hwCurC1 (0x06c/4) /* */ -#define io_vidInFormat (0x070/4) /* */ -#define io_vidInStatus (0x074/4) /* */ -#define io_vidSerialParallelPort (0x078/4) /* */ -#define io_vidInXDecimDeltas (0x07c/4) /* */ - -/* 0x080 */ -#define io_vidInDecimInitErrs (0x080/4) /* */ -#define io_vidInYDecimDeltas (0x084/4) /* */ -#define io_vidPixelBufThold (0x088/4) /* */ -#define io_vidChromaMin (0x08c/4) /* */ -#define io_vidChromaMax (0x090/4) /* */ -#define io_vidCurrentLine (0x094/4) /* */ -#define io_vidScreenSize (0x098/4) /* */ -#define io_vidOverlayStartCoords (0x09c/4) /* */ -#define io_vidOverlayEndScreenCoord (0x0a0/4) /* */ -#define io_vidOverlayDudx (0x0a4/4) /* */ -#define io_vidOverlayDudxOffsetSrcWidth (0x0a8/4) /* */ -#define io_vidOverlayDvdy (0x0ac/4) /* */ -#define io_vgab0 (0x0b0/4) /* */ -#define io_vgab4 (0x0b4/4) /* */ -#define io_vgab8 (0x0b8/4) /* */ -#define io_vgabc (0x0bc/4) /* */ - -/* 0x0c0 */ -#define io_vgac0 (0x0c0/4) /* */ -#define io_vgac4 (0x0c4/4) /* */ -#define io_vgac8 (0x0c8/4) /* */ -#define io_vgacc (0x0cc/4) /* */ -#define io_vgad0 (0x0d0/4) /* */ -#define io_vgad4 (0x0d4/4) /* */ -#define io_vgad8 (0x0d8/4) /* */ -#define io_vgadc (0x0dc/4) /* */ -#define io_vidOverlayDvdyOffset (0x0e0/4) /* */ -#define io_vidDesktopStartAddr (0x0e4/4) /* */ -#define io_vidDesktopOverlayStride (0x0e8/4) /* */ -#define io_vidInAddr0 (0x0ec/4) /* */ -#define io_vidInAddr1 (0x0f0/4) /* */ -#define io_vidInAddr2 (0x0f4/4) /* */ -#define io_vidInStride (0x0f8/4) /* */ -#define io_vidCurrOverlayStartAddr (0x0fc/4) /* */ - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const banshee_io_reg_name[] = -{ - /* 0x000 */ - "status", "pciInit0", "sipMonitor", "lfbMemoryConfig", - "miscInit0", "miscInit1", "dramInit0", "dramInit1", - "agpInit", "tmuGbeInit", "vgaInit0", "vgaInit1", - "dramCommand", "dramData", "reserved38", "reserved3c", - - /* 0x040 */ - "pllCtrl0", "pllCtrl1", "pllCtrl2", "dacMode", - "dacAddr", "dacData", "rgbMaxDelta", "vidProcCfg", - "hwCurPatAddr", "hwCurLoc", "hwCurC0", "hwCurC1", - "vidInFormat", "vidInStatus", "vidSerialParallelPort","vidInXDecimDeltas", - - /* 0x080 */ - "vidInDecimInitErrs","vidInYDecimDeltas","vidPixelBufThold","vidChromaMin", - "vidChromaMax", "vidCurrentLine","vidScreenSize","vidOverlayStartCoords", - "vidOverlayEndScreenCoord","vidOverlayDudx","vidOverlayDudxOffsetSrcWidth","vidOverlayDvdy", - "vga[b0]", "vga[b4]", "vga[b8]", "vga[bc]", - - /* 0x0c0 */ - "vga[c0]", "vga[c4]", "vga[c8]", "vga[cc]", - "vga[d0]", "vga[d4]", "vga[d8]", "vga[dc]", - "vidOverlayDvdyOffset","vidDesktopStartAddr","vidDesktopOverlayStride","vidInAddr0", - "vidInAddr1", "vidInAddr2", "vidInStride", "vidCurrOverlayStartAddr" -}; - - - -/************************************* - * - * Voodoo Banshee AGP space registers - * - *************************************/ - -/* 0x000 */ -#define agpReqSize (0x000/4) /* */ -#define agpHostAddressLow (0x004/4) /* */ -#define agpHostAddressHigh (0x008/4) /* */ -#define agpGraphicsAddress (0x00c/4) /* */ -#define agpGraphicsStride (0x010/4) /* */ -#define agpMoveCMD (0x014/4) /* */ -#define cmdBaseAddr0 (0x020/4) /* */ -#define cmdBaseSize0 (0x024/4) /* */ -#define cmdBump0 (0x028/4) /* */ -#define cmdRdPtrL0 (0x02c/4) /* */ -#define cmdRdPtrH0 (0x030/4) /* */ -#define cmdAMin0 (0x034/4) /* */ -#define cmdAMax0 (0x03c/4) /* */ - -/* 0x040 */ -#define cmdFifoDepth0 (0x044/4) /* */ -#define cmdHoleCnt0 (0x048/4) /* */ -#define cmdBaseAddr1 (0x050/4) /* */ -#define cmdBaseSize1 (0x054/4) /* */ -#define cmdBump1 (0x058/4) /* */ -#define cmdRdPtrL1 (0x05c/4) /* */ -#define cmdRdPtrH1 (0x060/4) /* */ -#define cmdAMin1 (0x064/4) /* */ -#define cmdAMax1 (0x06c/4) /* */ -#define cmdFifoDepth1 (0x074/4) /* */ -#define cmdHoleCnt1 (0x078/4) /* */ - -/* 0x080 */ -#define cmdFifoThresh (0x080/4) /* */ -#define cmdHoleInt (0x084/4) /* */ - -/* 0x100 */ -#define yuvBaseAddress (0x100/4) /* */ -#define yuvStride (0x104/4) /* */ -#define crc1 (0x120/4) /* */ -#define crc2 (0x130/4) /* */ - - - -/************************************* - * - * Register string table for debug - * - *************************************/ - -static const char *const banshee_agp_reg_name[] = -{ - /* 0x000 */ - "agpReqSize", "agpHostAddressLow","agpHostAddressHigh","agpGraphicsAddress", - "agpGraphicsStride","agpMoveCMD","reserved18", "reserved1c", - "cmdBaseAddr0", "cmdBaseSize0", "cmdBump0", "cmdRdPtrL0", - "cmdRdPtrH0", "cmdAMin0", "reserved38", "cmdAMax0", - - /* 0x040 */ - "reserved40", "cmdFifoDepth0","cmdHoleCnt0", "reserved4c", - "cmdBaseAddr1", "cmdBaseSize1", "cmdBump1", "cmdRdPtrL1", - "cmdRdPtrH1", "cmdAMin1", "reserved68", "cmdAMax1", - "reserved70", "cmdFifoDepth1","cmdHoleCnt1", "reserved7c", - - /* 0x080 */ - "cmdFifoThresh","cmdHoleInt", "reserved88", "reserved8c", - "reserved90", "reserved94", "reserved98", "reserved9c", - "reserveda0", "reserveda4", "reserveda8", "reservedac", - "reservedb0", "reservedb4", "reservedb8", "reservedbc", - - /* 0x0c0 */ - "reservedc0", "reservedc4", "reservedc8", "reservedcc", - "reservedd0", "reservedd4", "reservedd8", "reserveddc", - "reservede0", "reservede4", "reservede8", "reservedec", - "reservedf0", "reservedf4", "reservedf8", "reservedfc", - - /* 0x100 */ - "yuvBaseAddress","yuvStride", "reserved108", "reserved10c", - "reserved110", "reserved114", "reserved118", "reserved11c", - "crc1", "reserved124", "reserved128", "reserved12c", - "crc2", "reserved134", "reserved138", "reserved13c" -}; - - - -/************************************* - * - * Dithering tables - * - *************************************/ - -static const UINT8 dither_matrix_4x4[16] = -{ - 0, 8, 2, 10, - 12, 4, 14, 6, - 3, 11, 1, 9, - 15, 7, 13, 5 -}; - -static const UINT8 dither_matrix_2x2[16] = -{ - 2, 10, 2, 10, - 14, 6, 14, 6, - 2, 10, 2, 10, - 14, 6, 14, 6 -}; - - - -/************************************* - * - * Macros for extracting pixels - * - *************************************/ - -#define EXTRACT_565_TO_888(val, a, b, c) \ - (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ - (b) = (((val) >> 3) & 0xfc) | (((val) >> 9) & 0x03); \ - (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); -#define EXTRACT_x555_TO_888(val, a, b, c) \ - (a) = (((val) >> 7) & 0xf8) | (((val) >> 12) & 0x07); \ - (b) = (((val) >> 2) & 0xf8) | (((val) >> 7) & 0x07); \ - (c) = (((val) << 3) & 0xf8) | (((val) >> 2) & 0x07); -#define EXTRACT_555x_TO_888(val, a, b, c) \ - (a) = (((val) >> 8) & 0xf8) | (((val) >> 13) & 0x07); \ - (b) = (((val) >> 3) & 0xf8) | (((val) >> 8) & 0x07); \ - (c) = (((val) << 2) & 0xf8) | (((val) >> 3) & 0x07); -#define EXTRACT_1555_TO_8888(val, a, b, c, d) \ - (a) = ((INT16)(val) >> 15) & 0xff; \ - EXTRACT_x555_TO_888(val, b, c, d) -#define EXTRACT_5551_TO_8888(val, a, b, c, d) \ - EXTRACT_555x_TO_888(val, a, b, c) \ - (d) = ((val) & 0x0001) ? 0xff : 0x00; -#define EXTRACT_x888_TO_888(val, a, b, c) \ - (a) = ((val) >> 16) & 0xff; \ - (b) = ((val) >> 8) & 0xff; \ - (c) = ((val) >> 0) & 0xff; -#define EXTRACT_888x_TO_888(val, a, b, c) \ - (a) = ((val) >> 24) & 0xff; \ - (b) = ((val) >> 16) & 0xff; \ - (c) = ((val) >> 8) & 0xff; -#define EXTRACT_8888_TO_8888(val, a, b, c, d) \ - (a) = ((val) >> 24) & 0xff; \ - (b) = ((val) >> 16) & 0xff; \ - (c) = ((val) >> 8) & 0xff; \ - (d) = ((val) >> 0) & 0xff; -#define EXTRACT_4444_TO_8888(val, a, b, c, d) \ - (a) = (((val) >> 8) & 0xf0) | (((val) >> 12) & 0x0f); \ - (b) = (((val) >> 4) & 0xf0) | (((val) >> 8) & 0x0f); \ - (c) = (((val) >> 0) & 0xf0) | (((val) >> 4) & 0x0f); \ - (d) = (((val) << 4) & 0xf0) | (((val) >> 0) & 0x0f); -#define EXTRACT_332_TO_888(val, a, b, c) \ - (a) = (((val) >> 0) & 0xe0) | (((val) >> 3) & 0x1c) | (((val) >> 6) & 0x03); \ - (b) = (((val) << 3) & 0xe0) | (((val) >> 0) & 0x1c) | (((val) >> 3) & 0x03); \ - (c) = (((val) << 6) & 0xc0) | (((val) << 4) & 0x30) | (((val) << 2) & 0x0c) | (((val) << 0) & 0x03); - - -/************************************* - * - * Misc. macros - * - *************************************/ - -/* macro for clamping a value between minimum and maximum values */ -#define CLAMP(val,min,max) do { if ((val) < (min)) { (val) = (min); } else if ((val) > (max)) { (val) = (max); } } while (0) - -/* macro to compute the base 2 log for LOD calculations */ -#define LOGB2(x) (log((double)(x)) / log(2.0)) - - - -/************************************* - * - * Macros for extracting bitfields - * - *************************************/ - -#define INITEN_ENABLE_HW_INIT(val) (((val) >> 0) & 1) -#define INITEN_ENABLE_PCI_FIFO(val) (((val) >> 1) & 1) -#define INITEN_REMAP_INIT_TO_DAC(val) (((val) >> 2) & 1) -#define INITEN_ENABLE_SNOOP0(val) (((val) >> 4) & 1) -#define INITEN_SNOOP0_MEMORY_MATCH(val) (((val) >> 5) & 1) -#define INITEN_SNOOP0_READWRITE_MATCH(val) (((val) >> 6) & 1) -#define INITEN_ENABLE_SNOOP1(val) (((val) >> 7) & 1) -#define INITEN_SNOOP1_MEMORY_MATCH(val) (((val) >> 8) & 1) -#define INITEN_SNOOP1_READWRITE_MATCH(val) (((val) >> 9) & 1) -#define INITEN_SLI_BUS_OWNER(val) (((val) >> 10) & 1) -#define INITEN_SLI_ODD_EVEN(val) (((val) >> 11) & 1) -#define INITEN_SECONDARY_REV_ID(val) (((val) >> 12) & 0xf) /* voodoo 2 only */ -#define INITEN_MFCTR_FAB_ID(val) (((val) >> 16) & 0xf) /* voodoo 2 only */ -#define INITEN_ENABLE_PCI_INTERRUPT(val) (((val) >> 20) & 1) /* voodoo 2 only */ -#define INITEN_PCI_INTERRUPT_TIMEOUT(val) (((val) >> 21) & 1) /* voodoo 2 only */ -#define INITEN_ENABLE_NAND_TREE_TEST(val) (((val) >> 22) & 1) /* voodoo 2 only */ -#define INITEN_ENABLE_SLI_ADDRESS_SNOOP(val) (((val) >> 23) & 1) /* voodoo 2 only */ -#define INITEN_SLI_SNOOP_ADDRESS(val) (((val) >> 24) & 0xff) /* voodoo 2 only */ - -#define FBZCP_CC_RGBSELECT(val) (((val) >> 0) & 3) -#define FBZCP_CC_ASELECT(val) (((val) >> 2) & 3) -#define FBZCP_CC_LOCALSELECT(val) (((val) >> 4) & 1) -#define FBZCP_CCA_LOCALSELECT(val) (((val) >> 5) & 3) -#define FBZCP_CC_LOCALSELECT_OVERRIDE(val) (((val) >> 7) & 1) -#define FBZCP_CC_ZERO_OTHER(val) (((val) >> 8) & 1) -#define FBZCP_CC_SUB_CLOCAL(val) (((val) >> 9) & 1) -#define FBZCP_CC_MSELECT(val) (((val) >> 10) & 7) -#define FBZCP_CC_REVERSE_BLEND(val) (((val) >> 13) & 1) -#define FBZCP_CC_ADD_ACLOCAL(val) (((val) >> 14) & 3) -#define FBZCP_CC_INVERT_OUTPUT(val) (((val) >> 16) & 1) -#define FBZCP_CCA_ZERO_OTHER(val) (((val) >> 17) & 1) -#define FBZCP_CCA_SUB_CLOCAL(val) (((val) >> 18) & 1) -#define FBZCP_CCA_MSELECT(val) (((val) >> 19) & 7) -#define FBZCP_CCA_REVERSE_BLEND(val) (((val) >> 22) & 1) -#define FBZCP_CCA_ADD_ACLOCAL(val) (((val) >> 23) & 3) -#define FBZCP_CCA_INVERT_OUTPUT(val) (((val) >> 25) & 1) -#define FBZCP_CCA_SUBPIXEL_ADJUST(val) (((val) >> 26) & 1) -#define FBZCP_TEXTURE_ENABLE(val) (((val) >> 27) & 1) -#define FBZCP_RGBZW_CLAMP(val) (((val) >> 28) & 1) /* voodoo 2 only */ -#define FBZCP_ANTI_ALIAS(val) (((val) >> 29) & 1) /* voodoo 2 only */ - -#define ALPHAMODE_ALPHATEST(val) (((val) >> 0) & 1) -#define ALPHAMODE_ALPHAFUNCTION(val) (((val) >> 1) & 7) -#define ALPHAMODE_ALPHABLEND(val) (((val) >> 4) & 1) -#define ALPHAMODE_ANTIALIAS(val) (((val) >> 5) & 1) -#define ALPHAMODE_SRCRGBBLEND(val) (((val) >> 8) & 15) -#define ALPHAMODE_DSTRGBBLEND(val) (((val) >> 12) & 15) -#define ALPHAMODE_SRCALPHABLEND(val) (((val) >> 16) & 15) -#define ALPHAMODE_DSTALPHABLEND(val) (((val) >> 20) & 15) -#define ALPHAMODE_ALPHAREF(val) (((val) >> 24) & 0xff) - -#define FOGMODE_ENABLE_FOG(val) (((val) >> 0) & 1) -#define FOGMODE_FOG_ADD(val) (((val) >> 1) & 1) -#define FOGMODE_FOG_MULT(val) (((val) >> 2) & 1) -#define FOGMODE_FOG_ZALPHA(val) (((val) >> 3) & 3) -#define FOGMODE_FOG_CONSTANT(val) (((val) >> 5) & 1) -#define FOGMODE_FOG_DITHER(val) (((val) >> 6) & 1) /* voodoo 2 only */ -#define FOGMODE_FOG_ZONES(val) (((val) >> 7) & 1) /* voodoo 2 only */ - -#define FBZMODE_ENABLE_CLIPPING(val) (((val) >> 0) & 1) -#define FBZMODE_ENABLE_CHROMAKEY(val) (((val) >> 1) & 1) -#define FBZMODE_ENABLE_STIPPLE(val) (((val) >> 2) & 1) -#define FBZMODE_WBUFFER_SELECT(val) (((val) >> 3) & 1) -#define FBZMODE_ENABLE_DEPTHBUF(val) (((val) >> 4) & 1) -#define FBZMODE_DEPTH_FUNCTION(val) (((val) >> 5) & 7) -#define FBZMODE_ENABLE_DITHERING(val) (((val) >> 8) & 1) -#define FBZMODE_RGB_BUFFER_MASK(val) (((val) >> 9) & 1) -#define FBZMODE_AUX_BUFFER_MASK(val) (((val) >> 10) & 1) -#define FBZMODE_DITHER_TYPE(val) (((val) >> 11) & 1) -#define FBZMODE_STIPPLE_PATTERN(val) (((val) >> 12) & 1) -#define FBZMODE_ENABLE_ALPHA_MASK(val) (((val) >> 13) & 1) -#define FBZMODE_DRAW_BUFFER(val) (((val) >> 14) & 3) -#define FBZMODE_ENABLE_DEPTH_BIAS(val) (((val) >> 16) & 1) -#define FBZMODE_Y_ORIGIN(val) (((val) >> 17) & 1) -#define FBZMODE_ENABLE_ALPHA_PLANES(val) (((val) >> 18) & 1) -#define FBZMODE_ALPHA_DITHER_SUBTRACT(val) (((val) >> 19) & 1) -#define FBZMODE_DEPTH_SOURCE_COMPARE(val) (((val) >> 20) & 1) -#define FBZMODE_DEPTH_FLOAT_SELECT(val) (((val) >> 21) & 1) /* voodoo 2 only */ - -#define LFBMODE_WRITE_FORMAT(val) (((val) >> 0) & 0xf) -#define LFBMODE_WRITE_BUFFER_SELECT(val) (((val) >> 4) & 3) -#define LFBMODE_READ_BUFFER_SELECT(val) (((val) >> 6) & 3) -#define LFBMODE_ENABLE_PIXEL_PIPELINE(val) (((val) >> 8) & 1) -#define LFBMODE_RGBA_LANES(val) (((val) >> 9) & 3) -#define LFBMODE_WORD_SWAP_WRITES(val) (((val) >> 11) & 1) -#define LFBMODE_BYTE_SWIZZLE_WRITES(val) (((val) >> 12) & 1) -#define LFBMODE_Y_ORIGIN(val) (((val) >> 13) & 1) -#define LFBMODE_WRITE_W_SELECT(val) (((val) >> 14) & 1) -#define LFBMODE_WORD_SWAP_READS(val) (((val) >> 15) & 1) -#define LFBMODE_BYTE_SWIZZLE_READS(val) (((val) >> 16) & 1) - -#define CHROMARANGE_BLUE_EXCLUSIVE(val) (((val) >> 24) & 1) -#define CHROMARANGE_GREEN_EXCLUSIVE(val) (((val) >> 25) & 1) -#define CHROMARANGE_RED_EXCLUSIVE(val) (((val) >> 26) & 1) -#define CHROMARANGE_UNION_MODE(val) (((val) >> 27) & 1) -#define CHROMARANGE_ENABLE(val) (((val) >> 28) & 1) - -#define FBIINIT0_VGA_PASSTHRU(val) (((val) >> 0) & 1) -#define FBIINIT0_GRAPHICS_RESET(val) (((val) >> 1) & 1) -#define FBIINIT0_FIFO_RESET(val) (((val) >> 2) & 1) -#define FBIINIT0_SWIZZLE_REG_WRITES(val) (((val) >> 3) & 1) -#define FBIINIT0_STALL_PCIE_FOR_HWM(val) (((val) >> 4) & 1) -#define FBIINIT0_PCI_FIFO_LWM(val) (((val) >> 6) & 0x1f) -#define FBIINIT0_LFB_TO_MEMORY_FIFO(val) (((val) >> 11) & 1) -#define FBIINIT0_TEXMEM_TO_MEMORY_FIFO(val) (((val) >> 12) & 1) -#define FBIINIT0_ENABLE_MEMORY_FIFO(val) (((val) >> 13) & 1) -#define FBIINIT0_MEMORY_FIFO_HWM(val) (((val) >> 14) & 0x7ff) -#define FBIINIT0_MEMORY_FIFO_BURST(val) (((val) >> 25) & 0x3f) - -#define FBIINIT1_PCI_DEV_FUNCTION(val) (((val) >> 0) & 1) -#define FBIINIT1_PCI_WRITE_WAIT_STATES(val) (((val) >> 1) & 1) -#define FBIINIT1_MULTI_SST1(val) (((val) >> 2) & 1) /* not on voodoo 2 */ -#define FBIINIT1_ENABLE_LFB(val) (((val) >> 3) & 1) -#define FBIINIT1_X_VIDEO_TILES(val) (((val) >> 4) & 0xf) -#define FBIINIT1_VIDEO_TIMING_RESET(val) (((val) >> 8) & 1) -#define FBIINIT1_SOFTWARE_OVERRIDE(val) (((val) >> 9) & 1) -#define FBIINIT1_SOFTWARE_HSYNC(val) (((val) >> 10) & 1) -#define FBIINIT1_SOFTWARE_VSYNC(val) (((val) >> 11) & 1) -#define FBIINIT1_SOFTWARE_BLANK(val) (((val) >> 12) & 1) -#define FBIINIT1_DRIVE_VIDEO_TIMING(val) (((val) >> 13) & 1) -#define FBIINIT1_DRIVE_VIDEO_BLANK(val) (((val) >> 14) & 1) -#define FBIINIT1_DRIVE_VIDEO_SYNC(val) (((val) >> 15) & 1) -#define FBIINIT1_DRIVE_VIDEO_DCLK(val) (((val) >> 16) & 1) -#define FBIINIT1_VIDEO_TIMING_VCLK(val) (((val) >> 17) & 1) -#define FBIINIT1_VIDEO_CLK_2X_DELAY(val) (((val) >> 18) & 3) -#define FBIINIT1_VIDEO_TIMING_SOURCE(val) (((val) >> 20) & 3) -#define FBIINIT1_ENABLE_24BPP_OUTPUT(val) (((val) >> 22) & 1) -#define FBIINIT1_ENABLE_SLI(val) (((val) >> 23) & 1) -#define FBIINIT1_X_VIDEO_TILES_BIT5(val) (((val) >> 24) & 1) /* voodoo 2 only */ -#define FBIINIT1_ENABLE_EDGE_FILTER(val) (((val) >> 25) & 1) -#define FBIINIT1_INVERT_VID_CLK_2X(val) (((val) >> 26) & 1) -#define FBIINIT1_VID_CLK_2X_SEL_DELAY(val) (((val) >> 27) & 3) -#define FBIINIT1_VID_CLK_DELAY(val) (((val) >> 29) & 3) -#define FBIINIT1_DISABLE_FAST_READAHEAD(val) (((val) >> 31) & 1) - -#define FBIINIT2_DISABLE_DITHER_SUB(val) (((val) >> 0) & 1) -#define FBIINIT2_DRAM_BANKING(val) (((val) >> 1) & 1) -#define FBIINIT2_ENABLE_TRIPLE_BUF(val) (((val) >> 4) & 1) -#define FBIINIT2_ENABLE_FAST_RAS_READ(val) (((val) >> 5) & 1) -#define FBIINIT2_ENABLE_GEN_DRAM_OE(val) (((val) >> 6) & 1) -#define FBIINIT2_ENABLE_FAST_READWRITE(val) (((val) >> 7) & 1) -#define FBIINIT2_ENABLE_PASSTHRU_DITHER(val) (((val) >> 8) & 1) -#define FBIINIT2_SWAP_BUFFER_ALGORITHM(val) (((val) >> 9) & 3) -#define FBIINIT2_VIDEO_BUFFER_OFFSET(val) (((val) >> 11) & 0x1ff) -#define FBIINIT2_ENABLE_DRAM_BANKING(val) (((val) >> 20) & 1) -#define FBIINIT2_ENABLE_DRAM_READ_FIFO(val) (((val) >> 21) & 1) -#define FBIINIT2_ENABLE_DRAM_REFRESH(val) (((val) >> 22) & 1) -#define FBIINIT2_REFRESH_LOAD_VALUE(val) (((val) >> 23) & 0x1ff) - -#define FBIINIT3_TRI_REGISTER_REMAP(val) (((val) >> 0) & 1) -#define FBIINIT3_VIDEO_FIFO_THRESH(val) (((val) >> 1) & 0x1f) -#define FBIINIT3_DISABLE_TMUS(val) (((val) >> 6) & 1) -#define FBIINIT3_FBI_MEMORY_TYPE(val) (((val) >> 8) & 7) -#define FBIINIT3_VGA_PASS_RESET_VAL(val) (((val) >> 11) & 1) -#define FBIINIT3_HARDCODE_PCI_BASE(val) (((val) >> 12) & 1) -#define FBIINIT3_FBI2TREX_DELAY(val) (((val) >> 13) & 0xf) -#define FBIINIT3_TREX2FBI_DELAY(val) (((val) >> 17) & 0x1f) -#define FBIINIT3_YORIGIN_SUBTRACT(val) (((val) >> 22) & 0x3ff) - -#define FBIINIT4_PCI_READ_WAITS(val) (((val) >> 0) & 1) -#define FBIINIT4_ENABLE_LFB_READAHEAD(val) (((val) >> 1) & 1) -#define FBIINIT4_MEMORY_FIFO_LWM(val) (((val) >> 2) & 0x3f) -#define FBIINIT4_MEMORY_FIFO_START_ROW(val) (((val) >> 8) & 0x3ff) -#define FBIINIT4_MEMORY_FIFO_STOP_ROW(val) (((val) >> 18) & 0x3ff) -#define FBIINIT4_VIDEO_CLOCKING_DELAY(val) (((val) >> 29) & 7) /* voodoo 2 only */ - -#define FBIINIT5_DISABLE_PCI_STOP(val) (((val) >> 0) & 1) /* voodoo 2 only */ -#define FBIINIT5_PCI_SLAVE_SPEED(val) (((val) >> 1) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_OUTPUT_WIDTH(val) (((val) >> 2) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_17_OUTPUT(val) (((val) >> 3) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_18_OUTPUT(val) (((val) >> 4) & 1) /* voodoo 2 only */ -#define FBIINIT5_GENERIC_STRAPPING(val) (((val) >> 5) & 0xf) /* voodoo 2 only */ -#define FBIINIT5_BUFFER_ALLOCATION(val) (((val) >> 9) & 3) /* voodoo 2 only */ -#define FBIINIT5_DRIVE_VID_CLK_SLAVE(val) (((val) >> 11) & 1) /* voodoo 2 only */ -#define FBIINIT5_DRIVE_DAC_DATA_16(val) (((val) >> 12) & 1) /* voodoo 2 only */ -#define FBIINIT5_VCLK_INPUT_SELECT(val) (((val) >> 13) & 1) /* voodoo 2 only */ -#define FBIINIT5_MULTI_CVG_DETECT(val) (((val) >> 14) & 1) /* voodoo 2 only */ -#define FBIINIT5_SYNC_RETRACE_READS(val) (((val) >> 15) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_RHBORDER_COLOR(val) (((val) >> 16) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_LHBORDER_COLOR(val) (((val) >> 17) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_BVBORDER_COLOR(val) (((val) >> 18) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_TVBORDER_COLOR(val) (((val) >> 19) & 1) /* voodoo 2 only */ -#define FBIINIT5_DOUBLE_HORIZ(val) (((val) >> 20) & 1) /* voodoo 2 only */ -#define FBIINIT5_DOUBLE_VERT(val) (((val) >> 21) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_16BIT_GAMMA(val) (((val) >> 22) & 1) /* voodoo 2 only */ -#define FBIINIT5_INVERT_DAC_HSYNC(val) (((val) >> 23) & 1) /* voodoo 2 only */ -#define FBIINIT5_INVERT_DAC_VSYNC(val) (((val) >> 24) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_24BIT_DACDATA(val) (((val) >> 25) & 1) /* voodoo 2 only */ -#define FBIINIT5_ENABLE_INTERLACING(val) (((val) >> 26) & 1) /* voodoo 2 only */ -#define FBIINIT5_DAC_DATA_18_CONTROL(val) (((val) >> 27) & 1) /* voodoo 2 only */ -#define FBIINIT5_RASTERIZER_UNIT_MODE(val) (((val) >> 30) & 3) /* voodoo 2 only */ - -#define FBIINIT6_WINDOW_ACTIVE_COUNTER(val) (((val) >> 0) & 7) /* voodoo 2 only */ -#define FBIINIT6_WINDOW_DRAG_COUNTER(val) (((val) >> 3) & 0x1f) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNC_MASTER(val) (((val) >> 8) & 1) /* voodoo 2 only */ -#define FBIINIT6_DAC_DATA_22_OUTPUT(val) (((val) >> 9) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_DATA_23_OUTPUT(val) (((val) >> 11) & 3) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNCIN_OUTPUT(val) (((val) >> 13) & 3) /* voodoo 2 only */ -#define FBIINIT6_SLI_SYNCOUT_OUTPUT(val) (((val) >> 15) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_RD_OUTPUT(val) (((val) >> 17) & 3) /* voodoo 2 only */ -#define FBIINIT6_DAC_WR_OUTPUT(val) (((val) >> 19) & 3) /* voodoo 2 only */ -#define FBIINIT6_PCI_FIFO_LWM_RDY(val) (((val) >> 21) & 0x7f) /* voodoo 2 only */ -#define FBIINIT6_VGA_PASS_N_OUTPUT(val) (((val) >> 28) & 3) /* voodoo 2 only */ -#define FBIINIT6_X_VIDEO_TILES_BIT0(val) (((val) >> 30) & 1) /* voodoo 2 only */ - -#define FBIINIT7_GENERIC_STRAPPING(val) (((val) >> 0) & 0xff) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_ENABLE(val) (((val) >> 8) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_MEMORY_STORE(val) (((val) >> 9) & 1) /* voodoo 2 only */ -#define FBIINIT7_DISABLE_CMDFIFO_HOLES(val) (((val) >> 10) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_READ_THRESH(val) (((val) >> 11) & 0x1f) /* voodoo 2 only */ -#define FBIINIT7_SYNC_CMDFIFO_WRITES(val) (((val) >> 16) & 1) /* voodoo 2 only */ -#define FBIINIT7_SYNC_CMDFIFO_READS(val) (((val) >> 17) & 1) /* voodoo 2 only */ -#define FBIINIT7_RESET_PCI_PACKER(val) (((val) >> 18) & 1) /* voodoo 2 only */ -#define FBIINIT7_ENABLE_CHROMA_STUFF(val) (((val) >> 19) & 1) /* voodoo 2 only */ -#define FBIINIT7_CMDFIFO_PCI_TIMEOUT(val) (((val) >> 20) & 0x7f) /* voodoo 2 only */ -#define FBIINIT7_ENABLE_TEXTURE_BURST(val) (((val) >> 27) & 1) /* voodoo 2 only */ - -#define TEXMODE_ENABLE_PERSPECTIVE(val) (((val) >> 0) & 1) -#define TEXMODE_MINIFICATION_FILTER(val) (((val) >> 1) & 1) -#define TEXMODE_MAGNIFICATION_FILTER(val) (((val) >> 2) & 1) -#define TEXMODE_CLAMP_NEG_W(val) (((val) >> 3) & 1) -#define TEXMODE_ENABLE_LOD_DITHER(val) (((val) >> 4) & 1) -#define TEXMODE_NCC_TABLE_SELECT(val) (((val) >> 5) & 1) -#define TEXMODE_CLAMP_S(val) (((val) >> 6) & 1) -#define TEXMODE_CLAMP_T(val) (((val) >> 7) & 1) -#define TEXMODE_FORMAT(val) (((val) >> 8) & 0xf) -#define TEXMODE_TC_ZERO_OTHER(val) (((val) >> 12) & 1) -#define TEXMODE_TC_SUB_CLOCAL(val) (((val) >> 13) & 1) -#define TEXMODE_TC_MSELECT(val) (((val) >> 14) & 7) -#define TEXMODE_TC_REVERSE_BLEND(val) (((val) >> 17) & 1) -#define TEXMODE_TC_ADD_ACLOCAL(val) (((val) >> 18) & 3) -#define TEXMODE_TC_INVERT_OUTPUT(val) (((val) >> 20) & 1) -#define TEXMODE_TCA_ZERO_OTHER(val) (((val) >> 21) & 1) -#define TEXMODE_TCA_SUB_CLOCAL(val) (((val) >> 22) & 1) -#define TEXMODE_TCA_MSELECT(val) (((val) >> 23) & 7) -#define TEXMODE_TCA_REVERSE_BLEND(val) (((val) >> 26) & 1) -#define TEXMODE_TCA_ADD_ACLOCAL(val) (((val) >> 27) & 3) -#define TEXMODE_TCA_INVERT_OUTPUT(val) (((val) >> 29) & 1) -#define TEXMODE_TRILINEAR(val) (((val) >> 30) & 1) -#define TEXMODE_SEQ_8_DOWNLD(val) (((val) >> 31) & 1) - -#define TEXLOD_LODMIN(val) (((val) >> 0) & 0x3f) -#define TEXLOD_LODMAX(val) (((val) >> 6) & 0x3f) -#define TEXLOD_LODBIAS(val) (((val) >> 12) & 0x3f) -#define TEXLOD_LOD_ODD(val) (((val) >> 18) & 1) -#define TEXLOD_LOD_TSPLIT(val) (((val) >> 19) & 1) -#define TEXLOD_LOD_S_IS_WIDER(val) (((val) >> 20) & 1) -#define TEXLOD_LOD_ASPECT(val) (((val) >> 21) & 3) -#define TEXLOD_LOD_ZEROFRAC(val) (((val) >> 23) & 1) -#define TEXLOD_TMULTIBASEADDR(val) (((val) >> 24) & 1) -#define TEXLOD_TDATA_SWIZZLE(val) (((val) >> 25) & 1) -#define TEXLOD_TDATA_SWAP(val) (((val) >> 26) & 1) -#define TEXLOD_TDIRECT_WRITE(val) (((val) >> 27) & 1) /* Voodoo 2 only */ - -#define TEXDETAIL_DETAIL_MAX(val) (((val) >> 0) & 0xff) -#define TEXDETAIL_DETAIL_BIAS(val) (((val) >> 8) & 0x3f) -#define TEXDETAIL_DETAIL_SCALE(val) (((val) >> 14) & 7) -#define TEXDETAIL_RGB_MIN_FILTER(val) (((val) >> 17) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_RGB_MAG_FILTER(val) (((val) >> 18) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_ALPHA_MIN_FILTER(val) (((val) >> 19) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_ALPHA_MAG_FILTER(val) (((val) >> 20) & 1) /* Voodoo 2 only */ -#define TEXDETAIL_SEPARATE_RGBA_FILTER(val) (((val) >> 21) & 1) /* Voodoo 2 only */ - -#define TREXINIT_SEND_TMU_CONFIG(val) (((val) >> 18) & 1) - - - -struct voodoo_state; -struct poly_extra_data; -class voodoo_device; - -struct rgba -{ -#ifdef LSB_FIRST - UINT8 b, g, r, a; -#else - UINT8 a, r, g, b; -#endif -}; - - -union voodoo_reg -{ - INT32 i; - UINT32 u; - float f; - rgba rgb; -}; - - - -struct voodoo_stats -{ - UINT8 lastkey; /* last key state */ - UINT8 display; /* display stats? */ - INT32 swaps; /* total swaps */ - INT32 stalls; /* total stalls */ - INT32 total_triangles; /* total triangles */ - INT32 total_pixels_in; /* total pixels in */ - INT32 total_pixels_out; /* total pixels out */ - INT32 total_chroma_fail; /* total chroma fail */ - INT32 total_zfunc_fail; /* total z func fail */ - INT32 total_afunc_fail; /* total a func fail */ - INT32 total_clipped; /* total clipped */ - INT32 total_stippled; /* total stippled */ - INT32 lfb_writes; /* LFB writes */ - INT32 lfb_reads; /* LFB reads */ - INT32 reg_writes; /* register writes */ - INT32 reg_reads; /* register reads */ - INT32 tex_writes; /* texture writes */ - INT32 texture_mode[16]; /* 16 different texture modes */ - UINT8 render_override; /* render override */ - char buffer[1024]; /* string */ -}; - - -/* note that this structure is an even 64 bytes long */ -struct stats_block -{ - INT32 pixels_in; /* pixels in statistic */ - INT32 pixels_out; /* pixels out statistic */ - INT32 chroma_fail; /* chroma test fail statistic */ - INT32 zfunc_fail; /* z function test fail statistic */ - INT32 afunc_fail; /* alpha function test fail statistic */ - INT32 clip_fail; /* clipping fail statistic */ - INT32 stipple_count; /* stipple statistic */ - INT32 filler[64/4 - 7]; /* pad this structure to 64 bytes */ -}; - - -struct fifo_state -{ - UINT32 * base; /* base of the FIFO */ - INT32 size; /* size of the FIFO */ - INT32 in; /* input pointer */ - INT32 out; /* output pointer */ -}; - - -struct cmdfifo_info -{ - UINT8 enable; /* enabled? */ - UINT8 count_holes; /* count holes? */ - UINT32 base; /* base address in framebuffer RAM */ - UINT32 end; /* end address in framebuffer RAM */ - UINT32 rdptr; /* current read pointer */ - UINT32 amin; /* minimum address */ - UINT32 amax; /* maximum address */ - UINT32 depth; /* current depth */ - UINT32 holes; /* number of holes */ -}; - - -struct pci_state -{ - fifo_state fifo; /* PCI FIFO */ - UINT32 init_enable; /* initEnable value */ - UINT8 stall_state; /* state of the system if we're stalled */ - UINT8 op_pending; /* true if an operation is pending */ - attotime op_end_time; /* time when the pending operation ends */ - emu_timer * continue_timer; /* timer to use to continue processing */ - UINT32 fifo_mem[64*2]; /* memory backing the PCI FIFO */ -}; - - -struct ncc_table -{ - UINT8 dirty; /* is the texel lookup dirty? */ - voodoo_reg * reg; /* pointer to our registers */ - INT32 ir[4], ig[4], ib[4]; /* I values for R,G,B */ - INT32 qr[4], qg[4], qb[4]; /* Q values for R,G,B */ - INT32 y[16]; /* Y values */ - rgb_t * palette; /* pointer to associated RGB palette */ - rgb_t * palettea; /* pointer to associated ARGB palette */ - rgb_t texel[256]; /* texel lookup */ -}; - - -struct tmu_state -{ - UINT8 * ram; /* pointer to our RAM */ - UINT32 mask; /* mask to apply to pointers */ - voodoo_reg * reg; /* pointer to our register base */ - UINT32 regdirty; /* true if the LOD/mode/base registers have changed */ - - UINT32 texaddr_mask; /* mask for texture address */ - UINT8 texaddr_shift; /* shift for texture address */ - - INT64 starts, startt; /* starting S,T (14.18) */ - INT64 startw; /* starting W (2.30) */ - INT64 dsdx, dtdx; /* delta S,T per X */ - INT64 dwdx; /* delta W per X */ - INT64 dsdy, dtdy; /* delta S,T per Y */ - INT64 dwdy; /* delta W per Y */ - - INT32 lodmin, lodmax; /* min, max LOD values */ - INT32 lodbias; /* LOD bias */ - UINT32 lodmask; /* mask of available LODs */ - UINT32 lodoffset[9]; /* offset of texture base for each LOD */ - INT32 detailmax; /* detail clamp */ - INT32 detailbias; /* detail bias */ - UINT8 detailscale; /* detail scale */ - - UINT32 wmask; /* mask for the current texture width */ - UINT32 hmask; /* mask for the current texture height */ - - UINT32 bilinear_mask; /* mask for bilinear resolution (0xf0 for V1, 0xff for V2) */ - - ncc_table ncc[2]; /* two NCC tables */ - - rgb_t * lookup; /* currently selected lookup */ - rgb_t * texel[16]; /* texel lookups for each format */ - - rgb_t palette[256]; /* palette lookup table */ - rgb_t palettea[256]; /* palette+alpha lookup table */ -}; - - -struct tmu_shared_state -{ - rgb_t rgb332[256]; /* RGB 3-3-2 lookup table */ - rgb_t alpha8[256]; /* alpha 8-bit lookup table */ - rgb_t int8[256]; /* intensity 8-bit lookup table */ - rgb_t ai44[256]; /* alpha, intensity 4-4 lookup table */ - - rgb_t rgb565[65536]; /* RGB 5-6-5 lookup table */ - rgb_t argb1555[65536]; /* ARGB 1-5-5-5 lookup table */ - rgb_t argb4444[65536]; /* ARGB 4-4-4-4 lookup table */ -}; - - -struct setup_vertex -{ - float x, y; /* X, Y coordinates */ - float a, r, g, b; /* A, R, G, B values */ - float z, wb; /* Z and broadcast W values */ - float w0, s0, t0; /* W, S, T for TMU 0 */ - float w1, s1, t1; /* W, S, T for TMU 1 */ -}; - - -struct fbi_state -{ - UINT8 * ram; /* pointer to frame buffer RAM */ - UINT32 mask; /* mask to apply to pointers */ - UINT32 rgboffs[3]; /* word offset to 3 RGB buffers */ - UINT32 auxoffs; /* word offset to 1 aux buffer */ - - UINT8 frontbuf; /* front buffer index */ - UINT8 backbuf; /* back buffer index */ - UINT8 swaps_pending; /* number of pending swaps */ - UINT8 video_changed; /* did the frontbuffer video change? */ - - UINT32 yorigin; /* Y origin subtract value */ - UINT32 lfb_base; /* base of LFB in memory */ - UINT8 lfb_stride; /* stride of LFB accesses in bits */ - - UINT32 width; /* width of current frame buffer */ - UINT32 height; /* height of current frame buffer */ - UINT32 xoffs; /* horizontal offset (back porch) */ - UINT32 yoffs; /* vertical offset (back porch) */ - UINT32 vsyncscan; /* vertical sync scanline */ - UINT32 rowpixels; /* pixels per row */ - UINT32 tile_width; /* width of video tiles */ - UINT32 tile_height; /* height of video tiles */ - UINT32 x_tiles; /* number of tiles in the X direction */ - - emu_timer * vblank_timer; /* VBLANK timer */ - UINT8 vblank; /* VBLANK state */ - UINT8 vblank_count; /* number of VBLANKs since last swap */ - UINT8 vblank_swap_pending; /* a swap is pending, waiting for a vblank */ - UINT8 vblank_swap; /* swap when we hit this count */ - UINT8 vblank_dont_swap; /* don't actually swap when we hit this point */ - - /* triangle setup info */ - UINT8 cheating_allowed; /* allow cheating? */ - INT32 sign; /* triangle sign */ - INT16 ax, ay; /* vertex A x,y (12.4) */ - INT16 bx, by; /* vertex B x,y (12.4) */ - INT16 cx, cy; /* vertex C x,y (12.4) */ - INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ - INT32 startz; /* starting Z (20.12) */ - INT64 startw; /* starting W (16.32) */ - INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ - INT32 dzdx; /* delta Z per X */ - INT64 dwdx; /* delta W per X */ - INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ - INT32 dzdy; /* delta Z per Y */ - INT64 dwdy; /* delta W per Y */ - - stats_block lfb_stats; /* LFB-access statistics */ - - UINT8 sverts; /* number of vertices ready */ - setup_vertex svert[3]; /* 3 setup vertices */ - - fifo_state fifo; /* framebuffer memory fifo */ - cmdfifo_info cmdfifo[2]; /* command FIFOs */ - - UINT8 fogblend[64]; /* 64-entry fog table */ - UINT8 fogdelta[64]; /* 64-entry fog table */ - UINT8 fogdelta_mask; /* mask for for delta (0xff for V1, 0xfc for V2) */ - - rgb_t pen[65536]; /* mapping from pixels to pens */ - rgb_t clut[512]; /* clut gamma data */ - UINT8 clut_dirty; /* do we need to recompute? */ -}; - - -struct dac_state -{ - UINT8 reg[8]; /* 8 registers */ - UINT8 read_result; /* pending read result */ -}; - - -struct raster_info -{ - raster_info * next; /* pointer to next entry with the same hash */ - poly_draw_scanline_func callback; /* callback pointer */ - UINT8 is_generic; /* TRUE if this is one of the generic rasterizers */ - UINT8 display; /* display index */ - UINT32 hits; /* how many hits (pixels) we've used this for */ - UINT32 polys; /* how many polys we've used this for */ - UINT32 eff_color_path; /* effective fbzColorPath value */ - UINT32 eff_alpha_mode; /* effective alphaMode value */ - UINT32 eff_fog_mode; /* effective fogMode value */ - UINT32 eff_fbz_mode; /* effective fbzMode value */ - UINT32 eff_tex_mode_0; /* effective textureMode value for TMU #0 */ - UINT32 eff_tex_mode_1; /* effective textureMode value for TMU #1 */ - UINT32 hash; -}; - - -struct poly_extra_data -{ - voodoo_device * device; - raster_info * info; /* pointer to rasterizer information */ - - INT16 ax, ay; /* vertex A x,y (12.4) */ - INT32 startr, startg, startb, starta; /* starting R,G,B,A (12.12) */ - INT32 startz; /* starting Z (20.12) */ - INT64 startw; /* starting W (16.32) */ - INT32 drdx, dgdx, dbdx, dadx; /* delta R,G,B,A per X */ - INT32 dzdx; /* delta Z per X */ - INT64 dwdx; /* delta W per X */ - INT32 drdy, dgdy, dbdy, dady; /* delta R,G,B,A per Y */ - INT32 dzdy; /* delta Z per Y */ - INT64 dwdy; /* delta W per Y */ - - INT64 starts0, startt0; /* starting S,T (14.18) */ - INT64 startw0; /* starting W (2.30) */ - INT64 ds0dx, dt0dx; /* delta S,T per X */ - INT64 dw0dx; /* delta W per X */ - INT64 ds0dy, dt0dy; /* delta S,T per Y */ - INT64 dw0dy; /* delta W per Y */ - INT32 lodbase0; /* used during rasterization */ - - INT64 starts1, startt1; /* starting S,T (14.18) */ - INT64 startw1; /* starting W (2.30) */ - INT64 ds1dx, dt1dx; /* delta S,T per X */ - INT64 dw1dx; /* delta W per X */ - INT64 ds1dy, dt1dy; /* delta S,T per Y */ - INT64 dw1dy; /* delta W per Y */ - INT32 lodbase1; /* used during rasterization */ - - UINT16 dither[16]; /* dither matrix, for fastfill */ -}; - - -struct banshee_info -{ - UINT32 io[0x40]; /* I/O registers */ - UINT32 agp[0x80]; /* AGP registers */ - UINT8 vga[0x20]; /* VGA registers */ - UINT8 crtc[0x27]; /* VGA CRTC registers */ - UINT8 seq[0x05]; /* VGA sequencer registers */ - UINT8 gc[0x05]; /* VGA graphics controller registers */ - UINT8 att[0x15]; /* VGA attribute registers */ - UINT8 attff; /* VGA attribute flip-flop */ - - UINT32 blt_regs[0x20]; /* 2D Blitter registers */ - UINT32 blt_dst_base; - UINT32 blt_dst_x; - UINT32 blt_dst_y; - UINT32 blt_dst_width; - UINT32 blt_dst_height; - UINT32 blt_dst_stride; - UINT32 blt_dst_bpp; - UINT32 blt_cmd; - UINT32 blt_src_base; - UINT32 blt_src_x; - UINT32 blt_src_y; - UINT32 blt_src_width; - UINT32 blt_src_height; - UINT32 blt_src_stride; - UINT32 blt_src_bpp; -}; - - -typedef voodoo_reg rgb_union; - - - - /*************************************************************************** CONSTANTS @@ -1746,7 +61,10 @@ enum FUNCTION PROTOTYPES ***************************************************************************/ -struct stats_block; +int voodoo_update(device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect); +int voodoo_get_type(device_t *device); +int voodoo_is_stalled(device_t *device); +void voodoo_set_init_enable(device_t *device, UINT32 newval); /* ----- device interface ----- */ @@ -1768,6 +86,7 @@ public: DECLARE_WRITE32_MEMBER( voodoo_w ); // access to legacy token + struct voodoo_state *token() const { assert(m_token != nullptr); return m_token; } void common_start_voodoo(UINT8 type); UINT8 m_fbmem; @@ -1777,112 +96,15 @@ public: const char * m_cputag; devcb_write_line m_vblank; devcb_write_line m_stall; - - TIMER_CALLBACK_MEMBER( vblank_off_callback ); - TIMER_CALLBACK_MEMBER( stall_cpu_callback ); - TIMER_CALLBACK_MEMBER( vblank_callback ); - - static void voodoo_postload(voodoo_device *vd); - - int voodoo_update(bitmap_rgb32 &bitmap, const rectangle &cliprect); - int voodoo_get_type(); - int voodoo_is_stalled(); - void voodoo_set_init_enable(UINT32 newval); - - // not all of these need to be static, review. - - static void check_stalled_cpu(voodoo_device* vd, attotime current_time); - static void flush_fifos( voodoo_device* vd, attotime current_time); - static void init_fbi(voodoo_device *vd, fbi_state *f, void *memory, int fbmem); - static INT32 register_w(voodoo_device *vd, offs_t offset, UINT32 data); - static INT32 swapbuffer(voodoo_device *vd, UINT32 data); - static void init_tmu(voodoo_device *vd, tmu_state *t, voodoo_reg *reg, void *memory, int tmem); - static INT32 lfb_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask); - static INT32 texture_w(voodoo_device *vd, offs_t offset, UINT32 data); - static INT32 lfb_direct_w(voodoo_device *vd, offs_t offset, UINT32 data, UINT32 mem_mask); - static INT32 banshee_2d_w(voodoo_device *vd, offs_t offset, UINT32 data); - static void stall_cpu(voodoo_device *vd, int state, attotime current_time); - static void soft_reset(voodoo_device *vd); - static void recompute_video_memory(voodoo_device *vd); - static INT32 fastfill(voodoo_device *vd); - static INT32 triangle(voodoo_device *vd); - static INT32 begin_triangle(voodoo_device *vd); - static INT32 draw_triangle(voodoo_device *vd); - static INT32 setup_and_draw_triangle(voodoo_device *vd); - static INT32 triangle_create_work_item(voodoo_device* vd,UINT16 *drawbuf, int texcount); - static raster_info *add_rasterizer(voodoo_device *vd, const raster_info *cinfo); - static raster_info *find_rasterizer(voodoo_device *vd, int texcount); - static void dump_rasterizer_stats(voodoo_device *vd); - static void init_tmu_shared(tmu_shared_state *s); - - static void swap_buffers(voodoo_device *vd); - static UINT32 cmdfifo_execute(voodoo_device *vd, cmdfifo_info *f); - static INT32 cmdfifo_execute_if_ready(voodoo_device* vd, cmdfifo_info *f); - static void cmdfifo_w(voodoo_device *vd, cmdfifo_info *f, offs_t offset, UINT32 data); - - static void raster_fastfill(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); - static void raster_generic_0tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); - static void raster_generic_1tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); - static void raster_generic_2tmu(void *dest, INT32 scanline, const poly_extent *extent, const void *extradata, int threadid); - -#define RASTERIZER_HEADER(name) \ - static void raster_##name(void *destbase, INT32 y, const poly_extent *extent, const void *extradata, int threadid); \ - -#define RASTERIZER_ENTRY(fbzcp, alpha, fog, fbz, tex0, tex1) \ - RASTERIZER_HEADER(fbzcp##_##alpha##_##fog##_##fbz##_##tex0##_##tex1) \ - -#include "voodoo_rast.inc" - -#undef RASTERIZER_ENTRY - - protected: // device-level overrides virtual void device_config_complete() override; virtual void device_stop() override; virtual void device_reset() override; -public: - // voodoo_state - UINT8 index; /* index of board */ - voodoo_device *device; /* pointer to our containing device */ - screen_device *screen; /* the screen we are acting on */ - device_t *cpu; /* the CPU we interact with */ - UINT8 vd_type; /* type of system */ - UINT8 chipmask; /* mask for which chips are available */ - UINT32 freq; /* operating frequency */ - attoseconds_t attoseconds_per_cycle; /* attoseconds per cycle */ - UINT32 extra_cycles; /* extra cycles not yet accounted for */ - int trigger; /* trigger used for stalling */ - - voodoo_reg reg[0x400]; /* raw registers */ - const UINT8 * regaccess; /* register access array */ - const char *const * regnames; /* register names array */ - UINT8 alt_regmap; /* enable alternate register map? */ - - pci_state pci; /* PCI state */ - dac_state dac; /* DAC state */ - - fbi_state fbi; /* FBI states */ - tmu_state tmu[MAX_TMU]; /* TMU states */ - tmu_shared_state tmushare; /* TMU shared state */ - banshee_info banshee; /* Banshee state */ - - legacy_poly_manager * poly; /* polygon manager */ - stats_block * thread_stats; /* per-thread statistics */ - - voodoo_stats stats; /* internal statistics */ - - offs_t last_status_pc; /* PC of last status description (for logging) */ - UINT32 last_status_value; /* value of last status read (for logging) */ - - int next_rasterizer; /* next rasterizer index */ - raster_info rasterizer[MAX_RASTERIZERS]; /* array of rasterizers */ - raster_info * raster_hash[RASTER_HASH_SIZE]; /* hash table of rasterizers */ - - bool send_config; - UINT32 tmu_config; - +private: + // internal state + struct voodoo_state *m_token; }; class voodoo_1_device : public voodoo_device diff --git a/src/devices/video/voodoo_pci.cpp b/src/devices/video/voodoo_pci.cpp index 9d34442f08b..7570a007efb 100644 --- a/src/devices/video/voodoo_pci.cpp +++ b/src/devices/video/voodoo_pci.cpp @@ -153,7 +153,7 @@ void voodoo_pci_device::map_extra(UINT64 memory_window_start, UINT64 memory_wind UINT32 voodoo_pci_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - return m_voodoo->voodoo_update(bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; + return voodoo_update(m_voodoo, bitmap, cliprect) ? 0 : UPDATE_HAS_NOT_CHANGED; } // PCI bus control @@ -170,7 +170,7 @@ WRITE32_MEMBER (voodoo_pci_device::pcictrl_w) switch (offset) { case 0x0/4: // The address map starts at 0x40 // HW initEnable - m_voodoo->voodoo_set_init_enable(data); + voodoo_set_init_enable(m_voodoo, data); logerror("%06X:voodoo_pci_device pcictrl_w to offset %02X = %08X & %08X\n", space.device().safe_pc(), offset*4, data, mem_mask); break; default: |