summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author wilbertpol <wilbertpol@users.noreply.github.com>2024-07-11 00:34:51 +0100
committer GitHub <noreply@github.com>2024-07-10 19:34:51 -0400
commit2c479b20dd3ed7e5030138e18c14731d22384658 (patch)
tree49e8b49a65ff3248f7751eb9efe387ae21274150
parent4183b96612eb588a76b271ca610604a607469fb7 (diff)
cpu/z80/r800.cpp: (#12530)
- Removed undocumented Z80 instructions that are not supported by the R800 - Updated basic instruction timing - Implement MULUB and MULUW Other R800 features are not implemented
-rw-r--r--scripts/src/cpu.lua2
-rw-r--r--src/devices/cpu/z80/r800.cpp153
-rw-r--r--src/devices/cpu/z80/r800.h17
-rw-r--r--src/devices/cpu/z80/z80.cpp59
-rw-r--r--src/devices/cpu/z80/z80.h17
-rw-r--r--src/devices/cpu/z80/z80.lst1992
6 files changed, 2195 insertions, 45 deletions
diff --git a/scripts/src/cpu.lua b/scripts/src/cpu.lua
index a9ce8afcfbb..e88a2c94716 100644
--- a/scripts/src/cpu.lua
+++ b/scripts/src/cpu.lua
@@ -3001,11 +3001,13 @@ if CPUS["Z80"] or CPUS["KC80"] or CPUS["Z80N"] then
dependency {
{ MAME_DIR .. "src/devices/cpu/z80/z80.cpp", GEN_DIR .. "emu/cpu/z80/z80.hxx" },
{ MAME_DIR .. "src/devices/cpu/z80/z80.cpp", GEN_DIR .. "emu/cpu/z80/ncs800.hxx" },
+ { MAME_DIR .. "src/devices/cpu/z80/r800.cpp", GEN_DIR .. "emu/cpu/z80/r800.hxx" },
}
custombuildtask {
{ MAME_DIR .. "src/devices/cpu/z80/z80.lst", GEN_DIR .. "emu/cpu/z80/z80.hxx", { MAME_DIR .. "src/devices/cpu/z80/z80make.py" }, { "@echo Generating Z80 source file...", PYTHON .. " $(1) $(<) $(@)" } },
{ MAME_DIR .. "src/devices/cpu/z80/z80.lst", GEN_DIR .. "emu/cpu/z80/ncs800.hxx", { MAME_DIR .. "src/devices/cpu/z80/z80make.py" }, { "@echo Generating NSC800 source file...", PYTHON .. " $(1) ncs800 $(<) $(@)" } },
+ { MAME_DIR .. "src/devices/cpu/z80/z80.lst", GEN_DIR .. "emu/cpu/z80/r800.hxx", { MAME_DIR .. "src/devices/cpu/z80/z80make.py" }, { "@echo Generating R800 source file...", PYTHON .. " $(1) r800 $(<) $(@)" } },
}
end
diff --git a/src/devices/cpu/z80/r800.cpp b/src/devices/cpu/z80/r800.cpp
index 1748f8eca39..f02fba758e2 100644
--- a/src/devices/cpu/z80/r800.cpp
+++ b/src/devices/cpu/z80/r800.cpp
@@ -1,17 +1,33 @@
// license:BSD-3-Clause
-// copyright-holders:AJR
+// copyright-holders:AJR,Wilbert Pol
/***************************************************************************
ASCII R800 CPU
- TODO: this uses a sped-up Z80 core with added multiply instructions
- ('mulub', 'muluw').
+TODO:
+- Internal configuration registers.
+- External 24 bits address bus accessible through 9 memory mappers.
+- DMA channels.
+- Interrupt levels.
+- Bits 3 and 5 of the flag register behave differently from the z80.
+- Page break penalties.
+- Refresh delays.
***************************************************************************/
#include "emu.h"
#include "r800.h"
+#include "r800dasm.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__)
//**************************************************************************
// GLOBAL VARIABLES
@@ -32,4 +48,135 @@ DEFINE_DEVICE_TYPE(R800, r800_device, "r800", "ASCII R800")
r800_device::r800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: z80_device(mconfig, R800, tag, owner, clock)
{
+ z80_set_m1_cycles(1);
+ z80_set_memrq_cycles(1);
+ z80_set_iorq_cycles(1);
+}
+
+std::unique_ptr<util::disasm_interface> r800_device::create_disassembler()
+{
+ return std::make_unique<r800_disassembler>();
+}
+
+void r800_device::device_validity_check(validity_checker &valid) const
+{
+ cpu_device::device_validity_check(valid);
+}
+
+
+
+#define HAS_LDAIR_QUIRK 0
+
+/****************************************************************************
+ * The Z80 registers. halt is set to 1 when the CPU is halted, the refresh
+ * register is calculated as follows: refresh = (r & 127) | (r2 & 128)
+ ****************************************************************************/
+#define CF 0x01
+#define NF 0x02
+#define PF 0x04
+#define VF PF
+#define XF 0x08
+#define HF 0x10
+#define YF 0x20
+#define ZF 0x40
+#define SF 0x80
+
+#define INT_IRQ 0x01
+#define NMI_IRQ 0x02
+
+#define PRVPC m_prvpc.d // previous program counter
+
+#define PCD m_pc.d
+#define PC m_pc.w.l
+
+#define SPD m_sp.d
+#define SP m_sp.w.l
+
+#define AFD m_af.d
+#define AF m_af.w.l
+#define A m_af.b.h
+#define F m_af.b.l
+#define Q m_q
+#define QT m_qtemp
+#define I m_i
+#define R m_r
+#define R2 m_r2
+
+#define BCD m_bc.d
+#define BC m_bc.w.l
+#define B m_bc.b.h
+#define C m_bc.b.l
+
+#define DED m_de.d
+#define DE m_de.w.l
+#define D m_de.b.h
+#define E m_de.b.l
+
+#define HLD m_hl.d
+#define HL m_hl.w.l
+#define H m_hl.b.h
+#define L m_hl.b.l
+
+#define IXD m_ix.d
+#define IX m_ix.w.l
+#define HX m_ix.b.h
+#define LX m_ix.b.l
+
+#define IYD m_iy.d
+#define IY m_iy.w.l
+#define HY m_iy.b.h
+#define LY m_iy.b.l
+
+#define WZ m_wz.w.l
+#define WZ_H m_wz.b.h
+#define WZ_L m_wz.b.l
+
+#define TADR m_shared_addr.w // Typically represents values from A0..15 pins. 16bit input in steps.
+#define TADR_H m_shared_addr.b.h
+#define TADR_L m_shared_addr.b.l
+#define TDAT m_shared_data.w // 16bit input(if use as second parameter) or output in steps.
+#define TDAT2 m_shared_data2.w
+#define TDAT_H m_shared_data.b.h
+#define TDAT_L m_shared_data.b.l
+#define TDAT8 m_shared_data.b.l // Typically represents values from D0..8 pins. 8bit input or output in steps.
+
+
+/***************************************************************
+ * adjust cycle count by n T-states
+ ***************************************************************/
+#define T(icount) { m_icount -= icount; }
+
+/***************************************************************
+ * SLL r8
+ ***************************************************************/
+u8 r800_device::r800_sll(u8 value)
+{
+ const u8 c = (value & 0x80) ? CF : 0;
+ const u8 res = u8(value << 1);
+ set_f(SZP[res] | c);
+ return res;
+}
+
+void r800_device::mulub(u8 value)
+{
+ const u16 res = A * value;
+ HL = res;
+ const u8 c = (H) ? CF : 0;
+ const u8 z = (res) ? 0 : ZF;
+ set_f((F & (HF|NF)) | z | c);
+}
+
+void r800_device::muluw(u16 value)
+{
+ const u32 res = HL * value;
+ DE = res >> 16;
+ HL = res & 0xffff;
+ const u8 c = (DE) ? CF : 0;
+ const u8 z = (res) ? 0 : ZF;
+ set_f((F & (HF|NF)) | z | c);
+}
+
+void r800_device::do_op()
+{
+ #include "cpu/z80/r800.hxx"
}
diff --git a/src/devices/cpu/z80/r800.h b/src/devices/cpu/z80/r800.h
index bad16f8cfdd..75fbe7b5ca8 100644
--- a/src/devices/cpu/z80/r800.h
+++ b/src/devices/cpu/z80/r800.h
@@ -1,5 +1,5 @@
// license:BSD-3-Clause
-// copyright-holders:AJR
+// copyright-holders:AJR,Wilbert Pol
/***************************************************************************
ASCII R800 CPU
@@ -24,10 +24,25 @@ public:
// device type constructor
r800_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+ static constexpr feature_type imperfect_features() { return feature::TIMING; }
+
protected:
+ // device_t implementation
+ virtual void device_validity_check(validity_checker &valid) const override;
+
// device_execute_interface overrides
+ virtual u32 execute_min_cycles() const noexcept override { return 1; }
virtual u64 execute_clocks_to_cycles(u64 clocks) const noexcept override { return (clocks + 4 - 1) / 4; }
virtual u64 execute_cycles_to_clocks(u64 cycles) const noexcept override { return (cycles * 4); }
+
+ // device_disasm_interface implementation
+ virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
+
+ u8 r800_sll(u8 value);
+ void mulub(u8 value);
+ void muluw(u16 value);
+
+ virtual void do_op() override;
};
// device type declaration
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 107152ecd18..648d068feca 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -27,15 +27,14 @@ TODO:
#include "z80.inc"
-static bool tables_initialised = false;
-std::unique_ptr<u8[]> z80_device::SZ = std::make_unique<u8[]>(0x100); // zero and sign flags
-std::unique_ptr<u8[]> z80_device::SZ_BIT = std::make_unique<u8[]>(0x100); // zero, sign and parity/overflow (=zero) flags for BIT opcode
-std::unique_ptr<u8[]> z80_device::SZP = std::make_unique<u8[]>(0x100); // zero, sign and parity flags
-std::unique_ptr<u8[]> z80_device::SZHV_inc = std::make_unique<u8[]>(0x100); // zero, sign, half carry and overflow flags INC r8
-std::unique_ptr<u8[]> z80_device::SZHV_dec = std::make_unique<u8[]>(0x100); // zero, sign, half carry and overflow flags DEC r8
-
-std::unique_ptr<u8[]> z80_device::SZHVC_add = std::make_unique<u8[]>(2 * 0x100 * 0x100);
-std::unique_ptr<u8[]> z80_device::SZHVC_sub = std::make_unique<u8[]>(2 * 0x100 * 0x100);
+bool z80_device::tables_initialised = false;
+u8 z80_device::SZ[] = {}; // zero and sign flags
+u8 z80_device::SZ_BIT[] = {}; // zero, sign and parity/overflow (=zero) flags for BIT opcode
+u8 z80_device::SZP[] = {}; // zero, sign and parity flags
+u8 z80_device::SZHV_inc[] = {}; // zero, sign, half carry and overflow flags INC r8
+u8 z80_device::SZHV_dec[] = {}; // zero, sign, half carry and overflow flags DEC r8
+u8 z80_device::SZHVC_add[] = {};
+u8 z80_device::SZHVC_sub[] = {};
/***************************************************************
@@ -501,36 +500,36 @@ void z80_device::device_start()
int val = newval - oldval;
*padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
*padd |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if( (newval & 0x0f) < (oldval & 0x0f) ) *padd |= HF;
- if( newval < oldval ) *padd |= CF;
- if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padd |= VF;
+ if ((newval & 0x0f) < (oldval & 0x0f)) *padd |= HF;
+ if (newval < oldval) *padd |= CF;
+ if ((val^oldval^0x80) & (val^newval) & 0x80) *padd |= VF;
padd++;
// adc with carry set
val = newval - oldval - 1;
*padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
*padc |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if( (newval & 0x0f) <= (oldval & 0x0f) ) *padc |= HF;
- if( newval <= oldval ) *padc |= CF;
- if( (val^oldval^0x80) & (val^newval) & 0x80 ) *padc |= VF;
+ if ((newval & 0x0f) <= (oldval & 0x0f)) *padc |= HF;
+ if (newval <= oldval) *padc |= CF;
+ if ((val^oldval^0x80) & (val^newval) & 0x80) *padc |= VF;
padc++;
// cp, sub or sbc w/o carry set
val = oldval - newval;
*psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
*psub |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if( (newval & 0x0f) > (oldval & 0x0f) ) *psub |= HF;
- if( newval > oldval ) *psub |= CF;
- if( (val^oldval) & (oldval^newval) & 0x80 ) *psub |= VF;
+ if ((newval & 0x0f) > (oldval & 0x0f)) *psub |= HF;
+ if (newval > oldval) *psub |= CF;
+ if ((val^oldval) & (oldval^newval) & 0x80) *psub |= VF;
psub++;
// sbc with carry set
val = oldval - newval - 1;
*psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
*psbc |= (newval & (YF | XF)); // undocumented flag bits 5+3
- if( (newval & 0x0f) >= (oldval & 0x0f) ) *psbc |= HF;
- if( newval >= oldval ) *psbc |= CF;
- if( (val^oldval) & (oldval^newval) & 0x80 ) *psbc |= VF;
+ if ((newval & 0x0f) >= (oldval & 0x0f)) *psbc |= HF;
+ if (newval >= oldval) *psbc |= CF;
+ if ((val^oldval) & (oldval^newval) & 0x80) *psbc |= VF;
psbc++;
}
}
@@ -538,25 +537,19 @@ void z80_device::device_start()
for (int i = 0; i < 256; i++)
{
int p = 0;
- if( i&0x01 ) ++p;
- if( i&0x02 ) ++p;
- if( i&0x04 ) ++p;
- if( i&0x08 ) ++p;
- if( i&0x10 ) ++p;
- if( i&0x20 ) ++p;
- if( i&0x40 ) ++p;
- if( i&0x80 ) ++p;
+ for (int b = 0; b < 8; b++)
+ p += BIT(i, b);
SZ[i] = i ? i & SF : ZF;
SZ[i] |= (i & (YF | XF)); // undocumented flag bits 5+3
SZ_BIT[i] = i ? i & SF : ZF | PF;
SZ_BIT[i] |= (i & (YF | XF)); // undocumented flag bits 5+3
SZP[i] = SZ[i] | ((p & 1) ? 0 : PF);
SZHV_inc[i] = SZ[i];
- if( i == 0x80 ) SZHV_inc[i] |= VF;
- if( (i & 0x0f) == 0x00 ) SZHV_inc[i] |= HF;
+ if (i == 0x80) SZHV_inc[i] |= VF;
+ if ((i & 0x0f) == 0x00) SZHV_inc[i] |= HF;
SZHV_dec[i] = SZ[i] | NF;
- if( i == 0x7f ) SZHV_dec[i] |= VF;
- if( (i & 0x0f) == 0x0f ) SZHV_dec[i] |= HF;
+ if (i == 0x7f) SZHV_dec[i] |= VF;
+ if ((i & 0x0f) == 0x0f) SZHV_dec[i] |= HF;
}
tables_initialised = true;
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index fb7a5db477f..2495930ad41 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -181,14 +181,15 @@ protected:
u8 m_memrq_cycles;
u8 m_iorq_cycles;
- static std::unique_ptr<u8[]> SZ; // zero and sign flags
- static std::unique_ptr<u8[]> SZ_BIT; // zero, sign and parity/overflow (=zero) flags for BIT opcode
- static std::unique_ptr<u8[]> SZP; // zero, sign and parity flags
- static std::unique_ptr<u8[]> SZHV_inc; // zero, sign, half carry and overflow flags INC r8
- static std::unique_ptr<u8[]> SZHV_dec; // zero, sign, half carry and overflow flags DEC r8
-
- static std::unique_ptr<u8[]> SZHVC_add;
- static std::unique_ptr<u8[]> SZHVC_sub;
+ static bool tables_initialised;
+ static u8 SZ[0x100]; // zero and sign flags
+ static u8 SZ_BIT[0x100]; // zero, sign and parity/overflow (=zero) flags for BIT opcode
+ static u8 SZP[0x100]; // zero, sign and parity flags
+ static u8 SZHV_inc[0x100]; // zero, sign, half carry and overflow flags INC r8
+ static u8 SZHV_dec[0x100]; // zero, sign, half carry and overflow flags DEC r8
+
+ static u8 SZHVC_add[2 * 0x100 * 0x100];
+ static u8 SZHVC_sub[2 * 0x100 * 0x100];
};
DECLARE_DEVICE_TYPE(Z80, z80_device)
diff --git a/src/devices/cpu/z80/z80.lst b/src/devices/cpu/z80/z80.lst
index 07bc5f23d55..378ee71bc77 100644
--- a/src/devices/cpu/z80/z80.lst
+++ b/src/devices/cpu/z80/z80.lst
@@ -50,6 +50,10 @@ macro rop
+ 2
PC++; R++; Q = QT; QT = YF | XF;
+macro r800:rop
+ m_m1_cycles !! TDAT8 = opcode_read();
+ PC++; R++; Q = QT; QT = YF | XF;
+
macro arg
m_memrq_cycles !! TDAT8 = arg_read();
PC++;
@@ -98,6 +102,12 @@ macro jr
5 * call nomreq_addr
PC += (s8)TDAT8; WZ = PC;
+macro r800:jr
+ call arg
+ TADR = PCD-1;
+ + 1
+ PC += (s8)TDAT8; WZ = PC;
+
macro jr_cond
if (TDAT8) {
call jr
@@ -113,6 +123,14 @@ macro arg16_call
call wm16_sp
PCD = m_ea;
+macro r800:arg16_call
+ call arg16
+ m_ea = TDAT; TADR = PCD-1;
+ call nomreq_addr
+ WZ = m_ea; TDAT = PC;
+ call wm16_sp
+ PCD = m_ea;
+
macro call_cond
if (TDAT8) {
call arg16_call
@@ -151,18 +169,30 @@ macro ld_r_a
call nomreq_ir 1
m_r = A; m_r2 = A & 0x80; // keep bit 7 of r
+macro r800:ld_r_a
+ m_r = A; m_r2 = A & 0x80; // keep bit 7 of r
+
macro ld_a_r
call nomreq_ir 1
A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+macro r800:ld_a_r
+ A = (m_r & 0x7f) | m_r2; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+
macro ld_i_a
call nomreq_ir 1
m_i = A;
+macro r800:ld_i_a
+ m_i = A;
+
macro ld_a_i
call nomreq_ir 1
A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+macro r800:ld_a_i
+ A = m_i; set_f((F & CF) | SZ[A] | (m_iff2 << 2)); m_after_ldair = true;
+
macro rst addr
TDAT = PC;
call push
@@ -201,14 +231,23 @@ macro add16
call nomreq_ir 7
{ 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; }
+macro r800:add16
+ { 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; }
+
macro adc_hl
call nomreq_ir 7
{ 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; }
+macro r800:adc_hl
+ { 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; }
+
macro sbc_hl
call nomreq_ir 7
{ 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; }
+macro r800:sbc_hl
+ { 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; }
+
macro ldi
TADR = HL;
call rm
@@ -217,12 +256,26 @@ macro ldi
2 * call nomreq_addr
set_f(F & (SF | ZF | CF)); if ((A + TDAT8) & 0x02) F |= YF; if ((A + TDAT8) & 0x08) F |= XF; HL++; DE++; BC--; if(BC) F |= VF;
+macro r800:ldi
+ TADR = HL;
+ call rm
+ TADR = DE;
+ call wm
+ call nomreq_addr
+ set_f(F & (SF | ZF | CF)); if ((A + TDAT8) & 0x02) F |= YF; if ((A + TDAT8) & 0x08) F |= XF; HL++; DE++; BC--; if(BC) F |= VF;
+
macro cpi
TADR = HL;
call rm
5 * call nomreq_addr
{ 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; if (res & 0x08) F |= XF; if (BC) F |= VF; }
+macro r800:cpi
+ TADR = HL;
+ call rm
+ call nomreq_addr
+ { 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; if (res & 0x08) F |= XF; if (BC) F |= VF; }
+
macro ini
call nomreq_ir 1
TADR = BC;
@@ -231,6 +284,13 @@ macro ini
call wm
{ 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; }
+macro r800:ini
+ TADR = BC;
+ call in
+ WZ = BC + 1; B--; TADR = HL;
+ call wm
+ { 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; }
+
macro outi
call nomreq_ir 1
TADR = HL;
@@ -239,6 +299,13 @@ macro outi
call out
{ 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; }
+macro r800:outi
+ TADR = HL;
+ call rm
+ B--; WZ = BC + 1; TADR = BC;
+ call out
+ { 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; }
+
macro ldd
TADR = HL;
call rm
@@ -247,6 +314,14 @@ macro ldd
2 * call nomreq_addr
{ set_f(F & (SF | ZF | CF)); if ((A + TDAT8) & 0x02) F |= YF; if ((A + TDAT8) & 0x08) F |= XF; HL--; DE--; BC--; if (BC) F |= VF; }
+macro r800:ldd
+ TADR = HL;
+ call rm
+ TADR = DE;
+ call wm
+ call nomreq_addr
+ { set_f(F & (SF | ZF | CF)); if ((A + TDAT8) & 0x02) F |= YF; if ((A + TDAT8) & 0x08) F |= XF; HL--; DE--; BC--; if (BC) F |= VF; }
+
macro cpd
TADR = HL;
call rm
@@ -254,6 +329,13 @@ macro cpd
5 * call nomreq_addr
{ 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; if (res & 0x08) F |= XF; if (BC) F |= VF; }
+macro r800:cpd
+ TADR = HL;
+ call rm
+ TADR = HL;
+ call nomreq_addr
+ { 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; if (res & 0x08) F |= XF; if (BC) F |= VF; }
+
macro ind
call nomreq_ir 1
TADR = BC;
@@ -262,6 +344,13 @@ macro ind
call wm
{ 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; }
+macro r800:ind
+ TADR = BC;
+ call in
+ WZ = BC - 1; B--; TADR = HL;
+ call wm
+ { 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; }
+
macro outd
call nomreq_ir 1
TADR = HL;
@@ -270,6 +359,13 @@ macro outd
call out
{ 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; }
+macro r800:outd
+ TADR = HL;
+ call rm
+ B--; WZ = BC - 1; TADR = BC;
+ call out
+ { 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; }
+
macro ldir
call ldi
if (BC != 0) {
@@ -278,6 +374,14 @@ macro ldir
PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
}
+macro r800:ldir
+ call ldi
+ if (BC != 0) {
+ TADR = DE;
+ call nomreq_addr
+ PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
+ }
+
macro cpir
call cpi
if (BC != 0 && !(F & ZF)) {
@@ -286,6 +390,14 @@ macro cpir
PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
}
+macro r800:cpir
+ call cpi
+ call nomreq_addr
+ if (BC != 0 && !(F & ZF)) {
+ TADR = HL;
+ PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
+ }
+
macro inir
call ini
if (B != 0) {
@@ -294,6 +406,15 @@ macro inir
PC -= 2; block_io_interrupted_flags();
}
+macro r800:inir
+ if (B == 1)
+ T(1);
+ call ini
+ if (B != 0) {
+ TADR = HL;
+ PC -= 2; block_io_interrupted_flags();
+ }
+
macro otir
call outi
if (B != 0) {
@@ -302,6 +423,16 @@ macro otir
PC -= 2; block_io_interrupted_flags();
}
+macro r800:otir
+ if (B == 1)
+ T(1);
+ call outi
+ if (B != 0) {
+ TADR = BC;
+ 5 * call nomreq_addr
+ PC -= 2; block_io_interrupted_flags();
+ }
+
macro lddr
call ldd
if (BC != 0) {
@@ -310,6 +441,14 @@ macro lddr
PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
}
+macro r800:lddr
+ call ldd
+ if (BC != 0) {
+ TADR = DE;
+ call nomreq_addr
+ PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
+ }
+
macro cpdr
call cpd
if (BC != 0 && !(F & ZF)) {
@@ -318,6 +457,14 @@ macro cpdr
PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
}
+macro r800:cpdr
+ call cpd
+ call nomreq_addr
+ if (BC != 0 && !(F & ZF)) {
+ TADR = HL;
+ PC -= 2; WZ = PC + 1; F &= ~(YF | XF); F |= (PC >> 8) & (YF | XF);
+ }
+
macro indr
call ind
if (B != 0) {
@@ -326,6 +473,15 @@ macro indr
PC -= 2; block_io_interrupted_flags();
}
+macro r800:indr
+ if (B == 1)
+ T(1);
+ call ind
+ if (B != 0) {
+ TADR = HL;
+ PC -= 2; block_io_interrupted_flags();
+ }
+
macro otdr
call outd
if (B != 0) {
@@ -334,6 +490,15 @@ macro otdr
PC -= 2; block_io_interrupted_flags();
}
+macro r800:otdr
+ if (B == 1)
+ T(1);
+ call outd
+ if (B != 0) {
+ TADR = BC;
+ PC -= 2; block_io_interrupted_flags();
+ }
+
macro jump %opcode
m_ref = 0x%opcode00;
if (true) return;
@@ -6680,6 +6845,1833 @@ edff # DB ED
call rst 0x38
+
+##########################################################
+# R800
+##########################################################
+
+r800:fe00 # illegal
+ illegal_1();
+
+r800:fe01 # illegal
+ illegal_1();
+
+r800:fe02 # illegal
+ illegal_1();
+
+r800:fe03 # illegal
+ illegal_1();
+
+r800:fe04 # illegal
+ illegal_1();
+
+r800:fe05 # illegal
+ illegal_1();
+
+r800:fe07 # illegal
+ illegal_1();
+
+r800:fe08 # illegal
+ illegal_1();
+
+r800:fe09 # illegal
+ illegal_1();
+
+r800:fe0a # illegal
+ illegal_1();
+
+r800:fe0b # illegal
+ illegal_1();
+
+r800:fe0c # illegal
+ illegal_1();
+
+r800:fe0d # illegal
+ illegal_1();
+
+r800:fe0f # illegal
+ illegal_1();
+
+r800:fe10 # illegal
+ illegal_1();
+
+r800:fe11 # illegal
+ illegal_1();
+
+r800:fe12 # illegal
+ illegal_1();
+
+r800:fe13 # illegal
+ illegal_1();
+
+r800:fe14 # illegal
+ illegal_1();
+
+r800:fe15 # illegal
+ illegal_1();
+
+r800:fe17 # illegal
+ illegal_1();
+
+r800:fe18 # illegal
+ illegal_1();
+
+r800:fe19 # illegal
+ illegal_1();
+
+r800:fe1a # illegal
+ illegal_1();
+
+r800:fe1b # illegal
+ illegal_1();
+
+r800:fe1c # illegal
+ illegal_1();
+
+r800:fe1d # illegal
+ illegal_1();
+
+r800:fe1f # illegal
+ illegal_1();
+
+r800:fe20 # illegal
+ illegal_1();
+
+r800:fe21 # illegal
+ illegal_1();
+
+r800:fe22 # illegal
+ illegal_1();
+
+r800:fe23 # illegal
+ illegal_1();
+
+r800:fe24 # illegal
+ illegal_1();
+
+r800:fe25 # illegal
+ illegal_1();
+
+r800:fe27 # illegal
+ illegal_1();
+
+r800:fe28 # illegal
+ illegal_1();
+
+r800:fe29 # illegal
+ illegal_1();
+
+r800:fe2a # illegal
+ illegal_1();
+
+r800:fe2b # illegal
+ illegal_1();
+
+r800:fe2c # illegal
+ illegal_1();
+
+r800:fe2d # illegal
+ illegal_1();
+
+r800:fe2f # illegal
+ illegal_1();
+
+r800:fe30 # illegal
+ illegal_1();
+
+r800:fe31 # illegal
+ illegal_1();
+
+r800:fe32 # illegal
+ illegal_1();
+
+r800:fe33 # illegal
+ illegal_1();
+
+r800:fe34 # illegal
+ illegal_1();
+
+r800:fe35 # illegal
+ illegal_1();
+
+r800:fe37 # illegal
+ illegal_1();
+
+r800:fe38 # illegal
+ illegal_1();
+
+r800:fe39 # illegal
+ illegal_1();
+
+r800:fe3a # illegal
+ illegal_1();
+
+r800:fe3b # illegal
+ illegal_1();
+
+r800:fe3c # illegal
+ illegal_1();
+
+r800:fe3d # illegal
+ illegal_1();
+
+r800:fe3f # illegal
+ illegal_1();
+
+r800:fe40 # illegal
+ illegal_1();
+
+r800:fe41 # illegal
+ illegal_1();
+
+r800:fe42 # illegal
+ illegal_1();
+
+r800:fe43 # illegal
+ illegal_1();
+
+r800:fe44 # illegal
+ illegal_1();
+
+r800:fe45 # illegal
+ illegal_1();
+
+r800:fe47 # illegal
+ illegal_1();
+
+r800:fe48 # illegal
+ illegal_1();
+
+r800:fe49 # illegal
+ illegal_1();
+
+r800:fe4a # illegal
+ illegal_1();
+
+r800:fe4b # illegal
+ illegal_1();
+
+r800:fe4c # illegal
+ illegal_1();
+
+r800:fe4d # illegal
+ illegal_1();
+
+r800:fe4f # illegal
+ illegal_1();
+
+r800:fe50 # illegal
+ illegal_1();
+
+r800:fe51 # illegal
+ illegal_1();
+
+r800:fe52 # illegal
+ illegal_1();
+
+r800:fe53 # illegal
+ illegal_1();
+
+r800:fe54 # illegal
+ illegal_1();
+
+r800:fe55 # illegal
+ illegal_1();
+
+r800:fe57 # illegal
+ illegal_1();
+
+r800:fe58 # illegal
+ illegal_1();
+
+r800:fe59 # illegal
+ illegal_1();
+
+r800:fe5a # illegal
+ illegal_1();
+
+r800:fe5b # illegal
+ illegal_1();
+
+r800:fe5c # illegal
+ illegal_1();
+
+r800:fe5d # illegal
+ illegal_1();
+
+r800:fe5f # illegal
+ illegal_1();
+
+r800:fe60 # illegal
+ illegal_1();
+
+r800:fe61 # illegal
+ illegal_1();
+
+r800:fe62 # illegal
+ illegal_1();
+
+r800:fe63 # illegal
+ illegal_1();
+
+r800:fe64 # illegal
+ illegal_1();
+
+r800:fe65 # illegal
+ illegal_1();
+
+r800:fe67 # illegal
+ illegal_1();
+
+r800:fe68 # illegal
+ illegal_1();
+
+r800:fe69 # illegal
+ illegal_1();
+
+r800:fe6a # illegal
+ illegal_1();
+
+r800:fe6b # illegal
+ illegal_1();
+
+r800:fe6c # illegal
+ illegal_1();
+
+r800:fe6d # illegal
+ illegal_1();
+
+r800:fe6f # illegal
+ illegal_1();
+
+r800:fe70 # illegal
+ illegal_1();
+
+r800:fe71 # illegal
+ illegal_1();
+
+r800:fe72 # illegal
+ illegal_1();
+
+r800:fe73 # illegal
+ illegal_1();
+
+r800:fe74 # illegal
+ illegal_1();
+
+r800:fe75 # illegal
+ illegal_1();
+
+r800:fe77 # illegal
+ illegal_1();
+
+r800:fe78 # illegal
+ illegal_1();
+
+r800:fe79 # illegal
+ illegal_1();
+
+r800:fe7a # illegal
+ illegal_1();
+
+r800:fe7b # illegal
+ illegal_1();
+
+r800:fe7c # illegal
+ illegal_1();
+
+r800:fe7d # illegal
+ illegal_1();
+
+r800:fe7f # illegal
+ illegal_1();
+
+r800:fe80 # illegal
+ illegal_1();
+
+r800:fe81 # illegal
+ illegal_1();
+
+r800:fe82 # illegal
+ illegal_1();
+
+r800:fe83 # illegal
+ illegal_1();
+
+r800:fe84 # illegal
+ illegal_1();
+
+r800:fe85 # illegal
+ illegal_1();
+
+r800:fe87 # illegal
+ illegal_1();
+
+r800:fe88 # illegal
+ illegal_1();
+
+r800:fe89 # illegal
+ illegal_1();
+
+r800:fe8a # illegal
+ illegal_1();
+
+r800:fe8b # illegal
+ illegal_1();
+
+r800:fe8c # illegal
+ illegal_1();
+
+r800:fe8d # illegal
+ illegal_1();
+
+r800:fe8f # illegal
+ illegal_1();
+
+r800:fe90 # illegal
+ illegal_1();
+
+r800:fe91 # illegal
+ illegal_1();
+
+r800:fe92 # illegal
+ illegal_1();
+
+r800:fe93 # illegal
+ illegal_1();
+
+r800:fe94 # illegal
+ illegal_1();
+
+r800:fe95 # illegal
+ illegal_1();
+
+r800:fe97 # illegal
+ illegal_1();
+
+r800:fe98 # illegal
+ illegal_1();
+
+r800:fe99 # illegal
+ illegal_1();
+
+r800:fe9a # illegal
+ illegal_1();
+
+r800:fe9b # illegal
+ illegal_1();
+
+r800:fe9c # illegal
+ illegal_1();
+
+r800:fe9d # illegal
+ illegal_1();
+
+r800:fe9f # illegal
+ illegal_1();
+
+r800:fea0 # illegal
+ illegal_1();
+
+r800:fea1 # illegal
+ illegal_1();
+
+r800:fea2 # illegal
+ illegal_1();
+
+r800:fea3 # illegal
+ illegal_1();
+
+r800:fea4 # illegal
+ illegal_1();
+
+r800:fea5 # illegal
+ illegal_1();
+
+r800:fea7 # illegal
+ illegal_1();
+
+r800:fea8 # illegal
+ illegal_1();
+
+r800:fea9 # illegal
+ illegal_1();
+
+r800:feaa # illegal
+ illegal_1();
+
+r800:feab # illegal
+ illegal_1();
+
+r800:feac # illegal
+ illegal_1();
+
+r800:fead # illegal
+ illegal_1();
+
+r800:feaf # illegal
+ illegal_1();
+
+r800:feb0 # illegal
+ illegal_1();
+
+r800:feb1 # illegal
+ illegal_1();
+
+r800:feb2 # illegal
+ illegal_1();
+
+r800:feb3 # illegal
+ illegal_1();
+
+r800:feb4 # illegal
+ illegal_1();
+
+r800:feb5 # illegal
+ illegal_1();
+
+r800:feb7 # illegal
+ illegal_1();
+
+r800:feb8 # illegal
+ illegal_1();
+
+r800:feb9 # illegal
+ illegal_1();
+
+r800:feba # illegal
+ illegal_1();
+
+r800:febb # illegal
+ illegal_1();
+
+r800:febc # illegal
+ illegal_1();
+
+r800:febd # illegal
+ illegal_1();
+
+r800:febf # illegal
+ illegal_1();
+
+r800:fec0 # illegal
+ illegal_1();
+
+r800:fec1 # illegal
+ illegal_1();
+
+r800:fec2 # illegal
+ illegal_1();
+
+r800:fec3 # illegal
+ illegal_1();
+
+r800:fec4 # illegal
+ illegal_1();
+
+r800:fec5 # illegal
+ illegal_1();
+
+r800:fec7 # illegal
+ illegal_1();
+
+r800:fec8 # illegal
+ illegal_1();
+
+r800:fec9 # illegal
+ illegal_1();
+
+r800:feca # illegal
+ illegal_1();
+
+r800:fecb # illegal
+ illegal_1();
+
+r800:fecc # illegal
+ illegal_1();
+
+r800:fecd # illegal
+ illegal_1();
+
+r800:fecf # illegal
+ illegal_1();
+
+r800:fed0 # illegal
+ illegal_1();
+
+r800:fed1 # illegal
+ illegal_1();
+
+r800:fed2 # illegal
+ illegal_1();
+
+r800:fed3 # illegal
+ illegal_1();
+
+r800:fed4 # illegal
+ illegal_1();
+
+r800:fed5 # illegal
+ illegal_1();
+
+r800:fed7 # illegal
+ illegal_1();
+
+r800:fed8 # illegal
+ illegal_1();
+
+r800:fed9 # illegal
+ illegal_1();
+
+r800:feda # illegal
+ illegal_1();
+
+r800:fedb # illegal
+ illegal_1();
+
+r800:fedc # illegal
+ illegal_1();
+
+r800:fedd # illegal
+ illegal_1();
+
+r800:fedf # illegal
+ illegal_1();
+
+r800:fee0 # illegal
+ illegal_1();
+
+r800:fee1 # illegal
+ illegal_1();
+
+r800:fee2 # illegal
+ illegal_1();
+
+r800:fee3 # illegal
+ illegal_1();
+
+r800:fee4 # illegal
+ illegal_1();
+
+r800:fee5 # illegal
+ illegal_1();
+
+r800:fee7 # illegal
+ illegal_1();
+
+r800:fee8 # illegal
+ illegal_1();
+
+r800:fee9 # illegal
+ illegal_1();
+
+r800:feea # illegal
+ illegal_1();
+
+r800:feeb # illegal
+ illegal_1();
+
+r800:feec # illegal
+ illegal_1();
+
+r800:feed # illegal
+ illegal_1();
+
+r800:feef # illegal
+ illegal_1();
+
+r800:fef0 # illegal
+ illegal_1();
+
+r800:fef1 # illegal
+ illegal_1();
+
+r800:fef2 # illegal
+ illegal_1();
+
+r800:fef3 # illegal
+ illegal_1();
+
+r800:fef4 # illegal
+ illegal_1();
+
+r800:fef5 # illegal
+ illegal_1();
+
+r800:fef7 # illegal
+ illegal_1();
+
+r800:fef8 # illegal
+ illegal_1();
+
+r800:fef9 # illegal
+ illegal_1();
+
+r800:fefa # illegal
+ illegal_1();
+
+r800:fefb # illegal
+ illegal_1();
+
+r800:fefc # illegal
+ illegal_1();
+
+r800:fefd # illegal
+ illegal_1();
+
+r800:feff # illegal
+ illegal_1();
+
+r800:cb30 # SLL B
+ B = r800_sll(B);
+
+r800:cb31 # SLL C
+ C = r800_sll(C);
+
+r800:cb32 # SLL D
+ D = r800_sll(D);
+
+r800:cb33 # SLL E
+ E = r800_sll(E);
+
+r800:cb34 # SLL H
+ H = r800_sll(H);
+
+r800:cb35 # SLL L
+ L = r800_sll(L);
+
+r800:cb36 # SLL (HL)
+ TADR = HL;
+ call rm_reg
+ TDAT8 = r800_sll(TDAT8);
+ call wm
+
+r800:cb37 # SLL A
+ A = r800_sll(A);
+
+r800:dd00 # illegal
+ illegal_1();
+
+r800:dd01 # illegal
+ illegal_1();
+
+r800:dd02 # illegal
+ illegal_1();
+
+r800:dd03 # illegal
+ illegal_1();
+
+r800:dd04 # illegal
+ illegal_1();
+
+r800:dd05 # illegal
+ illegal_1();
+
+r800:dd06 # illegal
+ illegal_1();
+
+r800:dd07 # illegal
+ illegal_1();
+
+r800:dd08 # illegal
+ illegal_1();
+
+r800:dd0a # illegal
+ illegal_1();
+
+r800:dd0b # illegal
+ illegal_1();
+
+r800:dd0c # illegal
+ illegal_1();
+
+r800:dd0d # illegal
+ illegal_1();
+
+r800:dd0e # illegal
+ illegal_1();
+
+r800:dd0f # illegal
+ illegal_1();
+
+r800:dd10 # illegal
+ illegal_1();
+
+r800:dd11 # illegal
+ illegal_1();
+
+r800:dd12 # illegal
+ illegal_1();
+
+r800:dd13 # illegal
+ illegal_1();
+
+r800:dd14 # illegal
+ illegal_1();
+
+r800:dd15 # illegal
+ illegal_1();
+
+r800:dd16 # illegal
+ illegal_1();
+
+r800:dd17 # illegal
+ illegal_1();
+
+r800:dd18 # illegal
+ illegal_1();
+
+r800:dd1a # illegal
+ illegal_1();
+
+r800:dd1b # illegal
+ illegal_1();
+
+r800:dd1c # illegal
+ illegal_1();
+
+r800:dd1d # illegal
+ illegal_1();
+
+r800:dd1e # illegal
+ illegal_1();
+
+r800:dd1f # illegal
+ illegal_1();
+
+r800:dd20 # illegal
+ illegal_1();
+
+r800:dd27 # illegal
+ illegal_1();
+
+r800:dd28 # illegal
+ illegal_1();
+
+r800:dd2f # illegal
+ illegal_1();
+
+r800:dd30 # illegal
+ illegal_1();
+
+r800:dd31 # illegal
+ illegal_1();
+
+r800:dd32 # illegal
+ illegal_1();
+
+r800:dd33 # illegal
+ illegal_1();
+
+r800:dd37 # illegal
+ illegal_1();
+
+r800:dd38 # illegal
+ illegal_1();
+
+r800:dd3a # illegal
+ illegal_1();
+
+r800:dd3b # illegal
+ illegal_1();
+
+r800:dd3c # illegal
+ illegal_1();
+
+r800:dd3d # illegal
+ illegal_1();
+
+r800:dd3e # illegal
+ illegal_1();
+
+r800:dd3f # illegal
+ illegal_1();
+
+r800:dd40 # illegal
+ illegal_1();
+
+r800:dd41 # illegal
+ illegal_1();
+
+r800:dd42 # illegal
+ illegal_1();
+
+r800:dd43 # illegal
+ illegal_1();
+
+r800:dd47 # illegal
+ illegal_1();
+
+r800:dd48 # illegal
+ illegal_1();
+
+r800:dd49 # illegal
+ illegal_1();
+
+r800:dd4a # illegal
+ illegal_1();
+
+r800:dd4b # illegal
+ illegal_1();
+
+r800:dd4f # illegal
+ illegal_1();
+
+r800:dd50 # illegal
+ illegal_1();
+
+r800:dd51 # illegal
+ illegal_1();
+
+r800:dd52 # illegal
+ illegal_1();
+
+r800:dd53 # illegal
+ illegal_1();
+
+r800:dd57 # illegal
+ illegal_1();
+
+r800:dd58 # illegal
+ illegal_1();
+
+r800:dd59 # illegal
+ illegal_1();
+
+r800:dd5a # illegal
+ illegal_1();
+
+r800:dd5b # illegal
+ illegal_1();
+
+r800:dd5f # illegal
+ illegal_1();
+
+r800:dd76 # illegal
+ illegal_1();
+
+r800:dd78 # illegal
+ illegal_1();
+
+r800:dd79 # illegal
+ illegal_1();
+
+r800:dd7a # illegal
+ illegal_1();
+
+r800:dd7b # illegal
+ illegal_1();
+
+r800:dd7f # illegal
+ illegal_1();
+
+r800:dd80 # illegal
+ illegal_1();
+
+r800:dd81 # illegal
+ illegal_1();
+
+r800:dd82 # illegal
+ illegal_1();
+
+r800:dd83 # illegal
+ illegal_1();
+
+r800:dd87 # illegal
+ illegal_1();
+
+r800:dd88 # illegal
+ illegal_1();
+
+r800:dd89 # illegal
+ illegal_1();
+
+r800:dd8a # illegal
+ illegal_1();
+
+r800:dd8b # illegal
+ illegal_1();
+
+r800:dd8f # illegal
+ illegal_1();
+
+r800:dd90 # illegal
+ illegal_1();
+
+r800:dd91 # illegal
+ illegal_1();
+
+r800:dd92 # illegal
+ illegal_1();
+
+r800:dd93 # illegal
+ illegal_1();
+
+r800:dd97 # illegal
+ illegal_1();
+
+r800:dd98 # illegal
+ illegal_1();
+
+r800:dd99 # illegal
+ illegal_1();
+
+r800:dd9a # illegal
+ illegal_1();
+
+r800:dd9b # illegal
+ illegal_1();
+
+r800:dd9f # illegal
+ illegal_1();
+
+r800:dda0 # illegal
+ illegal_1();
+
+r800:dda1 # illegal
+ illegal_1();
+
+r800:dda2 # illegal
+ illegal_1();
+
+r800:dda3 # illegal
+ illegal_1();
+
+r800:dda7 # illegal
+ illegal_1();
+
+r800:dda8 # illegal
+ illegal_1();
+
+r800:dda9 # illegal
+ illegal_1();
+
+r800:ddaa # illegal
+ illegal_1();
+
+r800:ddab # illegal
+ illegal_1();
+
+r800:ddaf # illegal
+ illegal_1();
+
+r800:ddb0 # illegal
+ illegal_1();
+
+r800:ddb1 # illegal
+ illegal_1();
+
+r800:ddb2 # illegal
+ illegal_1();
+
+r800:ddb3 # illegal
+ illegal_1();
+
+r800:ddb7 # illegal
+ illegal_1();
+
+r800:ddb8 # illegal
+ illegal_1();
+
+r800:ddb9 # illegal
+ illegal_1();
+
+r800:ddba # illegal
+ illegal_1();
+
+r800:ddbb # illegal
+ illegal_1();
+
+r800:ddbf # illegal
+ illegal_1();
+
+r800:ddc0 # illegal
+ illegal_1();
+
+r800:ddc1 # illegal
+ illegal_1();
+
+r800:ddc2 # illegal
+ illegal_1();
+
+r800:ddc3 # illegal
+ illegal_1();
+
+r800:ddc4 # illegal
+ illegal_1();
+
+r800:ddc5 # illegal
+ illegal_1();
+
+r800:ddc6 # illegal
+ illegal_1();
+
+r800:ddc7 # illegal
+ illegal_1();
+
+r800:ddc8 # illegal
+ illegal_1();
+
+r800:ddc9 # illegal
+ illegal_1();
+
+r800:ddca # illegal
+ illegal_1();
+
+r800:ddcc # illegal
+ illegal_1();
+
+r800:ddcd # illegal
+ illegal_1();
+
+r800:ddce # illegal
+ illegal_1();
+
+r800:ddcf # illegal
+ illegal_1();
+
+r800:ddd0 # illegal
+ illegal_1();
+
+r800:ddd1 # illegal
+ illegal_1();
+
+r800:ddd2 # illegal
+ illegal_1();
+
+r800:ddd3 # illegal
+ illegal_1();
+
+r800:ddd4 # illegal
+ illegal_1();
+
+r800:ddd5 # illegal
+ illegal_1();
+
+r800:ddd6 # illegal
+ illegal_1();
+
+r800:ddd7 # illegal
+ illegal_1();
+
+r800:ddd8 # illegal
+ illegal_1();
+
+r800:ddd9 # illegal
+ illegal_1();
+
+r800:ddda # illegal
+ illegal_1();
+
+r800:dddb # illegal
+ illegal_1();
+
+r800:dddc # illegal
+ illegal_1();
+
+r800:dddd # illegal
+ illegal_1();
+
+r800:ddde # illegal
+ illegal_1();
+
+r800:dddf # illegal
+ illegal_1();
+
+r800:dde0 # illegal
+ illegal_1();
+
+r800:dde2 # illegal
+ illegal_1();
+
+r800:dde4 # illegal
+ illegal_1();
+
+r800:dde6 # illegal
+ illegal_1();
+
+r800:dde7 # illegal
+ illegal_1();
+
+r800:dde8 # illegal
+ illegal_1();
+
+r800:ddea # illegal
+ illegal_1();
+
+r800:ddeb # illegal
+ illegal_1();
+
+r800:ddec # illegal
+ illegal_1();
+
+r800:dded # illegal
+ illegal_1();
+
+r800:ddee # illegal
+ illegal_1();
+
+r800:ddef # illegal
+ illegal_1();
+
+r800:ddf0 # illegal
+ illegal_1();
+
+r800:ddf1 # illegal
+ illegal_1();
+
+r800:ddf2 # illegal
+ illegal_1();
+
+r800:ddf3 # illegal
+ illegal_1();
+
+r800:ddf4 # illegal
+ illegal_1();
+
+r800:ddf5 # illegal
+ illegal_1();
+
+r800:ddf6 # illegal
+ illegal_1();
+
+r800:ddf7 # illegal
+ illegal_1();
+
+r800:ddf8 # illegal
+ illegal_1();
+
+r800:ddfa # illegal
+ illegal_1();
+
+r800:ddfb # illegal
+ illegal_1();
+
+r800:ddfc # illegal
+ illegal_1();
+
+r800:ddfd # illegal
+ illegal_1();
+
+r800:ddfe # illegal
+ illegal_1();
+
+r800:ddff # illegal
+ illegal_1();
+
+r800:fd00 # illegal
+ illegal_1();
+
+r800:fd01 # illegal
+ illegal_1();
+
+r800:fd02 # illegal
+ illegal_1();
+
+r800:fd03 # illegal
+ illegal_1();
+
+r800:fd04 # illegal
+ illegal_1();
+
+r800:fd05 # illegal
+ illegal_1();
+
+r800:fd06 # illegal
+ illegal_1();
+
+r800:fd07 # illegal
+ illegal_1();
+
+r800:fd08 # illegal
+ illegal_1();
+
+r800:fd0a # illegal
+ illegal_1();
+
+r800:fd0b # illegal
+ illegal_1();
+
+r800:fd0c # illegal
+ illegal_1();
+
+r800:fd0d # illegal
+ illegal_1();
+
+r800:fd0e # illegal
+ illegal_1();
+
+r800:fd0f # illegal
+ illegal_1();
+
+r800:fd10 # illegal
+ illegal_1();
+
+r800:fd11 # illegal
+ illegal_1();
+
+r800:fd12 # illegal
+ illegal_1();
+
+r800:fd13 # illegal
+ illegal_1();
+
+r800:fd14 # illegal
+ illegal_1();
+
+r800:fd15 # illegal
+ illegal_1();
+
+r800:fd16 # illegal
+ illegal_1();
+
+r800:fd17 # illegal
+ illegal_1();
+
+r800:fd18 # illegal
+ illegal_1();
+
+r800:fd1a # illegal
+ illegal_1();
+
+r800:fd1b # illegal
+ illegal_1();
+
+r800:fd1c # illegal
+ illegal_1();
+
+r800:fd1d # illegal
+ illegal_1();
+
+r800:fd1e # illegal
+ illegal_1();
+
+r800:fd1f # illegal
+ illegal_1();
+
+r800:fd20 # illegal
+ illegal_1();
+
+r800:fd27 # illegal
+ illegal_1();
+
+r800:fd28 # illegal
+ illegal_1();
+
+r800:fd2f # illegal
+ illegal_1();
+
+r800:fd30 # illegal
+ illegal_1();
+
+r800:fd31 # illegal
+ illegal_1();
+
+r800:fd32 # illegal
+ illegal_1();
+
+r800:fd33 # illegal
+ illegal_1();
+
+r800:fd37 # illegal
+ illegal_1();
+
+r800:fd38 # illegal
+ illegal_1();
+
+r800:fd3a # illegal
+ illegal_1();
+
+r800:fd3b # illegal
+ illegal_1();
+
+r800:fd3c # illegal
+ illegal_1();
+
+r800:fd3d # illegal
+ illegal_1();
+
+r800:fd3e # illegal
+ illegal_1();
+
+r800:fd3f # illegal
+ illegal_1();
+
+r800:fd40 # illegal
+ illegal_1();
+
+r800:fd41 # illegal
+ illegal_1();
+
+r800:fd42 # illegal
+ illegal_1();
+
+r800:fd43 # illegal
+ illegal_1();
+
+r800:fd47 # illegal
+ illegal_1();
+
+r800:fd48 # illegal
+ illegal_1();
+
+r800:fd49 # illegal
+ illegal_1();
+
+r800:fd4a # illegal
+ illegal_1();
+
+r800:fd4b # illegal
+ illegal_1();
+
+r800:fd4f # illegal
+ illegal_1();
+
+r800:fd50 # illegal
+ illegal_1();
+
+r800:fd51 # illegal
+ illegal_1();
+
+r800:fd52 # illegal
+ illegal_1();
+
+r800:fd53 # illegal
+ illegal_1();
+
+r800:fd57 # illegal
+ illegal_1();
+
+r800:fd58 # illegal
+ illegal_1();
+
+r800:fd59 # illegal
+ illegal_1();
+
+r800:fd5a # illegal
+ illegal_1();
+
+r800:fd5b # illegal
+ illegal_1();
+
+r800:fd5f # illegal
+ illegal_1();
+
+r800:fd76 # illegal
+ illegal_1();
+
+r800:fd78 # illegal
+ illegal_1();
+
+r800:fd79 # illegal
+ illegal_1();
+
+r800:fd7a # illegal
+ illegal_1();
+
+r800:fd7b # illegal
+ illegal_1();
+
+r800:fd7f # illegal
+ illegal_1();
+
+r800:fd80 # illegal
+ illegal_1();
+
+r800:fd81 # illegal
+ illegal_1();
+
+r800:fd82 # illegal
+ illegal_1();
+
+r800:fd83 # illegal
+ illegal_1();
+
+r800:fd87 # illegal
+ illegal_1();
+
+r800:fd88 # illegal
+ illegal_1();
+
+r800:fd89 # illegal
+ illegal_1();
+
+r800:fd8a # illegal
+ illegal_1();
+
+r800:fd8b # illegal
+ illegal_1();
+
+r800:fd8f # illegal
+ illegal_1();
+
+r800:fd90 # illegal
+ illegal_1();
+
+r800:fd91 # illegal
+ illegal_1();
+
+r800:fd92 # illegal
+ illegal_1();
+
+r800:fd93 # illegal
+ illegal_1();
+
+r800:fd97 # illegal
+ illegal_1();
+
+r800:fd98 # illegal
+ illegal_1();
+
+r800:fd99 # illegal
+ illegal_1();
+
+r800:fd9a # illegal
+ illegal_1();
+
+r800:fd9b # illegal
+ illegal_1();
+
+r800:fd9f # illegal
+ illegal_1();
+
+r800:fda0 # illegal
+ illegal_1();
+
+r800:fda1 # illegal
+ illegal_1();
+
+r800:fda2 # illegal
+ illegal_1();
+
+r800:fda3 # illegal
+ illegal_1();
+
+r800:fda7 # illegal
+ illegal_1();
+
+r800:fda8 # illegal
+ illegal_1();
+
+r800:fda9 # illegal
+ illegal_1();
+
+r800:fdaa # illegal
+ illegal_1();
+
+r800:fdab # illegal
+ illegal_1();
+
+r800:fdaf # illegal
+ illegal_1();
+
+r800:fdb0 # illegal
+ illegal_1();
+
+r800:fdb1 # illegal
+ illegal_1();
+
+r800:fdb2 # illegal
+ illegal_1();
+
+r800:fdb3 # illegal
+ illegal_1();
+
+r800:fdb7 # illegal
+ illegal_1();
+
+r800:fdb8 # illegal
+ illegal_1();
+
+r800:fdb9 # illegal
+ illegal_1();
+
+r800:fdba # illegal
+ illegal_1();
+
+r800:fdbb # illegal
+ illegal_1();
+
+r800:fdbf # illegal
+ illegal_1();
+
+r800:fdc0 # illegal
+ illegal_1();
+
+r800:fdc1 # illegal
+ illegal_1();
+
+r800:fdc2 # illegal
+ illegal_1();
+
+r800:fdc3 # illegal
+ illegal_1();
+
+r800:fdc4 # illegal
+ illegal_1();
+
+r800:fdc5 # illegal
+ illegal_1();
+
+r800:fdc6 # illegal
+ illegal_1();
+
+r800:fdc7 # illegal
+ illegal_1();
+
+r800:fdc8 # illegal
+ illegal_1();
+
+r800:fdc9 # illegal
+ illegal_1();
+
+r800:fdca # illegal
+ illegal_1();
+
+r800:fdcc # illegal
+ illegal_1();
+
+r800:fdcd # illegal
+ illegal_1();
+
+r800:fdce # illegal
+ illegal_1();
+
+r800:fdcf # illegal
+ illegal_1();
+
+r800:fdd0 # illegal
+ illegal_1();
+
+r800:fdd1 # illegal
+ illegal_1();
+
+r800:fdd2 # illegal
+ illegal_1();
+
+r800:fdd3 # illegal
+ illegal_1();
+
+r800:fdd4 # illegal
+ illegal_1();
+
+r800:fdd5 # illegal
+ illegal_1();
+
+r800:fdd6 # illegal
+ illegal_1();
+
+r800:fdd7 # illegal
+ illegal_1();
+
+r800:fdd8 # illegal
+ illegal_1();
+
+r800:fdd9 # illegal
+ illegal_1();
+
+r800:fdda # illegal
+ illegal_1();
+
+r800:fddb # illegal
+ illegal_1();
+
+r800:fddc # illegal
+ illegal_1();
+
+r800:fddd # illegal
+ illegal_1();
+
+r800:fdde # illegal
+ illegal_1();
+
+r800:fddf # illegal
+ illegal_1();
+
+r800:fde0 # illegal
+ illegal_1();
+
+r800:fde2 # illegal
+ illegal_1();
+
+r800:fde4 # illegal
+ illegal_1();
+
+r800:fde6 # illegal
+ illegal_1();
+
+r800:fde7 # illegal
+ illegal_1();
+
+r800:fde8 # illegal
+ illegal_1();
+
+r800:fdea # illegal
+ illegal_1();
+
+r800:fdeb # illegal
+ illegal_1();
+
+r800:fdec # illegal
+ illegal_1();
+
+r800:fded # illegal
+ illegal_1();
+
+r800:fdee # illegal
+ illegal_1();
+
+r800:fdef # illegal
+ illegal_1();
+
+r800:fdf0 # illegal
+ illegal_1();
+
+r800:fdf1 # illegal
+ illegal_1();
+
+r800:fdf2 # illegal
+ illegal_1();
+
+r800:fdf3 # illegal
+ illegal_1();
+
+r800:fdf4 # illegal
+ illegal_1();
+
+r800:fdf5 # illegal
+ illegal_1();
+
+r800:fdf6 # illegal
+ illegal_1();
+
+r800:fdf7 # illegal
+ illegal_1();
+
+r800:fdf8 # illegal
+ illegal_1();
+
+r800:fdfa # illegal
+ illegal_1();
+
+r800:fdfb # illegal
+ illegal_1();
+
+r800:fdfc # illegal
+ illegal_1();
+
+r800:fdfd # illegal
+ illegal_1();
+
+r800:fdfe # illegal
+ illegal_1();
+
+r800:fdff # illegal
+ illegal_1();
+
+r800:ed46 # IM 0
+ m_im = 0; T(1);
+
+r800:ed4c # illegal
+ illegal_2();
+
+r800:ed4e # illegal
+ illegal_2();
+
+r800:ed54 # illegal
+ illegal_2();
+
+r800:ed55 # illegal
+ illegal_2();
+
+r800:ed56 # IM 1
+ m_im = 1; T(1);
+
+r800:ed5c # illegal
+ illegal_2();
+
+r800:ed5d # illegal
+ illegal_2();
+
+r800:ed5e # IM 2
+ m_im = 2; T(1);
+
+r800:ed64 # illegal
+ illegal_2();
+
+r800:ed65 # illegal
+ illegal_2();
+
+r800:ed66 # illegal
+ illegal_2();
+
+r800:ed6c # illegal
+ illegal_2();
+
+r800:ed6e # IM 0
+ m_im = 0; T(1);
+
+# ed70 became legal IN F,(C)
+
+r800:ed71 # illegal
+ illegal_2();
+
+r800:ed74 # illegal
+ illegal_2();
+
+r800:ed75 # illegal
+ illegal_2();
+
+r800:ed76 # illegal
+ illegal_2();
+
+r800:ed7c # illegal
+ illegal_2();
+
+r800:ed7d # illegal
+ illegal_2();
+
+r800:ed7e # illegal
+ illegal_2();
+
+r800:ed7f # illegal
+ illegal_2();
+
+r800:edc1 # MULUB A,B
+ mulub(B); T(12);
+
+r800:edc3 # MULUW HL,BC
+ muluw(BC); T(34);
+
+r800:edc9 # MULUB A,C
+ mulub(C); T(12);
+
+r800:edd1 # MULUB A,D
+ mulub(D); T(12);
+
+r800:edd9 # MULUB A,E
+ mulub(E); T(12);
+
+r800:ede1 # MULUB A,H (undocumented)
+ mulub(H); T(12);
+
+r800:ede9 # MULUB A,L (undocumented)
+ mulub(L); T(12);
+
+r800:edf1 # MULUB A,A (undocumented)
+ mulub(A); T(12);
+
+r800:edf3 # MULUW HL,SP
+ muluw(SP); T(34);
+
+r800:edf9 # MULUB A,A (undocumented)
+ mulub(A); T(12);
+
+r800:00f3 # DI
+ m_iff1 = m_iff2 = 0; T(1);
+
+
+
##########################################################
# Z80N
##########################################################