diff options
author | 2023-08-30 14:11:14 -0400 | |
---|---|---|
committer | 2023-08-30 14:11:14 -0400 | |
commit | c06c4fd132b8cddbb8e5dcb28b6c88fe34b9295b (patch) | |
tree | fdbd2fbb99da7f659a20648893f0042e2e62e1a9 | |
parent | 39c569dc069d530bc14e2e75843f751b075ac61f (diff) |
cpu/z80: Revert a94254a while we figure out the severe performance regressions. [R. Belmont, holub]
-rw-r--r-- | src/devices/cpu/z80/kc82.cpp | 22 | ||||
-rw-r--r-- | src/devices/cpu/z80/kc82.h | 9 | ||||
-rw-r--r-- | src/devices/cpu/z80/z80.cpp | 5152 | ||||
-rw-r--r-- | src/devices/cpu/z80/z80.h | 392 | ||||
-rw-r--r-- | src/mame/amstrad/amstrad.cpp | 68 | ||||
-rw-r--r-- | src/mame/amstrad/amstrad.h | 4 | ||||
-rw-r--r-- | src/mame/amstrad/amstrad_m.cpp | 201 | ||||
-rw-r--r-- | src/mame/msx/msx.cpp | 100 |
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)); |