summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author arbee <rb6502@users.noreply.github.com>2023-08-30 14:11:14 -0400
committer arbee <rb6502@users.noreply.github.com>2023-08-30 14:11:14 -0400
commitc06c4fd132b8cddbb8e5dcb28b6c88fe34b9295b (patch)
treefdbd2fbb99da7f659a20648893f0042e2e62e1a9
parent39c569dc069d530bc14e2e75843f751b075ac61f (diff)
cpu/z80: Revert a94254a while we figure out the severe performance regressions. [R. Belmont, holub]
-rw-r--r--src/devices/cpu/z80/kc82.cpp22
-rw-r--r--src/devices/cpu/z80/kc82.h9
-rw-r--r--src/devices/cpu/z80/z80.cpp5152
-rw-r--r--src/devices/cpu/z80/z80.h392
-rw-r--r--src/mame/amstrad/amstrad.cpp68
-rw-r--r--src/mame/amstrad/amstrad.h4
-rw-r--r--src/mame/amstrad/amstrad_m.cpp201
-rw-r--r--src/mame/msx/msx.cpp100
8 files changed, 3117 insertions, 2831 deletions
diff --git a/src/devices/cpu/z80/kc82.cpp b/src/devices/cpu/z80/kc82.cpp
index 6dc575139de..440a4498c0a 100644
--- a/src/devices/cpu/z80/kc82.cpp
+++ b/src/devices/cpu/z80/kc82.cpp
@@ -206,7 +206,7 @@ bool kc82_device::memory_translate(int spacenum, int intention, offs_t &address,
// rm - read one byte from memory
//-------------------------------------------------
-u8 kc82_device::data_read(u16 addr)
+u8 kc82_device::rm(u16 addr)
{
return m_data.read_byte(addr + m_mmu_base[addr >> 10]);
}
@@ -216,7 +216,7 @@ u8 kc82_device::data_read(u16 addr)
// wm - write one byte to memory
//-------------------------------------------------
-void kc82_device::data_write(u16 addr, u8 value)
+void kc82_device::wm(u16 addr, u8 value)
{
m_data.write_byte(addr + m_mmu_base[addr >> 10], value);
}
@@ -226,9 +226,10 @@ void kc82_device::data_write(u16 addr, u8 value)
// rop - read opcode
//-------------------------------------------------
-u8 kc82_device::opcode_read()
+u8 kc82_device::rop()
{
u32 pc = m_pc.w.l + m_mmu_base[m_pc.b.h >> 2];
+ m_pc.w.l++;
// no refresh
return m_opcodes.read_byte(pc);
}
@@ -238,8 +239,21 @@ u8 kc82_device::opcode_read()
// arg - read 8-bit argument
//-------------------------------------------------
-u8 kc82_device::arg_read()
+u8 kc82_device::arg()
{
u32 pc = m_pc.w.l + m_mmu_base[m_pc.b.h >> 2];
+ m_pc.w.l++;
return m_args.read_byte(pc);
}
+
+
+//-------------------------------------------------
+// arg16 - read 16-bit argument
+//-------------------------------------------------
+
+u16 kc82_device::arg16()
+{
+ u16 d16 = arg();
+ d16 |= u16(arg()) << 8;
+ return d16;
+}
diff --git a/src/devices/cpu/z80/kc82.h b/src/devices/cpu/z80/kc82.h
index 3c7f05cd70d..1d0a0965870 100644
--- a/src/devices/cpu/z80/kc82.h
+++ b/src/devices/cpu/z80/kc82.h
@@ -41,10 +41,11 @@ protected:
virtual bool memory_translate(int spacenum, int intention, offs_t &address, address_space *&target_space) override;
// z80_device overrides
- virtual u8 data_read(u16 addr) override;
- virtual void data_write(u16 addr, u8 value) override;
- virtual u8 opcode_read() override;
- virtual u8 arg_read() override;
+ virtual u8 rm(u16 addr) override;
+ virtual void wm(u16 addr, u8 value) override;
+ virtual u8 rop() override;
+ virtual u8 arg() override;
+ virtual u16 arg16() override;
// MMU access
u8 mmu_r(offs_t offset);
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 6d396783a03..16988b788c8 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -16,13 +16,14 @@
* - LD A,I/R P/V flag reset glitch is fixed on CMOS Z80
* - OUT (C),0 outputs 0 on NMOS Z80, $FF on CMOS Z80
* - SCF/CCF X/Y flags is ((flags | A) & 0x28) on SGS/SHARP/ZiLOG NMOS Z80,
- * (flags & A & 0x28).
+ * (flags & A & 0x28) on NEC NMOS Z80, other models unknown.
* However, recent findings say that SCF/CCF X/Y results depend on whether
- * or not the previous instruction touched the flag register.
+ * or not the previous instruction touched the flag register. And the exact
+ * behaviour on NEC Z80 is still unknown.
* This Z80 emulator assumes a ZiLOG NMOS model.
*
* Changes in 0.243:
- * Foundation for M cycles emulation. Currently we preserve cc_* tables with total timings.
+ * Fundation for M cycles emulation. Currently we preserve cc_* tables with total timings.
* execute_run() behavior (simplified) ...
* Before:
* + fetch opcode
@@ -108,7 +109,7 @@
* now also adjust the r register depending on the skipped opcodes.
* Changes in 2.2:
* - Fixed bugs in CPL, SCF and CCF instructions flag handling.
- * - Changed variable ea and arg16() function to u32; this
+ * - Changed variable ea and arg16() function to uint32_t; this
* produces slightly more efficient code.
* - The DD/FD XY CB opcodes where XY is 40-7F and Y is not 6/E
* are changed to calls to the X6/XE opcodes to reduce object size.
@@ -123,21 +124,14 @@
#include "z80.h"
#include "z80dasm.h"
-#define LOG_UNDOC (1U << 1)
-#define LOG_INT (1U << 2)
-#define LOG_TIME (1U << 3)
-
-#define VERBOSE ( LOG_UNDOC /*| LOG_INT*/ )
-#include "logmacro.h"
-
-#define LOGUNDOC(...) LOGMASKED(LOG_UNDOC, __VA_ARGS__)
-#define LOGINT(...) LOGMASKED(LOG_INT, __VA_ARGS__)
-
+#define VERBOSE 0
/* On an NMOS Z80, if LD A,I or LD A,R is interrupted, P/V flag gets reset,
even if IFF2 was set before this instruction. This issue was fixed on
the CMOS Z80, so until knowing (most) Z80 types on hardware, it's disabled */
-#define HAS_LDAIR_QUIRK 0
+#define HAS_LDAIR_QUIRK 0
+
+#define LOG(x) do { if (VERBOSE) logerror x; } while (0)
/****************************************************************************/
@@ -170,7 +164,6 @@
#define AF m_af.w.l
#define A m_af.b.h
#define F m_af.b.l
-#define Q m_q
#define BCD m_bc.d
#define BC m_bc.w.l
@@ -202,41 +195,225 @@
#define WZ_L m_wz.b.l
-#define TADR m_m_shared_addr.w // Typically represents values from A0..15 pins. 16bit input in steps.
-#define TADR_H m_m_shared_addr.b.h
-#define TADR_L m_m_shared_addr.b.l
-#define TDAT m_m_shared_data.w // 16bit input(if use as second parameter) or output in steps.
-#define TDAT2 m_m_shared_data2.w
-#define TDAT_H m_m_shared_data.b.h
-#define TDAT_L m_m_shared_data.b.l
-#define TDAT8 m_m_shared_data.b.l // Typically represents values from D0..8 pins. 8bit input or output in steps.
-
static bool tables_initialised = false;
-static u8 SZ[256]; /* zero and sign flags */
-static u8 SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */
-static u8 SZP[256]; /* zero, sign and parity flags */
-static u8 SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
-static u8 SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
-
-static u8 SZHVC_add[2*256*256];
-static u8 SZHVC_sub[2*256*256];
-
-
-/***************************************************************
- * define an opcode builder helpers
- ***************************************************************/
-#define DEF(name) z80_device::ops_type z80_device::name { return op_builder(*this).foo([]() {
-#define CALL })->call([&]() -> ops_type { return
-#define THEN })->add([&]() {
-#define IF(cond) })->do_if([&]() -> bool { return cond;
-#define ELSE })->do_else()->foo([]() {
-#define ENDIF })->edo()->foo([]() {
-#define ENDDEF })->get_steps(); }
+static uint8_t SZ[256]; /* zero and sign flags */
+static uint8_t SZ_BIT[256]; /* zero, sign and parity/overflow (=zero) flags for BIT opcode */
+static uint8_t SZP[256]; /* zero, sign and parity flags */
+static uint8_t SZHV_inc[256]; /* zero, sign, half carry and overflow flags INC r8 */
+static uint8_t SZHV_dec[256]; /* zero, sign, half carry and overflow flags DEC r8 */
+
+static uint8_t SZHVC_add[2*256*256];
+static uint8_t SZHVC_sub[2*256*256];
+
+static const uint8_t cc_op[0x100] = {
+ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
+ 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
+ 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4,
+ 7,10,13, 6,11,11,10, 4, 7,11,13, 6, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+ 5,10,10,10,10,11, 7,11, 5,10,10, 4,10,17, 7,11, /* cb -> cc_cb */
+ 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 4, 7,11, /* dd -> cc_xy */
+ 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 4, 7,11, /* ed -> cc_ed */
+ 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 4, 7,11 /* fd -> cc_xy */
+};
+
+static const u8 cc_cb[0x100] = {
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4,
+ 4, 4, 4, 4, 4, 4,11, 4, 4, 4, 4, 4, 4, 4,11, 4
+};
+
+static const uint8_t cc_ed[0x100] = {
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 8, 8,11,16, 4,10, 4, 5, 8, 8,11,16, 4,10, 4, 5,
+ 8, 8,11,16, 4,10, 4, 5, 8, 8,11,16, 4,10, 4, 5,
+ 8, 8,11,16, 4,10, 4,14, 8, 8,11,16, 4,10, 4,14,
+ 8, 8,11,16, 4,10, 4, 4, 8, 8,11,16, 4,10, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 12,12,12,12,4, 4, 4, 4,12,12,12,12, 4, 4, 4, 4,
+ 12,12,12,12,4, 4, 4, 4,12,12,12,12, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
+};
+
+/* ix/iy: with the exception of (i+offset) opcodes, for total add t-states from main_opcode_table[DD/FD] == 4 */
+static const uint8_t cc_xy[0x100] = {
+ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
+ 8,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
+ 7,10,16, 6, 4, 4, 7, 4, 7,11,16, 6, 4, 4, 7, 4,
+ 7,10,13, 6,19,19,15, 4, 7,11,13, 6, 4, 4, 7, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 15,15,15,15,15,15, 4,15, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 4, 4, 4, 4, 4, 4,15, 4, 4, 4, 4, 4, 4, 4,15, 4,
+ 5,10,10,10,10,11, 7,11, 5,10,10, 7,10,17, 7,11, /* cb -> cc_xycb */
+ 5,10,10,11,10,11, 7,11, 5, 4,10,11,10, 4, 7,11, /* dd -> cc_xy again */
+ 5,10,10,19,10,11, 7,11, 5, 4,10, 4,10, 4, 7,11, /* ed -> cc_ed */
+ 5,10,10, 4,10,11, 7,11, 5, 6,10, 4,10, 4, 7,11 /* fd -> cc_xy again */
+};
+
+static const uint8_t cc_xycb[0x100] = {
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12
+};
+
+/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */
+static const uint8_t cc_ex[0x100] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */
+ 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */
+ 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2
+};
+
+#define m_cc_dd m_cc_xy
+#define m_cc_fd m_cc_xy
+
+/***************************************************************
+ * define an opcode function
+ ***************************************************************/
+#define OP(prefix,opcode) inline void z80_device::prefix##_##opcode()
/***************************************************************
* adjust cycle count by n T-states
***************************************************************/
-#define T(icount) execute_cycles(icount)
+#define CC(prefix,opcode) do { m_icount_executing += m_cc_##prefix == nullptr ? 0 : m_cc_##prefix[opcode]; } while (0)
+
+#define T(icount) do { \
+ m_icount -= icount; \
+ m_icount_executing -= icount; \
+} while (0)
+
+// T Memory Address
+#define MTM (m_mtm_cycles)
+
+#define EXEC(prefix,opcode) do { \
+ unsigned op = opcode; \
+ CC(prefix,op); \
+ switch(op) \
+ { \
+ case 0x00:prefix##_##00();break; case 0x01:prefix##_##01();break; case 0x02:prefix##_##02();break; case 0x03:prefix##_##03();break; \
+ case 0x04:prefix##_##04();break; case 0x05:prefix##_##05();break; case 0x06:prefix##_##06();break; case 0x07:prefix##_##07();break; \
+ case 0x08:prefix##_##08();break; case 0x09:prefix##_##09();break; case 0x0a:prefix##_##0a();break; case 0x0b:prefix##_##0b();break; \
+ case 0x0c:prefix##_##0c();break; case 0x0d:prefix##_##0d();break; case 0x0e:prefix##_##0e();break; case 0x0f:prefix##_##0f();break; \
+ case 0x10:prefix##_##10();break; case 0x11:prefix##_##11();break; case 0x12:prefix##_##12();break; case 0x13:prefix##_##13();break; \
+ case 0x14:prefix##_##14();break; case 0x15:prefix##_##15();break; case 0x16:prefix##_##16();break; case 0x17:prefix##_##17();break; \
+ case 0x18:prefix##_##18();break; case 0x19:prefix##_##19();break; case 0x1a:prefix##_##1a();break; case 0x1b:prefix##_##1b();break; \
+ case 0x1c:prefix##_##1c();break; case 0x1d:prefix##_##1d();break; case 0x1e:prefix##_##1e();break; case 0x1f:prefix##_##1f();break; \
+ case 0x20:prefix##_##20();break; case 0x21:prefix##_##21();break; case 0x22:prefix##_##22();break; case 0x23:prefix##_##23();break; \
+ case 0x24:prefix##_##24();break; case 0x25:prefix##_##25();break; case 0x26:prefix##_##26();break; case 0x27:prefix##_##27();break; \
+ case 0x28:prefix##_##28();break; case 0x29:prefix##_##29();break; case 0x2a:prefix##_##2a();break; case 0x2b:prefix##_##2b();break; \
+ case 0x2c:prefix##_##2c();break; case 0x2d:prefix##_##2d();break; case 0x2e:prefix##_##2e();break; case 0x2f:prefix##_##2f();break; \
+ case 0x30:prefix##_##30();break; case 0x31:prefix##_##31();break; case 0x32:prefix##_##32();break; case 0x33:prefix##_##33();break; \
+ case 0x34:prefix##_##34();break; case 0x35:prefix##_##35();break; case 0x36:prefix##_##36();break; case 0x37:prefix##_##37();break; \
+ case 0x38:prefix##_##38();break; case 0x39:prefix##_##39();break; case 0x3a:prefix##_##3a();break; case 0x3b:prefix##_##3b();break; \
+ case 0x3c:prefix##_##3c();break; case 0x3d:prefix##_##3d();break; case 0x3e:prefix##_##3e();break; case 0x3f:prefix##_##3f();break; \
+ case 0x40:prefix##_##40();break; case 0x41:prefix##_##41();break; case 0x42:prefix##_##42();break; case 0x43:prefix##_##43();break; \
+ case 0x44:prefix##_##44();break; case 0x45:prefix##_##45();break; case 0x46:prefix##_##46();break; case 0x47:prefix##_##47();break; \
+ case 0x48:prefix##_##48();break; case 0x49:prefix##_##49();break; case 0x4a:prefix##_##4a();break; case 0x4b:prefix##_##4b();break; \
+ case 0x4c:prefix##_##4c();break; case 0x4d:prefix##_##4d();break; case 0x4e:prefix##_##4e();break; case 0x4f:prefix##_##4f();break; \
+ case 0x50:prefix##_##50();break; case 0x51:prefix##_##51();break; case 0x52:prefix##_##52();break; case 0x53:prefix##_##53();break; \
+ case 0x54:prefix##_##54();break; case 0x55:prefix##_##55();break; case 0x56:prefix##_##56();break; case 0x57:prefix##_##57();break; \
+ case 0x58:prefix##_##58();break; case 0x59:prefix##_##59();break; case 0x5a:prefix##_##5a();break; case 0x5b:prefix##_##5b();break; \
+ case 0x5c:prefix##_##5c();break; case 0x5d:prefix##_##5d();break; case 0x5e:prefix##_##5e();break; case 0x5f:prefix##_##5f();break; \
+ case 0x60:prefix##_##60();break; case 0x61:prefix##_##61();break; case 0x62:prefix##_##62();break; case 0x63:prefix##_##63();break; \
+ case 0x64:prefix##_##64();break; case 0x65:prefix##_##65();break; case 0x66:prefix##_##66();break; case 0x67:prefix##_##67();break; \
+ case 0x68:prefix##_##68();break; case 0x69:prefix##_##69();break; case 0x6a:prefix##_##6a();break; case 0x6b:prefix##_##6b();break; \
+ case 0x6c:prefix##_##6c();break; case 0x6d:prefix##_##6d();break; case 0x6e:prefix##_##6e();break; case 0x6f:prefix##_##6f();break; \
+ case 0x70:prefix##_##70();break; case 0x71:prefix##_##71();break; case 0x72:prefix##_##72();break; case 0x73:prefix##_##73();break; \
+ case 0x74:prefix##_##74();break; case 0x75:prefix##_##75();break; case 0x76:prefix##_##76();break; case 0x77:prefix##_##77();break; \
+ case 0x78:prefix##_##78();break; case 0x79:prefix##_##79();break; case 0x7a:prefix##_##7a();break; case 0x7b:prefix##_##7b();break; \
+ case 0x7c:prefix##_##7c();break; case 0x7d:prefix##_##7d();break; case 0x7e:prefix##_##7e();break; case 0x7f:prefix##_##7f();break; \
+ case 0x80:prefix##_##80();break; case 0x81:prefix##_##81();break; case 0x82:prefix##_##82();break; case 0x83:prefix##_##83();break; \
+ case 0x84:prefix##_##84();break; case 0x85:prefix##_##85();break; case 0x86:prefix##_##86();break; case 0x87:prefix##_##87();break; \
+ case 0x88:prefix##_##88();break; case 0x89:prefix##_##89();break; case 0x8a:prefix##_##8a();break; case 0x8b:prefix##_##8b();break; \
+ case 0x8c:prefix##_##8c();break; case 0x8d:prefix##_##8d();break; case 0x8e:prefix##_##8e();break; case 0x8f:prefix##_##8f();break; \
+ case 0x90:prefix##_##90();break; case 0x91:prefix##_##91();break; case 0x92:prefix##_##92();break; case 0x93:prefix##_##93();break; \
+ case 0x94:prefix##_##94();break; case 0x95:prefix##_##95();break; case 0x96:prefix##_##96();break; case 0x97:prefix##_##97();break; \
+ case 0x98:prefix##_##98();break; case 0x99:prefix##_##99();break; case 0x9a:prefix##_##9a();break; case 0x9b:prefix##_##9b();break; \
+ case 0x9c:prefix##_##9c();break; case 0x9d:prefix##_##9d();break; case 0x9e:prefix##_##9e();break; case 0x9f:prefix##_##9f();break; \
+ case 0xa0:prefix##_##a0();break; case 0xa1:prefix##_##a1();break; case 0xa2:prefix##_##a2();break; case 0xa3:prefix##_##a3();break; \
+ case 0xa4:prefix##_##a4();break; case 0xa5:prefix##_##a5();break; case 0xa6:prefix##_##a6();break; case 0xa7:prefix##_##a7();break; \
+ case 0xa8:prefix##_##a8();break; case 0xa9:prefix##_##a9();break; case 0xaa:prefix##_##aa();break; case 0xab:prefix##_##ab();break; \
+ case 0xac:prefix##_##ac();break; case 0xad:prefix##_##ad();break; case 0xae:prefix##_##ae();break; case 0xaf:prefix##_##af();break; \
+ case 0xb0:prefix##_##b0();break; case 0xb1:prefix##_##b1();break; case 0xb2:prefix##_##b2();break; case 0xb3:prefix##_##b3();break; \
+ case 0xb4:prefix##_##b4();break; case 0xb5:prefix##_##b5();break; case 0xb6:prefix##_##b6();break; case 0xb7:prefix##_##b7();break; \
+ case 0xb8:prefix##_##b8();break; case 0xb9:prefix##_##b9();break; case 0xba:prefix##_##ba();break; case 0xbb:prefix##_##bb();break; \
+ case 0xbc:prefix##_##bc();break; case 0xbd:prefix##_##bd();break; case 0xbe:prefix##_##be();break; case 0xbf:prefix##_##bf();break; \
+ case 0xc0:prefix##_##c0();break; case 0xc1:prefix##_##c1();break; case 0xc2:prefix##_##c2();break; case 0xc3:prefix##_##c3();break; \
+ case 0xc4:prefix##_##c4();break; case 0xc5:prefix##_##c5();break; case 0xc6:prefix##_##c6();break; case 0xc7:prefix##_##c7();break; \
+ case 0xc8:prefix##_##c8();break; case 0xc9:prefix##_##c9();break; case 0xca:prefix##_##ca();break; case 0xcb:prefix##_##cb();break; \
+ case 0xcc:prefix##_##cc();break; case 0xcd:prefix##_##cd();break; case 0xce:prefix##_##ce();break; case 0xcf:prefix##_##cf();break; \
+ case 0xd0:prefix##_##d0();break; case 0xd1:prefix##_##d1();break; case 0xd2:prefix##_##d2();break; case 0xd3:prefix##_##d3();break; \
+ case 0xd4:prefix##_##d4();break; case 0xd5:prefix##_##d5();break; case 0xd6:prefix##_##d6();break; case 0xd7:prefix##_##d7();break; \
+ case 0xd8:prefix##_##d8();break; case 0xd9:prefix##_##d9();break; case 0xda:prefix##_##da();break; case 0xdb:prefix##_##db();break; \
+ case 0xdc:prefix##_##dc();break; case 0xdd:prefix##_##dd();break; case 0xde:prefix##_##de();break; case 0xdf:prefix##_##df();break; \
+ case 0xe0:prefix##_##e0();break; case 0xe1:prefix##_##e1();break; case 0xe2:prefix##_##e2();break; case 0xe3:prefix##_##e3();break; \
+ case 0xe4:prefix##_##e4();break; case 0xe5:prefix##_##e5();break; case 0xe6:prefix##_##e6();break; case 0xe7:prefix##_##e7();break; \
+ case 0xe8:prefix##_##e8();break; case 0xe9:prefix##_##e9();break; case 0xea:prefix##_##ea();break; case 0xeb:prefix##_##eb();break; \
+ case 0xec:prefix##_##ec();break; case 0xed:prefix##_##ed();break; case 0xee:prefix##_##ee();break; case 0xef:prefix##_##ef();break; \
+ case 0xf0:prefix##_##f0();break; case 0xf1:prefix##_##f1();break; case 0xf2:prefix##_##f2();break; case 0xf3:prefix##_##f3();break; \
+ case 0xf4:prefix##_##f4();break; case 0xf5:prefix##_##f5();break; case 0xf6:prefix##_##f6();break; case 0xf7:prefix##_##f7();break; \
+ case 0xf8:prefix##_##f8();break; case 0xf9:prefix##_##f9();break; case 0xfa:prefix##_##fa();break; case 0xfb:prefix##_##fb();break; \
+ case 0xfc:prefix##_##fc();break; case 0xfd:prefix##_##fd();break; case 0xfe:prefix##_##fe();break; case 0xff:prefix##_##ff();break; \
+ } \
+ if(m_icount_executing > 0) T(m_icount_executing); else m_icount_executing = 0; \
+} while (0)
/***************************************************************
* Enter halt state; write 1 to callback on first execution
@@ -265,113 +442,81 @@ inline void z80_device::leave_halt()
/***************************************************************
* Input a byte from given I/O port
***************************************************************/
-DEF( in() )
- THEN
- TDAT8 = m_io.read_interruptible(TADR);
- T(m_iorq_cycles);
-ENDDEF
+inline uint8_t z80_device::in(uint16_t port)
+{
+ u8 res = m_io.read_byte(port);
+ T(4);
+ return res;
+}
/***************************************************************
* Output a byte to given I/O port
***************************************************************/
-DEF( out() )
- THEN
- m_io.write_interruptible(TADR, TDAT8);
- T(m_iorq_cycles);
-ENDDEF
+inline void z80_device::out(uint16_t port, uint8_t value)
+{
+ m_io.write_byte(port, value);
+ T(4);
+}
/***************************************************************
* Read a byte from given memory location
***************************************************************/
-inline u8 z80_device::data_read(u16 addr)
+uint8_t z80_device::rm(uint16_t addr)
{
- return m_data.read_interruptible(translate_memory_address(addr));
+ u8 res = m_data.read_byte(translate_memory_address(addr));
+ T(MTM);
+ return res;
}
-DEF( rm() )
- THEN
- TDAT8 = data_read(TADR);
- T(m_memrq_cycles);
-ENDDEF
-
-DEF( rm_reg() )
- CALL rm();
- CALL nomreq_addr(1);
-ENDDEF
+uint8_t z80_device::rm_reg(uint16_t addr)
+{
+ u8 res = rm(addr);
+ nomreq_addr(addr, 1);
+ return res;
+}
/***************************************************************
* Read a word from given memory location
- * in: TADR
- * out: TDAT
- ***************************************************************/
-DEF( rm16() )
- CALL rm();
- THEN
- TDAT_H = TDAT_L;
- TADR++;
- CALL rm();
- THEN
- std::swap(TDAT_H, TDAT_L);
-ENDDEF
-
+ ***************************************************************/
inline void z80_device::rm16(uint16_t addr, PAIR &r)
{
- r.b.l = data_read(addr);
- T(m_memrq_cycles);
- r.b.h = data_read(addr+1);
- T(m_memrq_cycles);
+ r.b.l = rm(addr);
+ r.b.h = rm(addr+1);
}
/***************************************************************
* Write a byte to given memory location
***************************************************************/
-inline void z80_device::data_write(u16 addr, u8 value) {
- m_data.write_interruptible(translate_memory_address((u32)addr), value);
+void z80_device::wm(uint16_t addr, uint8_t value)
+{
+ // As we don't count changes between read and write, simply adjust to the end of requested.
+ if(m_icount_executing != MTM) T(m_icount_executing - MTM);
+ m_data.write_byte(translate_memory_address(addr), value);
+ T(MTM);
}
-DEF( wm() )
- THEN
- data_write(TADR, TDAT8);
- T(m_memrq_cycles);
-ENDDEF
-
/***************************************************************
* Write a word to given memory location
- * in: TADR, TDAT
***************************************************************/
-DEF( wm16() )
- CALL wm();
- THEN
- TADR++;
- TDAT8=TDAT_H;
- CALL wm();
-ENDDEF
+inline void z80_device::wm16(uint16_t addr, PAIR &r)
+{
+ m_icount_executing -= MTM;
+ wm(addr, r.b.l);
+ m_icount_executing += MTM;
+ wm(addr+1, r.b.h);
+}
/***************************************************************
* Write a word to (SP)
- * in: TDAT
- ***************************************************************/
-DEF( wm16_sp() )
- THEN
- SP--;
- THEN
- data_write(SPD, TDAT_H);
- T(m_memrq_cycles);
- THEN
- SP--;
- THEN
- data_write(SPD, TDAT_L);
- T(m_memrq_cycles);
-ENDDEF
-
+ ***************************************************************/
inline void z80_device::wm16_sp(PAIR &r)
{
SP--;
- data_write(SPD, r.b.h);
- T(m_memrq_cycles);
+ m_icount_executing -= MTM;
+ wm(SPD, r.b.h);
+ m_icount_executing += MTM;
SP--;
- data_write(SPD, r.b.l);
- T(m_memrq_cycles);
+ wm(SPD, r.b.l);
}
/***************************************************************
@@ -379,284 +524,264 @@ inline void z80_device::wm16_sp(PAIR &r)
* reading opcodes. In case of system with memory mapped I/O,
* this function can be used to greatly speed up emulation
***************************************************************/
-inline u8 z80_device::opcode_read()
+uint8_t z80_device::rop()
{
- return m_opcodes.read_byte(translate_memory_address(PCD));
-}
+ // Use leftovers from previous instruction. Mainly to support recursive EXEC(.., rop())
+ if(m_icount_executing) T(m_icount_executing);
+ uint8_t res = m_opcodes.read_byte(translate_memory_address(PCD));
+ T(execute_min_cycles());
+ m_refresh_cb((m_i << 8) | (m_r2 & 0x80) | (m_r & 0x7f), 0x00, 0xff);
+ T(execute_min_cycles());
+ PC++;
+ m_r++;
-DEF( rop() )
- THEN
- TDAT8 = opcode_read();
- T(m_m1_cycles - 2);
- THEN
- m_refresh_cb((m_i << 8) | (m_r2 & 0x80) | (m_r & 0x7f), 0x00, 0xff);
- T(2);
- THEN
- PC++;
- m_r++;
- Q = m_qtemp;
- m_qtemp = YF | XF;
-ENDDEF
+ return res;
+}
/****************************************************************
* arg() is identical to rop() except it is used
* for reading opcode arguments. This difference can be used to
* support systems that use different encoding mechanisms for
* opcodes and opcode arguments
- * out: TDAT8
***************************************************************/
-inline u8 z80_device::arg_read()
+uint8_t z80_device::arg()
{
- return m_args.read_byte(translate_memory_address(PCD));
+ u8 res = m_args.read_byte(translate_memory_address(PCD));
+ T(MTM);
+ PC++;
+
+ return res;
}
-DEF( arg() )
- THEN
- TDAT8 = arg_read();
- T(m_memrq_cycles);
- THEN
- PC++;
-ENDDEF
+uint16_t z80_device::arg16()
+{
+ u8 const res = arg();
-DEF( arg16() )
- CALL arg();
- THEN
- TDAT_H = TDAT_L;
- CALL arg();
- THEN
- std::swap(TDAT_H, TDAT_L);
-ENDDEF
+ return (u16(arg()) << 8) | res;
+}
/***************************************************************
* Calculate the effective address EA of an opcode using
* IX+offset resp. IY+offset addressing.
***************************************************************/
-DEF( eax() )
- CALL arg();
- THEN
- m_ea = (u32)(u16)(IX + (s8)TDAT8);
- WZ = m_ea;
-ENDDEF
+inline void z80_device::eax()
+{
+ m_ea = (uint32_t)(uint16_t)(IX + (int8_t)arg());
+ WZ = m_ea;
+}
-DEF( eay() )
- CALL arg();
- THEN
- m_ea = (u32)(u16)(IY + (s8)TDAT8);
- WZ = m_ea;
-ENDDEF
+inline void z80_device::eay()
+{
+ m_ea = (uint32_t)(uint16_t)(IY + (int8_t)arg());
+ WZ = m_ea;
+}
/***************************************************************
* POP
***************************************************************/
-DEF( pop() )
- THEN
- TDAT_L = data_read(SPD);
- T(m_memrq_cycles);
- THEN
- SP++;
- THEN
- TDAT_H = data_read(SPD);
- T(m_memrq_cycles);
- THEN
- SP++;
-ENDDEF
+inline void z80_device::pop(PAIR &r)
+{
+ rm16(SPD, r);
+ SP += 2;
+}
/***************************************************************
* PUSH
- * in: TDAT
***************************************************************/
-DEF( push() )
- CALL nomreq_ir(1);
- CALL wm16_sp();
-ENDDEF
+inline void z80_device::push(PAIR &r)
+{
+ nomreq_ir(1);
+ wm16_sp(r);
+}
/***************************************************************
* JP
***************************************************************/
-DEF( jp() )
- CALL arg16();
- THEN
- PCD = TDAT;
- WZ = PC;
-ENDDEF
+inline void z80_device::jp(void)
+{
+ PCD = arg16();
+ WZ = PCD;
+}
/***************************************************************
* JP_COND
***************************************************************/
-DEF( jp_cond() )
- IF ( TDAT8 )
- CALL arg16();
- THEN
- PC=TDAT;
- WZ=PCD;
- ELSE
- /* implicit do PC += 2 */
- CALL arg16();
- THEN
- WZ=TDAT;
- ENDIF
-ENDDEF
+inline void z80_device::jp_cond(bool cond)
+{
+ if (cond)
+ {
+ PCD = arg16();
+ WZ = PCD;
+ }
+ else
+ WZ = arg16(); /* implicit do PC += 2 */
+}
/***************************************************************
* JR
***************************************************************/
-DEF( jr() )
- CALL arg();
- THEN
- TADR=PCD-1;
- CALL nomreq_addr(5);
- THEN
- PC += (s8)TDAT8;
- WZ = PC;
-ENDDEF
+inline void z80_device::jr()
+{
+ int8_t a = (int8_t)arg(); /* arg() also increments PC */
+ nomreq_addr(PCD-1, 5);
+ PC += a; /* so don't do PC += arg() */
+ WZ = PC;
+}
/***************************************************************
* JR_COND
***************************************************************/
-DEF( jr_cond(u8 opcode) )
- IF ( TDAT8 )
- CALL jr();
- ELSE
- CALL arg();
- ENDIF
-ENDDEF
+inline void z80_device::jr_cond(bool cond, uint8_t opcode)
+{
+ if (cond)
+ {
+ CC(ex, opcode);
+ jr();
+ }
+ else
+ {
+ arg();
+ //nomreq_addr(PCD, 3);
+ //PC++;
+ }
+}
/***************************************************************
* CALL
***************************************************************/
-DEF( call() )
- CALL arg16();
- THEN
- m_ea=TDAT;
- TADR=PCD-1;
- CALL nomreq_addr(1);
- THEN
- WZ = m_ea;
- TDAT=PC;
- CALL wm16_sp();
- THEN
- PCD=m_ea;
-ENDDEF
+inline void z80_device::call()
+{
+ m_ea = arg16();
+ nomreq_addr(PCD-1, 1);
+ WZ = m_ea;
+ wm16_sp(m_pc);
+ PCD = m_ea;
+}
/***************************************************************
* CALL_COND
***************************************************************/
-DEF( call_cond(u8 opcode) )
- IF ( TDAT8 )
- CALL call();
- ELSE
- CALL arg16();
- THEN
- WZ=TDAT;
- ENDIF
-ENDDEF
+inline void z80_device::call_cond(bool cond, uint8_t opcode)
+{
+ if (cond)
+ {
+ CC(ex, opcode);
+ m_ea = arg16();
+ nomreq_addr(PCD-1, 1);
+ WZ = m_ea;
+ wm16_sp(m_pc);
+ PCD = m_ea;
+ }
+ else
+ WZ = arg16(); /* implicit call PC+=2; */
+}
/***************************************************************
* RET_COND
***************************************************************/
-DEF( ret_cond(u8 opcode) )
- CALL nomreq_ir(1);
- IF ( TDAT8 )
- CALL pop();
- THEN
- PC=TDAT;
- WZ = PC;
- ENDIF
-ENDDEF
+inline void z80_device::ret_cond(bool cond, uint8_t opcode)
+{
+ nomreq_ir(1);
+ if (cond)
+ {
+ CC(ex, opcode);
+ pop(m_pc);
+ WZ = PC;
+ }
+}
/***************************************************************
* RETN
***************************************************************/
-DEF( retn() )
- CALL pop();
- THEN
- PC=TDAT;
- LOGINT("RETN m_iff1:%d m_iff2:%d\n", m_iff1, m_iff2);
- WZ = PC;
- m_iff1 = m_iff2;
-ENDDEF
+inline void z80_device::retn()
+{
+ LOG(("Z80 RETN m_iff1:%d m_iff2:%d\n", m_iff1, m_iff2));
+ pop(m_pc);
+ WZ = PC;
+ m_iff1 = m_iff2;
+}
/***************************************************************
* RETI
***************************************************************/
-DEF( reti() )
- CALL pop();
- THEN
- PC=TDAT;
- WZ = PC;
- m_iff1 = m_iff2;
- daisy_call_reti_device();
-ENDDEF
+inline void z80_device::reti()
+{
+ pop(m_pc);
+ WZ = PC;
+ m_iff1 = m_iff2;
+ daisy_call_reti_device();
+}
/***************************************************************
* LD R,A
***************************************************************/
-DEF( ld_r_a() )
- CALL nomreq_ir(1);
- THEN
- m_r = A;
- m_r2 = A & 0x80; /* keep bit 7 of r */
-ENDDEF
+inline void z80_device::ld_r_a()
+{
+ nomreq_ir(1);
+ m_r = A;
+ m_r2 = A & 0x80; /* keep bit 7 of r */
+}
/***************************************************************
* LD A,R
***************************************************************/
-DEF( ld_a_r() )
- CALL nomreq_ir(1);
- THEN
- A = (m_r & 0x7f) | m_r2;
- set_f((F & CF) | SZ[A] | (m_iff2 << 2));
- m_after_ldair = true;
-ENDDEF
+inline void z80_device::ld_a_r()
+{
+ nomreq_ir(1);
+ A = (m_r & 0x7f) | m_r2;
+ F = (F & CF) | SZ[A] | (m_iff2 << 2);
+ m_after_ldair = true;
+}
/***************************************************************
* LD I,A
***************************************************************/
-DEF( ld_i_a() )
- CALL nomreq_ir(1);
- THEN
- m_i = A;
-ENDDEF
+inline void z80_device::ld_i_a()
+{
+ nomreq_ir(1);
+ m_i = A;
+}
/***************************************************************
* LD A,I
***************************************************************/
-DEF( ld_a_i() )
- CALL nomreq_ir(1);
- THEN
- A = m_i;
- set_f((F & CF) | SZ[A] | (m_iff2 << 2));
- m_after_ldair = true;
-ENDDEF
+inline void z80_device::ld_a_i()
+{
+ nomreq_ir(1);
+ A = m_i;
+ F = (F & CF) | SZ[A] | (m_iff2 << 2);
+ m_after_ldair = true;
+}
/***************************************************************
* RST
***************************************************************/
-DEF( rst(u16 addr) )
- THEN
- TDAT=PC;
- CALL push();
- })->add([&, addr]() { // single occurrence. does it worth to have macro?
- PC=addr;
- WZ=PC;
-ENDDEF
+inline void z80_device::rst(uint16_t addr)
+{
+ //nomreq_ir(1);
+ push(m_pc);
+ PCD = addr;
+ WZ = PC;
+}
/***************************************************************
* INC r8
***************************************************************/
-inline void z80_device::inc(u8 &r)
+inline uint8_t z80_device::inc(uint8_t value)
{
- ++r;
- set_f((F & CF) | SZHV_inc[r]);
+ uint8_t res = value + 1;
+ F = (F & CF) | SZHV_inc[res];
+ return (uint8_t)res;
}
/***************************************************************
* DEC r8
***************************************************************/
-inline void z80_device::dec(u8 &r)
+inline uint8_t z80_device::dec(uint8_t value)
{
- --r;
- set_f((F & CF) | SZHV_dec[r]);
+ uint8_t res = value - 1;
+ F = (F & CF) | SZHV_dec[res];
+ return res;
}
/***************************************************************
@@ -665,7 +790,7 @@ inline void z80_device::dec(u8 &r)
inline void z80_device::rlca()
{
A = (A << 1) | (A >> 7);
- set_f((F & (SF | ZF | PF)) | (A & (YF | XF | CF)));
+ F = (F & (SF | ZF | PF)) | (A & (YF | XF | CF));
}
/***************************************************************
@@ -673,7 +798,7 @@ inline void z80_device::rlca()
***************************************************************/
inline void z80_device::rrca()
{
- set_f((F & (SF | ZF | PF)) | (A & CF));
+ F = (F & (SF | ZF | PF)) | (A & CF);
A = (A >> 1) | (A << 7);
F |= (A & (YF | XF));
}
@@ -683,9 +808,9 @@ inline void z80_device::rrca()
***************************************************************/
inline void z80_device::rla()
{
- u8 res = (A << 1) | (F & CF);
- u8 c = (A & 0x80) ? CF : 0;
- set_f((F & (SF | ZF | PF)) | c | (res & (YF | XF)));
+ uint8_t res = (A << 1) | (F & CF);
+ uint8_t c = (A & 0x80) ? CF : 0;
+ F = (F & (SF | ZF | PF)) | c | (res & (YF | XF));
A = res;
}
@@ -694,91 +819,79 @@ inline void z80_device::rla()
***************************************************************/
inline void z80_device::rra()
{
- u8 res = (A >> 1) | (F << 7);
- u8 c = (A & 0x01) ? CF : 0;
- set_f((F & (SF | ZF | PF)) | c | (res & (YF | XF)));
+ uint8_t res = (A >> 1) | (F << 7);
+ uint8_t c = (A & 0x01) ? CF : 0;
+ F = (F & (SF | ZF | PF)) | c | (res & (YF | XF));
A = res;
}
/***************************************************************
* RRD
***************************************************************/
-DEF( rrd() )
- THEN
- TADR=HL;
- CALL rm();
- THEN
- WZ = HL+1;
- CALL nomreq_addr(4);
- THEN
- TDAT_H=TDAT8;
- TDAT8=(TDAT8 >> 4) | (A << 4);
- CALL wm();
- THEN
- A = (A & 0xf0) | (TDAT_H & 0x0f);
- set_f((F & CF) | SZP[A]);
-ENDDEF
+inline void z80_device::rrd()
+{
+ uint8_t n = rm(HL);
+ WZ = HL+1;
+ nomreq_addr(HL, 4);
+ wm(HL, (n >> 4) | (A << 4));
+ A = (A & 0xf0) | (n & 0x0f);
+ F = (F & CF) | SZP[A];
+}
/***************************************************************
* RLD
***************************************************************/
-DEF( rld() )
- THEN
- TADR=HL;
- CALL rm();
- THEN
- WZ = HL+1;
- CALL nomreq_addr(4);
- THEN
- TDAT_H=TDAT8;
- TDAT8=(TDAT8 << 4) | (A & 0x0f);
- CALL wm();
- THEN
- A = (A & 0xf0) | (TDAT_H >> 4);
- set_f((F & CF) | SZP[A]);
-ENDDEF
+inline void z80_device::rld()
+{
+ uint8_t n = rm(HL);
+ WZ = HL+1;
+ nomreq_addr(HL, 4);
+ wm(HL, (n << 4) | (A & 0x0f));
+ A = (A & 0xf0) | (n >> 4);
+ F = (F & CF) | SZP[A];
+}
/***************************************************************
* ADD A,n
***************************************************************/
-inline void z80_device::add_a(u8 value)
+inline void z80_device::add_a(uint8_t value)
{
- u32 ah = AFD & 0xff00;
- u32 res = (u8)((ah >> 8) + value);
- set_f(SZHVC_add[ah | res]);
+ uint32_t ah = AFD & 0xff00;
+ uint32_t res = (uint8_t)((ah >> 8) + value);
+ F = SZHVC_add[ah | res];
A = res;
}
/***************************************************************
* ADC A,n
***************************************************************/
-inline void z80_device::adc_a(u8 value)
+inline void z80_device::adc_a(uint8_t value)
{
- u32 ah = AFD & 0xff00, c = AFD & 1;
- u32 res = (u8)((ah >> 8) + value + c);
- set_f(SZHVC_add[(c << 16) | ah | res]);
+ uint32_t ah = AFD & 0xff00, c = AFD & 1;
+ uint32_t res = (uint8_t)((ah >> 8) + value + c);
+ F = SZHVC_add[(c << 16) | ah | res];
A = res;
}
/***************************************************************
* SUB n
***************************************************************/
-inline void z80_device::sub(u8 value)
+inline void z80_device::sub(uint8_t value)
{
- u32 ah = AFD & 0xff00;
- u32 res = (u8)((ah >> 8) - value);
- set_f(SZHVC_sub[ah | res]);
+ uint32_t ah = AFD & 0xff00;
+ uint32_t res = (uint8_t)((ah >> 8) - value);
+ F = SZHVC_sub[ah | res];
A = res;
}
/***************************************************************
* SBC A,n
***************************************************************/
-inline void z80_device::sbc_a(u8 value)
+inline void z80_device::sbc_a(uint8_t value)
{
- u32 ah = AFD & 0xff00, c = AFD & 1;
- u32 res = (u8)((ah >> 8) - value - c);
- set_f(SZHVC_sub[(c<<16) | ah | res]);
+ uint32_t ah = AFD & 0xff00, c = AFD & 1;
+ uint32_t res = (uint8_t)((ah >> 8) - value - c);
+ F = SZHVC_sub[(c<<16) | ah | res];
A = res;
}
@@ -787,7 +900,7 @@ inline void z80_device::sbc_a(u8 value)
***************************************************************/
inline void z80_device::neg()
{
- u8 value = A;
+ uint8_t value = A;
A = 0;
sub(value);
}
@@ -797,7 +910,7 @@ inline void z80_device::neg()
***************************************************************/
inline void z80_device::daa()
{
- u8 a = A;
+ uint8_t a = A;
if (F & NF)
{
if ((F&HF) | ((A&0xf)>9)) a-=6;
@@ -809,46 +922,65 @@ inline void z80_device::daa()
if ((F&CF) | (A>0x99)) a+=0x60;
}
- set_f((F&(CF|NF)) | (A>0x99) | ((A^a)&HF) | SZP[a]);
+ F = (F&(CF|NF)) | (A>0x99) | ((A^a)&HF) | SZP[a];
A = a;
}
/***************************************************************
* AND n
***************************************************************/
-inline void z80_device::and_a(u8 value)
+inline void z80_device::and_a(uint8_t value)
{
A &= value;
- set_f(SZP[A] | HF);
+ F = SZP[A] | HF;
}
/***************************************************************
* OR n
***************************************************************/
-inline void z80_device::or_a(u8 value)
+inline void z80_device::or_a(uint8_t value)
{
A |= value;
- set_f(SZP[A]);
+ F = SZP[A];
}
/***************************************************************
* XOR n
***************************************************************/
-inline void z80_device::xor_a(u8 value)
+inline void z80_device::xor_a(uint8_t value)
{
A ^= value;
- set_f(SZP[A]);
+ F = SZP[A];
}
/***************************************************************
* CP n
***************************************************************/
-inline void z80_device::cp(u8 value)
+inline void z80_device::cp(uint8_t value)
{
unsigned val = value;
- u32 ah = AFD & 0xff00;
- u32 res = (u8)((ah >> 8) - val);
- set_f((SZHVC_sub[ah | res] & ~(YF | XF)) | (val & (YF | XF)));
+ uint32_t ah = AFD & 0xff00;
+ uint32_t res = (uint8_t)((ah >> 8) - val);
+ F = (SZHVC_sub[ah | res] & ~(YF | XF)) |
+ (val & (YF | XF));
+}
+
+/***************************************************************
+ * EX AF,AF'
+ ***************************************************************/
+inline void z80_device::ex_af()
+{
+ PAIR tmp;
+ tmp = m_af; m_af = m_af2; m_af2 = tmp;
+}
+
+/***************************************************************
+ * EX DE,HL
+ ***************************************************************/
+inline void z80_device::ex_de_hl()
+{
+ PAIR tmp;
+ tmp = m_de; m_de = m_hl; m_hl = tmp;
}
/***************************************************************
@@ -856,203 +988,198 @@ inline void z80_device::cp(u8 value)
***************************************************************/
inline void z80_device::exx()
{
- std::swap(m_bc, m_bc2);
- std::swap(m_de, m_de2);
- std::swap(m_hl, m_hl2);
+ PAIR tmp;
+ tmp = m_bc; m_bc = m_bc2; m_bc2 = tmp;
+ tmp = m_de; m_de = m_de2; m_de2 = tmp;
+ tmp = m_hl; m_hl = m_hl2; m_hl2 = tmp;
}
/***************************************************************
* EX (SP),r16
- * in: TDAT
- ***************************************************************/
-DEF( ex_sp() )
- THEN
- TDAT2=TDAT;
- CALL pop();
- THEN
- TADR=SP-1;
- CALL nomreq_addr(1);
- THEN
- std::swap(TDAT, TDAT2);
- CALL wm16_sp();
- THEN
- TADR=SP;
- CALL nomreq_addr(2);
- THEN
- std::swap(TDAT, TDAT2);
- WZ=TDAT;
-ENDDEF
+ ***************************************************************/
+inline void z80_device::ex_sp(PAIR &r)
+{
+ PAIR tmp = { { 0, 0, 0, 0 } };
+ pop(tmp);
+ nomreq_addr(SPD - 1, 1);
+ m_icount_executing -= 2;
+ wm16_sp(r);
+ m_icount_executing += 2;
+ nomreq_addr(SPD, 2);
+ r = tmp;
+ WZ = r.d;
+}
/***************************************************************
* ADD16
***************************************************************/
-DEF( add16() )
- CALL nomreq_ir(7);
- THEN
- u32 res = TDAT + TDAT2;
- WZ = TDAT + 1;
- set_f((F & (SF | ZF | VF)) |
- (((TDAT ^ res ^ TDAT2) >> 8) & HF) |
- ((res >> 16) & CF) | ((res >> 8) & (YF | XF)));
- TDAT = (u16)res;
-ENDDEF
+inline void z80_device::add16(PAIR &dr, PAIR &sr)
+{
+ nomreq_ir(7);
+ uint32_t res = dr.d + sr.d;
+ WZ = dr.d + 1;
+ F = (F & (SF | ZF | VF)) |
+ (((dr.d ^ res ^ sr.d) >> 8) & HF) |
+ ((res >> 16) & CF) | ((res >> 8) & (YF | XF));
+ dr.w.l = (uint16_t)res;
+}
/***************************************************************
* ADC HL,r16
***************************************************************/
-DEF( adc_hl() )
- CALL nomreq_ir(7);
- THEN
- u32 res = HLD + TDAT + (F & CF);
- WZ = HL + 1;
- set_f((((HLD ^ res ^ TDAT) >> 8) & HF) |
- ((res >> 16) & CF) |
- ((res >> 8) & (SF | YF | XF)) |
- ((res & 0xffff) ? 0 : ZF) |
- (((TDAT ^ HLD ^ 0x8000) & (TDAT ^ res) & 0x8000) >> 13));
- HL = (u16)res;
-ENDDEF
+inline void z80_device::adc_hl(PAIR &r)
+{
+ nomreq_ir(7);
+ uint32_t res = HLD + r.d + (F & CF);
+ WZ = HL + 1;
+ F = (((HLD ^ res ^ r.d) >> 8) & HF) |
+ ((res >> 16) & CF) |
+ ((res >> 8) & (SF | YF | XF)) |
+ ((res & 0xffff) ? 0 : ZF) |
+ (((r.d ^ HLD ^ 0x8000) & (r.d ^ res) & 0x8000) >> 13);
+ HL = (uint16_t)res;
+}
/***************************************************************
* SBC HL,r16
***************************************************************/
-DEF( sbc_hl() )
- CALL nomreq_ir(7);
- THEN
- u32 res = HLD - TDAT - (F & CF);
- WZ = HL + 1;
- set_f((((HLD ^ res ^ TDAT) >> 8) & HF) | NF |
- ((res >> 16) & CF) |
- ((res >> 8) & (SF | YF | XF)) |
- ((res & 0xffff) ? 0 : ZF) |
- (((TDAT ^ HLD) & (HLD ^ res) &0x8000) >> 13));
- HL = (u16)res;
-ENDDEF
+inline void z80_device::sbc_hl(PAIR &r)
+{
+ nomreq_ir(7);
+ uint32_t res = HLD - r.d - (F & CF);
+ WZ = HL + 1;
+ F = (((HLD ^ res ^ r.d) >> 8) & HF) | NF |
+ ((res >> 16) & CF) |
+ ((res >> 8) & (SF | YF | XF)) |
+ ((res & 0xffff) ? 0 : ZF) |
+ (((r.d ^ HLD) & (HLD ^ res) &0x8000) >> 13);
+ HL = (uint16_t)res;
+}
/***************************************************************
* RLC r8
***************************************************************/
-inline u8 z80_device::rlc(u8 value)
+inline uint8_t z80_device::rlc(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x80) ? CF : 0;
res = ((res << 1) | (res >> 7)) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* RRC r8
***************************************************************/
-inline u8 z80_device::rrc(u8 value)
+inline uint8_t z80_device::rrc(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x01) ? CF : 0;
res = ((res >> 1) | (res << 7)) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* RL r8
***************************************************************/
-inline u8 z80_device::rl(u8 value)
+inline uint8_t z80_device::rl(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x80) ? CF : 0;
res = ((res << 1) | (F & CF)) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* RR r8
***************************************************************/
-inline u8 z80_device::rr(u8 value)
+inline uint8_t z80_device::rr(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x01) ? CF : 0;
res = ((res >> 1) | (F << 7)) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* SLA r8
***************************************************************/
-inline u8 z80_device::sla(u8 value)
+inline uint8_t z80_device::sla(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x80) ? CF : 0;
res = (res << 1) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* SRA r8
***************************************************************/
-inline u8 z80_device::sra(u8 value)
+inline uint8_t z80_device::sra(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x01) ? CF : 0;
res = ((res >> 1) | (res & 0x80)) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* SLL r8
***************************************************************/
-inline u8 z80_device::sll(u8 value)
+inline uint8_t z80_device::sll(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x80) ? CF : 0;
res = ((res << 1) | 0x01) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* SRL r8
***************************************************************/
-inline u8 z80_device::srl(u8 value)
+inline uint8_t z80_device::srl(uint8_t value)
{
unsigned res = value;
unsigned c = (res & 0x01) ? CF : 0;
res = (res >> 1) & 0xff;
- set_f(SZP[res] | c);
+ F = SZP[res] | c;
return res;
}
/***************************************************************
* BIT bit,r8
***************************************************************/
-inline void z80_device::bit(int bit, u8 value)
+inline void z80_device::bit(int bit, uint8_t value)
{
- set_f((F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | (value & (YF|XF)));
+ F = (F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | (value & (YF|XF));
}
/***************************************************************
* BIT bit,(HL)
***************************************************************/
-inline void z80_device::bit_hl(int bit, u8 value)
+inline void z80_device::bit_hl(int bit, uint8_t value)
{
- set_f((F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | (WZ_H & (YF|XF)));
+ F = (F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | (WZ_H & (YF|XF));
}
/***************************************************************
* BIT bit,(IX/Y+o)
***************************************************************/
-inline void z80_device::bit_xy(int bit, u8 value)
+inline void z80_device::bit_xy(int bit, uint8_t value)
{
- set_f((F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | ((m_ea>>8) & (YF|XF)));
+ F = (F & CF) | HF | (SZ_BIT[value & (1<<bit)] & ~(YF|XF)) | ((m_ea>>8) & (YF|XF));
}
/***************************************************************
* RES bit,r8
***************************************************************/
-inline u8 z80_device::res(int bit, u8 value)
+inline uint8_t z80_device::res(int bit, uint8_t value)
{
return value & ~(1<<bit);
}
@@ -1060,7 +1187,7 @@ inline u8 z80_device::res(int bit, u8 value)
/***************************************************************
* SET bit,r8
***************************************************************/
-inline u8 z80_device::set(int bit, u8 value)
+inline uint8_t z80_device::set(int bit, uint8_t value)
{
return value | (1<<bit);
}
@@ -1068,320 +1195,262 @@ inline u8 z80_device::set(int bit, u8 value)
/***************************************************************
* LDI
***************************************************************/
-DEF( ldi() )
- THEN
- TADR=HL;
- CALL rm();
- THEN
- TADR=DE;
- CALL wm();
- CALL nomreq_addr(2);
- THEN
- set_f(F & (SF | ZF | CF));
- if ((A + TDAT8) & 0x02) F |= YF; // bit 1 -> flag 5
- if ((A + TDAT8) & 0x08) F |= XF; // bit 3 -> flag 3
- HL++; DE++; BC--;
- if(BC) F |= VF;
-ENDDEF
+inline void z80_device::ldi()
+{
+ uint8_t io = rm(HL);
+ m_icount_executing -= 2;
+ wm(DE, io);
+ m_icount_executing += 2;
+ nomreq_addr(DE, 2);
+ F &= SF | ZF | CF;
+ if ((A + io) & 0x02) F |= YF; /* bit 1 -> flag 5 */
+ if ((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */
+ HL++; DE++; BC--;
+ if(BC) F |= VF;
+}
/***************************************************************
* CPI
***************************************************************/
-DEF( cpi() )
- THEN
- TADR=HL;
- CALL rm();
- CALL nomreq_addr(5);
- THEN
- u8 res = A - TDAT8;
- WZ++;
- HL++; BC--;
- set_f((F & CF) | (SZ[res]&~(YF|XF)) | ((A^TDAT8^res)&HF) | NF);
- if (F & HF) res -= 1;
- if (res & 0x02) F |= YF; // bit 1 -> flag 5
- if (res & 0x08) F |= XF; // bit 3 -> flag 3
- if (BC) F |= VF;
-ENDDEF
+inline void z80_device::cpi()
+{
+ uint8_t val = rm(HL);
+ nomreq_addr(HL, 5);
+ uint8_t res = A - val;
+ WZ++;
+ HL++; BC--;
+ F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF;
+ if (F & HF) res -= 1;
+ if (res & 0x02) F |= YF; /* bit 1 -> flag 5 */
+ if (res & 0x08) F |= XF; /* bit 3 -> flag 3 */
+ if (BC) F |= VF;
+}
/***************************************************************
* INI
***************************************************************/
-DEF( ini() )
- CALL nomreq_ir(1);
- THEN
- TADR=BC;
- CALL in();
- THEN
- WZ = BC + 1;
- B--;
- TADR=HL;
- CALL wm();
- THEN
- HL++;
- set_f(SZ[B]);
- unsigned t = (unsigned)((C + 1) & 0xff) + (unsigned)TDAT8;
- if (TDAT8 & SF) F |= NF;
- if (t & 0x100) F |= HF | CF;
- F |= SZP[(u8)(t & 0x07) ^ B] & PF;
-ENDDEF
+inline void z80_device::ini()
+{
+ nomreq_ir(1);
+ unsigned t;
+ uint8_t io = in(BC);
+ WZ = BC + 1;
+ B--;
+ wm(HL, io);
+ HL++;
+ F = SZ[B];
+ t = (unsigned)((C + 1) & 0xff) + (unsigned)io;
+ if (io & SF) F |= NF;
+ if (t & 0x100) F |= HF | CF;
+ F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF;
+}
/***************************************************************
* OUTI
***************************************************************/
-DEF( outi() )
- CALL nomreq_ir(1);
- THEN
- TADR=HL;
- CALL rm();
- THEN
- B--;
- WZ = BC + 1;
- TADR=BC;
- CALL out();
- THEN
- HL++;
- set_f(SZ[B]);
- unsigned t = (unsigned)L + (unsigned)TDAT8;
- if (TDAT8 & SF) F |= NF;
- if (t & 0x100) F |= HF | CF;
- F |= SZP[(u8)(t & 0x07) ^ B] & PF;
-ENDDEF
+inline void z80_device::outi()
+{
+ nomreq_ir(1);
+ unsigned t;
+ uint8_t io = rm(HL);
+ B--;
+ WZ = BC + 1;
+ out(BC, io);
+ HL++;
+ F = SZ[B];
+ t = (unsigned)L + (unsigned)io;
+ if (io & SF) F |= NF;
+ if (t & 0x100) F |= HF | CF;
+ F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF;
+}
/***************************************************************
* LDD
***************************************************************/
-DEF( ldd() )
- THEN
- TADR=HL;
- CALL rm();
- THEN
- TADR=DE;
- CALL wm();
- CALL nomreq_addr(2);
- THEN
- set_f(F & (SF | ZF | CF));
- if ((A + TDAT8) & 0x02) F |= YF; // bit 1 -> flag 5
- if ((A + TDAT8) & 0x08) F |= XF; // bit 3 -> flag 3
- HL--; DE--; BC--;
- if (BC) F |= VF;
-ENDDEF
+inline void z80_device::ldd()
+{
+ uint8_t io = rm(HL);
+ m_icount_executing -= 2;
+ wm(DE, io);
+ m_icount_executing += 2;
+ nomreq_addr(DE, 2);
+ F &= SF | ZF | CF;
+ if ((A + io) & 0x02) F |= YF; /* bit 1 -> flag 5 */
+ if ((A + io) & 0x08) F |= XF; /* bit 3 -> flag 3 */
+ HL--; DE--; BC--;
+ if (BC) F |= VF;
+}
/***************************************************************
* CPD
***************************************************************/
-DEF( cpd() )
- THEN
- TADR=HL;
- CALL rm();
- THEN
- TADR=HL;
- CALL nomreq_addr(5);
- THEN
- u8 res = A - TDAT8;
- WZ--;
- HL--; BC--;
- set_f((F & CF) | (SZ[res]&~(YF|XF)) | ((A^TDAT8^res)&HF) | NF);
- if (F & HF) res -= 1;
- if (res & 0x02) F |= YF; // bit 1 -> flag 5
- if (res & 0x08) F |= XF; // bit 3 -> flag 3
- if (BC) F |= VF;
-ENDDEF
+inline void z80_device::cpd()
+{
+ uint8_t val = rm(HL);
+ nomreq_addr(HL, 5);
+ uint8_t res = A - val;
+ WZ--;
+ HL--; BC--;
+ F = (F & CF) | (SZ[res]&~(YF|XF)) | ((A^val^res)&HF) | NF;
+ if (F & HF) res -= 1;
+ if (res & 0x02) F |= YF; /* bit 1 -> flag 5 */
+ if (res & 0x08) F |= XF; /* bit 3 -> flag 3 */
+ if (BC) F |= VF;
+}
/***************************************************************
* IND
***************************************************************/
-DEF( ind() )
- CALL nomreq_ir(1);
- THEN
- TADR=BC;
- CALL in();
- THEN
- WZ = BC - 1;
- B--;
- TADR=HL;
- CALL wm();
- THEN
- HL--;
- set_f(SZ[B]);
- unsigned t = ((unsigned)(C - 1) & 0xff) + (unsigned)TDAT8;
- if (TDAT8 & SF) F |= NF;
- if (t & 0x100) F |= HF | CF;
- F |= SZP[(u8)(t & 0x07) ^ B] & PF;
-ENDDEF
+inline void z80_device::ind()
+{
+ nomreq_ir(1);
+ unsigned t;
+ uint8_t io = in(BC);
+ WZ = BC - 1;
+ B--;
+ wm(HL, io);
+ HL--;
+ F = SZ[B];
+ t = ((unsigned)(C - 1) & 0xff) + (unsigned)io;
+ if (io & SF) F |= NF;
+ if (t & 0x100) F |= HF | CF;
+ F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF;
+}
/***************************************************************
* OUTD
***************************************************************/
-DEF( outd() )
- CALL nomreq_ir(1);
- THEN
- TADR=HL;
- CALL rm();
- THEN
- B--;
- WZ = BC - 1;
- TADR=BC;
- CALL out();
- THEN
- HL--;
- set_f(SZ[B]);
- unsigned t = (unsigned)L + (unsigned)TDAT8;
- if (TDAT8 & SF) F |= NF;
- if (t & 0x100) F |= HF | CF;
- F |= SZP[(u8)(t & 0x07) ^ B] & PF;
-ENDDEF
+inline void z80_device::outd()
+{
+ nomreq_ir(1);
+ unsigned t;
+ uint8_t io = rm(HL);
+ B--;
+ WZ = BC - 1;
+ out(BC, io);
+ HL--;
+ F = SZ[B];
+ t = (unsigned)L + (unsigned)io;
+ if (io & SF) F |= NF;
+ if (t & 0x100) F |= HF | CF;
+ F |= SZP[(uint8_t)(t & 0x07) ^ B] & PF;
+}
/***************************************************************
* LDIR
***************************************************************/
-DEF( ldir() )
- CALL ldi();
- IF ( BC != 0 )
- THEN
- TADR=DE;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- WZ = PC + 1;
- F &= ~(YF | XF);
- F |= (PC >> 8) & (YF | XF);
- ENDIF
-ENDDEF
+inline void z80_device::ldir()
+{
+ ldi();
+ if (BC != 0)
+ {
+ CC(ex, 0xb0);
+ nomreq_addr(DE, 5);
+ PC -= 2;
+ WZ = PC + 1;
+ }
+}
/***************************************************************
* CPIR
***************************************************************/
-DEF( cpir() )
- CALL cpi();
- IF ( BC != 0 && !(F & ZF) )
- THEN
- TADR=HL;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- WZ = PC + 1;
- F &= ~(YF | XF);
- F |= (PC >> 8) & (YF | XF);
- ENDIF
-ENDDEF
-
-inline void z80_device::block_io_interrupted_flags()
-{
- F &= ~(YF | XF);
- F |= (PC >> 8) & (YF | XF);
- if (F & CF)
- {
- F &= ~HF;
- if (TDAT8 & 0x80)
- {
- F ^= (SZP[(B - 1) & 0x07] ^ PF) & PF;
- if ((B & 0x0f) == 0x00) F |= HF;
- }
- else
- {
- F ^= (SZP[(B + 1) & 0x07] ^ PF) & PF;
- if ((B & 0x0f) == 0x0f) F |= HF;
- }
- }
- else
+inline void z80_device::cpir()
+{
+ cpi();
+ if (BC != 0 && !(F & ZF))
{
- F ^=(SZP[B & 0x07] ^ PF) & PF;
+ CC(ex, 0xb1);
+ nomreq_addr(HL, 5);
+ PC -= 2;
+ WZ = PC + 1;
}
}
/***************************************************************
* INIR
***************************************************************/
-DEF( inir() )
- CALL ini();
- IF ( B != 0 )
- THEN
- TADR=HL;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- block_io_interrupted_flags();
- ENDIF
-ENDDEF
+inline void z80_device::inir()
+{
+ ini();
+ if (B != 0)
+ {
+ CC(ex, 0xb2);
+ nomreq_addr(HL, 5);
+ PC -= 2;
+ }
+}
/***************************************************************
* OTIR
***************************************************************/
-DEF( otir() )
- CALL outi();
- IF ( B != 0 )
- THEN
- TADR=BC;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- block_io_interrupted_flags();
- ENDIF
-ENDDEF
+inline void z80_device::otir()
+{
+ outi();
+ if (B != 0)
+ {
+ CC(ex, 0xb3);
+ nomreq_addr(BC, 5);
+ PC -= 2;
+ }
+}
/***************************************************************
* LDDR
***************************************************************/
-DEF( lddr() )
- CALL ldd();
- IF ( BC != 0 )
- THEN
- TADR=DE;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- WZ = PC + 1;
- F &= ~(YF | XF);
- F |= (PC >> 8) & (YF | XF);
- ENDIF
-ENDDEF
+inline void z80_device::lddr()
+{
+ ldd();
+ if (BC != 0)
+ {
+ CC(ex, 0xb8);
+ nomreq_addr(DE, 5);
+ PC -= 2;
+ WZ = PC + 1;
+ }
+}
/***************************************************************
* CPDR
***************************************************************/
-DEF( cpdr() )
- CALL cpd();
- IF ( BC != 0 && !(F & ZF) )
- THEN
- TADR=HL;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- WZ = PC + 1;
- F &= ~(YF | XF);
- F |= (PC >> 8) & (YF | XF);
- ENDIF
-ENDDEF
+inline void z80_device::cpdr()
+{
+ cpd();
+ if (BC != 0 && !(F & ZF))
+ {
+ CC(ex, 0xb9);
+ nomreq_addr(HL, 5);
+ PC -= 2;
+ WZ = PC + 1;
+ }
+}
/***************************************************************
* INDR
***************************************************************/
-DEF( indr() )
- CALL ind();
- IF ( B != 0 )
- THEN
- TADR=HL;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- block_io_interrupted_flags();
- ENDIF
-ENDDEF
+inline void z80_device::indr()
+{
+ ind();
+ if (B != 0)
+ {
+ CC(ex, 0xba);
+ nomreq_addr(HL, 5);
+ PC -= 2;
+ }
+}
/***************************************************************
* OTDR
***************************************************************/
-DEF( otdr() )
- CALL outd();
- IF ( B != 0 )
- THEN
- TADR=BC;
- CALL nomreq_addr(5);
- THEN
- PC -= 2;
- block_io_interrupted_flags();
- ENDIF
-ENDDEF
+inline void z80_device::otdr()
+{
+ outd();
+ if (B != 0)
+ {
+ CC(ex, 0xbb);
+ nomreq_addr(BC, 5);
+ PC -= 2;
+ }
+}
/***************************************************************
* EI
@@ -1392,1781 +1461,1767 @@ inline void z80_device::ei()
m_after_ei = true;
}
-inline void z80_device::set_f(u8 f)
-{
- m_qtemp = 0;
- F = f;
-}
-
-inline void z80_device::illegal_1() {
- LOGUNDOC("ill. opcode $%02x $%02x ($%04x)\n",
- m_opcodes.read_byte(translate_memory_address((PCD-1)&0xffff)), m_opcodes.read_byte(translate_memory_address(PCD)), PCD-1);
-}
-
-inline void z80_device::illegal_2()
-{
- LOGUNDOC("ill. opcode $ed $%02x\n",
- m_opcodes.read_byte(translate_memory_address((PCD-1)&0xffff)));
-}
-
-void z80_device::init_op_steps() {
-
-#define OP(prefix,opcode) m_op_steps[prefix][0x##opcode] = op_builder(*this).foo([]() {
-#define THENJP(p_to) })->add([&]() { m_cycle=~0; m_prefix=p_to; m_opcode=TDAT8; })->get_steps();
-#define JP(op) })->jump(0x##op);
-#define JPP(p_to,op_to) })->jump(p_to, 0x##op_to);
-#define ENDOP })->build();
-
/**********************************************************
* opcodes with CB prefix
* rotate, shift and bit operations
**********************************************************/
-/* RLC B */ OP(CB,00) THEN B = rlc(B); ENDOP
-/* RLC C */ OP(CB,01) THEN C = rlc(C); ENDOP
-/* RLC D */ OP(CB,02) THEN D = rlc(D); ENDOP
-/* RLC E */ OP(CB,03) THEN E = rlc(E); ENDOP
-/* RLC H */ OP(CB,04) THEN H = rlc(H); ENDOP
-/* RLC L */ OP(CB,05) THEN L = rlc(L); ENDOP
-/* RLC (HL) */ OP(CB,06) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=rlc(TDAT8); CALL wm(); ENDOP
-/* RLC A */ OP(CB,07) THEN A = rlc(A); ENDOP
-
-/* RRC B */ OP(CB,08) THEN B = rrc(B); ENDOP
-/* RRC C */ OP(CB,09) THEN C = rrc(C); ENDOP
-/* RRC D */ OP(CB,0a) THEN D = rrc(D); ENDOP
-/* RRC E */ OP(CB,0b) THEN E = rrc(E); ENDOP
-/* RRC H */ OP(CB,0c) THEN H = rrc(H); ENDOP
-/* RRC L */ OP(CB,0d) THEN L = rrc(L); ENDOP
-/* RRC (HL) */ OP(CB,0e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=rrc(TDAT8); CALL wm(); ENDOP
-/* RRC A */ OP(CB,0f) THEN A = rrc(A); ENDOP
-
-/* RL B */ OP(CB,10) THEN B = rl(B); ENDOP
-/* RL C */ OP(CB,11) THEN C = rl(C); ENDOP
-/* RL D */ OP(CB,12) THEN D = rl(D); ENDOP
-/* RL E */ OP(CB,13) THEN E = rl(E); ENDOP
-/* RL H */ OP(CB,14) THEN H = rl(H); ENDOP
-/* RL L */ OP(CB,15) THEN L = rl(L); ENDOP
-/* RL (HL) */ OP(CB,16) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=rl(TDAT8); CALL wm(); ENDOP
-/* RL A */ OP(CB,17) THEN A = rl(A); ENDOP
-
-/* RR B */ OP(CB,18) THEN B = rr(B); ENDOP
-/* RR C */ OP(CB,19) THEN C = rr(C); ENDOP
-/* RR D */ OP(CB,1a) THEN D = rr(D); ENDOP
-/* RR E */ OP(CB,1b) THEN E = rr(E); ENDOP
-/* RR H */ OP(CB,1c) THEN H = rr(H); ENDOP
-/* RR L */ OP(CB,1d) THEN L = rr(L); ENDOP
-/* RR (HL) */ OP(CB,1e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=rr(TDAT8); CALL wm(); ENDOP
-/* RR A */ OP(CB,1f) THEN A = rr(A); ENDOP
-
-/* SLA B */ OP(CB,20) THEN B = sla(B); ENDOP
-/* SLA C */ OP(CB,21) THEN C = sla(C); ENDOP
-/* SLA D */ OP(CB,22) THEN D = sla(D); ENDOP
-/* SLA E */ OP(CB,23) THEN E = sla(E); ENDOP
-/* SLA H */ OP(CB,24) THEN H = sla(H); ENDOP
-/* SLA L */ OP(CB,25) THEN L = sla(L); ENDOP
-/* SLA (HL) */ OP(CB,26) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=sla(TDAT8); CALL wm(); ENDOP
-/* SLA A */ OP(CB,27) THEN A = sla(A); ENDOP
-
-/* SRA B */ OP(CB,28) THEN B = sra(B); ENDOP
-/* SRA C */ OP(CB,29) THEN C = sra(C); ENDOP
-/* SRA D */ OP(CB,2a) THEN D = sra(D); ENDOP
-/* SRA E */ OP(CB,2b) THEN E = sra(E); ENDOP
-/* SRA H */ OP(CB,2c) THEN H = sra(H); ENDOP
-/* SRA L */ OP(CB,2d) THEN L = sra(L); ENDOP
-/* SRA (HL) */ OP(CB,2e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=sra(TDAT8); CALL wm(); ENDOP
-/* SRA A */ OP(CB,2f) THEN A = sra(A); ENDOP
-
-/* SLL B */ OP(CB,30) THEN B = sll(B); ENDOP
-/* SLL C */ OP(CB,31) THEN C = sll(C); ENDOP
-/* SLL D */ OP(CB,32) THEN D = sll(D); ENDOP
-/* SLL E */ OP(CB,33) THEN E = sll(E); ENDOP
-/* SLL H */ OP(CB,34) THEN H = sll(H); ENDOP
-/* SLL L */ OP(CB,35) THEN L = sll(L); ENDOP
-/* SLL (HL) */ OP(CB,36) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=sll(TDAT8); CALL wm(); ENDOP
-/* SLL A */ OP(CB,37) THEN A = sll(A); ENDOP
-
-/* SRL B */ OP(CB,38) THEN B = srl(B); ENDOP
-/* SRL C */ OP(CB,39) THEN C = srl(C); ENDOP
-/* SRL D */ OP(CB,3a) THEN D = srl(D); ENDOP
-/* SRL E */ OP(CB,3b) THEN E = srl(E); ENDOP
-/* SRL H */ OP(CB,3c) THEN H = srl(H); ENDOP
-/* SRL L */ OP(CB,3d) THEN L = srl(L); ENDOP
-/* SRL (HL) */ OP(CB,3e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=srl(TDAT8); CALL wm(); ENDOP
-/* SRL A */ OP(CB,3f) THEN A = srl(A); ENDOP
-
-/* BIT 0,B */ OP(CB,40) THEN bit(0, B); ENDOP
-/* BIT 0,C */ OP(CB,41) THEN bit(0, C); ENDOP
-/* BIT 0,D */ OP(CB,42) THEN bit(0, D); ENDOP
-/* BIT 0,E */ OP(CB,43) THEN bit(0, E); ENDOP
-/* BIT 0,H */ OP(CB,44) THEN bit(0, H); ENDOP
-/* BIT 0,L */ OP(CB,45) THEN bit(0, L); ENDOP
-/* BIT 0,(HL) */ OP(CB,46) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(0, TDAT8); ENDOP
-/* BIT 0,A */ OP(CB,47) THEN bit(0, A); ENDOP
-
-/* BIT 1,B */ OP(CB,48) THEN bit(1, B); ENDOP
-/* BIT 1,C */ OP(CB,49) THEN bit(1, C); ENDOP
-/* BIT 1,D */ OP(CB,4a) THEN bit(1, D); ENDOP
-/* BIT 1,E */ OP(CB,4b) THEN bit(1, E); ENDOP
-/* BIT 1,H */ OP(CB,4c) THEN bit(1, H); ENDOP
-/* BIT 1,L */ OP(CB,4d) THEN bit(1, L); ENDOP
-/* BIT 1,(HL) */ OP(CB,4e) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(1, TDAT8); ENDOP
-/* BIT 1,A */ OP(CB,4f) THEN bit(1, A); ENDOP
-
-/* BIT 2,B */ OP(CB,50) THEN bit(2, B); ENDOP
-/* BIT 2,C */ OP(CB,51) THEN bit(2, C); ENDOP
-/* BIT 2,D */ OP(CB,52) THEN bit(2, D); ENDOP
-/* BIT 2,E */ OP(CB,53) THEN bit(2, E); ENDOP
-/* BIT 2,H */ OP(CB,54) THEN bit(2, H); ENDOP
-/* BIT 2,L */ OP(CB,55) THEN bit(2, L); ENDOP
-/* BIT 2,(HL) */ OP(CB,56) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(2, TDAT8); ENDOP
-/* BIT 2,A */ OP(CB,57) THEN bit(2, A); ENDOP
-
-/* BIT 3,B */ OP(CB,58) THEN bit(3, B); ENDOP
-/* BIT 3,C */ OP(CB,59) THEN bit(3, C); ENDOP
-/* BIT 3,D */ OP(CB,5a) THEN bit(3, D); ENDOP
-/* BIT 3,E */ OP(CB,5b) THEN bit(3, E); ENDOP
-/* BIT 3,H */ OP(CB,5c) THEN bit(3, H); ENDOP
-/* BIT 3,L */ OP(CB,5d) THEN bit(3, L); ENDOP
-/* BIT 3,(HL) */ OP(CB,5e) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(3, TDAT8); ENDOP
-/* BIT 3,A */ OP(CB,5f) THEN bit(3, A); ENDOP
-
-/* BIT 4,B */ OP(CB,60) THEN bit(4, B); ENDOP
-/* BIT 4,C */ OP(CB,61) THEN bit(4, C); ENDOP
-/* BIT 4,D */ OP(CB,62) THEN bit(4, D); ENDOP
-/* BIT 4,E */ OP(CB,63) THEN bit(4, E); ENDOP
-/* BIT 4,H */ OP(CB,64) THEN bit(4, H); ENDOP
-/* BIT 4,L */ OP(CB,65) THEN bit(4, L); ENDOP
-/* BIT 4,(HL) */ OP(CB,66) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(4, TDAT8); ENDOP
-/* BIT 4,A */ OP(CB,67) THEN bit(4, A); ENDOP
-
-/* BIT 5,B */ OP(CB,68) THEN bit(5, B); ENDOP
-/* BIT 5,C */ OP(CB,69) THEN bit(5, C); ENDOP
-/* BIT 5,D */ OP(CB,6a) THEN bit(5, D); ENDOP
-/* BIT 5,E */ OP(CB,6b) THEN bit(5, E); ENDOP
-/* BIT 5,H */ OP(CB,6c) THEN bit(5, H); ENDOP
-/* BIT 5,L */ OP(CB,6d) THEN bit(5, L); ENDOP
-/* BIT 5,(HL) */ OP(CB,6e) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(5, TDAT8); ENDOP
-/* BIT 5,A */ OP(CB,6f) THEN bit(5, A); ENDOP
-
-/* BIT 6,B */ OP(CB,70) THEN bit(6, B); ENDOP
-/* BIT 6,C */ OP(CB,71) THEN bit(6, C); ENDOP
-/* BIT 6,D */ OP(CB,72) THEN bit(6, D); ENDOP
-/* BIT 6,E */ OP(CB,73) THEN bit(6, E); ENDOP
-/* BIT 6,H */ OP(CB,74) THEN bit(6, H); ENDOP
-/* BIT 6,L */ OP(CB,75) THEN bit(6, L); ENDOP
-/* BIT 6,(HL) */ OP(CB,76) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(6, TDAT8); ENDOP
-/* BIT 6,A */ OP(CB,77) THEN bit(6, A); ENDOP
-
-/* BIT 7,B */ OP(CB,78) THEN bit(7, B); ENDOP
-/* BIT 7,C */ OP(CB,79) THEN bit(7, C); ENDOP
-/* BIT 7,D */ OP(CB,7a) THEN bit(7, D); ENDOP
-/* BIT 7,E */ OP(CB,7b) THEN bit(7, E); ENDOP
-/* BIT 7,H */ OP(CB,7c) THEN bit(7, H); ENDOP
-/* BIT 7,L */ OP(CB,7d) THEN bit(7, L); ENDOP
-/* BIT 7,(HL) */ OP(CB,7e) THEN TADR=HL; CALL rm_reg(); THEN bit_hl(7, TDAT8); ENDOP
-/* BIT 7,A */ OP(CB,7f) THEN bit(7, A); ENDOP
-
-/* RES 0,B */ OP(CB,80) THEN B = res(0, B); ENDOP
-/* RES 0,C */ OP(CB,81) THEN C = res(0, C); ENDOP
-/* RES 0,D */ OP(CB,82) THEN D = res(0, D); ENDOP
-/* RES 0,E */ OP(CB,83) THEN E = res(0, E); ENDOP
-/* RES 0,H */ OP(CB,84) THEN H = res(0, H); ENDOP
-/* RES 0,L */ OP(CB,85) THEN L = res(0, L); ENDOP
-/* RES 0,(HL) */ OP(CB,86) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(0, TDAT8); CALL wm(); ENDOP
-/* RES 0,A */ OP(CB,87) THEN A = res(0, A); ENDOP
-
-/* RES 1,B */ OP(CB,88) THEN B = res(1, B); ENDOP
-/* RES 1,C */ OP(CB,89) THEN C = res(1, C); ENDOP
-/* RES 1,D */ OP(CB,8a) THEN D = res(1, D); ENDOP
-/* RES 1,E */ OP(CB,8b) THEN E = res(1, E); ENDOP
-/* RES 1,H */ OP(CB,8c) THEN H = res(1, H); ENDOP
-/* RES 1,L */ OP(CB,8d) THEN L = res(1, L); ENDOP
-/* RES 1,(HL) */ OP(CB,8e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(1, TDAT8); CALL wm(); ENDOP
-/* RES 1,A */ OP(CB,8f) THEN A = res(1, A); ENDOP
-
-/* RES 2,B */ OP(CB,90) THEN B = res(2, B); ENDOP
-/* RES 2,C */ OP(CB,91) THEN C = res(2, C); ENDOP
-/* RES 2,D */ OP(CB,92) THEN D = res(2, D); ENDOP
-/* RES 2,E */ OP(CB,93) THEN E = res(2, E); ENDOP
-/* RES 2,H */ OP(CB,94) THEN H = res(2, H); ENDOP
-/* RES 2,L */ OP(CB,95) THEN L = res(2, L); ENDOP
-/* RES 2,(HL) */ OP(CB,96) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(2, TDAT8); CALL wm(); ENDOP
-/* RES 2,A */ OP(CB,97) THEN A = res(2, A); ENDOP
-
-/* RES 3,B */ OP(CB,98) THEN B = res(3, B); ENDOP
-/* RES 3,C */ OP(CB,99) THEN C = res(3, C); ENDOP
-/* RES 3,D */ OP(CB,9a) THEN D = res(3, D); ENDOP
-/* RES 3,E */ OP(CB,9b) THEN E = res(3, E); ENDOP
-/* RES 3,H */ OP(CB,9c) THEN H = res(3, H); ENDOP
-/* RES 3,L */ OP(CB,9d) THEN L = res(3, L); ENDOP
-/* RES 3,(HL) */ OP(CB,9e) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(3, TDAT8); CALL wm(); ENDOP
-/* RES 3,A */ OP(CB,9f) THEN A = res(3, A); ENDOP
-
-/* RES 4,B */ OP(CB,a0) THEN B = res(4, B); ENDOP
-/* RES 4,C */ OP(CB,a1) THEN C = res(4, C); ENDOP
-/* RES 4,D */ OP(CB,a2) THEN D = res(4, D); ENDOP
-/* RES 4,E */ OP(CB,a3) THEN E = res(4, E); ENDOP
-/* RES 4,H */ OP(CB,a4) THEN H = res(4, H); ENDOP
-/* RES 4,L */ OP(CB,a5) THEN L = res(4, L); ENDOP
-/* RES 4,(HL) */ OP(CB,a6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(4, TDAT8); CALL wm(); ENDOP
-/* RES 4,A */ OP(CB,a7) THEN A = res(4, A); ENDOP
-
-/* RES 5,B */ OP(CB,a8) THEN B = res(5, B); ENDOP
-/* RES 5,C */ OP(CB,a9) THEN C = res(5, C); ENDOP
-/* RES 5,D */ OP(CB,aa) THEN D = res(5, D); ENDOP
-/* RES 5,E */ OP(CB,ab) THEN E = res(5, E); ENDOP
-/* RES 5,H */ OP(CB,ac) THEN H = res(5, H); ENDOP
-/* RES 5,L */ OP(CB,ad) THEN L = res(5, L); ENDOP
-/* RES 5,(HL) */ OP(CB,ae) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(5, TDAT8); CALL wm(); ENDOP
-/* RES 5,A */ OP(CB,af) THEN A = res(5, A); ENDOP
-
-/* RES 6,B */ OP(CB,b0) THEN B = res(6, B); ENDOP
-/* RES 6,C */ OP(CB,b1) THEN C = res(6, C); ENDOP
-/* RES 6,D */ OP(CB,b2) THEN D = res(6, D); ENDOP
-/* RES 6,E */ OP(CB,b3) THEN E = res(6, E); ENDOP
-/* RES 6,H */ OP(CB,b4) THEN H = res(6, H); ENDOP
-/* RES 6,L */ OP(CB,b5) THEN L = res(6, L); ENDOP
-/* RES 6,(HL) */ OP(CB,b6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(6, TDAT8); CALL wm(); ENDOP
-/* RES 6,A */ OP(CB,b7) THEN A = res(6, A); ENDOP
-
-/* RES 7,B */ OP(CB,b8) THEN B = res(7, B); ENDOP
-/* RES 7,C */ OP(CB,b9) THEN C = res(7, C); ENDOP
-/* RES 7,D */ OP(CB,ba) THEN D = res(7, D); ENDOP
-/* RES 7,E */ OP(CB,bb) THEN E = res(7, E); ENDOP
-/* RES 7,H */ OP(CB,bc) THEN H = res(7, H); ENDOP
-/* RES 7,L */ OP(CB,bd) THEN L = res(7, L); ENDOP
-/* RES 7,(HL) */ OP(CB,be) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=res(7, TDAT8); CALL wm(); ENDOP
-/* RES 7,A */ OP(CB,bf) THEN A = res(7, A); ENDOP
-
-/* SET 0,B */ OP(CB,c0) THEN B = set(0, B); ENDOP
-/* SET 0,C */ OP(CB,c1) THEN C = set(0, C); ENDOP
-/* SET 0,D */ OP(CB,c2) THEN D = set(0, D); ENDOP
-/* SET 0,E */ OP(CB,c3) THEN E = set(0, E); ENDOP
-/* SET 0,H */ OP(CB,c4) THEN H = set(0, H); ENDOP
-/* SET 0,L */ OP(CB,c5) THEN L = set(0, L); ENDOP
-/* SET 0,(HL) */ OP(CB,c6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(0, TDAT8); CALL wm(); ENDOP
-/* SET 0,A */ OP(CB,c7) THEN A = set(0, A); ENDOP
-
-/* SET 1,B */ OP(CB,c8) THEN B = set(1, B); ENDOP
-/* SET 1,C */ OP(CB,c9) THEN C = set(1, C); ENDOP
-/* SET 1,D */ OP(CB,ca) THEN D = set(1, D); ENDOP
-/* SET 1,E */ OP(CB,cb) THEN E = set(1, E); ENDOP
-/* SET 1,H */ OP(CB,cc) THEN H = set(1, H); ENDOP
-/* SET 1,L */ OP(CB,cd) THEN L = set(1, L); ENDOP
-/* SET 1,(HL) */ OP(CB,ce) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(1, TDAT8); CALL wm(); ENDOP
-/* SET 1,A */ OP(CB,cf) THEN A = set(1, A); ENDOP
-
-/* SET 2,B */ OP(CB,d0) THEN B = set(2, B); ENDOP
-/* SET 2,C */ OP(CB,d1) THEN C = set(2, C); ENDOP
-/* SET 2,D */ OP(CB,d2) THEN D = set(2, D); ENDOP
-/* SET 2,E */ OP(CB,d3) THEN E = set(2, E); ENDOP
-/* SET 2,H */ OP(CB,d4) THEN H = set(2, H); ENDOP
-/* SET 2,L */ OP(CB,d5) THEN L = set(2, L); ENDOP
-/* SET 2,(HL) */ OP(CB,d6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(2, TDAT8); CALL wm(); ENDOP
-/* SET 2,A */ OP(CB,d7) THEN A = set(2, A); ENDOP
-
-/* SET 3,B */ OP(CB,d8) THEN B = set(3, B); ENDOP
-/* SET 3,C */ OP(CB,d9) THEN C = set(3, C); ENDOP
-/* SET 3,D */ OP(CB,da) THEN D = set(3, D); ENDOP
-/* SET 3,E */ OP(CB,db) THEN E = set(3, E); ENDOP
-/* SET 3,H */ OP(CB,dc) THEN H = set(3, H); ENDOP
-/* SET 3,L */ OP(CB,dd) THEN L = set(3, L); ENDOP
-/* SET 3,(HL) */ OP(CB,de) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(3, TDAT8); CALL wm(); ENDOP
-/* SET 3,A */ OP(CB,df) THEN A = set(3, A); ENDOP
-
-/* SET 4,B */ OP(CB,e0) THEN B = set(4, B); ENDOP
-/* SET 4,C */ OP(CB,e1) THEN C = set(4, C); ENDOP
-/* SET 4,D */ OP(CB,e2) THEN D = set(4, D); ENDOP
-/* SET 4,E */ OP(CB,e3) THEN E = set(4, E); ENDOP
-/* SET 4,H */ OP(CB,e4) THEN H = set(4, H); ENDOP
-/* SET 4,L */ OP(CB,e5) THEN L = set(4, L); ENDOP
-/* SET 4,(HL) */ OP(CB,e6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(4, TDAT8); CALL wm(); ENDOP
-/* SET 4,A */ OP(CB,e7) THEN A = set(4, A); ENDOP
-
-/* SET 5,B */ OP(CB,e8) THEN B = set(5, B); ENDOP
-/* SET 5,C */ OP(CB,e9) THEN C = set(5, C); ENDOP
-/* SET 5,D */ OP(CB,ea) THEN D = set(5, D); ENDOP
-/* SET 5,E */ OP(CB,eb) THEN E = set(5, E); ENDOP
-/* SET 5,H */ OP(CB,ec) THEN H = set(5, H); ENDOP
-/* SET 5,L */ OP(CB,ed) THEN L = set(5, L); ENDOP
-/* SET 5,(HL) */ OP(CB,ee) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(5, TDAT8); CALL wm(); ENDOP
-/* SET 5,A */ OP(CB,ef) THEN A = set(5, A); ENDOP
-
-/* SET 6,B */ OP(CB,f0) THEN B = set(6, B); ENDOP
-/* SET 6,C */ OP(CB,f1) THEN C = set(6, C); ENDOP
-/* SET 6,D */ OP(CB,f2) THEN D = set(6, D); ENDOP
-/* SET 6,E */ OP(CB,f3) THEN E = set(6, E); ENDOP
-/* SET 6,H */ OP(CB,f4) THEN H = set(6, H); ENDOP
-/* SET 6,L */ OP(CB,f5) THEN L = set(6, L); ENDOP
-/* SET 6,(HL) */ OP(CB,f6) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(6, TDAT8); CALL wm(); ENDOP
-/* SET 6,A */ OP(CB,f7) THEN A = set(6, A); ENDOP
-
-/* SET 7,B */ OP(CB,f8) THEN B = set(7, B); ENDOP
-/* SET 7,C */ OP(CB,f9) THEN C = set(7, C); ENDOP
-/* SET 7,D */ OP(CB,fa) THEN D = set(7, D); ENDOP
-/* SET 7,E */ OP(CB,fb) THEN E = set(7, E); ENDOP
-/* SET 7,H */ OP(CB,fc) THEN H = set(7, H); ENDOP
-/* SET 7,L */ OP(CB,fd) THEN L = set(7, L); ENDOP
-/* SET 7,(HL) */ OP(CB,fe) THEN TADR=HL; CALL rm_reg(); THEN TDAT8=set(7, TDAT8); CALL wm(); ENDOP
-/* SET 7,A */ OP(CB,ff) THEN A = set(7, A); ENDOP
+OP(cb,00) { B = rlc(B); } /* RLC B */
+OP(cb,01) { C = rlc(C); } /* RLC C */
+OP(cb,02) { D = rlc(D); } /* RLC D */
+OP(cb,03) { E = rlc(E); } /* RLC E */
+OP(cb,04) { H = rlc(H); } /* RLC H */
+OP(cb,05) { L = rlc(L); } /* RLC L */
+OP(cb,06) { wm(HL, rlc(rm_reg(HL)));} /* RLC (HL) */
+OP(cb,07) { A = rlc(A); } /* RLC A */
+
+OP(cb,08) { B = rrc(B); } /* RRC B */
+OP(cb,09) { C = rrc(C); } /* RRC C */
+OP(cb,0a) { D = rrc(D); } /* RRC D */
+OP(cb,0b) { E = rrc(E); } /* RRC E */
+OP(cb,0c) { H = rrc(H); } /* RRC H */
+OP(cb,0d) { L = rrc(L); } /* RRC L */
+OP(cb,0e) { wm(HL, rrc(rm_reg(HL)));} /* RRC (HL) */
+OP(cb,0f) { A = rrc(A); } /* RRC A */
+
+OP(cb,10) { B = rl(B); } /* RL B */
+OP(cb,11) { C = rl(C); } /* RL C */
+OP(cb,12) { D = rl(D); } /* RL D */
+OP(cb,13) { E = rl(E); } /* RL E */
+OP(cb,14) { H = rl(H); } /* RL H */
+OP(cb,15) { L = rl(L); } /* RL L */
+OP(cb,16) { wm(HL, rl(rm_reg(HL))); } /* RL (HL) */
+OP(cb,17) { A = rl(A); } /* RL A */
+
+OP(cb,18) { B = rr(B); } /* RR B */
+OP(cb,19) { C = rr(C); } /* RR C */
+OP(cb,1a) { D = rr(D); } /* RR D */
+OP(cb,1b) { E = rr(E); } /* RR E */
+OP(cb,1c) { H = rr(H); } /* RR H */
+OP(cb,1d) { L = rr(L); } /* RR L */
+OP(cb,1e) { wm(HL, rr(rm_reg(HL))); } /* RR (HL) */
+OP(cb,1f) { A = rr(A); } /* RR A */
+
+OP(cb,20) { B = sla(B); } /* SLA B */
+OP(cb,21) { C = sla(C); } /* SLA C */
+OP(cb,22) { D = sla(D); } /* SLA D */
+OP(cb,23) { E = sla(E); } /* SLA E */
+OP(cb,24) { H = sla(H); } /* SLA H */
+OP(cb,25) { L = sla(L); } /* SLA L */
+OP(cb,26) { wm(HL, sla(rm_reg(HL)));} /* SLA (HL) */
+OP(cb,27) { A = sla(A); } /* SLA A */
+
+OP(cb,28) { B = sra(B); } /* SRA B */
+OP(cb,29) { C = sra(C); } /* SRA C */
+OP(cb,2a) { D = sra(D); } /* SRA D */
+OP(cb,2b) { E = sra(E); } /* SRA E */
+OP(cb,2c) { H = sra(H); } /* SRA H */
+OP(cb,2d) { L = sra(L); } /* SRA L */
+OP(cb,2e) { wm(HL, sra(rm_reg(HL)));} /* SRA (HL) */
+OP(cb,2f) { A = sra(A); } /* SRA A */
+
+OP(cb,30) { B = sll(B); } /* SLL B */
+OP(cb,31) { C = sll(C); } /* SLL C */
+OP(cb,32) { D = sll(D); } /* SLL D */
+OP(cb,33) { E = sll(E); } /* SLL E */
+OP(cb,34) { H = sll(H); } /* SLL H */
+OP(cb,35) { L = sll(L); } /* SLL L */
+OP(cb,36) { wm(HL, sll(rm_reg(HL)));} /* SLL (HL) */
+OP(cb,37) { A = sll(A); } /* SLL A */
+
+OP(cb,38) { B = srl(B); } /* SRL B */
+OP(cb,39) { C = srl(C); } /* SRL C */
+OP(cb,3a) { D = srl(D); } /* SRL D */
+OP(cb,3b) { E = srl(E); } /* SRL E */
+OP(cb,3c) { H = srl(H); } /* SRL H */
+OP(cb,3d) { L = srl(L); } /* SRL L */
+OP(cb,3e) { wm(HL, srl(rm_reg(HL)));} /* SRL (HL) */
+OP(cb,3f) { A = srl(A); } /* SRL A */
+
+OP(cb,40) { bit(0, B); } /* BIT 0,B */
+OP(cb,41) { bit(0, C); } /* BIT 0,C */
+OP(cb,42) { bit(0, D); } /* BIT 0,D */
+OP(cb,43) { bit(0, E); } /* BIT 0,E */
+OP(cb,44) { bit(0, H); } /* BIT 0,H */
+OP(cb,45) { bit(0, L); } /* BIT 0,L */
+OP(cb,46) { bit_hl(0, rm_reg(HL)); } /* BIT 0,(HL) */
+OP(cb,47) { bit(0, A); } /* BIT 0,A */
+
+OP(cb,48) { bit(1, B); } /* BIT 1,B */
+OP(cb,49) { bit(1, C); } /* BIT 1,C */
+OP(cb,4a) { bit(1, D); } /* BIT 1,D */
+OP(cb,4b) { bit(1, E); } /* BIT 1,E */
+OP(cb,4c) { bit(1, H); } /* BIT 1,H */
+OP(cb,4d) { bit(1, L); } /* BIT 1,L */
+OP(cb,4e) { bit_hl(1, rm_reg(HL)); } /* BIT 1,(HL) */
+OP(cb,4f) { bit(1, A); } /* BIT 1,A */
+
+OP(cb,50) { bit(2, B); } /* BIT 2,B */
+OP(cb,51) { bit(2, C); } /* BIT 2,C */
+OP(cb,52) { bit(2, D); } /* BIT 2,D */
+OP(cb,53) { bit(2, E); } /* BIT 2,E */
+OP(cb,54) { bit(2, H); } /* BIT 2,H */
+OP(cb,55) { bit(2, L); } /* BIT 2,L */
+OP(cb,56) { bit_hl(2, rm_reg(HL)); } /* BIT 2,(HL) */
+OP(cb,57) { bit(2, A); } /* BIT 2,A */
+
+OP(cb,58) { bit(3, B); } /* BIT 3,B */
+OP(cb,59) { bit(3, C); } /* BIT 3,C */
+OP(cb,5a) { bit(3, D); } /* BIT 3,D */
+OP(cb,5b) { bit(3, E); } /* BIT 3,E */
+OP(cb,5c) { bit(3, H); } /* BIT 3,H */
+OP(cb,5d) { bit(3, L); } /* BIT 3,L */
+OP(cb,5e) { bit_hl(3, rm_reg(HL)); } /* BIT 3,(HL) */
+OP(cb,5f) { bit(3, A); } /* BIT 3,A */
+
+OP(cb,60) { bit(4, B); } /* BIT 4,B */
+OP(cb,61) { bit(4, C); } /* BIT 4,C */
+OP(cb,62) { bit(4, D); } /* BIT 4,D */
+OP(cb,63) { bit(4, E); } /* BIT 4,E */
+OP(cb,64) { bit(4, H); } /* BIT 4,H */
+OP(cb,65) { bit(4, L); } /* BIT 4,L */
+OP(cb,66) { bit_hl(4, rm_reg(HL)); } /* BIT 4,(HL) */
+OP(cb,67) { bit(4, A); } /* BIT 4,A */
+
+OP(cb,68) { bit(5, B); } /* BIT 5,B */
+OP(cb,69) { bit(5, C); } /* BIT 5,C */
+OP(cb,6a) { bit(5, D); } /* BIT 5,D */
+OP(cb,6b) { bit(5, E); } /* BIT 5,E */
+OP(cb,6c) { bit(5, H); } /* BIT 5,H */
+OP(cb,6d) { bit(5, L); } /* BIT 5,L */
+OP(cb,6e) { bit_hl(5, rm_reg(HL)); } /* BIT 5,(HL) */
+OP(cb,6f) { bit(5, A); } /* BIT 5,A */
+
+OP(cb,70) { bit(6, B); } /* BIT 6,B */
+OP(cb,71) { bit(6, C); } /* BIT 6,C */
+OP(cb,72) { bit(6, D); } /* BIT 6,D */
+OP(cb,73) { bit(6, E); } /* BIT 6,E */
+OP(cb,74) { bit(6, H); } /* BIT 6,H */
+OP(cb,75) { bit(6, L); } /* BIT 6,L */
+OP(cb,76) { bit_hl(6, rm_reg(HL)); } /* BIT 6,(HL) */
+OP(cb,77) { bit(6, A); } /* BIT 6,A */
+
+OP(cb,78) { bit(7, B); } /* BIT 7,B */
+OP(cb,79) { bit(7, C); } /* BIT 7,C */
+OP(cb,7a) { bit(7, D); } /* BIT 7,D */
+OP(cb,7b) { bit(7, E); } /* BIT 7,E */
+OP(cb,7c) { bit(7, H); } /* BIT 7,H */
+OP(cb,7d) { bit(7, L); } /* BIT 7,L */
+OP(cb,7e) { bit_hl(7, rm_reg(HL)); } /* BIT 7,(HL) */
+OP(cb,7f) { bit(7, A); } /* BIT 7,A */
+
+OP(cb,80) { B = res(0, B); } /* RES 0,B */
+OP(cb,81) { C = res(0, C); } /* RES 0,C */
+OP(cb,82) { D = res(0, D); } /* RES 0,D */
+OP(cb,83) { E = res(0, E); } /* RES 0,E */
+OP(cb,84) { H = res(0, H); } /* RES 0,H */
+OP(cb,85) { L = res(0, L); } /* RES 0,L */
+OP(cb,86) { wm(HL, res(0, rm_reg(HL))); } /* RES 0,(HL) */
+OP(cb,87) { A = res(0, A); } /* RES 0,A */
+
+OP(cb,88) { B = res(1, B); } /* RES 1,B */
+OP(cb,89) { C = res(1, C); } /* RES 1,C */
+OP(cb,8a) { D = res(1, D); } /* RES 1,D */
+OP(cb,8b) { E = res(1, E); } /* RES 1,E */
+OP(cb,8c) { H = res(1, H); } /* RES 1,H */
+OP(cb,8d) { L = res(1, L); } /* RES 1,L */
+OP(cb,8e) { wm(HL, res(1, rm_reg(HL))); } /* RES 1,(HL) */
+OP(cb,8f) { A = res(1, A); } /* RES 1,A */
+
+OP(cb,90) { B = res(2, B); } /* RES 2,B */
+OP(cb,91) { C = res(2, C); } /* RES 2,C */
+OP(cb,92) { D = res(2, D); } /* RES 2,D */
+OP(cb,93) { E = res(2, E); } /* RES 2,E */
+OP(cb,94) { H = res(2, H); } /* RES 2,H */
+OP(cb,95) { L = res(2, L); } /* RES 2,L */
+OP(cb,96) { wm(HL, res(2, rm_reg(HL))); } /* RES 2,(HL) */
+OP(cb,97) { A = res(2, A); } /* RES 2,A */
+
+OP(cb,98) { B = res(3, B); } /* RES 3,B */
+OP(cb,99) { C = res(3, C); } /* RES 3,C */
+OP(cb,9a) { D = res(3, D); } /* RES 3,D */
+OP(cb,9b) { E = res(3, E); } /* RES 3,E */
+OP(cb,9c) { H = res(3, H); } /* RES 3,H */
+OP(cb,9d) { L = res(3, L); } /* RES 3,L */
+OP(cb,9e) { wm(HL, res(3, rm_reg(HL))); } /* RES 3,(HL) */
+OP(cb,9f) { A = res(3, A); } /* RES 3,A */
+
+OP(cb,a0) { B = res(4, B); } /* RES 4,B */
+OP(cb,a1) { C = res(4, C); } /* RES 4,C */
+OP(cb,a2) { D = res(4, D); } /* RES 4,D */
+OP(cb,a3) { E = res(4, E); } /* RES 4,E */
+OP(cb,a4) { H = res(4, H); } /* RES 4,H */
+OP(cb,a5) { L = res(4, L); } /* RES 4,L */
+OP(cb,a6) {wm(HL, res(4, rm_reg(HL))); } /* RES 4,(HL) */
+OP(cb,a7) { A = res(4, A); } /* RES 4,A */
+
+OP(cb,a8) { B = res(5, B); } /* RES 5,B */
+OP(cb,a9) { C = res(5, C); } /* RES 5,C */
+OP(cb,aa) { D = res(5, D); } /* RES 5,D */
+OP(cb,ab) { E = res(5, E); } /* RES 5,E */
+OP(cb,ac) { H = res(5, H); } /* RES 5,H */
+OP(cb,ad) { L = res(5, L); } /* RES 5,L */
+OP(cb,ae) { wm(HL, res(5, rm_reg(HL))); } /* RES 5,(HL) */
+OP(cb,af) { A = res(5, A); } /* RES 5,A */
+
+OP(cb,b0) { B = res(6, B); } /* RES 6,B */
+OP(cb,b1) { C = res(6, C); } /* RES 6,C */
+OP(cb,b2) { D = res(6, D); } /* RES 6,D */
+OP(cb,b3) { E = res(6, E); } /* RES 6,E */
+OP(cb,b4) { H = res(6, H); } /* RES 6,H */
+OP(cb,b5) { L = res(6, L); } /* RES 6,L */
+OP(cb,b6) { wm(HL, res(6, rm_reg(HL))); } /* RES 6,(HL) */
+OP(cb,b7) { A = res(6, A); } /* RES 6,A */
+
+OP(cb,b8) { B = res(7, B); } /* RES 7,B */
+OP(cb,b9) { C = res(7, C); } /* RES 7,C */
+OP(cb,ba) { D = res(7, D); } /* RES 7,D */
+OP(cb,bb) { E = res(7, E); } /* RES 7,E */
+OP(cb,bc) { H = res(7, H); } /* RES 7,H */
+OP(cb,bd) { L = res(7, L); } /* RES 7,L */
+OP(cb,be) { wm(HL, res(7, rm_reg(HL))); } /* RES 7,(HL) */
+OP(cb,bf) { A = res(7, A); } /* RES 7,A */
+
+OP(cb,c0) { B = set(0, B); } /* SET 0,B */
+OP(cb,c1) { C = set(0, C); } /* SET 0,C */
+OP(cb,c2) { D = set(0, D); } /* SET 0,D */
+OP(cb,c3) { E = set(0, E); } /* SET 0,E */
+OP(cb,c4) { H = set(0, H); } /* SET 0,H */
+OP(cb,c5) { L = set(0, L); } /* SET 0,L */
+OP(cb,c6) { wm(HL, set(0, rm_reg(HL))); } /* SET 0,(HL) */
+OP(cb,c7) { A = set(0, A); } /* SET 0,A */
+
+OP(cb,c8) { B = set(1, B); } /* SET 1,B */
+OP(cb,c9) { C = set(1, C); } /* SET 1,C */
+OP(cb,ca) { D = set(1, D); } /* SET 1,D */
+OP(cb,cb) { E = set(1, E); } /* SET 1,E */
+OP(cb,cc) { H = set(1, H); } /* SET 1,H */
+OP(cb,cd) { L = set(1, L); } /* SET 1,L */
+OP(cb,ce) { wm(HL, set(1, rm_reg(HL))); } /* SET 1,(HL) */
+OP(cb,cf) { A = set(1, A); } /* SET 1,A */
+
+OP(cb,d0) { B = set(2, B); } /* SET 2,B */
+OP(cb,d1) { C = set(2, C); } /* SET 2,C */
+OP(cb,d2) { D = set(2, D); } /* SET 2,D */
+OP(cb,d3) { E = set(2, E); } /* SET 2,E */
+OP(cb,d4) { H = set(2, H); } /* SET 2,H */
+OP(cb,d5) { L = set(2, L); } /* SET 2,L */
+OP(cb,d6) { wm(HL, set(2, rm_reg(HL))); } /* SET 2,(HL) */
+OP(cb,d7) { A = set(2, A); } /* SET 2,A */
+
+OP(cb,d8) { B = set(3, B); } /* SET 3,B */
+OP(cb,d9) { C = set(3, C); } /* SET 3,C */
+OP(cb,da) { D = set(3, D); } /* SET 3,D */
+OP(cb,db) { E = set(3, E); } /* SET 3,E */
+OP(cb,dc) { H = set(3, H); } /* SET 3,H */
+OP(cb,dd) { L = set(3, L); } /* SET 3,L */
+OP(cb,de) { wm(HL, set(3, rm_reg(HL))); } /* SET 3,(HL) */
+OP(cb,df) { A = set(3, A); } /* SET 3,A */
+
+OP(cb,e0) { B = set(4, B); } /* SET 4,B */
+OP(cb,e1) { C = set(4, C); } /* SET 4,C */
+OP(cb,e2) { D = set(4, D); } /* SET 4,D */
+OP(cb,e3) { E = set(4, E); } /* SET 4,E */
+OP(cb,e4) { H = set(4, H); } /* SET 4,H */
+OP(cb,e5) { L = set(4, L); } /* SET 4,L */
+OP(cb,e6) { wm(HL, set(4, rm_reg(HL))); } /* SET 4,(HL) */
+OP(cb,e7) { A = set(4, A); } /* SET 4,A */
+
+OP(cb,e8) { B = set(5, B); } /* SET 5,B */
+OP(cb,e9) { C = set(5, C); } /* SET 5,C */
+OP(cb,ea) { D = set(5, D); } /* SET 5,D */
+OP(cb,eb) { E = set(5, E); } /* SET 5,E */
+OP(cb,ec) { H = set(5, H); } /* SET 5,H */
+OP(cb,ed) { L = set(5, L); } /* SET 5,L */
+OP(cb,ee) { wm(HL, set(5, rm_reg(HL))); } /* SET 5,(HL) */
+OP(cb,ef) { A = set(5, A); } /* SET 5,A */
+
+OP(cb,f0) { B = set(6, B); } /* SET 6,B */
+OP(cb,f1) { C = set(6, C); } /* SET 6,C */
+OP(cb,f2) { D = set(6, D); } /* SET 6,D */
+OP(cb,f3) { E = set(6, E); } /* SET 6,E */
+OP(cb,f4) { H = set(6, H); } /* SET 6,H */
+OP(cb,f5) { L = set(6, L); } /* SET 6,L */
+OP(cb,f6) { wm(HL, set(6, rm_reg(HL))); } /* SET 6,(HL) */
+OP(cb,f7) { A = set(6, A); } /* SET 6,A */
+
+OP(cb,f8) { B = set(7, B); } /* SET 7,B */
+OP(cb,f9) { C = set(7, C); } /* SET 7,C */
+OP(cb,fa) { D = set(7, D); } /* SET 7,D */
+OP(cb,fb) { E = set(7, E); } /* SET 7,E */
+OP(cb,fc) { H = set(7, H); } /* SET 7,H */
+OP(cb,fd) { L = set(7, L); } /* SET 7,L */
+OP(cb,fe) { wm(HL, set(7, rm_reg(HL))); } /* SET 7,(HL) */
+OP(cb,ff) { A = set(7, A); } /* SET 7,A */
+
/**********************************************************
* opcodes with DD/FD CB prefix
* rotate, shift and bit operations with (IX+o)
**********************************************************/
-/* RLC B=(XY+o) */ OP(XY_CB,00) THEN TADR=m_ea; CALL rm_reg(); THEN B=rlc(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RLC C=(XY+o) */ OP(XY_CB,01) THEN TADR=m_ea; CALL rm_reg(); THEN C=rlc(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RLC D=(XY+o) */ OP(XY_CB,02) THEN TADR=m_ea; CALL rm_reg(); THEN D=rlc(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RLC E=(XY+o) */ OP(XY_CB,03) THEN TADR=m_ea; CALL rm_reg(); THEN E=rlc(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RLC H=(XY+o) */ OP(XY_CB,04) THEN TADR=m_ea; CALL rm_reg(); THEN H=rlc(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RLC L=(XY+o) */ OP(XY_CB,05) THEN TADR=m_ea; CALL rm_reg(); THEN L=rlc(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RLC (XY+o) */ OP(XY_CB,06) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=rlc(TDAT8); CALL wm(); ENDOP
-/* RLC A=(XY+o) */ OP(XY_CB,07) THEN TADR=m_ea; CALL rm_reg(); THEN A=rlc(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RRC B=(XY+o) */ OP(XY_CB,08) THEN TADR=m_ea; CALL rm_reg(); THEN B=rrc(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RRC C=(XY+o) */ OP(XY_CB,09) THEN TADR=m_ea; CALL rm_reg(); THEN C=rrc(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RRC D=(XY+o) */ OP(XY_CB,0a) THEN TADR=m_ea; CALL rm_reg(); THEN D=rrc(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RRC E=(XY+o) */ OP(XY_CB,0b) THEN TADR=m_ea; CALL rm_reg(); THEN E=rrc(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RRC H=(XY+o) */ OP(XY_CB,0c) THEN TADR=m_ea; CALL rm_reg(); THEN H=rrc(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RRC L=(XY+o) */ OP(XY_CB,0d) THEN TADR=m_ea; CALL rm_reg(); THEN L=rrc(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RRC (XY+o) */ OP(XY_CB,0e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=rrc(TDAT8); CALL wm(); ENDOP
-/* RRC A=(XY+o) */ OP(XY_CB,0f) THEN TADR=m_ea; CALL rm_reg(); THEN A=rrc(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RL B=(XY+o) */ OP(XY_CB,10) THEN TADR=m_ea; CALL rm_reg(); THEN B=rl(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RL C=(XY+o) */ OP(XY_CB,11) THEN TADR=m_ea; CALL rm_reg(); THEN C=rl(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RL D=(XY+o) */ OP(XY_CB,12) THEN TADR=m_ea; CALL rm_reg(); THEN D=rl(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RL E=(XY+o) */ OP(XY_CB,13) THEN TADR=m_ea; CALL rm_reg(); THEN E=rl(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RL H=(XY+o) */ OP(XY_CB,14) THEN TADR=m_ea; CALL rm_reg(); THEN H=rl(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RL L=(XY+o) */ OP(XY_CB,15) THEN TADR=m_ea; CALL rm_reg(); THEN L=rl(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RL (XY+o) */ OP(XY_CB,16) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=rl(TDAT8); CALL wm(); ENDOP
-/* RL A=(XY+o) */ OP(XY_CB,17) THEN TADR=m_ea; CALL rm_reg(); THEN A=rl(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RR B=(XY+o) */ OP(XY_CB,18) THEN TADR=m_ea; CALL rm_reg(); THEN B=rr(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RR C=(XY+o) */ OP(XY_CB,19) THEN TADR=m_ea; CALL rm_reg(); THEN C=rr(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RR D=(XY+o) */ OP(XY_CB,1a) THEN TADR=m_ea; CALL rm_reg(); THEN D=rr(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RR E=(XY+o) */ OP(XY_CB,1b) THEN TADR=m_ea; CALL rm_reg(); THEN E=rr(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RR H=(XY+o) */ OP(XY_CB,1c) THEN TADR=m_ea; CALL rm_reg(); THEN H=rr(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RR L=(XY+o) */ OP(XY_CB,1d) THEN TADR=m_ea; CALL rm_reg(); THEN L=rr(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RR (XY+o) */ OP(XY_CB,1e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=rr(TDAT8); CALL wm(); ENDOP
-/* RR A=(XY+o) */ OP(XY_CB,1f) THEN TADR=m_ea; CALL rm_reg(); THEN A=rr(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SLA B=(XY+o) */ OP(XY_CB,20) THEN TADR=m_ea; CALL rm_reg(); THEN B=sla(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SLA C=(XY+o) */ OP(XY_CB,21) THEN TADR=m_ea; CALL rm_reg(); THEN C=sla(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SLA D=(XY+o) */ OP(XY_CB,22) THEN TADR=m_ea; CALL rm_reg(); THEN D=sla(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SLA E=(XY+o) */ OP(XY_CB,23) THEN TADR=m_ea; CALL rm_reg(); THEN E=sla(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SLA H=(XY+o) */ OP(XY_CB,24) THEN TADR=m_ea; CALL rm_reg(); THEN H=sla(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SLA L=(XY+o) */ OP(XY_CB,25) THEN TADR=m_ea; CALL rm_reg(); THEN L=sla(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SLA (XY+o) */ OP(XY_CB,26) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=sla(TDAT8); CALL wm(); ENDOP
-/* SLA A=(XY+o) */ OP(XY_CB,27) THEN TADR=m_ea; CALL rm_reg(); THEN A=sla(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SRA B=(XY+o) */ OP(XY_CB,28) THEN TADR=m_ea; CALL rm_reg(); THEN B=sra(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SRA C=(XY+o) */ OP(XY_CB,29) THEN TADR=m_ea; CALL rm_reg(); THEN C=sra(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SRA D=(XY+o) */ OP(XY_CB,2a) THEN TADR=m_ea; CALL rm_reg(); THEN D=sra(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SRA E=(XY+o) */ OP(XY_CB,2b) THEN TADR=m_ea; CALL rm_reg(); THEN E=sra(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SRA H=(XY+o) */ OP(XY_CB,2c) THEN TADR=m_ea; CALL rm_reg(); THEN H=sra(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SRA L=(XY+o) */ OP(XY_CB,2d) THEN TADR=m_ea; CALL rm_reg(); THEN L=sra(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SRA (XY+o) */ OP(XY_CB,2e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=sra(TDAT8); CALL wm(); ENDOP
-/* SRA A=(XY+o) */ OP(XY_CB,2f) THEN TADR=m_ea; CALL rm_reg(); THEN A=sra(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SLL B=(XY+o) */ OP(XY_CB,30) THEN TADR=m_ea; CALL rm_reg(); THEN B=sll(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SLL C=(XY+o) */ OP(XY_CB,31) THEN TADR=m_ea; CALL rm_reg(); THEN C=sll(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SLL D=(XY+o) */ OP(XY_CB,32) THEN TADR=m_ea; CALL rm_reg(); THEN D=sll(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SLL E=(XY+o) */ OP(XY_CB,33) THEN TADR=m_ea; CALL rm_reg(); THEN E=sll(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SLL H=(XY+o) */ OP(XY_CB,34) THEN TADR=m_ea; CALL rm_reg(); THEN H=sll(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SLL L=(XY+o) */ OP(XY_CB,35) THEN TADR=m_ea; CALL rm_reg(); THEN L=sll(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SLL (XY+o) */ OP(XY_CB,36) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=sll(TDAT8); CALL wm(); ENDOP
-/* SLL A=(XY+o) */ OP(XY_CB,37) THEN TADR=m_ea; CALL rm_reg(); THEN A=sll(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SRL B=(XY+o) */ OP(XY_CB,38) THEN TADR=m_ea; CALL rm_reg(); THEN B=srl(TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SRL C=(XY+o) */ OP(XY_CB,39) THEN TADR=m_ea; CALL rm_reg(); THEN C=srl(TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SRL D=(XY+o) */ OP(XY_CB,3a) THEN TADR=m_ea; CALL rm_reg(); THEN D=srl(TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SRL E=(XY+o) */ OP(XY_CB,3b) THEN TADR=m_ea; CALL rm_reg(); THEN E=srl(TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SRL H=(XY+o) */ OP(XY_CB,3c) THEN TADR=m_ea; CALL rm_reg(); THEN H=srl(TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SRL L=(XY+o) */ OP(XY_CB,3d) THEN TADR=m_ea; CALL rm_reg(); THEN L=srl(TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SRL (XY+o) */ OP(XY_CB,3e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=srl(TDAT8); CALL wm(); ENDOP
-/* SRL A=(XY+o) */ OP(XY_CB,3f) THEN TADR=m_ea; CALL rm_reg(); THEN A=srl(TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* BIT 0,(XY+o) */ OP(XY_CB,40) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,41) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,42) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,43) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,44) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,45) JPP(XY_CB, 46)
-/* BIT 0,(XY+o) */ OP(XY_CB,46) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(0, TDAT8); ENDOP
-/* BIT 0,(XY+o) */ OP(XY_CB,47) JPP(XY_CB, 46)
-
-/* BIT 1,(XY+o) */ OP(XY_CB,48) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,49) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,4a) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,4b) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,4c) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,4d) JPP(XY_CB, 4e)
-/* BIT 1,(XY+o) */ OP(XY_CB,4e) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(1, TDAT8); ENDOP
-/* BIT 1,(XY+o) */ OP(XY_CB,4f) JPP(XY_CB, 4e)
-
-/* BIT 2,(XY+o) */ OP(XY_CB,50) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,51) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,52) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,53) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,54) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,55) JPP(XY_CB, 56)
-/* BIT 2,(XY+o) */ OP(XY_CB,56) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(2, TDAT8); ENDOP
-/* BIT 2,(XY+o) */ OP(XY_CB,57) JPP(XY_CB, 56)
-
-/* BIT 3,(XY+o) */ OP(XY_CB,58) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,59) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,5a) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,5b) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,5c) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,5d) JPP(XY_CB, 5e)
-/* BIT 3,(XY+o) */ OP(XY_CB,5e) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(3, TDAT8); ENDOP
-/* BIT 3,(XY+o) */ OP(XY_CB,5f) JPP(XY_CB, 5e)
-
-/* BIT 4,(XY+o) */ OP(XY_CB,60) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,61) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,62) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,63) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,64) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,65) JPP(XY_CB, 66)
-/* BIT 4,(XY+o) */ OP(XY_CB,66) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(4, TDAT8); ENDOP
-/* BIT 4,(XY+o) */ OP(XY_CB,67) JPP(XY_CB, 66)
-
-/* BIT 5,(XY+o) */ OP(XY_CB,68) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,69) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,6a) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,6b) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,6c) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,6d) JPP(XY_CB, 6e)
-/* BIT 5,(XY+o) */ OP(XY_CB,6e) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(5, TDAT8); ENDOP
-/* BIT 5,(XY+o) */ OP(XY_CB,6f) JPP(XY_CB, 6e)
-
-/* BIT 6,(XY+o) */ OP(XY_CB,70) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,71) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,72) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,73) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,74) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,75) JPP(XY_CB, 76)
-/* BIT 6,(XY+o) */ OP(XY_CB,76) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(6, TDAT8); ENDOP
-/* BIT 6,(XY+o) */ OP(XY_CB,77) JPP(XY_CB, 76)
-
-/* BIT 7,(XY+o) */ OP(XY_CB,78) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,79) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,7a) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,7b) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,7c) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,7d) JPP(XY_CB, 7e)
-/* BIT 7,(XY+o) */ OP(XY_CB,7e) THEN TADR=m_ea; CALL rm_reg(); THEN bit_xy(7, TDAT8); ENDOP
-/* BIT 7,(XY+o) */ OP(XY_CB,7f) JPP(XY_CB, 7e)
-
-/* RES 0,B=(XY+o) */ OP(XY_CB,80) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(0, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 0,C=(XY+o) */ OP(XY_CB,81) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(0, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 0,D=(XY+o) */ OP(XY_CB,82) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(0, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 0,E=(XY+o) */ OP(XY_CB,83) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(0, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 0,H=(XY+o) */ OP(XY_CB,84) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(0, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 0,L=(XY+o) */ OP(XY_CB,85) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(0, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 0,(XY+o) */ OP(XY_CB,86) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(0, TDAT8); CALL wm(); ENDOP
-/* RES 0,A=(XY+o) */ OP(XY_CB,87) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(0, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 1,B=(XY+o) */ OP(XY_CB,88) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(1, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 1,C=(XY+o) */ OP(XY_CB,89) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(1, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 1,D=(XY+o) */ OP(XY_CB,8a) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(1, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 1,E=(XY+o) */ OP(XY_CB,8b) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(1, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 1,H=(XY+o) */ OP(XY_CB,8c) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(1, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 1,L=(XY+o) */ OP(XY_CB,8d) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(1, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 1,(XY+o) */ OP(XY_CB,8e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(1, TDAT8); CALL wm(); ENDOP
-/* RES 1,A=(XY+o) */ OP(XY_CB,8f) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(1, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 2,B=(XY+o) */ OP(XY_CB,90) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(2, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 2,C=(XY+o) */ OP(XY_CB,91) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(2, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 2,D=(XY+o) */ OP(XY_CB,92) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(2, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 2,E=(XY+o) */ OP(XY_CB,93) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(2, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 2,H=(XY+o) */ OP(XY_CB,94) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(2, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 2,L=(XY+o) */ OP(XY_CB,95) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(2, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 2,(XY+o) */ OP(XY_CB,96) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(2, TDAT8); CALL wm(); ENDOP
-/* RES 2,A=(XY+o) */ OP(XY_CB,97) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(2, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 3,B=(XY+o) */ OP(XY_CB,98) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(3, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 3,C=(XY+o) */ OP(XY_CB,99) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(3, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 3,D=(XY+o) */ OP(XY_CB,9a) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(3, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 3,E=(XY+o) */ OP(XY_CB,9b) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(3, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 3,H=(XY+o) */ OP(XY_CB,9c) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(3, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 3,L=(XY+o) */ OP(XY_CB,9d) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(3, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 3,(XY+o) */ OP(XY_CB,9e) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(3, TDAT8); CALL wm(); ENDOP
-/* RES 3,A=(XY+o) */ OP(XY_CB,9f) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(3, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 4,B=(XY+o) */ OP(XY_CB,a0) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(4, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 4,C=(XY+o) */ OP(XY_CB,a1) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(4, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 4,D=(XY+o) */ OP(XY_CB,a2) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(4, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 4,E=(XY+o) */ OP(XY_CB,a3) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(4, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 4,H=(XY+o) */ OP(XY_CB,a4) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(4, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 4,L=(XY+o) */ OP(XY_CB,a5) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(4, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 4,(XY+o) */ OP(XY_CB,a6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(4, TDAT8); CALL wm(); ENDOP
-/* RES 4,A=(XY+o) */ OP(XY_CB,a7) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(4, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 5,B=(XY+o) */ OP(XY_CB,a8) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(5, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 5,C=(XY+o) */ OP(XY_CB,a9) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(5, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 5,D=(XY+o) */ OP(XY_CB,aa) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(5, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 5,E=(XY+o) */ OP(XY_CB,ab) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(5, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 5,H=(XY+o) */ OP(XY_CB,ac) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(5, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 5,L=(XY+o) */ OP(XY_CB,ad) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(5, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 5,(XY+o) */ OP(XY_CB,ae) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(5, TDAT8); CALL wm(); ENDOP
-/* RES 5,A=(XY+o) */ OP(XY_CB,af) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(5, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 6,B=(XY+o) */ OP(XY_CB,b0) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(6, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 6,C=(XY+o) */ OP(XY_CB,b1) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(6, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 6,D=(XY+o) */ OP(XY_CB,b2) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(6, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 6,E=(XY+o) */ OP(XY_CB,b3) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(6, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 6,H=(XY+o) */ OP(XY_CB,b4) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(6, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 6,L=(XY+o) */ OP(XY_CB,b5) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(6, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 6,(XY+o) */ OP(XY_CB,b6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(6, TDAT8); CALL wm(); ENDOP
-/* RES 6,A=(XY+o) */ OP(XY_CB,b7) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(6, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* RES 7,B=(XY+o) */ OP(XY_CB,b8) THEN TADR=m_ea; CALL rm_reg(); THEN B=res(7, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* RES 7,C=(XY+o) */ OP(XY_CB,b9) THEN TADR=m_ea; CALL rm_reg(); THEN C=res(7, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* RES 7,D=(XY+o) */ OP(XY_CB,ba) THEN TADR=m_ea; CALL rm_reg(); THEN D=res(7, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* RES 7,E=(XY+o) */ OP(XY_CB,bb) THEN TADR=m_ea; CALL rm_reg(); THEN E=res(7, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* RES 7,H=(XY+o) */ OP(XY_CB,bc) THEN TADR=m_ea; CALL rm_reg(); THEN H=res(7, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* RES 7,L=(XY+o) */ OP(XY_CB,bd) THEN TADR=m_ea; CALL rm_reg(); THEN L=res(7, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* RES 7,(XY+o) */ OP(XY_CB,be) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=res(7, TDAT8); CALL wm(); ENDOP
-/* RES 7,A=(XY+o) */ OP(XY_CB,bf) THEN TADR=m_ea; CALL rm_reg(); THEN A=res(7, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 0,B=(XY+o) */ OP(XY_CB,c0) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(0, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 0,C=(XY+o) */ OP(XY_CB,c1) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(0, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 0,D=(XY+o) */ OP(XY_CB,c2) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(0, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 0,E=(XY+o) */ OP(XY_CB,c3) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(0, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 0,H=(XY+o) */ OP(XY_CB,c4) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(0, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 0,L=(XY+o) */ OP(XY_CB,c5) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(0, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 0,(XY+o) */ OP(XY_CB,c6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(0, TDAT8); CALL wm(); ENDOP
-/* SET 0,A=(XY+o) */ OP(XY_CB,c7) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(0, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 1,B=(XY+o) */ OP(XY_CB,c8) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(1, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 1,C=(XY+o) */ OP(XY_CB,c9) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(1, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 1,D=(XY+o) */ OP(XY_CB,ca) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(1, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 1,E=(XY+o) */ OP(XY_CB,cb) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(1, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 1,H=(XY+o) */ OP(XY_CB,cc) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(1, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 1,L=(XY+o) */ OP(XY_CB,cd) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(1, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 1,(XY+o) */ OP(XY_CB,ce) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(1, TDAT8); CALL wm(); ENDOP
-/* SET 1,A=(XY+o) */ OP(XY_CB,cf) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(1, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 2,B=(XY+o) */ OP(XY_CB,d0) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(2, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 2,C=(XY+o) */ OP(XY_CB,d1) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(2, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 2,D=(XY+o) */ OP(XY_CB,d2) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(2, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 2,E=(XY+o) */ OP(XY_CB,d3) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(2, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 2,H=(XY+o) */ OP(XY_CB,d4) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(2, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 2,L=(XY+o) */ OP(XY_CB,d5) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(2, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 2,(XY+o) */ OP(XY_CB,d6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(2, TDAT8); CALL wm(); ENDOP
-/* SET 2,A=(XY+o) */ OP(XY_CB,d7) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(2, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 3,B=(XY+o) */ OP(XY_CB,d8) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(3, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 3,C=(XY+o) */ OP(XY_CB,d9) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(3, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 3,D=(XY+o) */ OP(XY_CB,da) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(3, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 3,E=(XY+o) */ OP(XY_CB,db) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(3, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 3,H=(XY+o) */ OP(XY_CB,dc) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(3, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 3,L=(XY+o) */ OP(XY_CB,dd) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(3, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 3,(XY+o) */ OP(XY_CB,de) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(3, TDAT8); CALL wm(); ENDOP
-/* SET 3,A=(XY+o) */ OP(XY_CB,df) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(3, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 4,B=(XY+o) */ OP(XY_CB,e0) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(4, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 4,C=(XY+o) */ OP(XY_CB,e1) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(4, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 4,D=(XY+o) */ OP(XY_CB,e2) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(4, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 4,E=(XY+o) */ OP(XY_CB,e3) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(4, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 4,H=(XY+o) */ OP(XY_CB,e4) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(4, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 4,L=(XY+o) */ OP(XY_CB,e5) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(4, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 4,(XY+o) */ OP(XY_CB,e6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(4, TDAT8); CALL wm(); ENDOP
-/* SET 4,A=(XY+o) */ OP(XY_CB,e7) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(4, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 5,B=(XY+o) */ OP(XY_CB,e8) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(5, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 5,C=(XY+o) */ OP(XY_CB,e9) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(5, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 5,D=(XY+o) */ OP(XY_CB,ea) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(5, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 5,E=(XY+o) */ OP(XY_CB,eb) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(5, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 5,H=(XY+o) */ OP(XY_CB,ec) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(5, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 5,L=(XY+o) */ OP(XY_CB,ed) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(5, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 5,(XY+o) */ OP(XY_CB,ee) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(5, TDAT8); CALL wm(); ENDOP
-/* SET 5,A=(XY+o) */ OP(XY_CB,ef) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(5, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 6,B=(XY+o) */ OP(XY_CB,f0) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(6, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 6,C=(XY+o) */ OP(XY_CB,f1) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(6, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 6,D=(XY+o) */ OP(XY_CB,f2) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(6, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 6,E=(XY+o) */ OP(XY_CB,f3) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(6, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 6,H=(XY+o) */ OP(XY_CB,f4) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(6, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 6,L=(XY+o) */ OP(XY_CB,f5) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(6, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 6,(XY+o) */ OP(XY_CB,f6) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(6, TDAT8); CALL wm(); ENDOP
-/* SET 6,A=(XY+o) */ OP(XY_CB,f7) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(6, TDAT8); TDAT8=A; CALL wm(); ENDOP
-
-/* SET 7,B=(XY+o) */ OP(XY_CB,f8) THEN TADR=m_ea; CALL rm_reg(); THEN B=set(7, TDAT8); TDAT8=B; CALL wm(); ENDOP
-/* SET 7,C=(XY+o) */ OP(XY_CB,f9) THEN TADR=m_ea; CALL rm_reg(); THEN C=set(7, TDAT8); TDAT8=C; CALL wm(); ENDOP
-/* SET 7,D=(XY+o) */ OP(XY_CB,fa) THEN TADR=m_ea; CALL rm_reg(); THEN D=set(7, TDAT8); TDAT8=D; CALL wm(); ENDOP
-/* SET 7,E=(XY+o) */ OP(XY_CB,fb) THEN TADR=m_ea; CALL rm_reg(); THEN E=set(7, TDAT8); TDAT8=E; CALL wm(); ENDOP
-/* SET 7,H=(XY+o) */ OP(XY_CB,fc) THEN TADR=m_ea; CALL rm_reg(); THEN H=set(7, TDAT8); TDAT8=H; CALL wm(); ENDOP
-/* SET 7,L=(XY+o) */ OP(XY_CB,fd) THEN TADR=m_ea; CALL rm_reg(); THEN L=set(7, TDAT8); TDAT8=L; CALL wm(); ENDOP
-/* SET 7,(XY+o) */ OP(XY_CB,fe) THEN TADR=m_ea; CALL rm_reg(); THEN TDAT8=set(7, TDAT8); CALL wm(); ENDOP
-/* SET 7,A=(XY+o) */ OP(XY_CB,ff) THEN TADR=m_ea; CALL rm_reg(); THEN A=set(7, TDAT8); TDAT8=A; CALL wm(); ENDOP
+OP(xycb,00) { B = rlc(rm_reg(m_ea)); wm(m_ea, B); } /* RLC B=(XY+o) */
+OP(xycb,01) { C = rlc(rm_reg(m_ea)); wm(m_ea, C); } /* RLC C=(XY+o) */
+OP(xycb,02) { D = rlc(rm_reg(m_ea)); wm(m_ea, D); } /* RLC D=(XY+o) */
+OP(xycb,03) { E = rlc(rm_reg(m_ea)); wm(m_ea, E); } /* RLC E=(XY+o) */
+OP(xycb,04) { H = rlc(rm_reg(m_ea)); wm(m_ea, H); } /* RLC H=(XY+o) */
+OP(xycb,05) { L = rlc(rm_reg(m_ea)); wm(m_ea, L); } /* RLC L=(XY+o) */
+OP(xycb,06) { wm(m_ea, rlc(rm_reg(m_ea))); } /* RLC (XY+o) */
+OP(xycb,07) { A = rlc(rm_reg(m_ea)); wm(m_ea, A); } /* RLC A=(XY+o) */
+
+OP(xycb,08) { B = rrc(rm_reg(m_ea)); wm(m_ea, B); } /* RRC B=(XY+o) */
+OP(xycb,09) { C = rrc(rm_reg(m_ea)); wm(m_ea, C); } /* RRC C=(XY+o) */
+OP(xycb,0a) { D = rrc(rm_reg(m_ea)); wm(m_ea, D); } /* RRC D=(XY+o) */
+OP(xycb,0b) { E = rrc(rm_reg(m_ea)); wm(m_ea, E); } /* RRC E=(XY+o) */
+OP(xycb,0c) { H = rrc(rm_reg(m_ea)); wm(m_ea, H); } /* RRC H=(XY+o) */
+OP(xycb,0d) { L = rrc(rm_reg(m_ea)); wm(m_ea, L); } /* RRC L=(XY+o) */
+OP(xycb,0e) { wm(m_ea,rrc(rm_reg(m_ea))); } /* RRC (XY+o) */
+OP(xycb,0f) { A = rrc(rm_reg(m_ea)); wm(m_ea, A); } /* RRC A=(XY+o) */
+
+OP(xycb,10) { B = rl(rm_reg(m_ea)); wm(m_ea, B); } /* RL B=(XY+o) */
+OP(xycb,11) { C = rl(rm_reg(m_ea)); wm(m_ea, C); } /* RL C=(XY+o) */
+OP(xycb,12) { D = rl(rm_reg(m_ea)); wm(m_ea, D); } /* RL D=(XY+o) */
+OP(xycb,13) { E = rl(rm_reg(m_ea)); wm(m_ea, E); } /* RL E=(XY+o) */
+OP(xycb,14) { H = rl(rm_reg(m_ea)); wm(m_ea, H); } /* RL H=(XY+o) */
+OP(xycb,15) { L = rl(rm_reg(m_ea)); wm(m_ea, L); } /* RL L=(XY+o) */
+OP(xycb,16) { wm(m_ea,rl(rm_reg(m_ea))); } /* RL (XY+o) */
+OP(xycb,17) { A = rl(rm_reg(m_ea)); wm(m_ea, A); } /* RL A=(XY+o) */
+
+OP(xycb,18) { B = rr(rm_reg(m_ea)); wm(m_ea, B); } /* RR B=(XY+o) */
+OP(xycb,19) { C = rr(rm_reg(m_ea)); wm(m_ea, C); } /* RR C=(XY+o) */
+OP(xycb,1a) { D = rr(rm_reg(m_ea)); wm(m_ea, D); } /* RR D=(XY+o) */
+OP(xycb,1b) { E = rr(rm_reg(m_ea)); wm(m_ea, E); } /* RR E=(XY+o) */
+OP(xycb,1c) { H = rr(rm_reg(m_ea)); wm(m_ea, H); } /* RR H=(XY+o) */
+OP(xycb,1d) { L = rr(rm_reg(m_ea)); wm(m_ea, L); } /* RR L=(XY+o) */
+OP(xycb,1e) { wm(m_ea, rr(rm_reg(m_ea))); } /* RR (XY+o) */
+OP(xycb,1f) { A = rr(rm_reg(m_ea)); wm(m_ea, A); } /* RR A=(XY+o) */
+
+OP(xycb,20) { B = sla(rm_reg(m_ea)); wm(m_ea, B); } /* SLA B=(XY+o) */
+OP(xycb,21) { C = sla(rm_reg(m_ea)); wm(m_ea, C); } /* SLA C=(XY+o) */
+OP(xycb,22) { D = sla(rm_reg(m_ea)); wm(m_ea, D); } /* SLA D=(XY+o) */
+OP(xycb,23) { E = sla(rm_reg(m_ea)); wm(m_ea, E); } /* SLA E=(XY+o) */
+OP(xycb,24) { H = sla(rm_reg(m_ea)); wm(m_ea, H); } /* SLA H=(XY+o) */
+OP(xycb,25) { L = sla(rm_reg(m_ea)); wm(m_ea, L); } /* SLA L=(XY+o) */
+OP(xycb,26) { wm(m_ea, sla(rm_reg(m_ea))); } /* SLA (XY+o) */
+OP(xycb,27) { A = sla(rm_reg(m_ea)); wm(m_ea, A); } /* SLA A=(XY+o) */
+
+OP(xycb,28) { B = sra(rm_reg(m_ea)); wm(m_ea, B); } /* SRA B=(XY+o) */
+OP(xycb,29) { C = sra(rm_reg(m_ea)); wm(m_ea, C); } /* SRA C=(XY+o) */
+OP(xycb,2a) { D = sra(rm_reg(m_ea)); wm(m_ea, D); } /* SRA D=(XY+o) */
+OP(xycb,2b) { E = sra(rm_reg(m_ea)); wm(m_ea, E); } /* SRA E=(XY+o) */
+OP(xycb,2c) { H = sra(rm_reg(m_ea)); wm(m_ea, H); } /* SRA H=(XY+o) */
+OP(xycb,2d) { L = sra(rm_reg(m_ea)); wm(m_ea, L); } /* SRA L=(XY+o) */
+OP(xycb,2e) { wm(m_ea, sra(rm_reg(m_ea))); } /* SRA (XY+o) */
+OP(xycb,2f) { A = sra(rm_reg(m_ea)); wm(m_ea, A); } /* SRA A=(XY+o) */
+
+OP(xycb,30) { B = sll(rm_reg(m_ea)); wm(m_ea, B); } /* SLL B=(XY+o) */
+OP(xycb,31) { C = sll(rm_reg(m_ea)); wm(m_ea, C); } /* SLL C=(XY+o) */
+OP(xycb,32) { D = sll(rm_reg(m_ea)); wm(m_ea, D); } /* SLL D=(XY+o) */
+OP(xycb,33) { E = sll(rm_reg(m_ea)); wm(m_ea, E); } /* SLL E=(XY+o) */
+OP(xycb,34) { H = sll(rm_reg(m_ea)); wm(m_ea, H); } /* SLL H=(XY+o) */
+OP(xycb,35) { L = sll(rm_reg(m_ea)); wm(m_ea, L); } /* SLL L=(XY+o) */
+OP(xycb,36) { wm(m_ea, sll(rm_reg(m_ea))); } /* SLL (XY+o) */
+OP(xycb,37) { A = sll(rm_reg(m_ea)); wm(m_ea, A); } /* SLL A=(XY+o) */
+
+OP(xycb,38) { B = srl(rm_reg(m_ea)); wm(m_ea, B); } /* SRL B=(XY+o) */
+OP(xycb,39) { C = srl(rm_reg(m_ea)); wm(m_ea, C); } /* SRL C=(XY+o) */
+OP(xycb,3a) { D = srl(rm_reg(m_ea)); wm(m_ea, D); } /* SRL D=(XY+o) */
+OP(xycb,3b) { E = srl(rm_reg(m_ea)); wm(m_ea, E); } /* SRL E=(XY+o) */
+OP(xycb,3c) { H = srl(rm_reg(m_ea)); wm(m_ea, H); } /* SRL H=(XY+o) */
+OP(xycb,3d) { L = srl(rm_reg(m_ea)); wm(m_ea, L); } /* SRL L=(XY+o) */
+OP(xycb,3e) { wm(m_ea, srl(rm_reg(m_ea))); } /* SRL (XY+o) */
+OP(xycb,3f) { A = srl(rm_reg(m_ea)); wm(m_ea, A); } /* SRL A=(XY+o) */
+
+OP(xycb,40) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,41) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,42) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,43) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,44) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,45) { xycb_46(); } /* BIT 0,(XY+o) */
+OP(xycb,46) { bit_xy(0, rm_reg(m_ea)); } /* BIT 0,(XY+o) */
+OP(xycb,47) { xycb_46(); } /* BIT 0,(XY+o) */
+
+OP(xycb,48) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,49) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,4a) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,4b) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,4c) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,4d) { xycb_4e(); } /* BIT 1,(XY+o) */
+OP(xycb,4e) { bit_xy(1, rm_reg(m_ea)); } /* BIT 1,(XY+o) */
+OP(xycb,4f) { xycb_4e(); } /* BIT 1,(XY+o) */
+
+OP(xycb,50) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,51) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,52) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,53) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,54) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,55) { xycb_56(); } /* BIT 2,(XY+o) */
+OP(xycb,56) { bit_xy(2, rm_reg(m_ea)); } /* BIT 2,(XY+o) */
+OP(xycb,57) { xycb_56(); } /* BIT 2,(XY+o) */
+
+OP(xycb,58) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,59) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,5a) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,5b) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,5c) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,5d) { xycb_5e(); } /* BIT 3,(XY+o) */
+OP(xycb,5e) { bit_xy(3, rm_reg(m_ea)); } /* BIT 3,(XY+o) */
+OP(xycb,5f) { xycb_5e(); } /* BIT 3,(XY+o) */
+
+OP(xycb,60) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,61) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,62) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,63) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,64) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,65) { xycb_66(); } /* BIT 4,(XY+o) */
+OP(xycb,66) { bit_xy(4, rm_reg(m_ea)); } /* BIT 4,(XY+o) */
+OP(xycb,67) { xycb_66(); } /* BIT 4,(XY+o) */
+
+OP(xycb,68) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,69) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,6a) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,6b) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,6c) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,6d) { xycb_6e(); } /* BIT 5,(XY+o) */
+OP(xycb,6e) { bit_xy(5, rm_reg(m_ea)); } /* BIT 5,(XY+o) */
+OP(xycb,6f) { xycb_6e(); } /* BIT 5,(XY+o) */
+
+OP(xycb,70) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,71) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,72) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,73) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,74) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,75) { xycb_76(); } /* BIT 6,(XY+o) */
+OP(xycb,76) { bit_xy(6, rm_reg(m_ea)); } /* BIT 6,(XY+o) */
+OP(xycb,77) { xycb_76(); } /* BIT 6,(XY+o) */
+
+OP(xycb,78) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,79) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,7a) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,7b) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,7c) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,7d) { xycb_7e(); } /* BIT 7,(XY+o) */
+OP(xycb,7e) { bit_xy(7, rm_reg(m_ea)); } /* BIT 7,(XY+o) */
+OP(xycb,7f) { xycb_7e(); } /* BIT 7,(XY+o) */
+
+OP(xycb,80) { B = res(0, rm_reg(m_ea)); wm(m_ea, B); } /* RES 0,B=(XY+o) */
+OP(xycb,81) { C = res(0, rm_reg(m_ea)); wm(m_ea, C); } /* RES 0,C=(XY+o) */
+OP(xycb,82) { D = res(0, rm_reg(m_ea)); wm(m_ea, D); } /* RES 0,D=(XY+o) */
+OP(xycb,83) { E = res(0, rm_reg(m_ea)); wm(m_ea, E); } /* RES 0,E=(XY+o) */
+OP(xycb,84) { H = res(0, rm_reg(m_ea)); wm(m_ea, H); } /* RES 0,H=(XY+o) */
+OP(xycb,85) { L = res(0, rm_reg(m_ea)); wm(m_ea, L); } /* RES 0,L=(XY+o) */
+OP(xycb,86) { wm(m_ea, res(0, rm_reg(m_ea))); } /* RES 0,(XY+o) */
+OP(xycb,87) { A = res(0, rm_reg(m_ea)); wm(m_ea, A); } /* RES 0,A=(XY+o) */
+
+OP(xycb,88) { B = res(1, rm_reg(m_ea)); wm(m_ea, B); } /* RES 1,B=(XY+o) */
+OP(xycb,89) { C = res(1, rm_reg(m_ea)); wm(m_ea, C); } /* RES 1,C=(XY+o) */
+OP(xycb,8a) { D = res(1, rm_reg(m_ea)); wm(m_ea, D); } /* RES 1,D=(XY+o) */
+OP(xycb,8b) { E = res(1, rm_reg(m_ea)); wm(m_ea, E); } /* RES 1,E=(XY+o) */
+OP(xycb,8c) { H = res(1, rm_reg(m_ea)); wm(m_ea, H); } /* RES 1,H=(XY+o) */
+OP(xycb,8d) { L = res(1, rm_reg(m_ea)); wm(m_ea, L); } /* RES 1,L=(XY+o) */
+OP(xycb,8e) { wm(m_ea, res(1, rm_reg(m_ea))); } /* RES 1,(XY+o) */
+OP(xycb,8f) { A = res(1, rm_reg(m_ea)); wm(m_ea, A); } /* RES 1,A=(XY+o) */
+
+OP(xycb,90) { B = res(2, rm_reg(m_ea)); wm(m_ea, B); } /* RES 2,B=(XY+o) */
+OP(xycb,91) { C = res(2, rm_reg(m_ea)); wm(m_ea, C); } /* RES 2,C=(XY+o) */
+OP(xycb,92) { D = res(2, rm_reg(m_ea)); wm(m_ea, D); } /* RES 2,D=(XY+o) */
+OP(xycb,93) { E = res(2, rm_reg(m_ea)); wm(m_ea, E); } /* RES 2,E=(XY+o) */
+OP(xycb,94) { H = res(2, rm_reg(m_ea)); wm(m_ea, H); } /* RES 2,H=(XY+o) */
+OP(xycb,95) { L = res(2, rm_reg(m_ea)); wm(m_ea, L); } /* RES 2,L=(XY+o) */
+OP(xycb,96) { wm(m_ea, res(2, rm_reg(m_ea))); } /* RES 2,(XY+o) */
+OP(xycb,97) { A = res(2, rm_reg(m_ea)); wm(m_ea, A); } /* RES 2,A=(XY+o) */
+
+OP(xycb,98) { B = res(3, rm_reg(m_ea)); wm(m_ea, B); } /* RES 3,B=(XY+o) */
+OP(xycb,99) { C = res(3, rm_reg(m_ea)); wm(m_ea, C); } /* RES 3,C=(XY+o) */
+OP(xycb,9a) { D = res(3, rm_reg(m_ea)); wm(m_ea, D); } /* RES 3,D=(XY+o) */
+OP(xycb,9b) { E = res(3, rm_reg(m_ea)); wm(m_ea, E); } /* RES 3,E=(XY+o) */
+OP(xycb,9c) { H = res(3, rm_reg(m_ea)); wm(m_ea, H); } /* RES 3,H=(XY+o) */
+OP(xycb,9d) { L = res(3, rm_reg(m_ea)); wm(m_ea, L); } /* RES 3,L=(XY+o) */
+OP(xycb,9e) { wm(m_ea, res(3, rm_reg(m_ea))); } /* RES 3,(XY+o) */
+OP(xycb,9f) { A = res(3, rm_reg(m_ea)); wm(m_ea, A); } /* RES 3,A=(XY+o) */
+
+OP(xycb,a0) { B = res(4, rm_reg(m_ea)); wm(m_ea, B); } /* RES 4,B=(XY+o) */
+OP(xycb,a1) { C = res(4, rm_reg(m_ea)); wm(m_ea, C); } /* RES 4,C=(XY+o) */
+OP(xycb,a2) { D = res(4, rm_reg(m_ea)); wm(m_ea, D); } /* RES 4,D=(XY+o) */
+OP(xycb,a3) { E = res(4, rm_reg(m_ea)); wm(m_ea, E); } /* RES 4,E=(XY+o) */
+OP(xycb,a4) { H = res(4, rm_reg(m_ea)); wm(m_ea, H); } /* RES 4,H=(XY+o) */
+OP(xycb,a5) { L = res(4, rm_reg(m_ea)); wm(m_ea, L); } /* RES 4,L=(XY+o) */
+OP(xycb,a6) { wm(m_ea, res(4, rm_reg(m_ea))); } /* RES 4,(XY+o) */
+OP(xycb,a7) { A = res(4, rm_reg(m_ea)); wm(m_ea, A); } /* RES 4,A=(XY+o) */
+
+OP(xycb,a8) { B = res(5, rm_reg(m_ea)); wm(m_ea, B); } /* RES 5,B=(XY+o) */
+OP(xycb,a9) { C = res(5, rm_reg(m_ea)); wm(m_ea, C); } /* RES 5,C=(XY+o) */
+OP(xycb,aa) { D = res(5, rm_reg(m_ea)); wm(m_ea, D); } /* RES 5,D=(XY+o) */
+OP(xycb,ab) { E = res(5, rm_reg(m_ea)); wm(m_ea, E); } /* RES 5,E=(XY+o) */
+OP(xycb,ac) { H = res(5, rm_reg(m_ea)); wm(m_ea, H); } /* RES 5,H=(XY+o) */
+OP(xycb,ad) { L = res(5, rm_reg(m_ea)); wm(m_ea, L); } /* RES 5,L=(XY+o) */
+OP(xycb,ae) { wm(m_ea, res(5, rm_reg(m_ea))); } /* RES 5,(XY+o) */
+OP(xycb,af) { A = res(5, rm_reg(m_ea)); wm(m_ea, A); } /* RES 5,A=(XY+o) */
+
+OP(xycb,b0) { B = res(6, rm_reg(m_ea)); wm(m_ea, B); } /* RES 6,B=(XY+o) */
+OP(xycb,b1) { C = res(6, rm_reg(m_ea)); wm(m_ea, C); } /* RES 6,C=(XY+o) */
+OP(xycb,b2) { D = res(6, rm_reg(m_ea)); wm(m_ea, D); } /* RES 6,D=(XY+o) */
+OP(xycb,b3) { E = res(6, rm_reg(m_ea)); wm(m_ea, E); } /* RES 6,E=(XY+o) */
+OP(xycb,b4) { H = res(6, rm_reg(m_ea)); wm(m_ea, H); } /* RES 6,H=(XY+o) */
+OP(xycb,b5) { L = res(6, rm_reg(m_ea)); wm(m_ea, L); } /* RES 6,L=(XY+o) */
+OP(xycb,b6) { wm(m_ea, res(6, rm_reg(m_ea))); } /* RES 6,(XY+o) */
+OP(xycb,b7) { A = res(6, rm_reg(m_ea)); wm(m_ea, A); } /* RES 6,A=(XY+o) */
+
+OP(xycb,b8) { B = res(7, rm_reg(m_ea)); wm(m_ea, B); } /* RES 7,B=(XY+o) */
+OP(xycb,b9) { C = res(7, rm_reg(m_ea)); wm(m_ea, C); } /* RES 7,C=(XY+o) */
+OP(xycb,ba) { D = res(7, rm_reg(m_ea)); wm(m_ea, D); } /* RES 7,D=(XY+o) */
+OP(xycb,bb) { E = res(7, rm_reg(m_ea)); wm(m_ea, E); } /* RES 7,E=(XY+o) */
+OP(xycb,bc) { H = res(7, rm_reg(m_ea)); wm(m_ea, H); } /* RES 7,H=(XY+o) */
+OP(xycb,bd) { L = res(7, rm_reg(m_ea)); wm(m_ea, L); } /* RES 7,L=(XY+o) */
+OP(xycb,be) { wm(m_ea, res(7, rm_reg(m_ea))); } /* RES 7,(XY+o) */
+OP(xycb,bf) { A = res(7, rm_reg(m_ea)); wm(m_ea, A); } /* RES 7,A=(XY+o) */
+
+OP(xycb,c0) { B = set(0, rm_reg(m_ea)); wm(m_ea, B); } /* SET 0,B=(XY+o) */
+OP(xycb,c1) { C = set(0, rm_reg(m_ea)); wm(m_ea, C); } /* SET 0,C=(XY+o) */
+OP(xycb,c2) { D = set(0, rm_reg(m_ea)); wm(m_ea, D); } /* SET 0,D=(XY+o) */
+OP(xycb,c3) { E = set(0, rm_reg(m_ea)); wm(m_ea, E); } /* SET 0,E=(XY+o) */
+OP(xycb,c4) { H = set(0, rm_reg(m_ea)); wm(m_ea, H); } /* SET 0,H=(XY+o) */
+OP(xycb,c5) { L = set(0, rm_reg(m_ea)); wm(m_ea, L); } /* SET 0,L=(XY+o) */
+OP(xycb,c6) { wm(m_ea, set(0, rm_reg(m_ea))); } /* SET 0,(XY+o) */
+OP(xycb,c7) { A = set(0, rm_reg(m_ea)); wm(m_ea, A); } /* SET 0,A=(XY+o) */
+
+OP(xycb,c8) { B = set(1, rm_reg(m_ea)); wm(m_ea, B); } /* SET 1,B=(XY+o) */
+OP(xycb,c9) { C = set(1, rm_reg(m_ea)); wm(m_ea, C); } /* SET 1,C=(XY+o) */
+OP(xycb,ca) { D = set(1, rm_reg(m_ea)); wm(m_ea, D); } /* SET 1,D=(XY+o) */
+OP(xycb,cb) { E = set(1, rm_reg(m_ea)); wm(m_ea, E); } /* SET 1,E=(XY+o) */
+OP(xycb,cc) { H = set(1, rm_reg(m_ea)); wm(m_ea, H); } /* SET 1,H=(XY+o) */
+OP(xycb,cd) { L = set(1, rm_reg(m_ea)); wm(m_ea, L); } /* SET 1,L=(XY+o) */
+OP(xycb,ce) { wm(m_ea, set(1, rm_reg(m_ea))); } /* SET 1,(XY+o) */
+OP(xycb,cf) { A = set(1, rm_reg(m_ea)); wm(m_ea, A); } /* SET 1,A=(XY+o) */
+
+OP(xycb,d0) { B = set(2, rm_reg(m_ea)); wm(m_ea, B); } /* SET 2,B=(XY+o) */
+OP(xycb,d1) { C = set(2, rm_reg(m_ea)); wm(m_ea, C); } /* SET 2,C=(XY+o) */
+OP(xycb,d2) { D = set(2, rm_reg(m_ea)); wm(m_ea, D); } /* SET 2,D=(XY+o) */
+OP(xycb,d3) { E = set(2, rm_reg(m_ea)); wm(m_ea, E); } /* SET 2,E=(XY+o) */
+OP(xycb,d4) { H = set(2, rm_reg(m_ea)); wm(m_ea, H); } /* SET 2,H=(XY+o) */
+OP(xycb,d5) { L = set(2, rm_reg(m_ea)); wm(m_ea, L); } /* SET 2,L=(XY+o) */
+OP(xycb,d6) { wm(m_ea, set(2, rm_reg(m_ea))); } /* SET 2,(XY+o) */
+OP(xycb,d7) { A = set(2, rm_reg(m_ea)); wm(m_ea, A); } /* SET 2,A=(XY+o) */
+
+OP(xycb,d8) { B = set(3, rm_reg(m_ea)); wm(m_ea, B); } /* SET 3,B=(XY+o) */
+OP(xycb,d9) { C = set(3, rm_reg(m_ea)); wm(m_ea, C); } /* SET 3,C=(XY+o) */
+OP(xycb,da) { D = set(3, rm_reg(m_ea)); wm(m_ea, D); } /* SET 3,D=(XY+o) */
+OP(xycb,db) { E = set(3, rm_reg(m_ea)); wm(m_ea, E); } /* SET 3,E=(XY+o) */
+OP(xycb,dc) { H = set(3, rm_reg(m_ea)); wm(m_ea, H); } /* SET 3,H=(XY+o) */
+OP(xycb,dd) { L = set(3, rm_reg(m_ea)); wm(m_ea, L); } /* SET 3,L=(XY+o) */
+OP(xycb,de) { wm(m_ea, set(3, rm_reg(m_ea))); } /* SET 3,(XY+o) */
+OP(xycb,df) { A = set(3, rm_reg(m_ea)); wm(m_ea, A); } /* SET 3,A=(XY+o) */
+
+OP(xycb,e0) { B = set(4, rm_reg(m_ea)); wm(m_ea, B); } /* SET 4,B=(XY+o) */
+OP(xycb,e1) { C = set(4, rm_reg(m_ea)); wm(m_ea, C); } /* SET 4,C=(XY+o) */
+OP(xycb,e2) { D = set(4, rm_reg(m_ea)); wm(m_ea, D); } /* SET 4,D=(XY+o) */
+OP(xycb,e3) { E = set(4, rm_reg(m_ea)); wm(m_ea, E); } /* SET 4,E=(XY+o) */
+OP(xycb,e4) { H = set(4, rm_reg(m_ea)); wm(m_ea, H); } /* SET 4,H=(XY+o) */
+OP(xycb,e5) { L = set(4, rm_reg(m_ea)); wm(m_ea, L); } /* SET 4,L=(XY+o) */
+OP(xycb,e6) { wm(m_ea, set(4, rm_reg(m_ea))); } /* SET 4,(XY+o) */
+OP(xycb,e7) { A = set(4, rm_reg(m_ea)); wm(m_ea, A); } /* SET 4,A=(XY+o) */
+
+OP(xycb,e8) { B = set(5, rm_reg(m_ea)); wm(m_ea, B); } /* SET 5,B=(XY+o) */
+OP(xycb,e9) { C = set(5, rm_reg(m_ea)); wm(m_ea, C); } /* SET 5,C=(XY+o) */
+OP(xycb,ea) { D = set(5, rm_reg(m_ea)); wm(m_ea, D); } /* SET 5,D=(XY+o) */
+OP(xycb,eb) { E = set(5, rm_reg(m_ea)); wm(m_ea, E); } /* SET 5,E=(XY+o) */
+OP(xycb,ec) { H = set(5, rm_reg(m_ea)); wm(m_ea, H); } /* SET 5,H=(XY+o) */
+OP(xycb,ed) { L = set(5, rm_reg(m_ea)); wm(m_ea, L); } /* SET 5,L=(XY+o) */
+OP(xycb,ee) { wm(m_ea, set(5, rm_reg(m_ea))); } /* SET 5,(XY+o) */
+OP(xycb,ef) { A = set(5, rm_reg(m_ea)); wm(m_ea, A); } /* SET 5,A=(XY+o) */
+
+OP(xycb,f0) { B = set(6, rm_reg(m_ea)); wm(m_ea, B); } /* SET 6,B=(XY+o) */
+OP(xycb,f1) { C = set(6, rm_reg(m_ea)); wm(m_ea, C); } /* SET 6,C=(XY+o) */
+OP(xycb,f2) { D = set(6, rm_reg(m_ea)); wm(m_ea, D); } /* SET 6,D=(XY+o) */
+OP(xycb,f3) { E = set(6, rm_reg(m_ea)); wm(m_ea, E); } /* SET 6,E=(XY+o) */
+OP(xycb,f4) { H = set(6, rm_reg(m_ea)); wm(m_ea, H); } /* SET 6,H=(XY+o) */
+OP(xycb,f5) { L = set(6, rm_reg(m_ea)); wm(m_ea, L); } /* SET 6,L=(XY+o) */
+OP(xycb,f6) { wm(m_ea, set(6, rm_reg(m_ea))); } /* SET 6,(XY+o) */
+OP(xycb,f7) { A = set(6, rm_reg(m_ea)); wm(m_ea, A); } /* SET 6,A=(XY+o) */
+
+OP(xycb,f8) { B = set(7, rm_reg(m_ea)); wm(m_ea, B); } /* SET 7,B=(XY+o) */
+OP(xycb,f9) { C = set(7, rm_reg(m_ea)); wm(m_ea, C); } /* SET 7,C=(XY+o) */
+OP(xycb,fa) { D = set(7, rm_reg(m_ea)); wm(m_ea, D); } /* SET 7,D=(XY+o) */
+OP(xycb,fb) { E = set(7, rm_reg(m_ea)); wm(m_ea, E); } /* SET 7,E=(XY+o) */
+OP(xycb,fc) { H = set(7, rm_reg(m_ea)); wm(m_ea, H); } /* SET 7,H=(XY+o) */
+OP(xycb,fd) { L = set(7, rm_reg(m_ea)); wm(m_ea, L); } /* SET 7,L=(XY+o) */
+OP(xycb,fe) { wm(m_ea, set(7, rm_reg(m_ea))); } /* SET 7,(XY+o) */
+OP(xycb,ff) { A = set(7, rm_reg(m_ea)); wm(m_ea, A); } /* SET 7,A=(XY+o) */
+
+OP(illegal,1) {
+ logerror("Z80 ill. opcode $%02x $%02x ($%04x)\n",
+ m_opcodes.read_byte(translate_memory_address((PCD-1)&0xffff)), m_opcodes.read_byte(translate_memory_address(PCD)), PCD-1);
+}
/**********************************************************
* IX register related opcodes (DD prefix)
**********************************************************/
-/* DB DD */ OP(DD,00) THEN illegal_1(); JP(00)
-/* DB DD */ OP(DD,01) THEN illegal_1(); JP(01)
-/* DB DD */ OP(DD,02) THEN illegal_1(); JP(02)
-/* DB DD */ OP(DD,03) THEN illegal_1(); JP(03)
-/* DB DD */ OP(DD,04) THEN illegal_1(); JP(04)
-/* DB DD */ OP(DD,05) THEN illegal_1(); JP(05)
-/* DB DD */ OP(DD,06) THEN illegal_1(); JP(06)
-/* DB DD */ OP(DD,07) THEN illegal_1(); JP(07)
-
-/* DB DD */ OP(DD,08) THEN illegal_1(); JP(08)
-/* ADD IX,BC */ OP(DD,09) THEN TDAT=IX; TDAT2=BC; CALL add16(); THEN IX=TDAT; ENDOP
-/* DB DD */ OP(DD,0a) THEN illegal_1(); JP(0a)
-/* DB DD */ OP(DD,0b) THEN illegal_1(); JP(0b)
-/* DB DD */ OP(DD,0c) THEN illegal_1(); JP(0c)
-/* DB DD */ OP(DD,0d) THEN illegal_1(); JP(0d)
-/* DB DD */ OP(DD,0e) THEN illegal_1(); JP(0e)
-/* DB DD */ OP(DD,0f) THEN illegal_1(); JP(0f)
-
-/* DB DD */ OP(DD,10) THEN illegal_1(); JP(10)
-/* DB DD */ OP(DD,11) THEN illegal_1(); JP(11)
-/* DB DD */ OP(DD,12) THEN illegal_1(); JP(12)
-/* DB DD */ OP(DD,13) THEN illegal_1(); JP(13)
-/* DB DD */ OP(DD,14) THEN illegal_1(); JP(14)
-/* DB DD */ OP(DD,15) THEN illegal_1(); JP(15)
-/* DB DD */ OP(DD,16) THEN illegal_1(); JP(16)
-/* DB DD */ OP(DD,17) THEN illegal_1(); JP(17)
-
-/* DB DD */ OP(DD,18) THEN illegal_1(); JP(18)
-/* ADD IX,DE */ OP(DD,19) THEN TDAT=IX; TDAT2=DE; CALL add16(); THEN IX=TDAT; ENDOP
-/* DB DD */ OP(DD,1a) THEN illegal_1(); JP(1a)
-/* DB DD */ OP(DD,1b) THEN illegal_1(); JP(1b)
-/* DB DD */ OP(DD,1c) THEN illegal_1(); JP(1c)
-/* DB DD */ OP(DD,1d) THEN illegal_1(); JP(1d)
-/* DB DD */ OP(DD,1e) THEN illegal_1(); JP(1e)
-/* DB DD */ OP(DD,1f) THEN illegal_1(); JP(1f)
-
-/* DB DD */ OP(DD,20) THEN illegal_1(); JP(20)
-/* LD IX,w */ OP(DD,21) CALL arg16(); THEN IX = TDAT; ENDOP
-/* LD (w),IX */ OP(DD,22) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=IX; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* INC IX */ OP(DD,23) CALL nomreq_ir(2); THEN IX++; ENDOP
-/* INC HX */ OP(DD,24) THEN inc(HX); ENDOP
-/* DEC HX */ OP(DD,25) THEN dec(HX); ENDOP
-/* LD HX,n */ OP(DD,26) CALL arg(); THEN HX = TDAT8; ENDOP
-/* DB DD */ OP(DD,27) THEN illegal_1(); JP(27)
-
-/* DB DD */ OP(DD,28) THEN illegal_1(); JP(28)
-/* ADD IX,IX */ OP(DD,29) THEN TDAT=IX; TDAT2=IX; CALL add16(); THEN IX=TDAT; ENDOP
-/* LD IX,(w) */ OP(DD,2a) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN IX=TDAT; WZ = m_ea + 1; ENDOP
-/* DEC IX */ OP(DD,2b) CALL nomreq_ir(2); THEN IX--; ENDOP
-/* INC LX */ OP(DD,2c) THEN inc(LX); ENDOP
-/* DEC LX */ OP(DD,2d) THEN dec(LX); ENDOP
-/* LD LX,n */ OP(DD,2e) CALL arg(); THEN LX = TDAT8; ENDOP
-/* DB DD */ OP(DD,2f) THEN illegal_1(); JP(2f)
-
-/* DB DD */ OP(DD,30) THEN illegal_1(); JP(30)
-/* DB DD */ OP(DD,31) THEN illegal_1(); JP(31)
-/* DB DD */ OP(DD,32) THEN illegal_1(); JP(32)
-/* DB DD */ OP(DD,33) THEN illegal_1(); JP(33)
-/* INC (IX+o) */ OP(DD,34) CALL eax(); THEN TADR=PCD-1; CALL nomreq_addr(5); THEN TADR=m_ea; CALL rm_reg(); THEN inc(TDAT8); CALL wm(); ENDOP
-/* DEC (IX+o) */ OP(DD,35) CALL eax(); THEN TADR=PCD-1; CALL nomreq_addr(5); THEN TADR=m_ea; CALL rm_reg(); THEN dec(TDAT8); CALL wm(); ENDOP
-/* LD (IX+o),n */ OP(DD,36) CALL eax(); CALL arg(); THEN TADR=PCD-1; CALL nomreq_addr(2); THEN TADR=m_ea; CALL wm(); ENDOP
-/* DB DD */ OP(DD,37) THEN illegal_1(); JP(37)
-
-/* DB DD */ OP(DD,38) THEN illegal_1(); JP(38)
-/* ADD IX,SP */ OP(DD,39) THEN TDAT=IX; TDAT2=SP; CALL add16(); THEN IX=TDAT; ENDOP
-/* DB DD */ OP(DD,3a) THEN illegal_1(); JP(3a)
-/* DB DD */ OP(DD,3b) THEN illegal_1(); JP(3b)
-/* DB DD */ OP(DD,3c) THEN illegal_1(); JP(3c)
-/* DB DD */ OP(DD,3d) THEN illegal_1(); JP(3d)
-/* DB DD */ OP(DD,3e) THEN illegal_1(); JP(3e)
-/* DB DD */ OP(DD,3f) THEN illegal_1(); JP(3f)
-
-/* DB DD */ OP(DD,40) THEN illegal_1(); JP(40)
-/* DB DD */ OP(DD,41) THEN illegal_1(); JP(41)
-/* DB DD */ OP(DD,42) THEN illegal_1(); JP(42)
-/* DB DD */ OP(DD,43) THEN illegal_1(); JP(43)
-/* LD B,HX */ OP(DD,44) THEN B = HX; ENDOP
-/* LD B,LX */ OP(DD,45) THEN B = LX; ENDOP
-/* LD B,(IX+o) */ OP(DD,46) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN B = TDAT8; ENDOP
-/* DB DD */ OP(DD,47) THEN illegal_1(); JP(47)
-
-/* DB DD */ OP(DD,48) THEN illegal_1(); JP(48)
-/* DB DD */ OP(DD,49) THEN illegal_1(); JP(49)
-/* DB DD */ OP(DD,4a) THEN illegal_1(); JP(4a)
-/* DB DD */ OP(DD,4b) THEN illegal_1(); JP(4b)
-/* LD C,HX */ OP(DD,4c) THEN C = HX; ENDOP
-/* LD C,LX */ OP(DD,4d) THEN C = LX; ENDOP
-/* LD C,(IX+o) */ OP(DD,4e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN C = TDAT8; ENDOP
-/* DB DD */ OP(DD,4f) THEN illegal_1(); JP(4f)
-
-/* DB DD */ OP(DD,50) THEN illegal_1(); JP(50)
-/* DB DD */ OP(DD,51) THEN illegal_1(); JP(51)
-/* DB DD */ OP(DD,52) THEN illegal_1(); JP(52)
-/* DB DD */ OP(DD,53) THEN illegal_1(); JP(53)
-/* LD D,HX */ OP(DD,54) THEN D = HX; ENDOP
-/* LD D,LX */ OP(DD,55) THEN D = LX; ENDOP
-/* LD D,(IX+o) */ OP(DD,56) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN D = TDAT8; ENDOP
-/* DB DD */ OP(DD,57) THEN illegal_1(); JP(57)
-
-/* DB DD */ OP(DD,58) THEN illegal_1(); JP(58)
-/* DB DD */ OP(DD,59) THEN illegal_1(); JP(59)
-/* DB DD */ OP(DD,5a) THEN illegal_1(); JP(5a)
-/* DB DD */ OP(DD,5b) THEN illegal_1(); JP(5b)
-/* LD E,HX */ OP(DD,5c) THEN E = HX; ENDOP
-/* LD E,LX */ OP(DD,5d) THEN E = LX; ENDOP
-/* LD E,(IX+o) */ OP(DD,5e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN E = TDAT8; ENDOP
-/* DB DD */ OP(DD,5f) THEN illegal_1(); JP(5f)
-
-/* LD HX,B */ OP(DD,60) THEN HX = B; ENDOP
-/* LD HX,C */ OP(DD,61) THEN HX = C; ENDOP
-/* LD HX,D */ OP(DD,62) THEN HX = D; ENDOP
-/* LD HX,E */ OP(DD,63) THEN HX = E; ENDOP
-/* LD HX,HX */ OP(DD,64) ENDOP
-/* LD HX,LX */ OP(DD,65) THEN HX = LX; ENDOP
-/* LD H,(IX+o) */ OP(DD,66) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN H = TDAT8; ENDOP
-/* LD HX,A */ OP(DD,67) THEN HX = A; ENDOP
-
-/* LD LX,B */ OP(DD,68) THEN LX = B; ENDOP
-/* LD LX,C */ OP(DD,69) THEN LX = C; ENDOP
-/* LD LX,D */ OP(DD,6a) THEN LX = D; ENDOP
-/* LD LX,E */ OP(DD,6b) THEN LX = E; ENDOP
-/* LD LX,HX */ OP(DD,6c) THEN LX = HX; ENDOP
-/* LD LX,LX */ OP(DD,6d) ENDOP
-/* LD L,(IX+o) */ OP(DD,6e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN L = TDAT8; ENDOP
-/* LD LX,A */ OP(DD,6f) THEN LX = A; ENDOP
-
-/* LD (IX+o),B */ OP(DD,70) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = B; CALL wm(); ENDOP
-/* LD (IX+o),C */ OP(DD,71) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = C; CALL wm(); ENDOP
-/* LD (IX+o),D */ OP(DD,72) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = D; CALL wm(); ENDOP
-/* LD (IX+o),E */ OP(DD,73) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = E; CALL wm(); ENDOP
-/* LD (IX+o),H */ OP(DD,74) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = H; CALL wm(); ENDOP
-/* LD (IX+o),L */ OP(DD,75) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = L; CALL wm(); ENDOP
-/* DB DD */ OP(DD,76) THEN illegal_1(); JP(76)
-/* LD (IX+o),A */ OP(DD,77) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = A; CALL wm(); ENDOP
-
-/* DB DD */ OP(DD,78) THEN illegal_1(); JP(78)
-/* DB DD */ OP(DD,79) THEN illegal_1(); JP(79)
-/* DB DD */ OP(DD,7a) THEN illegal_1(); JP(7a)
-/* DB DD */ OP(DD,7b) THEN illegal_1(); JP(7b)
-/* LD A,HX */ OP(DD,7c) THEN A = HX; ENDOP
-/* LD A,LX */ OP(DD,7d) THEN A = LX; ENDOP
-/* LD A,(IX+o) */ OP(DD,7e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN A = TDAT8; ENDOP
-/* DB DD */ OP(DD,7f) THEN illegal_1(); JP(7f)
-
-/* DB DD */ OP(DD,80) THEN illegal_1(); JP(80)
-/* DB DD */ OP(DD,81) THEN illegal_1(); JP(81)
-/* DB DD */ OP(DD,82) THEN illegal_1(); JP(82)
-/* DB DD */ OP(DD,83) THEN illegal_1(); JP(83)
-/* ADD A,HX */ OP(DD,84) THEN add_a(HX); ENDOP
-/* ADD A,LX */ OP(DD,85) THEN add_a(LX); ENDOP
-/* ADD A,(IX+o) */ OP(DD,86) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN add_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,87) THEN illegal_1(); JP(87)
-
-/* DB DD */ OP(DD,88) THEN illegal_1(); JP(88)
-/* DB DD */ OP(DD,89) THEN illegal_1(); JP(89)
-/* DB DD */ OP(DD,8a) THEN illegal_1(); JP(8a)
-/* DB DD */ OP(DD,8b) THEN illegal_1(); JP(8b)
-/* ADC A,HX */ OP(DD,8c) THEN adc_a(HX); ENDOP
-/* ADC A,LX */ OP(DD,8d) THEN adc_a(LX); ENDOP
-/* ADC A,(IX+o) */ OP(DD,8e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN adc_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,8f) THEN illegal_1(); JP(8f)
-
-/* DB DD */ OP(DD,90) THEN illegal_1(); JP(90)
-/* DB DD */ OP(DD,91) THEN illegal_1(); JP(91)
-/* DB DD */ OP(DD,92) THEN illegal_1(); JP(92)
-/* DB DD */ OP(DD,93) THEN illegal_1(); JP(93)
-/* SUB HX */ OP(DD,94) THEN sub(HX); ENDOP
-/* SUB LX */ OP(DD,95) THEN sub(LX); ENDOP
-/* SUB (IX+o) */ OP(DD,96) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN sub(TDAT8); ENDOP
-/* DB DD */ OP(DD,97) THEN illegal_1(); JP(97)
-
-/* DB DD */ OP(DD,98) THEN illegal_1(); JP(98)
-/* DB DD */ OP(DD,99) THEN illegal_1(); JP(99)
-/* DB DD */ OP(DD,9a) THEN illegal_1(); JP(9a)
-/* DB DD */ OP(DD,9b) THEN illegal_1(); JP(9b)
-/* SBC A,HX */ OP(DD,9c) THEN sbc_a(HX); ENDOP
-/* SBC A,LX */ OP(DD,9d) THEN sbc_a(LX); ENDOP
-/* SBC A,(IX+o) */ OP(DD,9e) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN sbc_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,9f) THEN illegal_1(); JP(9f)
-
-/* DB DD */ OP(DD,a0) THEN illegal_1(); JP(a0)
-/* DB DD */ OP(DD,a1) THEN illegal_1(); JP(a1)
-/* DB DD */ OP(DD,a2) THEN illegal_1(); JP(a2)
-/* DB DD */ OP(DD,a3) THEN illegal_1(); JP(a3)
-/* AND HX */ OP(DD,a4) THEN and_a(HX); ENDOP
-/* AND LX */ OP(DD,a5) THEN and_a(LX); ENDOP
-/* AND (IX+o) */ OP(DD,a6) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN and_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,a7) THEN illegal_1(); JP(a7)
-
-/* DB DD */ OP(DD,a8) THEN illegal_1(); JP(a8)
-/* DB DD */ OP(DD,a9) THEN illegal_1(); JP(a9)
-/* DB DD */ OP(DD,aa) THEN illegal_1(); JP(aa)
-/* DB DD */ OP(DD,ab) THEN illegal_1(); JP(ab)
-/* XOR HX */ OP(DD,ac) THEN xor_a(HX); ENDOP
-/* XOR LX */ OP(DD,ad) THEN xor_a(LX); ENDOP
-/* XOR (IX+o) */ OP(DD,ae) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN xor_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,af) THEN illegal_1(); JP(af)
-
-/* DB DD */ OP(DD,b0) THEN illegal_1(); JP(b0)
-/* DB DD */ OP(DD,b1) THEN illegal_1(); JP(b1)
-/* DB DD */ OP(DD,b2) THEN illegal_1(); JP(b2)
-/* DB DD */ OP(DD,b3) THEN illegal_1(); JP(b3)
-/* OR HX */ OP(DD,b4) THEN or_a(HX); ENDOP
-/* OR LX */ OP(DD,b5) THEN or_a(LX); ENDOP
-/* OR (IX+o) */ OP(DD,b6) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN or_a(TDAT8); ENDOP
-/* DB DD */ OP(DD,b7) THEN illegal_1(); JP(b7)
-
-/* DB DD */ OP(DD,b8) THEN illegal_1(); JP(b8)
-/* DB DD */ OP(DD,b9) THEN illegal_1(); JP(b9)
-/* DB DD */ OP(DD,ba) THEN illegal_1(); JP(ba)
-/* DB DD */ OP(DD,bb) THEN illegal_1(); JP(bb)
-/* CP HX */ OP(DD,bc) THEN cp(HX); ENDOP
-/* CP LX */ OP(DD,bd) THEN cp(LX); ENDOP
-/* CP (IX+o) */ OP(DD,be) CALL eax(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN cp(TDAT8); ENDOP
-/* DB DD */ OP(DD,bf) THEN illegal_1(); JP(bf)
-
-/* DB DD */ OP(DD,c0) THEN illegal_1(); JP(c0)
-/* DB DD */ OP(DD,c1) THEN illegal_1(); JP(c1)
-/* DB DD */ OP(DD,c2) THEN illegal_1(); JP(c2)
-/* DB DD */ OP(DD,c3) THEN illegal_1(); JP(c3)
-/* DB DD */ OP(DD,c4) THEN illegal_1(); JP(c4)
-/* DB DD */ OP(DD,c5) THEN illegal_1(); JP(c5)
-/* DB DD */ OP(DD,c6) THEN illegal_1(); JP(c6)
-/* DB DD */ OP(DD,c7) THEN illegal_1(); JP(c7)
-
-/* DB DD */ OP(DD,c8) THEN illegal_1(); JP(c8)
-/* DB DD */ OP(DD,c9) THEN illegal_1(); JP(c9)
-/* DB DD */ OP(DD,ca) THEN illegal_1(); JP(ca)
-/* ** DD CB xx */ OP(DD,cb) CALL eax(); CALL arg(); THEN TADR=PCD-1; CALL nomreq_addr(2); THENJP(XY_CB)
-/* DB DD */ OP(DD,cc) THEN illegal_1(); JP(cc)
-/* DB DD */ OP(DD,cd) THEN illegal_1(); JP(cd)
-/* DB DD */ OP(DD,ce) THEN illegal_1(); JP(ce)
-/* DB DD */ OP(DD,cf) THEN illegal_1(); JP(cf)
-
-/* DB DD */ OP(DD,d0) THEN illegal_1(); JP(d0)
-/* DB DD */ OP(DD,d1) THEN illegal_1(); JP(d1)
-/* DB DD */ OP(DD,d2) THEN illegal_1(); JP(d2)
-/* DB DD */ OP(DD,d3) THEN illegal_1(); JP(d3)
-/* DB DD */ OP(DD,d4) THEN illegal_1(); JP(d4)
-/* DB DD */ OP(DD,d5) THEN illegal_1(); JP(d5)
-/* DB DD */ OP(DD,d6) THEN illegal_1(); JP(d6)
-/* DB DD */ OP(DD,d7) THEN illegal_1(); JP(d7)
-
-/* DB DD */ OP(DD,d8) THEN illegal_1(); JP(d8)
-/* DB DD */ OP(DD,d9) THEN illegal_1(); JP(d9)
-/* DB DD */ OP(DD,da) THEN illegal_1(); JP(da)
-/* DB DD */ OP(DD,db) THEN illegal_1(); JP(db)
-/* DB DD */ OP(DD,dc) THEN illegal_1(); JP(dc)
-/* DB DD */ OP(DD,dd) THEN illegal_1(); JP(dd)
-/* DB DD */ OP(DD,de) THEN illegal_1(); JP(de)
-/* DB DD */ OP(DD,df) THEN illegal_1(); JP(df)
-
-/* DB DD */ OP(DD,e0) THEN illegal_1(); JP(e0)
-/* POP IX */ OP(DD,e1) CALL pop(); THEN IX=TDAT; ENDOP
-/* DB DD */ OP(DD,e2) THEN illegal_1(); JP(e2)
-/* EX (SP),IX */ OP(DD,e3) THEN TDAT=IX; CALL ex_sp(); THEN IX=TDAT; ENDOP
-/* DB DD */ OP(DD,e4) THEN illegal_1(); JP(e4)
-/* PUSH IX */ OP(DD,e5) THEN TDAT=IX; CALL push(); ENDOP
-/* DB DD */ OP(DD,e6) THEN illegal_1(); JP(e6)
-/* DB DD */ OP(DD,e7) THEN illegal_1(); JP(e7)
-
-/* DB DD */ OP(DD,e8) THEN illegal_1(); JP(e8)
-/* JP (IX) */ OP(DD,e9) THEN PC = IX; ENDOP
-/* DB DD */ OP(DD,ea) THEN illegal_1(); JP(ea)
-/* DB DD */ OP(DD,eb) THEN illegal_1(); JP(eb)
-/* DB DD */ OP(DD,ec) THEN illegal_1(); JP(ec)
-/* DB DD */ OP(DD,ed) THEN illegal_1(); JP(ed)
-/* DB DD */ OP(DD,ee) THEN illegal_1(); JP(ee)
-/* DB DD */ OP(DD,ef) THEN illegal_1(); JP(ef)
-
-/* DB DD */ OP(DD,f0) THEN illegal_1(); JP(f0)
-/* DB DD */ OP(DD,f1) THEN illegal_1(); JP(f1)
-/* DB DD */ OP(DD,f2) THEN illegal_1(); JP(f2)
-/* DB DD */ OP(DD,f3) THEN illegal_1(); JP(f3)
-/* DB DD */ OP(DD,f4) THEN illegal_1(); JP(f4)
-/* DB DD */ OP(DD,f5) THEN illegal_1(); JP(f5)
-/* DB DD */ OP(DD,f6) THEN illegal_1(); JP(f6)
-/* DB DD */ OP(DD,f7) THEN illegal_1(); JP(f7)
-
-/* DB DD */ OP(DD,f8) THEN illegal_1(); JP(f8)
-/* LD SP,IX */ OP(DD,f9) CALL nomreq_ir(2); THEN SP = IX; ENDOP
-/* DB DD */ OP(DD,fa) THEN illegal_1(); JP(fa)
-/* DB DD */ OP(DD,fb) THEN illegal_1(); JP(fb)
-/* DB DD */ OP(DD,fc) THEN illegal_1(); JP(fc)
-/* DB DD */ OP(DD,fd) THEN illegal_1(); JP(fd)
-/* DB DD */ OP(DD,fe) THEN illegal_1(); JP(fe)
-/* DB DD */ OP(DD,ff) THEN illegal_1(); JP(ff)
+OP(dd,00) { illegal_1(); op_00(); } /* DB DD */
+OP(dd,01) { illegal_1(); op_01(); } /* DB DD */
+OP(dd,02) { illegal_1(); op_02(); } /* DB DD */
+OP(dd,03) { illegal_1(); op_03(); } /* DB DD */
+OP(dd,04) { illegal_1(); op_04(); } /* DB DD */
+OP(dd,05) { illegal_1(); op_05(); } /* DB DD */
+OP(dd,06) { illegal_1(); op_06(); } /* DB DD */
+OP(dd,07) { illegal_1(); op_07(); } /* DB DD */
+
+OP(dd,08) { illegal_1(); op_08(); } /* DB DD */
+OP(dd,09) { add16(m_ix, m_bc); } /* ADD IX,BC */
+OP(dd,0a) { illegal_1(); op_0a(); } /* DB DD */
+OP(dd,0b) { illegal_1(); op_0b(); } /* DB DD */
+OP(dd,0c) { illegal_1(); op_0c(); } /* DB DD */
+OP(dd,0d) { illegal_1(); op_0d(); } /* DB DD */
+OP(dd,0e) { illegal_1(); op_0e(); } /* DB DD */
+OP(dd,0f) { illegal_1(); op_0f(); } /* DB DD */
+
+OP(dd,10) { illegal_1(); op_10(); } /* DB DD */
+OP(dd,11) { illegal_1(); op_11(); } /* DB DD */
+OP(dd,12) { illegal_1(); op_12(); } /* DB DD */
+OP(dd,13) { illegal_1(); op_13(); } /* DB DD */
+OP(dd,14) { illegal_1(); op_14(); } /* DB DD */
+OP(dd,15) { illegal_1(); op_15(); } /* DB DD */
+OP(dd,16) { illegal_1(); op_16(); } /* DB DD */
+OP(dd,17) { illegal_1(); op_17(); } /* DB DD */
+
+OP(dd,18) { illegal_1(); op_18(); } /* DB DD */
+OP(dd,19) { add16(m_ix, m_de); } /* ADD IX,DE */
+OP(dd,1a) { illegal_1(); op_1a(); } /* DB DD */
+OP(dd,1b) { illegal_1(); op_1b(); } /* DB DD */
+OP(dd,1c) { illegal_1(); op_1c(); } /* DB DD */
+OP(dd,1d) { illegal_1(); op_1d(); } /* DB DD */
+OP(dd,1e) { illegal_1(); op_1e(); } /* DB DD */
+OP(dd,1f) { illegal_1(); op_1f(); } /* DB DD */
+
+OP(dd,20) { illegal_1(); op_20(); } /* DB DD */
+OP(dd,21) { IX = arg16(); } /* LD IX,w */
+OP(dd,22) { m_ea = arg16(); wm16(m_ea, m_ix); WZ = m_ea + 1; } /* LD (w),IX */
+OP(dd,23) { nomreq_ir(2); IX++; } /* INC IX */
+OP(dd,24) { HX = inc(HX); } /* INC HX */
+OP(dd,25) { HX = dec(HX); } /* DEC HX */
+OP(dd,26) { HX = arg(); } /* LD HX,n */
+OP(dd,27) { illegal_1(); op_27(); } /* DB DD */
+
+OP(dd,28) { illegal_1(); op_28(); } /* DB DD */
+OP(dd,29) { add16(m_ix, m_ix); } /* ADD IX,IX */
+OP(dd,2a) { m_ea = arg16(); rm16(m_ea, m_ix); WZ = m_ea + 1; } /* LD IX,(w) */
+OP(dd,2b) { nomreq_ir(2); IX--; } /* DEC IX */
+OP(dd,2c) { LX = inc(LX); } /* INC LX */
+OP(dd,2d) { LX = dec(LX); } /* DEC LX */
+OP(dd,2e) { LX = arg(); } /* LD LX,n */
+OP(dd,2f) { illegal_1(); op_2f(); } /* DB DD */
+
+OP(dd,30) { illegal_1(); op_30(); } /* DB DD */
+OP(dd,31) { illegal_1(); op_31(); } /* DB DD */
+OP(dd,32) { illegal_1(); op_32(); } /* DB DD */
+OP(dd,33) { illegal_1(); op_33(); } /* DB DD */
+OP(dd,34) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, inc(rm_reg(m_ea))); } /* INC (IX+o) */
+OP(dd,35) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, dec(rm_reg(m_ea))); } /* DEC (IX+o) */
+OP(dd,36) { eax(); u8 a = arg(); nomreq_addr(PCD-1, 2); wm(m_ea, a); } /* LD (IX+o),n */
+OP(dd,37) { illegal_1(); op_37(); } /* DB DD */
+
+OP(dd,38) { illegal_1(); op_38(); } /* DB DD */
+OP(dd,39) { add16(m_ix, m_sp); } /* ADD IX,SP */
+OP(dd,3a) { illegal_1(); op_3a(); } /* DB DD */
+OP(dd,3b) { illegal_1(); op_3b(); } /* DB DD */
+OP(dd,3c) { illegal_1(); op_3c(); } /* DB DD */
+OP(dd,3d) { illegal_1(); op_3d(); } /* DB DD */
+OP(dd,3e) { illegal_1(); op_3e(); } /* DB DD */
+OP(dd,3f) { illegal_1(); op_3f(); } /* DB DD */
+
+OP(dd,40) { illegal_1(); op_40(); } /* DB DD */
+OP(dd,41) { illegal_1(); op_41(); } /* DB DD */
+OP(dd,42) { illegal_1(); op_42(); } /* DB DD */
+OP(dd,43) { illegal_1(); op_43(); } /* DB DD */
+OP(dd,44) { B = HX; } /* LD B,HX */
+OP(dd,45) { B = LX; } /* LD B,LX */
+OP(dd,46) { eax(); nomreq_addr(PCD-1, 5); B = rm(m_ea); } /* LD B,(IX+o) */
+OP(dd,47) { illegal_1(); op_47(); } /* DB DD */
+
+OP(dd,48) { illegal_1(); op_48(); } /* DB DD */
+OP(dd,49) { illegal_1(); op_49(); } /* DB DD */
+OP(dd,4a) { illegal_1(); op_4a(); } /* DB DD */
+OP(dd,4b) { illegal_1(); op_4b(); } /* DB DD */
+OP(dd,4c) { C = HX; } /* LD C,HX */
+OP(dd,4d) { C = LX; } /* LD C,LX */
+OP(dd,4e) { eax(); nomreq_addr(PCD-1, 5); C = rm(m_ea); } /* LD C,(IX+o) */
+OP(dd,4f) { illegal_1(); op_4f(); } /* DB DD */
+
+OP(dd,50) { illegal_1(); op_50(); } /* DB DD */
+OP(dd,51) { illegal_1(); op_51(); } /* DB DD */
+OP(dd,52) { illegal_1(); op_52(); } /* DB DD */
+OP(dd,53) { illegal_1(); op_53(); } /* DB DD */
+OP(dd,54) { D = HX; } /* LD D,HX */
+OP(dd,55) { D = LX; } /* LD D,LX */
+OP(dd,56) { eax(); nomreq_addr(PCD-1, 5); D = rm(m_ea); } /* LD D,(IX+o) */
+OP(dd,57) { illegal_1(); op_57(); } /* DB DD */
+
+OP(dd,58) { illegal_1(); op_58(); } /* DB DD */
+OP(dd,59) { illegal_1(); op_59(); } /* DB DD */
+OP(dd,5a) { illegal_1(); op_5a(); } /* DB DD */
+OP(dd,5b) { illegal_1(); op_5b(); } /* DB DD */
+OP(dd,5c) { E = HX; } /* LD E,HX */
+OP(dd,5d) { E = LX; } /* LD E,LX */
+OP(dd,5e) { eax(); nomreq_addr(PCD-1, 5); E = rm(m_ea); } /* LD E,(IX+o) */
+OP(dd,5f) { illegal_1(); op_5f(); } /* DB DD */
+
+OP(dd,60) { HX = B; } /* LD HX,B */
+OP(dd,61) { HX = C; } /* LD HX,C */
+OP(dd,62) { HX = D; } /* LD HX,D */
+OP(dd,63) { HX = E; } /* LD HX,E */
+OP(dd,64) { } /* LD HX,HX */
+OP(dd,65) { HX = LX; } /* LD HX,LX */
+OP(dd,66) { eax(); nomreq_addr(PCD-1, 5); H = rm(m_ea); } /* LD H,(IX+o) */
+OP(dd,67) { HX = A; } /* LD HX,A */
+
+OP(dd,68) { LX = B; } /* LD LX,B */
+OP(dd,69) { LX = C; } /* LD LX,C */
+OP(dd,6a) { LX = D; } /* LD LX,D */
+OP(dd,6b) { LX = E; } /* LD LX,E */
+OP(dd,6c) { LX = HX; } /* LD LX,HX */
+OP(dd,6d) { } /* LD LX,LX */
+OP(dd,6e) { eax(); nomreq_addr(PCD-1, 5); L = rm(m_ea); } /* LD L,(IX+o) */
+OP(dd,6f) { LX = A; } /* LD LX,A */
+
+OP(dd,70) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, B); } /* LD (IX+o),B */
+OP(dd,71) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, C); } /* LD (IX+o),C */
+OP(dd,72) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, D); } /* LD (IX+o),D */
+OP(dd,73) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, E); } /* LD (IX+o),E */
+OP(dd,74) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, H); } /* LD (IX+o),H */
+OP(dd,75) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, L); } /* LD (IX+o),L */
+OP(dd,76) { illegal_1(); op_76(); } /* DB DD */
+OP(dd,77) { eax(); nomreq_addr(PCD-1, 5); wm(m_ea, A); } /* LD (IX+o),A */
+
+OP(dd,78) { illegal_1(); op_78(); } /* DB DD */
+OP(dd,79) { illegal_1(); op_79(); } /* DB DD */
+OP(dd,7a) { illegal_1(); op_7a(); } /* DB DD */
+OP(dd,7b) { illegal_1(); op_7b(); } /* DB DD */
+OP(dd,7c) { A = HX; } /* LD A,HX */
+OP(dd,7d) { A = LX; } /* LD A,LX */
+OP(dd,7e) { eax(); nomreq_addr(PCD-1, 5); A = rm(m_ea); } /* LD A,(IX+o) */
+OP(dd,7f) { illegal_1(); op_7f(); } /* DB DD */
+
+OP(dd,80) { illegal_1(); op_80(); } /* DB DD */
+OP(dd,81) { illegal_1(); op_81(); } /* DB DD */
+OP(dd,82) { illegal_1(); op_82(); } /* DB DD */
+OP(dd,83) { illegal_1(); op_83(); } /* DB DD */
+OP(dd,84) { add_a(HX); } /* ADD A,HX */
+OP(dd,85) { add_a(LX); } /* ADD A,LX */
+OP(dd,86) { eax(); nomreq_addr(PCD-1, 5); add_a(rm(m_ea)); } /* ADD A,(IX+o) */
+OP(dd,87) { illegal_1(); op_87(); } /* DB DD */
+
+OP(dd,88) { illegal_1(); op_88(); } /* DB DD */
+OP(dd,89) { illegal_1(); op_89(); } /* DB DD */
+OP(dd,8a) { illegal_1(); op_8a(); } /* DB DD */
+OP(dd,8b) { illegal_1(); op_8b(); } /* DB DD */
+OP(dd,8c) { adc_a(HX); } /* ADC A,HX */
+OP(dd,8d) { adc_a(LX); } /* ADC A,LX */
+OP(dd,8e) { eax(); nomreq_addr(PCD-1, 5); adc_a(rm(m_ea)); } /* ADC A,(IX+o) */
+OP(dd,8f) { illegal_1(); op_8f(); } /* DB DD */
+
+OP(dd,90) { illegal_1(); op_90(); } /* DB DD */
+OP(dd,91) { illegal_1(); op_91(); } /* DB DD */
+OP(dd,92) { illegal_1(); op_92(); } /* DB DD */
+OP(dd,93) { illegal_1(); op_93(); } /* DB DD */
+OP(dd,94) { sub(HX); } /* SUB HX */
+OP(dd,95) { sub(LX); } /* SUB LX */
+OP(dd,96) { eax(); nomreq_addr(PCD-1, 5); sub(rm(m_ea)); } /* SUB (IX+o) */
+OP(dd,97) { illegal_1(); op_97(); } /* DB DD */
+
+OP(dd,98) { illegal_1(); op_98(); } /* DB DD */
+OP(dd,99) { illegal_1(); op_99(); } /* DB DD */
+OP(dd,9a) { illegal_1(); op_9a(); } /* DB DD */
+OP(dd,9b) { illegal_1(); op_9b(); } /* DB DD */
+OP(dd,9c) { sbc_a(HX); } /* SBC A,HX */
+OP(dd,9d) { sbc_a(LX); } /* SBC A,LX */
+OP(dd,9e) { eax(); nomreq_addr(PCD-1, 5); sbc_a(rm(m_ea)); } /* SBC A,(IX+o) */
+OP(dd,9f) { illegal_1(); op_9f(); } /* DB DD */
+
+OP(dd,a0) { illegal_1(); op_a0(); } /* DB DD */
+OP(dd,a1) { illegal_1(); op_a1(); } /* DB DD */
+OP(dd,a2) { illegal_1(); op_a2(); } /* DB DD */
+OP(dd,a3) { illegal_1(); op_a3(); } /* DB DD */
+OP(dd,a4) { and_a(HX); } /* AND HX */
+OP(dd,a5) { and_a(LX); } /* AND LX */
+OP(dd,a6) { eax(); nomreq_addr(PCD-1, 5); and_a(rm(m_ea)); } /* AND (IX+o) */
+OP(dd,a7) { illegal_1(); op_a7(); } /* DB DD */
+
+OP(dd,a8) { illegal_1(); op_a8(); } /* DB DD */
+OP(dd,a9) { illegal_1(); op_a9(); } /* DB DD */
+OP(dd,aa) { illegal_1(); op_aa(); } /* DB DD */
+OP(dd,ab) { illegal_1(); op_ab(); } /* DB DD */
+OP(dd,ac) { xor_a(HX); } /* XOR HX */
+OP(dd,ad) { xor_a(LX); } /* XOR LX */
+OP(dd,ae) { eax(); nomreq_addr(PCD-1, 5); xor_a(rm(m_ea)); } /* XOR (IX+o) */
+OP(dd,af) { illegal_1(); op_af(); } /* DB DD */
+
+OP(dd,b0) { illegal_1(); op_b0(); } /* DB DD */
+OP(dd,b1) { illegal_1(); op_b1(); } /* DB DD */
+OP(dd,b2) { illegal_1(); op_b2(); } /* DB DD */
+OP(dd,b3) { illegal_1(); op_b3(); } /* DB DD */
+OP(dd,b4) { or_a(HX); } /* OR HX */
+OP(dd,b5) { or_a(LX); } /* OR LX */
+OP(dd,b6) { eax(); nomreq_addr(PCD-1, 5); or_a(rm(m_ea)); } /* OR (IX+o) */
+OP(dd,b7) { illegal_1(); op_b7(); } /* DB DD */
+
+OP(dd,b8) { illegal_1(); op_b8(); } /* DB DD */
+OP(dd,b9) { illegal_1(); op_b9(); } /* DB DD */
+OP(dd,ba) { illegal_1(); op_ba(); } /* DB DD */
+OP(dd,bb) { illegal_1(); op_bb(); } /* DB DD */
+OP(dd,bc) { cp(HX); } /* CP HX */
+OP(dd,bd) { cp(LX); } /* CP LX */
+OP(dd,be) { eax(); nomreq_addr(PCD-1, 5); cp(rm(m_ea)); } /* CP (IX+o) */
+OP(dd,bf) { illegal_1(); op_bf(); } /* DB DD */
+
+OP(dd,c0) { illegal_1(); op_c0(); } /* DB DD */
+OP(dd,c1) { illegal_1(); op_c1(); } /* DB DD */
+OP(dd,c2) { illegal_1(); op_c2(); } /* DB DD */
+OP(dd,c3) { illegal_1(); op_c3(); } /* DB DD */
+OP(dd,c4) { illegal_1(); op_c4(); } /* DB DD */
+OP(dd,c5) { illegal_1(); op_c5(); } /* DB DD */
+OP(dd,c6) { illegal_1(); op_c6(); } /* DB DD */
+OP(dd,c7) { illegal_1(); op_c7(); } /* DB DD */
+
+OP(dd,c8) { illegal_1(); op_c8(); } /* DB DD */
+OP(dd,c9) { illegal_1(); op_c9(); } /* DB DD */
+OP(dd,ca) { illegal_1(); op_ca(); } /* DB DD */
+OP(dd,cb) { eax(); u8 a = arg(); nomreq_addr(PCD-1, 2); EXEC(xycb, a); } /* ** DD CB xx */
+OP(dd,cc) { illegal_1(); op_cc(); } /* DB DD */
+OP(dd,cd) { illegal_1(); op_cd(); } /* DB DD */
+OP(dd,ce) { illegal_1(); op_ce(); } /* DB DD */
+OP(dd,cf) { illegal_1(); op_cf(); } /* DB DD */
+
+OP(dd,d0) { illegal_1(); op_d0(); } /* DB DD */
+OP(dd,d1) { illegal_1(); op_d1(); } /* DB DD */
+OP(dd,d2) { illegal_1(); op_d2(); } /* DB DD */
+OP(dd,d3) { illegal_1(); op_d3(); } /* DB DD */
+OP(dd,d4) { illegal_1(); op_d4(); } /* DB DD */
+OP(dd,d5) { illegal_1(); op_d5(); } /* DB DD */
+OP(dd,d6) { illegal_1(); op_d6(); } /* DB DD */
+OP(dd,d7) { illegal_1(); op_d7(); } /* DB DD */
+
+OP(dd,d8) { illegal_1(); op_d8(); } /* DB DD */
+OP(dd,d9) { illegal_1(); op_d9(); } /* DB DD */
+OP(dd,da) { illegal_1(); op_da(); } /* DB DD */
+OP(dd,db) { illegal_1(); op_db(); } /* DB DD */
+OP(dd,dc) { illegal_1(); op_dc(); } /* DB DD */
+OP(dd,dd) { illegal_1(); op_dd(); } /* DB DD */
+OP(dd,de) { illegal_1(); op_de(); } /* DB DD */
+OP(dd,df) { illegal_1(); op_df(); } /* DB DD */
+
+OP(dd,e0) { illegal_1(); op_e0(); } /* DB DD */
+OP(dd,e1) { pop(m_ix); } /* POP IX */
+OP(dd,e2) { illegal_1(); op_e2(); } /* DB DD */
+OP(dd,e3) { ex_sp(m_ix); } /* EX (SP),IX */
+OP(dd,e4) { illegal_1(); op_e4(); } /* DB DD */
+OP(dd,e5) { push(m_ix); } /* PUSH IX */
+OP(dd,e6) { illegal_1(); op_e6(); } /* DB DD */
+OP(dd,e7) { illegal_1(); op_e7(); } /* DB DD */
+
+OP(dd,e8) { illegal_1(); op_e8(); } /* DB DD */
+OP(dd,e9) { PC = IX; } /* JP (IX) */
+OP(dd,ea) { illegal_1(); op_ea(); } /* DB DD */
+OP(dd,eb) { illegal_1(); op_eb(); } /* DB DD */
+OP(dd,ec) { illegal_1(); op_ec(); } /* DB DD */
+OP(dd,ed) { illegal_1(); op_ed(); } /* DB DD */
+OP(dd,ee) { illegal_1(); op_ee(); } /* DB DD */
+OP(dd,ef) { illegal_1(); op_ef(); } /* DB DD */
+
+OP(dd,f0) { illegal_1(); op_f0(); } /* DB DD */
+OP(dd,f1) { illegal_1(); op_f1(); } /* DB DD */
+OP(dd,f2) { illegal_1(); op_f2(); } /* DB DD */
+OP(dd,f3) { illegal_1(); op_f3(); } /* DB DD */
+OP(dd,f4) { illegal_1(); op_f4(); } /* DB DD */
+OP(dd,f5) { illegal_1(); op_f5(); } /* DB DD */
+OP(dd,f6) { illegal_1(); op_f6(); } /* DB DD */
+OP(dd,f7) { illegal_1(); op_f7(); } /* DB DD */
+
+OP(dd,f8) { illegal_1(); op_f8(); } /* DB DD */
+OP(dd,f9) { nomreq_ir(2); SP = IX; } /* LD SP,IX */
+OP(dd,fa) { illegal_1(); op_fa(); } /* DB DD */
+OP(dd,fb) { illegal_1(); op_fb(); } /* DB DD */
+OP(dd,fc) { illegal_1(); op_fc(); } /* DB DD */
+OP(dd,fd) { illegal_1(); op_fd(); } /* DB DD */
+OP(dd,fe) { illegal_1(); op_fe(); } /* DB DD */
+OP(dd,ff) { illegal_1(); op_ff(); } /* DB DD */
/**********************************************************
* IY register related opcodes (FD prefix)
**********************************************************/
-/* DB FD */ OP(FD,00) THEN illegal_1(); JP(00)
-/* DB FD */ OP(FD,01) THEN illegal_1(); JP(01)
-/* DB FD */ OP(FD,02) THEN illegal_1(); JP(02)
-/* DB FD */ OP(FD,03) THEN illegal_1(); JP(03)
-/* DB FD */ OP(FD,04) THEN illegal_1(); JP(04)
-/* DB FD */ OP(FD,05) THEN illegal_1(); JP(05)
-/* DB FD */ OP(FD,06) THEN illegal_1(); JP(06)
-/* DB FD */ OP(FD,07) THEN illegal_1(); JP(07)
-
-/* DB FD */ OP(FD,08) THEN illegal_1(); JP(08)
-/* ADD IY,BC */ OP(FD,09) THEN TDAT=IY; TDAT2=BC; CALL add16(); THEN IY=TDAT; ENDOP
-/* DB FD */ OP(FD,0a) THEN illegal_1(); JP(0a)
-/* DB FD */ OP(FD,0b) THEN illegal_1(); JP(0b)
-/* DB FD */ OP(FD,0c) THEN illegal_1(); JP(0c)
-/* DB FD */ OP(FD,0d) THEN illegal_1(); JP(0d)
-/* DB FD */ OP(FD,0e) THEN illegal_1(); JP(0e)
-/* DB FD */ OP(FD,0f) THEN illegal_1(); JP(0f)
-
-/* DB FD */ OP(FD,10) THEN illegal_1(); JP(10)
-/* DB FD */ OP(FD,11) THEN illegal_1(); JP(11)
-/* DB FD */ OP(FD,12) THEN illegal_1(); JP(12)
-/* DB FD */ OP(FD,13) THEN illegal_1(); JP(13)
-/* DB FD */ OP(FD,14) THEN illegal_1(); JP(14)
-/* DB FD */ OP(FD,15) THEN illegal_1(); JP(15)
-/* DB FD */ OP(FD,16) THEN illegal_1(); JP(16)
-/* DB FD */ OP(FD,17) THEN illegal_1(); JP(17)
-
-/* DB FD */ OP(FD,18) THEN illegal_1(); JP(18)
-/* ADD IY,DE */ OP(FD,19) THEN TDAT=IY; TDAT2=DE; CALL add16(); THEN IY=TDAT; ENDOP
-/* DB FD */ OP(FD,1a) THEN illegal_1(); JP(1a)
-/* DB FD */ OP(FD,1b) THEN illegal_1(); JP(1b)
-/* DB FD */ OP(FD,1c) THEN illegal_1(); JP(1c)
-/* DB FD */ OP(FD,1d) THEN illegal_1(); JP(1d)
-/* DB FD */ OP(FD,1e) THEN illegal_1(); JP(1e)
-/* DB FD */ OP(FD,1f) THEN illegal_1(); JP(1f)
-
-/* DB FD */ OP(FD,20) THEN illegal_1(); JP(20)
-/* LD IY,w */ OP(FD,21) CALL arg16(); THEN IY = TDAT; ENDOP
-/* LD (w),IY */ OP(FD,22) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=IY; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* INC IY */ OP(FD,23) CALL nomreq_ir(2); THEN IY++; ENDOP
-/* INC HY */ OP(FD,24) THEN inc(HY); ENDOP
-/* DEC HY */ OP(FD,25) THEN dec(HY); ENDOP
-/* LD HY,n */ OP(FD,26) CALL arg(); THEN HY = TDAT8; ENDOP
-/* DB FD */ OP(FD,27) THEN illegal_1(); JP(27)
-
-/* DB FD */ OP(FD,28) THEN illegal_1(); JP(28)
-/* ADD IY,IY */ OP(FD,29) THEN TDAT=IY; TDAT2=IY; CALL add16(); THEN IY=TDAT; ENDOP
-/* LD IY,(w) */ OP(FD,2a) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN IY=TDAT; WZ = m_ea + 1; ENDOP
-/* DEC IY */ OP(FD,2b) CALL nomreq_ir(2); THEN IY--; ENDOP
-/* INC LY */ OP(FD,2c) THEN inc(LY); ENDOP
-/* DEC LY */ OP(FD,2d) THEN dec(LY); ENDOP
-/* LD LY,n */ OP(FD,2e) CALL arg(); THEN LY = TDAT8; ENDOP
-/* DB FD */ OP(FD,2f) THEN illegal_1(); JP(2f)
-
-/* DB FD */ OP(FD,30) THEN illegal_1(); JP(30)
-/* DB FD */ OP(FD,31) THEN illegal_1(); JP(31)
-/* DB FD */ OP(FD,32) THEN illegal_1(); JP(32)
-/* DB FD */ OP(FD,33) THEN illegal_1(); JP(33)
-/* INC (IY+o) */ OP(FD,34) CALL eay(); THEN TADR=PCD-1; CALL nomreq_addr(5); THEN TADR=m_ea; CALL rm_reg(); THEN inc(TDAT8); CALL wm(); ENDOP
-/* DEC (IY+o) */ OP(FD,35) CALL eay(); THEN TADR=PCD-1; CALL nomreq_addr(5); THEN TADR=m_ea; CALL rm_reg(); THEN dec(TDAT8); CALL wm(); ENDOP
-/* LD (IY+o),n */ OP(FD,36) CALL eay(); CALL arg(); THEN TADR=PCD-1; CALL nomreq_addr(2); THEN TADR=m_ea; CALL wm(); ENDOP
-/* DB FD */ OP(FD,37) THEN illegal_1(); JP(37)
-
-/* DB FD */ OP(FD,38) THEN illegal_1(); JP(38)
-/* ADD IY,SP */ OP(FD,39) THEN TDAT=IY; TDAT2=SP; CALL add16(); THEN IY=TDAT; ENDOP
-/* DB FD */ OP(FD,3a) THEN illegal_1(); JP(3a)
-/* DB FD */ OP(FD,3b) THEN illegal_1(); JP(3b)
-/* DB FD */ OP(FD,3c) THEN illegal_1(); JP(3c)
-/* DB FD */ OP(FD,3d) THEN illegal_1(); JP(3d)
-/* DB FD */ OP(FD,3e) THEN illegal_1(); JP(3e)
-/* DB FD */ OP(FD,3f) THEN illegal_1(); JP(3f)
-
-/* DB FD */ OP(FD,40) THEN illegal_1(); JP(40)
-/* DB FD */ OP(FD,41) THEN illegal_1(); JP(41)
-/* DB FD */ OP(FD,42) THEN illegal_1(); JP(42)
-/* DB FD */ OP(FD,43) THEN illegal_1(); JP(43)
-/* LD B,HY */ OP(FD,44) THEN B = HY; ENDOP
-/* LD B,LY */ OP(FD,45) THEN B = LY; ENDOP
-/* LD B,(IY+o) */ OP(FD,46) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN B = TDAT8; ENDOP
-/* DB FD */ OP(FD,47) THEN illegal_1(); JP(47)
-
-/* DB FD */ OP(FD,48) THEN illegal_1(); JP(48)
-/* DB FD */ OP(FD,49) THEN illegal_1(); JP(49)
-/* DB FD */ OP(FD,4a) THEN illegal_1(); JP(4a)
-/* DB FD */ OP(FD,4b) THEN illegal_1(); JP(4b)
-/* LD C,HY */ OP(FD,4c) THEN C = HY; ENDOP
-/* LD C,LY */ OP(FD,4d) THEN C = LY; ENDOP
-/* LD C,(IY+o) */ OP(FD,4e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN C = TDAT8; ENDOP
-/* DB FD */ OP(FD,4f) THEN illegal_1(); JP(4f)
-
-/* DB FD */ OP(FD,50) THEN illegal_1(); JP(50)
-/* DB FD */ OP(FD,51) THEN illegal_1(); JP(51)
-/* DB FD */ OP(FD,52) THEN illegal_1(); JP(52)
-/* DB FD */ OP(FD,53) THEN illegal_1(); JP(53)
-/* LD D,HY */ OP(FD,54) THEN D = HY; ENDOP
-/* LD D,LY */ OP(FD,55) THEN D = LY; ENDOP
-/* LD D,(IY+o) */ OP(FD,56) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN D = TDAT8; ENDOP
-/* DB FD */ OP(FD,57) THEN illegal_1(); JP(57)
-
-/* DB FD */ OP(FD,58) THEN illegal_1(); JP(58)
-/* DB FD */ OP(FD,59) THEN illegal_1(); JP(59)
-/* DB FD */ OP(FD,5a) THEN illegal_1(); JP(5a)
-/* DB FD */ OP(FD,5b) THEN illegal_1(); JP(5b)
-/* LD E,HY */ OP(FD,5c) THEN E = HY; ENDOP
-/* LD E,LY */ OP(FD,5d) THEN E = LY; ENDOP
-/* LD E,(IY+o) */ OP(FD,5e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN E = TDAT8; ENDOP
-/* DB FD */ OP(FD,5f) THEN illegal_1(); JP(5f)
-
-/* LD HY,B */ OP(FD,60) THEN HY = B; ENDOP
-/* LD HY,C */ OP(FD,61) THEN HY = C; ENDOP
-/* LD HY,D */ OP(FD,62) THEN HY = D; ENDOP
-/* LD HY,E */ OP(FD,63) THEN HY = E; ENDOP
-/* LD HY,HY */ OP(FD,64) ENDOP
-/* LD HY,LY */ OP(FD,65) THEN HY = LY; ENDOP
-/* LD H,(IY+o) */ OP(FD,66) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN H = TDAT8; ENDOP
-/* LD HY,A */ OP(FD,67) THEN HY = A; ENDOP
-
-/* LD LY,B */ OP(FD,68) THEN LY = B; ENDOP
-/* LD LY,C */ OP(FD,69) THEN LY = C; ENDOP
-/* LD LY,D */ OP(FD,6a) THEN LY = D; ENDOP
-/* LD LY,E */ OP(FD,6b) THEN LY = E; ENDOP
-/* LD LY,HY */ OP(FD,6c) THEN LY = HY; ENDOP
-/* LD LY,LY */ OP(FD,6d) ENDOP
-/* LD L,(IY+o) */ OP(FD,6e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN L = TDAT8; ENDOP
-/* LD LY,A */ OP(FD,6f) THEN LY = A; ENDOP
-
-/* LD (IY+o),B */ OP(FD,70) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = B; CALL wm(); ENDOP
-/* LD (IY+o),C */ OP(FD,71) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = C; CALL wm(); ENDOP
-/* LD (IY+o),D */ OP(FD,72) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = D; CALL wm(); ENDOP
-/* LD (IY+o),E */ OP(FD,73) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = E; CALL wm(); ENDOP
-/* LD (IY+o),H */ OP(FD,74) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = H; CALL wm(); ENDOP
-/* LD (IY+o),L */ OP(FD,75) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = L; CALL wm(); ENDOP
-/* DB FD */ OP(FD,76) THEN illegal_1(); JP(76)
-/* LD (IY+o),A */ OP(FD,77) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; TDAT8 = A; CALL wm(); ENDOP
-
-/* DB FD */ OP(FD,78) THEN illegal_1(); JP(78)
-/* DB FD */ OP(FD,79) THEN illegal_1(); JP(79)
-/* DB FD */ OP(FD,7a) THEN illegal_1(); JP(7a)
-/* DB FD */ OP(FD,7b) THEN illegal_1(); JP(7b)
-/* LD A,HY */ OP(FD,7c) THEN A = HY; ENDOP
-/* LD A,LY */ OP(FD,7d) THEN A = LY; ENDOP
-/* LD A,(IY+o) */ OP(FD,7e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN A = TDAT8; ENDOP
-/* DB FD */ OP(FD,7f) THEN illegal_1(); JP(7f)
-
-/* DB FD */ OP(FD,80) THEN illegal_1(); JP(80)
-/* DB FD */ OP(FD,81) THEN illegal_1(); JP(81)
-/* DB FD */ OP(FD,82) THEN illegal_1(); JP(82)
-/* DB FD */ OP(FD,83) THEN illegal_1(); JP(83)
-/* ADD A,HY */ OP(FD,84) THEN add_a(HY); ENDOP
-/* ADD A,LY */ OP(FD,85) THEN add_a(LY); ENDOP
-/* ADD A,(IY+o) */ OP(FD,86) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN add_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,87) THEN illegal_1(); JP(87)
-
-/* DB FD */ OP(FD,88) THEN illegal_1(); JP(88)
-/* DB FD */ OP(FD,89) THEN illegal_1(); JP(89)
-/* DB FD */ OP(FD,8a) THEN illegal_1(); JP(8a)
-/* DB FD */ OP(FD,8b) THEN illegal_1(); JP(8b)
-/* ADC A,HY */ OP(FD,8c) THEN adc_a(HY); ENDOP
-/* ADC A,LY */ OP(FD,8d) THEN adc_a(LY); ENDOP
-/* ADC A,(IY+o) */ OP(FD,8e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN adc_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,8f) THEN illegal_1(); JP(8f)
-
-/* DB FD */ OP(FD,90) THEN illegal_1(); JP(90)
-/* DB FD */ OP(FD,91) THEN illegal_1(); JP(91)
-/* DB FD */ OP(FD,92) THEN illegal_1(); JP(92)
-/* DB FD */ OP(FD,93) THEN illegal_1(); JP(93)
-/* SUB HY */ OP(FD,94) THEN sub(HY); ENDOP
-/* SUB LY */ OP(FD,95) THEN sub(LY); ENDOP
-/* SUB (IY+o) */ OP(FD,96) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN sub(TDAT8); ENDOP
-/* DB FD */ OP(FD,97) THEN illegal_1(); JP(97)
-
-/* DB FD */ OP(FD,98) THEN illegal_1(); JP(98)
-/* DB FD */ OP(FD,99) THEN illegal_1(); JP(99)
-/* DB FD */ OP(FD,9a) THEN illegal_1(); JP(9a)
-/* DB FD */ OP(FD,9b) THEN illegal_1(); JP(9b)
-/* SBC A,HY */ OP(FD,9c) THEN sbc_a(HY); ENDOP
-/* SBC A,LY */ OP(FD,9d) THEN sbc_a(LY); ENDOP
-/* SBC A,(IY+o) */ OP(FD,9e) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN sbc_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,9f) THEN illegal_1(); JP(9f)
-
-/* DB FD */ OP(FD,a0) THEN illegal_1(); JP(a0)
-/* DB FD */ OP(FD,a1) THEN illegal_1(); JP(a1)
-/* DB FD */ OP(FD,a2) THEN illegal_1(); JP(a2)
-/* DB FD */ OP(FD,a3) THEN illegal_1(); JP(a3)
-/* AND HY */ OP(FD,a4) THEN and_a(HY); ENDOP
-/* AND LY */ OP(FD,a5) THEN and_a(LY); ENDOP
-/* AND (IY+o) */ OP(FD,a6) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN and_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,a7) THEN illegal_1(); JP(a7)
-
-/* DB FD */ OP(FD,a8) THEN illegal_1(); JP(a8)
-/* DB FD */ OP(FD,a9) THEN illegal_1(); JP(a9)
-/* DB FD */ OP(FD,aa) THEN illegal_1(); JP(aa)
-/* DB FD */ OP(FD,ab) THEN illegal_1(); JP(ab)
-/* XOR HY */ OP(FD,ac) THEN xor_a(HY); ENDOP
-/* XOR LY */ OP(FD,ad) THEN xor_a(LY); ENDOP
-/* XOR (IY+o) */ OP(FD,ae) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN xor_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,af) THEN illegal_1(); JP(af)
-
-/* DB FD */ OP(FD,b0) THEN illegal_1(); JP(b0)
-/* DB FD */ OP(FD,b1) THEN illegal_1(); JP(b1)
-/* DB FD */ OP(FD,b2) THEN illegal_1(); JP(b2)
-/* DB FD */ OP(FD,b3) THEN illegal_1(); JP(b3)
-/* OR HY */ OP(FD,b4) THEN or_a(HY); ENDOP
-/* OR LY */ OP(FD,b5) THEN or_a(LY); ENDOP
-/* OR (IY+o) */ OP(FD,b6) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN or_a(TDAT8); ENDOP
-/* DB FD */ OP(FD,b7) THEN illegal_1(); JP(b7)
-
-/* DB FD */ OP(FD,b8) THEN illegal_1(); JP(b8)
-/* DB FD */ OP(FD,b9) THEN illegal_1(); JP(b9)
-/* DB FD */ OP(FD,ba) THEN illegal_1(); JP(ba)
-/* DB FD */ OP(FD,bb) THEN illegal_1(); JP(bb)
-/* CP HY */ OP(FD,bc) THEN cp(HY); ENDOP
-/* CP LY */ OP(FD,bd) THEN cp(LY); ENDOP
-/* CP (IY+o) */ OP(FD,be) CALL eay(); THEN TADR = PCD-1; CALL nomreq_addr(5); THEN TADR = m_ea; CALL rm(); THEN cp(TDAT8); ENDOP
-/* DB FD */ OP(FD,bf) THEN illegal_1(); JP(bf)
-
-/* DB FD */ OP(FD,c0) THEN illegal_1(); JP(c0)
-/* DB FD */ OP(FD,c1) THEN illegal_1(); JP(c1)
-/* DB FD */ OP(FD,c2) THEN illegal_1(); JP(c2)
-/* DB FD */ OP(FD,c3) THEN illegal_1(); JP(c3)
-/* DB FD */ OP(FD,c4) THEN illegal_1(); JP(c4)
-/* DB FD */ OP(FD,c5) THEN illegal_1(); JP(c5)
-/* DB FD */ OP(FD,c6) THEN illegal_1(); JP(c6)
-/* DB FD */ OP(FD,c7) THEN illegal_1(); JP(c7)
-
-/* DB FD */ OP(FD,c8) THEN illegal_1(); JP(c8)
-/* DB FD */ OP(FD,c9) THEN illegal_1(); JP(c9)
-/* DB FD */ OP(FD,ca) THEN illegal_1(); JP(ca)
-/* ** FD CB xx */ OP(FD,cb) CALL eay(); CALL arg(); THEN TADR=PCD-1; CALL nomreq_addr(2); THENJP(XY_CB)
-/* DB FD */ OP(FD,cc) THEN illegal_1(); JP(cc)
-/* DB FD */ OP(FD,cd) THEN illegal_1(); JP(cd)
-/* DB FD */ OP(FD,ce) THEN illegal_1(); JP(ce)
-/* DB FD */ OP(FD,cf) THEN illegal_1(); JP(cf)
-
-/* DB FD */ OP(FD,d0) THEN illegal_1(); JP(d0)
-/* DB FD */ OP(FD,d1) THEN illegal_1(); JP(d1)
-/* DB FD */ OP(FD,d2) THEN illegal_1(); JP(d2)
-/* DB FD */ OP(FD,d3) THEN illegal_1(); JP(d3)
-/* DB FD */ OP(FD,d4) THEN illegal_1(); JP(d4)
-/* DB FD */ OP(FD,d5) THEN illegal_1(); JP(d5)
-/* DB FD */ OP(FD,d6) THEN illegal_1(); JP(d6)
-/* DB FD */ OP(FD,d7) THEN illegal_1(); JP(d7)
-
-/* DB FD */ OP(FD,d8) THEN illegal_1(); JP(d8)
-/* DB FD */ OP(FD,d9) THEN illegal_1(); JP(d9)
-/* DB FD */ OP(FD,da) THEN illegal_1(); JP(da)
-/* DB FD */ OP(FD,db) THEN illegal_1(); JP(db)
-/* DB FD */ OP(FD,dc) THEN illegal_1(); JP(dc)
-/* DB FD */ OP(FD,dd) THEN illegal_1(); JP(dd)
-/* DB FD */ OP(FD,de) THEN illegal_1(); JP(de)
-/* DB FD */ OP(FD,df) THEN illegal_1(); JP(df)
-
-/* DB FD */ OP(FD,e0) THEN illegal_1(); JP(e0)
-/* POP IY */ OP(FD,e1) CALL pop(); THEN IY=TDAT; ENDOP
-/* DB FD */ OP(FD,e2) THEN illegal_1(); JP(e2)
-/* EX (SP),IY */ OP(FD,e3) THEN TDAT=IY; CALL ex_sp(); THEN IY=TDAT; ENDOP
-/* DB FD */ OP(FD,e4) THEN illegal_1(); JP(e4)
-/* PUSH IY */ OP(FD,e5) THEN TDAT=IY; CALL push(); ENDOP
-/* DB FD */ OP(FD,e6) THEN illegal_1(); JP(e6)
-/* DB FD */ OP(FD,e7) THEN illegal_1(); JP(e7)
-
-/* DB FD */ OP(FD,e8) THEN illegal_1(); JP(e8)
-/* JP (IY) */ OP(FD,e9) THEN PC = IY; ENDOP
-/* DB FD */ OP(FD,ea) THEN illegal_1(); JP(ea)
-/* DB FD */ OP(FD,eb) THEN illegal_1(); JP(eb)
-/* DB FD */ OP(FD,ec) THEN illegal_1(); JP(ec)
-/* DB FD */ OP(FD,ed) THEN illegal_1(); JP(ed)
-/* DB FD */ OP(FD,ee) THEN illegal_1(); JP(ee)
-/* DB FD */ OP(FD,ef) THEN illegal_1(); JP(ef)
-
-/* DB FD */ OP(FD,f0) THEN illegal_1(); JP(f0)
-/* DB FD */ OP(FD,f1) THEN illegal_1(); JP(f1)
-/* DB FD */ OP(FD,f2) THEN illegal_1(); JP(f2)
-/* DB FD */ OP(FD,f3) THEN illegal_1(); JP(f3)
-/* DB FD */ OP(FD,f4) THEN illegal_1(); JP(f4)
-/* DB FD */ OP(FD,f5) THEN illegal_1(); JP(f5)
-/* DB FD */ OP(FD,f6) THEN illegal_1(); JP(f6)
-/* DB FD */ OP(FD,f7) THEN illegal_1(); JP(f7)
-
-/* DB FD */ OP(FD,f8) THEN illegal_1(); JP(f8)
-/* LD SP,IY */ OP(FD,f9) CALL nomreq_ir(2); THEN SP = IY; ENDOP
-/* DB FD */ OP(FD,fa) THEN illegal_1(); JP(fa)
-/* DB FD */ OP(FD,fb) THEN illegal_1(); JP(fb)
-/* DB FD */ OP(FD,fc) THEN illegal_1(); JP(fc)
-/* DB FD */ OP(FD,fd) THEN illegal_1(); JP(fd)
-/* DB FD */ OP(FD,fe) THEN illegal_1(); JP(fe)
-/* DB FD */ OP(FD,ff) THEN illegal_1(); JP(ff)
+OP(fd,00) { illegal_1(); op_00(); } /* DB FD */
+OP(fd,01) { illegal_1(); op_01(); } /* DB FD */
+OP(fd,02) { illegal_1(); op_02(); } /* DB FD */
+OP(fd,03) { illegal_1(); op_03(); } /* DB FD */
+OP(fd,04) { illegal_1(); op_04(); } /* DB FD */
+OP(fd,05) { illegal_1(); op_05(); } /* DB FD */
+OP(fd,06) { illegal_1(); op_06(); } /* DB FD */
+OP(fd,07) { illegal_1(); op_07(); } /* DB FD */
+
+OP(fd,08) { illegal_1(); op_08(); } /* DB FD */
+OP(fd,09) { add16(m_iy, m_bc); } /* ADD IY,BC */
+OP(fd,0a) { illegal_1(); op_0a(); } /* DB FD */
+OP(fd,0b) { illegal_1(); op_0b(); } /* DB FD */
+OP(fd,0c) { illegal_1(); op_0c(); } /* DB FD */
+OP(fd,0d) { illegal_1(); op_0d(); } /* DB FD */
+OP(fd,0e) { illegal_1(); op_0e(); } /* DB FD */
+OP(fd,0f) { illegal_1(); op_0f(); } /* DB FD */
+
+OP(fd,10) { illegal_1(); op_10(); } /* DB FD */
+OP(fd,11) { illegal_1(); op_11(); } /* DB FD */
+OP(fd,12) { illegal_1(); op_12(); } /* DB FD */
+OP(fd,13) { illegal_1(); op_13(); } /* DB FD */
+OP(fd,14) { illegal_1(); op_14(); } /* DB FD */
+OP(fd,15) { illegal_1(); op_15(); } /* DB FD */
+OP(fd,16) { illegal_1(); op_16(); } /* DB FD */
+OP(fd,17) { illegal_1(); op_17(); } /* DB FD */
+
+OP(fd,18) { illegal_1(); op_18(); } /* DB FD */
+OP(fd,19) { add16(m_iy, m_de); } /* ADD IY,DE */
+OP(fd,1a) { illegal_1(); op_1a(); } /* DB FD */
+OP(fd,1b) { illegal_1(); op_1b(); } /* DB FD */
+OP(fd,1c) { illegal_1(); op_1c(); } /* DB FD */
+OP(fd,1d) { illegal_1(); op_1d(); } /* DB FD */
+OP(fd,1e) { illegal_1(); op_1e(); } /* DB FD */
+OP(fd,1f) { illegal_1(); op_1f(); } /* DB FD */
+
+OP(fd,20) { illegal_1(); op_20(); } /* DB FD */
+OP(fd,21) { IY = arg16(); } /* LD IY,w */
+OP(fd,22) { m_ea = arg16(); wm16(m_ea, m_iy); WZ = m_ea + 1; } /* LD (w),IY */
+OP(fd,23) { nomreq_ir(2); IY++; } /* INC IY */
+OP(fd,24) { HY = inc(HY); } /* INC HY */
+OP(fd,25) { HY = dec(HY); } /* DEC HY */
+OP(fd,26) { HY = arg(); } /* LD HY,n */
+OP(fd,27) { illegal_1(); op_27(); } /* DB FD */
+
+OP(fd,28) { illegal_1(); op_28(); } /* DB FD */
+OP(fd,29) { add16(m_iy, m_iy); } /* ADD IY,IY */
+OP(fd,2a) { m_ea = arg16(); rm16(m_ea, m_iy); WZ = m_ea + 1; } /* LD IY,(w) */
+OP(fd,2b) { nomreq_ir(2); IY--; } /* DEC IY */
+OP(fd,2c) { LY = inc(LY); } /* INC LY */
+OP(fd,2d) { LY = dec(LY); } /* DEC LY */
+OP(fd,2e) { LY = arg(); } /* LD LY,n */
+OP(fd,2f) { illegal_1(); op_2f(); } /* DB FD */
+
+OP(fd,30) { illegal_1(); op_30(); } /* DB FD */
+OP(fd,31) { illegal_1(); op_31(); } /* DB FD */
+OP(fd,32) { illegal_1(); op_32(); } /* DB FD */
+OP(fd,33) { illegal_1(); op_33(); } /* DB FD */
+OP(fd,34) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, inc(rm_reg(m_ea))); } /* INC (IY+o) */
+OP(fd,35) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, dec(rm_reg(m_ea))); } /* DEC (IY+o) */
+OP(fd,36) { eay(); u8 a = arg(); nomreq_addr(PCD-1, 2); wm(m_ea, a); } /* LD (IY+o),n */
+OP(fd,37) { illegal_1(); op_37(); } /* DB FD */
+
+OP(fd,38) { illegal_1(); op_38(); } /* DB FD */
+OP(fd,39) { add16(m_iy, m_sp); } /* ADD IY,SP */
+OP(fd,3a) { illegal_1(); op_3a(); } /* DB FD */
+OP(fd,3b) { illegal_1(); op_3b(); } /* DB FD */
+OP(fd,3c) { illegal_1(); op_3c(); } /* DB FD */
+OP(fd,3d) { illegal_1(); op_3d(); } /* DB FD */
+OP(fd,3e) { illegal_1(); op_3e(); } /* DB FD */
+OP(fd,3f) { illegal_1(); op_3f(); } /* DB FD */
+
+OP(fd,40) { illegal_1(); op_40(); } /* DB FD */
+OP(fd,41) { illegal_1(); op_41(); } /* DB FD */
+OP(fd,42) { illegal_1(); op_42(); } /* DB FD */
+OP(fd,43) { illegal_1(); op_43(); } /* DB FD */
+OP(fd,44) { B = HY; } /* LD B,HY */
+OP(fd,45) { B = LY; } /* LD B,LY */
+OP(fd,46) { eay(); nomreq_addr(PCD-1, 5); B = rm(m_ea); } /* LD B,(IY+o) */
+OP(fd,47) { illegal_1(); op_47(); } /* DB FD */
+
+OP(fd,48) { illegal_1(); op_48(); } /* DB FD */
+OP(fd,49) { illegal_1(); op_49(); } /* DB FD */
+OP(fd,4a) { illegal_1(); op_4a(); } /* DB FD */
+OP(fd,4b) { illegal_1(); op_4b(); } /* DB FD */
+OP(fd,4c) { C = HY; } /* LD C,HY */
+OP(fd,4d) { C = LY; } /* LD C,LY */
+OP(fd,4e) { eay(); nomreq_addr(PCD-1, 5); C = rm(m_ea); } /* LD C,(IY+o) */
+OP(fd,4f) { illegal_1(); op_4f(); } /* DB FD */
+
+OP(fd,50) { illegal_1(); op_50(); } /* DB FD */
+OP(fd,51) { illegal_1(); op_51(); } /* DB FD */
+OP(fd,52) { illegal_1(); op_52(); } /* DB FD */
+OP(fd,53) { illegal_1(); op_53(); } /* DB FD */
+OP(fd,54) { D = HY; } /* LD D,HY */
+OP(fd,55) { D = LY; } /* LD D,LY */
+OP(fd,56) { eay(); nomreq_addr(PCD-1, 5); D = rm(m_ea); } /* LD D,(IY+o) */
+OP(fd,57) { illegal_1(); op_57(); } /* DB FD */
+
+OP(fd,58) { illegal_1(); op_58(); } /* DB FD */
+OP(fd,59) { illegal_1(); op_59(); } /* DB FD */
+OP(fd,5a) { illegal_1(); op_5a(); } /* DB FD */
+OP(fd,5b) { illegal_1(); op_5b(); } /* DB FD */
+OP(fd,5c) { E = HY; } /* LD E,HY */
+OP(fd,5d) { E = LY; } /* LD E,LY */
+OP(fd,5e) { eay(); nomreq_addr(PCD-1, 5); E = rm(m_ea); } /* LD E,(IY+o) */
+OP(fd,5f) { illegal_1(); op_5f(); } /* DB FD */
+
+OP(fd,60) { HY = B; } /* LD HY,B */
+OP(fd,61) { HY = C; } /* LD HY,C */
+OP(fd,62) { HY = D; } /* LD HY,D */
+OP(fd,63) { HY = E; } /* LD HY,E */
+OP(fd,64) { } /* LD HY,HY */
+OP(fd,65) { HY = LY; } /* LD HY,LY */
+OP(fd,66) { eay(); nomreq_addr(PCD-1, 5); H = rm(m_ea); } /* LD H,(IY+o) */
+OP(fd,67) { HY = A; } /* LD HY,A */
+
+OP(fd,68) { LY = B; } /* LD LY,B */
+OP(fd,69) { LY = C; } /* LD LY,C */
+OP(fd,6a) { LY = D; } /* LD LY,D */
+OP(fd,6b) { LY = E; } /* LD LY,E */
+OP(fd,6c) { LY = HY; } /* LD LY,HY */
+OP(fd,6d) { } /* LD LY,LY */
+OP(fd,6e) { eay(); nomreq_addr(PCD-1, 5); L = rm(m_ea); } /* LD L,(IY+o) */
+OP(fd,6f) { LY = A; } /* LD LY,A */
+
+OP(fd,70) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, B); } /* LD (IY+o),B */
+OP(fd,71) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, C); } /* LD (IY+o),C */
+OP(fd,72) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, D); } /* LD (IY+o),D */
+OP(fd,73) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, E); } /* LD (IY+o),E */
+OP(fd,74) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, H); } /* LD (IY+o),H */
+OP(fd,75) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, L); } /* LD (IY+o),L */
+OP(fd,76) { illegal_1(); op_76(); } /* DB FD */
+OP(fd,77) { eay(); nomreq_addr(PCD-1, 5); wm(m_ea, A); } /* LD (IY+o),A */
+
+OP(fd,78) { illegal_1(); op_78(); } /* DB FD */
+OP(fd,79) { illegal_1(); op_79(); } /* DB FD */
+OP(fd,7a) { illegal_1(); op_7a(); } /* DB FD */
+OP(fd,7b) { illegal_1(); op_7b(); } /* DB FD */
+OP(fd,7c) { A = HY; } /* LD A,HY */
+OP(fd,7d) { A = LY; } /* LD A,LY */
+OP(fd,7e) { eay(); nomreq_addr(PCD-1, 5); A = rm(m_ea); } /* LD A,(IY+o) */
+OP(fd,7f) { illegal_1(); op_7f(); } /* DB FD */
+
+OP(fd,80) { illegal_1(); op_80(); } /* DB FD */
+OP(fd,81) { illegal_1(); op_81(); } /* DB FD */
+OP(fd,82) { illegal_1(); op_82(); } /* DB FD */
+OP(fd,83) { illegal_1(); op_83(); } /* DB FD */
+OP(fd,84) { add_a(HY); } /* ADD A,HY */
+OP(fd,85) { add_a(LY); } /* ADD A,LY */
+OP(fd,86) { eay(); nomreq_addr(PCD-1, 5); add_a(rm(m_ea)); } /* ADD A,(IY+o) */
+OP(fd,87) { illegal_1(); op_87(); } /* DB FD */
+
+OP(fd,88) { illegal_1(); op_88(); } /* DB FD */
+OP(fd,89) { illegal_1(); op_89(); } /* DB FD */
+OP(fd,8a) { illegal_1(); op_8a(); } /* DB FD */
+OP(fd,8b) { illegal_1(); op_8b(); } /* DB FD */
+OP(fd,8c) { adc_a(HY); } /* ADC A,HY */
+OP(fd,8d) { adc_a(LY); } /* ADC A,LY */
+OP(fd,8e) { eay(); nomreq_addr(PCD-1, 5); adc_a(rm(m_ea)); } /* ADC A,(IY+o) */
+OP(fd,8f) { illegal_1(); op_8f(); } /* DB FD */
+
+OP(fd,90) { illegal_1(); op_90(); } /* DB FD */
+OP(fd,91) { illegal_1(); op_91(); } /* DB FD */
+OP(fd,92) { illegal_1(); op_92(); } /* DB FD */
+OP(fd,93) { illegal_1(); op_93(); } /* DB FD */
+OP(fd,94) { sub(HY); } /* SUB HY */
+OP(fd,95) { sub(LY); } /* SUB LY */
+OP(fd,96) { eay(); nomreq_addr(PCD-1, 5); sub(rm(m_ea)); } /* SUB (IY+o) */
+OP(fd,97) { illegal_1(); op_97(); } /* DB FD */
+
+OP(fd,98) { illegal_1(); op_98(); } /* DB FD */
+OP(fd,99) { illegal_1(); op_99(); } /* DB FD */
+OP(fd,9a) { illegal_1(); op_9a(); } /* DB FD */
+OP(fd,9b) { illegal_1(); op_9b(); } /* DB FD */
+OP(fd,9c) { sbc_a(HY); } /* SBC A,HY */
+OP(fd,9d) { sbc_a(LY); } /* SBC A,LY */
+OP(fd,9e) { eay(); nomreq_addr(PCD-1, 5); sbc_a(rm(m_ea)); } /* SBC A,(IY+o) */
+OP(fd,9f) { illegal_1(); op_9f(); } /* DB FD */
+
+OP(fd,a0) { illegal_1(); op_a0(); } /* DB FD */
+OP(fd,a1) { illegal_1(); op_a1(); } /* DB FD */
+OP(fd,a2) { illegal_1(); op_a2(); } /* DB FD */
+OP(fd,a3) { illegal_1(); op_a3(); } /* DB FD */
+OP(fd,a4) { and_a(HY); } /* AND HY */
+OP(fd,a5) { and_a(LY); } /* AND LY */
+OP(fd,a6) { eay(); nomreq_addr(PCD-1, 5); and_a(rm(m_ea)); } /* AND (IY+o) */
+OP(fd,a7) { illegal_1(); op_a7(); } /* DB FD */
+
+OP(fd,a8) { illegal_1(); op_a8(); } /* DB FD */
+OP(fd,a9) { illegal_1(); op_a9(); } /* DB FD */
+OP(fd,aa) { illegal_1(); op_aa(); } /* DB FD */
+OP(fd,ab) { illegal_1(); op_ab(); } /* DB FD */
+OP(fd,ac) { xor_a(HY); } /* XOR HY */
+OP(fd,ad) { xor_a(LY); } /* XOR LY */
+OP(fd,ae) { eay(); nomreq_addr(PCD-1, 5); xor_a(rm(m_ea)); } /* XOR (IY+o) */
+OP(fd,af) { illegal_1(); op_af(); } /* DB FD */
+
+OP(fd,b0) { illegal_1(); op_b0(); } /* DB FD */
+OP(fd,b1) { illegal_1(); op_b1(); } /* DB FD */
+OP(fd,b2) { illegal_1(); op_b2(); } /* DB FD */
+OP(fd,b3) { illegal_1(); op_b3(); } /* DB FD */
+OP(fd,b4) { or_a(HY); } /* OR HY */
+OP(fd,b5) { or_a(LY); } /* OR LY */
+OP(fd,b6) { eay(); nomreq_addr(PCD-1, 5); or_a(rm(m_ea)); } /* OR (IY+o) */
+OP(fd,b7) { illegal_1(); op_b7(); } /* DB FD */
+
+OP(fd,b8) { illegal_1(); op_b8(); } /* DB FD */
+OP(fd,b9) { illegal_1(); op_b9(); } /* DB FD */
+OP(fd,ba) { illegal_1(); op_ba(); } /* DB FD */
+OP(fd,bb) { illegal_1(); op_bb(); } /* DB FD */
+OP(fd,bc) { cp(HY); } /* CP HY */
+OP(fd,bd) { cp(LY); } /* CP LY */
+OP(fd,be) { eay(); nomreq_addr(PCD-1, 5); cp(rm(m_ea)); } /* CP (IY+o) */
+OP(fd,bf) { illegal_1(); op_bf(); } /* DB FD */
+
+OP(fd,c0) { illegal_1(); op_c0(); } /* DB FD */
+OP(fd,c1) { illegal_1(); op_c1(); } /* DB FD */
+OP(fd,c2) { illegal_1(); op_c2(); } /* DB FD */
+OP(fd,c3) { illegal_1(); op_c3(); } /* DB FD */
+OP(fd,c4) { illegal_1(); op_c4(); } /* DB FD */
+OP(fd,c5) { illegal_1(); op_c5(); } /* DB FD */
+OP(fd,c6) { illegal_1(); op_c6(); } /* DB FD */
+OP(fd,c7) { illegal_1(); op_c7(); } /* DB FD */
+
+OP(fd,c8) { illegal_1(); op_c8(); } /* DB FD */
+OP(fd,c9) { illegal_1(); op_c9(); } /* DB FD */
+OP(fd,ca) { illegal_1(); op_ca(); } /* DB FD */
+OP(fd,cb) { eay(); u8 a = arg(); nomreq_addr(PCD-1, 2); EXEC(xycb, a); } /* ** FD CB xx */
+OP(fd,cc) { illegal_1(); op_cc(); } /* DB FD */
+OP(fd,cd) { illegal_1(); op_cd(); } /* DB FD */
+OP(fd,ce) { illegal_1(); op_ce(); } /* DB FD */
+OP(fd,cf) { illegal_1(); op_cf(); } /* DB FD */
+
+OP(fd,d0) { illegal_1(); op_d0(); } /* DB FD */
+OP(fd,d1) { illegal_1(); op_d1(); } /* DB FD */
+OP(fd,d2) { illegal_1(); op_d2(); } /* DB FD */
+OP(fd,d3) { illegal_1(); op_d3(); } /* DB FD */
+OP(fd,d4) { illegal_1(); op_d4(); } /* DB FD */
+OP(fd,d5) { illegal_1(); op_d5(); } /* DB FD */
+OP(fd,d6) { illegal_1(); op_d6(); } /* DB FD */
+OP(fd,d7) { illegal_1(); op_d7(); } /* DB FD */
+
+OP(fd,d8) { illegal_1(); op_d8(); } /* DB FD */
+OP(fd,d9) { illegal_1(); op_d9(); } /* DB FD */
+OP(fd,da) { illegal_1(); op_da(); } /* DB FD */
+OP(fd,db) { illegal_1(); op_db(); } /* DB FD */
+OP(fd,dc) { illegal_1(); op_dc(); } /* DB FD */
+OP(fd,dd) { illegal_1(); op_dd(); } /* DB FD */
+OP(fd,de) { illegal_1(); op_de(); } /* DB FD */
+OP(fd,df) { illegal_1(); op_df(); } /* DB FD */
+
+OP(fd,e0) { illegal_1(); op_e0(); } /* DB FD */
+OP(fd,e1) { pop(m_iy); } /* POP IY */
+OP(fd,e2) { illegal_1(); op_e2(); } /* DB FD */
+OP(fd,e3) { ex_sp(m_iy); } /* EX (SP),IY */
+OP(fd,e4) { illegal_1(); op_e4(); } /* DB FD */
+OP(fd,e5) { push(m_iy); } /* PUSH IY */
+OP(fd,e6) { illegal_1(); op_e6(); } /* DB FD */
+OP(fd,e7) { illegal_1(); op_e7(); } /* DB FD */
+
+OP(fd,e8) { illegal_1(); op_e8(); } /* DB FD */
+OP(fd,e9) { PC = IY; } /* JP (IY) */
+OP(fd,ea) { illegal_1(); op_ea(); } /* DB FD */
+OP(fd,eb) { illegal_1(); op_eb(); } /* DB FD */
+OP(fd,ec) { illegal_1(); op_ec(); } /* DB FD */
+OP(fd,ed) { illegal_1(); op_ed(); } /* DB FD */
+OP(fd,ee) { illegal_1(); op_ee(); } /* DB FD */
+OP(fd,ef) { illegal_1(); op_ef(); } /* DB FD */
+
+OP(fd,f0) { illegal_1(); op_f0(); } /* DB FD */
+OP(fd,f1) { illegal_1(); op_f1(); } /* DB FD */
+OP(fd,f2) { illegal_1(); op_f2(); } /* DB FD */
+OP(fd,f3) { illegal_1(); op_f3(); } /* DB FD */
+OP(fd,f4) { illegal_1(); op_f4(); } /* DB FD */
+OP(fd,f5) { illegal_1(); op_f5(); } /* DB FD */
+OP(fd,f6) { illegal_1(); op_f6(); } /* DB FD */
+OP(fd,f7) { illegal_1(); op_f7(); } /* DB FD */
+
+OP(fd,f8) { illegal_1(); op_f8(); } /* DB FD */
+OP(fd,f9) { nomreq_ir(2); SP = IY; } /* LD SP,IY */
+OP(fd,fa) { illegal_1(); op_fa(); } /* DB FD */
+OP(fd,fb) { illegal_1(); op_fb(); } /* DB FD */
+OP(fd,fc) { illegal_1(); op_fc(); } /* DB FD */
+OP(fd,fd) { illegal_1(); op_fd(); } /* DB FD */
+OP(fd,fe) { illegal_1(); op_fe(); } /* DB FD */
+OP(fd,ff) { illegal_1(); op_ff(); } /* DB FD */
+
+OP(illegal,2)
+{
+ logerror("Z80 ill. opcode $ed $%02x\n",
+ m_opcodes.read_byte(translate_memory_address((PCD-1)&0xffff)));
+}
/**********************************************************
* special opcodes (ED prefix)
**********************************************************/
-/* DB ED */ OP(ED,00) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,01) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,02) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,03) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,04) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,05) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,06) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,07) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,08) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,09) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,0f) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,10) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,11) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,12) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,13) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,14) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,15) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,16) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,17) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,18) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,19) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,1f) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,20) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,21) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,22) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,23) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,24) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,25) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,26) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,27) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,28) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,29) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,2f) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,30) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,31) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,32) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,33) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,34) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,35) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,36) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,37) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,38) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,39) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,3f) THEN illegal_2(); ENDOP
-
-/* IN B,(C) */ OP(ED,40) THEN TADR=BC; CALL in(); THEN B = TDAT8; set_f((F & CF) | SZP[B]); WZ = TADR + 1; ENDOP
-/* OUT (C),B */ OP(ED,41) THEN TADR=BC; TDAT8=B; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* SBC HL,BC */ OP(ED,42) THEN TDAT=BC; CALL sbc_hl(); ENDOP
-/* LD (w),BC */ OP(ED,43) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=BC; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,44) THEN neg(); ENDOP
-/* RETN */ OP(ED,45) CALL retn(); ENDOP
-/* IM 0 */ OP(ED,46) THEN m_im = 0; ENDOP
-/* LD i,A */ OP(ED,47) CALL ld_i_a(); ENDOP
-
-/* IN C,(C) */ OP(ED,48) THEN TADR=BC; CALL in(); THEN C = TDAT8; set_f((F & CF) | SZP[C]); WZ = TADR + 1;ENDOP
-/* OUT (C),C */ OP(ED,49) THEN TADR=BC; TDAT8=C; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* ADC HL,BC */ OP(ED,4a) THEN TDAT=BC; CALL adc_hl(); ENDOP
-/* LD BC,(w) */ OP(ED,4b) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN BC=TDAT; WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,4c) THEN neg(); ENDOP
-/* RETI */ OP(ED,4d) CALL reti(); ENDOP
-/* IM 0 */ OP(ED,4e) THEN m_im = 0; ENDOP
-/* LD r,A */ OP(ED,4f) CALL ld_r_a(); ENDOP
-
-/* IN D,(C) */ OP(ED,50) THEN TADR=BC; CALL in(); THEN D = TDAT8; set_f((F & CF) | SZP[D]); WZ = TADR + 1; ENDOP
-/* OUT (C),D */ OP(ED,51) THEN TADR=BC; TDAT8=D; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* SBC HL,DE */ OP(ED,52) THEN TDAT=DE; CALL sbc_hl(); ENDOP
-/* LD (w),DE */ OP(ED,53) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=DE; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,54) THEN neg(); ENDOP
-/* RETN */ OP(ED,55) CALL retn(); ENDOP
-/* IM 1 */ OP(ED,56) THEN m_im = 1; ENDOP
-/* LD A,i */ OP(ED,57) CALL ld_a_i(); ENDOP
-
-/* IN E,(C) */ OP(ED,58) THEN TADR=BC; CALL in(); THEN E = TDAT8; set_f((F & CF) | SZP[E]); WZ = TADR + 1; ENDOP
-/* OUT (C),E */ OP(ED,59) THEN TADR=BC; TDAT8=E; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* ADC HL,DE */ OP(ED,5a) THEN TDAT=DE; CALL adc_hl(); ENDOP
-/* LD DE,(w) */ OP(ED,5b) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN DE=TDAT; WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,5c) THEN neg(); ENDOP
-/* RETI */ OP(ED,5d) CALL reti(); ENDOP
-/* IM 2 */ OP(ED,5e) THEN m_im = 2; ENDOP
-/* LD A,r */ OP(ED,5f) CALL ld_a_r(); ENDOP
-
-/* IN H,(C) */ OP(ED,60) THEN TADR=BC; CALL in(); THEN H = TDAT8; set_f((F & CF) | SZP[H]); WZ = TADR + 1; ENDOP
-/* OUT (C),H */ OP(ED,61) THEN TADR=BC; TDAT8=H; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* SBC HL,HL */ OP(ED,62) THEN TDAT=HL; CALL sbc_hl(); ENDOP
-/* LD (w),HL */ OP(ED,63) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=HL; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,64) THEN neg(); ENDOP
-/* RETN */ OP(ED,65) CALL retn(); ENDOP
-/* IM 0 */ OP(ED,66) THEN m_im = 0; ENDOP
-/* RRD (HL) */ OP(ED,67) CALL rrd(); ENDOP
-
-/* IN L,(C) */ OP(ED,68) THEN TADR=BC; CALL in(); THEN L = TDAT8; set_f((F & CF) | SZP[L]); WZ = TADR + 1; ENDOP
-/* OUT (C),L */ OP(ED,69) THEN TADR=BC; TDAT8=L; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* ADC HL,HL */ OP(ED,6a) THEN TDAT=HL; CALL adc_hl(); ENDOP
-/* LD HL,(w) */ OP(ED,6b) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN HL=TDAT; WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,6c) THEN neg(); ENDOP
-/* RETI */ OP(ED,6d) CALL reti(); ENDOP
-/* IM 0 */ OP(ED,6e) THEN m_im = 0; ENDOP
-/* RLD (HL) */ OP(ED,6f) CALL rld(); ENDOP
-
-/* IN 0,(C) */ OP(ED,70) THEN TADR=BC; CALL in(); THEN set_f((F & CF) | SZP[TDAT8]); WZ = TADR + 1; ENDOP
-/* OUT (C),0 */ OP(ED,71) THEN TADR=BC; TDAT8=0; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* SBC HL,SP */ OP(ED,72) THEN TDAT=SP; CALL sbc_hl(); ENDOP
-/* LD (w),SP */ OP(ED,73) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT=SP; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,74) THEN neg(); ENDOP
-/* RETN */ OP(ED,75) CALL retn(); ENDOP
-/* IM 1 */ OP(ED,76) THEN m_im = 1; ENDOP
-/* DB ED,77 */ OP(ED,77) THEN illegal_2(); ENDOP
-
-/* IN A,(C) */ OP(ED,78) THEN TADR=BC; CALL in(); THEN A = TDAT8; set_f((F & CF) | SZP[A]); WZ = TADR + 1; ENDOP
-/* OUT (C),A */ OP(ED,79) THEN TADR=BC; TDAT8=A; CALL out(); THEN WZ = TADR + 1; ENDOP
-/* ADC HL,SP */ OP(ED,7a) THEN TDAT=SP; CALL adc_hl(); ENDOP
-/* LD SP,(w) */ OP(ED,7b) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; CALL rm16(); THEN SP=TDAT; WZ = m_ea + 1; ENDOP
-/* NEG */ OP(ED,7c) THEN neg(); ENDOP
-/* RETI */ OP(ED,7d) CALL reti(); ENDOP
-/* IM 2 */ OP(ED,7e) THEN m_im = 2; ENDOP
-/* DB ED,7F */ OP(ED,7f) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,80) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,81) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,82) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,83) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,84) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,85) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,86) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,87) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,88) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,89) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,8f) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,90) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,91) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,92) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,93) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,94) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,95) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,96) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,97) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,98) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,99) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9a) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9b) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9c) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9d) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9e) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,9f) THEN illegal_2(); ENDOP
-
-/* LDI */ OP(ED,a0) CALL ldi(); ENDOP
-/* CPI */ OP(ED,a1) CALL cpi(); ENDOP
-/* INI */ OP(ED,a2) CALL ini(); ENDOP
-/* OUTI */ OP(ED,a3) CALL outi(); ENDOP
-/* DB ED */ OP(ED,a4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,a5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,a6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,a7) THEN illegal_2(); ENDOP
-
-/* LDD */ OP(ED,a8) CALL ldd(); ENDOP
-/* CPD */ OP(ED,a9) CALL cpd(); ENDOP
-/* IND */ OP(ED,aa) CALL ind(); ENDOP
-/* OUTD */ OP(ED,ab) CALL outd(); ENDOP
-/* DB ED */ OP(ED,ac) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ad) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ae) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,af) THEN illegal_2(); ENDOP
-
-/* LDIR */ OP(ED,b0) CALL ldir(); ENDOP
-/* CPIR */ OP(ED,b1) CALL cpir(); ENDOP
-/* INIR */ OP(ED,b2) CALL inir(); ENDOP
-/* OTIR */ OP(ED,b3) CALL otir(); ENDOP
-/* DB ED */ OP(ED,b4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,b5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,b6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,b7) THEN illegal_2(); ENDOP
-
-/* LDDR */ OP(ED,b8) CALL lddr(); ENDOP
-/* CPDR */ OP(ED,b9) CALL cpdr(); ENDOP
-/* INDR */ OP(ED,ba) CALL indr(); ENDOP
-/* OTDR */ OP(ED,bb) CALL otdr(); ENDOP
-/* DB ED */ OP(ED,bc) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,bd) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,be) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,bf) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,c0) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c1) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c2) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c3) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c7) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,c8) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,c9) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ca) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,cb) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,cc) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,cd) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ce) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,cf) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,d0) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d1) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d2) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d3) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d7) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,d8) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,d9) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,da) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,db) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,dc) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,dd) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,de) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,df) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,e0) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e1) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e2) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e3) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e7) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,e8) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,e9) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ea) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,eb) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ec) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ed) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ee) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ef) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,f0) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f1) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f2) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f3) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f4) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f5) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f6) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f7) THEN illegal_2(); ENDOP
-
-/* DB ED */ OP(ED,f8) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,f9) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,fa) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,fb) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,fc) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,fd) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,fe) THEN illegal_2(); ENDOP
-/* DB ED */ OP(ED,ff) THEN illegal_2(); ENDOP
+OP(ed,00) { illegal_2(); } /* DB ED */
+OP(ed,01) { illegal_2(); } /* DB ED */
+OP(ed,02) { illegal_2(); } /* DB ED */
+OP(ed,03) { illegal_2(); } /* DB ED */
+OP(ed,04) { illegal_2(); } /* DB ED */
+OP(ed,05) { illegal_2(); } /* DB ED */
+OP(ed,06) { illegal_2(); } /* DB ED */
+OP(ed,07) { illegal_2(); } /* DB ED */
+
+OP(ed,08) { illegal_2(); } /* DB ED */
+OP(ed,09) { illegal_2(); } /* DB ED */
+OP(ed,0a) { illegal_2(); } /* DB ED */
+OP(ed,0b) { illegal_2(); } /* DB ED */
+OP(ed,0c) { illegal_2(); } /* DB ED */
+OP(ed,0d) { illegal_2(); } /* DB ED */
+OP(ed,0e) { illegal_2(); } /* DB ED */
+OP(ed,0f) { illegal_2(); } /* DB ED */
+
+OP(ed,10) { illegal_2(); } /* DB ED */
+OP(ed,11) { illegal_2(); } /* DB ED */
+OP(ed,12) { illegal_2(); } /* DB ED */
+OP(ed,13) { illegal_2(); } /* DB ED */
+OP(ed,14) { illegal_2(); } /* DB ED */
+OP(ed,15) { illegal_2(); } /* DB ED */
+OP(ed,16) { illegal_2(); } /* DB ED */
+OP(ed,17) { illegal_2(); } /* DB ED */
+
+OP(ed,18) { illegal_2(); } /* DB ED */
+OP(ed,19) { illegal_2(); } /* DB ED */
+OP(ed,1a) { illegal_2(); } /* DB ED */
+OP(ed,1b) { illegal_2(); } /* DB ED */
+OP(ed,1c) { illegal_2(); } /* DB ED */
+OP(ed,1d) { illegal_2(); } /* DB ED */
+OP(ed,1e) { illegal_2(); } /* DB ED */
+OP(ed,1f) { illegal_2(); } /* DB ED */
+
+OP(ed,20) { illegal_2(); } /* DB ED */
+OP(ed,21) { illegal_2(); } /* DB ED */
+OP(ed,22) { illegal_2(); } /* DB ED */
+OP(ed,23) { illegal_2(); } /* DB ED */
+OP(ed,24) { illegal_2(); } /* DB ED */
+OP(ed,25) { illegal_2(); } /* DB ED */
+OP(ed,26) { illegal_2(); } /* DB ED */
+OP(ed,27) { illegal_2(); } /* DB ED */
+
+OP(ed,28) { illegal_2(); } /* DB ED */
+OP(ed,29) { illegal_2(); } /* DB ED */
+OP(ed,2a) { illegal_2(); } /* DB ED */
+OP(ed,2b) { illegal_2(); } /* DB ED */
+OP(ed,2c) { illegal_2(); } /* DB ED */
+OP(ed,2d) { illegal_2(); } /* DB ED */
+OP(ed,2e) { illegal_2(); } /* DB ED */
+OP(ed,2f) { illegal_2(); } /* DB ED */
+
+OP(ed,30) { illegal_2(); } /* DB ED */
+OP(ed,31) { illegal_2(); } /* DB ED */
+OP(ed,32) { illegal_2(); } /* DB ED */
+OP(ed,33) { illegal_2(); } /* DB ED */
+OP(ed,34) { illegal_2(); } /* DB ED */
+OP(ed,35) { illegal_2(); } /* DB ED */
+OP(ed,36) { illegal_2(); } /* DB ED */
+OP(ed,37) { illegal_2(); } /* DB ED */
+
+OP(ed,38) { illegal_2(); } /* DB ED */
+OP(ed,39) { illegal_2(); } /* DB ED */
+OP(ed,3a) { illegal_2(); } /* DB ED */
+OP(ed,3b) { illegal_2(); } /* DB ED */
+OP(ed,3c) { illegal_2(); } /* DB ED */
+OP(ed,3d) { illegal_2(); } /* DB ED */
+OP(ed,3e) { illegal_2(); } /* DB ED */
+OP(ed,3f) { illegal_2(); } /* DB ED */
+
+OP(ed,40) { B = in(BC); F = (F & CF) | SZP[B]; WZ = BC + 1; } /* IN B,(C) */
+OP(ed,41) { out(BC, B); WZ = BC + 1; } /* OUT (C),B */
+OP(ed,42) { sbc_hl(m_bc); } /* SBC HL,BC */
+OP(ed,43) { m_ea = arg16(); wm16(m_ea, m_bc); WZ = m_ea + 1; } /* LD (w),BC */
+OP(ed,44) { neg(); } /* NEG */
+OP(ed,45) { retn(); } /* RETN */
+OP(ed,46) { m_im = 0; } /* IM 0 */
+OP(ed,47) { ld_i_a(); } /* LD i,A */
+
+OP(ed,48) { C = in(BC); F = (F & CF) | SZP[C]; WZ = BC + 1; } /* IN C,(C) */
+OP(ed,49) { out(BC, C); WZ = BC + 1; } /* OUT (C),C */
+OP(ed,4a) { adc_hl(m_bc); } /* ADC HL,BC */
+OP(ed,4b) { m_ea = arg16(); rm16(m_ea, m_bc); WZ = m_ea + 1; } /* LD BC,(w) */
+OP(ed,4c) { neg(); } /* NEG */
+OP(ed,4d) { reti(); } /* RETI */
+OP(ed,4e) { m_im = 0; } /* IM 0 */
+OP(ed,4f) { ld_r_a(); } /* LD r,A */
+
+OP(ed,50) { D = in(BC); F = (F & CF) | SZP[D]; WZ = BC + 1; } /* IN D,(C) */
+OP(ed,51) { out(BC, D); WZ = BC + 1; } /* OUT (C),D */
+OP(ed,52) { sbc_hl(m_de); } /* SBC HL,DE */
+OP(ed,53) { m_ea = arg16(); wm16(m_ea, m_de); WZ = m_ea + 1; } /* LD (w),DE */
+OP(ed,54) { neg(); } /* NEG */
+OP(ed,55) { retn(); } /* RETN */
+OP(ed,56) { m_im = 1; } /* IM 1 */
+OP(ed,57) { ld_a_i(); } /* LD A,i */
+
+OP(ed,58) { E = in(BC); F = (F & CF) | SZP[E]; WZ = BC + 1; } /* IN E,(C) */
+OP(ed,59) { out(BC, E); WZ = BC + 1; } /* OUT (C),E */
+OP(ed,5a) { adc_hl(m_de); } /* ADC HL,DE */
+OP(ed,5b) { m_ea = arg16(); rm16(m_ea, m_de); WZ = m_ea + 1; } /* LD DE,(w) */
+OP(ed,5c) { neg(); } /* NEG */
+OP(ed,5d) { reti(); } /* RETI */
+OP(ed,5e) { m_im = 2; } /* IM 2 */
+OP(ed,5f) { ld_a_r(); } /* LD A,r */
+
+OP(ed,60) { H = in(BC); F = (F & CF) | SZP[H]; WZ = BC + 1; } /* IN H,(C) */
+OP(ed,61) { out(BC, H); WZ = BC + 1; } /* OUT (C),H */
+OP(ed,62) { sbc_hl(m_hl); } /* SBC HL,HL */
+OP(ed,63) { m_ea = arg16(); wm16(m_ea, m_hl); WZ = m_ea + 1; } /* LD (w),HL */
+OP(ed,64) { neg(); } /* NEG */
+OP(ed,65) { retn(); } /* RETN */
+OP(ed,66) { m_im = 0; } /* IM 0 */
+OP(ed,67) { rrd(); } /* RRD (HL) */
+
+OP(ed,68) { L = in(BC); F = (F & CF) | SZP[L]; WZ = BC + 1; } /* IN L,(C) */
+OP(ed,69) { out(BC, L); WZ = BC + 1; } /* OUT (C),L */
+OP(ed,6a) { adc_hl(m_hl); } /* ADC HL,HL */
+OP(ed,6b) { m_ea = arg16(); rm16(m_ea, m_hl); WZ = m_ea + 1; } /* LD HL,(w) */
+OP(ed,6c) { neg(); } /* NEG */
+OP(ed,6d) { reti(); } /* RETI */
+OP(ed,6e) { m_im = 0; } /* IM 0 */
+OP(ed,6f) { rld(); } /* RLD (HL) */
+
+OP(ed,70) { u8 res = in(BC); F = (F & CF) | SZP[res]; WZ = BC + 1; } /* IN 0,(C) */
+OP(ed,71) { out(BC, 0); WZ = BC + 1; } /* OUT (C),0 */
+OP(ed,72) { sbc_hl(m_sp); } /* SBC HL,SP */
+OP(ed,73) { m_ea = arg16(); wm16(m_ea, m_sp); WZ = m_ea + 1; } /* LD (w),SP */
+OP(ed,74) { neg(); } /* NEG */
+OP(ed,75) { retn(); } /* RETN */
+OP(ed,76) { m_im = 1; } /* IM 1 */
+OP(ed,77) { illegal_2(); } /* DB ED,77 */
+
+OP(ed,78) { A = in(BC); F = (F & CF) | SZP[A]; WZ = BC + 1; } /* IN A,(C) */
+OP(ed,79) { out(BC, A); WZ = BC + 1; } /* OUT (C),A */
+OP(ed,7a) { adc_hl(m_sp); } /* ADC HL,SP */
+OP(ed,7b) { m_ea = arg16(); rm16(m_ea, m_sp); WZ = m_ea + 1; } /* LD SP,(w) */
+OP(ed,7c) { neg(); } /* NEG */
+OP(ed,7d) { reti(); } /* RETI */
+OP(ed,7e) { m_im = 2; } /* IM 2 */
+OP(ed,7f) { illegal_2(); } /* DB ED,7F */
+
+OP(ed,80) { illegal_2(); } /* DB ED */
+OP(ed,81) { illegal_2(); } /* DB ED */
+OP(ed,82) { illegal_2(); } /* DB ED */
+OP(ed,83) { illegal_2(); } /* DB ED */
+OP(ed,84) { illegal_2(); } /* DB ED */
+OP(ed,85) { illegal_2(); } /* DB ED */
+OP(ed,86) { illegal_2(); } /* DB ED */
+OP(ed,87) { illegal_2(); } /* DB ED */
+
+OP(ed,88) { illegal_2(); } /* DB ED */
+OP(ed,89) { illegal_2(); } /* DB ED */
+OP(ed,8a) { illegal_2(); } /* DB ED */
+OP(ed,8b) { illegal_2(); } /* DB ED */
+OP(ed,8c) { illegal_2(); } /* DB ED */
+OP(ed,8d) { illegal_2(); } /* DB ED */
+OP(ed,8e) { illegal_2(); } /* DB ED */
+OP(ed,8f) { illegal_2(); } /* DB ED */
+
+OP(ed,90) { illegal_2(); } /* DB ED */
+OP(ed,91) { illegal_2(); } /* DB ED */
+OP(ed,92) { illegal_2(); } /* DB ED */
+OP(ed,93) { illegal_2(); } /* DB ED */
+OP(ed,94) { illegal_2(); } /* DB ED */
+OP(ed,95) { illegal_2(); } /* DB ED */
+OP(ed,96) { illegal_2(); } /* DB ED */
+OP(ed,97) { illegal_2(); } /* DB ED */
+
+OP(ed,98) { illegal_2(); } /* DB ED */
+OP(ed,99) { illegal_2(); } /* DB ED */
+OP(ed,9a) { illegal_2(); } /* DB ED */
+OP(ed,9b) { illegal_2(); } /* DB ED */
+OP(ed,9c) { illegal_2(); } /* DB ED */
+OP(ed,9d) { illegal_2(); } /* DB ED */
+OP(ed,9e) { illegal_2(); } /* DB ED */
+OP(ed,9f) { illegal_2(); } /* DB ED */
+
+OP(ed,a0) { ldi(); } /* LDI */
+OP(ed,a1) { cpi(); } /* CPI */
+OP(ed,a2) { ini(); } /* INI */
+OP(ed,a3) { outi(); } /* OUTI */
+OP(ed,a4) { illegal_2(); } /* DB ED */
+OP(ed,a5) { illegal_2(); } /* DB ED */
+OP(ed,a6) { illegal_2(); } /* DB ED */
+OP(ed,a7) { illegal_2(); } /* DB ED */
+
+OP(ed,a8) { ldd(); } /* LDD */
+OP(ed,a9) { cpd(); } /* CPD */
+OP(ed,aa) { ind(); } /* IND */
+OP(ed,ab) { outd(); } /* OUTD */
+OP(ed,ac) { illegal_2(); } /* DB ED */
+OP(ed,ad) { illegal_2(); } /* DB ED */
+OP(ed,ae) { illegal_2(); } /* DB ED */
+OP(ed,af) { illegal_2(); } /* DB ED */
+
+OP(ed,b0) { ldir(); } /* LDIR */
+OP(ed,b1) { cpir(); } /* CPIR */
+OP(ed,b2) { inir(); } /* INIR */
+OP(ed,b3) { otir(); } /* OTIR */
+OP(ed,b4) { illegal_2(); } /* DB ED */
+OP(ed,b5) { illegal_2(); } /* DB ED */
+OP(ed,b6) { illegal_2(); } /* DB ED */
+OP(ed,b7) { illegal_2(); } /* DB ED */
+
+OP(ed,b8) { lddr(); } /* LDDR */
+OP(ed,b9) { cpdr(); } /* CPDR */
+OP(ed,ba) { indr(); } /* INDR */
+OP(ed,bb) { otdr(); } /* OTDR */
+OP(ed,bc) { illegal_2(); } /* DB ED */
+OP(ed,bd) { illegal_2(); } /* DB ED */
+OP(ed,be) { illegal_2(); } /* DB ED */
+OP(ed,bf) { illegal_2(); } /* DB ED */
+
+OP(ed,c0) { illegal_2(); } /* DB ED */
+OP(ed,c1) { illegal_2(); } /* DB ED */
+OP(ed,c2) { illegal_2(); } /* DB ED */
+OP(ed,c3) { illegal_2(); } /* DB ED */
+OP(ed,c4) { illegal_2(); } /* DB ED */
+OP(ed,c5) { illegal_2(); } /* DB ED */
+OP(ed,c6) { illegal_2(); } /* DB ED */
+OP(ed,c7) { illegal_2(); } /* DB ED */
+
+OP(ed,c8) { illegal_2(); } /* DB ED */
+OP(ed,c9) { illegal_2(); } /* DB ED */
+OP(ed,ca) { illegal_2(); } /* DB ED */
+OP(ed,cb) { illegal_2(); } /* DB ED */
+OP(ed,cc) { illegal_2(); } /* DB ED */
+OP(ed,cd) { illegal_2(); } /* DB ED */
+OP(ed,ce) { illegal_2(); } /* DB ED */
+OP(ed,cf) { illegal_2(); } /* DB ED */
+
+OP(ed,d0) { illegal_2(); } /* DB ED */
+OP(ed,d1) { illegal_2(); } /* DB ED */
+OP(ed,d2) { illegal_2(); } /* DB ED */
+OP(ed,d3) { illegal_2(); } /* DB ED */
+OP(ed,d4) { illegal_2(); } /* DB ED */
+OP(ed,d5) { illegal_2(); } /* DB ED */
+OP(ed,d6) { illegal_2(); } /* DB ED */
+OP(ed,d7) { illegal_2(); } /* DB ED */
+
+OP(ed,d8) { illegal_2(); } /* DB ED */
+OP(ed,d9) { illegal_2(); } /* DB ED */
+OP(ed,da) { illegal_2(); } /* DB ED */
+OP(ed,db) { illegal_2(); } /* DB ED */
+OP(ed,dc) { illegal_2(); } /* DB ED */
+OP(ed,dd) { illegal_2(); } /* DB ED */
+OP(ed,de) { illegal_2(); } /* DB ED */
+OP(ed,df) { illegal_2(); } /* DB ED */
+
+OP(ed,e0) { illegal_2(); } /* DB ED */
+OP(ed,e1) { illegal_2(); } /* DB ED */
+OP(ed,e2) { illegal_2(); } /* DB ED */
+OP(ed,e3) { illegal_2(); } /* DB ED */
+OP(ed,e4) { illegal_2(); } /* DB ED */
+OP(ed,e5) { illegal_2(); } /* DB ED */
+OP(ed,e6) { illegal_2(); } /* DB ED */
+OP(ed,e7) { illegal_2(); } /* DB ED */
+
+OP(ed,e8) { illegal_2(); } /* DB ED */
+OP(ed,e9) { illegal_2(); } /* DB ED */
+OP(ed,ea) { illegal_2(); } /* DB ED */
+OP(ed,eb) { illegal_2(); } /* DB ED */
+OP(ed,ec) { illegal_2(); } /* DB ED */
+OP(ed,ed) { illegal_2(); } /* DB ED */
+OP(ed,ee) { illegal_2(); } /* DB ED */
+OP(ed,ef) { illegal_2(); } /* DB ED */
+
+OP(ed,f0) { illegal_2(); } /* DB ED */
+OP(ed,f1) { illegal_2(); } /* DB ED */
+OP(ed,f2) { illegal_2(); } /* DB ED */
+OP(ed,f3) { illegal_2(); } /* DB ED */
+OP(ed,f4) { illegal_2(); } /* DB ED */
+OP(ed,f5) { illegal_2(); } /* DB ED */
+OP(ed,f6) { illegal_2(); } /* DB ED */
+OP(ed,f7) { illegal_2(); } /* DB ED */
+
+OP(ed,f8) { illegal_2(); } /* DB ED */
+OP(ed,f9) { illegal_2(); } /* DB ED */
+OP(ed,fa) { illegal_2(); } /* DB ED */
+OP(ed,fb) { illegal_2(); } /* DB ED */
+OP(ed,fc) { illegal_2(); } /* DB ED */
+OP(ed,fd) { illegal_2(); } /* DB ED */
+OP(ed,fe) { illegal_2(); } /* DB ED */
+OP(ed,ff) { illegal_2(); } /* DB ED */
+
/**********************************************************
* main opcodes
**********************************************************/
-/* NOP */ OP(NONE,00) ENDOP
-/* LD BC,w */ OP(NONE,01) CALL arg16(); THEN BC = TDAT; ENDOP
-/* LD (BC),A */ OP(NONE,02) THEN TADR=BC; TDAT8=A; CALL wm(); THEN WZ_L = (BC + 1) & 0xFF; WZ_H = A; ENDOP
-/* INC BC */ OP(NONE,03) CALL nomreq_ir(2); THEN BC++; ENDOP
-/* INC B */ OP(NONE,04) THEN inc(B); ENDOP
-/* DEC B */ OP(NONE,05) THEN dec(B); ENDOP
-/* LD B,n */ OP(NONE,06) CALL arg(); THEN B = TDAT8; ENDOP
-/* RLCA */ OP(NONE,07) THEN rlca(); ENDOP
-
-/* EX AF,AF' */ OP(NONE,08) THEN std::swap(m_af, m_af2);
-; ENDOP
-/* ADD HL,BC */ OP(NONE,09) THEN TDAT=HL; TDAT2=BC; CALL add16(); THEN HL=TDAT; ENDOP
-/* LD A,(BC) */ OP(NONE,0a) THEN TADR=BC; CALL rm(); THEN A=TDAT8; WZ=BC+1; ENDOP
-/* DEC BC */ OP(NONE,0b) CALL nomreq_ir(2); THEN BC--; ENDOP
-/* INC C */ OP(NONE,0c) THEN inc(C); ENDOP
-/* DEC C */ OP(NONE,0d) THEN dec(C); ENDOP
-/* LD C,n */ OP(NONE,0e) CALL arg(); THEN C = TDAT8; ENDOP
-/* RRCA */ OP(NONE,0f) THEN rrca(); ENDOP
-
-/* DJNZ o */ OP(NONE,10) CALL nomreq_ir(1); THEN TDAT8=--B; CALL jr_cond(0x10); ENDOP
-/* LD DE,w */ OP(NONE,11) CALL arg16(); THEN DE = TDAT; ENDOP
-/* LD (DE),A */ OP(NONE,12) THEN TADR=DE; TDAT8=A; CALL wm(); THEN WZ_L = (DE + 1) & 0xFF; WZ_H = A; ENDOP
-/* INC DE */ OP(NONE,13) CALL nomreq_ir(2); THEN DE++; ENDOP
-/* INC D */ OP(NONE,14) THEN inc(D); ENDOP
-/* DEC D */ OP(NONE,15) THEN dec(D); ENDOP
-/* LD D,n */ OP(NONE,16) CALL arg(); THEN D=TDAT8; ENDOP
-/* RLA */ OP(NONE,17) THEN rla(); ENDOP
-
-/* JR o */ OP(NONE,18) CALL jr(); ENDOP
-/* ADD HL,DE */ OP(NONE,19) THEN TDAT=HL; TDAT2=DE; CALL add16(); THEN HL=TDAT; ENDOP
-/* LD A,(DE) */ OP(NONE,1a) THEN TADR=DE; CALL rm(); THEN A=TDAT8; WZ = DE + 1; ENDOP
-/* DEC DE */ OP(NONE,1b) CALL nomreq_ir(2); THEN DE--; ENDOP
-/* INC E */ OP(NONE,1c) THEN inc(E); ENDOP
-/* DEC E */ OP(NONE,1d) THEN dec(E); ENDOP
-/* LD E,n */ OP(NONE,1e) CALL arg(); THEN E=TDAT8; ENDOP
-/* RRA */ OP(NONE,1f) THEN rra(); ENDOP
-
-/* JR NZ,o */ OP(NONE,20) THEN TDAT8=!(F & ZF); CALL jr_cond(0x20); ENDOP
-/* LD HL,w */ OP(NONE,21) CALL arg16(); THEN HL = TDAT; ENDOP
-/* LD (w),HL */ OP(NONE,22) CALL arg16(); THEN m_ea=TDAT; TADR=TDAT; TDAT=HL; CALL wm16(); THEN WZ = m_ea + 1; ENDOP
-/* INC HL */ OP(NONE,23) CALL nomreq_ir(2); THEN HL++; ENDOP
-/* INC H */ OP(NONE,24) THEN inc(H); ENDOP
-/* DEC H */ OP(NONE,25) THEN dec(H); ENDOP
-/* LD H,n */ OP(NONE,26) CALL arg(); THEN H=TDAT8; ENDOP
-/* DAA */ OP(NONE,27) THEN daa(); ENDOP
-
-/* JR Z,o */ OP(NONE,28) THEN TDAT8=F & ZF; CALL jr_cond(0x28); ENDOP
-/* ADD HL,HL */ OP(NONE,29) THEN TDAT=HL; TDAT2=HL; CALL add16(); THEN HL=TDAT; ENDOP
-/* LD HL,(w) */ OP(NONE,2a) CALL arg16(); THEN m_ea=TDAT; TADR=TDAT; CALL rm16(); THEN HL=TDAT; WZ = m_ea + 1; ENDOP
-/* DEC HL */ OP(NONE,2b) CALL nomreq_ir(2); THEN HL--; ENDOP
-/* INC L */ OP(NONE,2c) THEN inc(L); ENDOP
-/* DEC L */ OP(NONE,2d) THEN dec(L); ENDOP
-/* LD L,n */ OP(NONE,2e) CALL arg(); THEN L=TDAT8; ENDOP
-/* CPL */ OP(NONE,2f) THEN A ^= 0xff; set_f((F & (SF | ZF | PF | CF)) | HF | NF | (A & (YF | XF))); ENDOP
-
-/* JR NC,o */ OP(NONE,30) THEN TDAT8=!(F & CF); CALL jr_cond(0x30); ENDOP
-/* LD SP,w */ OP(NONE,31) CALL arg16(); THEN SP = TDAT; ENDOP
-/* LD (w),A */ OP(NONE,32) CALL arg16(); THEN m_ea=TDAT; TADR=m_ea; TDAT8=A; CALL wm(); THEN WZ_L = (m_ea + 1) & 0xFF; WZ_H = A; ENDOP
-/* INC SP */ OP(NONE,33) CALL nomreq_ir(2); THEN SP++; ENDOP
-/* INC (HL) */ OP(NONE,34) THEN TADR=HL; CALL rm_reg(); THEN inc(TDAT8); CALL wm(); ENDOP
-/* DEC (HL) */ OP(NONE,35) THEN TADR=HL; CALL rm_reg(); THEN dec(TDAT8); CALL wm(); ENDOP
-/* LD (HL),n */ OP(NONE,36) CALL arg(); THEN TADR=HL; CALL wm(); ENDOP
-/* SCF */ OP(NONE,37) THEN set_f((F & (SF | ZF | PF)) | CF | (((F & Q) | A) & (YF | XF))); ENDOP
-
-/* JR C,o */ OP(NONE,38) THEN TDAT8=F & CF; CALL jr_cond(0x38); ENDOP
-/* ADD HL,SP */ OP(NONE,39) THEN TDAT=HL; TDAT2=SP; CALL add16(); THEN HL=TDAT; ENDOP
-/* LD A,(w) */ OP(NONE,3a) CALL arg16(); THEN m_ea=TDAT; TADR=TDAT; CALL rm(); THEN A=TDAT8; WZ = m_ea + 1; ENDOP
-/* DEC SP */ OP(NONE,3b) CALL nomreq_ir(2); THEN SP--; ENDOP
-/* INC A */ OP(NONE,3c) THEN inc(A); ENDOP
-/* DEC A */ OP(NONE,3d) THEN dec(A); ENDOP
-/* LD A,n */ OP(NONE,3e) CALL arg(); THEN A = TDAT8; ENDOP
-/* CCF */ OP(NONE,3f) THEN set_f(((F & (SF | ZF | PF | CF)) ^ CF) | ((F & CF) << 4) | (((F & Q) | A) & (YF | XF))); ENDOP
-
-/* LD B,B */ OP(NONE,40) ENDOP
-/* LD B,C */ OP(NONE,41) THEN B = C; ENDOP
-/* LD B,D */ OP(NONE,42) THEN B = D; ENDOP
-/* LD B,E */ OP(NONE,43) THEN B = E; ENDOP
-/* LD B,H */ OP(NONE,44) THEN B = H; ENDOP
-/* LD B,L */ OP(NONE,45) THEN B = L; ENDOP
-/* LD B,(HL) */ OP(NONE,46) THEN TADR=HL; CALL rm(); THEN B = TDAT8; ENDOP
-/* LD B,A */ OP(NONE,47) THEN B = A; ENDOP
-
-/* LD C,B */ OP(NONE,48) THEN C = B; ENDOP
-/* LD C,C */ OP(NONE,49) ENDOP
-/* LD C,D */ OP(NONE,4a) THEN C = D; ENDOP
-/* LD C,E */ OP(NONE,4b) THEN C = E; ENDOP
-/* LD C,H */ OP(NONE,4c) THEN C = H; ENDOP
-/* LD C,L */ OP(NONE,4d) THEN C = L; ENDOP
-/* LD C,(HL) */ OP(NONE,4e) THEN TADR=HL; CALL rm(); THEN C = TDAT8; ENDOP
-/* LD C,A */ OP(NONE,4f) THEN C = A; ENDOP
-
-/* LD D,B */ OP(NONE,50) THEN D = B; ENDOP
-/* LD D,C */ OP(NONE,51) THEN D = C; ENDOP
-/* LD D,D */ OP(NONE,52) ENDOP
-/* LD D,E */ OP(NONE,53) THEN D = E; ENDOP
-/* LD D,H */ OP(NONE,54) THEN D = H; ENDOP
-/* LD D,L */ OP(NONE,55) THEN D = L; ENDOP
-/* LD D,(HL) */ OP(NONE,56) THEN TADR=HL; CALL rm(); THEN D = TDAT8; ENDOP
-/* LD D,A */ OP(NONE,57) THEN D = A; ENDOP
-
-/* LD E,B */ OP(NONE,58) THEN E = B; ENDOP
-/* LD E,C */ OP(NONE,59) THEN E = C; ENDOP
-/* LD E,D */ OP(NONE,5a) THEN E = D; ENDOP
-/* LD E,E */ OP(NONE,5b) ENDOP
-/* LD E,H */ OP(NONE,5c) THEN E = H; ENDOP
-/* LD E,L */ OP(NONE,5d) THEN E = L; ENDOP
-/* LD E,(HL) */ OP(NONE,5e) THEN TADR=HL; CALL rm(); THEN E = TDAT8; ENDOP
-/* LD E,A */ OP(NONE,5f) THEN E = A; ENDOP
-
-/* LD H,B */ OP(NONE,60) THEN H = B; ENDOP
-/* LD H,C */ OP(NONE,61) THEN H = C; ENDOP
-/* LD H,D */ OP(NONE,62) THEN H = D; ENDOP
-/* LD H,E */ OP(NONE,63) THEN H = E; ENDOP
-/* LD H,H */ OP(NONE,64) ENDOP
-/* LD H,L */ OP(NONE,65) THEN H = L; ENDOP
-/* LD H,(HL) */ OP(NONE,66) THEN TADR=HL; CALL rm(); THEN H = TDAT8; ENDOP
-/* LD H,A */ OP(NONE,67) THEN H = A; ENDOP
-
-/* LD L,B */ OP(NONE,68) THEN L = B; ENDOP
-/* LD L,C */ OP(NONE,69) THEN L = C; ENDOP
-/* LD L,D */ OP(NONE,6a) THEN L = D; ENDOP
-/* LD L,E */ OP(NONE,6b) THEN L = E; ENDOP
-/* LD L,H */ OP(NONE,6c) THEN L = H; ENDOP
-/* LD L,L */ OP(NONE,6d) ENDOP
-/* LD L,(HL) */ OP(NONE,6e) THEN TADR=HL; CALL rm(); THEN L = TDAT8; ENDOP
-/* LD L,A */ OP(NONE,6f) THEN L = A; ENDOP
-
-/* LD (HL),B */ OP(NONE,70) THEN TADR=HL; TDAT=B; CALL wm(); ENDOP
-/* LD (HL),C */ OP(NONE,71) THEN TADR=HL; TDAT=C; CALL wm(); ENDOP
-/* LD (HL),D */ OP(NONE,72) THEN TADR=HL; TDAT=D; CALL wm(); ENDOP
-/* LD (HL),E */ OP(NONE,73) THEN TADR=HL; TDAT=E; CALL wm(); ENDOP
-/* LD (HL),H */ OP(NONE,74) THEN TADR=HL; TDAT=H; CALL wm(); ENDOP
-/* LD (HL),L */ OP(NONE,75) THEN TADR=HL; TDAT=L; CALL wm(); ENDOP
-/* HALT */ OP(NONE,76) THEN halt(); ENDOP
-/* LD (HL),A */ OP(NONE,77) THEN TADR=HL; TDAT=A; CALL wm(); ENDOP
-
-/* LD A,B */ OP(NONE,78) THEN A = B; ENDOP
-/* LD A,C */ OP(NONE,79) THEN A = C; ENDOP
-/* LD A,D */ OP(NONE,7a) THEN A = D; ENDOP
-/* LD A,E */ OP(NONE,7b) THEN A = E; ENDOP
-/* LD A,H */ OP(NONE,7c) THEN A = H; ENDOP
-/* LD A,L */ OP(NONE,7d) THEN A = L; ENDOP
-/* LD A,(HL) */ OP(NONE,7e) THEN TADR=HL; CALL rm(); THEN A = TDAT8; ENDOP
-/* LD A,A */ OP(NONE,7f) ENDOP
-
-/* ADD A,B */ OP(NONE,80) THEN add_a(B); ENDOP
-/* ADD A,C */ OP(NONE,81) THEN add_a(C); ENDOP
-/* ADD A,D */ OP(NONE,82) THEN add_a(D); ENDOP
-/* ADD A,E */ OP(NONE,83) THEN add_a(E); ENDOP
-/* ADD A,H */ OP(NONE,84) THEN add_a(H); ENDOP
-/* ADD A,L */ OP(NONE,85) THEN add_a(L); ENDOP
-/* ADD A,(HL) */ OP(NONE,86) THEN TADR=HL; CALL rm(); THEN add_a(TDAT8); ENDOP
-/* ADD A,A */ OP(NONE,87) THEN add_a(A); ENDOP
-
-/* ADC A,B */ OP(NONE,88) THEN adc_a(B); ENDOP
-/* ADC A,C */ OP(NONE,89) THEN adc_a(C); ENDOP
-/* ADC A,D */ OP(NONE,8a) THEN adc_a(D); ENDOP
-/* ADC A,E */ OP(NONE,8b) THEN adc_a(E); ENDOP
-/* ADC A,H */ OP(NONE,8c) THEN adc_a(H); ENDOP
-/* ADC A,L */ OP(NONE,8d) THEN adc_a(L); ENDOP
-/* ADC A,(HL) */ OP(NONE,8e) THEN TADR=HL; CALL rm(); THEN adc_a(TDAT8); ENDOP
-/* ADC A,A */ OP(NONE,8f) THEN adc_a(A); ENDOP
-
-/* SUB B */ OP(NONE,90) THEN sub(B); ENDOP
-/* SUB C */ OP(NONE,91) THEN sub(C); ENDOP
-/* SUB D */ OP(NONE,92) THEN sub(D); ENDOP
-/* SUB E */ OP(NONE,93) THEN sub(E); ENDOP
-/* SUB H */ OP(NONE,94) THEN sub(H); ENDOP
-/* SUB L */ OP(NONE,95) THEN sub(L); ENDOP
-/* SUB (HL) */ OP(NONE,96) THEN TADR=HL; CALL rm(); THEN sub(TDAT8); ENDOP
-/* SUB A */ OP(NONE,97) THEN sub(A); ENDOP
-
-/* SBC A,B */ OP(NONE,98) THEN sbc_a(B); ENDOP
-/* SBC A,C */ OP(NONE,99) THEN sbc_a(C); ENDOP
-/* SBC A,D */ OP(NONE,9a) THEN sbc_a(D); ENDOP
-/* SBC A,E */ OP(NONE,9b) THEN sbc_a(E); ENDOP
-/* SBC A,H */ OP(NONE,9c) THEN sbc_a(H); ENDOP
-/* SBC A,L */ OP(NONE,9d) THEN sbc_a(L); ENDOP
-/* SBC A,(HL) */ OP(NONE,9e) THEN TADR=HL; CALL rm(); THEN sbc_a(TDAT8); ENDOP
-/* SBC A,A */ OP(NONE,9f) THEN sbc_a(A); ENDOP
-
-/* AND B */ OP(NONE,a0) THEN and_a(B); ENDOP
-/* AND C */ OP(NONE,a1) THEN and_a(C); ENDOP
-/* AND D */ OP(NONE,a2) THEN and_a(D); ENDOP
-/* AND E */ OP(NONE,a3) THEN and_a(E); ENDOP
-/* AND H */ OP(NONE,a4) THEN and_a(H); ENDOP
-/* AND L */ OP(NONE,a5) THEN and_a(L); ENDOP
-/* AND (HL) */ OP(NONE,a6) THEN TADR=HL; CALL rm(); THEN and_a(TDAT8); ENDOP
-/* AND A */ OP(NONE,a7) THEN and_a(A); ENDOP
-
-/* XOR B */ OP(NONE,a8) THEN xor_a(B); ENDOP
-/* XOR C */ OP(NONE,a9) THEN xor_a(C); ENDOP
-/* XOR D */ OP(NONE,aa) THEN xor_a(D); ENDOP
-/* XOR E */ OP(NONE,ab) THEN xor_a(E); ENDOP
-/* XOR H */ OP(NONE,ac) THEN xor_a(H); ENDOP
-/* XOR L */ OP(NONE,ad) THEN xor_a(L); ENDOP
-/* XOR (HL) */ OP(NONE,ae) THEN TADR=HL; CALL rm(); THEN xor_a(TDAT8); ENDOP
-/* XOR A */ OP(NONE,af) THEN xor_a(A); ENDOP
-
-/* OR B */ OP(NONE,b0) THEN or_a(B); ENDOP
-/* OR C */ OP(NONE,b1) THEN or_a(C); ENDOP
-/* OR D */ OP(NONE,b2) THEN or_a(D); ENDOP
-/* OR E */ OP(NONE,b3) THEN or_a(E); ENDOP
-/* OR H */ OP(NONE,b4) THEN or_a(H); ENDOP
-/* OR L */ OP(NONE,b5) THEN or_a(L); ENDOP
-/* OR (HL) */ OP(NONE,b6) THEN TADR=HL; CALL rm(); THEN or_a(TDAT8); ENDOP
-/* OR A */ OP(NONE,b7) THEN or_a(A); ENDOP
-
-/* CP B */ OP(NONE,b8) THEN cp(B); ENDOP
-/* CP C */ OP(NONE,b9) THEN cp(C); ENDOP
-/* CP D */ OP(NONE,ba) THEN cp(D); ENDOP
-/* CP E */ OP(NONE,bb) THEN cp(E); ENDOP
-/* CP H */ OP(NONE,bc) THEN cp(H); ENDOP
-/* CP L */ OP(NONE,bd) THEN cp(L); ENDOP
-/* CP (HL) */ OP(NONE,be) THEN TADR=HL; CALL rm(); THEN cp(TDAT8); ENDOP
-/* CP A */ OP(NONE,bf) THEN cp(A); ENDOP
-
-/* RET NZ */ OP(NONE,c0) THEN TDAT8=!(F & ZF); CALL ret_cond(0xc0); ENDOP
-/* POP BC */ OP(NONE,c1) CALL pop(); THEN BC=TDAT; ENDOP
-/* JP NZ,a */ OP(NONE,c2) THEN TDAT8=!(F & ZF); CALL jp_cond(); ENDOP
-/* JP a */ OP(NONE,c3) CALL jp(); ENDOP
-/* CALL NZ,a */ OP(NONE,c4) THEN TDAT8=!(F & ZF); CALL call_cond(0xc4); ENDOP
-/* PUSH BC */ OP(NONE,c5) THEN TDAT=BC; CALL push(); ENDOP
-/* ADD A,n */ OP(NONE,c6) CALL arg(); THEN add_a(TDAT8); ENDOP
-/* RST 0 */ OP(NONE,c7) CALL rst(0x00); ENDOP
-
-/* RET Z */ OP(NONE,c8) THEN TDAT8=(F & ZF); CALL ret_cond(0xc8); ENDOP
-/* RET */ OP(NONE,c9) CALL pop(); THEN PC=TDAT; WZ = PCD; ENDOP
-/* JP Z,a */ OP(NONE,ca) THEN TDAT8=F & ZF; CALL jp_cond(); ENDOP
-/* **** CB xx */ OP(NONE,cb) CALL rop(); THENJP(CB)
-/* CALL Z,a */ OP(NONE,cc) THEN TDAT8=F & ZF; CALL call_cond(0xcc); ENDOP
-/* CALL a */ OP(NONE,cd) CALL call(); ENDOP
-/* ADC A,n */ OP(NONE,ce) CALL arg(); THEN adc_a(TDAT8); ENDOP
-/* RST 1 */ OP(NONE,cf) CALL rst(0x08); ENDOP
-
-/* RET NC */ OP(NONE,d0) THEN TDAT8=!(F & CF); CALL ret_cond(0xd0); ENDOP
-/* POP DE */ OP(NONE,d1) CALL pop(); THEN DE=TDAT; ENDOP
-/* JP NC,a */ OP(NONE,d2) THEN TDAT8=!(F & CF); CALL jp_cond(); ENDOP
-/* OUT (n),A */ OP(NONE,d3) CALL arg(); THEN TADR = TDAT8 | (A << 8); TDAT=A; CALL out(); THEN WZ_L = ((TADR & 0xff) + 1) & 0xff; WZ_H = A; ENDOP
-/* CALL NC,a */ OP(NONE,d4) THEN TDAT8=!(F & CF); CALL call_cond(0xd4); ENDOP
-/* PUSH DE */ OP(NONE,d5) THEN TDAT=DE; CALL push(); ENDOP
-/* SUB n */ OP(NONE,d6) CALL arg(); THEN sub(TDAT8); ENDOP
-/* RST 2 */ OP(NONE,d7) CALL rst(0x10); ENDOP
-
-/* RET C */ OP(NONE,d8) THEN TDAT8=(F & CF); CALL ret_cond(0xd8); ENDOP
-/* EXX */ OP(NONE,d9) THEN exx(); ENDOP
-/* JP C,a */ OP(NONE,da) THEN TDAT8=F & CF; CALL jp_cond(); ENDOP
-/* IN A,(n) */ OP(NONE,db) CALL arg(); THEN TADR = TDAT8 | (A << 8); CALL in(); THEN A = TDAT8; WZ = TADR + 1; ENDOP
-/* CALL C,a */ OP(NONE,dc) THEN TDAT8=F & CF; CALL call_cond(0xdc); ENDOP
-/* **** DD xx */ OP(NONE,dd) CALL rop(); THENJP(DD)
-/* SBC A,n */ OP(NONE,de) CALL arg(); THEN sbc_a(TDAT8); ENDOP
-/* RST 3 */ OP(NONE,df) CALL rst(0x18); ENDOP
-
-/* RET PO */ OP(NONE,e0) THEN TDAT8=!(F & PF); CALL ret_cond(0xe0); ENDOP
-/* POP HL */ OP(NONE,e1) CALL pop(); THEN HL=TDAT; ENDOP
-/* JP PO,a */ OP(NONE,e2) THEN TDAT8=!(F & PF); CALL jp_cond(); ENDOP
-/* EX HL,(SP) */ OP(NONE,e3) THEN TDAT=HL; CALL ex_sp(); THEN HL=TDAT; ENDOP
-/* CALL PO,a */ OP(NONE,e4) THEN TDAT8=!(F & PF); CALL call_cond(0xe4); ENDOP
-/* PUSH HL */ OP(NONE,e5) THEN TDAT=HL; CALL push(); ENDOP
-/* AND n */ OP(NONE,e6) CALL arg(); THEN and_a(TDAT8); ENDOP
-/* RST 4 */ OP(NONE,e7) CALL rst(0x20); ENDOP
-
-/* RET PE */ OP(NONE,e8) THEN TDAT8=(F & PF); CALL ret_cond(0xe8); ENDOP
-/* JP (HL) */ OP(NONE,e9) THEN PC = HL; ENDOP
-/* JP PE,a */ OP(NONE,ea) THEN TDAT8=F & PF; CALL jp_cond(); ENDOP
-/* EX DE,HL */ OP(NONE,eb) THEN std::swap(DE, HL); ENDOP
-/* CALL PE,a */ OP(NONE,ec) THEN TDAT8=F & PF; CALL call_cond(0xec); ENDOP
-/* **** ED xx */ OP(NONE,ed) CALL rop(); THENJP(ED)
-/* XOR n */ OP(NONE,ee) CALL arg(); THEN xor_a(TDAT8); ENDOP
-/* RST 5 */ OP(NONE,ef) CALL rst(0x28); ENDOP
-
-/* RET P */ OP(NONE,f0) THEN TDAT8=!(F & SF); CALL ret_cond(0xf0); ENDOP
-/* POP AF */ OP(NONE,f1) CALL pop(); THEN AF=TDAT; ENDOP
-/* JP P,a */ OP(NONE,f2) THEN TDAT8=!(F & SF); CALL jp_cond(); ENDOP
-/* DI */ OP(NONE,f3) THEN m_iff1 = m_iff2 = 0; ENDOP
-/* CALL P,a */ OP(NONE,f4) THEN TDAT8=!(F & SF); CALL call_cond(0xf4); ENDOP
-/* PUSH AF */ OP(NONE,f5) THEN TDAT=AF; CALL push(); ENDOP
-/* OR n */ OP(NONE,f6) CALL arg(); THEN or_a(TDAT8); ENDOP
-/* RST 6 */ OP(NONE,f7) CALL rst(0x30); ENDOP
-
-/* RET M */ OP(NONE,f8) THEN TDAT8=(F & SF); CALL ret_cond(0xf8); ENDOP
-/* LD SP,HL */ OP(NONE,f9) CALL nomreq_ir(2); THEN SP = HL; ENDOP
-/* JP M,a */ OP(NONE,fa) THEN TDAT8=F & SF; CALL jp_cond(); ENDOP
-/* EI */ OP(NONE,fb) THEN ei(); ENDOP
-/* CALL M,a */ OP(NONE,fc) THEN TDAT8=F & SF; CALL call_cond(0xfc); ENDOP
-/* **** FD xx */ OP(NONE,fd) CALL rop(); THENJP(FD)
-/* CP n */ OP(NONE,fe) CALL arg(); THEN cp(TDAT8); ENDOP
-/* RST 7 */ OP(NONE,ff) CALL rst(0x38); ENDOP
-
-} // end: init_op_steps()
+OP(op,00) { } /* NOP */
+OP(op,01) { BC = arg16(); } /* LD BC,w */
+OP(op,02) { wm(BC,A); WZ_L = (BC + 1) & 0xFF; WZ_H = A; } /* LD (BC),A */
+OP(op,03) { nomreq_ir(2); BC++; } /* INC BC */
+OP(op,04) { B = inc(B); } /* INC B */
+OP(op,05) { B = dec(B); } /* DEC B */
+OP(op,06) { B = arg(); } /* LD B,n */
+OP(op,07) { rlca(); } /* RLCA */
+
+OP(op,08) { ex_af(); } /* EX AF,AF' */
+OP(op,09) { add16(m_hl, m_bc); } /* ADD HL,BC */
+OP(op,0a) { A = rm(BC); WZ=BC+1; } /* LD A,(BC) */
+OP(op,0b) { nomreq_ir(2); BC--; } /* DEC BC */
+OP(op,0c) { C = inc(C); } /* INC C */
+OP(op,0d) { C = dec(C); } /* DEC C */
+OP(op,0e) { C = arg(); } /* LD C,n */
+OP(op,0f) { rrca(); } /* RRCA */
+
+OP(op,10) { nomreq_ir(1); B--; jr_cond(B, 0x10); } /* DJNZ o */
+OP(op,11) { DE = arg16(); } /* LD DE,w */
+OP(op,12) { wm(DE,A); WZ_L = (DE + 1) & 0xFF; WZ_H = A; } /* LD (DE),A */
+OP(op,13) { nomreq_ir(2); DE++; } /* INC DE */
+OP(op,14) { D = inc(D); } /* INC D */
+OP(op,15) { D = dec(D); } /* DEC D */
+OP(op,16) { D = arg(); } /* LD D,n */
+OP(op,17) { rla(); } /* RLA */
+
+OP(op,18) { jr(); } /* JR o */
+OP(op,19) { add16(m_hl, m_de); } /* ADD HL,DE */
+OP(op,1a) { A = rm(DE); WZ = DE + 1; } /* LD A,(DE) */
+OP(op,1b) { nomreq_ir(2); DE--; } /* DEC DE */
+OP(op,1c) { E = inc(E); } /* INC E */
+OP(op,1d) { E = dec(E); } /* DEC E */
+OP(op,1e) { E = arg(); } /* LD E,n */
+OP(op,1f) { rra(); } /* RRA */
+
+OP(op,20) { jr_cond(!(F & ZF), 0x20); } /* JR NZ,o */
+OP(op,21) { HL = arg16(); } /* LD HL,w */
+OP(op,22) { m_ea = arg16(); wm16(m_ea, m_hl); WZ = m_ea + 1; } /* LD (w),HL */
+OP(op,23) { nomreq_ir(2); HL++; } /* INC HL */
+OP(op,24) { H = inc(H); } /* INC H */
+OP(op,25) { H = dec(H); } /* DEC H */
+OP(op,26) { H = arg(); } /* LD H,n */
+OP(op,27) { daa(); } /* DAA */
+
+OP(op,28) { jr_cond(F & ZF, 0x28); } /* JR Z,o */
+OP(op,29) { add16(m_hl, m_hl); } /* ADD HL,HL */
+OP(op,2a) { m_ea = arg16(); rm16(m_ea, m_hl); WZ = m_ea + 1; } /* LD HL,(w) */
+OP(op,2b) { nomreq_ir(2); HL--; } /* DEC HL */
+OP(op,2c) { L = inc(L); } /* INC L */
+OP(op,2d) { L = dec(L); } /* DEC L */
+OP(op,2e) { L = arg(); } /* LD L,n */
+OP(op,2f) { A ^= 0xff; F = (F & (SF | ZF | PF | CF)) | HF | NF | (A & (YF | XF)); } /* CPL */
+
+OP(op,30) { jr_cond(!(F & CF), 0x30); } /* JR NC,o */
+OP(op,31) { SP = arg16(); } /* LD SP,w */
+OP(op,32) { m_ea = arg16(); wm(m_ea, A); WZ_L = (m_ea + 1) & 0xFF; WZ_H = A; } /* LD (w),A */
+OP(op,33) { nomreq_ir(2); SP++; } /* INC SP */
+OP(op,34) { wm(HL, inc(rm_reg(HL))); } /* INC (HL) */
+OP(op,35) { wm(HL, dec(rm_reg(HL))); } /* DEC (HL) */
+OP(op,36) { wm(HL, arg()); } /* LD (HL),n */
+OP(op,37) { F = (F & (SF | ZF | YF | XF | PF)) | CF | (A & (YF | XF)); } /* SCF */
+
+OP(op,38) { jr_cond(F & CF, 0x38); } /* JR C,o */
+OP(op,39) { add16(m_hl, m_sp); } /* ADD HL,SP */
+OP(op,3a) { m_ea = arg16(); A = rm(m_ea); WZ = m_ea + 1; } /* LD A,(w) */
+OP(op,3b) { nomreq_ir(2); SP--; } /* DEC SP */
+OP(op,3c) { A = inc(A); } /* INC A */
+OP(op,3d) { A = dec(A); } /* DEC A */
+OP(op,3e) { A = arg(); } /* LD A,n */
+OP(op,3f) { F = ((F&(SF|ZF|YF|XF|PF|CF))|((F&CF)<<4)|(A&(YF|XF)))^CF; } /* CCF */
+
+OP(op,40) { } /* LD B,B */
+OP(op,41) { B = C; } /* LD B,C */
+OP(op,42) { B = D; } /* LD B,D */
+OP(op,43) { B = E; } /* LD B,E */
+OP(op,44) { B = H; } /* LD B,H */
+OP(op,45) { B = L; } /* LD B,L */
+OP(op,46) { B = rm(HL); } /* LD B,(HL) */
+OP(op,47) { B = A; } /* LD B,A */
+
+OP(op,48) { C = B; } /* LD C,B */
+OP(op,49) { } /* LD C,C */
+OP(op,4a) { C = D; } /* LD C,D */
+OP(op,4b) { C = E; } /* LD C,E */
+OP(op,4c) { C = H; } /* LD C,H */
+OP(op,4d) { C = L; } /* LD C,L */
+OP(op,4e) { C = rm(HL); } /* LD C,(HL) */
+OP(op,4f) { C = A; } /* LD C,A */
+
+OP(op,50) { D = B; } /* LD D,B */
+OP(op,51) { D = C; } /* LD D,C */
+OP(op,52) { } /* LD D,D */
+OP(op,53) { D = E; } /* LD D,E */
+OP(op,54) { D = H; } /* LD D,H */
+OP(op,55) { D = L; } /* LD D,L */
+OP(op,56) { D = rm(HL); } /* LD D,(HL) */
+OP(op,57) { D = A; } /* LD D,A */
+
+OP(op,58) { E = B; } /* LD E,B */
+OP(op,59) { E = C; } /* LD E,C */
+OP(op,5a) { E = D; } /* LD E,D */
+OP(op,5b) { } /* LD E,E */
+OP(op,5c) { E = H; } /* LD E,H */
+OP(op,5d) { E = L; } /* LD E,L */
+OP(op,5e) { E = rm(HL); } /* LD E,(HL) */
+OP(op,5f) { E = A; } /* LD E,A */
+
+OP(op,60) { H = B; } /* LD H,B */
+OP(op,61) { H = C; } /* LD H,C */
+OP(op,62) { H = D; } /* LD H,D */
+OP(op,63) { H = E; } /* LD H,E */
+OP(op,64) { } /* LD H,H */
+OP(op,65) { H = L; } /* LD H,L */
+OP(op,66) { H = rm(HL); } /* LD H,(HL) */
+OP(op,67) { H = A; } /* LD H,A */
+
+OP(op,68) { L = B; } /* LD L,B */
+OP(op,69) { L = C; } /* LD L,C */
+OP(op,6a) { L = D; } /* LD L,D */
+OP(op,6b) { L = E; } /* LD L,E */
+OP(op,6c) { L = H; } /* LD L,H */
+OP(op,6d) { } /* LD L,L */
+OP(op,6e) { L = rm(HL); } /* LD L,(HL) */
+OP(op,6f) { L = A; } /* LD L,A */
+
+OP(op,70) { wm(HL, B); } /* LD (HL),B */
+OP(op,71) { wm(HL, C); } /* LD (HL),C */
+OP(op,72) { wm(HL, D); } /* LD (HL),D */
+OP(op,73) { wm(HL, E); } /* LD (HL),E */
+OP(op,74) { wm(HL, H); } /* LD (HL),H */
+OP(op,75) { wm(HL, L); } /* LD (HL),L */
+OP(op,76) { halt(); } /* HALT */
+OP(op,77) { wm(HL, A); } /* LD (HL),A */
+
+OP(op,78) { A = B; } /* LD A,B */
+OP(op,79) { A = C; } /* LD A,C */
+OP(op,7a) { A = D; } /* LD A,D */
+OP(op,7b) { A = E; } /* LD A,E */
+OP(op,7c) { A = H; } /* LD A,H */
+OP(op,7d) { A = L; } /* LD A,L */
+OP(op,7e) { A = rm(HL); } /* LD A,(HL) */
+OP(op,7f) { } /* LD A,A */
+
+OP(op,80) { add_a(B); } /* ADD A,B */
+OP(op,81) { add_a(C); } /* ADD A,C */
+OP(op,82) { add_a(D); } /* ADD A,D */
+OP(op,83) { add_a(E); } /* ADD A,E */
+OP(op,84) { add_a(H); } /* ADD A,H */
+OP(op,85) { add_a(L); } /* ADD A,L */
+OP(op,86) { add_a(rm(HL)); } /* ADD A,(HL) */
+OP(op,87) { add_a(A); } /* ADD A,A */
+
+OP(op,88) { adc_a(B); } /* ADC A,B */
+OP(op,89) { adc_a(C); } /* ADC A,C */
+OP(op,8a) { adc_a(D); } /* ADC A,D */
+OP(op,8b) { adc_a(E); } /* ADC A,E */
+OP(op,8c) { adc_a(H); } /* ADC A,H */
+OP(op,8d) { adc_a(L); } /* ADC A,L */
+OP(op,8e) { adc_a(rm(HL)); } /* ADC A,(HL) */
+OP(op,8f) { adc_a(A); } /* ADC A,A */
+
+OP(op,90) { sub(B); } /* SUB B */
+OP(op,91) { sub(C); } /* SUB C */
+OP(op,92) { sub(D); } /* SUB D */
+OP(op,93) { sub(E); } /* SUB E */
+OP(op,94) { sub(H); } /* SUB H */
+OP(op,95) { sub(L); } /* SUB L */
+OP(op,96) { sub(rm(HL)); } /* SUB (HL) */
+OP(op,97) { sub(A); } /* SUB A */
+
+OP(op,98) { sbc_a(B); } /* SBC A,B */
+OP(op,99) { sbc_a(C); } /* SBC A,C */
+OP(op,9a) { sbc_a(D); } /* SBC A,D */
+OP(op,9b) { sbc_a(E); } /* SBC A,E */
+OP(op,9c) { sbc_a(H); } /* SBC A,H */
+OP(op,9d) { sbc_a(L); } /* SBC A,L */
+OP(op,9e) { sbc_a(rm(HL)); } /* SBC A,(HL) */
+OP(op,9f) { sbc_a(A); } /* SBC A,A */
+
+OP(op,a0) { and_a(B); } /* AND B */
+OP(op,a1) { and_a(C); } /* AND C */
+OP(op,a2) { and_a(D); } /* AND D */
+OP(op,a3) { and_a(E); } /* AND E */
+OP(op,a4) { and_a(H); } /* AND H */
+OP(op,a5) { and_a(L); } /* AND L */
+OP(op,a6) { and_a(rm(HL)); } /* AND (HL) */
+OP(op,a7) { and_a(A); } /* AND A */
+
+OP(op,a8) { xor_a(B); } /* XOR B */
+OP(op,a9) { xor_a(C); } /* XOR C */
+OP(op,aa) { xor_a(D); } /* XOR D */
+OP(op,ab) { xor_a(E); } /* XOR E */
+OP(op,ac) { xor_a(H); } /* XOR H */
+OP(op,ad) { xor_a(L); } /* XOR L */
+OP(op,ae) { xor_a(rm(HL)); } /* XOR (HL) */
+OP(op,af) { xor_a(A); } /* XOR A */
+
+OP(op,b0) { or_a(B); } /* OR B */
+OP(op,b1) { or_a(C); } /* OR C */
+OP(op,b2) { or_a(D); } /* OR D */
+OP(op,b3) { or_a(E); } /* OR E */
+OP(op,b4) { or_a(H); } /* OR H */
+OP(op,b5) { or_a(L); } /* OR L */
+OP(op,b6) { or_a(rm(HL)); } /* OR (HL) */
+OP(op,b7) { or_a(A); } /* OR A */
+
+OP(op,b8) { cp(B); } /* CP B */
+OP(op,b9) { cp(C); } /* CP C */
+OP(op,ba) { cp(D); } /* CP D */
+OP(op,bb) { cp(E); } /* CP E */
+OP(op,bc) { cp(H); } /* CP H */
+OP(op,bd) { cp(L); } /* CP L */
+OP(op,be) { cp(rm(HL)); } /* CP (HL) */
+OP(op,bf) { cp(A); } /* CP A */
+
+OP(op,c0) { ret_cond(!(F & ZF), 0xc0); } /* RET NZ */
+OP(op,c1) { pop(m_bc); } /* POP BC */
+OP(op,c2) { jp_cond(!(F & ZF)); } /* JP NZ,a */
+OP(op,c3) { jp(); } /* JP a */
+OP(op,c4) { call_cond(!(F & ZF), 0xc4); } /* CALL NZ,a */
+OP(op,c5) { push(m_bc); } /* PUSH BC */
+OP(op,c6) { add_a(arg()); } /* ADD A,n */
+OP(op,c7) { rst(0x00); } /* RST 0 */
+
+OP(op,c8) { ret_cond(F & ZF, 0xc8); } /* RET Z */
+OP(op,c9) { pop(m_pc); WZ = PCD; } /* RET */
+OP(op,ca) { jp_cond(F & ZF); } /* JP Z,a */
+OP(op,cb) { EXEC(cb, rop()); } /* **** CB xx */
+OP(op,cc) { call_cond(F & ZF, 0xcc); } /* CALL Z,a */
+OP(op,cd) { call(); } /* CALL a */
+OP(op,ce) { adc_a(arg()); } /* ADC A,n */
+OP(op,cf) { rst(0x08); } /* RST 1 */
+
+OP(op,d0) { ret_cond(!(F & CF), 0xd0); } /* RET NC */
+OP(op,d1) { pop(m_de); } /* POP DE */
+OP(op,d2) { jp_cond(!(F & CF)); } /* JP NC,a */
+OP(op,d3) { unsigned n = arg() | (A << 8); out(n, A); WZ_L = ((n & 0xff) + 1) & 0xff; WZ_H = A; } /* OUT (n),A */
+OP(op,d4) { call_cond(!(F & CF), 0xd4); } /* CALL NC,a */
+OP(op,d5) { push(m_de); } /* PUSH DE */
+OP(op,d6) { sub(arg()); } /* SUB n */
+OP(op,d7) { rst(0x10); } /* RST 2 */
+
+OP(op,d8) { ret_cond(F & CF, 0xd8); } /* RET C */
+OP(op,d9) { exx(); } /* EXX */
+OP(op,da) { jp_cond(F & CF); } /* JP C,a */
+OP(op,db) { unsigned n = arg() | (A << 8); A = in(n); WZ = n + 1; } /* IN A,(n) */
+OP(op,dc) { call_cond(F & CF, 0xdc); } /* CALL C,a */
+OP(op,dd) { EXEC(dd, rop()); } /* **** DD xx */
+OP(op,de) { sbc_a(arg()); } /* SBC A,n */
+OP(op,df) { rst(0x18); } /* RST 3 */
+
+OP(op,e0) { ret_cond(!(F & PF), 0xe0); } /* RET PO */
+OP(op,e1) { pop(m_hl); } /* POP HL */
+OP(op,e2) { jp_cond(!(F & PF)); } /* JP PO,a */
+OP(op,e3) { ex_sp(m_hl); } /* EX HL,(SP) */
+OP(op,e4) { call_cond(!(F & PF), 0xe4); } /* CALL PO,a */
+OP(op,e5) { push(m_hl); } /* PUSH HL */
+OP(op,e6) { and_a(arg()); } /* AND n */
+OP(op,e7) { rst(0x20); } /* RST 4 */
+
+OP(op,e8) { ret_cond(F & PF, 0xe8); } /* RET PE */
+OP(op,e9) { PC = HL; } /* JP (HL) */
+OP(op,ea) { jp_cond(F & PF); } /* JP PE,a */
+OP(op,eb) { ex_de_hl(); } /* EX DE,HL */
+OP(op,ec) { call_cond(F & PF, 0xec); } /* CALL PE,a */
+OP(op,ed) { EXEC(ed, rop()); } /* **** ED xx */
+OP(op,ee) { xor_a(arg()); } /* XOR n */
+OP(op,ef) { rst(0x28); } /* RST 5 */
+
+OP(op,f0) { ret_cond(!(F & SF), 0xf0); } /* RET P */
+OP(op,f1) { pop(m_af); } /* POP AF */
+OP(op,f2) { jp_cond(!(F & SF)); } /* JP P,a */
+OP(op,f3) { m_iff1 = m_iff2 = 0; } /* DI */
+OP(op,f4) { call_cond(!(F & SF), 0xf4); } /* CALL P,a */
+OP(op,f5) { push(m_af); } /* PUSH AF */
+OP(op,f6) { or_a(arg()); } /* OR n */
+OP(op,f7) { rst(0x30); } /* RST 6 */
+
+OP(op,f8) { ret_cond(F & SF, 0xf8); } /* RET M */
+OP(op,f9) { nomreq_ir(2); SP = HL; } /* LD SP,HL */
+OP(op,fa) { jp_cond(F & SF); } /* JP M,a */
+OP(op,fb) { ei(); } /* EI */
+OP(op,fc) { call_cond(F & SF, 0xfc); } /* CALL M,a */
+OP(op,fd) { EXEC(fd, rop()); } /* **** FD xx */
+OP(op,fe) { cp(arg()); } /* CP n */
+OP(op,ff) { rst(0x38); } /* RST 7 */
+
void z80_device::take_nmi()
{
@@ -3181,7 +3236,8 @@ void z80_device::take_nmi()
m_iff1 = 0;
m_r++;
- T(5);
+ m_icount_executing = 11;
+ T(m_icount_executing - MTM * 2);
wm16_sp(m_pc);
PCD = 0x0066;
WZ=PCD;
@@ -3204,10 +3260,12 @@ void z80_device::take_interrupt()
// fetch the IRQ vector
device_z80daisy_interface *intf = daisy_get_irq_device();
int irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback(0, m_pc.w.l);
- LOGINT("single INT irq_vector $%02x\n", irq_vector);
+ LOG(("Z80 single int. irq_vector $%02x\n", irq_vector));
/* 'interrupt latency' cycles */
- T(2);
+ m_icount_executing = 0;
+ CC(ex, 0xff); // 2
+ T(m_icount_executing);
/* Interrupt mode 2. Call [i:databyte] */
if( m_im == 2 )
@@ -3216,19 +3274,23 @@ void z80_device::take_interrupt()
// However, experiments have confirmed that IM 2 vectors do not have to be
// even, and all 8 bits will be used; even $FF is handled normally.
/* CALL opcode timing */
- T(5);
+ CC(op, 0xcd); // 17+2=19
+ T(m_icount_executing - MTM * 4);
+ m_icount_executing -= MTM * 2; // save for rm16
wm16_sp(m_pc);
+ m_icount_executing += MTM * 2;
irq_vector = (irq_vector & 0xff) | (m_i << 8);
rm16(irq_vector, m_pc);
- LOGINT("IM2 [$%04x] = $%04x\n", irq_vector, PCD);
+ LOG(("Z80 IM2 [$%04x] = $%04x\n", irq_vector, PCD));
}
else
/* Interrupt mode 1. RST 38h */
if( m_im == 1 )
{
- LOGINT("'%s' IM1 $0038\n", tag());
+ LOG(("Z80 '%s' IM1 $0038\n", tag()));
/* RST $38 */
- T(5);
+ CC(op, 0xff); // 11+2=13
+ T(m_icount_executing - MTM * 2);
wm16_sp(m_pc);
PCD = 0x0038;
}
@@ -3237,7 +3299,7 @@ void z80_device::take_interrupt()
/* Interrupt mode 0. We check for CALL and JP instructions, */
/* if neither of these were found we assume a 1 byte opcode */
/* was placed on the databus */
- LOGINT("IM0 $%04x\n", irq_vector);
+ LOG(("Z80 IM0 $%04x\n", irq_vector));
/* check for nop */
if (irq_vector != 0x00)
@@ -3246,26 +3308,30 @@ void z80_device::take_interrupt()
{
case 0xcd0000: /* call */
/* CALL $xxxx cycles */
- T(11);
+ CC(op, 0xcd);
+ T(m_icount_executing - MTM * 2);
wm16_sp(m_pc);
PCD = irq_vector & 0xffff;
break;
case 0xc30000: /* jump */
/* JP $xxxx cycles */
- T(10);
+ CC(op, 0xc3);
+ T(m_icount_executing);
PCD = irq_vector & 0xffff;
break;
default: /* rst (or other opcodes?) */
if (irq_vector == 0xfb)
{
// EI
- T(4);
+ CC(op, 0xfb);
+ T(m_icount_executing);
ei();
}
else if ((irq_vector & 0xc7) == 0xc7)
{
/* RST $xx cycles */
- T(5);
+ CC(op, 0xff);
+ T(m_icount_executing - MTM * 2);
wm16_sp(m_pc);
PCD = irq_vector & 0x0038;
}
@@ -3283,21 +3349,18 @@ void z80_device::take_interrupt()
#endif
}
-DEF( nomreq_ir(s8 cycles) )
- THEN
- TADR = (m_i << 8) | (m_r2 & 0x80) | (m_r & 0x7f);
- CALL nomreq_addr(cycles);
-ENDDEF
+void z80_device::nomreq_ir(s8 cycles)
+{
+ nomreq_addr((m_i << 8) | (m_r2 & 0x80) | (m_r & 0x7f), cycles);
+}
-z80_device::ops_type z80_device::nomreq_addr(s8 cycles)
+void z80_device::nomreq_addr(u16 addr, s8 cycles)
{
- ops_type steps;
- while(cycles--) {
- steps.push_back([&]() { m_nomreq_cb(TADR, 0x00, 0xff); });
- steps.push_back([&]() { T(1); });
+ for (; cycles; cycles--)
+ {
+ m_nomreq_cb(addr, 0x00, 0xff);
+ T(1);
}
-
- return steps;
}
void nsc800_device::take_interrupt_nsc800()
@@ -3309,7 +3372,11 @@ void nsc800_device::take_interrupt_nsc800()
m_iff1 = m_iff2 = 0;
/* 'interrupt latency' cycles */
- T(7);
+ m_icount_executing = 0;
+ CC(op, 0xff);
+ CC(ex, 0xff); //2
+
+ T(m_icount_executing - MTM * 2);
if (m_nsc800_irq_state[NSC800_RSTA])
{
wm16_sp(m_pc);
@@ -3325,10 +3392,7 @@ void nsc800_device::take_interrupt_nsc800()
wm16_sp(m_pc);
PCD = 0x002c;
}
- else
- {
- T(2 * m_memrq_cycles);
- }
+ T(m_icount_executing);
WZ=PCD;
@@ -3341,15 +3405,14 @@ void nsc800_device::take_interrupt_nsc800()
/****************************************************************************
* Processor initialization
****************************************************************************/
-ALLOW_SAVE_TYPE(z80_device::op_prefix);
void z80_device::device_start()
{
if( !tables_initialised )
{
- u8 *padd = &SZHVC_add[ 0*256];
- u8 *padc = &SZHVC_add[256*256];
- u8 *psub = &SZHVC_sub[ 0*256];
- u8 *psbc = &SZHVC_sub[256*256];
+ uint8_t *padd = &SZHVC_add[ 0*256];
+ uint8_t *padc = &SZHVC_add[256*256];
+ uint8_t *psub = &SZHVC_sub[ 0*256];
+ uint8_t *psbc = &SZHVC_sub[256*256];
for (int oldval = 0; oldval < 256; oldval++)
{
for (int newval = 0; newval < 256; newval++)
@@ -3418,11 +3481,6 @@ void z80_device::device_start()
tables_initialised = true;
}
- init_op_steps();
-
- save_item(NAME(m_cycle));
- save_item(NAME(m_prefix));
- save_item(NAME(m_opcode));
save_item(NAME(m_prvpc.w.l));
save_item(NAME(PC));
@@ -3440,8 +3498,6 @@ void z80_device::device_start()
save_item(NAME(m_hl2.w.l));
save_item(NAME(m_r));
save_item(NAME(m_r2));
- save_item(NAME(m_q));
- save_item(NAME(m_qtemp));
save_item(NAME(m_iff1));
save_item(NAME(m_iff2));
save_item(NAME(m_halt));
@@ -3454,9 +3510,6 @@ void z80_device::device_start()
save_item(NAME(m_busrq_state));
save_item(NAME(m_after_ei));
save_item(NAME(m_after_ldair));
- save_item(NAME(m_m_shared_addr.w));
- save_item(NAME(m_m_shared_data.w));
- save_item(NAME(m_m_shared_data2.w));
/* Reset registers to their initial values */
PRVPC = 0;
@@ -3494,8 +3547,8 @@ void z80_device::device_start()
space(AS_PROGRAM).specific(m_data);
space(AS_IO).specific(m_io);
- IX = IY = 0xffff; // IX and IY are FFFF after a reset!
- set_f(ZF); // Zero flag is set
+ IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
+ F = ZF; /* Zero flag is set */
/* set up the state table */
state_add(STATE_GENPC, "PC", m_pc.w.l).callimport();
@@ -3529,6 +3582,15 @@ void z80_device::device_start()
// set our instruction counter
set_icountptr(m_icount);
+ m_icount_executing = 0;
+
+ /* setup cycle tables */
+ m_cc_op = cc_op;
+ m_cc_cb = cc_cb;
+ m_cc_ed = cc_ed;
+ m_cc_xy = cc_xy;
+ m_cc_xycb = cc_xycb;
+ m_cc_ex = cc_ex;
}
void nsc800_device::device_start()
@@ -3545,10 +3607,6 @@ void z80_device::device_reset()
{
leave_halt();
- m_cycle = 0;
- m_prefix = NONE;
- m_opcode = 0;
-
PC = 0x0000;
m_i = 0;
m_r = 0;
@@ -3568,62 +3626,42 @@ void nsc800_device::device_reset()
memset(m_nsc800_irq_state, 0, sizeof(m_nsc800_irq_state));
}
-inline void z80_device::execute_cycles(u8 icount)
-{
- m_icount -= icount;
-}
-
/****************************************************************************
* Execute 'cycles' T-states.
****************************************************************************/
+
void z80_device::execute_run()
{
- while (m_icount > 0)
+ do
{
- ops_type &v = m_op_steps[m_prefix][m_opcode];
- while (m_cycle < v.size() && m_icount > 0)
+ if (m_wait_state)
{
- if (m_wait_state)
- {
- m_icount = 0; // stalled
- return;
- }
- const int icount = m_icount;
- v[m_cycle++]();
- if ((m_icount < 0) && access_to_be_redone())
- {
- m_icount = icount;
- m_cycle--;
- return;
- }
+ // stalled
+ m_icount = 0;
+ return;
}
- if(m_cycle >= v.size())
- m_cycle = 0;
- }
-}
-
-DEF( next_op() )
- THEN
// check for interrupts before each instruction
check_interrupts();
- //THEN
+ m_icount_executing = 0;
+
m_after_ei = false;
m_after_ldair = false;
PRVPC = PCD;
debugger_instruction_hook(PCD);
- CALL rop();
- THEN
- m_prefix = NONE;
- m_opcode = TDAT8;
+
+ uint8_t opcode = rop();
+
// when in HALT state, the fetched opcode is not dispatched (aka a NOP)
if (m_halt)
{
PC--;
- m_opcode = 0;
+ opcode = 0;
}
-ENDDEF
+ EXEC(op,opcode);
+ } while (m_icount > 0);
+}
void z80_device::check_interrupts()
{
@@ -3703,6 +3741,7 @@ void nsc800_device::execute_set_input(int inputnum, int state)
/**************************************************************************
* STATE IMPORT/EXPORT
**************************************************************************/
+
void z80_device::state_import( const device_state_entry &entry )
{
switch (entry.index())
@@ -3757,20 +3796,44 @@ void z80_device::state_string_export(const device_state_entry &entry, std::strin
}
}
-/**************************************************************************
- * disassemble - call the disassembly helper function
- **************************************************************************/
+//-------------------------------------------------
+// disassemble - call the disassembly
+// helper function
+//-------------------------------------------------
+
std::unique_ptr<util::disasm_interface> z80_device::create_disassembler()
{
return std::make_unique<z80_disassembler>();
}
-z80_device::z80_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) :
+
+/**************************************************************************
+ * Generic set_info
+ **************************************************************************/
+
+void z80_device::z80_set_cycle_tables(const uint8_t *op, const uint8_t *cb, const uint8_t *ed, const uint8_t *xy, const uint8_t *xycb, const uint8_t *ex)
+{
+ m_cc_op = (op != nullptr) ? op : cc_op;
+ m_cc_cb = (cb != nullptr) ? cb : cc_cb;
+ m_cc_ed = (ed != nullptr) ? ed : cc_ed;
+ m_cc_xy = (xy != nullptr) ? xy : cc_xy;
+ m_cc_xycb = (xycb != nullptr) ? xycb : cc_xycb;
+ m_cc_ex = (ex != nullptr) ? ex : cc_ex;
+}
+
+
+void z80_device::set_mtm_cycles(uint8_t mtm_cycles)
+{
+ m_mtm_cycles = mtm_cycles;
+}
+
+
+z80_device::z80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
z80_device(mconfig, Z80, tag, owner, clock)
{
}
-z80_device::z80_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) :
+z80_device::z80_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
cpu_device(mconfig, type, tag, owner, clock),
z80_daisy_chain_interface(mconfig, *this),
m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0),
@@ -3779,7 +3842,8 @@ z80_device::z80_device(const machine_config &mconfig, device_type type, const ch
m_irqack_cb(*this),
m_refresh_cb(*this),
m_nomreq_cb(*this),
- m_halt_cb(*this)
+ m_halt_cb(*this),
+ m_mtm_cycles(3)
{
}
@@ -3800,7 +3864,7 @@ device_memory_interface::space_config_vector z80_device::memory_space_config() c
DEFINE_DEVICE_TYPE(Z80, z80_device, "z80", "Zilog Z80")
-nsc800_device::nsc800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+nsc800_device::nsc800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: z80_device(mconfig, NSC800, tag, owner, clock)
{
}
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index 811a3b3f3f4..3b91032f710 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -13,7 +13,7 @@ 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_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
};
@@ -30,11 +30,10 @@ enum
class z80_device : public cpu_device, public z80_daisy_chain_interface
{
public:
- z80_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ z80_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
- void z80_set_m1_cycles(u8 m1_cycles) { m_m1_cycles = m1_cycles; }
- void z80_set_memrq_cycles(u8 memrq_cycles) { m_memrq_cycles = memrq_cycles; }
- void z80_set_iorq_cycles(u8 iorq_cycles) { m_iorq_cycles = iorq_cycles; }
+ void z80_set_cycle_tables(const uint8_t *op, const uint8_t *cb, const uint8_t *ed, const uint8_t *xy, const uint8_t *xycb, const uint8_t *ex);
+ void set_mtm_cycles(uint8_t mtm_cycles);
template <typename... T> void set_memory_map(T &&... args) { set_addrmap(AS_PROGRAM, std::forward<T>(args)...); }
template <typename... T> void set_m1_map(T &&... args) { set_addrmap(AS_OPCODES, std::forward<T>(args)...); }
template <typename... T> void set_io_map(T &&... args) { set_addrmap(AS_IO, std::forward<T>(args)...); }
@@ -44,91 +43,17 @@ public:
auto halt_cb() { return m_halt_cb.bind(); }
protected:
- using ops_type = std::vector<std::function<void()>>;
-
- enum op_prefix : u8
- {
- NONE = 0, CB, DD, ED, FD, XY_CB
- };
-
- class op_builder
- {
- public:
- op_builder (z80_device& z80) : m_z80(z80) {};
-
- ops_type get_steps() { return m_steps; }
-
- op_builder * foo(std::function<void()> step) { return this; } // discards content. needed to make macros balanced
- op_builder * add(ops_type steps)
- {
- assert(!steps.empty());
- auto to = m_if_condition == nullptr ? &m_steps : &m_if_steps;
- to->insert(to->end(), steps.begin(), steps.end());
- return this;
- }
- op_builder * add(std::function<void()> step)
- {
- auto to = m_if_condition == nullptr ? &m_steps : &m_if_steps;
- to->push_back(step);
- return this;
- }
- op_builder * call(std::function<ops_type()> steps) { return add(steps()); }
- op_builder * do_if(std::function<bool()> if_condition) { m_if_condition = if_condition; return this; }
- op_builder * do_else() { assert(!m_if_steps.empty()); m_else_at = m_if_steps.size(); return this; }
- op_builder * edo()
- {
- assert(!m_if_steps.empty());
- auto cond = m_if_condition;
- m_if_condition = nullptr;
- z80_device& z80 = m_z80;
- if (m_else_at)
- {
- auto steps = m_else_at + 1;
- add([&z80, steps, cond](){ if (!cond()) { z80.m_cycle += steps; }});
- add({m_if_steps.begin(), m_if_steps.begin() + m_else_at});
- steps = m_if_steps.size() - m_else_at;
- add([&z80, steps](){ z80.m_cycle += steps; });
- add({m_if_steps.begin() + m_else_at, m_if_steps.end()});
- m_else_at = 0;
- }
- else
- {
- auto steps = m_if_steps.size();
- add([&z80, steps, cond](){ if (!cond()) { z80.m_cycle += steps; }});
- add(m_if_steps);
- }
- m_if_steps.clear();
- return this;
- }
- ops_type jump(op_prefix prefix, u8 opcode)
- {
- z80_device& z80 = m_z80;
- add([&z80, prefix, opcode](){ z80.m_cycle = ~0; z80.m_prefix = prefix; z80.m_opcode = opcode; });
- return m_steps;
- }
- ops_type jump(u8 opcode) { return jump(NONE, opcode); }
- ops_type build() { add(m_z80.next_op()); return m_steps; }
- private:
- z80_device& m_z80;
- ops_type m_steps;
- std::function<bool()> m_if_condition = nullptr;
- ops_type m_if_steps;
- u8 m_else_at = 0;
- };
-
- z80_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
+ z80_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
- void init_op_steps();
// device_execute_interface overrides
- virtual bool cpu_is_interruptible() const override { return true; }
- virtual u32 execute_min_cycles() const noexcept override { return 2; }
- virtual u32 execute_max_cycles() const noexcept override { return 16; }
- virtual u32 execute_input_lines() const noexcept override { return 4; }
- virtual u32 execute_default_irq_vector(int inputnum) const noexcept override { return 0xff; }
+ virtual uint32_t execute_min_cycles() const noexcept override { return 2; }
+ virtual uint32_t execute_max_cycles() const noexcept override { return 16; }
+ virtual uint32_t execute_input_lines() const noexcept override { return 4; }
+ virtual uint32_t execute_default_irq_vector(int inputnum) const noexcept override { return 0xff; }
virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI; }
virtual void execute_run() override;
virtual void execute_set_input(int inputnum, int state) override;
@@ -145,112 +70,175 @@ protected:
// device_disasm_interface overrides
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
- void execute_cycles(u8 icount);
- void halt();
- void leave_halt();
-
- virtual u8 data_read(u16 addr);
- virtual void data_write(u16 addr, u8 value);
- virtual u8 opcode_read();
- virtual u8 arg_read();
-
- /* deprecated */ void rm16(u16 addr, PAIR &r);
- /* deprecated */ void wm16_sp(PAIR &r);
+#undef PROTOTYPES
+#define PROTOTYPES(prefix) \
+ void prefix##_00(); void prefix##_01(); void prefix##_02(); void prefix##_03(); \
+ void prefix##_04(); void prefix##_05(); void prefix##_06(); void prefix##_07(); \
+ void prefix##_08(); void prefix##_09(); void prefix##_0a(); void prefix##_0b(); \
+ void prefix##_0c(); void prefix##_0d(); void prefix##_0e(); void prefix##_0f(); \
+ void prefix##_10(); void prefix##_11(); void prefix##_12(); void prefix##_13(); \
+ void prefix##_14(); void prefix##_15(); void prefix##_16(); void prefix##_17(); \
+ void prefix##_18(); void prefix##_19(); void prefix##_1a(); void prefix##_1b(); \
+ void prefix##_1c(); void prefix##_1d(); void prefix##_1e(); void prefix##_1f(); \
+ void prefix##_20(); void prefix##_21(); void prefix##_22(); void prefix##_23(); \
+ void prefix##_24(); void prefix##_25(); void prefix##_26(); void prefix##_27(); \
+ void prefix##_28(); void prefix##_29(); void prefix##_2a(); void prefix##_2b(); \
+ void prefix##_2c(); void prefix##_2d(); void prefix##_2e(); void prefix##_2f(); \
+ void prefix##_30(); void prefix##_31(); void prefix##_32(); void prefix##_33(); \
+ void prefix##_34(); void prefix##_35(); void prefix##_36(); void prefix##_37(); \
+ void prefix##_38(); void prefix##_39(); void prefix##_3a(); void prefix##_3b(); \
+ void prefix##_3c(); void prefix##_3d(); void prefix##_3e(); void prefix##_3f(); \
+ void prefix##_40(); void prefix##_41(); void prefix##_42(); void prefix##_43(); \
+ void prefix##_44(); void prefix##_45(); void prefix##_46(); void prefix##_47(); \
+ void prefix##_48(); void prefix##_49(); void prefix##_4a(); void prefix##_4b(); \
+ void prefix##_4c(); void prefix##_4d(); void prefix##_4e(); void prefix##_4f(); \
+ void prefix##_50(); void prefix##_51(); void prefix##_52(); void prefix##_53(); \
+ void prefix##_54(); void prefix##_55(); void prefix##_56(); void prefix##_57(); \
+ void prefix##_58(); void prefix##_59(); void prefix##_5a(); void prefix##_5b(); \
+ void prefix##_5c(); void prefix##_5d(); void prefix##_5e(); void prefix##_5f(); \
+ void prefix##_60(); void prefix##_61(); void prefix##_62(); void prefix##_63(); \
+ void prefix##_64(); void prefix##_65(); void prefix##_66(); void prefix##_67(); \
+ void prefix##_68(); void prefix##_69(); void prefix##_6a(); void prefix##_6b(); \
+ void prefix##_6c(); void prefix##_6d(); void prefix##_6e(); void prefix##_6f(); \
+ void prefix##_70(); void prefix##_71(); void prefix##_72(); void prefix##_73(); \
+ void prefix##_74(); void prefix##_75(); void prefix##_76(); void prefix##_77(); \
+ void prefix##_78(); void prefix##_79(); void prefix##_7a(); void prefix##_7b(); \
+ void prefix##_7c(); void prefix##_7d(); void prefix##_7e(); void prefix##_7f(); \
+ void prefix##_80(); void prefix##_81(); void prefix##_82(); void prefix##_83(); \
+ void prefix##_84(); void prefix##_85(); void prefix##_86(); void prefix##_87(); \
+ void prefix##_88(); void prefix##_89(); void prefix##_8a(); void prefix##_8b(); \
+ void prefix##_8c(); void prefix##_8d(); void prefix##_8e(); void prefix##_8f(); \
+ void prefix##_90(); void prefix##_91(); void prefix##_92(); void prefix##_93(); \
+ void prefix##_94(); void prefix##_95(); void prefix##_96(); void prefix##_97(); \
+ void prefix##_98(); void prefix##_99(); void prefix##_9a(); void prefix##_9b(); \
+ void prefix##_9c(); void prefix##_9d(); void prefix##_9e(); void prefix##_9f(); \
+ void prefix##_a0(); void prefix##_a1(); void prefix##_a2(); void prefix##_a3(); \
+ void prefix##_a4(); void prefix##_a5(); void prefix##_a6(); void prefix##_a7(); \
+ void prefix##_a8(); void prefix##_a9(); void prefix##_aa(); void prefix##_ab(); \
+ void prefix##_ac(); void prefix##_ad(); void prefix##_ae(); void prefix##_af(); \
+ void prefix##_b0(); void prefix##_b1(); void prefix##_b2(); void prefix##_b3(); \
+ void prefix##_b4(); void prefix##_b5(); void prefix##_b6(); void prefix##_b7(); \
+ void prefix##_b8(); void prefix##_b9(); void prefix##_ba(); void prefix##_bb(); \
+ void prefix##_bc(); void prefix##_bd(); void prefix##_be(); void prefix##_bf(); \
+ void prefix##_c0(); void prefix##_c1(); void prefix##_c2(); void prefix##_c3(); \
+ void prefix##_c4(); void prefix##_c5(); void prefix##_c6(); void prefix##_c7(); \
+ void prefix##_c8(); void prefix##_c9(); void prefix##_ca(); void prefix##_cb(); \
+ void prefix##_cc(); void prefix##_cd(); void prefix##_ce(); void prefix##_cf(); \
+ void prefix##_d0(); void prefix##_d1(); void prefix##_d2(); void prefix##_d3(); \
+ void prefix##_d4(); void prefix##_d5(); void prefix##_d6(); void prefix##_d7(); \
+ void prefix##_d8(); void prefix##_d9(); void prefix##_da(); void prefix##_db(); \
+ void prefix##_dc(); void prefix##_dd(); void prefix##_de(); void prefix##_df(); \
+ void prefix##_e0(); void prefix##_e1(); void prefix##_e2(); void prefix##_e3(); \
+ void prefix##_e4(); void prefix##_e5(); void prefix##_e6(); void prefix##_e7(); \
+ void prefix##_e8(); void prefix##_e9(); void prefix##_ea(); void prefix##_eb(); \
+ void prefix##_ec(); void prefix##_ed(); void prefix##_ee(); void prefix##_ef(); \
+ void prefix##_f0(); void prefix##_f1(); void prefix##_f2(); void prefix##_f3(); \
+ void prefix##_f4(); void prefix##_f5(); void prefix##_f6(); void prefix##_f7(); \
+ void prefix##_f8(); void prefix##_f9(); void prefix##_fa(); void prefix##_fb(); \
+ void prefix##_fc(); void prefix##_fd(); void prefix##_fe(); void prefix##_ff();
void illegal_1();
void illegal_2();
- ops_type in();
- ops_type out();
- ops_type rm();
- ops_type rm_reg();
- ops_type rm16();
- ops_type wm();
- ops_type wm16();
- ops_type wm16_sp();
- ops_type rop();
- ops_type arg();
- ops_type arg16();
- ops_type eax();
- ops_type eay();
- ops_type push();
- ops_type pop();
- ops_type jp();
- ops_type jp_cond();
- ops_type jr();
- ops_type jr_cond(u8 opcode);
- ops_type call();
- ops_type call_cond(u8 opcode);
- ops_type ret_cond(u8 opcode);
- ops_type retn();
- ops_type reti();
- ops_type ld_r_a();
- ops_type ld_a_r();
- ops_type ld_i_a();
- ops_type ld_a_i();
- ops_type rst(u16 addr);
- void inc(u8 &r);
- void dec(u8 &r);
+ PROTOTYPES(op)
+ PROTOTYPES(cb)
+ PROTOTYPES(dd)
+ PROTOTYPES(ed)
+ PROTOTYPES(fd)
+ PROTOTYPES(xycb)
+
+ void halt();
+ void leave_halt();
+ uint8_t in(uint16_t port);
+ void out(uint16_t port, uint8_t value);
+ virtual uint8_t rm(uint16_t addr);
+ uint8_t rm_reg(uint16_t addr);
+ void rm16(uint16_t addr, PAIR &r);
+ virtual void wm(uint16_t addr, uint8_t value);
+ void wm16(uint16_t addr, PAIR &r);
+ void wm16_sp(PAIR &r);
+ virtual uint8_t rop();
+ virtual uint8_t arg();
+ virtual uint16_t arg16();
+ void eax();
+ void eay();
+ void pop(PAIR &r);
+ void push(PAIR &r);
+ void jp(void);
+ void jp_cond(bool cond);
+ void jr();
+ void jr_cond(bool cond, uint8_t opcode);
+ void call();
+ void call_cond(bool cond, uint8_t opcode);
+ void ret_cond(bool cond, uint8_t opcode);
+ void retn();
+ void reti();
+ void ld_r_a();
+ void ld_a_r();
+ void ld_i_a();
+ void ld_a_i();
+ void rst(uint16_t addr);
+ uint8_t inc(uint8_t value);
+ uint8_t dec(uint8_t value);
void rlca();
void rrca();
void rla();
void rra();
- ops_type rrd();
- ops_type rld();
- void add_a(u8 value);
- void adc_a(u8 value);
- void sub(u8 value);
- void sbc_a(u8 value);
+ void rrd();
+ void rld();
+ void add_a(uint8_t value);
+ void adc_a(uint8_t value);
+ void sub(uint8_t value);
+ void sbc_a(uint8_t value);
void neg();
void daa();
- void and_a(u8 value);
- void or_a(u8 value);
- void xor_a(u8 value);
- void cp(u8 value);
+ void and_a(uint8_t value);
+ void or_a(uint8_t value);
+ void xor_a(uint8_t value);
+ void cp(uint8_t value);
+ void ex_af();
+ void ex_de_hl();
void exx();
- ops_type ex_sp();
- ops_type add16();
- ops_type adc_hl();
- ops_type sbc_hl();
- u8 rlc(u8 value);
- u8 rrc(u8 value);
- u8 rl(u8 value);
- u8 rr(u8 value);
- u8 sla(u8 value);
- u8 sra(u8 value);
- u8 sll(u8 value);
- u8 srl(u8 value);
- void bit(int bit, u8 value);
- void bit_hl(int bit, u8 value);
- void bit_xy(int bit, u8 value);
- u8 res(int bit, u8 value);
- u8 set(int bit, u8 value);
- ops_type ldi();
- ops_type cpi();
- ops_type ini();
- ops_type outi();
- ops_type ldd();
- ops_type cpd();
- ops_type ind();
- ops_type outd();
- ops_type ldir();
- ops_type cpir();
- ops_type inir();
- ops_type otir();
- ops_type lddr();
- ops_type cpdr();
- ops_type indr();
- ops_type otdr();
+ void ex_sp(PAIR &r);
+ void add16(PAIR &dr, PAIR &sr);
+ void adc_hl(PAIR &r);
+ void sbc_hl(PAIR &r);
+ uint8_t rlc(uint8_t value);
+ uint8_t rrc(uint8_t value);
+ uint8_t rl(uint8_t value);
+ uint8_t rr(uint8_t value);
+ uint8_t sla(uint8_t value);
+ uint8_t sra(uint8_t value);
+ uint8_t sll(uint8_t value);
+ uint8_t srl(uint8_t value);
+ void bit(int bit, uint8_t value);
+ void bit_hl(int bit, uint8_t value);
+ void bit_xy(int bit, uint8_t value);
+ uint8_t res(int bit, uint8_t value);
+ uint8_t set(int bit, uint8_t value);
+ void ldi();
+ void cpi();
+ void ini();
+ void outi();
+ void ldd();
+ void cpd();
+ void ind();
+ void outd();
+ void ldir();
+ void cpir();
+ void inir();
+ void otir();
+ void lddr();
+ void cpdr();
+ void indr();
+ void otdr();
void ei();
- void set_f(u8 f);
- void block_io_interrupted_flags();
- ops_type next_op();
virtual void check_interrupts();
void take_interrupt();
void take_nmi();
- ops_type nomreq_ir(s8 cycles);
- ops_type nomreq_addr(s8 cycles);
+ void nomreq_ir(s8 cycles);
+ void nomreq_addr(u16 addr, s8 cycles);
// address spaces
const address_space_config m_program_config;
@@ -280,38 +268,32 @@ protected:
PAIR m_bc2;
PAIR m_de2;
PAIR m_hl2;
- u8 m_qtemp;
- u8 m_q;
- u8 m_r;
- u8 m_r2;
- u8 m_iff1;
- u8 m_iff2;
- u8 m_halt;
- u8 m_im;
- u8 m_i;
- u8 m_nmi_state; // nmi line state
- u8 m_nmi_pending; // nmi pending
- u8 m_irq_state; // irq line state
+ uint8_t m_r;
+ uint8_t m_r2;
+ uint8_t m_iff1;
+ uint8_t m_iff2;
+ uint8_t m_halt;
+ uint8_t m_im;
+ uint8_t m_i;
+ uint8_t m_nmi_state; /* nmi line state */
+ uint8_t m_nmi_pending; /* nmi pending */
+ uint8_t m_irq_state; /* irq line state */
int m_wait_state; // wait line state
int m_busrq_state; // bus request line state
- u8 m_after_ei; // are we in the EI shadow?
- u8 m_after_ldair; // same, but for LD A,I or LD A,R
- u32 m_ea;
+ uint8_t m_after_ei; /* are we in the EI shadow? */
+ uint8_t m_after_ldair; /* same, but for LD A,I or LD A,R */
+ uint32_t m_ea;
- u8 m_cycle;
- op_prefix m_prefix;
- u8 m_opcode;
int m_icount;
- PAIR16 m_m_shared_addr;
- PAIR16 m_m_shared_data;
- PAIR16 m_m_shared_data2;
- u8 m_rtemp;
-
- ops_type m_op_steps[6][0x100];
-
- u8 m_m1_cycles = 4;
- u8 m_memrq_cycles = 3;
- u8 m_iorq_cycles = 4;
+ int m_icount_executing;
+ uint8_t m_rtemp;
+ const uint8_t * m_cc_op;
+ const uint8_t * m_cc_cb;
+ const uint8_t * m_cc_ed;
+ const uint8_t * m_cc_xy;
+ const uint8_t * m_cc_xycb;
+ const uint8_t * m_cc_ex;
+ uint8_t m_mtm_cycles;
};
DECLARE_DEVICE_TYPE(Z80, z80_device)
@@ -319,7 +301,7 @@ DECLARE_DEVICE_TYPE(Z80, z80_device)
class nsc800_device : public z80_device
{
public:
- nsc800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ nsc800_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
protected:
// device-level overrides
@@ -327,12 +309,12 @@ protected:
virtual void device_reset() override;
// device_execute_interface overrides
- virtual u32 execute_input_lines() const noexcept override { return 7; }
+ virtual uint32_t execute_input_lines() const noexcept override { return 7; }
virtual void execute_set_input(int inputnum, int state) override;
virtual void check_interrupts() override;
void take_interrupt_nsc800();
- u8 m_nsc800_irq_state[4]; // state of NSC800 restart interrupts A, B, C
+ uint8_t m_nsc800_irq_state[4]; /* state of NSC800 restart interrupts A, B, C */
};
DECLARE_DEVICE_TYPE(NSC800, nsc800_device)
diff --git a/src/mame/amstrad/amstrad.cpp b/src/mame/amstrad/amstrad.cpp
index 55fe7a2c6d6..68cae48764c 100644
--- a/src/mame/amstrad/amstrad.cpp
+++ b/src/mame/amstrad/amstrad.cpp
@@ -93,10 +93,10 @@ Some bugs left :
#include "amstrad.h"
/* Components */
-#include "machine/i8255.h" /* for 8255 ppi */
-#include "cpu/z80/z80.h" /* for cycle tables */
-#include "video/mc6845.h" /* CRTC */
-#include "machine/upd765.h" /* for floppy disc controller */
+#include "machine/i8255.h" /* for 8255 ppi */
+#include "cpu/z80/z80.h" /* for cycle tables */
+#include "video/mc6845.h" /* CRTC */
+#include "machine/upd765.h" /* for floppy disc controller */
#include "sound/ay8910.h"
#include "machine/mc146818.h" /* Aleste RTC */
#include "bus/centronics/ctronics.h"
@@ -121,11 +121,19 @@ Some bugs left :
#define SYSTEM_GX4000 2
-/* Memory is banked in 16k blocks. However, the multiface pages the memory in 8k blocks!
- The ROM can be paged into bank 0 and bank 3. */
+/* Memory is banked in 16k blocks. However, the multiface
+pages the memory in 8k blocks! The ROM can
+be paged into bank 0 and bank 3. */
void amstrad_state::amstrad_mem(address_map &map)
{
- map(0x0000, 0xffff).rw(FUNC(amstrad_state::amstrad_cpc_mem_r), FUNC(amstrad_state::amstrad_cpc_mem_w));
+ map(0x00000, 0x01fff).bankr("bank1").bankw("bank9");
+ map(0x02000, 0x03fff).bankr("bank2").bankw("bank10");
+ map(0x04000, 0x05fff).bankr("bank3").bankw("bank11");
+ map(0x06000, 0x07fff).bankr("bank4").bankw("bank12");
+ map(0x08000, 0x09fff).bankr("bank5").bankw("bank13");
+ map(0x0a000, 0x0bfff).bankr("bank6").bankw("bank14");
+ map(0x0c000, 0x0dfff).bankr("bank7").bankw("bank15");
+ map(0x0e000, 0x0ffff).bankr("bank8").bankw("bank16");
}
/* I've handled the I/O ports in this way, because the ports
@@ -145,9 +153,9 @@ void amstrad_state::amstrad_io(address_map &map)
static INPUT_PORTS_START( amstrad_keyboard )
PORT_START("kbrow.0")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 9") PORT_CODE(KEYCODE_9_PAD) PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 6") PORT_CODE(KEYCODE_6_PAD) PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 3") PORT_CODE(KEYCODE_3_PAD) PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
@@ -155,7 +163,7 @@ static INPUT_PORTS_START( amstrad_keyboard )
PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad .") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
PORT_START("kbrow.1")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Copy") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(END))
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 7") PORT_CODE(KEYCODE_7_PAD) PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Keypad 8") PORT_CODE(KEYCODE_8_PAD) PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
@@ -335,8 +343,8 @@ static INPUT_PORTS_START( amx_mouse )
PORT_BIT(0xff , 0, IPT_MOUSE_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_PLAYER(1) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
PORT_START("mouse_input3")
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_BUTTON4) PORT_NAME("Left mouse button") PORT_CODE(MOUSECODE_BUTTON1) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_BUTTON5) PORT_NAME("Right mouse button") PORT_CODE(MOUSECODE_BUTTON2) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON6) PORT_NAME("Middle mouse button") PORT_CODE(MOUSECODE_BUTTON3) PORT_CONDITION("controller_type", 0x02, EQUALS, 0x02)
PORT_START("controller_type")
@@ -1192,7 +1200,8 @@ void amstrad_state::aleste(machine_config &config)
/* cpc6128.rom contains OS in first 16k, BASIC in second 16k */
/* cpcados.rom contains Amstrad DOS */
-/* I am loading the roms outside of the Z80 memory area, because they are banked. */
+/* I am loading the roms outside of the Z80 memory area, because they
+are banked. */
ROM_START( cpc6128 )
/* this defines the total memory size - 64k ram, 16k OS, 16k BASIC, 16k DOS */
ROM_REGION(0x020000, "maincpu", 0)
@@ -1203,7 +1212,7 @@ ROM_END
ROM_START( cpc6128f )
- /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k */
+ /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k*/
ROM_REGION(0x020000, "maincpu", 0)
/* load the os to offset 0x01000 from memory base */
@@ -1213,7 +1222,7 @@ ROM_END
ROM_START( cpc6128s )
- /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k */
+ /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k*/
ROM_REGION(0x020000, "maincpu", 0)
/* load the os to offset 0x01000 from memory base */
@@ -1222,7 +1231,7 @@ ROM_START( cpc6128s )
ROM_END
ROM_START( cpc6128sp )
- /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k */
+ /* this defines the total memory size (128kb))- 64k ram, 16k OS, 16k BASIC, 16k DOS +16k*/
ROM_REGION(0x020000, "maincpu", 0)
/* load the os to offset 0x01000 from memory base */
@@ -1300,16 +1309,15 @@ ROM_END
*
*************************************/
-/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
-COMP( 1984, cpc464, 0, 0, cpc464, cpc464, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC464", 0 )
-COMP( 1985, cpc664, cpc464, 0, cpc664, cpc664, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC664", 0 )
-COMP( 1985, cpc6128, cpc464, 0, cpc6128, cpc6128, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128", 0 )
-COMP( 1985, cpc6128f, cpc464, 0, cpc6128, cpc6128f, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (France, AZERTY Keyboard)", 0 )
-COMP( 1985, cpc6128s, cpc464, 0, cpc6128, cpc6128s, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (Sweden/Finland)", 0 )
-COMP( 1985, cpc6128sp, cpc464, 0, cpc6128, cpc6128sp, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (Spain)", 0 )
-COMP( 1990, cpc464p, 0, 0, cpcplus, plus, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC464+", 0 )
-COMP( 1990, cpc6128p, 0, 0, cpcplus, plus, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128+", 0 )
-CONS( 1990, gx4000, 0, 0, gx4000, gx4000, amstrad_state, empty_init, "Amstrad plc", "Amstrad GX4000", 0 )
-COMP( 1989, kccomp, cpc464, 0, kccomp, kccomp, amstrad_state, empty_init, u8"VEB Mikroelektronik \"Wilhelm Pieck\" Mühlhausen",
- "KC Compact", 0 )
-COMP( 1993, al520ex, cpc464, 0, aleste, aleste, amstrad_state, empty_init, "Patisonic", "Aleste 520EX", MACHINE_IMPERFECT_SOUND )
+/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
+COMP( 1984, cpc464, 0, 0, cpc464, cpc464, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC464", 0 )
+COMP( 1985, cpc664, cpc464, 0, cpc664, cpc664, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC664", 0 )
+COMP( 1985, cpc6128, cpc464, 0, cpc6128, cpc6128, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128", 0 )
+COMP( 1985, cpc6128f, cpc464, 0, cpc6128, cpc6128f, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (France, AZERTY Keyboard)", 0 )
+COMP( 1985, cpc6128s, cpc464, 0, cpc6128, cpc6128s, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (Sweden/Finland)", 0 )
+COMP( 1985, cpc6128sp, cpc464, 0, cpc6128, cpc6128sp, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128 (Spain)", 0 )
+COMP( 1990, cpc464p, 0, 0, cpcplus, plus, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC464+", 0 )
+COMP( 1990, cpc6128p, 0, 0, cpcplus, plus, amstrad_state, empty_init, "Amstrad plc", "Amstrad CPC6128+", 0 )
+CONS( 1990, gx4000, 0, 0, gx4000, gx4000, amstrad_state, empty_init, "Amstrad plc", "Amstrad GX4000", 0 )
+COMP( 1989, kccomp, cpc464, 0, kccomp, kccomp, amstrad_state, empty_init, u8"VEB Mikroelektronik \"Wilhelm Pieck\" Mühlhausen", "KC Compact", 0 )
+COMP( 1993, al520ex, cpc464, 0, aleste, aleste, amstrad_state, empty_init, "Patisonic", "Aleste 520EX", MACHINE_IMPERFECT_SOUND )
diff --git a/src/mame/amstrad/amstrad.h b/src/mame/amstrad/amstrad.h
index bf1a986b774..b14b98b3800 100644
--- a/src/mame/amstrad/amstrad.h
+++ b/src/mame/amstrad/amstrad.h
@@ -211,8 +211,6 @@ private:
void aleste_msx_mapper(offs_t offset, uint8_t data);
uint8_t amstrad_cpc_io_r(offs_t offset);
void amstrad_cpc_io_w(offs_t offset, uint8_t data);
- uint8_t amstrad_cpc_mem_r(offs_t offset);
- void amstrad_cpc_mem_w(offs_t offset, uint8_t data);
uint8_t amstrad_psg_porta_read();
void amstrad_plus_seqcheck(int data);
DECLARE_MACHINE_START(amstrad);
@@ -268,7 +266,7 @@ private:
required_memory_region m_region_maincpu;
optional_memory_region m_region_user1;
- memory_bank_array_creator<16> m_banks;
+ required_memory_bank_array<16> m_banks;
optional_ioport_array<11> m_io_kbrow;
optional_ioport_array<4> m_io_analog;
optional_ioport_array<3> m_io_mouse;
diff --git a/src/mame/amstrad/amstrad_m.cpp b/src/mame/amstrad/amstrad_m.cpp
index 05c5768a6e2..4d0aa81f3e4 100644
--- a/src/mame/amstrad/amstrad_m.cpp
+++ b/src/mame/amstrad/amstrad_m.cpp
@@ -31,14 +31,8 @@ the name I give to the time taken for one NOP command to execute.
This happens to be 1us.
-
-Timings:
- From measurement, there are 64 NOPs per line, with 312 lines per screen. This
-gives a total of 19968 NOPs per frame.
-
- The Amstrad hardware issues a HALT for each memory fetch. This has the effect
-of stretching the timing for Z80 opcodes, so that they are all multiple of 4 T
-states long. All opcode timings are a multiple of 1us in length.
+From measurement, there are 64 NOPs per line, with 312 lines per screen.
+This gives a total of 19968 NOPs per frame.
***************************************************************************/
@@ -103,14 +97,14 @@ static const uint8_t asic_unlock_seq[15] =
The following tables show the possible ram configurations :*/
static const int RamConfigurations[8 * 4] =
{
- 0, 1, 2, 3, /* config 0 */
- 0, 1, 2, 7, /* config 1 */
- 4, 5, 6, 7, /* config 2 */
- 0, 3, 2, 7, /* config 3 */
- 0, 4, 2, 3, /* config 4 */
- 0, 5, 2, 3, /* config 5 */
- 0, 6, 2, 3, /* config 6 */
- 0, 7, 2, 3 /* config 7 */
+ 0, 1, 2, 3, /* config 0 */
+ 0, 1, 2, 7, /* config 1 */
+ 4, 5, 6, 7, /* config 2 */
+ 0, 3, 2, 7, /* config 3 */
+ 0, 4, 2, 3, /* config 4 */
+ 0, 5, 2, 3, /* config 5 */
+ 0, 6, 2, 3, /* config 6 */
+ 0, 7, 2, 3 /* config 7 */
};
@@ -171,32 +165,32 @@ static const rgb_t amstrad_green_palette[32] =
rgb_t(0x000, 0x07F, 0x000), /*13*/
rgb_t(0x000, 0x0BA, 0x000), /*19*/
rgb_t(0x000, 0x0F5, 0x000), /*25*/
- rgb_t(0x000, 0x009, 0x000), /* 1*/
- rgb_t(0x000, 0x044, 0x000), /* 7*/
+ rgb_t(0x000, 0x009, 0x000), /*1*/
+ rgb_t(0x000, 0x044, 0x000), /*7*/
rgb_t(0x000, 0x062, 0x000), /*10*/
rgb_t(0x000, 0x09C, 0x000), /*16*/
- rgb_t(0x000, 0x044, 0x000), /* 7*/
+ rgb_t(0x000, 0x044, 0x000), /*7*/
rgb_t(0x000, 0x0F5, 0x000), /*25*/
rgb_t(0x000, 0x0EB, 0x000), /*24*/
rgb_t(0x000, 0x0FF, 0x000), /*26*/
- rgb_t(0x000, 0x03A, 0x000), /* 6*/
- rgb_t(0x000, 0x04E, 0x000), /* 8*/
+ rgb_t(0x000, 0x03A, 0x000), /*6*/
+ rgb_t(0x000, 0x04E, 0x000), /*8*/
rgb_t(0x000, 0x093, 0x000), /*15*/
rgb_t(0x000, 0x0A6, 0x000), /*17*/
- rgb_t(0x000, 0x009, 0x000), /* 1*/
+ rgb_t(0x000, 0x009, 0x000), /*1*/
rgb_t(0x000, 0x0BA, 0x000), /*19*/
rgb_t(0x000, 0x0B0, 0x000), /*18*/
rgb_t(0x000, 0x0C4, 0x000), /*20*/
- rgb_t(0x000, 0x000, 0x000), /* 0*/
- rgb_t(0x000, 0x013, 0x000), /* 2*/
- rgb_t(0x000, 0x058, 0x000), /* 9*/
+ rgb_t(0x000, 0x000, 0x000), /*0*/
+ rgb_t(0x000, 0x013, 0x000), /*2*/
+ rgb_t(0x000, 0x058, 0x000), /*9*/
rgb_t(0x000, 0x06B, 0x000), /*11*/
- rgb_t(0x000, 0x027, 0x000), /* 4*/
+ rgb_t(0x000, 0x027, 0x000), /*4*/
rgb_t(0x000, 0x0D7, 0x000), /*22*/
rgb_t(0x000, 0x0CD, 0x000), /*21*/
rgb_t(0x000, 0x0E1, 0x000), /*23*/
- rgb_t(0x000, 0x01D, 0x000), /* 3*/
- rgb_t(0x000, 0x031, 0x000), /* 5*/
+ rgb_t(0x000, 0x01D, 0x000), /*3*/
+ rgb_t(0x000, 0x031, 0x000), /*5*/
rgb_t(0x000, 0x075, 0x000), /*12*/
rgb_t(0x000, 0x089, 0x000) /*14*/
};
@@ -2180,18 +2174,6 @@ The exception is the case where none of b7-b0 are reset (i.e. port &FBFF), which
}
}
-uint8_t amstrad_state::amstrad_cpc_mem_r(offs_t offset)
-{
- if (!machine().side_effects_disabled())
- m_maincpu->adjust_icount(-((4 - m_maincpu->total_cycles() % 4) % 4));
- return ((u8*)m_banks[(offset >> 13)]->base())[offset & 0x1fff];
-}
-
-void amstrad_state::amstrad_cpc_mem_w(offs_t offset, uint8_t data)
-{
- m_maincpu->adjust_icount(-((4 - m_maincpu->total_cycles() % 4) % 4));
- ((u8*)m_banks[(offset >> 13) + 8]->base())[offset & 0x1fff] = data;
-}
/* load CPCEMU style snapshots */
void amstrad_state::amstrad_handle_snapshot(unsigned char *pSnapshot)
@@ -2784,6 +2766,125 @@ IRQ_CALLBACK_MEMBER(amstrad_state::amstrad_cpu_acknowledge_int)
}
+/* the following timings have been measured! */
+static const uint8_t amstrad_cycle_table_op[256] = {
+ 4, 12, 8, 8, 4, 4, 8, 4, 4, 12, 8, 8, 4, 4, 8, 4,
+ 12, 12, 8, 8, 4, 4, 8, 4, 12, 12, 8, 8, 4, 4, 8, 4,
+ 8, 12, 20, 8, 4, 4, 8, 4, 8, 12, 20, 8, 4, 4, 8, 4,
+ 8, 12, 16, 8, 12, 12, 12, 4, 8, 12, 16, 8, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 8, 8, 8, 8, 8, 8, 4, 8, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 8, 12, 12, 12, 12, 16, 8, 16, 8, 12, 12, 4, 12, 20, 8, 16,
+ 8, 12, 12, 12, 12, 16, 8, 16, 8, 4, 12, 12, 12, 4, 8, 16,
+ 8, 12, 12, 24, 12, 16, 8, 16, 8, 4, 12, 4, 12, 4, 8, 16,
+ 8, 12, 12, 4, 12, 16, 8, 16, 8, 8, 12, 4, 12, 4, 8, 16
+};
+
+static const uint8_t amstrad_cycle_table_cb[256]=
+{
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4,
+ 4, 4, 4, 4, 4, 4, 12, 4, 4, 4, 4, 4, 4, 4, 12, 4
+};
+
+static const uint8_t amstrad_cycle_table_ed[256]=
+{
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 12, 12, 12, 20, 4, 12, 4, 8, 12, 12, 12, 20, 4, 12, 4, 8,
+ 12, 12, 12, 20, 4, 12, 4, 8, 12, 12, 12, 20, 4, 12, 4, 8,
+ 12, 12, 12, 20, 4, 12, 4, 16, 12, 12, 12, 20, 4, 12, 4, 16,
+ 12, 12, 12, 20, 4, 12, 4, 4, 12, 12, 12, 20, 4, 12, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 16, 12, 16, 16, 4, 4, 4, 4, 16, 12, 16, 16, 4, 4, 4, 4,
+ 16, 12, 16, 16, 4, 4, 4, 4, 16, 12, 16, 16, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
+};
+
+static const uint8_t amstrad_cycle_table_xy[256]=
+{
+ 4, 12, 8, 8, 4, 4, 8, 4, 4, 12, 8, 8, 4, 4, 8, 4,
+ 12, 12, 8, 8, 4, 4, 8, 4, 12, 12, 8, 8, 4, 4, 8, 4,
+ 8, 12, 20, 8, 4, 4, 8, 4, 8, 12, 20, 8, 4, 4, 8, 4,
+ 8, 12, 16, 8, 20, 20, 20, 4, 8, 12, 16, 8, 4, 4, 8, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 16, 16, 16, 16, 16, 16, 4, 16, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 4, 4, 4, 4, 4, 4, 16, 4, 4, 4, 4, 4, 4, 4, 16, 4,
+ 8, 12, 12, 12, 12, 16, 8, 16, 8, 12, 12, 8, 12, 20, 8, 16,
+ 8, 12, 12, 12, 12, 16, 8, 16, 8, 4, 12, 12, 12, 4, 8, 16,
+ 8, 12, 12, 24, 12, 16, 8, 16, 8, 4, 12, 4, 12, 4, 8, 16,
+ 8, 12, 12, 4, 12, 16, 8, 16, 8, 8, 12, 4, 12, 4, 8, 16
+};
+
+static const uint8_t amstrad_cycle_table_xycb[0x100] = {
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+ 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16
+};
+
+static const uint8_t amstrad_cycle_table_ex[256]=
+{
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 4, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 4, 8, 4, 4, 0, 0, 0, 0, 4, 8, 4, 4, 0, 0, 0, 0,
+ 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0,
+ 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0,
+ 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0,
+ 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0
+};
+
#define NEXT_ROM_SLOT m_rom_count++; \
if(slot3 && m_rom_count == 3) m_rom_count++; \
if(slot7 && m_rom_count == 7) m_rom_count++;
@@ -2935,6 +3036,26 @@ void amstrad_state::amstrad_common_init()
m_maincpu->set_input_line_vector(0, 0xff); // Z80
else
m_maincpu->set_input_line_vector(0, 0x00); // Z80
+
+ /* The opcode timing in the Amstrad is different to the opcode
+ timing in the core for the Z80 CPU.
+
+ The Amstrad hardware issues a HALT for each memory fetch.
+ This has the effect of stretching the timing for Z80 opcodes,
+ so that they are all multiple of 4 T states long. All opcode
+ timings are a multiple of 1us in length. */
+
+ /* Using the cool code Juergen has provided, I will override
+ the timing tables with the values for the amstrad */
+ m_maincpu->z80_set_cycle_tables(
+ (const uint8_t*)amstrad_cycle_table_op,
+ (const uint8_t*)amstrad_cycle_table_cb,
+ (const uint8_t*)amstrad_cycle_table_ed,
+ (const uint8_t*)amstrad_cycle_table_xy,
+ (const uint8_t*)amstrad_cycle_table_xycb,
+ (const uint8_t*)amstrad_cycle_table_ex);
+
+ /* Juergen is a cool dude! */
}
TIMER_CALLBACK_MEMBER(amstrad_state::cb_set_resolution)
diff --git a/src/mame/msx/msx.cpp b/src/mame/msx/msx.cpp
index a37199a7141..b28ec33b865 100644
--- a/src/mame/msx/msx.cpp
+++ b/src/mame/msx/msx.cpp
@@ -314,10 +314,108 @@ void msx_state::machine_start()
m_port_c_old = 0xff;
}
+// Update instruction timings to add 1 wait cycle for each M1 opcode fetch.
+static const u8 cc_op[0x100] = {
+ 4+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, 4+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 8+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,12+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 7+1,10+1,16+1, 6+1, 4+1, 4+1, 7+1, 4+1, 7+1,11+1,16+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 7+1,10+1,13+1, 6+1,11+1,11+1,10+1, 4+1, 7+1,11+1,13+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 7+1, 7+1, 7+1, 7+1, 7+1, 7+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 7+1, 4+1,
+ 5+1,10+1,10+1,10+1,10+1,11+1, 7+1,11+1, 5+1,10+1,10+1, 4+1,10+1,17+1, 7+1,11+1,
+ 5+1,10+1,10+1,11+1,10+1,11+1, 7+1,11+1, 5+1, 4+1,10+1,11+1,10+1, 4+1, 7+1,11+1,
+ 5+1,10+1,10+1,19+1,10+1,11+1, 7+1,11+1, 5+1, 4+1,10+1, 4+1,10+1, 4+1, 7+1,11+1,
+ 5+1,10+1,10+1, 4+1,10+1,11+1, 7+1,11+1, 5+1, 6+1,10+1, 4+1,10+1, 4+1, 7+1,11+1
+};
+
+static const u8 cc_cb[0x100] = {
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 8+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,11+1, 4+1
+};
+
+static const u8 cc_ed[0x100] = {
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 5+1, 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 5+1,
+ 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 5+1, 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 5+1,
+ 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1,14+1, 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1,14+1,
+ 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 4+1, 8+1, 8+1,15+2,16+1, 4+1,14+2, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 12+1,12+1,12+1,12+1, 4+1, 4+1, 4+1, 4+1,12+1,12+1,12+1,12+1, 4+1, 4+1, 4+1, 4+1,
+ 12+1,12+1,12+1,12+1, 4+1, 4+1, 4+1, 4+1,12+1,12+1,12+1,12+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1
+};
+
+static const u8 cc_xy[0x100] = {
+ 4+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1, 4+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 8+1,10+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,12+1,11+1, 7+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 7+1,10+1,16+1, 6+1, 4+1, 4+1, 7+1, 4+1, 7+1,11+1,16+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 7+1,10+1,13+1, 6+1,19+1,19+1,15+1, 4+1, 7+1,11+1,13+1, 6+1, 4+1, 4+1, 7+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 15+1,15+1,15+1,15+1,15+1,15+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1, 4+1,15+1, 4+1,
+ 5+1,10+1,10+1,10+1,10+1,11+1, 7+1,11+1, 5+1,10+1,10+1, 7+1,10+1,17+1, 7+1,11+1,
+ 5+1,10+1,10+1,11+1,10+1,11+1, 7+1,11+1, 5+1, 4+1,10+1,11+1,10+1, 4+1, 7+1,11+1,
+ 5+1,10+1,10+1,19+1,10+1,11+1, 7+1,11+1, 5+1, 4+1,10+1, 4+1,10+1, 4+1, 7+1,11+1,
+ 5+1,10+1,10+1, 4+1,10+1,11+1, 7+1,11+1, 5+1, 6+1,10+1, 4+1,10+1, 4+1, 7+1,11+1
+};
+
+/* extra cycles if jr/jp/call taken and 'interrupt latency' on rst 0-7 */
+static const u8 cc_ex[0x100] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* DJNZ */
+ 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NZ/JR Z */
+ 5, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, /* JR NC/JR C */
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 5, 5, 5, 5, 0, 0, 0, 0, 5, 5, 5, 5, 0, 0, 0, 0, /* LDIR/CPIR/INIR/OTIR LDDR/CPDR/INDR/OTDR */
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2,
+ 6, 0, 0, 0, 7, 0, 0, 2, 6, 0, 0, 0, 7, 0, 0, 2+1
+};
+
void msx_state::driver_start()
{
m_maincpu->set_input_line_vector(0, 0xff); // Z80
- m_maincpu->z80_set_m1_cycles(5);
+
+ m_maincpu->z80_set_cycle_tables(cc_op, cc_cb, cc_ed, cc_xy, nullptr, cc_ex);
save_item(NAME(m_psg_b));
save_item(NAME(m_kanji_latch));