summaryrefslogtreecommitdiff
path: root/sdas/asz80/z80mch.c
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sdas/asz80/z80mch.c
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sdas/asz80/z80mch.c')
-rw-r--r--sdas/asz80/z80mch.c2266
1 files changed, 2266 insertions, 0 deletions
diff --git a/sdas/asz80/z80mch.c b/sdas/asz80/z80mch.c
new file mode 100644
index 0000000..ad6affd
--- /dev/null
+++ b/sdas/asz80/z80mch.c
@@ -0,0 +1,2266 @@
+/* z80mch.c */
+
+/*
+ * Copyright (C) 1993-2006 Alan R. Baldwin
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ *
+ * Alan R. Baldwin
+ * 721 Berkeley St.
+ * Kent, Ohio 44240
+ */
+
+/*
+ * Extensions: P. Felber
+ * eZ80 port (based on ASxxxx sources): H. Sladky
+ */
+
+#include "asxxxx.h"
+#include "z80.h"
+
+char *cpu = "Zilog Z80 / Hitachi HD64180 / ZX-Next / eZ80";
+char *dsft = "asm";
+
+char imtab[3] = { 0x46, 0x56, 0x5E };
+int mchtyp;
+int allow_undoc;
+
+static int ez80_adl = 0;
+
+/*
+ * Opcode Cycle Definitions
+ */
+#define OPCY_SDP ((char) (0xFF))
+#define OPCY_ERR ((char) (0xFE))
+
+/* OPCY_NONE ((char) (0x80)) */
+/* OPCY_MASK ((char) (0x7F)) */
+
+#define OPCY_CPU ((char) (0xFD))
+
+#define UN ((char) (OPCY_NONE | 0x00))
+#define P2 ((char) (OPCY_NONE | 0x01))
+#define P3 ((char) (OPCY_NONE | 0x02))
+#define P4 ((char) (OPCY_NONE | 0x03))
+#define P5 ((char) (OPCY_NONE | 0x04))
+#define P6 ((char) (OPCY_NONE | 0x05))
+#define P7 ((char) (OPCY_NONE | 0x06))
+
+#define PF ((char) (OPCY_NONE | 0x10))
+
+/*
+ * Z80 Opcode Cycle Pages
+ */
+
+static const char z80pg1[256] = {
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
+/*10*/ 13,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
+/*20*/ 12,10,16, 6, 4, 4, 7, 4,12,11,16, 6, 4, 4, 7, 4,
+/*30*/ 12,10,13, 6,11,11,10, 4,12,11,13, 6, 4, 4, 7, 4,
+/*40*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*50*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*60*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*70*/ 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
+/*80*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*90*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*A0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*B0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*C0*/ 11,10,10,10,17,11, 7,11,11,10,10,P2,17,17, 7,11,
+/*D0*/ 11,10,10,11,17,11, 7,11,11, 4,10,11,17,P3, 7,11,
+/*E0*/ 11,10,10,19,17,11, 7,11,11, 4,10, 4,17,P4, 7,11,
+/*F0*/ 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17,P5, 7,11
+};
+
+static const char z80pg2[256] = { /* P2 == CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*10*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*20*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN, 8, 8, 8, 8, 8, 8,15, 8,
+/*40*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*50*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*60*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*70*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*80*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*90*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*A0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*B0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*C0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*D0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*E0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*F0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8
+};
+
+static const char z80pg3[256] = { /* P3 == DD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,14,20,10,UN,UN,UN,UN,UN,15,20,10,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,23,23,19,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ 19,19,19,19,19,19,UN,19,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P6,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,14,UN,23,UN,15,UN,UN,UN, 8,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN
+};
+
+static const char z80pg4[256] = { /* P4 == ED */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*40*/ 12,12,15,20, 8,14, 8, 9,12,12,15,20,UN,14,UN, 9,
+/*50*/ 12,12,15,20,UN,UN, 8, 9,12,12,15,20,UN,UN, 8, 9,
+/*60*/ 12,12,15,20,UN,UN,UN,18,12,12,15,20,UN,UN,UN,18,
+/*70*/ UN,UN,15,20,UN,UN,UN,UN,12,12,15,20,UN,UN,UN,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*A0*/ 16,16,16,16,UN,UN,UN,UN,16,16,16,16,UN,UN,UN,UN,
+/*B0*/ 21,21,21,21,UN,UN,UN,UN,21,21,21,21,UN,UN,UN,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN
+};
+
+static const char z80pg5[256] = { /* P5 == FD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,14,20,10,UN,UN,UN,UN,UN,15,20,10,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,23,23,19,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ 19,19,19,19,19,19,UN,19,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P7,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,14,UN,23,UN,15,UN,UN,UN, 8,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN
+};
+
+static const char z80pg6[256] = { /* P6 == DD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN
+};
+
+static const char z80pg7[256] = { /* P7 == FD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN
+};
+
+static const char *z80Page[7] = {
+ z80pg1, z80pg2, z80pg3, z80pg4,
+ z80pg5, z80pg6, z80pg7
+};
+
+/*
+ * HD64180 / Z180 Opcode Cycle Pages
+ */
+
+static const char hd64pg1[256] = {
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 3, 9, 7, 4, 4, 4, 6, 3, 4, 7, 6, 4, 4, 4, 6, 3,
+/*10*/ 9, 9, 7, 4, 4, 4, 6, 3, 8, 7, 6, 4, 4, 4, 6, 3,
+/*20*/ 8, 9,16, 4, 4, 4, 6, 4, 8, 7,15, 4, 4, 4, 6, 3,
+/*30*/ 8, 9,13, 4,10,10, 9, 3, 8, 7,12, 4, 4, 4, 6, 3,
+/*40*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*50*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*60*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*70*/ 7, 7, 7, 7, 7, 7, 3, 7, 4, 4, 4, 4, 4, 4, 6, 4,
+/*80*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*90*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*A0*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*B0*/ 4, 4, 4, 4, 4, 4, 6, 4, 4, 4, 4, 4, 4, 4, 6, 4,
+/*C0*/ 10, 9, 9, 9,16,11, 6,11,10, 9, 9,P2,16,16, 6,11,
+/*D0*/ 10, 9, 9,10,16,11, 6,11,10, 3, 9, 9,16,P3, 6,11,
+/*E0*/ 10, 9, 9,16,16,11, 6,11,10, 3, 9, 3,16,P4, 6,11,
+/*F0*/ 10, 9, 9, 3,16,11, 6,11,10, 4, 9, 3,16,P5, 6,11
+};
+
+static const char hd64pg2[256] = { /* P2 == CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*10*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*20*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN, 7, 7, 7, 7, 7, 7,13, 7,
+/*40*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*50*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*60*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*70*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*80*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*90*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*A0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*B0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*C0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*D0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*E0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7,
+/*F0*/ 7, 7, 7, 7, 7, 7,13, 7, 7, 7, 7, 7, 7, 7,13, 7
+};
+
+static const char hd64pg3[256] = { /* P3 == DD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,12,19, 7,UN,UN,UN,UN,UN,10,18, 7,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,18,18,15,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*70*/ 15,15,15,15,15,15,UN,15,UN,UN,UN,UN,UN,UN,14,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P6,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,12,UN,19,UN,14,UN,UN,UN, 6,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN
+};
+
+static const char hd64pg4[256] = { /* P4 == ED */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 12,13,UN,UN, 7,UN,UN,UN,12,13,UN,UN, 7,UN,UN,UN,
+/*10*/ 12,13,UN,UN, 7,UN,UN,UN,12,13,UN,UN, 7,UN,UN,UN,
+/*20*/ 12,13,UN,UN, 7,UN,UN,UN,12,13,UN,UN, 7,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,10,UN,UN,UN,12,13,UN,UN, 7,UN,UN,UN,
+/*40*/ 9,10,10,19, 6,12, 6, 6, 9,10,10,18,17,12,UN, 6,
+/*50*/ 9,10,10,19,UN,UN, 6, 6, 9,10,10,18,17,UN, 6, 6,
+/*60*/ 9,10,10,19, 9,UN,UN,16, 9,10,10,18,17,UN,UN,16,
+/*70*/ UN,10,10,19,12,UN, 8,UN, 9,10,10,18,17,UN,UN,UN,
+/*80*/ UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,
+/*90*/ UN,UN,UN,16,UN,UN,UN,UN,UN,UN,UN,16,UN,UN,UN,UN,
+/*A0*/ 12,12,12,12,UN,UN,UN,UN,12,12,12,12,UN,UN,UN,UN,
+/*B0*/ 14,14,14,14,UN,UN,UN,UN,14,14,14,14,UN,UN,UN,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN
+};
+
+static const char hd64pg5[256] = { /* P5 == FD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,12,19, 7,UN,UN,UN,UN,UN,10,18, 7,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,18,18,15,UN,UN,10,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*70*/ 15,15,15,15,15,15,UN,15,UN,UN,UN,UN,UN,UN,14,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,14,UN,UN,UN,UN,UN,UN,UN,14,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P7,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,12,UN,19,UN,14,UN,UN,UN, 6,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN
+};
+
+static const char hd64pg6[256] = { /* P6 == DD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN
+};
+
+static const char hd64pg7[256] = { /* P7 == FD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN
+};
+
+static const char *hd64Page[7] = {
+ hd64pg1, hd64pg2, hd64pg3, hd64pg4,
+ hd64pg5, hd64pg6, hd64pg7
+};
+
+/*
+ * Z80-ZXN Opcode Cycle Pages
+ */
+
+static const char zxnpg1[256] = {
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 4,10, 7, 6, 4, 4, 7, 4, 4,11, 7, 6, 4, 4, 7, 4,
+/*10*/ 13,10, 7, 6, 4, 4, 7, 4,12,11, 7, 6, 4, 4, 7, 4,
+/*20*/ 12,10,16, 6, 4, 4, 7, 4,12,11,16, 6, 4, 4, 7, 4,
+/*30*/ 12,10,13, 6,11,11,10, 4,12,11,13, 6, 4, 4, 7, 4,
+/*40*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*50*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*60*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*70*/ 7, 7, 7, 7, 7, 7, 4, 7, 4, 4, 4, 4, 4, 4, 7, 4,
+/*80*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*90*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*A0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*B0*/ 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 4, 4, 4, 4, 7, 4,
+/*C0*/ 11,10,10,10,17,11, 7,11,11,10,10,P2,17,17, 7,11,
+/*D0*/ 11,10,10,11,17,11, 7,11,11, 4,10,11,17,P3, 7,11,
+/*E0*/ 11,10,10,19,17,11, 7,11,11, 4,10, 4,17,P4, 7,11,
+/*F0*/ 11,10,10, 4,17,11, 7,11,11, 6,10, 4,17,P5, 7,11
+};
+
+static const char zxnpg2[256] = { /* P2 == CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*10*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*20*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN, 8, 8, 8, 8, 8, 8,15, 8,
+/*40*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*50*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*60*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*70*/ 8, 8, 8, 8, 8, 8,12, 8, 8, 8, 8, 8, 8, 8,12, 8,
+/*80*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*90*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*A0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*B0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*C0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*D0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*E0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8,
+/*F0*/ 8, 8, 8, 8, 8, 8,15, 8, 8, 8, 8, 8, 8, 8,15, 8
+};
+
+static const char zxnpg3[256] = { /* P3 == DD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,14,20,10,UN,UN,UN,UN,UN,15,20,10,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,23,23,19,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ 19,19,19,19,19,19,UN,19,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P6,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,14,UN,23,UN,15,UN,UN,UN, 8,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN
+};
+
+static const char zxnpg4[256] = { /* P4 == ED */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,UN,UN, 8, 8,UN, 8,11,UN,UN,UN,UN,UN,UN,UN,UN,
+/*30*/ 8, 4, 4, 4,12,12,12,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*40*/ 12,12,15,20, 8,14, 8, 9,12,12,15,20,UN,14,UN, 9,
+/*50*/ 12,12,15,20,UN,UN, 8, 9,12,12,15,20,UN,UN, 8, 9,
+/*60*/ 12,12,15,20,UN,UN,UN,18,12,12,15,20,UN,UN,UN,18,
+/*70*/ UN,UN,15,20,UN,UN,UN,UN,12,12,15,20,UN,UN,UN,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,22, 8,UN,UN,UN,UN,
+/*90*/ 16,16,12, 8, 8, 8,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*A0*/ 16,16,16,16,16,UN,UN,UN,16,16,16,16,16,UN,UN,UN,
+/*B0*/ 21,21,21,21,21,UN,21,12,21,21,21,21,21,UN,UN,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN
+};
+
+static const char zxnpg5[256] = { /* P5 == FD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*20*/ UN,14,20,10,UN,UN,UN,UN,UN,15,20,10,UN,UN,UN,UN,
+/*30*/ UN,UN,UN,UN,23,23,19,UN,UN,15,UN,UN,UN,UN,UN,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*70*/ 19,19,19,19,19,19,UN,19,UN,UN,UN,UN,UN,UN,19,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,19,UN,UN,UN,UN,UN,UN,UN,19,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P7,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,14,UN,23,UN,15,UN,UN,UN, 8,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,10,UN,UN,UN,UN,UN,UN
+};
+
+static const char zxnpg6[256] = { /* P6 == DD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN
+};
+
+static const char zxnpg7[256] = { /* P7 == FD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*10*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*20*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*40*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*50*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*60*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*70*/ UN,UN,UN,UN,UN,UN,20,UN,UN,UN,UN,UN,UN,UN,20,UN,
+/*80*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*90*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,23,UN,UN,UN,UN,UN,UN,UN,23,UN
+};
+
+static const char *zxnPage[7] = {
+ zxnpg1, zxnpg2, zxnpg3, zxnpg4,
+ zxnpg5, zxnpg6, zxnpg7
+};
+
+/*
+ * EZ80 Opcode Cycle Pages
+ */
+
+static const char ez80pg1[256] = {
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 1, 3, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1,
+/*10*/ 4, 3, 2, 1, 1, 1, 2, 1, 3, 1, 2, 1, 1, 1, 2, 1,
+/*20*/ 3, 3, 7, 1, 1, 1, 2, 1, 3, 1, 5, 1, 1, 1, 2, 1,
+/*30*/ 3, 3, 4, 1, 4, 4, 3, 1, 3, 1, 4, 1, 1, 1, 2, 1,
+/*40*/ PF, 1, 1, 1, 1, 1, 2, 1, 1,PF, 1, 1, 1, 1, 2, 1,
+/*50*/ 1, 1,PF, 1, 1, 1, 2, 1, 1, 1, 1,PF, 1, 1, 2, 1,
+/*60*/ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/*70*/ 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1,
+/*80*/ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/*90*/ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/*A0*/ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/*B0*/ 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1,
+/*C0*/ 6, 3, 4, 4, 6, 3, 2, 5, 6, 5, 4,P2, 6, 5, 2, 5,
+/*D0*/ 6, 3, 4, 3, 6, 3, 2, 5, 6, 1, 4, 3, 6,P3, 2, 5,
+/*E0*/ 6, 3, 4, 5, 6, 3, 2, 5, 6, 3, 4, 1, 6,P4, 2, 5,
+/*F0*/ 6, 3, 4, 1, 6, 3, 2, 5, 6, 1, 4, 1, 6,P5, 2, 5
+};
+
+static const char ez80pg2[256] = { /* P2 == CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2,
+/*10*/ 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2,
+/*20*/ 2, 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 5, 2,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN, 2, 2, 2, 2, 2, 2, 5, 2,
+/*40*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*50*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*60*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*70*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*80*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*90*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*A0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*B0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*C0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*D0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*E0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2,
+/*F0*/ 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2
+};
+
+static const char ez80pg3[256] = { /* P3 == DD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN, 5,UN, 2,UN,UN,UN,UN,UN, 5,
+/*10*/ UN,UN,UN,UN,UN,UN,UN, 5,UN, 2,UN,UN,UN,UN,UN, 5,
+/*20*/ UN, 4, 6, 2, 2, 2, 2, 5,UN, 2, 6, 2, 2, 2, 2, 5,
+/*30*/ UN, 5,UN,UN, 6, 6, 5, 5,UN, 2,UN,UN,UN,UN, 5, 5,
+/*40*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*50*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*60*/ 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2,
+/*70*/ 4, 4, 4, 4, 4, 4,UN, 4,UN,UN,UN,UN, 2, 2, 4,UN,
+/*80*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*90*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*A0*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*B0*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P6,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN, 4,UN, 6,UN, 4,UN,UN,UN, 4,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN, 2,UN,UN,UN,UN,UN,UN
+};
+
+static const char ez80pg4[256] = { /* P4 == ED */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ 4, 4, 3, 3, 2,UN,UN, 4, 4, 4,UN,UN, 2,UN,UN, 4,
+/*10*/ 4, 4, 3, 3, 2,UN,UN, 4, 4, 4,UN,UN, 2,UN,UN, 4,
+/*20*/ 4, 4, 3, 3, 2,UN,UN, 4, 4, 4,UN,UN, 2,UN,UN, 4,
+/*30*/ UN, 4, 3, 3, 3,UN,UN, 4, 4, 4,UN,UN, 2,UN, 4, 4,
+/*40*/ 3, 3, 2, 6, 2, 6, 2, 2, 3, 3, 2, 6, 6, 6,UN, 2,
+/*50*/ 3, 3, 2, 6, 3, 3, 2, 2, 3, 3, 2, 6, 6,UN, 2, 2,
+/*60*/ 3, 3, 2,UN, 3, 5, 5, 5, 3, 3, 2,UN, 6, 2, 2, 5,
+/*70*/ UN,UN, 2, 6, 4,UN, 2,UN, 3, 3, 2, 5, 6, 2, 2,UN,
+/*80*/ UN,UN, 5, 5, 5,UN,UN,UN,UN,UN, 5, 5, 5,UN,UN,UN,
+/*90*/ UN,UN, 2, 2, 2,UN,UN,UN,UN,UN, 2, 2, 2,UN,UN,UN,
+/*A0*/ 5, 3, 5, 5, 5,UN,UN,UN, 5, 3, 5, 5, 5,UN,UN,UN,
+/*B0*/ 2, 1, 2, 2, 2,UN,UN,UN, 2, 1, 2, 2, 2,UN,UN,UN,
+/*C0*/ UN,UN, 2, 3,UN,UN,UN, 2,UN,UN, 2, 2,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN, 2,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN
+};
+
+static const char ez80pg5[256] = { /* P5 == FD */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN,UN, 5,UN, 2,UN,UN,UN,UN,UN, 5,
+/*10*/ UN,UN,UN,UN,UN,UN,UN, 5,UN, 2,UN,UN,UN,UN,UN, 5,
+/*20*/ UN, 4, 6, 2, 2, 2, 2, 5,UN, 2, 6, 2, 2, 2, 2, 5,
+/*30*/ UN, 5,UN,UN, 6, 6, 5, 5,UN, 2,UN,UN,UN,UN, 5, 5,
+/*40*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*50*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*60*/ 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2,
+/*70*/ 4, 4, 4, 4, 4, 4,UN, 4,UN,UN,UN,UN, 2, 2, 4,UN,
+/*80*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*90*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*A0*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*B0*/ UN,UN,UN,UN, 2, 2, 4,UN,UN,UN,UN,UN, 2, 2, 4,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,P7,UN,UN,UN,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,
+/*E0*/ UN, 4,UN, 6,UN, 4,UN,UN,UN, 4,UN,UN,UN,UN,UN,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN,UN,UN,UN, 2,UN,UN,UN,UN,UN,UN
+};
+
+static const char ez80pg6[256] = { /* P6 == DD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*10*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*20*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*40*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*50*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*60*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*70*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*80*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*90*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN
+};
+
+static const char ez80pg7[256] = { /* P7 == FD CB */
+/*--*--* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
+/*--*--* - - - - - - - - - - - - - - - - */
+/*00*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*10*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*20*/ UN,UN,UN,UN,UN,UN, 7,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*30*/ UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN,UN, 7,UN,
+/*40*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*50*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*60*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*70*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*80*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*90*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*A0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*B0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*C0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*D0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*E0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN,
+/*F0*/ UN,UN,UN,UN,UN,UN, 5,UN,UN,UN,UN,UN,UN,UN, 5,UN
+};
+
+static const char *ez80Page[7] = {
+ ez80pg1, ez80pg2, ez80pg3, ez80pg4,
+ ez80pg5, ez80pg6, ez80pg7
+};
+
+/*
+ * Process a machine op.
+ */
+VOID
+machine(mp)
+struct mne *mp;
+{
+ int op, t1, t2, t3;
+ struct expr e1, e2;
+ int rf, sf, v1, v2;
+
+ clrexpr(&e1);
+ clrexpr(&e2);
+ op = (int) mp->m_valu;
+ rf = mp->m_type;
+ sf = mp->m_flag;
+
+ /* check eZ80 flags in non-eZ80 mode and block such instruction */
+ if ((sf & (M_LIL | M_SIS)) != 0 && mchtyp != X_EZ80)
+ rf = 0;
+
+ switch (mchtyp) {
+ case X_Z80:
+ if (rf > S_CPU)
+ rf = 0;
+ break;
+ case X_HD64:
+ if (rf > X_TSTIO)
+ rf = 0;
+ break;
+ case X_ZXN:
+ if (rf > S_CPU && rf < X_ZXN_INH2 && rf != X_TST)
+ rf = 0;
+ break;
+ case X_EZ80:
+ if (rf >= X_ZXN_INH2 && rf < X_EZ_ADL) {
+ rf = 0;
+ break;
+ }
+ /* handle eZ80 suffix and write it as prefix byte */
+ if (ez80_adl) {
+ switch (sf) {
+ case M_S:
+ sf = M_SIL;
+ case M_SIL:
+ outab (0x52);
+ break;
+ case M_IS:
+ sf = M_LIS;
+ case M_LIS:
+ outab (0x49);
+ break;
+ case M_L:
+ case M_IL:
+ sf = M_LIL;
+ case M_LIL:
+ outab (0x5B);
+ break;
+ case M_SIS:
+ outab (0x40);
+ break;
+ }
+ } else {
+ switch (sf) {
+ case M_S:
+ case M_IS:
+ sf = M_SIS;
+ case M_SIS:
+ outab (0x40);
+ break;
+ case M_L:
+ sf = M_LIS;
+ case M_LIS:
+ outab (0x49);
+ break;
+ case M_IL:
+ sf = M_SIL;
+ case M_SIL:
+ outab (0x52);
+ break;
+ case M_LIL:
+ outab (0x5B);
+ break;
+ }
+ }
+ break;
+
+ default:
+ rf = 0;
+ }
+
+ switch (rf) {
+
+ case S_INH1:
+ outab(op);
+ break;
+
+ case S_INH2:
+ outab(0xED);
+ outab(op);
+ break;
+
+ case S_RET:
+ if (more()) {
+ /*
+ * ret cc
+ */
+ if ((v1 = admode(CND)) != 0) {
+ outab(op | (v1<<3));
+ } else {
+ qerr();
+ }
+ } else {
+ /*
+ * ret
+ */
+ outab(0xC9);
+ }
+ break;
+
+ case S_PUSH:
+ /*
+ * push/pop af
+ */
+ if (admode(R16X)) {
+ outab(op+0x30);
+ break;
+ } else
+ /*
+ * push/pop bc/de/hl/ix/iy (not sp)
+ */
+ if ((v1 = admode(R16)) != 0 && (v1 &= 0xFF) != SP) {
+ if (v1 != gixiy(v1)) {
+ outab(op+0x20);
+ break;
+ }
+ outab(op | (v1<<4));
+ break;
+ }
+ if (mchtyp == X_ZXN && op == 0xC5 && (t1 = addr(&e1)) == S_IMMED) {
+ int old_hilo = (int)hilo;
+ hilo = !hilo; // ZXN push is big-endian
+ outab(0xED);
+ outab(0x8A);
+ outrw(&e1, R_MSB);
+ hilo = old_hilo;
+ break;
+ }
+ if (mchtyp == X_ZXN && op == 0xC1 && (v1 = admode(RX)) != 0 && (v1 &= 0xFF) == X) {
+ outab(0xED);
+ outab(0x8B);
+ break;
+ }
+ aerr();
+ break;
+
+ case S_RST:
+ v1 = (int) absexpr();
+ if (v1 & ~0x38) {
+ aerr();
+ v1 = 0;
+ }
+ outab(op|v1);
+ break;
+
+ case S_IM:
+ expr(&e1, 0);
+ abscheck(&e1);
+ if (e1.e_addr > 2) {
+ aerr();
+ e1.e_addr = 0;
+ }
+ outab(op);
+ outab(imtab[(int) e1.e_addr]);
+ break;
+
+ case S_BIT:
+ expr(&e1, 0);
+ t1 = 0;
+ v1 = (int) e1.e_addr;
+ if (v1 > 7) {
+ ++t1;
+ v1 &= 0x07;
+ }
+ op |= (v1<<3);
+ comma(1);
+ addr(&e2);
+ abscheck(&e1);
+ /*
+ * bit b,(hl)
+ * bit b,(ix+d)
+ * bit b,(iy+d)
+ * bit b,r
+ */
+ if (genop(0xCB, op, &e2, 0) || t1)
+ aerr();
+ break;
+
+ case S_RL_UNDOCD:
+ if (!allow_undoc)
+ aerr( );
+
+ case S_RL:
+ t1 = 0;
+ t2 = addr(&e2);
+ /*
+ * rl (hl)
+ * rl (ix+d)
+ * rl (iy+d)
+ * rl r
+ */
+ if (more()) {
+ if ((t2 != S_R8) || (e2.e_addr != A))
+ ++t1;
+ comma(1);
+ clrexpr(&e2);
+ t2 = addr(&e2);
+ }
+ if (genop(0xCB, op, &e2, 0) || t1)
+ aerr();
+ break;
+
+ case S_AND:
+ case S_SUB:
+ /*
+ * op (hl)
+ * op (ix+d)
+ * op (iy+d)
+ * op r
+ * op n [#n]
+ * op ixl
+ * op ixh
+ * op iyl
+ * op iyh
+ */
+ t1 = 0;
+ t2 = addr(&e2);
+ if (more()) {
+ /*
+ * op a,(hl)
+ * op a,(ix+d)
+ * op a,(iy+d)
+ * op a,r
+ * op a,n [a,#n]
+ * op a,ixl
+ * op a,ixh
+ * op a,iyl
+ * op a,iyh
+ */
+ if ((t2 != S_R8) || (e2.e_addr != A))
+ ++t1;
+ comma(1);
+ clrexpr(&e2);
+ t2 = addr(&e2);
+ }
+
+ if ((!t1) && allow_undoc && ((t2 == S_R8U1) || (t2 == S_R8U2))) {
+ /* undocumented instruction: and/sub a,ixh|ixl|iyh|iyl */
+ outab( ((t2 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( op + e2.e_addr );
+ break;
+ }
+
+ /*
+ * op (hl)
+ * op (ix+d)
+ * op (iy+d)
+ * op r
+ * op n [#n]
+ *
+ * op a,(hl)
+ * op a,(ix+d)
+ * op a,(iy+d)
+ * op a,r
+ * op a,n [a,#n]
+ */
+ if (genop(0, op, &e2, 1) || t1)
+ aerr();
+ break;
+
+ case S_ADD:
+ case S_ADC:
+ case S_SBC:
+ t1 = addr(&e1);
+ t2 = 0;
+ if (more()) {
+ comma(1);
+ t2 = addr(&e2);
+ }
+ if (t2 == 0) {
+ if (allow_undoc && ((t1 == S_R8U1) || (t1 == S_R8U2))) {
+ /* undocumented instruction: add/adc/sbc a,ixh|ixl|iyh|iyl */
+ outab( ((t1 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( op + e1.e_addr );
+ break;
+ }
+
+ if (genop(0, op, &e1, 1))
+ aerr();
+ break;
+ }
+ if ((t1 == S_R8) && (e1.e_addr == A)) {
+
+ if (allow_undoc && ((t2 == S_R8U1) || (t2 == S_R8U2))) {
+ /* undocumented instruction: add/adc/sbc a,ixh|ixl|iyh|iyl */
+ outab( ((t2 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( op + e2.e_addr );
+ break;
+ }
+
+ if (genop(0, op, &e2, 1))
+ aerr();
+ break;
+ }
+ if ((t1 == S_R16) && (t2 == S_R16)) {
+ if (rf == S_ADD)
+ op = 0x09;
+ if (rf == S_ADC)
+ op = 0x4A;
+ if (rf == S_SBC)
+ op = 0x42;
+ v1 = (int) e1.e_addr;
+ v2 = (int) e2.e_addr;
+ /*
+ * op hl,bc
+ * op hl,de
+ * op hl,hl
+ * op hl,sp
+ */
+ if ((v1 == HL) && (v2 <= SP)) {
+ if (rf != S_ADD)
+ outab(0xED);
+ outab(op | (v2<<4));
+ break;
+ }
+ if (rf != S_ADD) {
+ aerr();
+ break;
+ }
+ /*
+ * add ix,bc
+ * add ix,de
+ * add ix,ix
+ * add ix,sp
+ */
+ if ((v1 == IX) && (v2 != HL) && (v2 != IY)) {
+ if (v2 == IX)
+ v2 = HL;
+ outab(0xDD);
+ outab(op | (v2<<4));
+ break;
+ }
+ /*
+ * add iy,bc
+ * add iy,de
+ * add iy,iy
+ * add iy,sp
+ */
+ if ((v1 == IY) && (v2 != HL) && (v2 != IX)) {
+ if (v2 == IY)
+ v2 = HL;
+ outab(0xFD);
+ outab(op | (v2<<4));
+ break;
+ }
+ }
+ if (mchtyp == X_ZXN && rf == S_ADD && t1 == S_R16) {
+ if (e1.e_addr == HL && t2 == S_R8 && e2.e_addr == A) {
+ outab(0xED);
+ outab(0x31);
+ break;
+ }
+ if (e1.e_addr == DE && t2 == S_R8 && e2.e_addr == A) {
+ outab(0xED);
+ outab(0x32);
+ break;
+ }
+ if (e1.e_addr == BC && t2 == S_R8 && e2.e_addr == A) {
+ outab(0xED);
+ outab(0x33);
+ break;
+ }
+ if (e1.e_addr == HL && t2 == S_IMMED) {
+ outab(0xED);
+ outab(0x34);
+ outrw(&e2, 0);
+ break;
+ }
+ if (e1.e_addr == DE && t2 == S_IMMED) {
+ outab(0xED);
+ outab(0x35);
+ outrw(&e2, 0);
+ break;
+ }
+ if (e1.e_addr == BC && t2 == S_IMMED) {
+ outab(0xED);
+ outab(0x36);
+ outrw(&e2, 0);
+ break;
+ }
+ }
+ aerr();
+ break;
+
+ case S_LD:
+ /*
+ * Enumerated ld instructions:
+ *
+ * ld
+ * ld.l ld.il ld.lil
+ * ld.s ld.is ld.sis
+ */
+ t1 = addr(&e1);
+ comma(1);
+ t2 = addr(&e2);
+ /*
+ * ld r,g
+ * ld r,n (r,#n)
+ * ld r,(hl)
+ * ld r,(ix+d)
+ * ld r,(iy+d)
+ */
+ if (t1 == S_R8) {
+ /*
+ * ld r,g
+ */
+ v1 = op | e1.e_addr<<3;
+ if (genop(0, v1, &e2, 0) == 0)
+ break;
+ /*
+ * ld r,n (r,#n)
+ */
+ if (t2 == S_IMMED) {
+ outab((e1.e_addr<<3) | 0x06);
+ outrb(&e2,0);
+ break;
+ }
+ }
+
+ if (allow_undoc &&
+ ((t1 == S_R8U1) || (t1 == S_R8U2)) &&
+ (t2 == S_IMMED))
+ {
+ outab( ((t1 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab((e1.e_addr<<3) | 0x06);
+ outrb(&e2,0);
+ break;
+ }
+
+ v1 = (int) e1.e_addr;
+ v2 = (int) e2.e_addr;
+ /*
+ * ld be,mn [be,#mn]
+ * ld de,mn [de,#mn]
+ * ld hl,mn [hl,#mn]
+ * ld sp,mn [sp,#mn]
+ * ld ix,mn [ix,#mn]
+ * ld iy,mn [iy,#mn]
+ */
+ if ((t1 == S_R16) && (t2 == S_IMMED)) {
+ v1 = gixiy(v1);
+ outab(0x01|(v1<<4));
+ glilsis(sf, &e2);
+ break;
+ }
+
+ /*
+ * ld bc,(hl)
+ * ld de,(hl)
+ * ld hl,(hl)
+ * ld ix,(hl)
+ * ld iy,(hl)
+ */
+ if (mchtyp == X_EZ80 && (t1 == S_R16) && (t2 == S_IDHL)) {
+ if (v1 == SP) {
+ aerr();
+ break;
+ }
+ outab(0xED);
+ if (v1 == IX) {
+ outab(0x37);
+ } else
+ if (v1 == IY) {
+ outab(0x31);
+ } else {
+ outab(7 + (v1 << 4));
+ }
+ break;
+ }
+
+ /*
+ * ld (hl),bc
+ * ld (hl),de
+ * ld (hl),hl
+ * ld (hl),ix
+ * ld (hl),iy
+ */
+ if (mchtyp == X_EZ80 && (t2 == S_R16) && (t1 == S_IDHL)) {
+ if (v2 == SP) {
+ aerr();
+ break;
+ }
+ outab(0xED);
+ if (v2 == IX) {
+ outab(0x3f);
+ } else
+ if (v2 == IY) {
+ outab(0x3e);
+ } else {
+ outab(0xf + (v2 << 4));
+ }
+ break;
+ }
+
+ /*
+ * ld bc,(ix+d) ld bc,(iy+d)
+ * ld de,(ix+d) ld de,(iy+d)
+ * ld hl,(ix+d) ld hl,(iy+d)
+ * ld ix,(ix+d) ld ix,(iy+d)
+ * ld iy,(ix+d) ld iy,(iy+d)
+ */
+ if (mchtyp == X_EZ80 && (t1 == S_R16) && ((t2 == S_IDIX) || (t2 == S_IDIY))) {
+ if (v1 == SP) {
+ aerr();
+ break;
+ }
+ if (t2 == S_IDIX) {
+ outab(0xDD);
+ if (v1 == IX) {
+ outab(0x37);
+ } else
+ if (v1 == IY) {
+ outab(0x31);
+ }
+ } else {
+ outab(0xFD);
+ if (v1 == IX) {
+ outab(0x31);
+ }else
+ if (v1 == IY) {
+ outab(0x37);
+ }
+ }
+ if ((v1 == BC) || (v1 == DE) || (v1 == HL))
+ outab((v1 << 4) + 7);
+ outrb(&e2, R_SGND);
+ break;
+ }
+
+ /*
+ * ld (ix+d),bc ld (iy+d),bc
+ * ld (ix+d),de ld (iy+d),de
+ * ld (ix+d),hl ld (iy+d),hl
+ * ld (ix+d),ix ld (iy+d),ix
+ * ld (ix+d),iy ld (iy+d),iy
+ */
+ if (mchtyp == X_EZ80 && (t2 == S_R16) && ((t1 == S_IDIX) || (t1 == S_IDIY))) {
+ if (v2 == SP) {
+ aerr();
+ break;
+ }
+ if (t1 == S_IDIX) {
+ outab(0xDD);
+ if (v2 == IX) {
+ outab(0x3F);
+ } else
+ if (v2 == IY) {
+ outab(0x3E);
+ }
+ } else {
+ outab(0xFD);
+ if (v2 == IX) {
+ outab(0x3E);
+ } else
+ if (v2 == IY) {
+ outab(0x3F);
+ }
+ }
+ if ((v2 == BC) || (v2 == DE) || (v2 == HL))
+ outab((v2 << 4) + 0xf);
+ outrb(&e1, R_SGND);
+ break;
+ }
+
+ /*
+ * ld be,(mn) [be,(#mn)]
+ * ld de,(mn) [de,(#mn)]
+ * ld hl,(mn) [hl,(#mn)]
+ * ld sp,(mn) [sp,(#mn)]
+ * ld ix,(mn) [ix,(#mn)]
+ * ld iy,(mn) [iy,(#mn)]
+ */
+ if ((t1 == S_R16) && (t2 == S_INDM)) {
+ if (gixiy(v1) == HL) {
+ outab(0x2A);
+ } else {
+ outab(0xED);
+ outab(0x4B | (v1<<4));
+ }
+ glilsis(sf, &e2);
+ break;
+ }
+ /*
+ * ld (mn),bc [(#mn),bc]
+ * ld (mn),de [(#mn),de]
+ * ld (mn),hl [(#mn),hl]
+ * ld (mn),sp [(#mn),sp]
+ * ld (mn),ix [(#mn),ix]
+ * ld (mn),iy [(#mn),iy]
+ */
+ if ((t1 == S_INDM) && (t2 == S_R16)) {
+ if (gixiy(v2) == HL) {
+ outab(0x22);
+ } else {
+ outab(0xED);
+ outab(0x43 | (v2<<4));
+ }
+ glilsis(sf, &e1);
+ break;
+ }
+ /*
+ * ld a,(mn) [a,(#mn)]
+ */
+ if ((t1 == S_R8) && (v1 == A) && (t2 == S_INDM)) {
+ outab(0x3A);
+ outrw(&e2, 0);
+ break;
+ }
+ /*
+ * ld (mn),a [(#mn),a]
+ */
+ if ((t1 == S_INDM) && (t2 == S_R8) && (v2 == A)) {
+ outab(0x32);
+ glilsis(sf, &e1);
+ break;
+ }
+ /*
+ * ld (hl),r
+ * ld (ix+d),r
+ * ld (iy+d),r
+ */
+ if ((t2 == S_R8) && (gixiy(t1) == S_IDHL)) {
+ outab(0x70|v2);
+ if (t1 != S_IDHL)
+ outrb(&e1, 0);
+ break;
+ }
+ /*
+ * ld (hl),n [(hl),#n]
+ * ld (ix+d),n [(ix+d),#n]
+ * ld (iy+d),n [(iy+d),#n]
+ */
+ if ((t2 == S_IMMED) && (gixiy(t1) == S_IDHL)) {
+ outab(0x36);
+ if (t1 != S_IDHL)
+ outrb(&e1, 0);
+ outrb(&e2, 0);
+ break;
+ }
+ /*
+ * ld R,a
+ * ld I,a
+ */
+ if ((t1 == S_R8X) && (t2 == S_R8) && (v2 == A)) {
+ outab(0xED);
+ outab(v1);
+ break;
+ }
+ /*
+ * ld MB,a
+ */
+ if ((t1 == S_R8MB) && (t2 == S_R8) && (v2 == A)) {
+ outab(0xED);
+ outab(0x6D);
+ break;
+ }
+ /*
+ * ld a,R
+ * ld a,I
+ */
+ if ((t1 == S_R8) && (v1 == A) && (t2 == S_R8X)) {
+ outab(0xED);
+ outab(v2|0x10);
+ break;
+ }
+ /*
+ * ld a,R
+ * ld a,I
+ */
+ if ((t1 == S_R8) && (v1 == A) && (t2 == S_R8MB)) {
+ outab(0xED);
+ outab(0x6E);
+ break;
+ }
+ /*
+ * ld sp,hl
+ * ld sp,ix
+ * ld sp,iy
+ */
+ if ((t1 == S_R16) && (v1 == SP)) {
+ if ((t2 == S_R16) && (gixiy(v2) == HL)) {
+ outab(0xF9);
+ break;
+ }
+ }
+ /*
+ * ld a,(bc)
+ * ld a,(de)
+ */
+ if ((t1 == S_R8) && (v1 == A)) {
+ if ((t2 == S_IDBC) || (t2 == S_IDDE)) {
+ outab(0x0A | ((t2-S_INDR)<<4));
+ break;
+ }
+ }
+ /*
+ * ld (bc),a
+ * ld (de),a
+ */
+ if ((t2 == S_R8) && (v2 == A)) {
+ if ((t1 == S_IDBC) || (t1 == S_IDDE)) {
+ outab(0x02 | ((t1-S_INDR)<<4));
+ break;
+ }
+ }
+
+ /*
+ * ld hl,i
+ */
+ if ((t1 == S_R16) && (v1 == HL) && (t2 == S_R8X) && (v2 == I)) {
+ outab(0xED);
+ outab(0xD7);
+ break;
+ }
+ /*
+ * ld i,hl
+ */
+ if ((t2 == S_R16) && (v2 == HL) && (t1 == S_R8X) && (v1 == I)) {
+ outab(0xED);
+ outab(0xC7);
+ break;
+ }
+
+ /*
+ * ld r,ixl
+ * ld r,ixh
+ * ld r,iyl
+ * ld r,iyh
+ */
+ if ( (t1 == S_R8) &&
+ allow_undoc &&
+ ((t2 == S_R8U1) || (t2 == S_R8U2)) )
+ {
+ outab( ((t2 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( (e1.e_addr << 3) | (0x40 + e2.e_addr) );
+ break;
+ }
+ /*
+ * ld ixl,r
+ * ld ixh,r
+ * ld iyl,r
+ * ld iyh,r
+ */
+ if ( allow_undoc &&
+ ((t1 == S_R8U1) || (t1 == S_R8U2)) &&
+ (t2 == S_R8) )
+ {
+ if ( (e2.e_addr == H) || (e2.e_addr == L) )
+ aerr();
+
+ outab( ((t1 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( (e1.e_addr << 3) | (0x40 + e2.e_addr) );
+ break;
+ }
+ /*
+ * ld ixh,ihx
+ * ld ixh,ixl
+ * ld ixl,ixh
+ * ld ixl,ixl
+ * ld iyh,iyh
+ * ld iyh,iyl
+ * ld iyl,iyh
+ * ld iyl,iyl
+ */
+ if ( allow_undoc &&
+ ((t1 == S_R8U1) && (t2 == S_R8U1)) || ((t1 == S_R8U2) && (t2 == S_R8U2)) )
+ {
+ outab( ((t1 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab( (e1.e_addr << 3) | (0x40 + e2.e_addr) );
+ break;
+ }
+ if (mchtyp == X_EZ80 && ((t1 == S_R8MB && v2 == A) || (v1 == A && t2 == S_R8MB))) {
+ outab (0xED);
+ outab ((v1 == A) ? 0x6E : 0x6D);
+ break;
+ }
+ aerr();
+ break;
+
+ case S_EX:
+ t1 = addr(&e1);
+ comma(1);
+ t2 = addr(&e2);
+ if (t2 == S_R16) {
+ v1 = (int) e1.e_addr;
+ v2 = (int) e2.e_addr;
+ /*
+ * ex (sp),hl
+ * ex (sp),ix
+ * ex (sp),iy
+ */
+ if ((t1 == S_IDSP) && (v1 == 0)) {
+ if (gixiy(v2) == HL) {
+ outab(op);
+ break;
+ }
+ }
+ /*
+ * ex de,hl
+ */
+ if (t1 == S_R16) {
+ if ((v1 == DE) && (v2 == HL)) {
+ outab(0xEB);
+ break;
+ }
+ }
+ }
+ /*
+ * ex af,af'
+ */
+ if ((t1 == S_R16X) && (t2 == S_R16X)) {
+ outab(0x08);
+ break;
+ }
+ aerr();
+ break;
+
+ case S_IN:
+ case S_OUT:
+ if (rf == S_IN) {
+ t1 = addr(&e1);
+ comma(1);
+ t2 = addr(&e2);
+ } else {
+ t2 = addr(&e2);
+ comma(1);
+ t1 = addr(&e1);
+ }
+ v1 = (int) e1.e_addr;
+ v2 = (int) e2.e_addr;
+ if (t1 == S_R8) {
+ /*
+ * in a,(n) [in a,(#n)]
+ * out (n),a [out (#n),a]
+ */
+ if ((v1 == A) && (t2 == S_INDM)) {
+ outab(op);
+ outab(v2);
+ break;
+ }
+ /*
+ * in r,(c) [in r,(bc)]
+ * out (c),r [out (bc),r]
+ */
+ if (t2 == S_IDC) {
+ outab(0xED);
+ outab(((rf == S_IN) ? 0x40 : 0x41) + (v1<<3));
+ break;
+ }
+ }
+ aerr();
+ break;
+
+ case S_DEC:
+ case S_INC:
+ t1 = addr(&e1);
+ v1 = (int) e1.e_addr;
+ /*
+ * op r
+ */
+ if (t1 == S_R8) {
+ outab(op|(v1<<3));
+ break;
+ }
+ /*
+ * op (hl)
+ */
+ if (t1 == S_IDHL) {
+ outab(op|0x30);
+ break;
+ }
+ /*
+ * op (ix+d)
+ * op (iy+d)
+ */
+ if (t1 != gixiy(t1)) {
+ outab(op|0x30);
+ outrb(&e1,0);
+ break;
+ }
+ /*
+ * op bc
+ * op de
+ * op hl
+ * op sp
+ * op ix
+ * op iy
+ */
+ if (t1 == S_R16) {
+ v1 = gixiy(v1);
+ if (rf == S_INC) {
+ outab(0x03|(v1<<4));
+ break;
+ }
+ if (rf == S_DEC) {
+ outab(0x0B|(v1<<4));
+ break;
+ }
+ }
+ /*
+ * op IXL
+ * op IXH
+ * op IYL
+ * op IYH
+ */
+ if ((t1 == S_R8U1)||(t1 == S_R8U2)) {
+ outab( ((t1 == S_R8U1) ? 0xDD : 0xFD ) );
+ outab(op|(v1<<3));
+ break;
+ }
+ aerr();
+ break;
+
+ case S_DJNZ:
+ case S_JR:
+ /*
+ * jr cc,e
+ */
+ if (rf == S_JR && (v1 = admode(CND)) != 0) {
+ if ((v1 &= 0xFF) <= 0x03) {
+ op += (v1+1)<<3;
+ } else {
+ aerr();
+ }
+ comma(1);
+ }
+ /*
+ * jr e
+ */
+ expr(&e2, 0);
+ outab(op);
+ if (mchpcr(&e2)) {
+ v2 = (int) (e2.e_addr - dot.s_addr - 1);
+ if (pass == 2 && ((v2 < -128) || (v2 > 127)))
+ aerr();
+ outab(v2);
+ } else {
+ outrb(&e2, R_PCR);
+ }
+ if (e2.e_mode != S_USER)
+ rerr();
+ break;
+
+ case S_CALL:
+ if ((v1 = admode(CND)) != 0) {
+ /*
+ * call cc,n
+ */
+ op |= (v1&0xFF)<<3;
+ comma(1);
+ } else {
+ /*
+ * call n
+ */
+ op = 0xCD;
+ }
+ expr(&e1, 0);
+ outab(op);
+ glilsis(sf, &e1);
+ break;
+
+ case S_JP:
+ /*
+ * jp cc,mn
+ */
+ if ((v1 = admode(CND)) != 0) {
+ op |= (v1&0xFF)<<3;
+ comma(1);
+ expr(&e1, 0);
+ outab(op);
+ glilsis(sf, &e1);
+ break;
+ }
+ /*
+ * jp mn
+ */
+ t1 = addr(&e1);
+ if (t1 == S_USER) {
+ outab(0xC3);
+ glilsis(sf, &e1);
+ break;
+ }
+ /*
+ * jp (hl)
+ * jp (ix)
+ * jp (iy)
+ */
+ if ((e1.e_addr == 0) && (gixiy(t1) == S_IDHL)) {
+ outab(0xE9);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_UNDOCD:
+ ++allow_undoc;
+ break;
+
+ case S_CPU:
+ opcycles = OPCY_CPU;
+ mchtyp = op;
+ sym[2].s_addr = op;
+ lmode = SLIST;
+ if (mchtyp == X_EZ80)
+ allow_undoc = 1;
+ break;
+
+ case X_INH2:
+ outab(0xED);
+ outab(op);
+ break;
+
+ case X_IN:
+ case X_OUT:
+ if (rf == X_IN) {
+ t1 = addr(&e1);
+ comma(1);
+ t2 = addr(&e2);
+ } else {
+ t2 = addr(&e2);
+ comma(1);
+ t1 = addr(&e1);
+ }
+ if ((t1 == S_R8) && (t2 == S_INDM)) {
+ outab(0xED);
+ outab(op | (e1.e_addr<<3));
+ outrb(&e2, 0);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_MLT:
+ /*
+ * mlt bc/de/hl/sp
+ */
+ t1 = addr(&e1);
+ if ((t1 == S_R16) && ((v1 = (int) e1.e_addr) <= SP)) {
+ outab(0xED);
+ outab(op | (v1<<4));
+ break;
+ }
+ aerr();
+ break;
+
+ case X_TST:
+ /*
+ * op (hl)
+ * op r
+ * op n [#n]
+ */
+ t2 = addr(&e2);
+ if (more()) {
+ /*
+ * op a,(hl)
+ * op a,r
+ * op a,n [a,#n]
+ */
+ if ((t2 != S_R8) || (e2.e_addr != A))
+ aerr();
+ comma(1);
+ clrexpr(&e2);
+ t2 = addr(&e2);
+ }
+ /*
+ * tst (hl)
+ */
+ if ((mchtyp == X_HD64 || mchtyp == X_EZ80) && t2 == S_IDHL) {
+ outab(0xED);
+ outab(0x34);
+ break;
+ }
+ /*
+ * tst r
+ */
+ if ((mchtyp == X_HD64 || mchtyp == X_EZ80) && t2 == S_R8) {
+ outab(0xED);
+ outab(op | (e2.e_addr << 3));
+ break;
+ }
+ /*
+ * tst n [tst #n]
+ */
+ if (t2 == S_IMMED) {
+ outab(0xED);
+ if (mchtyp == X_HD64 || mchtyp == X_EZ80)
+ outab(0x64);
+ else if (mchtyp == X_ZXN)
+ outab(0x27);
+ else
+ aerr();
+ outrb(&e2, 0);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_TSTIO:
+ t1 = addr(&e1);
+ /*
+ * tstio n [tstio #n]
+ */
+ if (t1 == S_IMMED) {
+ outab(0xED);
+ outab(op);
+ outrb(&e1, 0);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_INH2:
+ outab(0xED);
+ outab(op);
+ break;
+
+ case X_ZXN_MUL:
+ if ((t1 = addr(&e1)) == S_R8 && e1.e_addr == D &&
+ more() && comma(1) &&
+ (t2 = addr(&e2)) == S_R8 && e2.e_addr == E
+ ) {
+ outab(0xED);
+ outab(op);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_MIRROR:
+ t1 = addr(&e1);
+ if (t1 == S_R8 && e1.e_addr == A) {
+ outab(0xED);
+ outab(0x24);
+ break;
+ }
+ if (t1 == S_R16 && e1.e_addr == DE) {
+ outab(0xED);
+ outab(0x26);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_NEXTREG:
+ t1 = addr(&e1);
+ t2 = 0;
+ if (more()) {
+ comma(1);
+ t2 = addr(&e2);
+ }
+ if (t1 == S_IMMED && t2 == S_IMMED) {
+ outab(0xED);
+ outab(0x91);
+ outrb(&e1, 0);
+ outrb(&e2, 0);
+ break;
+ }
+ if (t1 == S_IMMED && t2 == S_R8 && e2.e_addr == A) {
+ outab(0xED);
+ outab(0x92);
+ outrb(&e1, 0);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_MMU:
+ t1 = addr(&e1);
+ if (t1 == S_IMMED) {
+ outab(0xED);
+ outab(0x91);
+ outab(op);
+ outrb(&e1, 0);
+ break;
+ }
+ if (t1 == S_R8 && e1.e_addr == A) {
+ outab(0xED);
+ outab(0x92);
+ outab(op);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_CU_WAIT:
+ t1 = addr(&e1);
+ t2 = 0;
+ if (more()) {
+ comma(1);
+ t2 = addr(&e2);
+ }
+ if (t1 == S_IMMED && t2 == S_IMMED) {
+ if (e1.e_addr > 311 || e2.e_addr > 55) {
+ aerr();
+ break;
+ }
+ v1 = 0x8000 + (e2.e_addr << 9) + (e1.e_addr);
+ outab(v1 >> 8);
+ outab(v1 & 0xFF);
+ opcycles = OPCY_ERR;
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_CU_MOVE:
+ t1 = addr(&e1);
+ t2 = 0;
+ if (more()) {
+ comma(1);
+ t2 = addr(&e2);
+ }
+ if (t1 == S_IMMED && t2 == S_IMMED) {
+ if (e1.e_addr > 127 || e2.e_addr > 255) {
+ aerr();
+ break;
+ }
+ v1 = (e1.e_addr << 8) + (e2.e_addr);
+ outab(v1 >> 8);
+ outab(v1 & 0xFF);
+ opcycles = OPCY_ERR;
+ break;
+ }
+ aerr();
+ break;
+
+ case X_ZXN_CU_STOP:
+ outab(0xFF);
+ outab(0xFF);
+ opcycles = OPCY_ERR;
+ break;
+
+ case X_ZXN_CU_NOP:
+ outab(0x00);
+ outab(0x00);
+ opcycles = OPCY_ERR;
+ break;
+
+ case X_EZ_ADL:
+ expr(&e1,0);
+ abscheck(&e1);
+ ez80_adl = e1.e_addr;
+ break;
+
+ case X_EZ_INH2:
+ outab(0xED);
+ outab(op);
+ break;
+
+ case X_EZ_LEA:
+ t1 = addr(&e1);
+ v1 = (int) e1.e_addr;
+ comma(1);
+ t2 = addr(&e2);
+ v2 = (int) e2.e_addr;
+ comma(1);
+ t3 = addr(&e2);
+ if ((t1 == S_R16) && (v1 != SP) && (t2 == S_R16) && (v2==IX || v2==IY) && t3 == S_IMMED) {
+ t2 = e2.e_mode = S_INDR + v2;
+ outab(0xED);
+ /*
+ * op ix,ix,#d
+ * op ix,iy,#d
+ */
+ if (v1 == IX) {
+ if (t2 == S_IDIX) {
+ outab(0x32);
+ } else {
+ outab(0x54);
+ }
+ } else
+ /*
+ * op iy,ix,#d
+ * op iy,iy,#d
+ */
+ if (v1 == IY) {
+ if (t2 == S_IDIX) {
+ outab(0x55);
+ } else {
+ outab(0x33);
+ }
+ } else {
+ if (t2 == S_IDIY) {
+ /*
+ * op bc,iy,#d
+ * op de,iy,#d
+ * op hl,iy,#d
+ */
+ outab((v1 << 4) + 3);
+ } else {
+ /*
+ * op bc,ix,#d
+ * op de,ix,#d
+ * op hl,ix,#d
+ */
+ outab((v1 << 4) + 2);
+ }
+ }
+ outrb(&e2, R_SGND);
+ break;
+ }
+ aerr();
+ break;
+
+ case X_EZ_PEA:
+ t1 = addr(&e1);
+ v1 = (int) e1.e_addr;
+ comma(1);
+ t2 = addr (&e1);
+ /*
+ * pea ix,#d
+ * pea iy,#d
+ */
+ if ((t1 == S_R16) && (v1==IX || v1==IY) && t2 == S_IMMED) {
+ t1 = e1.e_mode = S_INDR + v1;
+ outab(0xED);
+ if (t1 == S_IDIY)
+ ++op;
+ outab(op);
+ outrb(&e1, R_SGND);
+ break;
+ }
+ aerr();
+ break;
+
+
+ default:
+ opcycles = OPCY_ERR;
+ err('o');
+ break;
+ }
+
+ if (opcycles == OPCY_NONE) {
+ switch (mchtyp) {
+ case X_HD64:
+ opcycles = hd64pg1[cb[0] & 0xFF];
+ while ((opcycles & OPCY_NONE) && (opcycles & OPCY_MASK)) {
+ switch (opcycles) {
+ case P2: /* CB xx */
+ case P3: /* DD xx */
+ case P4: /* ED xx */
+ case P5: /* FD xx */
+ opcycles = hd64Page[opcycles & OPCY_MASK][cb[1] & 0xFF];
+ break;
+ case P6: /* DD CB -- xx */
+ case P7: /* FD CB -- xx */
+ opcycles = hd64Page[opcycles & OPCY_MASK][cb[3] & 0xFF];
+ break;
+ default:
+ opcycles = OPCY_NONE;
+ break;
+ }
+ }
+ break;
+ case X_Z80:
+ opcycles = z80pg1[cb[0] & 0xFF];
+ while ((opcycles & OPCY_NONE) && (opcycles & OPCY_MASK)) {
+ switch (opcycles) {
+ case P2: /* CB xx */
+ case P3: /* DD xx */
+ case P4: /* ED xx */
+ case P5: /* FD xx */
+ opcycles = z80Page[opcycles & OPCY_MASK][cb[1] & 0xFF];
+ break;
+ case P6: /* DD CB -- xx */
+ case P7: /* FD CB -- xx */
+ opcycles = z80Page[opcycles & OPCY_MASK][cb[3] & 0xFF];
+ break;
+ default:
+ opcycles = OPCY_NONE;
+ break;
+ }
+ }
+ break;
+ case X_ZXN:
+ opcycles = zxnpg1[cb[0] & 0xFF];
+ while ((opcycles & OPCY_NONE) && (opcycles & OPCY_MASK)) {
+ switch (opcycles) {
+ case P2: /* CB xx */
+ case P3: /* DD xx */
+ case P4: /* ED xx */
+ case P5: /* FD xx */
+ opcycles = zxnPage[opcycles & OPCY_MASK][cb[1] & 0xFF];
+ break;
+ case P6: /* DD CB -- xx */
+ case P7: /* FD CB -- xx */
+ opcycles = zxnPage[opcycles & OPCY_MASK][cb[3] & 0xFF];
+ break;
+ default:
+ opcycles = OPCY_NONE;
+ break;
+ }
+ }
+ break;
+ case X_EZ80:
+ {
+ int of = 0;
+ opcycles = ez80pg1[cb[0] & 0xFF];
+ while ((opcycles & OPCY_NONE) && (opcycles & OPCY_MASK)) {
+ switch (opcycles) {
+ case PF: /* 40 / 49 / 52 / 5B */
+ of = 1;
+ opcycles = ez80pg1[cb[1] & 0xFF];
+ break;
+ case P2: /* CB xx */
+ case P3: /* DD xx */
+ case P4: /* ED xx */
+ case P5: /* FD xx */
+ opcycles = ez80Page[opcycles & OPCY_MASK][cb[of + 1] & 0xFF];
+ break;
+ case P6: /* DD CB -- xx */
+ case P7: /* FD CB -- xx */
+ opcycles = ez80Page[opcycles & OPCY_MASK][cb[of + 3] & 0xFF];
+ break;
+ default:
+ opcycles = OPCY_NONE;
+ break;
+ }
+ }
+ }
+// ToDo: ASXX has 'Cycle Adjustment' here...
+ break;
+ default:
+ break;
+ }
+ }
+}
+
+/*
+ * general addressing evaluation
+ * return(0) if general addressing mode output, else
+ * return(esp->e_mode)
+ */
+int
+genop(pop, op, esp, f)
+int pop, op;
+struct expr *esp;
+int f;
+{
+ int t1;
+
+ if ((t1 = esp->e_mode) == S_R8) {
+ if (pop)
+ outab(pop);
+ outab(op|esp->e_addr);
+ return(0);
+ }
+ if (t1 == S_IDHL) {
+ if (pop)
+ outab(pop);
+ outab(op|0x06);
+ return(0);
+ }
+ if (gixiy(t1) == S_IDHL) {
+ if (pop) {
+ outab(pop);
+ outrb(esp,0);
+ outab(op|0x06);
+ } else {
+ outab(op|0x06);
+ outrb(esp,0);
+ }
+ return(0);
+ }
+ if ((t1 == S_IMMED) && (f)) {
+ if (pop)
+ outab(pop);
+ outab(op|0x46);
+ outrb(esp,0);
+ return(0);
+ }
+ return(t1);
+}
+
+/*
+ * IX and IY prebyte check
+ */
+int
+gixiy(v)
+int v;
+{
+ if (v == IX) {
+ v = HL;
+ outab(0xDD);
+ } else if (v == IY) {
+ v = HL;
+ outab(0xFD);
+ } else if (v == S_IDIX) {
+ v = S_IDHL;
+ outab(0xDD);
+ } else if (v == S_IDIY) {
+ v = S_IDHL;
+ outab(0xFD);
+ }
+ return(v);
+}
+
+/*
+ * .IL/.LIL and .IS/.SIS checks
+ */
+VOID
+glilsis(sfx, esp)
+int sfx;
+struct expr *esp;
+{
+
+// Pokus napsat zapis parametru 16/24-bit 'jinak'...
+ if (ez80_adl && !(sfx & M_IS)) {
+ outr3b(esp, R_ADL);
+ } else {
+ outrw(esp, 0);
+// warning "Proc je pro Z80 defaultni funkce outrwm()...?
+// funkce - viz asxxsrc/asout.c
+// zrejme se musim podivat do ASxx zdrojaku, jak se zpracovavaji priznaky R_ADL, R_Z80, R_PAGX1...
+// outrwm(esp, R_Z80|R_PAGX1, 0);
+ }
+}
+
+/*
+ * Branch/Jump PCR Mode Check
+ */
+int
+mchpcr(esp)
+struct expr *esp;
+{
+ if (esp->e_base.e_ap == dot.s_area) {
+ return(1);
+ }
+ if (esp->e_flag==0 && esp->e_base.e_ap==NULL) {
+ /*
+ * Absolute Destination
+ *
+ * Use the global symbol '.__.ABS.'
+ * of value zero and force the assembler
+ * to use this absolute constant as the
+ * base value for the relocation.
+ */
+ esp->e_flag = 1;
+ esp->e_base.e_sp = &sym[1];
+ }
+ return(0);
+}
+
+/*
+ * Machine dependent initialization
+ */
+VOID
+minit()
+{
+ /*
+ * Byte Order
+ */
+ hilo = 0;
+
+ if (pass == 0) {
+ mchtyp = X_Z80;
+ sym[2].s_addr = X_Z80;
+ ez80_adl = 0;
+ }
+}