initial import
[picodrive.git] / cpu / mz80 / mz80.c
diff --git a/cpu/mz80/mz80.c b/cpu/mz80/mz80.c
new file mode 100644 (file)
index 0000000..b7733fd
--- /dev/null
@@ -0,0 +1,17053 @@
+#include "driver.h"
+
+/* Multi-Z80 32 Bit emulator */
+
+/* Copyright 1996-2000 Neil Bradley, All rights reserved
+ *
+ * License agreement:
+ *
+ * (MZ80 Refers to both the assembly code emitted by makeZ80.c and makeZ80.c
+ * itself)
+ *
+ * MZ80 May be distributed in unmodified form to any medium.
+ *
+ * MZ80 May not be sold, or sold as a part of a commercial package without
+ * the express written permission of Neil Bradley (neil@synthcom.com). This
+ * includes shareware.
+ *
+ * Modified versions of MZ80 may not be publicly redistributed without author
+ * approval (neil@synthcom.com). This includes distributing via a publicly
+ * accessible LAN. You may make your own source modifications and distribute
+ * MZ80 in source or object form, but if you make modifications to MZ80
+ * then it should be noted in the top as a comment in makeZ80.c.
+ *
+ * MZ80 Licensing for commercial applications is available. Please email
+ * neil@synthcom.com for details.
+ *
+ * Synthcom Systems, Inc, and Neil Bradley will not be held responsible for
+ * any damage done by the use of MZ80. It is purely "as-is".
+ *
+ * If you use MZ80 in a freeware application, credit in the following text:
+ *
+ * "Multi-Z80 CPU emulator by Neil Bradley (neil@synthcom.com)"
+ *
+ * must accompany the freeware application within the application itself or
+ * in the documentation.
+ *
+ * Legal stuff aside:
+ *
+ * If you find problems with MZ80, please email the author so they can get
+ * resolved. If you find a bug and fix it, please also email the author so
+ * that those bug fixes can be propogated to the installed base of MZ80
+ * users. If you find performance improvements or problems with MZ80, please
+ * email the author with your changes/suggestions and they will be rolled in
+ * with subsequent releases of MZ80.
+ *
+ * The whole idea of this emulator is to have the fastest available 32 bit
+ * Multi-Z80 emulator for the PC, giving maximum performance. 
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mz80.h"
+UINT32 z80intAddr;
+UINT32 z80pc;
+
+
+/* Modular global variables go here*/
+
+static CONTEXTMZ80 cpu;        /* CPU Context */
+static UINT8 *pbPC;                    /* Program counter normalized */
+static UINT8 *pbSP;                    /* Stack pointer normalized */
+static struct MemoryReadByte *psMemRead; /* Read memory structure */
+static struct MemoryWriteByte *psMemWrite; /* Write memory structure */
+static struct z80PortRead *psIoRead; /* Read I/O structure */
+static struct z80PortWrite *psIoWrite; /* Write memory structure */
+static INT32 sdwCyclesRemaining; /* Used as a countdown */
+static UINT32 dwReturnCode; /* Return code from exec() */
+static UINT32 dwOriginalCycles; /* How many cycles did we start with? */
+static UINT32 dwElapsedTicks;  /* How many ticks did we elapse? */
+static INT32 sdwAddr;          /* Temporary address storage */
+static UINT32 dwAddr;          /* Temporary stack address */
+static UINT8 *pbAddAdcTable;   /* Pointer to add/adc flag table */
+static UINT8 *pbSubSbcTable;   /* Pointer to sub/sbc flag table */
+static UINT32 dwTemp;                  /* Temporary value */
+
+static UINT8 bTemp;                    /* Temporary value */
+
+static UINT8 bTemp2;           /* Temporary value */
+
+/* Precomputed flag tables */
+
+static UINT8 bPostIncFlags[0x100] = 
+{
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x94,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x90,
+       0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x50
+};
+
+static UINT8 bPostDecFlags[0x100] = 
+{
+       0x92,0x42,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x12,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+       0x16,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,
+       0x92,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82
+};
+
+static UINT8 bPostORFlags[0x100] = 
+{
+       0x44,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
+       0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
+       0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
+       0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
+       0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
+       0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
+       0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,
+       0x00,0x04,0x04,0x00,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x00,0x04,0x04,0x00,
+       0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
+       0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
+       0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
+       0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
+       0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,
+       0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
+       0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84,0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,
+       0x84,0x80,0x80,0x84,0x80,0x84,0x84,0x80,0x80,0x84,0x84,0x80,0x84,0x80,0x80,0x84
+};
+
+static UINT8 bPostANDFlags[0x100] = 
+{
+       0x54,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
+       0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
+       0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
+       0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
+       0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
+       0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
+       0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,
+       0x10,0x14,0x14,0x10,0x14,0x10,0x10,0x14,0x14,0x10,0x10,0x14,0x10,0x14,0x14,0x10,
+       0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
+       0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
+       0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
+       0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
+       0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,
+       0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
+       0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94,0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,
+       0x94,0x90,0x90,0x94,0x90,0x94,0x94,0x90,0x90,0x94,0x94,0x90,0x94,0x90,0x90,0x94
+};
+
+static UINT16 wDAATable[0x800] = 
+{
+       0x5400,0x1001,0x1002,0x1403,0x1004,0x1405,0x1406,0x1007,
+       0x1008,0x1409,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
+       0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,0x1016,0x1417,
+       0x1418,0x1019,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
+       0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,0x1026,0x1427,
+       0x1428,0x1029,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
+       0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,0x1436,0x1037,
+       0x1038,0x1439,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
+       0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,0x1046,0x1447,
+       0x1448,0x1049,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
+       0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,0x1456,0x1057,
+       0x1058,0x1459,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
+       0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,0x1466,0x1067,
+       0x1068,0x1469,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
+       0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,0x1076,0x1477,
+       0x1478,0x1079,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
+       0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,0x9086,0x9487,
+       0x9488,0x9089,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
+       0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,0x9496,0x9097,
+       0x9098,0x9499,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
+       0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
+       0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
+       0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
+       0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
+       0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
+       0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
+       0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
+       0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
+       0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
+       0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
+       0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
+       0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
+       0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,0x1566,0x1167,
+       0x1168,0x1569,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
+       0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,0x1176,0x1577,
+       0x1578,0x1179,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
+       0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,0x9186,0x9587,
+       0x9588,0x9189,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
+       0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,0x9596,0x9197,
+       0x9198,0x9599,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
+       0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,0x95a6,0x91a7,
+       0x91a8,0x95a9,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
+       0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,0x91b6,0x95b7,
+       0x95b8,0x91b9,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
+       0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,0x95c6,0x91c7,
+       0x91c8,0x95c9,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
+       0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,0x91d6,0x95d7,
+       0x95d8,0x91d9,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
+       0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,0x91e6,0x95e7,
+       0x95e8,0x91e9,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
+       0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,0x95f6,0x91f7,
+       0x91f8,0x95f9,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
+       0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,0x1506,0x1107,
+       0x1108,0x1509,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
+       0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,0x1116,0x1517,
+       0x1518,0x1119,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
+       0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,0x1126,0x1527,
+       0x1528,0x1129,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
+       0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,0x1536,0x1137,
+       0x1138,0x1539,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
+       0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,0x1146,0x1547,
+       0x1548,0x1149,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
+       0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,0x1556,0x1157,
+       0x1158,0x1559,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
+       0x1406,0x1007,0x1008,0x1409,0x140a,0x100b,0x140c,0x100d,
+       0x100e,0x140f,0x1010,0x1411,0x1412,0x1013,0x1414,0x1015,
+       0x1016,0x1417,0x1418,0x1019,0x101a,0x141b,0x101c,0x141d,
+       0x141e,0x101f,0x1020,0x1421,0x1422,0x1023,0x1424,0x1025,
+       0x1026,0x1427,0x1428,0x1029,0x102a,0x142b,0x102c,0x142d,
+       0x142e,0x102f,0x1430,0x1031,0x1032,0x1433,0x1034,0x1435,
+       0x1436,0x1037,0x1038,0x1439,0x143a,0x103b,0x143c,0x103d,
+       0x103e,0x143f,0x1040,0x1441,0x1442,0x1043,0x1444,0x1045,
+       0x1046,0x1447,0x1448,0x1049,0x104a,0x144b,0x104c,0x144d,
+       0x144e,0x104f,0x1450,0x1051,0x1052,0x1453,0x1054,0x1455,
+       0x1456,0x1057,0x1058,0x1459,0x145a,0x105b,0x145c,0x105d,
+       0x105e,0x145f,0x1460,0x1061,0x1062,0x1463,0x1064,0x1465,
+       0x1466,0x1067,0x1068,0x1469,0x146a,0x106b,0x146c,0x106d,
+       0x106e,0x146f,0x1070,0x1471,0x1472,0x1073,0x1474,0x1075,
+       0x1076,0x1477,0x1478,0x1079,0x107a,0x147b,0x107c,0x147d,
+       0x147e,0x107f,0x9080,0x9481,0x9482,0x9083,0x9484,0x9085,
+       0x9086,0x9487,0x9488,0x9089,0x908a,0x948b,0x908c,0x948d,
+       0x948e,0x908f,0x9490,0x9091,0x9092,0x9493,0x9094,0x9495,
+       0x9496,0x9097,0x9098,0x9499,0x949a,0x909b,0x949c,0x909d,
+       0x909e,0x949f,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
+       0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
+       0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
+       0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
+       0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
+       0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
+       0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
+       0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
+       0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
+       0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
+       0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
+       0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
+       0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
+       0x1566,0x1167,0x1168,0x1569,0x156a,0x116b,0x156c,0x116d,
+       0x116e,0x156f,0x1170,0x1571,0x1572,0x1173,0x1574,0x1175,
+       0x1176,0x1577,0x1578,0x1179,0x117a,0x157b,0x117c,0x157d,
+       0x157e,0x117f,0x9180,0x9581,0x9582,0x9183,0x9584,0x9185,
+       0x9186,0x9587,0x9588,0x9189,0x918a,0x958b,0x918c,0x958d,
+       0x958e,0x918f,0x9590,0x9191,0x9192,0x9593,0x9194,0x9595,
+       0x9596,0x9197,0x9198,0x9599,0x959a,0x919b,0x959c,0x919d,
+       0x919e,0x959f,0x95a0,0x91a1,0x91a2,0x95a3,0x91a4,0x95a5,
+       0x95a6,0x91a7,0x91a8,0x95a9,0x95aa,0x91ab,0x95ac,0x91ad,
+       0x91ae,0x95af,0x91b0,0x95b1,0x95b2,0x91b3,0x95b4,0x91b5,
+       0x91b6,0x95b7,0x95b8,0x91b9,0x91ba,0x95bb,0x91bc,0x95bd,
+       0x95be,0x91bf,0x95c0,0x91c1,0x91c2,0x95c3,0x91c4,0x95c5,
+       0x95c6,0x91c7,0x91c8,0x95c9,0x95ca,0x91cb,0x95cc,0x91cd,
+       0x91ce,0x95cf,0x91d0,0x95d1,0x95d2,0x91d3,0x95d4,0x91d5,
+       0x91d6,0x95d7,0x95d8,0x91d9,0x91da,0x95db,0x91dc,0x95dd,
+       0x95de,0x91df,0x91e0,0x95e1,0x95e2,0x91e3,0x95e4,0x91e5,
+       0x91e6,0x95e7,0x95e8,0x91e9,0x91ea,0x95eb,0x91ec,0x95ed,
+       0x95ee,0x91ef,0x95f0,0x91f1,0x91f2,0x95f3,0x91f4,0x95f5,
+       0x95f6,0x91f7,0x91f8,0x95f9,0x95fa,0x91fb,0x95fc,0x91fd,
+       0x91fe,0x95ff,0x5500,0x1101,0x1102,0x1503,0x1104,0x1505,
+       0x1506,0x1107,0x1108,0x1509,0x150a,0x110b,0x150c,0x110d,
+       0x110e,0x150f,0x1110,0x1511,0x1512,0x1113,0x1514,0x1115,
+       0x1116,0x1517,0x1518,0x1119,0x111a,0x151b,0x111c,0x151d,
+       0x151e,0x111f,0x1120,0x1521,0x1522,0x1123,0x1524,0x1125,
+       0x1126,0x1527,0x1528,0x1129,0x112a,0x152b,0x112c,0x152d,
+       0x152e,0x112f,0x1530,0x1131,0x1132,0x1533,0x1134,0x1535,
+       0x1536,0x1137,0x1138,0x1539,0x153a,0x113b,0x153c,0x113d,
+       0x113e,0x153f,0x1140,0x1541,0x1542,0x1143,0x1544,0x1145,
+       0x1146,0x1547,0x1548,0x1149,0x114a,0x154b,0x114c,0x154d,
+       0x154e,0x114f,0x1550,0x1151,0x1152,0x1553,0x1154,0x1555,
+       0x1556,0x1157,0x1158,0x1559,0x155a,0x115b,0x155c,0x115d,
+       0x115e,0x155f,0x1560,0x1161,0x1162,0x1563,0x1164,0x1565,
+       0x5600,0x1201,0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,
+       0x1208,0x1609,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
+       0x1210,0x1611,0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,
+       0x1618,0x1219,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
+       0x1220,0x1621,0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,
+       0x1628,0x1229,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
+       0x1630,0x1231,0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,
+       0x1238,0x1639,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
+       0x1240,0x1641,0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,
+       0x1648,0x1249,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
+       0x1650,0x1251,0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,
+       0x1258,0x1659,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
+       0x1660,0x1261,0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,
+       0x1268,0x1669,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
+       0x1270,0x1671,0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,
+       0x1678,0x1279,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
+       0x9280,0x9681,0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,
+       0x9688,0x9289,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
+       0x9690,0x9291,0x9292,0x9693,0x9294,0x9695,0x9696,0x9297,
+       0x9298,0x9699,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
+       0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
+       0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
+       0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
+       0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
+       0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
+       0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
+       0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
+       0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
+       0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
+       0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
+       0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
+       0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
+       0x97a0,0x93a1,0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,
+       0x93a8,0x97a9,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
+       0x93b0,0x97b1,0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,
+       0x97b8,0x93b9,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
+       0x97c0,0x93c1,0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,
+       0x93c8,0x97c9,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
+       0x93d0,0x97d1,0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,
+       0x97d8,0x93d9,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
+       0x93e0,0x97e1,0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,
+       0x97e8,0x93e9,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
+       0x97f0,0x93f1,0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,
+       0x93f8,0x97f9,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
+       0x5700,0x1301,0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,
+       0x1308,0x1709,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
+       0x1310,0x1711,0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,
+       0x1718,0x1319,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
+       0x1320,0x1721,0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,
+       0x1728,0x1329,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
+       0x1730,0x1331,0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,
+       0x1338,0x1739,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
+       0x1340,0x1741,0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,
+       0x1748,0x1349,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
+       0x1750,0x1351,0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,
+       0x1358,0x1759,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
+       0x1760,0x1361,0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,
+       0x1368,0x1769,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
+       0x1370,0x1771,0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,
+       0x1778,0x1379,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
+       0x9380,0x9781,0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,
+       0x9788,0x9389,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
+       0x9790,0x9391,0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,
+       0x9398,0x9799,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
+       0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5600,0x1201,
+       0x1202,0x1603,0x1204,0x1605,0x1606,0x1207,0x1208,0x1609,
+       0x160a,0x120b,0x160c,0x120d,0x120e,0x160f,0x1210,0x1611,
+       0x1612,0x1213,0x1614,0x1215,0x1216,0x1617,0x1618,0x1219,
+       0x121a,0x161b,0x121c,0x161d,0x161e,0x121f,0x1220,0x1621,
+       0x1622,0x1223,0x1624,0x1225,0x1226,0x1627,0x1628,0x1229,
+       0x122a,0x162b,0x122c,0x162d,0x162e,0x122f,0x1630,0x1231,
+       0x1232,0x1633,0x1234,0x1635,0x1636,0x1237,0x1238,0x1639,
+       0x163a,0x123b,0x163c,0x123d,0x123e,0x163f,0x1240,0x1641,
+       0x1642,0x1243,0x1644,0x1245,0x1246,0x1647,0x1648,0x1249,
+       0x124a,0x164b,0x124c,0x164d,0x164e,0x124f,0x1650,0x1251,
+       0x1252,0x1653,0x1254,0x1655,0x1656,0x1257,0x1258,0x1659,
+       0x165a,0x125b,0x165c,0x125d,0x125e,0x165f,0x1660,0x1261,
+       0x1262,0x1663,0x1264,0x1665,0x1666,0x1267,0x1268,0x1669,
+       0x166a,0x126b,0x166c,0x126d,0x126e,0x166f,0x1270,0x1671,
+       0x1672,0x1273,0x1674,0x1275,0x1276,0x1677,0x1678,0x1279,
+       0x127a,0x167b,0x127c,0x167d,0x167e,0x127f,0x9280,0x9681,
+       0x9682,0x9283,0x9684,0x9285,0x9286,0x9687,0x9688,0x9289,
+       0x928a,0x968b,0x928c,0x968d,0x968e,0x928f,0x9690,0x9291,
+       0x9292,0x9693,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
+       0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
+       0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
+       0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
+       0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
+       0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
+       0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
+       0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
+       0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
+       0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
+       0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
+       0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
+       0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799,
+       0x979a,0x939b,0x979c,0x939d,0x939e,0x979f,0x97a0,0x93a1,
+       0x93a2,0x97a3,0x93a4,0x97a5,0x97a6,0x93a7,0x93a8,0x97a9,
+       0x97aa,0x93ab,0x97ac,0x93ad,0x93ae,0x97af,0x93b0,0x97b1,
+       0x97b2,0x93b3,0x97b4,0x93b5,0x93b6,0x97b7,0x97b8,0x93b9,
+       0x93ba,0x97bb,0x93bc,0x97bd,0x97be,0x93bf,0x97c0,0x93c1,
+       0x93c2,0x97c3,0x93c4,0x97c5,0x97c6,0x93c7,0x93c8,0x97c9,
+       0x97ca,0x93cb,0x97cc,0x93cd,0x93ce,0x97cf,0x93d0,0x97d1,
+       0x97d2,0x93d3,0x97d4,0x93d5,0x93d6,0x97d7,0x97d8,0x93d9,
+       0x93da,0x97db,0x93dc,0x97dd,0x97de,0x93df,0x93e0,0x97e1,
+       0x97e2,0x93e3,0x97e4,0x93e5,0x93e6,0x97e7,0x97e8,0x93e9,
+       0x93ea,0x97eb,0x93ec,0x97ed,0x97ee,0x93ef,0x97f0,0x93f1,
+       0x93f2,0x97f3,0x93f4,0x97f5,0x97f6,0x93f7,0x93f8,0x97f9,
+       0x97fa,0x93fb,0x97fc,0x93fd,0x93fe,0x97ff,0x5700,0x1301,
+       0x1302,0x1703,0x1304,0x1705,0x1706,0x1307,0x1308,0x1709,
+       0x170a,0x130b,0x170c,0x130d,0x130e,0x170f,0x1310,0x1711,
+       0x1712,0x1313,0x1714,0x1315,0x1316,0x1717,0x1718,0x1319,
+       0x131a,0x171b,0x131c,0x171d,0x171e,0x131f,0x1320,0x1721,
+       0x1722,0x1323,0x1724,0x1325,0x1326,0x1727,0x1728,0x1329,
+       0x132a,0x172b,0x132c,0x172d,0x172e,0x132f,0x1730,0x1331,
+       0x1332,0x1733,0x1334,0x1735,0x1736,0x1337,0x1338,0x1739,
+       0x173a,0x133b,0x173c,0x133d,0x133e,0x173f,0x1340,0x1741,
+       0x1742,0x1343,0x1744,0x1345,0x1346,0x1747,0x1748,0x1349,
+       0x134a,0x174b,0x134c,0x174d,0x174e,0x134f,0x1750,0x1351,
+       0x1352,0x1753,0x1354,0x1755,0x1756,0x1357,0x1358,0x1759,
+       0x175a,0x135b,0x175c,0x135d,0x135e,0x175f,0x1760,0x1361,
+       0x1362,0x1763,0x1364,0x1765,0x1766,0x1367,0x1368,0x1769,
+       0x176a,0x136b,0x176c,0x136d,0x136e,0x176f,0x1370,0x1771,
+       0x1772,0x1373,0x1774,0x1375,0x1376,0x1777,0x1778,0x1379,
+       0x137a,0x177b,0x137c,0x177d,0x177e,0x137f,0x9380,0x9781,
+       0x9782,0x9383,0x9784,0x9385,0x9386,0x9787,0x9788,0x9389,
+       0x938a,0x978b,0x938c,0x978d,0x978e,0x938f,0x9790,0x9391,
+       0x9392,0x9793,0x9394,0x9795,0x9796,0x9397,0x9398,0x9799 
+};
+
+void DDFDCBHandler(UINT32 dwWhich);
+
+
+static void InvalidInstruction(UINT32 dwCount)
+{
+       pbPC -= dwCount; /* Invalid instruction - back up */
+       dwReturnCode = (UINT32) pbPC - (UINT32) cpu.z80Base;
+       dwOriginalCycles -= sdwCyclesRemaining;
+       sdwCyclesRemaining = 0;
+}
+
+void CBHandler(void)
+{
+       switch (*pbPC++)
+       {
+               case 0x00:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80B >> 7);
+                               cpu.z80B = (cpu.z80B << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x01:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80C >> 7);
+                               cpu.z80C = (cpu.z80C << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x02:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80D >> 7);
+                               cpu.z80D = (cpu.z80D << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x03:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80E >> 7);
+                               cpu.z80E = (cpu.z80E << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x04:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80H >> 7);
+                               cpu.z80H = (cpu.z80H << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x05:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80L >> 7);
+                               cpu.z80L = (cpu.z80L << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x06:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (bTemp >> 7);
+                               bTemp = (bTemp << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x07:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (cpu.z80A >> 7);
+                               cpu.z80A = (cpu.z80A << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x08:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
+                               cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x09:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
+                               cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x0a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
+                               cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x0b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
+                               cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x0c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
+                               cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x0d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
+                               cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x0e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | (bTemp << 7);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x0f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x10:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B >> 7);
+                               cpu.z80B = (cpu.z80B << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x11:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C >> 7);
+                               cpu.z80C = (cpu.z80C << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x12:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D >> 7);
+                               cpu.z80D = (cpu.z80D << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x13:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E >> 7);
+                               cpu.z80E = (cpu.z80E << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x14:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H >> 7);
+                               cpu.z80H = (cpu.z80H << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x15:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L >> 7);
+                               cpu.z80L = (cpu.z80L << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x16:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp >> 7);
+                               bTemp = (bTemp << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x17:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A >> 7);
+                               cpu.z80A = (cpu.z80A << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x18:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
+                               cpu.z80B = (cpu.z80B >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x19:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
+                               cpu.z80C = (cpu.z80C >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x1a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
+                               cpu.z80D = (cpu.z80D >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x1b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
+                               cpu.z80E = (cpu.z80E >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x1c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
+                               cpu.z80H = (cpu.z80H >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x1d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
+                               cpu.z80L = (cpu.z80L >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x1e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x1f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = (cpu.z80A >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x20:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B >> 7);
+                               cpu.z80B = (cpu.z80B << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x21:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C >> 7);
+                               cpu.z80C = (cpu.z80C << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x22:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D >> 7);
+                               cpu.z80D = (cpu.z80D << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x23:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E >> 7);
+                               cpu.z80E = (cpu.z80E << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x24:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H >> 7);
+                               cpu.z80H = (cpu.z80H << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x25:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L >> 7);
+                               cpu.z80L = (cpu.z80L << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x26:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp >> 7);
+                               bTemp = (bTemp << 1);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x27:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A >> 7);
+                               cpu.z80A = (cpu.z80A << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x28:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
+                               cpu.z80B = (cpu.z80B >> 1) | (cpu.z80B & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x29:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
+                               cpu.z80C = (cpu.z80C >> 1) | (cpu.z80C & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x2a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
+                               cpu.z80D = (cpu.z80D >> 1) | (cpu.z80D & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x2b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
+                               cpu.z80E = (cpu.z80E >> 1) | (cpu.z80E & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x2c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
+                               cpu.z80H = (cpu.z80H >> 1) | (cpu.z80H & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x2d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
+                               cpu.z80L = (cpu.z80L >> 1) | (cpu.z80L & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x2e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | (bTemp & 0x80);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x2f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A & 0x80);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x30:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B >> 7);
+                               cpu.z80B = (cpu.z80B << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x31:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C >> 7);
+                               cpu.z80C = (cpu.z80C << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x32:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D >> 7);
+                               cpu.z80D = (cpu.z80D << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x33:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E >> 7);
+                               cpu.z80E = (cpu.z80E << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x34:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H >> 7);
+                               cpu.z80H = (cpu.z80H << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x35:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L >> 7);
+                               cpu.z80L = (cpu.z80L << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x36:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp >> 7);
+                               bTemp = (bTemp << 1);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x37:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A >> 7);
+                               cpu.z80A = (cpu.z80A << 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x38:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80B & Z80_FLAG_CARRY);
+                               cpu.z80B = (cpu.z80B >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x39:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80C & Z80_FLAG_CARRY);
+                               cpu.z80C = (cpu.z80C >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x3a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80D & Z80_FLAG_CARRY);
+                               cpu.z80D = (cpu.z80D >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x3b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80E & Z80_FLAG_CARRY);
+                               cpu.z80E = (cpu.z80E >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x3c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80H & Z80_FLAG_CARRY);
+                               cpu.z80H = (cpu.z80H >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x3d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80L & Z80_FLAG_CARRY);
+                               cpu.z80L = (cpu.z80L >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x3e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x3f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = (cpu.z80A >> 1);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x40:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x41:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x42:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x43:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x44:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x45:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x46:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x47:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x48:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x49:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4e:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x50:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x51:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x52:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x53:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x54:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x55:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x56:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x57:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x58:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x59:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5e:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x60:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x61:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x62:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x63:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x64:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x65:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x66:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x67:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x68:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x69:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6e:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x70:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x71:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x72:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x73:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x74:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x75:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x76:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x77:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x78:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80B & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x79:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80C & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80D & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80E & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80H & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80L & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7e:
+               {
+                       sdwCyclesRemaining -= 12;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(bTemp & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO);
+                               cpu.z80F |= (Z80_FLAG_HALF_CARRY);
+                               if (!(cpu.z80A & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x80:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xfe;
+                       break;
+               }
+               case 0x81:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xfe;
+                       break;
+               }
+               case 0x82:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xfe;
+                       break;
+               }
+               case 0x83:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xfe;
+                       break;
+               }
+               case 0x84:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xfe;
+                       break;
+               }
+               case 0x85:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xfe;
+                       break;
+               }
+               case 0x86:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xfe;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x87:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xfe;
+                       break;
+               }
+               case 0x88:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xfd;
+                       break;
+               }
+               case 0x89:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xfd;
+                       break;
+               }
+               case 0x8a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xfd;
+                       break;
+               }
+               case 0x8b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xfd;
+                       break;
+               }
+               case 0x8c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xfd;
+                       break;
+               }
+               case 0x8d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xfd;
+                       break;
+               }
+               case 0x8e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xfd;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x8f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xfd;
+                       break;
+               }
+               case 0x90:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xfb;
+                       break;
+               }
+               case 0x91:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xfb;
+                       break;
+               }
+               case 0x92:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xfb;
+                       break;
+               }
+               case 0x93:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xfb;
+                       break;
+               }
+               case 0x94:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xfb;
+                       break;
+               }
+               case 0x95:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xfb;
+                       break;
+               }
+               case 0x96:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xfb;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x97:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xfb;
+                       break;
+               }
+               case 0x98:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xf7;
+                       break;
+               }
+               case 0x99:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xf7;
+                       break;
+               }
+               case 0x9a:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xf7;
+                       break;
+               }
+               case 0x9b:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xf7;
+                       break;
+               }
+               case 0x9c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xf7;
+                       break;
+               }
+               case 0x9d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xf7;
+                       break;
+               }
+               case 0x9e:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xf7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x9f:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xf7;
+                       break;
+               }
+               case 0xa0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xef;
+                       break;
+               }
+               case 0xa1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xef;
+                       break;
+               }
+               case 0xa2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xef;
+                       break;
+               }
+               case 0xa3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xef;
+                       break;
+               }
+               case 0xa4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xef;
+                       break;
+               }
+               case 0xa5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xef;
+                       break;
+               }
+               case 0xa6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xef;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xa7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xef;
+                       break;
+               }
+               case 0xa8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xdf;
+                       break;
+               }
+               case 0xa9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xdf;
+                       break;
+               }
+               case 0xaa:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xdf;
+                       break;
+               }
+               case 0xab:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xdf;
+                       break;
+               }
+               case 0xac:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xdf;
+                       break;
+               }
+               case 0xad:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xdf;
+                       break;
+               }
+               case 0xae:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xdf;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xaf:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xdf;
+                       break;
+               }
+               case 0xb0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0xbf;
+                       break;
+               }
+               case 0xb1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0xbf;
+                       break;
+               }
+               case 0xb2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0xbf;
+                       break;
+               }
+               case 0xb3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0xbf;
+                       break;
+               }
+               case 0xb4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0xbf;
+                       break;
+               }
+               case 0xb5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0xbf;
+                       break;
+               }
+               case 0xb6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0xbf;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xb7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0xbf;
+                       break;
+               }
+               case 0xb8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B &= 0x7f;
+                       break;
+               }
+               case 0xb9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C &= 0x7f;
+                       break;
+               }
+               case 0xba:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D &= 0x7f;
+                       break;
+               }
+               case 0xbb:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E &= 0x7f;
+                       break;
+               }
+               case 0xbc:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H &= 0x7f;
+                       break;
+               }
+               case 0xbd:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L &= 0x7f;
+                       break;
+               }
+               case 0xbe:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp &= 0x7f;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xbf:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A &= 0x7f;
+                       break;
+               }
+               case 0xc0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x01;
+                       break;
+               }
+               case 0xc1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x01;
+                       break;
+               }
+               case 0xc2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x01;
+                       break;
+               }
+               case 0xc3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x01;
+                       break;
+               }
+               case 0xc4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x01;
+                       break;
+               }
+               case 0xc5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x01;
+                       break;
+               }
+               case 0xc6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x01;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xc7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x01;
+                       break;
+               }
+               case 0xc8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x02;
+                       break;
+               }
+               case 0xc9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x02;
+                       break;
+               }
+               case 0xca:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x02;
+                       break;
+               }
+               case 0xcb:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x02;
+                       break;
+               }
+               case 0xcc:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x02;
+                       break;
+               }
+               case 0xcd:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x02;
+                       break;
+               }
+               case 0xce:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x02;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xcf:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x02;
+                       break;
+               }
+               case 0xd0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x04;
+                       break;
+               }
+               case 0xd1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x04;
+                       break;
+               }
+               case 0xd2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x04;
+                       break;
+               }
+               case 0xd3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x04;
+                       break;
+               }
+               case 0xd4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x04;
+                       break;
+               }
+               case 0xd5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x04;
+                       break;
+               }
+               case 0xd6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x04;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xd7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x04;
+                       break;
+               }
+               case 0xd8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x08;
+                       break;
+               }
+               case 0xd9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x08;
+                       break;
+               }
+               case 0xda:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x08;
+                       break;
+               }
+               case 0xdb:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x08;
+                       break;
+               }
+               case 0xdc:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x08;
+                       break;
+               }
+               case 0xdd:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x08;
+                       break;
+               }
+               case 0xde:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x08;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xdf:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x08;
+                       break;
+               }
+               case 0xe0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x10;
+                       break;
+               }
+               case 0xe1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x10;
+                       break;
+               }
+               case 0xe2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x10;
+                       break;
+               }
+               case 0xe3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x10;
+                       break;
+               }
+               case 0xe4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x10;
+                       break;
+               }
+               case 0xe5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x10;
+                       break;
+               }
+               case 0xe6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x10;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xe7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x10;
+                       break;
+               }
+               case 0xe8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x20;
+                       break;
+               }
+               case 0xe9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x20;
+                       break;
+               }
+               case 0xea:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x20;
+                       break;
+               }
+               case 0xeb:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x20;
+                       break;
+               }
+               case 0xec:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x20;
+                       break;
+               }
+               case 0xed:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x20;
+                       break;
+               }
+               case 0xee:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x20;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xef:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x20;
+                       break;
+               }
+               case 0xf0:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x40;
+                       break;
+               }
+               case 0xf1:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x40;
+                       break;
+               }
+               case 0xf2:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x40;
+                       break;
+               }
+               case 0xf3:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x40;
+                       break;
+               }
+               case 0xf4:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x40;
+                       break;
+               }
+               case 0xf5:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x40;
+                       break;
+               }
+               case 0xf6:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x40;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xf7:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x40;
+                       break;
+               }
+               case 0xf8:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80B |= 0x80;
+                       break;
+               }
+               case 0xf9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80C |= 0x80;
+                       break;
+               }
+               case 0xfa:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80D |= 0x80;
+                       break;
+               }
+               case 0xfb:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80E |= 0x80;
+                       break;
+               }
+               case 0xfc:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80H |= 0x80;
+                       break;
+               }
+               case 0xfd:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80L |= 0x80;
+                       break;
+               }
+               case 0xfe:
+               {
+                       sdwCyclesRemaining -= 15;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp |= 0x80;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xff:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80A |= 0x80;
+                       break;
+               }
+       }
+}
+void EDHandler(void)
+{
+       switch (*pbPC++)
+       {
+               case 0x00:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x01:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x02:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x03:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x04:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x05:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x06:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x07:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x08:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x09:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x10:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x11:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x12:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x13:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x14:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x15:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x16:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x17:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x18:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x19:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x20:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x21:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x22:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x23:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x24:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x25:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x26:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x27:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x28:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x29:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x2f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x30:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x31:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x32:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x33:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x34:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x35:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x36:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x37:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x38:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x39:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x40:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80B = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80B = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80B];
+                       break;
+               }
+               case 0x41:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80B, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x42:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL - cpu.z80BC - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x43:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, (cpu.z80BC & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwTemp + 1, (cpu.z80BC >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80BC;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80BC;
+                                       cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
+                               }
+
+                       break;
+               }
+               case 0x44:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) 0 << 8) | cpu.z80A];
+                               cpu.z80A = 0 - cpu.z80A;
+                       break;
+               }
+               case 0x45:
+               {
+                       sdwCyclesRemaining -= 14;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               cpu.z80iff &= ~(IFF1);  /* Keep IFF2 around */
+                               cpu.z80iff |= ((cpu.z80iff >> 1) & IFF1);       /* IFF2->IFF1 */
+                       break;
+               }
+               case 0x46:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80interruptMode = 0;
+                       break;
+               }
+               case 0x47:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80i = cpu.z80A;
+                       break;
+               }
+               case 0x48:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80C = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80C = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80C];
+                       break;
+               }
+               case 0x49:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80C, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x4a:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL + cpu.z80BC + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80BC ^ cpu.z80HL ^ 0x8000) & (cpu.z80BC ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x4b:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80BC = psMemRead->memoryCall(dwTemp, psMemRead);
+                                                       cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
+                                                       cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80BC = cpu.z80Base[dwTemp];
+                                       cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
+                               }
+
+                       break;
+               }
+               case 0x4c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4d:
+               {
+                       sdwCyclesRemaining -= 14;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                       break;
+               }
+               case 0x4e:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4f:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80r = cpu.z80A;
+                       break;
+               }
+               case 0x50:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80D = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80D = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80D];
+                       break;
+               }
+               case 0x51:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80D, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x52:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL - cpu.z80DE - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x53:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, (cpu.z80DE & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwTemp + 1, (cpu.z80DE >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80DE;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80DE;
+                                       cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
+                               }
+
+                       break;
+               }
+               case 0x54:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x55:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x56:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80interruptMode = 1;
+                               cpu.z80intAddr = 0x38;
+                       break;
+               }
+               case 0x57:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((cpu.z80iff & IFF2) << 1);
+                               cpu.z80A = cpu.z80i;
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x58:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80E = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80E = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80E];
+                       break;
+               }
+               case 0x59:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80E, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x5a:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL + cpu.z80DE + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80DE ^ cpu.z80HL ^ 0x8000) & (cpu.z80DE ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x5b:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80DE = psMemRead->memoryCall(dwTemp, psMemRead);
+                                                       cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
+                                                       cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80DE = cpu.z80Base[dwTemp];
+                                       cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
+                               }
+
+                       break;
+               }
+               case 0x5c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5e:
+               {
+                       sdwCyclesRemaining -= 8;
+                               cpu.z80interruptMode = 2;
+                       break;
+               }
+               case 0x5f:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80r];
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_OVERFLOW_PARITY)) | ((cpu.z80iff & IFF2) << 1);
+                               cpu.z80A = cpu.z80r;
+                               bTemp = (cpu.z80r + (cpu.z80B + sdwCyclesRemaining + 1 + cpu.z80H)) ^ cpu.z80A;
+                               cpu.z80r = (cpu.z80r & 0x80) | (bTemp & 0x7f);
+                       break;
+               }
+               case 0x60:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80H = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80H = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80H];
+                       break;
+               }
+               case 0x61:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80H, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x62:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL - cpu.z80HL - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x63:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
+                                       cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
+                               }
+
+                       break;
+               }
+               case 0x64:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x65:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x66:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x67:
+               {
+                       sdwCyclesRemaining -= 18;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = (cpu.z80A & 0x0f) << 4;
+                               cpu.z80A = (cpu.z80A & 0xf0) | (bTemp & 0x0f);
+                               bTemp = (bTemp >> 4) | bTemp2;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x68:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80L = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80L = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80L];
+                       break;
+               }
+               case 0x69:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80L, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x6a:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL + cpu.z80HL + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80HL ^ cpu.z80HL ^ 0x8000) & (cpu.z80HL ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x6b:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x6c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x6d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x6e:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x6f:
+               {
+                       sdwCyclesRemaining -= 18;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = (cpu.z80A & 0x0f);
+                               cpu.z80A = (cpu.z80A & 0xf0) | (bTemp >> 4);
+                               bTemp = (bTemp << 4) | bTemp2;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x70:
+               {
+                       sdwCyclesRemaining -= 12;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x71:
+               {
+                       sdwCyclesRemaining -= 12;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x72:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL - cpu.z80sp - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x73:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, (cpu.z80sp & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwTemp + 1, (cpu.z80sp >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80sp;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80sp >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80sp;
+                                       cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80sp >> 8);
+                               }
+
+                       break;
+               }
+               case 0x74:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x75:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x76:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x77:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x78:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoRead->lowIoAddr) && (dwAddr <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80A = psIoRead->IOCall(dwAddr, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80A = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+                       break;
+               }
+               case 0x79:
+               {
+                       sdwCyclesRemaining -= 12;
+                               dwAddr = cpu.z80C;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwAddr >= psIoWrite->lowIoAddr) && (dwAddr <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwAddr, cpu.z80A, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                       break;
+               }
+               case 0x7a:
+               {
+                       sdwCyclesRemaining -= 15;
+                               dwTemp = cpu.z80HL + cpu.z80sp + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= ((dwTemp >> 8) & Z80_FLAG_SIGN);
+                               if (0 == (dwTemp & 0xffff))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                               cpu.z80F |= (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= ((((cpu.z80sp ^ cpu.z80HL ^ 0x8000) & (cpu.z80sp ^ dwTemp)) >> 13) & Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY);
+                               cpu.z80HL = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x7b:
+               {
+                       sdwCyclesRemaining -= 20;
+               dwTemp = *pbPC++;
+               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80sp = psMemRead->memoryCall(dwTemp, psMemRead);
+                                                       cpu.z80sp |= (UINT32) ((UINT32) psMemRead->memoryCall(dwTemp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80sp = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
+                                                       cpu.z80sp |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80sp = cpu.z80Base[dwTemp];
+                                       cpu.z80sp |= (UINT32) ((UINT32) cpu.z80Base[dwTemp + 1] << 8);
+                               }
+
+                       break;
+               }
+               case 0x7c:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7d:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7e:
+               {
+                       sdwCyclesRemaining -= 8;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x80:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x81:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x82:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x83:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x84:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x85:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x86:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x87:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x88:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x89:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x90:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x91:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x92:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x93:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x94:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x95:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x96:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x97:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x98:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x99:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa0:
+               {
+                       sdwCyclesRemaining -= 16;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
+                               }
+
+                                       ++cpu.z80HL;
+                                       ++cpu.z80DE;
+                               --cpu.z80BC;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80DE &= 0xffff;
+                               cpu.z80BC &= 0xffff;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xa1:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80BC--;
+                               cpu.z80BC &= 0xffff;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xa2:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       bTemp = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                                       pbPC -= 2;
+                               }
+                       break;
+               }
+               case 0xa3:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xa4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa8:
+               {
+                       sdwCyclesRemaining -= 16;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
+                               }
+
+                                       --cpu.z80HL;
+                                       --cpu.z80DE;
+                               --cpu.z80BC;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80DE &= 0xffff;
+                               cpu.z80BC &= 0xffff;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xa9:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80BC--;
+                               cpu.z80BC &= 0xffff;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xaa:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       bTemp = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                                       pbPC -= 2;
+                               }
+                       break;
+               }
+               case 0xab:
+               {
+                       sdwCyclesRemaining -= 16;
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xac:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xad:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xae:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xaf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb0:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
+                               }
+
+                                       ++cpu.z80HL;
+                                       ++cpu.z80DE;
+                               --cpu.z80BC;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80DE &= 0xffff;
+                               cpu.z80BC &= 0xffff;
+                               sdwCyclesRemaining -= 21;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
+                               if (cpu.z80BC)
+                               {
+                                       pbPC -= 2;      /* Back up so we hit this instruction again */
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                               sdwCyclesRemaining -= 16;
+                       break;
+               }
+               case 0xb1:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80BC--;
+                               cpu.z80BC &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               if (cpu.z80A == bTemp)
+                               {
+                                       break;
+                               }
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xb2:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80B))
+                               {
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       bTemp = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                                       pbPC -= 2;
+                               }
+                       break;
+               }
+               case 0xb3:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80B))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xb4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb8:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80BC))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80DE, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80DE] = (UINT8) bTemp;
+                               }
+
+                                       --cpu.z80HL;
+                                       --cpu.z80DE;
+                               --cpu.z80BC;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80DE &= 0xffff;
+                               cpu.z80BC &= 0xffff;
+                               sdwCyclesRemaining -= 21;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY);
+                               if (cpu.z80BC)
+                               {
+                                       pbPC -= 2;      /* Back up so we hit this instruction again */
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                               sdwCyclesRemaining -= 16;
+                       break;
+               }
+               case 0xb9:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining >= 0) && (cpu.z80BC))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               cpu.z80BC--;
+                               cpu.z80BC &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               if (cpu.z80A == bTemp)
+                               {
+                                       break;
+                               }
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_ZERO));
+                               if (cpu.z80BC)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xba:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80B))
+                               {
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80B >= psIoRead->lowIoAddr) && (cpu.z80B <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               bTemp = psIoRead->IOCall(cpu.z80B, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       bTemp = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                                       pbPC -= 2;
+                               }
+                       break;
+               }
+               case 0xbb:
+               {
+                       sdwCyclesRemaining -= 16;
+                               while ((sdwCyclesRemaining > 0) && (cpu.z80B))
+                               {
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((cpu.z80BC >= psIoWrite->lowIoAddr) && (cpu.z80BC <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(cpu.z80BC, bTemp, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               sdwCyclesRemaining -= 16;
+                               cpu.z80B--;
+                               }
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= (bPostORFlags[bTemp] & (Z80_FLAG_SIGN | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY));
+                               if (cpu.z80B)
+                               {
+                                       cpu.z80F |= Z80_FLAG_OVERFLOW_PARITY;
+                               }
+                       break;
+               }
+               case 0xbc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbe:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xca:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xce:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xda:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xde:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xea:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xeb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xec:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xed:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xee:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xef:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfa:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfe:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xff:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+       }
+}
+
+void DDHandler(void)
+{
+       switch (*pbPC++)
+       {
+               case 0x00:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x01:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x02:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x03:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x04:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x05:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x06:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x07:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x08:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x09:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IX + cpu.z80BC;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IX = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x0a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x10:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x11:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x12:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x13:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x14:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x15:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x16:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x17:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x18:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x19:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IX + cpu.z80DE;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IX = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x1a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x20:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x21:
+               {
+                       sdwCyclesRemaining -= 14;
+               cpu.z80IX = *pbPC++;
+               cpu.z80IX |= ((UINT32) *pbPC++ << 8);
+                       break;
+               }
+               case 0x22:
+               {
+                       sdwCyclesRemaining -= 20;
+                               dwAddr = *pbPC++;
+                               dwAddr |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, (cpu.z80IX & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IX >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IX;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) cpu.z80IX;
+                                       cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
+                               }
+
+                       break;
+               }
+               case 0x23:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80IX++;
+                               cpu.z80IX &= 0xffff;
+                       break;
+               }
+               case 0x24:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80XH++];
+                       break;
+               }
+               case 0x25:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[cpu.z80XH--];
+                       break;
+               }
+               case 0x26:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = *pbPC++;
+                       break;
+               }
+               case 0x27:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x28:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x29:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IX + cpu.z80IX;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IX = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x2a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               dwAddr = *pbPC++;
+                               dwAddr |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80IX = psMemRead->memoryCall(dwAddr, psMemRead);
+                                                       cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                                       cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80IX = cpu.z80Base[dwAddr];
+                                       cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
+                               }
+
+                       break;
+               }
+               case 0x2b:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80IX--;
+                               cpu.z80IX &= 0xffff;
+                       break;
+               }
+               case 0x2c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80XL++];
+                       break;
+               }
+               case 0x2d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[cpu.z80XL--];
+                       break;
+               }
+               case 0x2e:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = *pbPC++;
+                       break;
+               }
+               case 0x2f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x30:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x31:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x32:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x33:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x34:
+               {
+                       sdwCyclesRemaining -= 23;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[bTemp++];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x35:
+               {
+                       sdwCyclesRemaining -= 23;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[bTemp--];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x36:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
+                               }
+
+                       break;
+               }
+               case 0x37:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x38:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x39:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IX + cpu.z80sp;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IX ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IX = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x3a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x40:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x41:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x42:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x43:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x44:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80B = cpu.z80XH;
+                       break;
+               }
+               case 0x45:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80B = cpu.z80XL;
+                       break;
+               }
+               case 0x46:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80B = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x47:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x48:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x49:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80C = cpu.z80XH;
+                       break;
+               }
+               case 0x4d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80C = cpu.z80XL;
+                       break;
+               }
+               case 0x4e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80C = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x4f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x50:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x51:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x52:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x53:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x54:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80D = cpu.z80XH;
+                       break;
+               }
+               case 0x55:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80D = cpu.z80XL;
+                       break;
+               }
+               case 0x56:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80D = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x57:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x58:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x59:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80E = cpu.z80XH;
+                       break;
+               }
+               case 0x5d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80E = cpu.z80XL;
+                       break;
+               }
+               case 0x5e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80E = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x5f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x60:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80B;
+                       break;
+               }
+               case 0x61:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80C;
+                       break;
+               }
+               case 0x62:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80D;
+                       break;
+               }
+               case 0x63:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80E;
+                       break;
+               }
+               case 0x64:
+               {
+                       sdwCyclesRemaining -= 9;
+                       break;
+               }
+               case 0x65:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80XL;
+                       break;
+               }
+               case 0x66:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80H = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x67:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XH = cpu.z80A;
+                       break;
+               }
+               case 0x68:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80B;
+                       break;
+               }
+               case 0x69:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80C;
+                       break;
+               }
+               case 0x6a:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80D;
+                       break;
+               }
+               case 0x6b:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80E;
+                       break;
+               }
+               case 0x6c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80XH;
+                       break;
+               }
+               case 0x6d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       break;
+               }
+               case 0x6e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80L = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x6f:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80XL = cpu.z80A;
+                       break;
+               }
+               case 0x70:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
+                               }
+
+                       break;
+               }
+               case 0x71:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
+                               }
+
+                       break;
+               }
+               case 0x72:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
+                               }
+
+                       break;
+               }
+               case 0x73:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
+                               }
+
+                       break;
+               }
+               case 0x74:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
+                               }
+
+                       break;
+               }
+               case 0x75:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
+                               }
+
+                       break;
+               }
+               case 0x76:
+               {
+                       sdwCyclesRemaining -= 19;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x77:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
+                               }
+
+                       break;
+               }
+               case 0x78:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x79:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80A = cpu.z80XH;
+                       break;
+               }
+               case 0x7d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80A = cpu.z80XL;
+                       break;
+               }
+               case 0x7e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IX + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x7f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x80:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x81:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x82:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x83:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x84:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80XH;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x85:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80XL;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x86:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A += bTemp;
+                       break;
+               }
+               case 0x87:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x88:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x89:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80XH + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80XL + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A += bTemp + bTemp2;
+                       break;
+               }
+               case 0x8f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x90:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x91:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x92:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x93:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x94:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80XH;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x95:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80XL;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x96:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A -= bTemp;
+                       break;
+               }
+               case 0x97:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x98:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x99:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80XH - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80XL - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80XL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               bTemp2 = cpu.z80A;
+                               cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                       break;
+               }
+               case 0x9f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa4:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A &= cpu.z80XH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa5:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A &= cpu.z80XL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa6:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A &= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xa7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xaa:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xab:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xac:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A ^= cpu.z80XH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xad:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A ^= cpu.z80XL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xae:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A ^= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xaf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb4:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A |= cpu.z80XH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb5:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A |= cpu.z80XL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb6:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A |= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xb7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xba:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbc:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbd:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbe:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IX) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                       break;
+               }
+               case 0xbf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xca:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcb:
+               {
+                               DDFDCBHandler(0);
+                       break;
+               }
+               case 0xcc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xce:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xda:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xde:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe1:
+               {
+                       sdwCyclesRemaining -= 14;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80IX = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80IX |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80IX = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80IX |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80IX = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80IX |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                       break;
+               }
+               case 0xe2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe3:
+               {
+                       sdwCyclesRemaining -= 23;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       dwAddr = cpu.z80Base[cpu.z80sp];
+                                       dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
+                               }
+
+                               cpu.z80IX = dwAddr;
+                       break;
+               }
+               case 0xe4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe5:
+               {
+                       sdwCyclesRemaining -= 15;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IX & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IX >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IX;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IX >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IX;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IX >> 8);
+                               }
+
+                       break;
+               }
+               case 0xe6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               pbPC = cpu.z80Base + cpu.z80IX;
+                       break;
+               }
+               case 0xea:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xeb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xec:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xed:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xee:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xef:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf9:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80sp = cpu.z80IX;
+                       break;
+               }
+               case 0xfa:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfe:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xff:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+       }
+}
+void DDFDCBHandler(UINT32 dwWhich)
+{
+       if (dwWhich)
+       {
+               dwAddr = (UINT32) ((INT32) cpu.z80IY + ((INT32) *pbPC++)) & 0xffff;
+       }
+       else
+       {
+               dwAddr = (UINT32) ((INT32) cpu.z80IX + ((INT32) *pbPC++)) & 0xffff;
+       }
+
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+       switch (*pbPC++)
+       {
+               case 0x00:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x01:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x02:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x03:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x04:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x05:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x06:
+               {
+                       sdwCyclesRemaining -= 23;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               bTemp2 = (bTemp >> 7);
+                               bTemp = (bTemp << 1) | bTemp2;
+                               cpu.z80F |= bTemp2 | bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x07:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x08:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x09:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x0a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x0b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x0c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x0d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x0e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | (bTemp << 7);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x0f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x10:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x11:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x12:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x13:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x14:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x15:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x16:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp2 = cpu.z80F & Z80_FLAG_CARRY;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp >> 7);
+                               bTemp = (bTemp << 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x17:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x18:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x19:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x1a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x1b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x1c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x1d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x1e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | bTemp2;
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x1f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x20:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x21:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x22:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x23:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x24:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x25:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x26:
+               {
+                       sdwCyclesRemaining -= 23;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp >> 7);
+                               bTemp = (bTemp << 1);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x27:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x28:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x29:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x2a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x2b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x2c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x2d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x2e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1) | (bTemp & 0x80);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x2f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x30:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x31:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x32:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x33:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x34:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x35:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x36:
+               {
+                       sdwCyclesRemaining -= 23;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x37:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x38:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x39:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x3a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x3b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x3c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x3d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x3e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               cpu.z80F &= ~(Z80_FLAG_ZERO | Z80_FLAG_SIGN | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE | Z80_FLAG_CARRY);
+                               cpu.z80F |= (bTemp & Z80_FLAG_CARRY);
+                               bTemp = (bTemp >> 1);
+                               cpu.z80F |= bPostORFlags[bTemp];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x3f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x40:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x41:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x42:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x43:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x44:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x45:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x46:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x01))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x47:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x48:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x49:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x4a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x4b:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x4c:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x4d:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x4e:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x02))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x4f:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x50:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x51:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x52:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x53:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x54:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x55:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x56:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x04))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x57:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x58:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x59:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x5a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x5b:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x5c:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x5d:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x5e:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x08))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x5f:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x60:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x61:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x62:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x63:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x64:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x65:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x66:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x10))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x67:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x68:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x69:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x6a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x6b:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x6c:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x6d:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x6e:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x20))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x6f:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x70:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x71:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x72:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x73:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x74:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x75:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x76:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x40))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x77:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x78:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x79:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x7a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x7b:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x7c:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x7d:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x7e:
+               {
+                       sdwCyclesRemaining -= 20;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_ZERO | Z80_FLAG_NEGATIVE)) | Z80_FLAG_HALF_CARRY;
+                               if (!(bTemp & 0x80))
+                               {
+                                       cpu.z80F |= Z80_FLAG_ZERO;
+                               }
+                       break;
+               }
+               case 0x7f:
+               {
+                       sdwCyclesRemaining -= 20;
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x80:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x81:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x82:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x83:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x84:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x85:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x86:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xfe;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x87:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x88:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x89:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x8a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x8b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x8c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x8d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x8e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xfd;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x8f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x90:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x91:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x92:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x93:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x94:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x95:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x96:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xfb;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x97:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x98:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x99:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x9a:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x9b:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x9c:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x9d:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0x9e:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xf7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x9f:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xef;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xa7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xa9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xaa:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xab:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xac:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xad:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xae:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xdf;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xaf:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0xbf;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xb7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xb9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xba:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xbb:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xbc:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xbd:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xbe:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp &= 0x7f;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xbf:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x01;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xc7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xc9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xca:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xcb:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xcc:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xcd:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xce:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x02;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xcf:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x04;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xd7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xd9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xda:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xdb:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xdc:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xdd:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xde:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x08;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xdf:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x10;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xe7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xe9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xea:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xeb:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xec:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xed:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xee:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x20;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xef:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf0:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf1:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf2:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf3:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf4:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf5:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf6:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x40;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xf7:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf8:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xf9:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xfa:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xfb:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xfc:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xfd:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+               case 0xfe:
+               {
+                       sdwCyclesRemaining -= 23;
+                               bTemp |= 0x80;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0xff:
+               {
+                               InvalidInstruction(4);
+                       break;
+               }
+       }
+}
+void FDHandler(void)
+{
+       switch (*pbPC++)
+       {
+               case 0x00:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x01:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x02:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x03:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x04:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x05:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x06:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x07:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x08:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x09:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IY + cpu.z80BC;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IY = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x0a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x0f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x10:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x11:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x12:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x13:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x14:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x15:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x16:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x17:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x18:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x19:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IY + cpu.z80DE;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IY = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x1a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x1f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x20:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x21:
+               {
+                       sdwCyclesRemaining -= 14;
+               cpu.z80IY = *pbPC++;
+               cpu.z80IY |= ((UINT32) *pbPC++ << 8);
+                       break;
+               }
+               case 0x22:
+               {
+                       sdwCyclesRemaining -= 20;
+                               dwAddr = *pbPC++;
+                               dwAddr |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, (cpu.z80IY & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwAddr + 1, (cpu.z80IY >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = cpu.z80IY;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) cpu.z80IY;
+                                       cpu.z80Base[dwAddr + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
+                               }
+
+                       break;
+               }
+               case 0x23:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80IY++;
+                               cpu.z80IY &= 0xffff;
+                       break;
+               }
+               case 0x24:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80YH++];
+                       break;
+               }
+               case 0x25:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[cpu.z80YH--];
+                       break;
+               }
+               case 0x26:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = *pbPC++;
+                       break;
+               }
+               case 0x27:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x28:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x29:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IY + cpu.z80IY;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IY = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x2a:
+               {
+                       sdwCyclesRemaining -= 20;
+                               dwAddr = *pbPC++;
+                               dwAddr |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80IY = psMemRead->memoryCall(dwAddr, psMemRead);
+                                                       cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                                       cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80IY = cpu.z80Base[dwAddr];
+                                       cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
+                               }
+
+                       break;
+               }
+               case 0x2b:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80IY--;
+                               cpu.z80IY &= 0xffff;
+                       break;
+               }
+               case 0x2c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80YL++];
+                       break;
+               }
+               case 0x2d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[cpu.z80YL--];
+                       break;
+               }
+               case 0x2e:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = *pbPC++;
+                       break;
+               }
+               case 0x2f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x30:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x31:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x32:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x33:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x34:
+               {
+                       sdwCyclesRemaining -= 23;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[bTemp++];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x35:
+               {
+                       sdwCyclesRemaining -= 23;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[bTemp--];
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemWrite->lowAddr) && (dwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwAddr, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwAddr - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwAddr] = (UINT8) bTemp;
+                               }
+
+                       break;
+               }
+               case 0x36:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, *pbPC++, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = *pbPC++;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) *pbPC++;
+                               }
+
+                       break;
+               }
+               case 0x37:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x38:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x39:
+               {
+                       sdwCyclesRemaining -= 15;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80IY + cpu.z80sp;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80IY ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80IY = dwTemp & 0xffff;
+                       break;
+               }
+               case 0x3a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3c:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3d:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3e:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x3f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x40:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x41:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x42:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x43:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x44:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80B = cpu.z80YH;
+                       break;
+               }
+               case 0x45:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80B = cpu.z80YL;
+                       break;
+               }
+               case 0x46:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80B = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80B = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x47:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x48:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x49:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x4c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80C = cpu.z80YH;
+                       break;
+               }
+               case 0x4d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80C = cpu.z80YL;
+                       break;
+               }
+               case 0x4e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80C = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80C = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x4f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x50:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x51:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x52:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x53:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x54:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80D = cpu.z80YH;
+                       break;
+               }
+               case 0x55:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80D = cpu.z80YL;
+                       break;
+               }
+               case 0x56:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80D = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80D = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x57:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x58:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x59:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x5c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80E = cpu.z80YH;
+                       break;
+               }
+               case 0x5d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80E = cpu.z80YL;
+                       break;
+               }
+               case 0x5e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80E = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80E = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x5f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x60:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80B;
+                       break;
+               }
+               case 0x61:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80C;
+                       break;
+               }
+               case 0x62:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80D;
+                       break;
+               }
+               case 0x63:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80E;
+                       break;
+               }
+               case 0x64:
+               {
+                       sdwCyclesRemaining -= 9;
+                       break;
+               }
+               case 0x65:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80YL;
+                       break;
+               }
+               case 0x66:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80H = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80H = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x67:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YH = cpu.z80A;
+                       break;
+               }
+               case 0x68:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80B;
+                       break;
+               }
+               case 0x69:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80C;
+                       break;
+               }
+               case 0x6a:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80D;
+                       break;
+               }
+               case 0x6b:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80E;
+                       break;
+               }
+               case 0x6c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80YH;
+                       break;
+               }
+               case 0x6d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       break;
+               }
+               case 0x6e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80L = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80L = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x6f:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80YL = cpu.z80A;
+                       break;
+               }
+               case 0x70:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80B, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80B;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80B;
+                               }
+
+                       break;
+               }
+               case 0x71:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80C, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80C;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80C;
+                               }
+
+                       break;
+               }
+               case 0x72:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80D, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80D;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80D;
+                               }
+
+                       break;
+               }
+               case 0x73:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80E, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80E;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80E;
+                               }
+
+                       break;
+               }
+               case 0x74:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80H, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80H;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80H;
+                               }
+
+                       break;
+               }
+               case 0x75:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80L, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80L;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80L;
+                               }
+
+                       break;
+               }
+               case 0x76:
+               {
+                       sdwCyclesRemaining -= 19;
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x77:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemWrite->lowAddr) && (sdwAddr <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(sdwAddr, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (sdwAddr - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[sdwAddr] = (UINT8) cpu.z80A;
+                               }
+
+                       break;
+               }
+               case 0x78:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x79:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x7c:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80A = cpu.z80YH;
+                       break;
+               }
+               case 0x7d:
+               {
+                       sdwCyclesRemaining -= 9;
+                       cpu.z80A = cpu.z80YL;
+                       break;
+               }
+               case 0x7e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       // Get the offset
+                               sdwAddr = ((INT32) cpu.z80IY + sdwAddr) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((sdwAddr >= psMemRead->lowAddr) && (sdwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(sdwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (sdwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[sdwAddr];
+                               }
+
+                       break;
+               }
+               case 0x7f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x80:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x81:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x82:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x83:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x84:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80YH;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x85:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80YL;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x86:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A += bTemp;
+                       break;
+               }
+               case 0x87:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x88:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x89:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80YH + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A + cpu.z80YL + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x8e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               bTemp2 = (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A += bTemp + bTemp2;
+                       break;
+               }
+               case 0x8f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x90:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x91:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x92:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x93:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x94:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80YH;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x95:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80YL;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x96:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A -= bTemp;
+                       break;
+               }
+               case 0x97:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x98:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x99:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9a:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9b:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9c:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80YH - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YH | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9d:
+               {
+                       sdwCyclesRemaining -= 9;
+                               bTemp2 = cpu.z80A - cpu.z80YL - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80YL | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0x9e:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               bTemp2 = cpu.z80A;
+                               cpu.z80A = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) bTemp2 << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                       break;
+               }
+               case 0x9f:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa4:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A &= cpu.z80YH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa5:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A &= cpu.z80YL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa6:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A &= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xa7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xa9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xaa:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xab:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xac:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A ^= cpu.z80YH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xad:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A ^= cpu.z80YL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xae:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A ^= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xaf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb4:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A |= cpu.z80YH;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb5:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80A |= cpu.z80YL;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb6:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80A |= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                       break;
+               }
+               case 0xb7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xb9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xba:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbc:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbd:
+               {
+                       sdwCyclesRemaining -= 9;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xbe:
+               {
+                       sdwCyclesRemaining -= 19;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               dwAddr = (sdwAddr + (INT32) cpu.z80IY) & 0xffff;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(dwAddr, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[dwAddr];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                       break;
+               }
+               case 0xbf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xc9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xca:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcb:
+               {
+                               DDFDCBHandler(1);
+                       break;
+               }
+               case 0xcc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xce:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xcf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xd9:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xda:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xde:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xdf:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe1:
+               {
+                       sdwCyclesRemaining -= 14;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80IY = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80IY |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80IY = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80IY |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80IY = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80IY |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                       break;
+               }
+               case 0xe2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe3:
+               {
+                       sdwCyclesRemaining -= 23;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       dwAddr = cpu.z80Base[cpu.z80sp];
+                                       dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
+                               }
+
+                               cpu.z80IY = dwAddr;
+                       break;
+               }
+               case 0xe4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe5:
+               {
+                       sdwCyclesRemaining -= 15;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80IY & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80IY >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80IY;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80IY >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80IY;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80IY >> 8);
+                               }
+
+                       break;
+               }
+               case 0xe6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xe9:
+               {
+                       sdwCyclesRemaining -= 8;
+                               pbPC = cpu.z80Base + cpu.z80IY;
+                       break;
+               }
+               case 0xea:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xeb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xec:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xed:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xee:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xef:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf0:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf1:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf2:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf3:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf4:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf5:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf6:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf7:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf8:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xf9:
+               {
+                       sdwCyclesRemaining -= 10;
+                               cpu.z80sp = cpu.z80IY;
+                       break;
+               }
+               case 0xfa:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfb:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfc:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfd:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xfe:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+               case 0xff:
+               {
+                               InvalidInstruction(2);
+                       break;
+               }
+       }
+}
+/* Main execution entry point */
+
+UINT32 mz80exec(UINT32 dwCycles)
+{
+       UINT8 bOpcode;
+
+       dwReturnCode = 0x80000000; /* Assume it'll work */
+       sdwCyclesRemaining = dwCycles;
+       dwOriginalCycles = dwCycles;
+               if (cpu.z80halted)
+               {
+               dwElapsedTicks += dwCycles;
+               return(0x80000000);
+               }
+
+       pbPC = cpu.z80Base + cpu.z80pc;
+
+       while (sdwCyclesRemaining > 0)
+       {
+               bOpcode = *pbPC++;
+               switch (bOpcode)
+               {
+                       case 0x00:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               /* Intentionally not doing anything - NOP! */
+                               break;
+                       }
+                       case 0x01:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               cpu.z80BC = *pbPC++;    /* LSB First */
+                               cpu.z80BC |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
+                               break;
+                       }
+                       case 0x02:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80BC >= psMemWrite->lowAddr) && (cpu.z80BC <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80BC, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80BC - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80BC] = (UINT8) cpu.z80A;
+                               }
+
+                               break;
+                       }
+                       case 0x03:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80BC++;
+                               cpu.z80BC &= 0xffff;
+                               break;
+                       }
+                       case 0x04:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80B++];
+                               break;
+                       }
+                       case 0x05:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80B--];
+                               break;
+                       }
+                       case 0x06:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80B = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x07:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= (cpu.z80A >> 7);
+                               cpu.z80A = (cpu.z80A << 1) | (cpu.z80A >> 7);
+                               break;
+                       }
+                       case 0x08:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               dwAddr = (UINT32) cpu.z80AF;
+                               cpu.z80AF = cpu.z80afprime;
+                               cpu.z80afprime = dwAddr;
+                               break;
+                       }
+                       case 0x09:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80HL + cpu.z80BC;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80BC) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80HL = dwTemp & 0xffff;
+                               break;
+                       }
+                       case 0x0a:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80BC >= psMemRead->lowAddr) && (cpu.z80BC <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(cpu.z80BC, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80BC - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[cpu.z80BC];
+                               }
+
+                               break;
+                       }
+                       case 0x0b:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80BC--;
+                               cpu.z80BC &= 0xffff;
+                               break;
+                       }
+                       case 0x0c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80C++];
+                               break;
+                       }
+                       case 0x0d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80C--];
+                               break;
+                       }
+                       case 0x0e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80C = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x0f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                               cpu.z80F |= (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = (cpu.z80A >> 1) | (cpu.z80A << 7);
+                               break;
+                       }
+                       case 0x10:
+                       {
+                               sdwCyclesRemaining -= 8;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               if (--cpu.z80B)
+                               {
+                                       dwElapsedTicks += 5;    /* 5 More for jump taken */
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x11:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               cpu.z80DE = *pbPC++;    /* LSB First */
+                               cpu.z80DE |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
+                               break;
+                       }
+                       case 0x12:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemWrite->lowAddr) && (cpu.z80DE <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80DE, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80DE - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80DE] = (UINT8) cpu.z80A;
+                               }
+
+                               break;
+                       }
+                       case 0x13:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80DE++;
+                               cpu.z80DE &= 0xffff;
+                               break;
+                       }
+                       case 0x14:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80D++];
+                               break;
+                       }
+                       case 0x15:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80D--];
+                               break;
+                       }
+                       case 0x16:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80D = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x17:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp = cpu.z80A >> 7;
+                               cpu.z80A = (cpu.z80A << 1) | (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | bTemp;
+                               break;
+                       }
+                       case 0x18:
+                       {
+                               sdwCyclesRemaining -= 12;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                               {
+                               sdwCyclesRemaining -= 5;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x19:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80HL + cpu.z80DE;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80DE) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80HL = dwTemp & 0xffff;
+                               break;
+                       }
+                       case 0x1a:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80DE >= psMemRead->lowAddr) && (cpu.z80DE <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(cpu.z80DE, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80DE - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[cpu.z80DE];
+                               }
+
+                               break;
+                       }
+                       case 0x1b:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80DE--;
+                               cpu.z80DE &= 0xffff;
+                               break;
+                       }
+                       case 0x1c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80E++];
+                               break;
+                       }
+                       case 0x1d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80E--];
+                               break;
+                       }
+                       case 0x1e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80E = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x1f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 7;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY)) | (cpu.z80A & Z80_FLAG_CARRY);
+                               cpu.z80A = ((cpu.z80A >> 1) | bTemp);
+                               break;
+                       }
+                       case 0x20:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                               if (!(cpu.z80F & Z80_FLAG_ZERO))
+                               {
+                               sdwCyclesRemaining -= 5;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x21:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               cpu.z80HL = *pbPC++;    /* LSB First */
+                               cpu.z80HL |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
+                               break;
+                       }
+                       case 0x22:
+                       {
+                               sdwCyclesRemaining -= 16;
+                               dwTemp = *pbPC++;
+                               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, (cpu.z80HL & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(dwTemp + 1, (cpu.z80HL >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80HL;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80HL;
+                                       cpu.z80Base[dwTemp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
+                               }
+
+                               break;
+                       }
+                       case 0x23:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80HL++;
+                               cpu.z80HL &= 0xffff;
+                               break;
+                       }
+                       case 0x24:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80H++];
+                               break;
+                       }
+                       case 0x25:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80H--];
+                               break;
+                       }
+                       case 0x26:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80H = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x27:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               dwAddr = (((cpu.z80F & Z80_FLAG_CARRY) | 
+                                               ((cpu.z80F & Z80_FLAG_HALF_CARRY) >> 3) | 
+                                               ((cpu.z80F & Z80_FLAG_NEGATIVE) << 1)) << 8) | cpu.z80A;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= (wDAATable[dwAddr] >> 8);
+                               cpu.z80A = wDAATable[dwAddr] & 0xff;
+                               break;
+                       }
+                       case 0x28:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                               if (cpu.z80F & Z80_FLAG_ZERO)
+                               {
+                               sdwCyclesRemaining -= 5;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x29:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80HL + cpu.z80HL;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80HL) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80HL = dwTemp & 0xffff;
+                               break;
+                       }
+                       case 0x2a:
+                       {
+                               sdwCyclesRemaining -= 16;
+                               dwAddr = *pbPC++;
+                               dwAddr |= ((UINT32) *pbPC++ << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwAddr >= psMemRead->lowAddr) && (dwAddr <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80HL = psMemRead->memoryCall(dwAddr, psMemRead);
+                                                       cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(dwAddr + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr));
+                                                       cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (dwAddr - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80HL = cpu.z80Base[dwAddr];
+                                       cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[dwAddr + 1] << 8);
+                               }
+
+                               break;
+                       }
+                       case 0x2b:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80HL--;
+                               cpu.z80HL &= 0xffff;
+                               break;
+                       }
+                       case 0x2c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80L++];
+                               break;
+                       }
+                       case 0x2d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80L--];
+                               break;
+                       }
+                       case 0x2e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80L = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x2f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= 0xff;
+                               cpu.z80F |= (Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                               break;
+                       }
+                       case 0x30:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                               if (!(cpu.z80F & Z80_FLAG_CARRY))
+                               {
+                               sdwCyclesRemaining -= 5;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x31:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               cpu.z80sp = *pbPC++;    /* LSB First */
+                               cpu.z80sp |= (((UINT32) *pbPC++ << 8)); /* Now the MSB */
+                               break;
+                       }
+                       case 0x32:
+                       {
+                               sdwCyclesRemaining -= 13;
+                               dwTemp = *pbPC++;
+                               dwTemp |= ((UINT32) *pbPC++ << 8);
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemWrite->lowAddr) && (dwTemp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(dwTemp, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (dwTemp - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[dwTemp] = (UINT8) cpu.z80A;
+                               }
+
+                               break;
+                       }
+                       case 0x33:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80sp++;
+                               cpu.z80sp &= 0xffff;
+                               break;
+                       }
+                       case 0x34:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[bTemp];
+                               bTemp++;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               break;
+                       }
+                       case 0x35:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostDecFlags[bTemp];
+                               bTemp--;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, bTemp, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = bTemp;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) bTemp;
+                               }
+
+                               break;
+                       }
+                       case 0x36:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, *pbPC++, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = *pbPC++;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) *pbPC++;
+                               }
+
+                               break;
+                       }
+                       case 0x37:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= Z80_FLAG_CARRY;
+                               break;
+                       }
+                       case 0x38:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               sdwAddr = (INT8) *pbPC++;       /* Get LSB first */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               sdwAddr = (sdwAddr + (INT32) cpu.z80pc) & 0xffff;
+                               if (cpu.z80F & Z80_FLAG_CARRY)
+                               {
+                               sdwCyclesRemaining -= 5;
+                                       pbPC = cpu.z80Base + sdwAddr;   /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0x39:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_HALF_CARRY);
+                       dwTemp = cpu.z80HL + cpu.z80sp;
+                       cpu.z80F |= ((dwTemp >> 16) & Z80_FLAG_CARRY) | (((cpu.z80HL ^ dwTemp ^ cpu.z80sp) >> 8) & Z80_FLAG_HALF_CARRY);
+                       cpu.z80HL = dwTemp & 0xffff;
+                               break;
+                       }
+                       case 0x3a:
+                       {
+                               sdwCyclesRemaining -= 13;
+                               dwTemp = *pbPC++;
+                               dwTemp |= (((UINT32) *pbPC++) << 8);
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((dwTemp >= psMemRead->lowAddr) && (dwTemp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(dwTemp, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (dwTemp - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[dwTemp];
+                               }
+
+                               break;
+                       }
+                       case 0x3b:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80sp--;
+                               cpu.z80sp &= 0xffff;
+                               break;
+                       }
+                       case 0x3c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F |= bPostIncFlags[cpu.z80A++];
+                               break;
+                       }
+                       case 0x3d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F &= ~(Z80_FLAG_SIGN | Z80_FLAG_ZERO | Z80_FLAG_HALF_CARRY | Z80_FLAG_OVERFLOW_PARITY);
+                               cpu.z80F |= bPostDecFlags[cpu.z80A--];
+                               break;
+                       }
+                       case 0x3e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80A = *pbPC++;     /* Get immediate byte into register */
+                               break;
+                       }
+                       case 0x3f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp = (cpu.z80F & Z80_FLAG_CARRY) << 4;
+                               cpu.z80F &= ~(Z80_FLAG_HALF_CARRY | Z80_FLAG_NEGATIVE);
+                               cpu.z80F ^= Z80_FLAG_CARRY;
+                               break;
+                       }
+                       case 0x40:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x41:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80C;
+                               break;
+                       }
+                       case 0x42:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80D;
+                               break;
+                       }
+                       case 0x43:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80E;
+                               break;
+                       }
+                       case 0x44:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80H;
+                               break;
+                       }
+                       case 0x45:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80L;
+                               break;
+                       }
+                       case 0x46:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80B = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80B = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80B = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x47:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80B = cpu.z80A;
+                               break;
+                       }
+                       case 0x48:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80B;
+                               break;
+                       }
+                       case 0x49:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x4a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80D;
+                               break;
+                       }
+                       case 0x4b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80E;
+                               break;
+                       }
+                       case 0x4c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80H;
+                               break;
+                       }
+                       case 0x4d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80L;
+                               break;
+                       }
+                       case 0x4e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80C = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80C = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80C = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x4f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80C = cpu.z80A;
+                               break;
+                       }
+                       case 0x50:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80B;
+                               break;
+                       }
+                       case 0x51:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80C;
+                               break;
+                       }
+                       case 0x52:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x53:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80E;
+                               break;
+                       }
+                       case 0x54:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80H;
+                               break;
+                       }
+                       case 0x55:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80L;
+                               break;
+                       }
+                       case 0x56:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80D = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80D = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80D = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x57:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80D = cpu.z80A;
+                               break;
+                       }
+                       case 0x58:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80B;
+                               break;
+                       }
+                       case 0x59:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80C;
+                               break;
+                       }
+                       case 0x5a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80D;
+                               break;
+                       }
+                       case 0x5b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x5c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80H;
+                               break;
+                       }
+                       case 0x5d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80L;
+                               break;
+                       }
+                       case 0x5e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80E = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80E = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80E = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x5f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80E = cpu.z80A;
+                               break;
+                       }
+                       case 0x60:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80B;
+                               break;
+                       }
+                       case 0x61:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80C;
+                               break;
+                       }
+                       case 0x62:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80D;
+                               break;
+                       }
+                       case 0x63:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80E;
+                               break;
+                       }
+                       case 0x64:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x65:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80L;
+                               break;
+                       }
+                       case 0x66:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80H = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80H = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80H = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x67:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80H = cpu.z80A;
+                               break;
+                       }
+                       case 0x68:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80B;
+                               break;
+                       }
+                       case 0x69:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80C;
+                               break;
+                       }
+                       case 0x6a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80D;
+                               break;
+                       }
+                       case 0x6b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80E;
+                               break;
+                       }
+                       case 0x6c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80H;
+                               break;
+                       }
+                       case 0x6d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x6e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80L = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80L = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80L = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x6f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80L = cpu.z80A;
+                               break;
+                       }
+                       case 0x70:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80B, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80B;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80B;
+                               }
+
+                               break;
+                       }
+                       case 0x71:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80C, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80C;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80C;
+                               }
+
+                               break;
+                       }
+                       case 0x72:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80D, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80D;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80D;
+                               }
+
+                               break;
+                       }
+                       case 0x73:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80E, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80E;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80E;
+                               }
+
+                               break;
+                       }
+                       case 0x74:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80H, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80H;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80H;
+                               }
+
+                               break;
+                       }
+                       case 0x75:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80L, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80L;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80L;
+                               }
+
+                               break;
+                       }
+                       case 0x76:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80halted = 1;
+                               dwElapsedTicks += sdwCyclesRemaining;
+                               sdwCyclesRemaining = 0;
+                               break;
+                       }
+                       case 0x77:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemWrite->lowAddr) && (cpu.z80HL <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80HL, cpu.z80A, psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80HL - psMemWrite->lowAddr)) = cpu.z80A;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80HL] = (UINT8) cpu.z80A;
+                               }
+
+                               break;
+                       }
+                       case 0x78:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80B;
+                               break;
+                       }
+                       case 0x79:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80C;
+                               break;
+                       }
+                       case 0x7a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80D;
+                               break;
+                       }
+                       case 0x7b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80E;
+                               break;
+                       }
+                       case 0x7c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80H;
+                               break;
+                       }
+                       case 0x7d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A = cpu.z80L;
+                               break;
+                       }
+                       case 0x7e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80A = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80A = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80A = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               break;
+                       }
+                       case 0x7f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               break;
+                       }
+                       case 0x80:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80B;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x81:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80C;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x82:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80D;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x83:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80E;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x84:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80H;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x85:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80L;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x86:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = cpu.z80A + bTemp;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x87:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80A;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x88:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80B + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x89:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80C + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80D + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80E + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80H + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80L + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = cpu.z80A + bTemp + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x8f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A + cpu.z80A + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x90:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80B;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x91:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80C;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x92:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80D;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x93:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80E;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x94:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80H;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x95:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80L;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x96:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = cpu.z80A - bTemp;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x97:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80A;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x98:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80B - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x99:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80C - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9a:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80D - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9b:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80E - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9c:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80H - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9d:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80L - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9e:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               bTemp2 = cpu.z80A - bTemp - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0x9f:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               bTemp2 = cpu.z80A - cpu.z80A - (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = bTemp2;
+                               break;
+                       }
+                       case 0xa0:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80B;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa1:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80C;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa2:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80D;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa3:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80E;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa4:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80H;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa5:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80L;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80A &= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa7:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A &= cpu.z80A;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa8:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80B;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xa9:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80C;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xaa:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80D;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xab:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80E;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xac:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80H;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xad:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80L;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xae:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80A ^= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xaf:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A ^= cpu.z80A;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb0:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80B;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb1:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80C;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb2:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80D;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb3:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80E;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb4:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80H;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb5:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80L;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80A |= bTemp;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb7:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80A |= cpu.z80A;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xb8:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80B];
+                               break;
+                       }
+                       case 0xb9:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80C];
+                               break;
+                       }
+                       case 0xba:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80D];
+                               break;
+                       }
+                       case 0xbb:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80E];
+                               break;
+                       }
+                       case 0xbc:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80H];
+                               break;
+                       }
+                       case 0xbd:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80L];
+                               break;
+                       }
+                       case 0xbe:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80HL >= psMemRead->lowAddr) && (cpu.z80HL <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       bTemp = psMemRead->memoryCall(cpu.z80HL, psMemRead);
+                                               }
+                                               else
+                                               {
+                                                       bTemp = *((UINT8 *) psMemRead->pUserArea + (cpu.z80HL - psMemRead->lowAddr));
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       bTemp = cpu.z80Base[cpu.z80HL];
+                               }
+
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               break;
+                       }
+                       case 0xbf:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | cpu.z80A];
+                               break;
+                       }
+                       case 0xc0:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (!(cpu.z80F & Z80_FLAG_ZERO))
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xc1:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80BC = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80BC |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80BC = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80BC |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80BC = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80BC |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               break;
+                       }
+                       case 0xc2:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_ZERO))
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xc3:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               break;
+                       }
+                       case 0xc4:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_ZERO))
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xc5:
+                       {
+                               sdwCyclesRemaining -= 11;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80BC & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80BC >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80BC;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80BC >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80BC;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80BC >> 8);
+                               }
+
+                               break;
+                       }
+                       case 0xc6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               bTemp = *pbPC++;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A += bTemp;
+                               break;
+                       }
+                       case 0xc7:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x00;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xc8:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (cpu.z80F & Z80_FLAG_ZERO)
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xc9:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               break;
+                       }
+                       case 0xca:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_ZERO)
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xcb:
+                       {
+                               CBHandler();
+                               break;
+                       }
+                       case 0xcc:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_ZERO)
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xcd:
+                       {
+                               sdwCyclesRemaining -= 17;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               break;
+                       }
+                       case 0xce:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbAddAdcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A += bTemp;
+                               break;
+                       }
+                       case 0xcf:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x08;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xd0:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (!(cpu.z80F & Z80_FLAG_CARRY))
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xd1:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80DE = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80DE |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80DE = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80DE |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80DE = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80DE |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               break;
+                       }
+                       case 0xd2:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_CARRY))
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xd3:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       dwTemp = *pbPC++;
+                               psIoWrite = cpu.z80IoWrite;     /* Beginning of our handler */
+                               while (psIoWrite->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwTemp >= psIoWrite->lowIoAddr) && (dwTemp <= psIoWrite->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               psIoWrite->IOCall(dwTemp, cpu.z80A, psIoWrite);
+                                               psIoWrite = NULL;
+                                               break;
+                                       }
+                                       ++psIoWrite;
+                               }
+
+                               break;
+                       }
+                       case 0xd4:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_CARRY))
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xd5:
+                       {
+                               sdwCyclesRemaining -= 11;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80DE & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80DE >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80DE;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80DE >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80DE;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80DE >> 8);
+                               }
+
+                               break;
+                       }
+                       case 0xd6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               bTemp = *pbPC++;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp];
+                               cpu.z80A -= bTemp;
+                               break;
+                       }
+                       case 0xd7:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x10;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xd8:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (cpu.z80F & Z80_FLAG_CARRY)
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xd9:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               dwTemp = cpu.z80DE;
+                               cpu.z80DE = cpu.z80deprime;
+                               cpu.z80deprime = dwTemp;
+                               dwTemp = cpu.z80BC;
+                               cpu.z80BC = cpu.z80bcprime;
+                               cpu.z80bcprime = dwTemp;
+                               dwTemp = cpu.z80HL;
+                               cpu.z80HL = cpu.z80hlprime;
+                               cpu.z80hlprime = dwTemp;
+                               break;
+                       }
+                       case 0xda:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_CARRY)
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xdb:
+                       {
+                               sdwCyclesRemaining -= 11;
+                       dwTemp = *pbPC++;
+                               psIoRead = cpu.z80IoRead;       /* Beginning of our handler */
+                               while (psIoRead->lowIoAddr != 0xffff)
+                               {
+                                       if ((dwTemp >= psIoRead->lowIoAddr) && (dwTemp <= psIoRead->highIoAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               cpu.z80A = psIoRead->IOCall(dwTemp, psIoRead);
+                                               psIoRead = NULL;
+                                               break;
+                                       }
+                                       ++psIoRead;
+                               }
+
+                               if (psIoRead)
+                               {
+                                       cpu.z80A = 0xff; /* Unclaimed I/O read */
+                               }
+
+                               break;
+                       }
+                       case 0xdc:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_CARRY)
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xdd:
+                       {
+                               DDHandler();
+                               break;
+                       }
+                       case 0xde:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               bTemp = *pbPC++ + (cpu.z80F & Z80_FLAG_CARRY);
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | bTemp | (((UINT32) cpu.z80F & Z80_FLAG_CARRY) << 16)];
+                               cpu.z80A = cpu.z80A - bTemp;
+                               break;
+                       }
+                       case 0xdf:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x18;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xe0:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xe1:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80HL = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80HL |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80HL = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80HL |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80HL = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80HL |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               break;
+                       }
+                       case 0xe2:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xe3:
+                       {
+                               sdwCyclesRemaining -= 19;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       dwAddr = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       dwAddr |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       dwAddr = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       dwAddr |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       dwAddr = cpu.z80Base[cpu.z80sp];
+                                       dwAddr |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
+                               }
+
+                               cpu.z80HL = dwAddr;
+                               break;
+                       }
+                       case 0xe4:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_OVERFLOW_PARITY))
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xe5:
+                       {
+                               sdwCyclesRemaining -= 11;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80HL & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80HL >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80HL;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80HL >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80HL;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80HL >> 8);
+                               }
+
+                               break;
+                       }
+                       case 0xe6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80A &= *pbPC++;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostANDFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xe7:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x20;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xe8:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xe9:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               pbPC = cpu.z80Base + cpu.z80HL;
+                               break;
+                       }
+                       case 0xea:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xeb:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               dwAddr = cpu.z80DE;
+                               cpu.z80DE = cpu.z80HL;
+                               cpu.z80HL = dwAddr;
+                               break;
+                       }
+                       case 0xec:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_OVERFLOW_PARITY)
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xed:
+                       {
+                               EDHandler();
+                               break;
+                       }
+                       case 0xee:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80A ^= *pbPC++;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xef:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x28;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xf0:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (!(cpu.z80F & Z80_FLAG_SIGN))
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xf1:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               psMemRead = cpu.z80MemRead;     /* Beginning of our handler */
+                               while (psMemRead->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemRead->lowAddr) && (cpu.z80sp <= psMemRead->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemRead->memoryCall)
+                                               {
+                                                       cpu.z80AF = psMemRead->memoryCall(cpu.z80sp, psMemRead);
+                                                       cpu.z80AF |= (UINT32) ((UINT32) psMemRead->memoryCall(cpu.z80sp + 1, psMemRead) << 8);
+                                               }
+                                               else
+                                               {
+                                                       cpu.z80AF = *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr));
+                                                       cpu.z80AF |= (UINT32) ((UINT32) *((UINT8 *) psMemRead->pUserArea + (cpu.z80sp - psMemRead->lowAddr + 1)) << 8);
+                                               }
+                                               psMemRead = NULL;
+                                               break;
+                                       }
+                                       ++psMemRead;
+                               }
+
+                               if (psMemRead)
+                               {
+                                       cpu.z80AF = cpu.z80Base[cpu.z80sp];
+                                       cpu.z80AF |= (UINT32) ((UINT32) cpu.z80Base[cpu.z80sp + 1] << 8);
+                               }
+
+                                       cpu.z80sp += 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               break;
+                       }
+                       case 0xf2:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_SIGN))
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xf3:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80iff &= (~IFF1);
+                               break;
+                       }
+                       case 0xf4:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (!(cpu.z80F & Z80_FLAG_SIGN))
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xf5:
+                       {
+                               sdwCyclesRemaining -= 11;
+                                       cpu.z80sp -= 2;
+                                       pbSP = (cpu.z80Base + cpu.z80sp);       /* Normalize the stack pointer */
+                               psMemWrite = cpu.z80MemWrite;   /* Beginning of our handler */
+                               while (psMemWrite->lowAddr != 0xffffffff)
+                               {
+                                       if ((cpu.z80sp >= psMemWrite->lowAddr) && (cpu.z80sp <= psMemWrite->highAddr))
+                                       {
+                                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                               if (psMemWrite->memoryCall)
+                                               {
+                                                       psMemWrite->memoryCall(cpu.z80sp, (cpu.z80AF & 0xff), psMemWrite);
+                                                       psMemWrite->memoryCall(cpu.z80sp + 1, (cpu.z80AF >> 8), psMemWrite);
+                                               }
+                                               else
+                                               {
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr)) = cpu.z80AF;
+                                                       *((UINT8 *) psMemWrite->pUserArea + (cpu.z80sp - psMemWrite->lowAddr) + 1) = cpu.z80AF >> 8;
+                                               }
+                                               psMemWrite = NULL;
+                                               break;
+                                       }
+                                       ++psMemWrite;
+                               }
+
+                               if (psMemWrite)
+                               {
+                                       cpu.z80Base[cpu.z80sp] = (UINT8) cpu.z80AF;
+                                       cpu.z80Base[cpu.z80sp + 1] = (UINT8) ((UINT32) cpu.z80AF >> 8);
+                               }
+
+                               break;
+                       }
+                       case 0xf6:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80A |= *pbPC++;
+                               cpu.z80F &= ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN);
+                               cpu.z80F |= bPostORFlags[cpu.z80A];
+
+                               break;
+                       }
+                       case 0xf7:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x30;      /* Normalize the address */
+                               break;
+                       }
+                       case 0xf8:
+                       {
+                               sdwCyclesRemaining -= 5;
+                               if (cpu.z80F & Z80_FLAG_SIGN)
+                               {
+                                       dwElapsedTicks += 6;
+                               pbSP = cpu.z80Base + cpu.z80sp; /* Normalize our stack PTR */
+                               dwAddr = *pbSP++;       /* Pop LSB */
+                               dwAddr |= ((UINT32) *pbSP << 8);        /* Pop MSB */
+                               cpu.z80sp += 2; /* Pop the word off */
+                               pbPC = (cpu.z80Base + dwAddr);  /* Point PC to our return address */
+                               }
+                               break;
+                       }
+                       case 0xf9:
+                       {
+                               sdwCyclesRemaining -= 6;
+                               cpu.z80sp = cpu.z80HL;
+                               break;
+                       }
+                       case 0xfa:
+                       {
+                               sdwCyclesRemaining -= 10;
+                                       dwAddr = *pbPC++;       /* Get LSB first */
+                                       dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_SIGN)
+                               {
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xfb:
+                       {
+                               sdwCyclesRemaining -= 4;
+                               cpu.z80iff |= IFF1;
+                               break;
+                       }
+                       case 0xfc:
+                       {
+                               sdwCyclesRemaining -= 10;
+                               dwAddr = *pbPC++;       /* Get LSB first */
+                               dwAddr |= ((UINT32) *pbPC++ << 8); /* Get MSB last */
+                               if (cpu.z80F & Z80_FLAG_SIGN)
+                               {
+                                       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                                       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                                       *pbSP-- = cpu.z80pc >> 8;       /* MSB */
+                                       *pbSP = (UINT8) cpu.z80pc;      /* LSB */
+                                       cpu.z80sp -= 2; /* Back our stack up */
+                                       pbPC = cpu.z80Base + dwAddr;    /* Normalize the address */
+                               }
+                               break;
+                       }
+                       case 0xfd:
+                       {
+                               FDHandler();
+                               break;
+                       }
+                       case 0xfe:
+                       {
+                               sdwCyclesRemaining -= 7;
+                               cpu.z80F = (cpu.z80F & ~(Z80_FLAG_CARRY | Z80_FLAG_NEGATIVE | Z80_FLAG_OVERFLOW_PARITY | 
+                                                          Z80_FLAG_HALF_CARRY | Z80_FLAG_ZERO | Z80_FLAG_SIGN)) |
+                                                               pbSubSbcTable[((UINT32) cpu.z80A << 8) | *pbPC++];
+                               break;
+                       }
+                       case 0xff:
+                       {
+                               sdwCyclesRemaining -= 11;
+                               cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+                               pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+                               *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+                               *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+                               cpu.z80sp -= 2; /* Back our stack up */
+                               pbPC = cpu.z80Base + 0x38;      /* Normalize the address */
+                               break;
+                       }
+               }
+       }
+
+       dwElapsedTicks += (dwOriginalCycles - sdwCyclesRemaining);
+
+       cpu.z80pc = (UINT32) pbPC - (UINT32) cpu.z80Base;
+       return(dwReturnCode); /* Indicate success */
+}
+
+/* Get mz80's context */
+
+void mz80GetContext(void *pData)
+{
+       memcpy(pData, &cpu, sizeof(CONTEXTMZ80));
+}
+
+/* Set mz80's context */
+
+void mz80SetContext(void *pData)
+{
+       memcpy(&cpu, pData, sizeof(CONTEXTMZ80));
+}
+
+/* Get mz80's context size */
+
+UINT32 mz80GetContextSize(void)
+{
+       return(sizeof(CONTEXTMZ80));
+}
+
+/* This will return the elapsed ticks */
+
+UINT32 mz80GetElapsedTicks(UINT32 dwClear)
+{
+       UINT32 dwTemp = dwElapsedTicks;
+
+       if (dwClear)
+       {
+               dwElapsedTicks = 0;
+       }
+
+       return(dwTemp);
+}
+
+/* Releases mz80 from its current timeslice */
+
+void mz80ReleaseTimeslice(void)
+{
+       dwOriginalCycles -= sdwCyclesRemaining;
+       sdwCyclesRemaining = 0;
+}
+
+/* This routine is mz80's reset handler */
+
+void mz80reset(void)
+{
+       cpu.z80halted = 0;
+       cpu.z80AF = 0;
+       cpu.z80F = Z80_FLAG_ZERO;
+       cpu.z80BC = 0;
+       cpu.z80DE = 0;
+       cpu.z80HL = 0;
+       cpu.z80afprime = 0;
+       cpu.z80bcprime = 0;
+       cpu.z80deprime = 0;
+       cpu.z80hlprime = 0;
+       cpu.z80i = 0;
+       cpu.z80r = 0;
+       cpu.z80IX = 0xffff; /* Yes, this is intentional */
+       cpu.z80IY = 0xffff; /* Yes, this is intentional */
+       cpu.z80pc = 0;
+       cpu.z80sp = 0;
+       cpu.z80interruptMode = 0;
+       cpu.z80intAddr = 0x38;
+       cpu.z80nmiAddr = 0x66;
+}
+
+/* Interrupt handler */
+
+UINT32 mz80int(UINT32 dwLowAddr)
+{
+       cpu.z80halted = 0;
+       if (0 == (cpu.z80iff & IFF1))
+               return(0xffffffff);
+       cpu.z80iff &= ~(IFF1 | IFF2);
+       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+       *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+       *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+       cpu.z80sp -= 2; /* Back our stack up */
+       if (2 == cpu.z80interruptMode)
+       {
+               cpu.z80pc = ((UINT16) cpu.z80i << 8) | (dwLowAddr & 0xff);
+               cpu.z80pc = ((UINT16) cpu.z80Base[cpu.z80pc + 1] << 8) | (cpu.z80Base[cpu.z80pc]);
+       }
+       else
+       {
+               cpu.z80pc = cpu.z80intAddr;
+       }
+       pbPC = cpu.z80Base + cpu.z80pc; /* Normalize the address */
+       return(0);
+}
+
+/* NMI Handler */
+
+UINT32 mz80nmi(void)
+{
+       cpu.z80halted = 0;
+       pbSP = (cpu.z80Base + cpu.z80sp - 1);   /* Normalize the stack pointer */
+       *pbSP-- = cpu.z80pc >> 8;       /* LSB */
+       *pbSP = (UINT8) cpu.z80pc;      /* MSB */
+       cpu.z80sp -= 2; /* Back our stack up */
+       cpu.z80pc = cpu.z80nmiAddr;     /* Our NMI */
+       return(0);
+}
+
+/* Initialize MZ80 for action */
+
+void mz80init(void)
+{
+       UINT32 dwLoop;
+       UINT8 *pbTempPtr;
+       UINT8 *pbTempPtr2;
+       UINT8 bNewAdd;
+       UINT8 bNewSub;
+       UINT8 bFlag;
+       UINT8 bLow;
+       UINT8 bHigh;
+       UINT8 bCarry;
+
+       if (NULL == pbAddAdcTable)
+       {
+               pbAddAdcTable = malloc(256*256*2);
+
+               if (NULL == pbAddAdcTable)
+               {
+                       return;
+               }
+
+               pbTempPtr = pbAddAdcTable;
+
+               pbSubSbcTable = malloc(256*256*2);
+
+               if (NULL == pbSubSbcTable)
+               {
+                       return;
+               }
+
+               pbTempPtr2 = pbSubSbcTable;
+
+               for (dwLoop = 0; dwLoop < (256*256*2); dwLoop++)
+               {
+                       bLow = dwLoop & 0xff;
+                       bHigh = (dwLoop >> 8) & 0xff;
+                       bCarry = (dwLoop >> 16);
+
+                       bFlag = 0;
+                       bNewAdd = bHigh + bLow + bCarry;
+
+                       if (0 == bNewAdd)
+                       {
+                               bFlag |= Z80_FLAG_ZERO;
+                       }
+                       else
+                       {
+                               bFlag = bNewAdd & 0x80; /* Sign flag */
+                       }
+
+                       if (((UINT32) bLow + (UINT32) bHigh + (UINT32) bCarry) >= 0x100)
+                       {
+                               bFlag |= Z80_FLAG_CARRY;
+                       }
+
+                       if ( ((bLow ^ bHigh ^ 0x80) & (bLow ^ (bNewAdd & 0x80))) & 0x80)
+                       {
+                               bFlag |= Z80_FLAG_OVERFLOW_PARITY;
+                       }
+
+                       if (((bLow & 0x0f) + (bHigh & 0x0f) + bCarry) >= 0x10)
+                       {
+                               bFlag |= Z80_FLAG_HALF_CARRY;
+                       }
+
+                       *pbTempPtr++ = bFlag;   /* Store our new flag */
+
+                       // Now do subtract - Zero
+
+                       bFlag = Z80_FLAG_NEGATIVE;
+                       bNewSub = bHigh - bLow - bCarry;
+
+                       if (0 == bNewSub)
+                       {
+                               bFlag |= Z80_FLAG_ZERO;
+                       }
+                       else
+                       {
+                               bFlag |= bNewSub & 0x80; /* Sign flag */
+                       }
+
+                       if ( ((INT32) bHigh - (INT32) bLow - (INT32) bCarry) < 0)
+                       {
+                               bFlag |= Z80_FLAG_CARRY;
+                       }
+
+                       if ( ((INT32) (bHigh & 0xf) - (INT32) (bLow & 0x0f) - (INT32) bCarry) < 0)
+                       {
+                               bFlag |= Z80_FLAG_HALF_CARRY;
+                       }
+
+                       if ( ((bLow ^ bHigh) & (bHigh ^ bNewSub) & 0x80) )
+                       {
+                               bFlag |= Z80_FLAG_OVERFLOW_PARITY;
+                       }
+
+                       *pbTempPtr2++ = bFlag;  /* Store our sub flag */
+
+               }
+       }
+}
+/* Shut down MZ80 */
+
+void mz80shutdown(void)
+{
+       // notaz: why weren't these here?
+       free(pbAddAdcTable);
+       pbAddAdcTable = 0;
+       free(pbSubSbcTable);
+       pbSubSbcTable = 0;
+}
+