summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/bus/a2bus/a2pic.cpp20
-rw-r--r--src/devices/bus/abcbus/lux10828.cpp8
-rw-r--r--src/devices/bus/amiga/zorro/zorro.h4
-rw-r--r--src/devices/bus/centronics/epson_lx810l.cpp4
-rw-r--r--src/devices/bus/isa/3c505.cpp22
-rw-r--r--src/devices/bus/isa/3c505.h1
-rw-r--r--src/devices/bus/isa/omti8621.cpp108
-rw-r--r--src/devices/bus/isa/omti8621.h3
-rw-r--r--src/devices/bus/isa/sc499.cpp25
-rw-r--r--src/devices/bus/isa/sc499.h1
-rw-r--r--src/devices/bus/m5/rom.cpp63
-rw-r--r--src/devices/bus/m5/rom.h50
-rw-r--r--src/devices/bus/m5/slot.cpp276
-rw-r--r--src/devices/bus/m5/slot.h118
-rw-r--r--src/devices/bus/neogeo/bootleg_prot.cpp4
-rw-r--r--src/devices/bus/ti99_peb/bwg.cpp2
-rw-r--r--src/devices/bus/ti99_peb/hfdc.cpp4
-rw-r--r--src/devices/cpu/alto2/alto2cpu.cpp4
-rw-r--r--src/devices/cpu/arm/arm.cpp6
-rw-r--r--src/devices/cpu/asap/asap.cpp8
-rw-r--r--src/devices/cpu/dsp32/dsp32.cpp12
-rw-r--r--src/devices/cpu/h8/h8.cpp2
-rw-r--r--src/devices/cpu/hd61700/hd61700.cpp4
-rw-r--r--src/devices/cpu/hphybrid/hphybrid.cpp9
-rw-r--r--src/devices/cpu/i386/i386.cpp92
-rw-r--r--src/devices/cpu/i386/i386.h9
-rw-r--r--src/devices/cpu/i386/i386op32.inc16
-rw-r--r--src/devices/cpu/i386/i386ops.h1
-rw-r--r--src/devices/cpu/i386/i386ops.inc63
-rw-r--r--src/devices/cpu/i386/i386priv.h41
-rw-r--r--src/devices/cpu/i386/i486ops.inc8
-rw-r--r--src/devices/cpu/i4004/i4004.cpp4
-rw-r--r--src/devices/cpu/i8089/i8089.cpp4
-rw-r--r--src/devices/cpu/i86/i86.txt15
-rw-r--r--src/devices/cpu/i960/i960.cpp8
-rw-r--r--src/devices/cpu/m37710/m37710il.h8
-rw-r--r--src/devices/cpu/m6800/6800dasm.cpp16
-rw-r--r--src/devices/cpu/m6800/6800ops.inc26
-rw-r--r--src/devices/cpu/m6800/6800tbl.inc28
-rw-r--r--src/devices/cpu/m6800/m6800.cpp4
-rw-r--r--src/devices/cpu/m6800/m6800.h2
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp36
-rw-r--r--src/devices/cpu/m68000/m68kcpu.h4
-rw-r--r--src/devices/cpu/m68000/m68kmake.cpp2
-rw-r--r--src/devices/cpu/m68000/m68kops.cpp34874
-rw-r--r--src/devices/cpu/m68000/m68kops.h1995
-rw-r--r--src/devices/cpu/m68000/makefile20
-rw-r--r--src/devices/cpu/mips/mips3.cpp67
-rw-r--r--src/devices/cpu/mips/mips3.h6
-rw-r--r--src/devices/cpu/mips/mips3com.cpp12
-rw-r--r--src/devices/cpu/mips/mips3com.h1
-rw-r--r--src/devices/cpu/mips/mips3drc.cpp6
-rw-r--r--src/devices/cpu/pdp1/pdp1.cpp2
-rw-r--r--src/devices/cpu/pdp1/tx0.cpp2
-rw-r--r--src/devices/cpu/powerpc/ppc.h7
-rw-r--r--src/devices/cpu/powerpc/ppccom.cpp28
-rw-r--r--src/devices/cpu/powerpc/ppcdrc.cpp10
-rw-r--r--src/devices/cpu/se3208/se3208.cpp32
-rw-r--r--src/devices/cpu/t11/t11.cpp4
-rw-r--r--src/devices/cpu/vtlb.cpp310
-rw-r--r--src/devices/cpu/vtlb.h88
-rw-r--r--src/devices/cpu/z80/z80.cpp144
-rw-r--r--src/devices/cpu/z80/z80.h4
-rw-r--r--src/devices/imagedev/floppy.cpp8
-rw-r--r--src/devices/machine/com8116.cpp42
-rw-r--r--src/devices/machine/com8116.h6
-rw-r--r--src/devices/machine/corvushd.cpp2
-rw-r--r--src/devices/machine/dmac.cpp39
-rw-r--r--src/devices/machine/dmac.h2
-rw-r--r--src/devices/machine/hp_taco.cpp1467
-rw-r--r--src/devices/machine/hp_taco.h169
-rw-r--r--src/devices/machine/i8271.cpp20
-rw-r--r--src/devices/machine/i8271.h1
-rw-r--r--src/devices/machine/k033906.cpp4
-rw-r--r--src/devices/machine/k033906.h4
-rw-r--r--src/devices/machine/pic8259.cpp5
-rw-r--r--src/devices/machine/ram.cpp13
-rw-r--r--src/devices/machine/ram.h4
-rw-r--r--src/devices/sound/votrax.h2
-rw-r--r--src/devices/video/ef9364.cpp359
-rw-r--r--src/devices/video/ef9364.h104
-rw-r--r--src/devices/video/ef9365.cpp2
-rw-r--r--src/devices/video/i82730.cpp4
-rw-r--r--src/devices/video/jangou_blitter.cpp194
-rw-r--r--src/devices/video/jangou_blitter.h71
-rw-r--r--src/devices/video/mc6845.cpp3
-rw-r--r--src/devices/video/upd7220.cpp9
-rw-r--r--src/devices/video/vooddefs.h1848
-rw-r--r--src/devices/video/voodoo.cpp2875
-rw-r--r--src/devices/video/voodoo.h1794
-rw-r--r--src/devices/video/voodoo_pci.cpp4
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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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 = &REG_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], &reg[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], &reg[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: